001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019
020 package org.apache.xbean.osgi.bundle.util;
021
022 import java.io.IOException;
023 import java.io.InputStream;
024 import java.net.URL;
025 import java.util.ArrayList;
026 import java.util.Collection;
027 import java.util.Collections;
028 import java.util.Dictionary;
029 import java.util.Enumeration;
030 import java.util.List;
031 import java.util.Map;
032
033 import org.osgi.framework.Bundle;
034 import org.osgi.framework.BundleContext;
035 import org.osgi.framework.BundleException;
036 import org.osgi.framework.ServiceReference;
037 import org.osgi.framework.Version;
038
039 /**
040 * Bundle that delegates ClassLoader operations to a collection of {@link Bundle} objects.
041 *
042 * @version $Rev: 937957 $ $Date: 2010-04-26 10:00:08 +0200 (Mon, 26 Apr 2010) $
043 */
044 public class DelegatingBundle implements Bundle {
045
046 private Collection<Bundle> bundles;
047 private Bundle bundle;
048 private BundleContext bundleContext;
049
050 public DelegatingBundle(Collection<Bundle> bundles) {
051 this.bundles = bundles;
052 if (bundles.isEmpty()) {
053 throw new IllegalArgumentException("At least one bundle is required");
054 }
055 // assume first Bundle is the main bundle
056 this.bundle = bundles.iterator().next();
057 this.bundleContext = new DelegatingBundleContext(this, bundle.getBundleContext());
058 }
059
060 public Bundle getMainBundle() {
061 return bundle;
062 }
063
064 public Class<?> loadClass(String name) throws ClassNotFoundException {
065 for (Bundle bundle : bundles) {
066 try {
067 return bundle.loadClass(name);
068 } catch (ClassNotFoundException ex) {
069 // ignore
070 }
071 }
072 throw new ClassNotFoundException(name);
073 }
074
075 public URL getResource(String name) {
076 URL resource = null;
077 for (Bundle bundle : bundles) {
078 resource = bundle.getResource(name);
079 if (resource != null) {
080 return resource;
081 }
082 }
083 return null;
084 }
085
086 public Enumeration<URL> getResources(String name) throws IOException {
087 ArrayList<URL> allResources = new ArrayList<URL>();
088 for (Bundle bundle : bundles) {
089 Enumeration<URL> e = (Enumeration<URL>) bundle.getResources(name);
090 addToList(allResources, e);
091 }
092 return Collections.enumeration(allResources);
093 }
094
095 private static void addToList(List<URL> list, Enumeration<URL> enumeration) {
096 if (enumeration != null) {
097 while (enumeration.hasMoreElements()) {
098 list.add(enumeration.nextElement());
099 }
100 }
101 }
102
103 public BundleContext getBundleContext() {
104 return bundleContext;
105 }
106
107 public Enumeration findEntries(String arg0, String arg1, boolean arg2) {
108 return bundle.findEntries(arg0, arg1, arg2);
109 }
110
111 public long getBundleId() {
112 return bundle.getBundleId();
113 }
114
115 public URL getEntry(String arg0) {
116 return bundle.getEntry(arg0);
117 }
118
119 public Enumeration getEntryPaths(String arg0) {
120 return bundle.getEntryPaths(arg0);
121 }
122
123 public Dictionary getHeaders() {
124 return bundle.getHeaders();
125 }
126
127 public Dictionary getHeaders(String arg0) {
128 return bundle.getHeaders(arg0);
129 }
130
131 public long getLastModified() {
132 return bundle.getLastModified();
133 }
134
135 public String getLocation() {
136 return bundle.getLocation();
137 }
138
139 public ServiceReference[] getRegisteredServices() {
140 return bundle.getRegisteredServices();
141 }
142
143 public ServiceReference[] getServicesInUse() {
144 return bundle.getServicesInUse();
145 }
146
147 public Map getSignerCertificates(int arg0) {
148 return bundle.getSignerCertificates(arg0);
149 }
150
151 public int getState() {
152 return bundle.getState();
153 }
154
155 public String getSymbolicName() {
156 return bundle.getSymbolicName();
157 }
158
159 public Version getVersion() {
160 return bundle.getVersion();
161 }
162
163 public boolean hasPermission(Object arg0) {
164 return bundle.hasPermission(arg0);
165 }
166
167 public void start() throws BundleException {
168 bundle.start();
169 }
170
171 public void start(int arg0) throws BundleException {
172 bundle.start(arg0);
173 }
174
175 public void stop() throws BundleException {
176 bundle.stop();
177 }
178
179 public void stop(int arg0) throws BundleException {
180 bundle.stop(arg0);
181 }
182
183 public void uninstall() throws BundleException {
184 bundle.uninstall();
185 }
186
187 public void update() throws BundleException {
188 bundle.update();
189 }
190
191 public void update(InputStream arg0) throws BundleException {
192 bundle.update(arg0);
193 }
194
195 public String toString() {
196 return "[DelegatingBundle: " + bundles + "]";
197 }
198
199 }