Skip to main content

Jmaki, Jruby and Tomcat: stories from J Land

I was using the nice Dojo Table widget for a rails application because I needed to allow the user to sort the displayed table. I also needed to deploy the application on Tomcat. To make it work, I had to copy the resources folder created by Jmaki in the public folder to the root folder of Tomcat's webapps (the webapps folder). I also had to do some fixes to jmaki_core_celper.rb source. The modified parts (which adds more functionality such as allowing to pass field names to jmaki widgets) are the following:

module JmakiCoreHelper



  # ---------- Global Constants ----------



  JMAKI_RESOURCES = RAILS_ROOT + '/' + "public/resources/" #chg by JPT to allow Tomcat to find the the widget's files

...

  # ---------- Global jMaki Methods ----------
 def jmaki_widget(name, options = {}, field_name ="jmaki_field", width = 100)

    # Set up variables we will need
    result = ""
    nameSlashed = name.tr('.', '/')
    widgetDir = "/resources/" + nameSlashed # FIXME - relative to context path?

    # Render the widget-specific libraries and stylesheets
    widget = jmaki_load_widget(name)
#    puts "Loaded data is " + widget.inspect
    config = widget['config']
    if config
      type = config['type']
      if type
        id = type['id']
        if ((id != nil) && !jmaki_type_include?(id))
          # preload
          preload = type['preload']
          if preload
            result += jmaki_generate_script(preload)
          end
          # libs
          libs = type['libs']
          if libs
            for i in 0...libs.length
              result += jmaki_generate_js(widgetDir + "/" + libs[i])
            end
          end
          # postload
          postload = type['postload']
          if postload
            result += jmaki_generate_script(postload)
          end
          # styles
          styles = type['styles']
          if styles
            for i in 0...styles.length
              result += jmaki_generate_css(widgetDir + "/" + styles[i])
            end
          end
          jmaki_type_include(id)
        end
      end
    end

    # Render link to widget stylesheet (if any)
    # FIXME - allow "component.css" override with "style" attribute
    if (File.exist?(JMAKI_RESOURCES + nameSlashed + "/component.css"))
      result += jmaki_generate_css(widgetDir + "/component.css")
    end

    # Render link to widget javascript (assumed to exist)
    # FIXME - allow "component.js" override with "script" attribute
    result += jmaki_generate_js(widgetDir + "/component.js")

    # Create an empty options hash if we did not receive one
    if !options
      options = { }
    end

    # Decorate the options hash with our required attributes
    options['name'] = name
    if !options['uuid']
      options['uuid'] = jmaki_generate_uuid(name)
    end
    options['widgetDir'] = widgetDir
#    puts "options = " + options.inspect

    # Deal with the widget template (if any), including parameter replacements
    # FIXME - override local filename with "template" attribute
    template = nil
    templateFilename = JMAKI_RESOURCES + nameSlashed + "/component.htm"
    if (File.exist?(templateFilename))
      template = jmaki_generate_content(templateFilename)
    elsif (File.exist?(templateFilename + "l"))
      template = jmaki_generate_content(templateFilename + "l")
    end
    if template
      # FIXME - do substitutions in writeTemplate() other than ${uuid}
      template = template.gsub('${uuid}', options['uuid'])
      template = template.gsub('${field_name}', field_name)
      template = template.gsub('${width}', width.to_s)
      result += template
    end

#    puts "OPTIONS=" + options.to_json

    # Render the widget constructor call
    result += "\n"

    # Return the completed result
    result

  end
...
end

Comments