osgi 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,104 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one or more
2
+ # contributor license agreements. See the NOTICE file distributed with this
3
+ # work for additional information regarding copyright ownership. The ASF
4
+ # licenses this file to you under the Apache License, Version 2.0 (the
5
+ # "License"); you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13
+ # License for the specific language governing permissions and limitations under
14
+ # the License.
15
+
16
+ module OSGi #:nodoc:
17
+
18
+ # A class to represent an OSGi bundle package.
19
+ # Created from the Import-Package or Provide-Package (Export-Package) header.
20
+ #
21
+ class BundlePackage
22
+ attr_accessor :name, :version, :bundles, :imports, :is_export, :original_version, :optional
23
+
24
+ def initialize(name, version, args = {}) #:nodoc:
25
+ @name= name
26
+ @is_export = args[:is_export]
27
+ @optional = args[:optional]
28
+ @original_version = version
29
+ if version
30
+ v = version.gsub(/\"/, '')
31
+ v = VersionRange.parse(v, true)
32
+ v ||= v
33
+ @version = v
34
+ end
35
+ @bundles = args[:bundles] || []
36
+ @imports = args[:imports] || []
37
+ end
38
+
39
+ #
40
+ # Resolves the matching artifacts associated with the project.
41
+ #
42
+ def resolve_matching_artifacts
43
+ # Collect the bundle projects
44
+ # and extend them with the BundleProjectMatcher module
45
+ b_projects = BundleProjects::bundle_projects.select {|p|
46
+ p.extend BundleProjectMatcher
47
+ p.matches(:exports_package => name, :version => version)
48
+ }
49
+ warn "*** SPLIT PACKAGE: #{self} is exported by more than one project: <#{b_projects.join(", ")}> ABORTING!" if b_projects.size > 1
50
+ return b_projects unless b_projects.empty?
51
+
52
+ resolved = OSGi.registry.resolved_containers.collect {|i| i.find(:exports_package => name, :version => version)}
53
+ resolved.flatten.compact.collect{|b| b.dup}
54
+ end
55
+
56
+ # Resolves the bundles that export this package.
57
+ #
58
+ def resolve(bundles = resolve_matching_artifacts)
59
+ bundles = case bundles.size
60
+ when 0 then []
61
+ when 1 then bundles
62
+ else
63
+ bundles = PackageResolvingStrategies.send(OSGi.options.package_resolving_strategy, name, bundles)
64
+ end
65
+ if bundles.empty?
66
+
67
+ return [] if OSGi.is_framework_package?(name) # Is the bundle part of the packages provided by default ?
68
+
69
+
70
+ trace "original version: #{original_version}"
71
+ if optional
72
+ info "No bundles found exporting the optional package #{name};version=#{version} (#{original_version})"
73
+ else
74
+ warn "No bundles found exporting the package #{name};version=#{version} (#{original_version})"
75
+ end
76
+ end
77
+ bundles
78
+
79
+ end
80
+
81
+ def to_s #:nodoc:
82
+ "Package #{name}; version #{version}"
83
+ end
84
+
85
+ # Important for maps.
86
+ # We absolutely want to avoid having to resolve several times the same package
87
+ #
88
+ def hash
89
+ return to_s.hash
90
+ end
91
+
92
+ # We just test the name and version as we want to be able to see if an unresolved package and a resolved one represent the same
93
+ # bundle package.
94
+ def ==(other)
95
+ return false unless other.is_a? BundlePackage
96
+ eql = name == other.name
97
+ eql |= version.nil? ? other.version.nil? : version == other.version
98
+ eql
99
+ end
100
+
101
+ alias :eql? :==
102
+ end
103
+
104
+ end
@@ -0,0 +1,145 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one or more
2
+ # contributor license agreements. See the NOTICE file distributed with this
3
+ # work for additional information regarding copyright ownership. The ASF
4
+ # licenses this file to you under the Apache License, Version 2.0 (the
5
+ # "License"); you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13
+ # License for the specific language governing permissions and limitations under
14
+ # the License.
15
+
16
+ require "manifest"
17
+
18
+ module OSGi #:nodoc:
19
+
20
+ # This class represents an OSGi container.
21
+ # It contains the bundles, fragments, and the location of the OSGi container.
22
+ # A typical OSGi container is an Eclipse instance.
23
+ #
24
+ class Container
25
+
26
+ # bundles: the bundles of the eclipse instance loaded on startup
27
+ # location: the location of the Eclipse instance
28
+ attr_reader :bundles, :fragments, :location
29
+
30
+ # Default constructor for a Container
31
+ #
32
+ # location: the location of the Eclipse instance
33
+ # plugin_locations, default value is ["dropins", "plugins"]
34
+ # create_bundle_info, default value is true
35
+ def initialize(location, plugin_locations = ["dropins", "plugins"])
36
+ @location = location
37
+ @bundles = []
38
+ @fragments = []
39
+ plugin_locations.each do |p_loc|
40
+ p_loc_complete = File.join(@location, p_loc)
41
+ warn "Folder #{p_loc_complete} not found!" if !File.exists? p_loc_complete
42
+ parse(p_loc_complete) if File.exists? p_loc_complete
43
+ end
44
+ end
45
+
46
+ # Parses the directory and grabs the plugins, adding the created bundle objects to @bundles.
47
+ def parse(dir)
48
+ Dir.open(dir) do |plugins|
49
+ plugins.entries.each do |plugin|
50
+ absolute_plugin_path = "#{plugins.path}#{File::SEPARATOR}#{plugin}"
51
+ if (/.*\.jar$/.match(plugin))
52
+ zipfile = Zip::ZipFile.open(absolute_plugin_path)
53
+ entry = zipfile.find_entry("META-INF/MANIFEST.MF")
54
+ if (entry != nil)
55
+ manifest = Manifest.read(zipfile.read("META-INF/MANIFEST.MF"))
56
+ bundle = Bundle.fromManifest(manifest, absolute_plugin_path)
57
+ if bundle.nil?
58
+ elsif bundle.fragment?
59
+ @fragments << bundle
60
+ else
61
+ @bundles << bundle
62
+ end
63
+ end
64
+ zipfile.close
65
+ else
66
+ # take care of the folder
67
+ if (File.directory?(absolute_plugin_path) && !(plugin == "." || plugin == ".."))
68
+ if (!File.exists? ["#{absolute_plugin_path}", "META-INF", "MANIFEST.MF"].join(File::SEPARATOR))
69
+ #recursive approach: we have a folder wih no MANIFEST.MF, we should look into it.
70
+ parse(absolute_plugin_path)
71
+ else
72
+ next if File.exists? "#{absolute_plugin_path}/feature.xml" # avoid parsing features.
73
+ begin
74
+ manifest = Manifest.read((file = File.open("#{absolute_plugin_path}/META-INF/MANIFEST.MF")).read)
75
+ rescue
76
+ file.close
77
+ end
78
+ bundle = Bundle.fromManifest(manifest, absolute_plugin_path)
79
+ if bundle.nil?
80
+ elsif bundle.fragment?
81
+ @fragments << bundle
82
+ else
83
+ @bundles << bundle
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ @bundles = @bundles.compact
91
+ @fragments = @fragments.compact
92
+ end
93
+
94
+ # Return the list of bundles and fragments that match the criteria passed as arguments
95
+ # Possible criterias:
96
+ # name: the name of the bundle
97
+ # version: the version of the bundle
98
+ # exports_package: a package exported by the bundle
99
+ def find(criteria = {})
100
+ selected = bundles + fragments
101
+
102
+ if (criteria[:name])
103
+ selected = selected.select {|b| b.name == criteria[:name]}
104
+ end
105
+ if (criteria[:exports_package])
106
+ selected = selected.select {|b|
107
+ !(b.exported_packages.select {|package|
108
+ package.name == criteria[:exports_package] &&
109
+ (criteria[:version].nil? || criteria[:version].in_range(package.version))
110
+ }.empty?)
111
+ }
112
+ else
113
+ if (criteria[:version])
114
+ if criteria[:version].is_a?(VersionRange)
115
+ selected = selected.select {|b| criteria[:version].in_range(b.version)}
116
+ else
117
+ selected = selected.select {|b| b.version == criteria[:version]}
118
+ end
119
+ end
120
+ end
121
+ selected
122
+ end
123
+
124
+ # Return the list of fragments that match the criteria passed as arguments
125
+ # Possible criterias:
126
+ # host: the name of the host bundle
127
+ # version: the version of the bundle
128
+ #
129
+ def find_fragments(criteria = {:host => "", :version => ""})
130
+ selected = fragments
131
+ if (criteria[:host])
132
+ selected = selected.select {|b| b.fragment.name == criteria[:host]}
133
+ end
134
+ if (criteria[:version])
135
+ selected = selected.select {|b| b.fragment.version == criteria[:version]}
136
+ end
137
+ selected
138
+ end
139
+
140
+ def ==(other)
141
+ false unless other.is_a? Container
142
+ return location == other.location
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,199 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one or more
2
+ # contributor license agreements. See the NOTICE file distributed with this
3
+ # work for additional information regarding copyright ownership. The ASF
4
+ # licenses this file to you under the Apache License, Version 2.0 (the
5
+ # "License"); you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13
+ # License for the specific language governing permissions and limitations under
14
+ # the License.
15
+
16
+ module OSGi
17
+
18
+ # The notion of profile in OSGi refers to the execution environment: SDK, loaded libraries in LD_LIBRARY_PATH.
19
+ # A set of default execution environments is defined by the OSGi specifications.
20
+ class ExecutionEnvironment
21
+
22
+ attr_reader :name, :description, :packages
23
+
24
+ def initialize(name, description, packages)
25
+ @name = name
26
+ @description = description
27
+ @packages = packages.is_a?(Array) ? packages : [packages]
28
+ @packages.freeze
29
+ freeze
30
+ end
31
+
32
+ end
33
+
34
+ # No profile.
35
+ NONE = ExecutionEnvironment.new("None", "None", [])
36
+
37
+ # The standard CDC-1.0/Foundation-1.0 profile
38
+ CDC10FOUNDATION10 = ExecutionEnvironment.new("CDC-1.0/Foundation-1.0", "Equal to J2ME Foundation Profile", ["javax.microedition.io"])
39
+
40
+ # The standard CDC-1.0/Foundation-1.1 profile
41
+ CDC10FOUNDATION11 = ExecutionEnvironment.new("CDC-1.0/Foundation-1.1", "Equal to J2ME Foundation Profile", ["javax.microedition.io","javax.microedition.pki",
42
+ "javax.security.auth.x500"])
43
+
44
+ # The standard J2SE-1.2 profile
45
+ J2SE12 = ExecutionEnvironment.new("J2SE-1.2", "Java 2 Platform, Standard Edition 1.2", %w{javax.accessibility javax.swing javax.swing.border javax.swing.colorchooser javax.swing.event javax.swing.filechooser
46
+ javax.swing.plaf javax.swing.plaf.basic javax.swing.plaf.metal javax.swing.plaf.multi javax.swing.table javax.swing.text javax.swing.text.html
47
+ javax.swing.text.html.parser javax.swing.text.rtf javax.swing.tree javax.swing.undo org.omg.CORBA org.omg.CORBA.DynAnyPackage org.omg.CORBA.ORBPackage
48
+ org.omg.CORBA.portable org.omg.CORBA.TypeCodePackage org.omg.CosNaming org.omg.CosNaming.NamingContextPackage})
49
+
50
+ # The standard J2SE-1.3 profile
51
+ J2SE13 = ExecutionEnvironment.new("J2SE-1.3", "Java 2 Platform, Standard Edition 1.3", %w{javax.accessibility javax.naming javax.naming.directory javax.naming.event javax.naming.ldap
52
+ javax.naming.spi javax.rmi javax.rmi.CORBA javax.sound.midi javax.sound.midi.spi javax.sound.sampled javax.sound.sampled.spi javax.swing javax.swing.border
53
+ javax.swing.colorchooser javax.swing.event javax.swing.filechooser javax.swing.plaf javax.swing.plaf.basic javax.swing.plaf.metal javax.swing.plaf.multi
54
+ javax.swing.table javax.swing.text javax.swing.text.html javax.swing.text.html.parser javax.swing.text.rtf javax.swing.tree javax.swing.undo javax.transaction
55
+ org.omg.CORBA org.omg.CORBA_2_3 org.omg.CORBA_2_3.portable org.omg.CORBA.DynAnyPackage org.omg.CORBA.ORBPackage org.omg.CORBA.portable
56
+ org.omg.CORBA.TypeCodePackage org.omg.CosNaming org.omg.CosNaming.NamingContextPackage org.omg.SendingContext org.omg.stub.java.rmi})
57
+
58
+ # The standard J2SE-1.4 profile
59
+ J2SE14 = ExecutionEnvironment.new("J2SE-1.4", "Java 2 Platform, Standard Edition 1.4", %w{javax.accessibility javax.crypto javax.crypto.interfaces javax.crypto.spec javax.imageio
60
+ javax.imageio.event javax.imageio.metadata javax.imageio.plugins.jpeg javax.imageio.spi javax.imageio.stream javax.naming javax.naming.directory javax.naming.event
61
+ javax.naming.ldap javax.naming.spi javax.net javax.net.ssl javax.print javax.print.attribute javax.print.attribute.standard javax.print.event javax.rmi
62
+ javax.rmi.CORBA javax.security.auth javax.security.auth.callback javax.security.auth.kerberos javax.security.auth.login javax.security.auth.spi
63
+ javax.security.auth.x500 javax.security.cert javax.sound.midi javax.sound.midi.spi javax.sound.sampled javax.sound.sampled.spi javax.sql javax.swing
64
+ javax.swing.border javax.swing.colorchooser javax.swing.event javax.swing.filechooser javax.swing.plaf javax.swing.plaf.basic javax.swing.plaf.metal
65
+ javax.swing.plaf.multi javax.swing.table javax.swing.text javax.swing.text.html javax.swing.text.html.parser javax.swing.text.rtf javax.swing.tree
66
+ javax.swing.undo javax.transaction javax.transaction.xa javax.xml.parsers javax.xml.transform javax.xml.transform.dom javax.xml.transform.sax
67
+ javax.xml.transform.stream org.ietf.jgss org.omg.CORBA org.omg.CORBA_2_3 org.omg.CORBA_2_3.portable org.omg.CORBA.DynAnyPackage org.omg.CORBA.ORBPackage
68
+ org.omg.CORBA.portable org.omg.CORBA.TypeCodePackage org.omg.CosNaming org.omg.CosNaming.NamingContextExtPackage org.omg.CosNaming.NamingContextPackage
69
+ org.omg.Dynamic org.omg.DynamicAny org.omg.DynamicAny.DynAnyFactoryPackage org.omg.DynamicAny.DynAnyPackage org.omg.IOP org.omg.IOP.CodecFactoryPackage
70
+ org.omg.IOP.CodecPackage org.omg.Messaging org.omg.PortableInterceptor org.omg.PortableInterceptor.ORBInitInfoPackage org.omg.PortableServer
71
+ org.omg.PortableServer.CurrentPackage org.omg.PortableServer.POAManagerPackage org.omg.PortableServer.POAPackage org.omg.PortableServer.portable
72
+ org.omg.PortableServer.ServantLocatorPackage org.omg.SendingContext org.omg.stub.java.rmi org.w3c.dom org.w3c.dom.css org.w3c.dom.events
73
+ org.w3c.dom.html org.w3c.dom.stylesheets org.w3c.dom.views org.xml.sax org.xml.sax.ext org.xml.sax.helpers})
74
+
75
+ # The standard J2SE-1.5 profile
76
+ J2SE15 = ExecutionEnvironment.new("J2SE-1.5", "Java 2 Platform, Standard Edition 5.0", %w{javax.accessibility javax.activity javax.crypto javax.crypto.interfaces
77
+ javax.crypto.spec javax.imageio javax.imageio.event
78
+ javax.imageio.metadata javax.imageio.plugins.bmp javax.imageio.plugins.jpeg javax.imageio.spi javax.imageio.stream javax.management javax.management.loading
79
+ javax.management.modelmbean javax.management.monitor javax.management.openmbean javax.management.relation javax.management.remote javax.management.remote.rmi
80
+ javax.management.timer javax.naming javax.naming.directory javax.naming.event javax.naming.ldap javax.naming.spi javax.net javax.net.ssl javax.print
81
+ javax.print.attribute javax.print.attribute.standard javax.print.event javax.rmi javax.rmi.CORBA javax.rmi.ssl javax.security.auth javax.security.auth.callback
82
+ javax.security.auth.kerberos javax.security.auth.login javax.security.auth.spi javax.security.auth.x500 javax.security.cert javax.security.sasl javax.sound.midi
83
+ javax.sound.midi.spi javax.sound.sampled javax.sound.sampled.spi javax.sql javax.sql.rowset javax.sql.rowset.serial javax.sql.rowset.spi javax.swing
84
+ javax.swing.border javax.swing.colorchooser javax.swing.event javax.swing.filechooser javax.swing.plaf javax.swing.plaf.basic javax.swing.plaf.metal
85
+ javax.swing.plaf.multi javax.swing.plaf.synth javax.swing.table javax.swing.text javax.swing.text.html javax.swing.text.html.parser javax.swing.text.rtf
86
+ javax.swing.tree javax.swing.undo javax.transaction javax.transaction.xa javax.xml javax.xml.datatype javax.xml.namespace javax.xml.parsers javax.xml.transform
87
+ javax.xml.transform.dom javax.xml.transform.sax javax.xml.transform.stream javax.xml.validation javax.xml.xpath org.ietf.jgss org.omg.CORBA org.omg.CORBA_2_3
88
+ org.omg.CORBA_2_3.portable org.omg.CORBA.DynAnyPackage org.omg.CORBA.ORBPackage org.omg.CORBA.portable org.omg.CORBA.TypeCodePackage org.omg.CosNaming
89
+ org.omg.CosNaming.NamingContextExtPackage org.omg.CosNaming.NamingContextPackage org.omg.Dynamic org.omg.DynamicAny org.omg.DynamicAny.DynAnyFactoryPackage
90
+ org.omg.DynamicAny.DynAnyPackage org.omg.IOP org.omg.IOP.CodecFactoryPackage org.omg.IOP.CodecPackage org.omg.Messaging org.omg.PortableInterceptor
91
+ org.omg.PortableInterceptor.ORBInitInfoPackage org.omg.PortableServer org.omg.PortableServer.CurrentPackage org.omg.PortableServer.POAManagerPackage
92
+ org.omg.PortableServer.POAPackage org.omg.PortableServer.portable org.omg.PortableServer.ServantLocatorPackage org.omg.SendingContext org.omg.stub.java.rmi
93
+ org.w3c.dom org.w3c.dom.bootstrap org.w3c.dom.css org.w3c.dom.events org.w3c.dom.html org.w3c.dom.ls org.w3c.dom.ranges org.w3c.dom.stylesheets
94
+ org.w3c.dom.traversal org.w3c.dom.views org.xml.sax org.xml.sax.ext org.xml.sax.helpers})
95
+
96
+ # The standard JavaSE-1.6 profile
97
+ JAVASE16 = ExecutionEnvironment.new("JavaSE-1.6", "Java Platform, Standard Edition 6.0", %w{javax.accessibility javax.activation javax.activity
98
+ javax.annotation javax.annotation.processing javax.crypto javax.crypto.interfaces
99
+ javax.crypto.spec javax.imageio javax.imageio.event javax.imageio.metadata javax.imageio.plugins.bmp javax.imageio.plugins.jpeg javax.imageio.spi
100
+ javax.imageio.stream javax.jws javax.jws.soap javax.lang.model javax.lang.model.element javax.lang.model.type javax.lang.model.util javax.management
101
+ javax.management.loading javax.management.modelmbean javax.management.monitor javax.management.openmbean javax.management.relation javax.management.remote
102
+ javax.management.remote.rmi javax.management.timer javax.naming javax.naming.directory javax.naming.event javax.naming.ldap javax.naming.spi javax.net
103
+ javax.net.ssl javax.print javax.print.attribute javax.print.attribute.standard javax.print.event javax.rmi javax.rmi.CORBA javax.rmi.ssl javax.script
104
+ javax.security.auth javax.security.auth.callback javax.security.auth.kerberos javax.security.auth.login javax.security.auth.spi javax.security.auth.x500
105
+ javax.security.cert javax.security.sasl javax.sound.midi javax.sound.midi.spi javax.sound.sampled javax.sound.sampled.spi javax.sql javax.sql.rowset
106
+ javax.sql.rowset.serial javax.sql.rowset.spi javax.swing javax.swing.border javax.swing.colorchooser javax.swing.event javax.swing.filechooser
107
+ javax.swing.plaf javax.swing.plaf.basic javax.swing.plaf.metal javax.swing.plaf.multi javax.swing.plaf.synth javax.swing.table javax.swing.text
108
+ javax.swing.text.html javax.swing.text.html.parser javax.swing.text.rtf javax.swing.tree javax.swing.undo javax.tools javax.transaction
109
+ javax.transaction.xa javax.xml javax.xml.bind javax.xml.bind.annotation javax.xml.bind.annotation.adapters javax.xml.bind.attachment
110
+ javax.xml.bind.helpers javax.xml.bind.util javax.xml.crypto javax.xml.crypto.dom javax.xml.crypto.dsig javax.xml.crypto.dsig.dom
111
+ javax.xml.crypto.dsig.keyinfo javax.xml.crypto.dsig.spec javax.xml.datatype javax.xml.namespace javax.xml.parsers javax.xml.soap javax.xml.stream
112
+ javax.xml.stream.events javax.xml.stream.util javax.xml.transform javax.xml.transform.dom javax.xml.transform.sax javax.xml.transform.stax
113
+ javax.xml.transform.stream javax.xml.validation javax.xml.ws javax.xml.ws.handler javax.xml.ws.handler.soap javax.xml.ws.http javax.xml.ws.soap
114
+ javax.xml.ws.spi javax.xml.xpath org.ietf.jgss org.omg.CORBA org.omg.CORBA_2_3 org.omg.CORBA_2_3.portable org.omg.CORBA.DynAnyPackage
115
+ org.omg.CORBA.ORBPackage org.omg.CORBA.portable org.omg.CORBA.TypeCodePackage org.omg.CosNaming org.omg.CosNaming.NamingContextExtPackage
116
+ org.omg.CosNaming.NamingContextPackage org.omg.Dynamic org.omg.DynamicAny org.omg.DynamicAny.DynAnyFactoryPackage org.omg.DynamicAny.DynAnyPackage
117
+ org.omg.IOP org.omg.IOP.CodecFactoryPackage org.omg.IOP.CodecPackage org.omg.Messaging org.omg.PortableInterceptor
118
+ org.omg.PortableInterceptor.ORBInitInfoPackage org.omg.PortableServer org.omg.PortableServer.CurrentPackage org.omg.PortableServer.POAManagerPackage
119
+ org.omg.PortableServer.POAPackage org.omg.PortableServer.portable org.omg.PortableServer.ServantLocatorPackage org.omg.SendingContext
120
+ org.omg.stub.java.rmi org.w3c.dom org.w3c.dom.bootstrap org.w3c.dom.css org.w3c.dom.events org.w3c.dom.html org.w3c.dom.ls org.w3c.dom.ranges
121
+ org.w3c.dom.stylesheets org.w3c.dom.traversal org.w3c.dom.views org.xml.sax org.xml.sax.ext org.xml.sax.helpers})
122
+
123
+ JAVASE17 = ExecutionEnvironment.new("JavaSE-1.7", "Java SE 1.7.x (early access)", %w{javax.accessibility javax.activation javax.activity javax.annotation javax.annotation.processing
124
+ javax.crypto javax.crypto.interfaces javax.crypto.spec javax.imageio javax.imageio.event javax.imageio.metadata javax.imageio.plugins.bmp
125
+ javax.imageio.plugins.jpeg javax.imageio.spi javax.imageio.stream javax.jws javax.jws.soap javax.lang.model javax.lang.model.element javax.lang.model.type
126
+ javax.lang.model.util javax.management javax.management.loading javax.management.modelmbean javax.management.monitor javax.management.openmbean
127
+ javax.management.relation javax.management.remote javax.management.remote.rmi javax.management.timer javax.naming javax.naming.directory javax.naming.event
128
+ javax.naming.ldap javax.naming.spi javax.net javax.net.ssl javax.print javax.print.attribute javax.print.attribute.standard javax.print.event javax.rmi
129
+ javax.rmi.CORBA javax.rmi.ssl javax.script javax.security.auth javax.security.auth.callback javax.security.auth.kerberos javax.security.auth.login
130
+ javax.security.auth.spi javax.security.auth.x500 javax.security.cert javax.security.sasl javax.sound.midi javax.sound.midi.spi javax.sound.sampled
131
+ javax.sound.sampled.spi javax.sql javax.sql.rowset javax.sql.rowset.serial javax.sql.rowset.spi javax.swing javax.swing.border javax.swing.colorchooser
132
+ javax.swing.event javax.swing.filechooser javax.swing.plaf javax.swing.plaf.basic javax.swing.plaf.metal javax.swing.plaf.multi javax.swing.plaf.synth
133
+ javax.swing.table javax.swing.text javax.swing.text.html javax.swing.text.html.parser javax.swing.text.rtf javax.swing.tree javax.swing.undo javax.tools
134
+ javax.transaction javax.transaction.xa javax.xml javax.xml.bind javax.xml.bind.annotation javax.xml.bind.annotation.adapters javax.xml.bind.attachment
135
+ javax.xml.bind.helpers javax.xml.bind.util javax.xml.crypto javax.xml.crypto.dom javax.xml.crypto.dsig javax.xml.crypto.dsig.dom javax.xml.crypto.dsig.keyinfo
136
+ javax.xml.crypto.dsig.spec javax.xml.datatype javax.xml.namespace javax.xml.parsers javax.xml.soap javax.xml.stream javax.xml.stream.events javax.xml.stream.util
137
+ javax.xml.transform javax.xml.transform.dom javax.xml.transform.sax javax.xml.transform.stax javax.xml.transform.stream javax.xml.validation javax.xml.ws
138
+ javax.xml.ws.handler javax.xml.ws.handler.soap javax.xml.ws.http javax.xml.ws.soap javax.xml.ws.spi javax.xml.xpath org.ietf.jgss org.omg.CORBA org.omg.CORBA_2_3
139
+ org.omg.CORBA_2_3.portable org.omg.CORBA.DynAnyPackage org.omg.CORBA.ORBPackage org.omg.CORBA.portable org.omg.CORBA.TypeCodePackage org.omg.CosNaming
140
+ org.omg.CosNaming.NamingContextExtPackage org.omg.CosNaming.NamingContextPackage org.omg.Dynamic org.omg.DynamicAny org.omg.DynamicAny.DynAnyFactoryPackage
141
+ org.omg.DynamicAny.DynAnyPackage org.omg.IOP org.omg.IOP.CodecFactoryPackage org.omg.IOP.CodecPackage org.omg.Messaging org.omg.PortableInterceptor
142
+ org.omg.PortableInterceptor.ORBInitInfoPackage org.omg.PortableServer org.omg.PortableServer.CurrentPackage org.omg.PortableServer.POAManagerPackage
143
+ org.omg.PortableServer.POAPackage org.omg.PortableServer.portable org.omg.PortableServer.ServantLocatorPackage org.omg.SendingContext org.omg.stub.java.rmi
144
+ org.w3c.dom org.w3c.dom.bootstrap org.w3c.dom.css org.w3c.dom.events org.w3c.dom.html org.w3c.dom.ls org.w3c.dom.ranges org.w3c.dom.stylesheets
145
+ org.w3c.dom.traversal org.w3c.dom.views org.xml.sax org.xml.sax.ext org.xml.sax.helpers})
146
+
147
+ OSGIMINIMUM10 = ExecutionEnvironment.new("OSGi/Minimum-1.0", "OSGi EE that is a minimal set that allows the implementation of an OSGi Framework", [])
148
+ OSGIMINIMUM11 = ExecutionEnvironment.new("OSGi/Minimum-1.1", "OSGi EE that is a minimal set that allows the implementation of an OSGi Framework", [])
149
+ OSGIMINIMUM12 = ExecutionEnvironment.new("OSGi/Minimum-1.2", "OSGi EE that is a minimal set that allows the implementation of an OSGi Framework", [])
150
+
151
+ # The execution environment configuration class
152
+ # represents how to dispose of execution environments.
153
+ # The default execution environments are initialized in the constructor.
154
+ #
155
+ class ExecutionEnvironmentConfiguration
156
+
157
+ attr_accessor :extra_packages, :execution_environment
158
+
159
+ # Constructor
160
+ def initialize
161
+ @extra_packages = []
162
+ @available_ee = {}
163
+
164
+ register_execution_environment(NONE)
165
+ register_execution_environment(CDC10FOUNDATION10)
166
+ register_execution_environment(CDC10FOUNDATION11)
167
+ register_execution_environment(J2SE12)
168
+ register_execution_environment(J2SE13)
169
+ register_execution_environment(J2SE14)
170
+ register_execution_environment(J2SE15)
171
+ register_execution_environment(JAVASE16)
172
+ register_execution_environment(JAVASE17)
173
+ register_execution_environment(OSGIMINIMUM10)
174
+ register_execution_environment(OSGIMINIMUM11)
175
+ register_execution_environment(OSGIMINIMUM12)
176
+
177
+ @execution_environment = JAVASE16.name
178
+ end
179
+
180
+ #
181
+ # Returns the current execution environment.
182
+ # By default we return JavaSE-1.6
183
+ #
184
+ def current_execution_environment
185
+ @available_ee[@execution_environment]
186
+ end
187
+
188
+ # Registers an execution enviroment in the configuration.
189
+ # This method should be used to register additional execution environments using an extension.
190
+ #
191
+ def register_execution_environment(ee)
192
+ raise "Cannot register this execution environment" unless ee.is_a? ExecutionEnvironment
193
+ available_ee[ee.name] = ee
194
+ end
195
+
196
+ attr_accessor :available_ee
197
+
198
+ end
199
+ end
@@ -0,0 +1,137 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one or more
2
+ # contributor license agreements. See the NOTICE file distributed with this
3
+ # work for additional information regarding copyright ownership. The ASF
4
+ # licenses this file to you under the Apache License, Version 2.0 (the
5
+ # "License"); you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13
+ # License for the specific language governing permissions and limitations under
14
+ # the License.
15
+
16
+ require 'singleton'
17
+
18
+ module OSGi
19
+
20
+ OSGI_GROUP_ID = "osgi"
21
+
22
+ class GroupMatcher
23
+ include Singleton
24
+ attr_accessor :group_matchers
25
+
26
+ def initialize
27
+ @group_matchers = []
28
+ # Default rule for Eclipse artifacts.
29
+ @group_matchers << Proc.new {|n| "org.eclipse" if n.match(/org\.eclipse\..*/) }
30
+ end
31
+
32
+ def group(bundle)
33
+ return group(bundle.id) if bundle.is_a?(Bundle)
34
+ group_matchers.reverse.each do |group|
35
+ result = group.call(bundle)
36
+ return result unless result.nil?
37
+ end
38
+ OSGI_GROUP_ID
39
+
40
+ end
41
+ end
42
+ #
43
+ # A class to hold the registered containers. It is possible to add containers until resolved_containers is called,
44
+ # after which it is not possible to modify the registry anymore.
45
+ #
46
+ class Registry
47
+
48
+ #
49
+ # Sets the containers of the registry
50
+ # Raises an exception if containers have been resolved already.
51
+ #
52
+ def containers=(containers)
53
+ raise "Cannot set containers, containers have been resolved already" if @resolved_containers
54
+ @containers = containers
55
+ end
56
+
57
+ #
58
+ # Returns the containers associated with this registry.
59
+ # The list of containers is modifiable if resolved_containers hasn't been called yet.
60
+ #
61
+ def containers
62
+ unless @containers
63
+ @containers = read_containers
64
+ if ENV['OSGI'] && !ENV['OSGi']
65
+ warn "The correct constant to define for the OSGi containers is named OSGi"
66
+ ENV['OSGi'] = ENV['OSGI']
67
+ end
68
+ if ENV['OSGi']
69
+ @containers |= ENV['OSGi'].split(';')
70
+ end
71
+ end
72
+ @resolved_containers.nil? ? @containers : @containers.dup.freeze
73
+ end
74
+
75
+ #
76
+ # Resolves the containers registered in this registry.
77
+ # This is a long running operation where all the containers are parsed.
78
+ #
79
+ # Containers are resolved only once.
80
+ #
81
+ def resolved_containers
82
+ @resolved_containers ||= containers.collect { |container| Container.new(container) }
83
+ @resolved_containers
84
+ end
85
+
86
+ protected
87
+
88
+ #
89
+ # Reads the containers from a configuration file.
90
+ # By default it returns an empty array.
91
+ #
92
+ def read_containers
93
+ []
94
+ end
95
+ end
96
+
97
+ # The options for the osgi.options method
98
+ # package_resolving_strategy:
99
+ # The package resolving strategy, it should be a symbol representing a module function in the OSGi::PackageResolvingStrategies module.
100
+ # bundle_resolving_strategy:
101
+ # The bundle resolving strategy, it should be a symbol representing a module function in the OSGi::BundleResolvingStrategies module.
102
+ # group_matchers:
103
+ # A set of Proc objects to match a bundle to a groupId for maven.
104
+ # The array is examined with the latest added Procs first.
105
+ # The first proc to return a non-nil answer is used, otherwise the OGSGI_GROUP_ID constant is used.
106
+ class Options < ::OSGi::ExecutionEnvironmentConfiguration
107
+ attr_accessor :package_resolving_strategy, :bundle_resolving_strategy
108
+
109
+ def initialize
110
+ super
111
+ @package_resolving_strategy = :all
112
+ @bundle_resolving_strategy = :latest
113
+ end
114
+ end
115
+
116
+ # Calls to this method return true if the package name passed as argument
117
+ # is either part of the packages of the framework given by the execution environment
118
+ # or part of the extra packages specified by the user.
119
+ #
120
+ def is_framework_package?(name)
121
+ options.current_execution_environment.packages.include?(name) || options.extra_packages.include?(name)
122
+ end
123
+
124
+ # Options for the framework resolution.
125
+ #
126
+ def options
127
+ @options ||= Options.new
128
+ end
129
+
130
+ #
131
+ # Returns the registry
132
+ #
133
+ def registry
134
+ @registry ||= ::OSGi::Registry.new
135
+ end
136
+
137
+ end