Ecfe48fba86dbee29f54ad6a7f8aaaa3

Hi,
i had problems with turning this code into something shorter. The main point is to DRY it a bit in include_class(package) usages. Important is that Java classes should be included in Prototype module.

module Prototype

  @app_jar_path = Config.conf[:jar_dir]

  if @app_jar_path
      
      Dir[File.join(@app_jar_path, '*.jar')].each {|f| require f }
      
      prefix = "com.system"
      
      include_class("#{prefix}.guimodel.PresentationEntry")
      include_class("#{prefix}.guimodel.PresentationGroup")
      include_class("#{prefix}.guimodel.PresentationField")
      include_class("#{prefix}.guimodel.PresentationFieldIdentifier")
      # more ...
      
      prefix = "com.utils"

      include_class("#{prefix}.model.ContentItem")
      include_class("#{prefix}.model.ContentClass")
      include_class("#{prefix}.model.ContentClassNotFoundException")
      include_class("#{prefix}.model.impl.DefaultLanguage")
      # more ...

  else
    raise "Error"
  end

end
klasses = { 
    "com.utils" => [ 'guimodel.PresentationEntry', 'guimodel.PresentationGroup'],
    "com.system" => [ 'model.ContentItem', 'model.ContentClass' ] 
  }

  klasses.each_pair{|p, k| Prototype.include_nicely_java_class(p, k) }

Refactorings

No refactoring yet !

D85d44a0eca045f40e5a31449277c26c

Ben Marini

November 7, 2009, November 07, 2009 00:08, permalink

No rating. Login to rate!

Does this not work?

module Prototype
  klasses = { 
    "com.utils"  => [ 'guimodel.PresentationEntry', 'guimodel.PresentationGroup'],
    "com.system" => [ 'model.ContentItem', 'model.ContentClass' ] 
  }

  klasses.each_pair { |prefix, klass| include_class("#{prefix}.#{klass}") }
end
Ecfe48fba86dbee29f54ad6a7f8aaaa3

marek-kowalcze.myopenid.com

November 9, 2009, November 09, 2009 09:05, permalink

No rating. Login to rate!

Yeah Ben, it worked :) This is current version with allowing class name aliases as well (when You pass block to include_class). I moved it to separate module to re-use it.

module JavaClassLoader

  def JavaClassLoader.included(mod)
    @mod = mod
  end

  def JavaClassLoader.include_java_classes(klasses_hash)
    klasses_hash.each_pair do |pref, klasses|
      klasses.each do |klass_name|        
        if klass_name.is_a? Hash
          @mod.include_class("#{pref}.#{klass_name.keys.first}") { klass_name.values.first }          
        elsif klass_name.is_a? String
          @mod.include_class "#{pref}.#{klass_name}"
        end
      end
    end
  end

end
module Prototype
  include JavaClassLoader

  klasses = {
          "guimodel"  => [
                  'PresentationEntry',                                    
                  { 'PresentationContentResolverMetaFactory' => 'MetaFactory' } ],
          "model" => [ 'ContentClassNotFoundException' ] 
      }

  JavaClassLoader.include_java_classes(klasses)

end

Your refactoring





Format Copy from initial code

or Cancel