rubeus 0.0.8-java → 0.0.9-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. data/.document +5 -0
  2. data/.gitignore +8 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +17 -0
  5. data/Rakefile +55 -16
  6. data/VERSION +1 -0
  7. data/examples/.gitignore +1 -0
  8. data/examples/JavaSwingExample01.java +41 -0
  9. data/examples/jdbc_example.rb +1 -2
  10. data/examples/notepad.rb +15 -17
  11. data/examples/nyanco_viewer/nekobean_LICENSE.txt +22 -0
  12. data/examples/rubeus_swing_example01.rb +0 -2
  13. data/examples/rubeus_swing_example01_with_class.rb +1 -3
  14. data/examples/rubeus_swing_jdbc_example01.rb +5 -0
  15. data/java/.gitignore +3 -0
  16. data/java/mvn_plugins.yml +57 -0
  17. data/java/pom.xml +30 -0
  18. data/java/src/main/java/jp/rubybizcommons/rubeus/extensions/javax/swing/table/DelegatableTableModel.java +54 -0
  19. data/java/src/main/java/jp/rubybizcommons/rubeus/extensions/javax/swing/table/ReadonlyableTableModel.java +24 -0
  20. data/lib/rubeus.rb +6 -4
  21. data/lib/rubeus/awt/attributes.rb +5 -5
  22. data/lib/rubeus/awt/event.rb +8 -8
  23. data/lib/rubeus/awt/nestable.rb +4 -4
  24. data/lib/rubeus/awt/setters.rb +1 -1
  25. data/lib/rubeus/component_loader.rb +12 -11
  26. data/lib/rubeus/extensions.rb +6 -6
  27. data/lib/rubeus/extensions/java.rb +1 -0
  28. data/lib/rubeus/extensions/java/awt/dimension.rb +1 -1
  29. data/lib/rubeus/extensions/java/lang.rb +5 -0
  30. data/lib/rubeus/extensions/java/lang/reflect.rb +4 -0
  31. data/lib/rubeus/extensions/java/lang/reflect/method.rb +23 -0
  32. data/lib/rubeus/extensions/java/sql/connection.rb +2 -2
  33. data/lib/rubeus/extensions/java/sql/database_meta_data.rb +9 -9
  34. data/lib/rubeus/extensions/java/sql/driver_manager.rb +80 -79
  35. data/lib/rubeus/extensions/java/sql/result_set.rb +6 -6
  36. data/lib/rubeus/extensions/java/sql/result_set_meta_data.rb +4 -4
  37. data/lib/rubeus/extensions/javax/swing/box_layout.rb +4 -4
  38. data/lib/rubeus/extensions/javax/swing/j_component.rb +1 -1
  39. data/lib/rubeus/extensions/javax/swing/j_editor_pane.rb +5 -0
  40. data/lib/rubeus/extensions/javax/swing/j_frame.rb +1 -1
  41. data/lib/rubeus/extensions/javax/swing/j_list.rb +5 -0
  42. data/lib/rubeus/extensions/javax/swing/j_scroll_pane.rb +1 -1
  43. data/lib/rubeus/extensions/javax/swing/j_split_pane.rb +1 -1
  44. data/lib/rubeus/extensions/javax/swing/j_table.rb +2 -2
  45. data/lib/rubeus/extensions/javax/swing/j_text_pane.rb +7 -0
  46. data/lib/rubeus/extensions/javax/swing/table/default_table_model.rb +10 -10
  47. data/lib/rubeus/extensions/javax/swing/timer.rb +3 -3
  48. data/lib/rubeus/jdbc.rb +2 -2
  49. data/lib/rubeus/jdbc/closeable_resource.rb +1 -1
  50. data/lib/rubeus/jdbc/column.rb +19 -14
  51. data/lib/rubeus/jdbc/foreign_key.rb +14 -9
  52. data/lib/rubeus/jdbc/index.rb +15 -10
  53. data/lib/rubeus/jdbc/meta_element.rb +8 -8
  54. data/lib/rubeus/jdbc/primary_key.rb +26 -7
  55. data/lib/rubeus/jdbc/result_set_column.rb +3 -3
  56. data/lib/rubeus/jdbc/table.rb +47 -36
  57. data/lib/rubeus/reflection.rb +17 -0
  58. data/lib/rubeus/swing.rb +1 -1
  59. data/lib/rubeus/util.rb +3 -0
  60. data/lib/rubeus/util/java_method_name.rb +31 -0
  61. data/lib/rubeus/util/name_access_array.rb +6 -4
  62. data/lib/rubeus/verboseable.rb +3 -3
  63. data/rmaven.yml +5 -0
  64. data/rubeus.gemspec +202 -0
  65. data/test/rubeus/extensions/java/awt/test_dimension.rb +47 -47
  66. data/test/rubeus/extensions/java/sql/test_database_meta_data.rb +86 -40
  67. data/test/rubeus/extensions/java/sql/test_driver_manager.rb +9 -2
  68. data/test/rubeus/extensions/java/sql/test_sql_helper.rb +4 -4
  69. data/test/rubeus/reflection/test_method_modifier.rb +107 -0
  70. data/test/rubeus/test_extensions.rb +30 -30
  71. data/test/rubeus_test.jar +0 -0
  72. data/test_jar/.classpath +7 -0
  73. data/test_jar/.gitignore +1 -0
  74. data/test_jar/.project +17 -0
  75. data/test_jar/mvn_plugins.yml +57 -0
  76. data/test_jar/pom.xml +25 -0
  77. data/test_jar/src/main/java/jp/rubybizcommons/rubeus/test/reflection/VariousFields.java +13 -0
  78. data/test_jar/src/main/java/jp/rubybizcommons/rubeus/test/reflection/VariousMethods.java +14 -0
  79. data/test_jar/src/test/java/jp/rubybizcommons/rubeus/test/AppTest.java +38 -0
  80. metadata +137 -47
  81. data/test/test_all.rb +0 -2
