diff options
Diffstat (limited to 'branches/sca-java-1.3/modules/contribution-osgi/src/main/java')
7 files changed, 0 insertions, 1088 deletions
diff --git a/branches/sca-java-1.3/modules/contribution-osgi/src/main/java/org/apache/tuscany/sca/contribution/osgi/BundleReference.java b/branches/sca-java-1.3/modules/contribution-osgi/src/main/java/org/apache/tuscany/sca/contribution/osgi/BundleReference.java deleted file mode 100644 index 0bbb8b707a..0000000000 --- a/branches/sca-java-1.3/modules/contribution-osgi/src/main/java/org/apache/tuscany/sca/contribution/osgi/BundleReference.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.tuscany.sca.contribution.osgi; - - -/** - * A weak reference to a class, which should be used to register classes - * with an ArtifactResolver and resolve these classes later. - * - * @version $Rev$ $Date$ - */ -public class BundleReference { - - /** - * The bundle. - */ - private Object bundle; - - /** - * The bundle name. - */ - private String bundleName; - - /** - * The bundle version. - */ - private String bundleVersion; - - /** - * The bundle name and version. - */ - private String bundleUniqueName; - - /** - * The bundle relative path. - */ - private String bundleRelativePath; - - /** - * Constructs a new BundleReference. - * - * @param bundle The bundle reference - * @param bundleName The bundle name - * @param bundleVersion The bundle version - * @param bundleRelativePath The relative path for the bundle - */ - public BundleReference(Object bundle, String bundleName, String bundleVersion, String bundleRelativePath) { - this.bundle = bundle; - this.bundleName = bundleName; - this.bundleVersion = bundleVersion; - this.bundleRelativePath = bundleRelativePath; - this.bundleUniqueName = bundleName + "(" + (bundleVersion == null?"0.0.0":bundleVersion) + ")"; - } - - /** - * Constructs a new BundleReference. - * - * @param bundleName The bundle name - * @param bundleVersion The bundle version - */ - public BundleReference(String bundleName, String bundleVersion) { - this.bundleName = bundleName; - this.bundleVersion = bundleVersion; - this.bundleUniqueName = bundleName + "(" + (bundleVersion == null?"0.0.0":bundleVersion) + ")"; - } - - /** - * Get the referenced bundle. - * - * @return The referenced bundle - */ - public Object getBundle() { - return bundle; - } - - /** - * Get the referenced bundle name. - * - * @return The bundle name - */ - public String getBundleName() { - return bundleName; - } - - /** - * Get the referenced bundle version. - * - * @return The bundle version - */ - public String getBundleVersion() { - return bundleVersion; - } - - /** - * Get the referenced bundle name and version. - * - * @return The bundle name - */ - public String getBundleUniqueName() { - return bundleUniqueName; - } - - /** - * Get the relative location of the bundle inside its contribution. - * - * @return The bundle path - */ - public String getBundleRelativePath() { - return bundleRelativePath; - } - - - - /** - * Returns true if the bundle reference is unresolved. - * - * @return Whether or not the bundle has been resolved - */ - public boolean isUnresolved() { - return bundle == null; - } - - @Override - public int hashCode() { - return bundleUniqueName.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if (obj == this) { - return true; - } else { - if (obj instanceof BundleReference) { - BundleReference ref = (BundleReference)obj; - return bundleName.equals(ref.bundleName) && - (bundleVersion == null || ref.bundleVersion == null || - bundleVersion.equals(ref.bundleVersion)); - } else { - return false; - } - } - } - -} diff --git a/branches/sca-java-1.3/modules/contribution-osgi/src/main/java/org/apache/tuscany/sca/contribution/osgi/impl/OSGiBundleContributionProcessor.java b/branches/sca-java-1.3/modules/contribution-osgi/src/main/java/org/apache/tuscany/sca/contribution/osgi/impl/OSGiBundleContributionProcessor.java deleted file mode 100644 index 5033d7eefc..0000000000 --- a/branches/sca-java-1.3/modules/contribution-osgi/src/main/java/org/apache/tuscany/sca/contribution/osgi/impl/OSGiBundleContributionProcessor.java +++ /dev/null @@ -1,161 +0,0 @@ -/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.tuscany.sca.contribution.osgi.impl;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.jar.JarEntry;
-import java.util.jar.JarInputStream;
-
-import org.apache.tuscany.sca.contribution.PackageType;
-import org.apache.tuscany.sca.contribution.processor.PackageProcessor;
-import org.apache.tuscany.sca.contribution.service.ContributionException;
-import org.apache.tuscany.sca.osgi.runtime.OSGiRuntime;
-import org.osgi.framework.Bundle;
-
-/**
- * Bundle Contribution package processor.
- *
- * @version $Rev$ $Date$
- */
-public class OSGiBundleContributionProcessor implements PackageProcessor {
-
- public OSGiBundleContributionProcessor() {
- }
-
- public String getPackageType() {
- return PackageType.BUNDLE;
- }
-
- public URL getArtifactURL(URL sourceURL, URI artifact) throws MalformedURLException {
- Bundle bundle = null;
- try {
- bundle = OSGiRuntime.findInstalledBundle(sourceURL);
- if (bundle != null) {
- URL url = bundle.getResource(artifact.getPath());
- if (url == null)
- System.out.println("Could not load resource " + artifact);
- return url;
- }
- } catch (Exception e) {
- }
- return null;
- }
-
- public List<URI> getJarArtifacts(URL packageSourceURL, InputStream inputStream) throws ContributionException,
- IOException {
- if (packageSourceURL == null) {
- throw new IllegalArgumentException("Invalid null package source URL.");
- }
-
- if (inputStream == null) {
- throw new IllegalArgumentException("Invalid null source inputstream.");
- }
-
- // Assume the root is a jar file
- JarInputStream jar = new JarInputStream(inputStream);
- try {
- Set<String> names = new HashSet<String>();
- while (true) {
- JarEntry entry = jar.getNextJarEntry();
- if (entry == null) {
- // EOF
- break;
- }
-
- // FIXME: Maybe we should externalize the filter as a property
- String name = entry.getName();
- if (!name.startsWith(".") && !entry.isDirectory()) {
-
- // Trim trailing /
- if (name.endsWith("/")) {
- name = name.substring(0, name.length() - 1);
- }
-
- // Add the entry name
- if (!names.contains(name) && name.length() > 0) {
- names.add(name);
-
- }
- }
- }
-
- // Return list of URIs
- List<URI> artifacts = new ArrayList<URI>();
- for (String name: names) {
- artifacts.add(URI.create(name));
- }
- return artifacts;
-
- } finally {
- jar.close();
- }
-}
-
- public List<URI> getArtifacts(URL packageSourceURL, InputStream inputStream) throws ContributionException,
- IOException {
-
- Bundle bundle = null;
- try {
- bundle = OSGiRuntime.findInstalledBundle(packageSourceURL);
- } catch (Exception e) {
- }
-
- if (bundle == null) {
- throw new IllegalArgumentException("Could not find OSGi bundle " + packageSourceURL);
- }
-
- if (packageSourceURL == null) {
- throw new IllegalArgumentException("Invalid null package source URL.");
- }
-
- List<URI> artifacts = new ArrayList<URI>();
-
- try {
- Enumeration entries = bundle.findEntries("/", "*", true);
- while (entries.hasMoreElements()) {
- URL entry = (URL)entries.nextElement();
- String entryName = entry.getPath();
- if (entryName.startsWith("/"))
- entryName = entryName.substring(1);
- artifacts.add(new URI(entryName));
-
- if (entryName.endsWith(".jar")) {
-
- URL jarResource = bundle.getResource(entryName);
- artifacts.addAll(getJarArtifacts(jarResource, jarResource.openStream()));
- }
-
- }
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
-
- return artifacts;
- }
-}
diff --git a/branches/sca-java-1.3/modules/contribution-osgi/src/main/java/org/apache/tuscany/sca/contribution/osgi/impl/OSGiBundleProcessor.java b/branches/sca-java-1.3/modules/contribution-osgi/src/main/java/org/apache/tuscany/sca/contribution/osgi/impl/OSGiBundleProcessor.java deleted file mode 100644 index b3c2302f60..0000000000 --- a/branches/sca-java-1.3/modules/contribution-osgi/src/main/java/org/apache/tuscany/sca/contribution/osgi/impl/OSGiBundleProcessor.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.tuscany.sca.contribution.osgi.impl; - -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.util.List; -import java.util.jar.Attributes; -import java.util.jar.JarInputStream; -import java.util.jar.Manifest; - -import org.apache.tuscany.sca.contribution.Artifact; -import org.apache.tuscany.sca.contribution.Contribution; -import org.apache.tuscany.sca.contribution.osgi.BundleReference; -import org.apache.tuscany.sca.osgi.runtime.OSGiRuntime; - -/** - * OSGi bundle processor - * - * @version $Rev$ $Date$ - */ -public class OSGiBundleProcessor { - - private boolean initializedOSGi; - private OSGiRuntime osgiRuntime; - - public OSGiBundleProcessor() { - } - - public Object installContributionBundle(Contribution contribution) { - - JarInputStream jar = null; - Object bundle = null; - - try { - - URL contribURL = new URL(contribution.getLocation()); - jar = new JarInputStream(contribURL.openStream()); - - Manifest manifest = jar.getManifest(); - if (manifest != null && manifest.getMainAttributes() - .containsKey(new Attributes.Name("Bundle-SymbolicName"))) { - - initialize(); - if (osgiRuntime != null) - bundle = osgiRuntime.installBundle(contribURL.toString(), null); - } - } catch (Exception e) { - // If OSGi cannot process the jar, treat the bundle as a plain jar file. - } finally { - - try { - if (jar != null) - jar.close(); - } catch (IOException e) { - } - } - - return bundle; - } - - public BundleReference installNestedBundle(Contribution contribution, - String bundleSymbolicName, - String bundleVersion) { - - BundleReference bundleReference = null; - - initialize(); - if (osgiRuntime == null) - return null; - - List<Artifact> artifacts = contribution.getArtifacts(); - for (Artifact a : artifacts) { - if (a.getURI().endsWith(".jar")) { - - InputStream stream; - JarInputStream jar = null; - Object name; - Object version; - try { - - URL artifactURL = new URL(a.getLocation()); - stream = artifactURL.openStream(); - jar = new JarInputStream(artifactURL.openStream()); - Manifest manifest = jar.getManifest(); - name = manifest.getMainAttributes().get(new Attributes.Name("Bundle-SymbolicName")); - version = manifest.getMainAttributes().get(new Attributes.Name("Bundle-Version")); - - if (bundleSymbolicName.equals(name) && (bundleVersion == null || version == null || bundleVersion - .equals(version))) { - - Object bundle = osgiRuntime.installBundle(a.getLocation(), stream); - - bundleReference = new BundleReference(bundle, bundleSymbolicName, bundleVersion, a.getURI()); - - break; - } - - } catch (Exception e) { - - // If OSGi cannot process the jar, treat the bundle as a plain jar file. - } finally { - try { - if (jar != null) - jar.close(); - } catch (IOException e) { - } - } - } - } - return bundleReference; - } - - private void initialize() { - try { - if (!initializedOSGi) { - initializedOSGi = true; - osgiRuntime = OSGiRuntime.getRuntime(); - } - } catch (Exception e) { - } - } -} diff --git a/branches/sca-java-1.3/modules/contribution-osgi/src/main/java/org/apache/tuscany/sca/contribution/osgi/impl/OSGiBundleReferenceModelResolver.java b/branches/sca-java-1.3/modules/contribution-osgi/src/main/java/org/apache/tuscany/sca/contribution/osgi/impl/OSGiBundleReferenceModelResolver.java deleted file mode 100644 index 07e80f66f3..0000000000 --- a/branches/sca-java-1.3/modules/contribution-osgi/src/main/java/org/apache/tuscany/sca/contribution/osgi/impl/OSGiBundleReferenceModelResolver.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.tuscany.sca.contribution.osgi.impl; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.tuscany.sca.contribution.Contribution; -import org.apache.tuscany.sca.contribution.Import; -import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint; -import org.apache.tuscany.sca.contribution.osgi.BundleReference; -import org.apache.tuscany.sca.contribution.resolver.ModelResolver; -import org.apache.tuscany.sca.osgi.runtime.OSGiRuntime; -import org.osgi.framework.Bundle; - -/** - * A Model Resolver for BundleReferences. - * - * @version $Rev$ $Date$ - */ -public class OSGiBundleReferenceModelResolver implements ModelResolver { - private Contribution contribution; - private Map<String, BundleReference> map = new HashMap<String, BundleReference>(); - - OSGiRuntime osgiRuntime; - private OSGiBundleProcessor bundleProcessor; - - public OSGiBundleReferenceModelResolver(Contribution contribution, ModelFactoryExtensionPoint modelFactories) { - this.contribution = contribution; - this.bundleProcessor = new OSGiBundleProcessor(); - } - - public void addModel(Object resolved) { - BundleReference bundleRef = (BundleReference)resolved; - map.put(bundleRef.getBundleUniqueName(), bundleRef); - } - - public Object removeModel(Object resolved) { - return map.remove(((BundleReference)resolved).getBundleUniqueName()); - } - - /** - * Handle artifact resolution when the specific class reference is imported from another contribution - * @param unresolved - * @return - */ - private BundleReference resolveImportedModel(BundleReference unresolved) { - BundleReference resolved = unresolved; - - if( this.contribution != null) { - for (Import import_ : this.contribution.getImports()) { - - resolved = import_.getModelResolver().resolveModel(BundleReference.class, unresolved); - if (resolved != unresolved) - break; - } - - } - return resolved; - } - - - public <T> T resolveModel(Class<T> modelClass, T unresolved) { - Object resolved = map.get(unresolved); - - if (resolved != null ){ - return modelClass.cast(resolved); - } - - try { - if (osgiRuntime == null) - osgiRuntime = OSGiRuntime.getRuntime(); - } catch (Exception e) { - } - if (osgiRuntime == null) - return unresolved; - - //Load a class on demand - Object bundle = null; - String bundleName = ((BundleReference)unresolved).getBundleName(); - String bundleVersion = ((BundleReference)unresolved).getBundleVersion(); - - bundle = osgiRuntime.findBundle(bundleName, bundleVersion); - BundleReference bundleReference; - - if (bundle == null) - bundleReference = bundleProcessor.installNestedBundle(contribution, bundleName, bundleVersion); - else { - bundleReference = new BundleReference(bundle, - ((BundleReference)unresolved).getBundleName(), - bundleVersion, - getBundleFileName(bundle) - ); - } - - - if (bundleReference != null) { - //if we load the class - - map.put(((BundleReference)unresolved).getBundleUniqueName(), bundleReference); - - // Return the resolved BundleReference - return modelClass.cast(bundleReference); - } else { - //delegate resolution of the class - resolved = this.resolveImportedModel((BundleReference)unresolved); - return modelClass.cast(resolved); - } - - - } - - - private String getBundleFileName(Object bundle) { - if (bundle instanceof Bundle) { - String path = ((Bundle)bundle).getLocation(); - if (path.endsWith("/")) - path = path.substring(0, path.length()-1); - if (path.startsWith(contribution.getLocation())) { - if (path.equals(contribution.getLocation())) { - int index = path.lastIndexOf('/'); - if (index > 0 && index < path.length()-1) - path = path.substring(index+1); - } else { - path = path.substring(contribution.getLocation().length()); - if (path.startsWith("/")) - path = path.substring(1); - } - } else if (path.lastIndexOf('/') >= 0) - path = path.substring(path.lastIndexOf('/')+1); - return path; - } - return null; - - } - -} diff --git a/branches/sca-java-1.3/modules/contribution-osgi/src/main/java/org/apache/tuscany/sca/contribution/osgi/impl/OSGiClassReferenceModelResolver.java b/branches/sca-java-1.3/modules/contribution-osgi/src/main/java/org/apache/tuscany/sca/contribution/osgi/impl/OSGiClassReferenceModelResolver.java deleted file mode 100644 index 528a287328..0000000000 --- a/branches/sca-java-1.3/modules/contribution-osgi/src/main/java/org/apache/tuscany/sca/contribution/osgi/impl/OSGiClassReferenceModelResolver.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.tuscany.sca.contribution.osgi.impl; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.tuscany.sca.contribution.Contribution; -import org.apache.tuscany.sca.contribution.Import; -import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint; -import org.apache.tuscany.sca.contribution.resolver.ClassReference; -import org.apache.tuscany.sca.contribution.resolver.ModelResolver; -import org.apache.tuscany.sca.osgi.runtime.OSGiRuntime; -import org.osgi.framework.Bundle; - -/** - * A Model Resolver for ClassReferences. - * - * @version $Rev$ $Date$ - */ -public class OSGiClassReferenceModelResolver implements ModelResolver { - private Contribution contribution; - private Map<String, ClassReference> map = new HashMap<String, ClassReference>(); - private Bundle bundle; - private boolean initialized; - private boolean useOSGi; - - public OSGiClassReferenceModelResolver(Contribution contribution, ModelFactoryExtensionPoint modelFactories) { - this.contribution = contribution; - } - - public void addModel(Object resolved) { - ClassReference clazz = (ClassReference)resolved; - map.put(clazz.getClassName(), clazz); - } - - public Object removeModel(Object resolved) { - return map.remove(((ClassReference)resolved).getClassName()); - } - - /** - * Handle artifact resolution when the specific class reference is imported from another contribution - * @param unresolved - * @return - */ - private ClassReference resolveImportedModel(ClassReference unresolved) { - ClassReference resolved = unresolved; - - if (this.contribution != null) { - for (Import import_ : this.contribution.getImports()) { - - if (resolved == unresolved && bundle != null) { - resolved = import_.getModelResolver().resolveModel(ClassReference.class, unresolved); - if (resolved != unresolved) - break; - } - } - - } - return resolved; - } - - public <T> T resolveModel(Class<T> modelClass, T unresolved) { - Object resolved = map.get(unresolved); - - if (resolved != null) { - return modelClass.cast(resolved); - } - initialize(); - if (!useOSGi) - return unresolved; - - //Load a class on demand - Class clazz = null; - if (bundle != null) { - try { - clazz = bundle.loadClass(((ClassReference)unresolved).getClassName()); - } catch (Exception e) { - // we will later try to delegate to imported model resolvers - } - } - - if (clazz != null) { - //if we load the class - // Store a new ClassReference wrapping the loaded class - ClassReference classReference = new ClassReference(clazz); - map.put(getPackageName(classReference), classReference); - - // Return the resolved ClassReference - return modelClass.cast(classReference); - } else { - //delegate resolution of the class - resolved = this.resolveImportedModel((ClassReference)unresolved); - return modelClass.cast(resolved); - } - - } - - /*************** - * Helper methods - ***************/ - - private String getPackageName(ClassReference clazz) { - int pos = clazz.getClassName().lastIndexOf("."); - return clazz.getClassName().substring(0, pos - 1); - } - - private void initialize() { - if (initialized) - return; - - initialized = true; - try { - bundle = OSGiRuntime.findInstalledBundle(contribution.getLocation()); - useOSGi = bundle != null; - } catch (Throwable e) { - // Ignore errors, default to ClassReferenceModelResolver - } - } -} diff --git a/branches/sca-java-1.3/modules/contribution-osgi/src/main/java/org/apache/tuscany/sca/contribution/osgi/impl/OSGiImportExportListener.java b/branches/sca-java-1.3/modules/contribution-osgi/src/main/java/org/apache/tuscany/sca/contribution/osgi/impl/OSGiImportExportListener.java deleted file mode 100644 index 15ad0bd948..0000000000 --- a/branches/sca-java-1.3/modules/contribution-osgi/src/main/java/org/apache/tuscany/sca/contribution/osgi/impl/OSGiImportExportListener.java +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.tuscany.sca.contribution.osgi.impl; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; -import java.net.URL; -import java.util.HashSet; -import java.util.jar.JarOutputStream; -import java.util.jar.Manifest; -import java.util.zip.ZipEntry; - -import org.apache.tuscany.sca.contribution.Contribution; -import org.apache.tuscany.sca.contribution.Export; -import org.apache.tuscany.sca.contribution.Import; -import org.apache.tuscany.sca.contribution.java.JavaExport; -import org.apache.tuscany.sca.contribution.java.JavaImport; -import org.apache.tuscany.sca.contribution.service.ContributionListener; -import org.apache.tuscany.sca.contribution.service.ContributionRepository; -import org.apache.tuscany.sca.osgi.runtime.OSGiRuntime; - -/** - * Namespace Import/Export contribution listener - * The listener would process all import/export from a given contribution - * and initialize the model resolvers properly - * - * @version $Rev$ $Date$ - */ -public class OSGiImportExportListener implements ContributionListener { - - private OSGiBundleProcessor bundleProcessor; - - public OSGiImportExportListener() { - bundleProcessor = new OSGiBundleProcessor(); - } - - /** - * Initialize the import/export model resolvers - * Export model resolvers are same as Contribution model resolver - * Import model resolvers are matched to a specific contribution if a location URI is specified, - * otherwise it try to resolve against all the other contributions - */ - public void contributionAdded(ContributionRepository repository, Contribution contribution) { - - OSGiRuntime osgiRuntime = null; - try { - if (bundleProcessor.installContributionBundle(contribution) == null) { - return; - } else { - osgiRuntime = OSGiRuntime.getRuntime(); - } - } catch (Exception e) { - return; - } - - HashSet<Contribution> bundlesToInstall = new HashSet<Contribution>(); - // Initialize the contribution imports - for (Import import_ : contribution.getImports()) { - boolean initialized = false; - - if (import_ instanceof JavaImport) { - JavaImport javaImport = (JavaImport)import_; - String packageName = javaImport.getPackage(); - - //Find a matching contribution - if (javaImport.getLocation() != null) { - Contribution targetContribution = repository.getContribution(javaImport.getLocation()); - if (targetContribution != null) { - - // Find a matching contribution export - for (Export export : targetContribution.getExports()) { - if (export instanceof JavaExport) { - JavaExport javaExport = (JavaExport)export; - if (packageName.equals(javaExport.getPackage())) { - - if (osgiRuntime.findBundle(targetContribution.getLocation()) == null) - bundlesToInstall.add(targetContribution); - - initialized = true; - - } - } - if (initialized) - break; - } - } - } - } - if (!initialized) { - for (Contribution c : repository.getContributions()) { - - // Go over all exports in the contribution - for (Export export : c.getExports()) { - // If the export matches our namespace, try to the resolve the model object - if (import_.match(export) && osgiRuntime.findBundle(c.getLocation()) == null) { - bundlesToInstall.add(c); - } - } - } - } - } - for (Contribution c : bundlesToInstall) { - try { - installDummyBundle(osgiRuntime, c); - } catch (Exception e) { - } - } - - } - - public void contributionRemoved(ContributionRepository repository, Contribution contribution) { - - } - - public void contributionUpdated(ContributionRepository repository, - Contribution oldContribution, - Contribution contribution) { - - } - - private void installDummyBundle(OSGiRuntime osgiRuntime, Contribution contribution) throws Exception { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - - String EOL = System.getProperty("line.separator"); - - String bundleName = contribution.getURI(); - URL contribURL = new URL(contribution.getLocation()); - String contribName = contribURL.getPath(); - if (contribName.endsWith("/")) - contribName = contribName.substring(0, contribName.length()-1); - if (contribName.lastIndexOf("/") >= 0) - contribName = contribName.substring(contribName.lastIndexOf("/")+1); - - StringBuffer exportPackageNames = new StringBuffer(); - for (Export export : contribution.getExports()) { - if (export instanceof JavaExport) { - if (exportPackageNames.length() > 0) - exportPackageNames.append(","); - exportPackageNames.append(((JavaExport)export).getPackage()); - } - } - StringBuffer importPackageNames = new StringBuffer(); - for (Import import_ : contribution.getImports()) { - if (import_ instanceof JavaImport) { - if (importPackageNames.length() > 0) - importPackageNames.append(","); - importPackageNames.append(((JavaImport)import_).getPackage()); - } - } - - String manifestStr = - "Manifest-Version: 1.0" + EOL - + "Bundle-ManifestVersion: 2" - + EOL - + "Bundle-Name: " - + bundleName - + EOL - + "Bundle-SymbolicName: " - + bundleName - + EOL - + "Bundle-Version: " - + "1.0.0" - + EOL - + "Bundle-Localization: plugin" - + EOL; - - StringBuilder manifestBuf = new StringBuilder(); - manifestBuf.append(manifestStr); - manifestBuf.append("Export-Package: " + exportPackageNames + EOL); - manifestBuf.append("Import-Package: " + importPackageNames + EOL); - manifestBuf.append("Bundle-ClassPath: .," + contribName + EOL); - - ByteArrayInputStream manifestStream = new ByteArrayInputStream(manifestBuf.toString().getBytes()); - Manifest manifest = new Manifest(); - manifest.read(manifestStream); - - JarOutputStream jarOut = new JarOutputStream(out, manifest); - - ZipEntry ze = new ZipEntry(contribName); - jarOut.putNextEntry(ze); - InputStream stream = contribURL.openStream(); - - byte[] bytes = new byte[stream.available()]; - stream.read(bytes); - jarOut.write(bytes); - stream.close(); - - jarOut.close(); - out.close(); - - ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); - - osgiRuntime.installBundle("file://" + bundleName + ".jar", in); - - } - -} diff --git a/branches/sca-java-1.3/modules/contribution-osgi/src/main/java/org/apache/tuscany/sca/contribution/osgi/impl/OSGiModelResolverImpl.java b/branches/sca-java-1.3/modules/contribution-osgi/src/main/java/org/apache/tuscany/sca/contribution/osgi/impl/OSGiModelResolverImpl.java deleted file mode 100644 index e624b1d3b5..0000000000 --- a/branches/sca-java-1.3/modules/contribution-osgi/src/main/java/org/apache/tuscany/sca/contribution/osgi/impl/OSGiModelResolverImpl.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.tuscany.sca.contribution.osgi.impl; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.Map; - -import org.apache.tuscany.sca.contribution.osgi.BundleReference; -import org.apache.tuscany.sca.contribution.resolver.ClassReference; -import org.apache.tuscany.sca.contribution.resolver.ModelResolver; -import org.osgi.framework.Bundle; - -/** - * An implementation of an artifact resolver for OSGi bundles. - * - * @version $Rev$ $Date$ - */ -public class OSGiModelResolverImpl implements ModelResolver { - private static final long serialVersionUID = -7826976465762296634L; - - private Map<Object, Object> map = new HashMap<Object, Object>(); - - private Hashtable<String, Bundle> bundles; - public OSGiModelResolverImpl(Hashtable<String, Bundle> bundles) { - this.bundles = bundles; - } - - - public <T> T resolveModel(Class<T> modelClass, T unresolved) { - Object resolved = map.get(unresolved); - if (resolved != null) { - - // Return the resolved object - return modelClass.cast(resolved); - - } else if (unresolved instanceof ClassReference) { - - // Load a class on demand - ClassReference classReference = (ClassReference)unresolved; - Class clazz = null; - for (Bundle bundle : bundles.values()) { - try { - clazz = bundle.loadClass(classReference.getClassName()); - } catch (ClassNotFoundException e) { - continue; - } - break; - } - if (clazz == null) { - - // Return the unresolved object - return unresolved; - } - - // Store a new ClassReference wrapping the loaded class - resolved = new ClassReference(clazz); - map.put(resolved, resolved); - - // Return the resolved ClassReference - return modelClass.cast(resolved); - - } else if (unresolved instanceof BundleReference) { - for (String bundlePath: bundles.keySet()) { - Bundle bundle = bundles.get(bundlePath); - BundleReference bundleRef = (BundleReference)unresolved; - String bundleVersion = (String)bundle.getHeaders().get("Bundle-Version"); - if (bundle.getSymbolicName().equals(bundleRef.getBundleName())&& - (bundleVersion == null || bundleRef.getBundleVersion() == null || - bundleVersion.equals(bundleRef.getBundleVersion()))) { - - resolved = new BundleReference(bundle, - bundle.getSymbolicName(), - bundleVersion, - bundlePath); - map.put(resolved, resolved); - - // Return the resolved BundleReference - return modelClass.cast(resolved); - - } - } - } - - // Return the unresolved object - return unresolved; - } - - public void addModel(Object resolved) { - map.put(resolved, resolved); - } - - public Object removeModel(Object resolved) { - return map.remove(resolved); - } - - public Collection<Object> getModels() { - return map.values(); - } - -} |