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.
- data/.document +5 -0
- data/.gitignore +8 -0
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/Rakefile +55 -16
- data/VERSION +1 -0
- data/examples/.gitignore +1 -0
- data/examples/JavaSwingExample01.java +41 -0
- data/examples/jdbc_example.rb +1 -2
- data/examples/notepad.rb +15 -17
- data/examples/nyanco_viewer/nekobean_LICENSE.txt +22 -0
- data/examples/rubeus_swing_example01.rb +0 -2
- data/examples/rubeus_swing_example01_with_class.rb +1 -3
- data/examples/rubeus_swing_jdbc_example01.rb +5 -0
- data/java/.gitignore +3 -0
- data/java/mvn_plugins.yml +57 -0
- data/java/pom.xml +30 -0
- data/java/src/main/java/jp/rubybizcommons/rubeus/extensions/javax/swing/table/DelegatableTableModel.java +54 -0
- data/java/src/main/java/jp/rubybizcommons/rubeus/extensions/javax/swing/table/ReadonlyableTableModel.java +24 -0
- data/lib/rubeus.rb +6 -4
- data/lib/rubeus/awt/attributes.rb +5 -5
- data/lib/rubeus/awt/event.rb +8 -8
- data/lib/rubeus/awt/nestable.rb +4 -4
- data/lib/rubeus/awt/setters.rb +1 -1
- data/lib/rubeus/component_loader.rb +12 -11
- data/lib/rubeus/extensions.rb +6 -6
- data/lib/rubeus/extensions/java.rb +1 -0
- data/lib/rubeus/extensions/java/awt/dimension.rb +1 -1
- data/lib/rubeus/extensions/java/lang.rb +5 -0
- data/lib/rubeus/extensions/java/lang/reflect.rb +4 -0
- data/lib/rubeus/extensions/java/lang/reflect/method.rb +23 -0
- data/lib/rubeus/extensions/java/sql/connection.rb +2 -2
- data/lib/rubeus/extensions/java/sql/database_meta_data.rb +9 -9
- data/lib/rubeus/extensions/java/sql/driver_manager.rb +80 -79
- data/lib/rubeus/extensions/java/sql/result_set.rb +6 -6
- data/lib/rubeus/extensions/java/sql/result_set_meta_data.rb +4 -4
- data/lib/rubeus/extensions/javax/swing/box_layout.rb +4 -4
- data/lib/rubeus/extensions/javax/swing/j_component.rb +1 -1
- data/lib/rubeus/extensions/javax/swing/j_editor_pane.rb +5 -0
- data/lib/rubeus/extensions/javax/swing/j_frame.rb +1 -1
- data/lib/rubeus/extensions/javax/swing/j_list.rb +5 -0
- data/lib/rubeus/extensions/javax/swing/j_scroll_pane.rb +1 -1
- data/lib/rubeus/extensions/javax/swing/j_split_pane.rb +1 -1
- data/lib/rubeus/extensions/javax/swing/j_table.rb +2 -2
- data/lib/rubeus/extensions/javax/swing/j_text_pane.rb +7 -0
- data/lib/rubeus/extensions/javax/swing/table/default_table_model.rb +10 -10
- data/lib/rubeus/extensions/javax/swing/timer.rb +3 -3
- data/lib/rubeus/jdbc.rb +2 -2
- data/lib/rubeus/jdbc/closeable_resource.rb +1 -1
- data/lib/rubeus/jdbc/column.rb +19 -14
- data/lib/rubeus/jdbc/foreign_key.rb +14 -9
- data/lib/rubeus/jdbc/index.rb +15 -10
- data/lib/rubeus/jdbc/meta_element.rb +8 -8
- data/lib/rubeus/jdbc/primary_key.rb +26 -7
- data/lib/rubeus/jdbc/result_set_column.rb +3 -3
- data/lib/rubeus/jdbc/table.rb +47 -36
- data/lib/rubeus/reflection.rb +17 -0
- data/lib/rubeus/swing.rb +1 -1
- data/lib/rubeus/util.rb +3 -0
- data/lib/rubeus/util/java_method_name.rb +31 -0
- data/lib/rubeus/util/name_access_array.rb +6 -4
- data/lib/rubeus/verboseable.rb +3 -3
- data/rmaven.yml +5 -0
- data/rubeus.gemspec +202 -0
- data/test/rubeus/extensions/java/awt/test_dimension.rb +47 -47
- data/test/rubeus/extensions/java/sql/test_database_meta_data.rb +86 -40
- data/test/rubeus/extensions/java/sql/test_driver_manager.rb +9 -2
- data/test/rubeus/extensions/java/sql/test_sql_helper.rb +4 -4
- data/test/rubeus/reflection/test_method_modifier.rb +107 -0
- data/test/rubeus/test_extensions.rb +30 -30
- data/test/rubeus_test.jar +0 -0
- data/test_jar/.classpath +7 -0
- data/test_jar/.gitignore +1 -0
- data/test_jar/.project +17 -0
- data/test_jar/mvn_plugins.yml +57 -0
- data/test_jar/pom.xml +25 -0
- data/test_jar/src/main/java/jp/rubybizcommons/rubeus/test/reflection/VariousFields.java +13 -0
- data/test_jar/src/main/java/jp/rubybizcommons/rubeus/test/reflection/VariousMethods.java +14 -0
- data/test_jar/src/test/java/jp/rubybizcommons/rubeus/test/AppTest.java +38 -0
- metadata +137 -47
- 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
|
+
}
|
data/lib/rubeus.rb
CHANGED
@@ -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.
|
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
|
data/lib/rubeus/awt/event.rb
CHANGED
@@ -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
|
data/lib/rubeus/awt/nestable.rb
CHANGED
@@ -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)
|
data/lib/rubeus/awt/setters.rb
CHANGED
@@ -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)
|
data/lib/rubeus/extensions.rb
CHANGED
@@ -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
|
@@ -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
|
-
|
28
|
-
|
29
|
-
|
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
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
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",
|
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
|
-
|
139
|
-
db.pattern(
|
140
|
-
db.pattern(
|
141
|
-
db.pattern(
|
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
|
-
|
156
|
-
db.pattern(
|
157
|
-
db.pattern(
|
158
|
-
db.pattern(
|
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",
|
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",
|
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",
|
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",
|
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",
|
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
|
-
|
207
|
-
db.pattern(
|
208
|
-
db.pattern(
|
209
|
-
db.pattern(
|
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",
|
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",
|
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
|
-
|
235
|
-
db.pattern(
|
236
|
-
db.pattern(
|
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",
|
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",
|
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
|
|