@@ -0,0 +1,24 @@
1
+ package jp.rubybizcommons.rubeus.extensions.javax.swing.table;
2
+
3
+ import javax.swing.table.TableModel;
4
+
5
+ public class ReadonlyableTableModel extends DelegatableTableModel {
6
+
7
+ public ReadonlyableTableModel(TableModel source) {
8
+ super(source);
9
+ }
10
+
11
+ private boolean readonly = false;
12
+
13
+ public boolean isReadonly() {
14
+ return readonly;
15
+ }
16
+
17
+ public void setReadonly(boolean readonly) {
18
+ this.readonly = readonly;
19
+ }
20
+
21
+ public boolean isCellEditable(int rowIndex, int columnIndex) {
22
+ return !isReadonly();
23
+ }
24
+ }
@@ -1,3 +1,4 @@
1
+ require 'java'
1
2
  require File.join(File.dirname(__FILE__), 'rubeus.jar')
2
3
 
3
4
  require "rubygems"
@@ -7,20 +8,21 @@ require "active_support/core_ext/string"
7
8
 
8
9
  Kernel.module_eval <<-EOS
9
10
  def jp
10
- JavaUtilities.get_package_module_dot_format('jp')
11
+ JavaUtilities.get_package_module_dot_format('jp')
11
12
  end
12
13
  EOS
13
14
 
14
15
  module Rubeus
15
- VERSION = '0.0.8'
16
+ VERSION = '0.0.9'
16
17
  EMAIL_GROUP = 'rubeus@googlegroups.com'
17
18
  WEB_SITE = 'http://code.google.com/p/rubeus/'
18
-
19
+
19
20
  autoload :Verbosable, "rubeus/verboseable"
20
-
21
+
21
22
  autoload :Awt, "rubeus/awt"
22
23
  autoload :Swing, "rubeus/swing"
23
24
  autoload :Jdbc, "rubeus/jdbc"
25
+ autoload :Reflection, "rubeus/reflection"
24
26
  autoload :Util, "rubeus/util"
25
27
 
26
28
  def self.verbose; @verbose; end
@@ -7,7 +7,7 @@ module Rubeus::Awt
7
7
  alias :new :new_with_attributes
8
8
  end
9
9
  end
10
-
10
+
11
11
  module ClassMethods
12
12
  def new_with_attributes(*args, &block)
13
13
  options = args.last.is_a?(Hash) ? args.pop : {}
@@ -27,12 +27,12 @@ module Rubeus::Awt
27
27
  end
28
28
  result
29
29
  end
30
-
30
+
31
31
  def default_attributes(attributes = nil)
32
32
  self.default_attributes = attributes if attributes
33
33
  result = {}
34
34
  @class_to_default_attributes ||= {}
35
- classes = self.ancestors.select{|klass|
35
+ classes = self.ancestors.select{|klass|
36
36
  !klass.java_class.interface? and klass.respond_to?(:default_attributes)}
37
37
  classes.reverse.each do |klass|
38
38
  if attrs = @class_to_default_attributes[klass.java_class.name]
@@ -41,12 +41,12 @@ module Rubeus::Awt
41
41
  end
42
42
  result
43
43
  end
44
-
44
+
45
45
  def default_attributes=(attributes)
46
46
  @class_to_default_attributes ||= {}
47
47
  @class_to_default_attributes[self.java_class.name] ||= (attributes || {})
48
48
  end
49
-
49
+
50
50
  end
51
51
  end
52
52
  end
@@ -3,13 +3,13 @@ module Rubeus::Awt
3
3
  def self.included(klass)
4
4
  klass.extend(ClassMethods)
5
5
  end
6
-
6
+
7
7
  module ClassMethods
8
8
  def uncapitalize(str)
9
9
  str[0..0].downcase + str[1..-1]
10
10
  end
11
11
  end
12
-
12
+
13
13
  def find_java_method(method_name, &block)
14
14
  klass = self.java_class
15
15
  while klass
@@ -54,8 +54,8 @@ module Rubeus::Awt
54
54
  filters = []
55
55
  [:if, :unless].each do |condition|
56
56
  [:any, :all].each do |joiner|
57
- filters << build_hash_comparision(options,
58
- "#{condition.to_s}_#{joiner.to_s}".to_sym,
57
+ filters << build_hash_comparision(options,
58
+ "#{condition.to_s}_#{joiner.to_s}".to_sym,
59
59
  "#{joiner.to_s}?", condition == :unless)
60
60
  end
61
61
  end
@@ -86,7 +86,7 @@ module Rubeus::Awt
86
86
  methods.map{|method| invokable_method(lister_methods, event_type, method)}.compact
87
87
  mod = Module.new do
88
88
  lister_methods.each do |listener_method|
89
- if handling_methods.include?(listener_method)
89
+ if handling_methods.include?(listener_method)
90
90
  define_method(listener_method){|*args| listener_block.call(*args)}
91
91
  else
92
92
  define_method(listener_method, &NULL_METHOD)
@@ -104,13 +104,13 @@ module Rubeus::Awt
104
104
  def listener_interface(event_type)
105
105
  java_event_name = event_type.to_s.camelize
106
106
  method_name = "add#{java_event_name}Listener"
107
- java_method =
108
- find_java_method(method_name){|m|m.parameter_types.length == 1} ||
107
+ java_method =
108
+ find_java_method(method_name){|m|m.parameter_types.length == 1} ||
109
109
  find_java_method(method_name)
110
110
  raise "unsupported event '#{java_event_name}' for #{self.class.name}" unless java_method
111
111
  if java_method.parameter_types.length != 1
112
112
  method_name = "%s(%s)" % [java_method.name, java_method.parameter_types.map{|t|t.name}.join(',')]
113
- raise "unsupported evnet method #{method_name} for #{java_method.declaring_class.name}"
113
+ raise "unsupported evnet method #{method_name} for #{java_method.declaring_class.name}"
114
114
  end
115
115
  java_method.parameter_types.first
116
116
  end
@@ -7,7 +7,7 @@ module Rubeus::Awt
7
7
  alias :new :new_with_nestable
8
8
  end
9
9
  end
10
-
10
+
11
11
  class Context
12
12
  def self.container_class_names
13
13
  @container_class_names ||= []
@@ -38,13 +38,13 @@ module Rubeus::Awt
38
38
  @action = former_action
39
39
  end
40
40
  end
41
-
41
+
42
42
  def self.container
43
43
  @container
44
44
  end
45
45
  end
46
-
47
-
46
+
47
+
48
48
  module ClassMethods
49
49
  def new_with_nestable(*args, &block)
50
50
  object = self.new_without_nestable(*args)
@@ -2,7 +2,7 @@ Rubeus::Awt.depend_on("Dimension")
2
2
 
3
3
  module Rubeus::Awt
4
4
  module Setters
5
-
5
+
6
6
  def self.included(base)
7
7
  base.module_eval do
8
8
  alias_method :set_preferred_size, :set_preferred_size_rubeus
@@ -1,5 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  require 'rubeus/verboseable'
3
+ require 'java'
3
4
  module Rubeus
4
5
  class ComponentLoader < Module
5
6
  def self.class_names(*package_names)
@@ -15,9 +16,9 @@ module Rubeus
15
16
  end
16
17
  classes
17
18
  end
18
-
19
+
19
20
  include ::Rubeus::Verboseable
20
-
21
+
21
22
  attr_accessor :verbose
22
23
  attr_reader :java_package
23
24
  attr_reader :class_to_package
@@ -33,7 +34,7 @@ module Rubeus
33
34
  java_package.verbose = self.verbose
34
35
  super(&block)
35
36
  end
36
-
37
+
37
38
  def build_class_to_package_table(java_package)
38
39
  class_names = ::Rubeus::ComponentLoader.class_names(java_package)
39
40
  @class_to_package = {}
@@ -48,18 +49,18 @@ module Rubeus
48
49
  [@class_to_package[class_name], package] : package
49
50
  end
50
51
  end
51
-
52
+
52
53
  def included(mod)
53
54
  mod.extend(self)
54
55
  end
55
-
56
+
56
57
  def extended(object)
57
58
  class_name_for_method = self.name.underscore.gsub('/', '_')
58
59
  const_missing_with = "const_missing_with_#{class_name_for_method}"
59
60
  const_missing_without = "const_missing_without_#{class_name_for_method}"
60
61
  return if object.singleton_methods.include?(const_missing_with)
61
62
  loader_name = "@loader_#{class_name_for_method}".to_sym
62
- mod = Module.new
63
+ mod = Module.new
63
64
  mod.send(:define_method, const_missing_with) do |const_name|
64
65
  begin
65
66
  instance_variable_get(loader_name).const_get(const_name)
@@ -78,7 +79,7 @@ module Rubeus
78
79
  def extend_with(mod = Object)
79
80
  mod.send(:extend, self)
80
81
  end
81
-
82
+
82
83
  def const_missing(java_class_name)
83
84
  if autoload?(java_class_name)
84
85
  log_if_verbose("autoloading... #{java_class_name.to_s}")
@@ -108,15 +109,15 @@ module Rubeus
108
109
  def autolodings
109
110
  @autolodings ||= {}
110
111
  end
111
-
112
+
112
113
  def autoload(const_name, feature = nil)
113
114
  autolodings[const_name.to_s] = feature ||"#{self.name}::#{java_class_name.to_s}".underscore
114
115
  end
115
-
116
+
116
117
  def autoload?(const_name)
117
118
  autolodings[const_name.to_s]
118
119
  end
119
-
120
+
120
121
  def depend_on(*java_class_names)
121
122
  java_class_names.each{|java_class_name| self.const_get(java_class_name)}
122
123
  end
@@ -133,7 +134,7 @@ module Rubeus
133
134
  alias :const_missing :const_missing_with_rubeus
134
135
  end
135
136
  end
136
-
137
+
137
138
  def method_missing_with_rubeus(method, *args)
138
139
  java_fqn = "#{@package_name}#{method.to_s}"
139
140
  extension = Rubeus::Extensions.apply_for(java_fqn)
@@ -6,10 +6,10 @@ module Rubeus
6
6
 
7
7
  RUBEUS_EXTRA_PACKAGE = "jp.rubybizcommons.rubeus.extensions".freeze
8
8
  RUBEUS_EXTRA_PACKAGE_PARTS = RUBEUS_EXTRA_PACKAGE.split('.').freeze
9
-
9
+
10
10
  class << self
11
11
  def verbose; ::Rubeus.verbose; end
12
-
12
+
13
13
  private
14
14
  def package_parts(java_fqn_or_parts)
15
15
  parts = java_fqn_or_parts.is_a?(Array) ? java_fqn_or_parts : java_fqn_or_parts.split('.')
@@ -18,9 +18,9 @@ module Rubeus
18
18
  end
19
19
  parts
20
20
  end
21
-
21
+
22
22
  public
23
-
23
+
24
24
  def path_for(java_fqn_or_parts)
25
25
  parts = package_parts(java_fqn_or_parts)
26
26
  "rubeus/extensions/%s" % parts.map{|part|part.underscore}.join('/')
@@ -52,7 +52,7 @@ module Rubeus
52
52
  return nil
53
53
  end
54
54
  end
55
-
55
+
56
56
  def apply_for(java_fqn)
57
57
  log_if_verbose("apply_for(#{java_fqn.inspect})") do
58
58
  extension = self.find_for(java_fqn)
@@ -68,7 +68,7 @@ module Rubeus
68
68
  end
69
69
  end
70
70
  end
71
-
71
+
72
72
  end
73
73
  extend ::Rubeus::Verboseable
74
74
  end
@@ -2,5 +2,6 @@ module Rubeus::Extensions
2
2
  module Java
3
3
  autoload :Awt, 'rubeus/extensions/java/awt'
4
4
  autoload :Sql, 'rubeus/extensions/java/sql'
5
+ autoload :Lang, 'rubeus/extensions/java/lang'
5
6
  end
6
7
  end
@@ -3,7 +3,7 @@ module Rubeus::Extensions::Java::Awt
3
3
  def self.included(base)
4
4
  base.extend ClassMethods
5
5
  end
6
-
6
+
7
7
  module ClassMethods
8
8
  def create(*args)
9
9
  values = args
@@ -0,0 +1,5 @@
1
+ module Rubeus::Extensions::Java
2
+ module Lang
3
+ autoload :Reflect, 'rubeus/extensions/java/lang/reflect'
4
+ end
5
+ end
@@ -0,0 +1,4 @@
1
+ module Rubeus::Extensions::Java::Lang
2
+ module Reflect
3
+ end
4
+ end
@@ -0,0 +1,23 @@
1
+ module Rubeus::Extensions::Java::Lang::Reflect
2
+ module Method
3
+ MODIFIER = java.lang.reflect.Modifier
4
+
5
+ def package_scope?
6
+ !(private? || protected? || public?)
7
+ end
8
+
9
+ MODIFIER_SYMBOLS = MODIFIER.constants.map{|const_name| const_name.downcase.to_sym}.freeze
10
+ def modifier_symbols
11
+ MODIFIER_SYMBOLS.select{|sym| send("#{sym}?")}
12
+ end
13
+
14
+ defined_methods = java.lang.reflect.Method.instance_methods
15
+ MODIFIER_SYMBOLS.each do |modifier_sym|
16
+ next if defined_methods.include?("#{modifier_sym}?")
17
+ module_eval(<<-"EOS")
18
+ def #{modifier_sym}?; MODIFIER.#{modifier_sym}?(modifiers); end
19
+ EOS
20
+ end
21
+
22
+ end
23
+ end
@@ -4,7 +4,7 @@ Rubeus::Jdbc.depend_on("DatabaseMetaData")
4
4
  module Rubeus::Extensions::Java::Sql
5
5
  module Connection
6
6
  include Rubeus::Jdbc::CloseableResource
7
-
7
+
8
8
  def statement(*args, &block)
9
9
  with_close(create_statement(*args), &block)
10
10
  end
@@ -12,7 +12,7 @@ module Rubeus::Extensions::Java::Sql
12
12
  def query(sql, &block)
13
13
  statement{|st| st.query(sql, &block)}
14
14
  end
15
-
15
+
16
16
  def tables(catalog, schema_pattern, table_name_pattern, options = nil)
17
17
  getMetaData.table_objects(catalog, schema_pattern, table_name_pattern, options = nil)
18
18
  end
@@ -3,12 +3,12 @@ Rubeus::Jdbc.depend_on("Statement")
3
3
  module Rubeus::Extensions::Java::Sql
4
4
  module DatabaseMetaData
5
5
  def included(mod)
6
- mod.module_eval do
6
+ mod.module_eval do
7
7
  alias_method :getTables_without_rubeus, :getTables
8
8
  alias_method :getTables, :getTables_with_rubeus
9
9
  end
10
10
  end
11
-
11
+
12
12
  def getTables_with_rubeus(*args, &block)
13
13
  case args.length
14
14
  when 0, 1 then table_objects(*args, &block)
@@ -16,16 +16,16 @@ module Rubeus::Extensions::Java::Sql
16
16
  end
17
17
  end
18
18
  alias_method :tables, :getTables_with_rubeus
19
-
19
+
20
20
  def table_object(table_name, options = nil)
21
21
  options = {:table_name_pattern => table_name}.update(options || {})
22
22
  table_objects(options).first
23
23
  end
24
24
  alias_method :table, :table_object
25
-
25
+
26
26
  def table_objects(options = nil)
27
27
  options = {
28
- :catalog => nil,
28
+ :catalog => nil,
29
29
  :schema => nil,
30
30
  :schema_pattern => nil,
31
31
  :table => nil,
@@ -33,22 +33,22 @@ module Rubeus::Extensions::Java::Sql
33
33
  :table_name_pattern => nil,
34
34
  :name_case => nil # nil, :downcase, :upcase
35
35
  }.update(options || {})
36
- catalog = options[:catalog]
36
+ catalog = options[:catalog]
37
37
  schema_pattern = options[:schema_pattern] || options[:schema]
38
38
  table_name_pattern = options[:table_name_pattern] || options[:table_name] || options[:table]
39
-
39
+
40
40
  @table_objects ||= {}
41
41
  unless table_name_pattern.nil?
42
42
  key = [catalog, schema_pattern, table_name_pattern].map{|s| s.nil? ? nil : s.to_s.upcase}
43
43
  cached = @table_objects[key]
44
44
  return [cached] if cached
45
45
  end
46
-
46
+
47
47
  tables = getTables(catalog, schema_pattern, table_name_pattern, nil).map do |rs|
48
48
  Rubeus::Jdbc::Table.new(self, rs.to_hash, options)
49
49
  end
50
50
  tables = Rubeus::Util::NameAccessArray.new(*tables)
51
-
51
+
52
52
  columns = getColumns(catalog, schema_pattern, table_name_pattern, nil).map{|r| r.to_hash}
53
53
  tables.each do |table|
54
54
  table.columns = Rubeus::Util::NameAccessArray.new(
@@ -12,71 +12,72 @@ module Rubeus::Extensions::Java::Sql
12
12
  CONNECT_DEFAULT_OPTIONS = {
13
13
  :auto_setup_manager => true # trueならconnectメソッドの引数urlからドライバを探してロードします
14
14
  }.freeze
15
-
15
+
16
16
  def connect(url, user = '', password = '', options = CONNECT_DEFAULT_OPTIONS, &block)
17
17
  setup_for(url, options) if options[:auto_setup_manager]
18
18
  with_close(get_connection(url, user, password), &block)
19
19
  end
20
-
20
+
21
21
  def setup_for(url, options = nil)
22
22
  DriverManager::Loader.setup_for(url, options)
23
23
  end
24
24
  end
25
-
25
+
26
26
  class Loader
27
- def self.entries
28
- @entries ||= []
29
- end
30
-
31
- def self.entry(name, pattern, driver, driver_type = :unknown, options = nil, &block)
32
- result = entry_with(name) do |db|
33
- db.pattern(pattern, driver, driver_type)
34
- db.options = options
27
+ class << self
28
+ def entries
29
+ @entries ||= []
35
30
  end
36
- result.instance_eval(&block) if block_given?
37
- result
38
- end
39
-
40
- def self.entry_with(name, &block)
41
- result = self.new(name)
42
- result.instance_eval(&block) if block_given?
43
- entries << result
44
- result
45
- end
46
-
47
- def self.setup_for(url, setup_options = nil)
48
- entries.each do |entry|
49
- driver = entry.setup_for(url, setup_options)
50
- return driver if driver
31
+
32
+ def entry(name, *args, &block)
33
+ result = self.new(name)
34
+ if block_given?
35
+ result.instance_eval(&block)
36
+ else
37
+ pattern, driver, driver_type, options = *args
38
+ result.instance_eval do |db|
39
+ db.pattern(pattern, driver, driver_type || :unknown)
40
+ db.options = options
41
+ end
42
+ end
43
+ entries << result
44
+ result
45
+ end
46
+
47
+ def setup_for(url, setup_options = nil)
48
+ entries.each do |entry|
49
+ driver = entry.setup_for(url, setup_options)
50
+ return driver if driver
51
+ end
52
+ raise ArgumentError, "DriverManager catalog not found for #{url}"
51
53
  end
52
- raise ArgumentError, "DriverManager catalog not found for #{url}"
53
54
  end
54
-
55
- attr_reader :name
56
-
55
+
56
+ attr_reader :name, :patterns
57
+
57
58
  def initialize(name)
58
59
  @name = name
59
60
  @patterns = []
60
61
  end
61
-
62
+
62
63
  def pattern(pattern, driver, driver_type = :unknown)
63
64
  @patterns << {:pattern => pattern, :driver => driver, :driver_type => driver_type}
64
65
  end
65
-
66
+
66
67
  def options
67
- @options ||= {}
68
+ @options ||= {}
68
69
  end
69
-
70
+
70
71
  def options=(value)
71
72
  @options = value
72
73
  end
73
-
74
+
74
75
  def driver_for(url, driver_type = nil)
75
76
  patterns = driver_type ? @patterns.select{|pattern| pattern[:driver_type] == driver_type} : @patterns
76
77
  pattern = patterns.detect{|pattern| pattern[:pattern] =~ url}
77
78
  pattern ? pattern[:driver] : nil
78
79
  end
79
-
80
+
80
81
  def setup_for(url, setup_options = nil)
81
82
  driver_name = driver_for(url)
82
83
  return nil unless driver_name
@@ -109,7 +110,7 @@ module Rubeus::Extensions::Java::Sql
109
110
  end
110
111
  end
111
112
  end
112
-
113
+
113
114
  # http://wiki.paulownia.jp/java/jdbc
114
115
  class Loader
115
116
  # JDBC-ODBC Bridge
@@ -117,8 +118,8 @@ module Rubeus::Extensions::Java::Sql
117
118
  # jdbc:odbc:DataSourceName
118
119
  # Type1はODBCを使用してデータベースにアクセス。ODBCドライバのインストールと
119
120
  # ODBCアドミニストレータ設定が必要。DataSourceNameにはODBCで設定した名前を入れる。
120
- entry("ODBC", /jdbc:odbc:.*/, "sun.jdbc.odbc.JdbcOdbcDriver", :type1)
121
-
121
+ entry("ODBC", /^jdbc:odbc:/, "sun.jdbc.odbc.JdbcOdbcDriver", :type1)
122
+
122
123
  # DB2
123
124
  # Type2 COM.ibm.db2.jdbc.app.DB2Driver (v8.1まで)
124
125
  # com.ibm.db2.jcc.DB2Driver (DB2 v8.1.2以降)
@@ -130,71 +131,71 @@ module Rubeus::Extensions::Java::Sql
130
131
  # Type3 COM.ibm.db2.jdbc.net.DB2Driver
131
132
  # jdbc:db2://127.0.0.1:50000/DataBaseName
132
133
  # JDBC Type3ドライバのサポートは終了しており、Type4の使用が推奨されている。
133
- #
134
+ #
134
135
  # DB2
135
136
  # Type4 com.ibm.db2.jcc.DB2Driver
136
137
  # jdbc:db2://127.0.0.1:50000/DataBaseName
137
138
  # DB2バージョン8.1からサポートされた。DB2クライアントのインストールは不要。
138
- entry_with "DB2" do |db|
139
- db.pattern(/jdbc:db2:\/\/.*\/.*/, 'com.ibm.db2.jcc.DB2Driver' , :type4)
140
- db.pattern(/jdbc:db2:\/\/.*\/.*/, 'COM.ibm.db2.jdbc.net.DB2Driver', :type3)
141
- db.pattern(/jdbc:db2:.*/ , 'COM.ibm.db2.jdbc.app.DB2Driver', :type2)
139
+ entry "DB2" do |db|
140
+ db.pattern(/^jdbc:db2:/, 'com.ibm.db2.jcc.DB2Driver' , :type4)
141
+ db.pattern(/^jdbc:db2:/, 'COM.ibm.db2.jdbc.net.DB2Driver', :type3)
142
+ db.pattern(/^jdbc:db2:/ , 'COM.ibm.db2.jdbc.app.DB2Driver', :type2)
142
143
  end
143
-
144
+
144
145
  # Oracle
145
146
  # Type4 oracle.jdbc.driver.OracleDriver
146
147
  # jdbc:oracle:thin:@127.0.0.1:1521:SID
147
148
  # オラクルは他のDBと違い、URLのプロトコルとホストの区切りが // ではなく @ となっている。
148
- #
149
- # Oracle
149
+ #
150
+ # Oracle
150
151
  # Type2 oracle.jdbc.driver.OracleDriver
151
152
  # jdbc:oracle:oci8:@TNS (for Oracle 8i)
152
153
  # jdbc:oracle:oci:@TNS (for Oracle 9i or 10g)
153
154
  # tnsnames.oraファイルにデータソースの設定を書く。Oracleクライアントが必要。
154
155
  # 10gは9i用クライアントでも使用可能のようだ。
155
- entry_with "Oracle" do |db|
156
- db.pattern(/jdbc:oracle:thin:@.*(:.*)*(:.*)*/, 'oracle.jdbc.driver.OracleDriver', :type4)
157
- db.pattern(/jdbc:oracle:oci8:@.*/ , 'oracle.jdbc.driver.OracleDriver', :type2)
158
- db.pattern(/jdbc:oracle:oci:@.*/ , 'oracle.jdbc.driver.OracleDriver', :type2)
156
+ entry "Oracle" do |db|
157
+ db.pattern(/^jdbc:oracle:thin:@/, 'oracle.jdbc.driver.OracleDriver', :type4)
158
+ db.pattern(/^jdbc:oracle:oci8:@/, 'oracle.jdbc.driver.OracleDriver', :type2)
159
+ db.pattern(/^jdbc:oracle:oci:@/ , 'oracle.jdbc.driver.OracleDriver', :type2)
159
160
  end
160
-
161
+
161
162
  # SQL Server 2000
162
163
  # Type4 com.microsoft.jdbc.sqlserver.SQLServerDriver
163
164
  # jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=DBName
164
165
  # MS製なのでWindows版しかないが、導入が容易でバランスのとれたチューニングが施されている。
165
166
  # このドライバはMSDE 2000でも使用可能。
166
- entry("SQL Server 2000", /jdbc:microsoft:sqlserver:.*/, "com.microsoft.jdbc.sqlserver.SQLServerDriver", :type4)
167
+ entry("SQL Server 2000", /^jdbc:microsoft:sqlserver:/, "com.microsoft.jdbc.sqlserver.SQLServerDriver", :type4)
167
168
 
168
169
  # SQL Server 2005
169
170
  # Type4 com.microsoft.sqlserver.jdbc.SQLServerDriver
170
171
  # jdbc:sqlserver://localhost:1433;DatabaseName=DBName
171
172
  # SQLServer 2005。旧バージョンからドライバクラスもURLも微妙に変更されているので注意。参考
172
- entry("SQL Server 2005", /jdbc:sqlserver:.*/, "com.microsoft.sqlserver.jdbc.SQLServerDriver", :type4)
173
-
173
+ entry("SQL Server 2005", /^jdbc:sqlserver:/, "com.microsoft.sqlserver.jdbc.SQLServerDriver", :type4)
174
+
174
175
  # Firebird
175
176
  # Type 4 org.firebirdsql.jdbc.FBDriver
176
177
  # jdbc:firebirdsql://127.0.0.1:3050/DataBasePath
177
178
  # オープンソースのRDB。DataBasePathにはサーバ上のデータベースファイル(.gdb)への絶対パスを指定するらしい。
178
- entry("Firebird", /jdbc:firebirdsql:.*/, "org.firebirdsql.jdbc.FBDriver", :type4)
179
-
179
+ entry("Firebird", /^jdbc:firebirdsql:/, "org.firebirdsql.jdbc.FBDriver", :type4)
180
+
180
181
  # MySQL
181
182
  # Type 4 com.mysql.jdbc.Driver
182
183
  # jdbc:mysql://127.0.0.1:3306/DBName
183
184
  # GPLライセンスと商用ライセンスで利用できるRDB。Movable Type等のBlogツールでも採用されている。
184
- entry("MySQL", /jdbc:mysql:.*/, "com.mysql.jdbc.Driver", :type4,
185
+ entry("MySQL", /^jdbc:mysql:/, "com.mysql.jdbc.Driver", :type4,
185
186
  :gem => "jdbc-mysql", :gem_require => "jdbc/mysql")
186
-
187
+
187
188
  # PostgreSQL
188
189
  # Type 4 org.postgresql.Driver
189
190
  # jdbc:postgresql://127.0.0.1:5432/DBName
190
191
  # BSDライセンスで配布されており、商用でも無償で使用可能。中小規模システム、個人用DBとしてMySQLと並んで人気。
191
- entry("PostgreSQL", /jdbc:postgresql:.*/, "org.postgresql.Driver", :type4,
192
+ entry("PostgreSQL", /^jdbc:postgresql:/, "org.postgresql.Driver", :type4,
192
193
  :gem => "jdbc-postgres", :gem_require => "jdbc/postgres")
193
-
194
+
194
195
  # HSQLDB org.hsqldb.jdbcDriver
195
196
  # jdbc:hsqldb:hsql://127.0.0.1:9001/databasename
196
197
  # 高速、軽量、Pure Javaの組み込み向けRDBMS。jarファイル一つで動作する。このURLはサーバモードで起動したHSQLDBにアクセスするURL。
197
- #
198
+ #
198
199
  # org.hsqldb.jdbcDriver
199
200
  # jdbc:hsqldb:file:databasename
200
201
  # HSQLDBをインプロセスモードで起動する。javaアプリケーションと同じVM上で起動し、組み込みのデータベースとして使う。
@@ -203,51 +204,51 @@ module Rubeus::Extensions::Java::Sql
203
204
  # org.hsqldb.jdbcDriver
204
205
  # jdbc:hsqldb:mem:databasename
205
206
  # HSQLDBをインメモリモードで起動する。インメモリモードはスタンドアロンモードと同じだがデータを永続化しない。JavaVMを終了するとデータが失われる。
206
- entry_with "HSQLDB" do |db|
207
- db.pattern(/jdbc:hsqldb:hsql:.*/, "org.hsqldb.jdbcDriver")
208
- db.pattern(/jdbc:hsqldb:file:.*/, "org.hsqldb.jdbcDriver")
209
- db.pattern(/jdbc:hsqldb:mem:.*/ , "org.hsqldb.jdbcDriver")
207
+ entry "HSQLDB" do |db|
208
+ db.pattern(/^jdbc:hsqldb:hsql:/, "org.hsqldb.jdbcDriver")
209
+ db.pattern(/^jdbc:hsqldb:file:/, "org.hsqldb.jdbcDriver")
210
+ db.pattern(/^jdbc:hsqldb:mem:/ , "org.hsqldb.jdbcDriver")
210
211
  db.options = {:gem => "jdbc-hsqldb", :gem_require => "jdbc/hsqldb"}
211
212
  end
212
-
213
+
213
214
  # Derby org.apache.derby.jdbc.EmbeddedDriver
214
215
  # jdbc:derby:databasename;create=true
215
216
  # Java言語で書かれた組み込み用のデータベース。create=trueはオプションで、databasenameが見つからない場合に新規データベースを作成する。
216
- entry("Derby", /jdbc:derby:.*/, "org.apache.derby.jdbc.EmbeddedDriver", :unknown,
217
+ entry("Derby", /^jdbc:derby:/, "org.apache.derby.jdbc.EmbeddedDriver", :unknown,
217
218
  :gem => 'jdbc-derby', :gem_require => [
218
219
  'jdbc/derby',
219
220
  (ENV_JAVA['java.specification.version'] > '1.5' ? File.join(ENV_JAVA['java.home'], 'db', 'lib', 'derby.jar') : nil)
220
221
  ].compact)
221
-
222
+
222
223
  # OpenBase
223
224
  # Type4 com.openbase.jdbc.ObDriver
224
225
  # jdbc:openbase://localhost/DataBaseName
225
226
  # MacOSXの前身NEXTSTEP/OPENSTEP上で開発されたRDBMSらしい。Linux版、Windows版もあるようだ。
226
- entry("OpenBase", /jdbc:openbase:.*/, "com.openbase.jdbc.ObDriver", :type4)
227
-
227
+ entry("OpenBase", /^jdbc:openbase:/, "com.openbase.jdbc.ObDriver", :type4)
228
+
228
229
  # H2 org.h2.Driver
229
230
  # jdbc:h2:tcp://localhost:9092/DataBasePath
230
231
  # HSQLの開発者が作成した組み込みDB。DBをサーバとして起動した場合のURL。
231
232
  # org.h2.Driver
232
233
  # jdbc:h2:DataBasePath
233
234
  # 組み込みDBとして使用する場合のURL。
234
- entry_with "H2" do |db|
235
- db.pattern(/jdbc:h2:tcp:.*/, "org.h2.Driver")
236
- db.pattern(/jdbc:h2:.*/ , "org.h2.Driver")
235
+ entry "H2" do |db|
236
+ db.pattern(/^jdbc:h2:tcp:/, "org.h2.Driver")
237
+ db.pattern(/^jdbc:h2:/ , "org.h2.Driver")
237
238
  db.options = {:gem => "jdbc-h2", :gem_require => "jdbc/h2"}
238
239
  end
239
-
240
+
240
241
  # Sybase ASE
241
242
  # Type4 com.sybase.jdbc.SybDriver
242
243
  # jdbc:sybase:Tds:localhost:8001/databasename
243
244
  # 一時期MSSQLServerとして提供されていたこともあるRDBMS。そのためか両製品をサポートしているサードパーティ製やオープンソースのドライバがある。
244
- entry("Sybase ASE", /jdbc:sybase:Tds:.*/, "com.sybase.jdbc.SybDriver", :type4)
245
-
245
+ entry("Sybase ASE", /^jdbc:sybase:Tds:/, "com.sybase.jdbc.SybDriver", :type4)
246
+
246
247
  # SQLite
247
248
  # Type4(?) org.sqlite.JDBC
248
249
  # jdbc:sqlite:databasefile_path
249
- # SQLiteにアクセスするJDBCドライバ。NestedVMというものをつかってPure Javaのドライバとしている?らしい…
250
- entry("SQLite", /jdbc:sqlite:.*/, "org.sqlite.JDBC", :type4,
250
+ # SQLiteにアクセスするJDBCドライバ。NestedVMというものをつかってPure Javaのドライバとしている?らしい…
251
+ entry("SQLite", /^jdbc:sqlite:/, "org.sqlite.JDBC", :type4,
251
252
  :gem => "jdbc-sqlite3", :gem_require => "jdbc/sqlite3")
252
253
  end
253
254