You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by xu...@apache.org on 2011/01/21 06:10:17 UTC
svn commit: r1061636 - in /geronimo/server/trunk:
framework/modules/geronimo-common/src/main/java/org/apache/geronimo/common/
framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/
framework/modules/geronimo-deployment/src/...
Author: xuhaihong
Date: Fri Jan 21 05:10:17 2011
New Revision: 1061636
URL: http://svn.apache.org/viewvc?rev=1061636&view=rev
Log:
GERONIMO-5680 Remove dynamic import * and use calculated import packages on the runtime, only for deployed applications now
Added:
geronimo/server/trunk/framework/modules/geronimo-common/src/main/java/org/apache/geronimo/common/IllegalConfigurationException.java
geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/
geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/DummyExportPackagesSelector.java
geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/ExportPackagesSelector.java
geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/HighVersionFirstExportPackagesSelector.java
geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/OSGiBuildContext.java
geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/OSGiMetaDataBuilder.java
geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/ParentFirstExportPackagesSelector.java
Modified:
geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeploymentContext.java
geronimo/server/trunk/framework/modules/geronimo-deployment/src/test/java/org/apache/geronimo/deployment/SingleFileHotDeployerTest.java
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/AbstractRepository.java
geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/Environment.java
geronimo/server/trunk/framework/modules/geronimo-system/src/main/java/org/apache/geronimo/system/configuration/DependencyManager.java
geronimo/server/trunk/plugins/client/client/src/main/history/dependencies.xml
geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/test/java/org/apache/geronimo/connector/deployment/ConnectorModuleBuilderTest.java
geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilderTestSupport.java
geronimo/server/trunk/plugins/j2ee/j2ee-deployer/src/main/history/dependencies.xml
geronimo/server/trunk/plugins/openejb/openejb/src/main/history/dependencies.xml
Added: geronimo/server/trunk/framework/modules/geronimo-common/src/main/java/org/apache/geronimo/common/IllegalConfigurationException.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-common/src/main/java/org/apache/geronimo/common/IllegalConfigurationException.java?rev=1061636&view=auto
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-common/src/main/java/org/apache/geronimo/common/IllegalConfigurationException.java (added)
+++ geronimo/server/trunk/framework/modules/geronimo-common/src/main/java/org/apache/geronimo/common/IllegalConfigurationException.java Fri Jan 21 05:10:17 2011
@@ -0,0 +1,36 @@
+/**
+ * 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.geronimo.common;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class IllegalConfigurationException extends Exception {
+
+ public IllegalConfigurationException(String message) {
+ super(message);
+ }
+
+ public IllegalConfigurationException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public IllegalConfigurationException(Throwable cause) {
+ super(cause);
+ }
+}
Modified: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeploymentContext.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeploymentContext.java?rev=1061636&r1=1061635&r2=1061636&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeploymentContext.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/DeploymentContext.java Fri Jan 21 05:10:17 2011
@@ -43,6 +43,9 @@ import javax.xml.bind.JAXBException;
import javax.xml.stream.XMLStreamException;
import org.apache.geronimo.common.DeploymentException;
+import org.apache.geronimo.common.IllegalConfigurationException;
+import org.apache.geronimo.deployment.util.osgi.DummyExportPackagesSelector;
+import org.apache.geronimo.deployment.util.osgi.OSGiMetaDataBuilder;
import org.apache.geronimo.gbean.AbstractName;
import org.apache.geronimo.gbean.AbstractNameQuery;
import org.apache.geronimo.gbean.GAttributeInfo;
@@ -237,7 +240,7 @@ public class DeploymentContext {
env.addToBundleClassPath(bundleClassPath);
env.setBundleActivator(null);
env.addDynamicImportPackage("*");
-
+
Manifest manifest;
try {
manifest = env.getManifest();
@@ -543,13 +546,26 @@ public class DeploymentContext {
environment.setBundleActivator(ConfigurationActivator.class.getName());
}
List<GBeanData> gbeans = new ArrayList<GBeanData>(configuration.getGBeans().values());
- Collections.sort(gbeans, new GBeanData.PriorityComparator());
- LinkedHashSet<String> imports = getImports(gbeans);
- addImport(imports, environment.getBundleActivator());
- environment.addImportPackages(imports);
+ Collections.sort(gbeans, new GBeanData.PriorityComparator());
+
+ OSGiMetaDataBuilder osgiMetaDataBuilder = null;
+ //TODO Import package calculation is only used for deployed applications, should be use the same way for car package later
+ if (System.getProperty("geronimo.build.car") == null) {
+ osgiMetaDataBuilder = new OSGiMetaDataBuilder(bundleContext);
+ } else {
+ LinkedHashSet<String> imports = getImports(gbeans);
+ addImport(imports, environment.getBundleActivator());
+ environment.addImportPackages(imports);
+ environment.addDynamicImportPackage("*");
+ osgiMetaDataBuilder = new OSGiMetaDataBuilder(bundleContext, new DummyExportPackagesSelector());
+ }
+
+ try {
+ osgiMetaDataBuilder.build(environment);
+ } catch (IllegalConfigurationException e) {
+ throw new DeploymentException(e);
+ }
- environment.addDynamicImportPackage("*");
-
if (tempBundle != null) {
try {
createPluginMetadata();
Added: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/DummyExportPackagesSelector.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/DummyExportPackagesSelector.java?rev=1061636&view=auto
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/DummyExportPackagesSelector.java (added)
+++ geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/DummyExportPackagesSelector.java Fri Jan 21 05:10:17 2011
@@ -0,0 +1,36 @@
+/**
+ * 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.geronimo.deployment.util.osgi;
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.xbean.osgi.bundle.util.BundleDescription.ExportPackage;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class DummyExportPackagesSelector implements ExportPackagesSelector {
+
+ @Override
+ public Map<Long, Set<ExportPackage>> select(OSGiBuildContext selectContext) {
+ return Collections.<Long, Set<ExportPackage>>emptyMap();
+ }
+
+}
Added: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/ExportPackagesSelector.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/ExportPackagesSelector.java?rev=1061636&view=auto
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/ExportPackagesSelector.java (added)
+++ geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/ExportPackagesSelector.java Fri Jan 21 05:10:17 2011
@@ -0,0 +1,31 @@
+/**
+ * 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.geronimo.deployment.util.osgi;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.xbean.osgi.bundle.util.BundleDescription.ExportPackage;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public interface ExportPackagesSelector {
+
+ public Map<Long,Set<ExportPackage>> select(OSGiBuildContext selectContext);
+}
Added: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/HighVersionFirstExportPackagesSelector.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/HighVersionFirstExportPackagesSelector.java?rev=1061636&view=auto
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/HighVersionFirstExportPackagesSelector.java (added)
+++ geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/HighVersionFirstExportPackagesSelector.java Fri Jan 21 05:10:17 2011
@@ -0,0 +1,99 @@
+/**
+ * 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.geronimo.deployment.util.osgi;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.apache.geronimo.kernel.repository.Dependency;
+import org.apache.geronimo.system.configuration.DependencyManager;
+import org.apache.xbean.osgi.bundle.util.BundleDescription.ExportPackage;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Version;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class HighVersionFirstExportPackagesSelector implements ExportPackagesSelector {
+
+ private static final Logger logger = LoggerFactory.getLogger(HighVersionFirstExportPackagesSelector.class);
+
+ @Override
+ public Map<Long, Set<ExportPackage>> select(OSGiBuildContext context) {
+ Map<Long, Set<ExportPackage>> bundleIdExportPackages = new HashMap<Long, Set<ExportPackage>>();
+ Map<String, Version> packageNameVersionMap = new HashMap<String, Version>();
+ DependencyManager dependencyManager = context.getDependencyManager();
+ for (Dependency dependency : context.getEnvironment().getDependencies()) {
+ Bundle dependentBundle = dependencyManager.getBundle(dependency.getArtifact());
+ if (dependentBundle == null) {
+ logger.warn("Fail to resolve the bundle corresponding to the artifact " + dependency.getArtifact() + ", its export packages are ignored");
+ continue;
+ }
+ Set<ExportPackage> exportPackages = context.getEffectExportPackages(dependentBundle.getBundleId());
+ if (exportPackages.size() > 0) {
+ bundleIdExportPackages.put(dependentBundle.getBundleId(), exportPackages);
+ recordHighestPackageVersion(packageNameVersionMap, exportPackages);
+ }
+ for (Long parentDependentBundleId : dependencyManager.getFullDependentBundleIds(dependentBundle)) {
+ if (!bundleIdExportPackages.containsKey(parentDependentBundleId)) {
+ Set<ExportPackage> parentExportPackages = context.getEffectExportPackages(parentDependentBundleId);
+ if (parentExportPackages.size() > 0) {
+ bundleIdExportPackages.put(parentDependentBundleId, parentExportPackages);
+ recordHighestPackageVersion(packageNameVersionMap, parentExportPackages);
+ }
+ }
+ }
+ }
+
+ //Add framework bundle export packages
+ Set<ExportPackage> systemExportPackages = context.getEffectExportPackages(0L);
+ bundleIdExportPackages.put(0L, systemExportPackages);
+ recordHighestPackageVersion(packageNameVersionMap, systemExportPackages);
+
+ for (Iterator<Entry<Long, Set<ExportPackage>>> entryIt = bundleIdExportPackages.entrySet().iterator(); entryIt.hasNext();) {
+ Entry<Long, Set<ExportPackage>> entry = entryIt.next();
+ for (Iterator<ExportPackage> it = entry.getValue().iterator(); it.hasNext();) {
+ ExportPackage exportPackage = it.next();
+ Version highestVersion = packageNameVersionMap.get(exportPackage.getName());
+ //Use != operator should be enough
+ if (highestVersion != exportPackage.getVersion()) {
+ it.remove();
+ }
+ }
+ if (entry.getValue().size() == 0) {
+ entryIt.remove();
+ }
+ }
+ packageNameVersionMap.clear();
+ return bundleIdExportPackages;
+ }
+
+ private void recordHighestPackageVersion(Map<String, Version> packageNameVersionMap, Set<ExportPackage> exportPackages) {
+ for (ExportPackage exportPackage : exportPackages) {
+ Version existedVersion = packageNameVersionMap.get(exportPackage.getName());
+ if (existedVersion == null || exportPackage.getVersion().compareTo(existedVersion) > 0) {
+ packageNameVersionMap.put(exportPackage.getName(), exportPackage.getVersion());
+ }
+ }
+ }
+}
Added: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/OSGiBuildContext.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/OSGiBuildContext.java?rev=1061636&view=auto
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/OSGiBuildContext.java (added)
+++ geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/OSGiBuildContext.java Fri Jan 21 05:10:17 2011
@@ -0,0 +1,100 @@
+/**
+ * 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.geronimo.deployment.util.osgi;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.geronimo.kernel.repository.Environment;
+import org.apache.geronimo.system.configuration.DependencyManager;
+import org.apache.xbean.osgi.bundle.util.BundleDescription.ExportPackage;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class OSGiBuildContext {
+
+ private List<String> hiddenImportPackageNamePrefixes;
+
+ private Set<String> hiddenImportPackageNames;
+
+ private DependencyManager dependencyManager;
+
+ private Environment environment;
+
+ private boolean inverseClassLoading;
+
+ public OSGiBuildContext(Environment environment, List<String> hiddenImportPackageNamePrefixes, Set<String> hiddenImportPackageNames, DependencyManager dependencyManager,
+ boolean inverseClassLoading) {
+ this.hiddenImportPackageNamePrefixes = hiddenImportPackageNamePrefixes;
+ this.hiddenImportPackageNames = hiddenImportPackageNames;
+ this.dependencyManager = dependencyManager;
+ this.environment = environment;
+ this.inverseClassLoading = inverseClassLoading;
+ }
+
+ private Map<String, Object> mergeAttributes = new HashMap<String, Object>();
+
+ public Object getAttribute(String name) {
+ return mergeAttributes.get(name);
+ }
+
+ public void setAttribute(String name, Object value) {
+ mergeAttributes.put(name, value);
+ }
+
+ public boolean isInverseClassLoading() {
+ return inverseClassLoading;
+ }
+
+ public boolean isHiddenExportPackage(ExportPackage exportPackage) {
+ String packageName = exportPackage.getName();
+ if (hiddenImportPackageNames.contains(packageName)) {
+ return true;
+ }
+ for (String hiddenImportPackageNamePrefix : hiddenImportPackageNamePrefixes) {
+ if (packageName.startsWith(hiddenImportPackageNamePrefix)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public DependencyManager getDependencyManager() {
+ return dependencyManager;
+ }
+
+ public Environment getEnvironment() {
+ return environment;
+ }
+
+ public Set<ExportPackage> getEffectExportPackages(Long bundleId) {
+ Set<ExportPackage> exportPackages = new HashSet<ExportPackage>(dependencyManager.getExportedPackages(bundleId));
+ for (Iterator<ExportPackage> it = exportPackages.iterator(); it.hasNext();) {
+ ExportPackage exportPackage = it.next();
+ if (isHiddenExportPackage(exportPackage)) {
+ it.remove();
+ }
+ }
+ return exportPackages;
+ }
+}
Added: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/OSGiMetaDataBuilder.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/OSGiMetaDataBuilder.java?rev=1061636&view=auto
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/OSGiMetaDataBuilder.java (added)
+++ geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/OSGiMetaDataBuilder.java Fri Jan 21 05:10:17 2011
@@ -0,0 +1,162 @@
+/**
+ * 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.geronimo.deployment.util.osgi;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.geronimo.common.IllegalConfigurationException;
+import org.apache.geronimo.kernel.repository.Environment;
+import org.apache.geronimo.system.configuration.DependencyManager;
+import org.apache.xbean.osgi.bundle.util.BundleDescription.ExportPackage;
+import org.apache.xbean.osgi.bundle.util.HeaderParser;
+import org.apache.xbean.osgi.bundle.util.HeaderParser.HeaderElement;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Version;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class OSGiMetaDataBuilder {
+
+ private static final Version ZERO_VERSION = new Version(0, 0, 0);
+
+ private BundleContext bundleContext;
+
+ private ExportPackagesSelector exportPackagesSelector;
+
+ public OSGiMetaDataBuilder(BundleContext bundleContext) {
+ this.bundleContext = bundleContext;
+ this.exportPackagesSelector = new HighVersionFirstExportPackagesSelector();
+ }
+
+ public OSGiMetaDataBuilder(BundleContext bundleContext, ExportPackagesSelector exportPackagesSelector) {
+ this.bundleContext = bundleContext;
+ this.exportPackagesSelector = exportPackagesSelector;
+ }
+
+ public void build(Environment environment) throws IllegalConfigurationException {
+ processClassloadingRules(environment);
+ ServiceReference serviceReference = null;
+ try {
+ serviceReference = bundleContext.getServiceReference(DependencyManager.class.getName());
+ DependencyManager dependencyManager = null;
+ if (serviceReference != null) {
+ dependencyManager = (DependencyManager) bundleContext.getService(serviceReference);
+ }
+ OSGiBuildContext context = createOSGiBuildContext(environment, dependencyManager);
+ processImportPackages(context);
+ } finally {
+ if (serviceReference != null) {
+ bundleContext.ungetService(serviceReference);
+ }
+ }
+ }
+
+ protected void processClassloadingRules(Environment environment) {
+ //Process Hidden Class
+ for (String hiddenClassPrefix : environment.getClassLoadingRules().getHiddenRule().getClassPrefixes()) {
+ environment.addImportPackage("!" + hiddenClassPrefix);
+ }
+ //Non-Overridable-Classes
+ /*for (String hiddenClassPrefix : environment.getClassLoadingRules().getHiddenRule().getClassPrefixes()) {
+ environment.getImportPackages().add(hiddenClassPrefix);
+ }*/
+ }
+
+ protected OSGiBuildContext createOSGiBuildContext(Environment environment, DependencyManager dependencyManager) throws IllegalConfigurationException {
+ List<String> hiddenImportPackageNamePrefixes = new ArrayList<String>();
+ Set<String> hiddenImportPackageNames = new HashSet<String>();
+
+ Set<String> removedImportPackages = new HashSet<String>();
+ for (String initialImportPackageName : environment.getImportPackages()) {
+ String importPackageName = initialImportPackageName.trim();
+ if (importPackageName.length() == 0) {
+ removedImportPackages.add(initialImportPackageName);
+ continue;
+ }
+ if (importPackageName.startsWith("!")) {
+ importPackageName = importPackageName.substring(1);
+ if (importPackageName.endsWith("*")) {
+ hiddenImportPackageNamePrefixes.add(importPackageName.substring(0, importPackageName.length() - 1));
+ } else {
+ hiddenImportPackageNames.add(importPackageName);
+ }
+ removedImportPackages.add(initialImportPackageName);
+ } else {
+ if (importPackageName.endsWith("*")) {
+ throw new IllegalConfigurationException("wildchar * could not be used in the import-package " + importPackageName + " without ! prefix");
+ }
+ //If the users configured import packages, those will take the highest precedence.
+ List<HeaderElement> elements = HeaderParser.parseHeader(importPackageName);
+ for (HeaderElement headerElement : elements) {
+ hiddenImportPackageNames.add(headerElement.getName());
+ }
+ }
+ }
+ environment.removeImportPackages(removedImportPackages);
+
+ Set<String> removedDynamicImportPackages = new HashSet<String>();
+ for (String initialDynamicImportPackageName : environment.getDynamicImportPackages()) {
+ String dynamicImportPackageName = initialDynamicImportPackageName.trim();
+ if (dynamicImportPackageName.length() == 0) {
+ removedDynamicImportPackages.add(initialDynamicImportPackageName);
+ continue;
+ }
+ if (dynamicImportPackageName.startsWith("!")) {
+ throw new IllegalConfigurationException("DynamicImport-Package " + dynamicImportPackageName + " could not configured with ! prefix");
+ } else {
+ List<HeaderElement> elements = HeaderParser.parseHeader(dynamicImportPackageName);
+ for (HeaderElement headerElement : elements) {
+ hiddenImportPackageNames.add(headerElement.getName());
+ }
+ }
+ }
+ environment.removeDynamicImportPackages(removedDynamicImportPackages);
+
+ return new OSGiBuildContext(environment, hiddenImportPackageNamePrefixes, hiddenImportPackageNames, dependencyManager, environment.getClassLoadingRules().isInverseClassLoading());
+ }
+
+ protected void processImportPackages(OSGiBuildContext context) {
+ Environment environment = context.getEnvironment();
+ Map<Long, Set<ExportPackage>> selectedExportPackages = exportPackagesSelector.select(context);
+ for (Map.Entry<Long, Set<ExportPackage>> entry : selectedExportPackages.entrySet()) {
+ if (context.isInverseClassLoading()) {
+ for (ExportPackage exportPackage : entry.getValue()) {
+ String importPackageName = toImportPackageName(exportPackage);
+ environment.addDynamicImportPackage(importPackageName);
+ }
+ } else {
+ for (ExportPackage exportPackage : entry.getValue()) {
+ String importPackageName = toImportPackageName(exportPackage);
+ environment.addImportPackage(importPackageName);
+ }
+ }
+ }
+ selectedExportPackages.clear();
+ }
+
+ protected String toImportPackageName(ExportPackage exportPackage) {
+ //TODO If mandatory attribute exists, do we need to handle it ?
+ return exportPackage.getVersion().equals(ZERO_VERSION) ? exportPackage.getName() : exportPackage.getName() + ";version=" + exportPackage.getVersion();
+ }
+}
Added: geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/ParentFirstExportPackagesSelector.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/ParentFirstExportPackagesSelector.java?rev=1061636&view=auto
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/ParentFirstExportPackagesSelector.java (added)
+++ geronimo/server/trunk/framework/modules/geronimo-deployment/src/main/java/org/apache/geronimo/deployment/util/osgi/ParentFirstExportPackagesSelector.java Fri Jan 21 05:10:17 2011
@@ -0,0 +1,36 @@
+/**
+ * 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.geronimo.deployment.util.osgi;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.xbean.osgi.bundle.util.BundleDescription.ExportPackage;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ParentFirstExportPackagesSelector implements ExportPackagesSelector {
+
+ @Override
+ public Map<Long,Set<ExportPackage>> select(OSGiBuildContext context) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
Modified: geronimo/server/trunk/framework/modules/geronimo-deployment/src/test/java/org/apache/geronimo/deployment/SingleFileHotDeployerTest.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-deployment/src/test/java/org/apache/geronimo/deployment/SingleFileHotDeployerTest.java?rev=1061636&r1=1061635&r2=1061636&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-deployment/src/test/java/org/apache/geronimo/deployment/SingleFileHotDeployerTest.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-deployment/src/test/java/org/apache/geronimo/deployment/SingleFileHotDeployerTest.java Fri Jan 21 05:10:17 2011
@@ -21,8 +21,10 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.Hashtable;
import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Set;
import java.util.jar.JarFile;
import org.apache.geronimo.common.DeploymentException;
@@ -44,7 +46,11 @@ import org.apache.geronimo.kernel.reposi
import org.apache.geronimo.kernel.repository.DefaultArtifactResolver;
import org.apache.geronimo.kernel.repository.Environment;
import org.apache.geronimo.kernel.repository.Repository;
+import org.apache.geronimo.system.configuration.DependencyManager;
import org.apache.geronimo.testsupport.TestSupport;
+import org.apache.xbean.osgi.bundle.util.BundleDescription.ExportPackage;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
/**
@@ -90,6 +96,7 @@ public class SingleFileHotDeployerTest e
}
bundleContext = new MockBundleContext(getClass().getClassLoader(), BASEDIR.getAbsolutePath(), null, Collections.singletonMap(baseLocation, NEW_ID));
((MockBundleContext)bundleContext).setConfigurationManager(new MockConfigurationManager());
+ bundleContext.registerService(DependencyManager.class.getName(), new MockDependencyManager(bundleContext, Collections.<Repository> emptyList(), null), new Hashtable());
File someFile = new File(dir, "someFile");
someFile.createNewFile();
@@ -106,7 +113,7 @@ public class SingleFileHotDeployerTest e
}
protected void tearDown() throws Exception {
- store.cleanup();
+ store.cleanup();
super.tearDown();
}
@@ -327,6 +334,29 @@ public class SingleFileHotDeployerTest e
}
*/
+ private class MockDependencyManager extends DependencyManager {
+
+ public MockDependencyManager(BundleContext bundleContext, Collection<Repository> repositories, ArtifactResolver artifactResolver) {
+ super(bundleContext, repositories, artifactResolver);
+ }
+
+ @Override
+ public synchronized Set<ExportPackage> getExportedPackages(Bundle bundle) {
+ return Collections.<ExportPackage>emptySet();
+ }
+
+ @Override
+ public List<Bundle> getDependentBundles(Bundle bundle) {
+ return Collections.<Bundle>emptyList();
+ }
+
+ @Override
+ public Bundle getBundle(Artifact artifact) {
+ return null;
+ }
+
+ }
+
private class MockConfigurationManager extends org.apache.geronimo.kernel.mock.MockConfigurationManager {
private ConfigurationData loadedConfigurationData;
Modified: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/AbstractRepository.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/AbstractRepository.java?rev=1061636&r1=1061635&r2=1061636&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/AbstractRepository.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/AbstractRepository.java Fri Jan 21 05:10:17 2011
@@ -125,9 +125,13 @@ public abstract class AbstractRepository
ArtifactTypeHandler typeHandler = typeHandlers.get(destination.getType());
if (typeHandler == null) typeHandler = DEFAULT_TYPE_HANDLER;
typeHandler.install(source, size, destination, monitor, location);
-
+
if (destination.getType().equalsIgnoreCase("car")) {
log.debug("Installed module configuration; id={}; location={}", destination, location);
}
}
+
+ public File getRootFile() {
+ return rootFile;
+ }
}
Modified: geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/Environment.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/Environment.java?rev=1061636&r1=1061635&r2=1061636&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/Environment.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/repository/Environment.java Fri Jan 21 05:10:17 2011
@@ -126,6 +126,14 @@ public class Environment implements Seri
this.bundleClassPath.add(bundleClassPath);
}
+ public void removeBundleClassPath(Collection<String> bundleClassPath) {
+ this.bundleClassPath.removeAll(bundleClassPath);
+ }
+
+ public void removeBundleClassPath(String bundleClassPath) {
+ this.bundleClassPath.remove(bundleClassPath);
+ }
+
public List<String> getBundleClassPath() {
return Collections.unmodifiableList(new ArrayList<String>(bundleClassPath));
}
@@ -150,6 +158,14 @@ public class Environment implements Seri
this.exports.add(exports);
}
+ public void removeExportPackages(Collection<String> exports) {
+ this.exports.removeAll(exports);
+ }
+
+ public void removeExportPackage(String exports) {
+ this.exports.remove(exports);
+ }
+
public List<String> getExportPackages() {
return Collections.unmodifiableList(new ArrayList<String>(exports));
}
@@ -170,6 +186,14 @@ public class Environment implements Seri
this.requireBundles.add(symbolicName);
}
+ public void removeRequireBundles(Collection<String> symbolicNames) {
+ this.requireBundles.removeAll(symbolicNames);
+ }
+
+ public void removeRequireBundle(String symbolicName) {
+ this.requireBundles.remove(symbolicName);
+ }
+
public List<String> getRequireBundles() {
return Collections.unmodifiableList(new ArrayList<String>(requireBundles));
}
@@ -182,10 +206,26 @@ public class Environment implements Seri
this.dynamicImports.add(imports);
}
+ public void removeDynamicImportPackages(Collection<String> imports) {
+ this.dynamicImports.removeAll(imports);
+ }
+
+ public void removeDynamicImportPackage(String imports) {
+ this.dynamicImports.remove(imports);
+ }
+
public List<String> getDynamicImportPackages() {
return Collections.unmodifiableList(new ArrayList<String>(dynamicImports));
}
-
+
+ public void removeImportPackage(String importPackage) {
+ this.imports.remove(importPackage);
+ }
+
+ public void removeImportPackages(Collection<String> importPackages) {
+ this.imports.removeAll(importPackages);
+ }
+
public Manifest getManifest() throws ManifestException {
Manifest manifest = new Manifest();
manifest.addConfiguredAttribute(new Manifest.Attribute(Constants.BUNDLE_MANIFESTVERSION, "2"));
@@ -204,11 +244,11 @@ public class Environment implements Seri
if (!imports.isEmpty()) {
manifest.addConfiguredAttribute(new Manifest.Attribute(Manifest.Attribute.Separator.COMMA, Constants.IMPORT_PACKAGE, imports));
}
-
+
if (!exports.isEmpty()) {
manifest.addConfiguredAttribute(new Manifest.Attribute(Manifest.Attribute.Separator.COMMA, Constants.EXPORT_PACKAGE, exports));
}
-
+
if (!dynamicImports.isEmpty()) {
manifest.addConfiguredAttribute(new Manifest.Attribute(Manifest.Attribute.Separator.COMMA, Constants.DYNAMICIMPORT_PACKAGE, dynamicImports));
}
Modified: geronimo/server/trunk/framework/modules/geronimo-system/src/main/java/org/apache/geronimo/system/configuration/DependencyManager.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-system/src/main/java/org/apache/geronimo/system/configuration/DependencyManager.java?rev=1061636&r1=1061635&r2=1061636&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-system/src/main/java/org/apache/geronimo/system/configuration/DependencyManager.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-system/src/main/java/org/apache/geronimo/system/configuration/DependencyManager.java Fri Jan 21 05:10:17 2011
@@ -19,6 +19,7 @@
package org.apache.geronimo.system.configuration;
+import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
@@ -41,6 +42,7 @@ import org.apache.geronimo.gbean.annotat
import org.apache.geronimo.gbean.annotation.SpecialAttributeType;
import org.apache.geronimo.kernel.config.InvalidConfigException;
import org.apache.geronimo.kernel.config.NoSuchConfigException;
+import org.apache.geronimo.kernel.repository.AbstractRepository;
import org.apache.geronimo.kernel.repository.Artifact;
import org.apache.geronimo.kernel.repository.ArtifactResolver;
import org.apache.geronimo.kernel.repository.MissingDependencyException;
@@ -69,34 +71,40 @@ import org.slf4j.LoggerFactory;
@GBean
@OsgiService
public class DependencyManager implements SynchronousBundleListener {
+
private static final Logger log = LoggerFactory.getLogger(DependencyManager.class);
private final BundleContext bundleContext;
+
private final Collection<Repository> repositories;
private final RepositoryAdmin repositoryAdmin;
private final ArtifactResolver artifactResolver;
- private final Map<Long, PluginArtifactType> pluginMap =
- Collections.synchronizedMap(new WeakHashMap<Long, PluginArtifactType>());
+ private final Map<Long, PluginArtifactType> pluginMap = Collections.synchronizedMap(new WeakHashMap<Long, PluginArtifactType>());
private final Map<Long, Set<Long>> dependentBundleIdsMap = new ConcurrentHashMap<Long, Set<Long>>();
- private final Map<Long, Set<ExportPackage>> bundleExportPackagesMap = new ConcurrentHashMap<Long, Set<ExportPackage>>();
+
+ private final Map<Long, Set<Long>> fullDependentBundleIdsMap = new ConcurrentHashMap<Long, Set<Long>>();
+
+ private final Map<Long, Set<ExportPackage>> bundleExportPackagesMap = new HashMap<Long, Set<ExportPackage>>();
+
private final Map<Artifact, Bundle> artifactBundleMap = new ConcurrentHashMap<Artifact, Bundle>();
+
public DependencyManager(@ParamSpecial(type = SpecialAttributeType.bundleContext) BundleContext bundleContext,
- @ParamReference(name = "Repositories", namingType = "Repository") Collection<Repository> repositories,
- @ParamReference(name="ArtifactResolver", namingType = "ArtifactResolver") ArtifactResolver artifactResolver) {
+ @ParamReference(name = "Repositories", namingType = "Repository") Collection<Repository> repositories,
+ @ParamReference(name = "ArtifactResolver", namingType = "ArtifactResolver") ArtifactResolver artifactResolver) {
this.bundleContext = bundleContext;
this.repositories = repositories;
this.artifactResolver = artifactResolver;
bundleContext.addBundleListener(this);
ServiceReference ref = bundleContext.getServiceReference(RepositoryAdmin.class.getName());
- repositoryAdmin = ref == null? null: (RepositoryAdmin) bundleContext.getService(ref);
+ repositoryAdmin = ref == null ? null : (RepositoryAdmin) bundleContext.getService(ref);
//init installed bundles
for (Bundle bundle : bundleContext.getBundles()) {
- addArtifactBundleEntry(bundle);
+ installed(bundle);
}
//Check the car who loads me ...
try {
@@ -118,7 +126,8 @@ public class DependencyManager implement
public void bundleChanged(BundleEvent bundleEvent) {
int eventType = bundleEvent.getType();
- if (eventType == BundleEvent.INSTALLED) {
+ //TODO Need to optimize the codes, as we will not receive the INSTALLED event after the cache is created
+ if (eventType == BundleEvent.INSTALLED || eventType == BundleEvent.RESOLVED) {
installed(bundleEvent.getBundle());
} else if (eventType == BundleEvent.STARTING) {
starting(bundleEvent.getBundle());
@@ -128,17 +137,23 @@ public class DependencyManager implement
}
public Set<ExportPackage> getExportedPackages(Bundle bundle) {
- Set<ExportPackage> exportPackages = bundleExportPackagesMap.get(bundle.getBundleId());
- if (exportPackages == null) {
- exportPackages = getExportPackagesInternal(bundle);
- bundleExportPackagesMap.put(bundle.getBundleId(), exportPackages);
+ return getExportedPackages(bundle.getBundleId());
+ }
+
+ public Set<ExportPackage> getExportedPackages(Long bundleId) {
+ synchronized (bundleExportPackagesMap) {
+ Set<ExportPackage> exportPackages = bundleExportPackagesMap.get(bundleId);
+ if (exportPackages == null) {
+ exportPackages = getExportPackagesInternal(bundleContext.getBundle(bundleId));
+ bundleExportPackagesMap.put(bundleId, exportPackages);
+ }
+ return exportPackages;
}
- return exportPackages;
}
public List<Bundle> getDependentBundles(Bundle bundle) {
- Set<Long> dependentBundleIds = dependentBundleIdsMap.get(bundle.getBundleId());
- if (dependentBundleIds == null || dependentBundleIds.size() == 0) {
+ Set<Long> dependentBundleIds = getDependentBundleIds(bundle);
+ if (dependentBundleIds.size() == 0) {
return Collections.<Bundle> emptyList();
}
List<Bundle> dependentBundles = new ArrayList<Bundle>(dependentBundleIds.size());
@@ -148,8 +163,38 @@ public class DependencyManager implement
return dependentBundles;
}
+ public Set<Long> getDependentBundleIds(Bundle bundle) {
+ Set<Long> dependentBundleIds = dependentBundleIdsMap.get(bundle.getBundleId());
+ return dependentBundleIds == null ? Collections.<Long> emptySet() : new HashSet<Long>(dependentBundleIds);
+ }
+
+ public List<Bundle> getFullDependentBundles(Bundle bundle) {
+ return getFullDependentBundles(bundle.getBundleId());
+ }
+
+ public List<Bundle> getFullDependentBundles(Long bundleId) {
+ Set<Long> fullDependentBundleIds = getFullDependentBundleIds(bundleId);
+ if (fullDependentBundleIds.size() == 0) {
+ return Collections.<Bundle> emptyList();
+ }
+ List<Bundle> dependentBundles = new ArrayList<Bundle>(fullDependentBundleIds.size());
+ for (Long dependentBundleId : fullDependentBundleIds) {
+ dependentBundles.add(bundleContext.getBundle(dependentBundleId));
+ }
+ return dependentBundles;
+ }
+
+ public Set<Long> getFullDependentBundleIds(Bundle bundle) {
+ return getFullDependentBundleIds(bundle.getBundleId());
+ }
+
+ public Set<Long> getFullDependentBundleIds(Long bundleId) {
+ Set<Long> fullDependentBundleIds = fullDependentBundleIdsMap.get(bundleId);
+ return fullDependentBundleIds == null ? Collections.<Long> emptySet() : new HashSet<Long>(fullDependentBundleIds);
+ }
+
public Bundle getBundle(Artifact artifact) {
- if(!artifact.isResolved()) {
+ if (!artifact.isResolved()) {
try {
if (artifactResolver != null) {
artifact = artifactResolver.resolveInClassLoader(artifact);
@@ -161,14 +206,41 @@ public class DependencyManager implement
}
public Artifact toArtifact(String installationLocation) {
- if (installationLocation == null || !installationLocation.startsWith("mvn:")) {
+ if (installationLocation == null) {
return null;
}
- String[] artifactFragments = installationLocation.substring(4).split("[/]");
- if(artifactFragments.length < 2) {
- return null;
+ if (installationLocation.startsWith("mvn:")) {
+ String[] artifactFragments = installationLocation.substring(4).split("[/]");
+ if (artifactFragments.length < 2) {
+ return null;
+ }
+ return new Artifact(artifactFragments[0], artifactFragments[1], artifactFragments.length > 2 ? artifactFragments[2] : "",
+ artifactFragments.length > 3 && artifactFragments[3].length() > 0 ? artifactFragments[3] : "jar");
+ } else if(installationLocation.startsWith("reference:file://")) {
+ //TODO a better way for this ???
+ installationLocation = installationLocation.substring("reference:file://".length());
+ for (Repository repo : repositories) {
+ if (repo instanceof AbstractRepository) {
+ File rootFile = ((AbstractRepository) repo).getRootFile();
+ if (installationLocation.startsWith(rootFile.getAbsolutePath())) {
+ String artifactString = installationLocation.substring(rootFile.getAbsolutePath().length());
+ if (artifactString.startsWith(File.separator)) {
+ artifactString = artifactString.substring(File.separator.length());
+ }
+ String[] filePathFragments = artifactString.split("[" + (File.separator.equals("\\") ? "\\\\" : File.separator) + "]");
+ if (filePathFragments.length >= 4) {
+ StringBuilder groupId = new StringBuilder(filePathFragments[0]);
+ for (int i = 1; i <= filePathFragments.length - 4; i++) {
+ groupId.append(".").append(filePathFragments[i]);
+ }
+ return new Artifact(groupId.toString(), filePathFragments[filePathFragments.length - 3], filePathFragments[filePathFragments.length - 2],
+ filePathFragments[filePathFragments.length - 1].substring(filePathFragments[filePathFragments.length - 1].lastIndexOf('.') + 1));
+ }
+ }
+ }
+ }
}
- return new Artifact(artifactFragments[0], artifactFragments[1], artifactFragments.length > 2 ? artifactFragments[2] : "" ,artifactFragments.length > 3 && artifactFragments[3].length() > 0 ?artifactFragments[3] : "jar" );
+ return null;
}
private void addArtifactBundleEntry(Bundle bundle) {
@@ -193,6 +265,10 @@ public class DependencyManager implement
ServiceReference reference = null;
try {
reference = bundleContext.getServiceReference(PackageAdmin.class.getName());
+ if(reference == null) {
+ log.warn("No PackageAdmin service is found, fail to get export packages of " + bundle.getLocation());
+ return Collections.<ExportPackage>emptySet();
+ }
PackageAdmin packageAdmin = (PackageAdmin) bundleContext.getService(reference);
ExportedPackage[] exportedPackages = packageAdmin.getExportedPackages(bundle);
if (exportedPackages != null) {
@@ -200,11 +276,11 @@ public class DependencyManager implement
for (ExportedPackage exportedPackage : exportedPackages) {
Map<String, String> attributes = new HashMap<String, String>();
attributes.put(Constants.VERSION_ATTRIBUTE, exportedPackage.getVersion().toString());
- exportPackageNames.add(new ExportPackage(exportedPackage.getName(), attributes, Collections.<String, String>emptyMap()));
+ exportPackageNames.add(new ExportPackage(exportedPackage.getName(), attributes, Collections.<String, String> emptyMap()));
}
return exportPackageNames;
}
- return Collections.<ExportPackage>emptySet();
+ return Collections.<ExportPackage> emptySet();
} finally {
if (reference != null) {
bundleContext.ungetService(reference);
@@ -228,7 +304,10 @@ public class DependencyManager implement
log.warn("Could not read geronimo metadata for bundle: " + bundle, e);
} finally {
if (in != null) {
- try { in.close(); } catch (IOException e) {}
+ try {
+ in.close();
+ } catch (IOException e) {
+ }
}
}
} else {
@@ -276,39 +355,43 @@ public class DependencyManager implement
return pluginArtifactType;
}
- private void installed(Bundle bundle) {
+ public void installed(Bundle bundle) {
addArtifactBundleEntry(bundle);
PluginArtifactType pluginArtifactType = getCachedPluginMetadata(bundle);
- if (pluginArtifactType != null) {
- List<DependencyType> dependencies = pluginArtifactType.getDependency();
- Set<Long> dependentBundleIds = new HashSet<Long>();
- try {
- for (DependencyType dependencyType : dependencies) {
- if (log.isDebugEnabled()) {
- log.debug("Installing artifact: " + dependencyType);
- }
- Artifact artifact = dependencyType.toArtifact();
- if (artifactResolver != null) {
- artifact = artifactResolver.resolveInClassLoader(artifact);
- }
- String location = locateBundle(artifact);
- try {
- Bundle installedBundle = bundleContext.installBundle(location);
- if (dependentBundleIds.add(installedBundle.getBundleId())) {
- Set<Long> parentDependentBundleIds = dependentBundleIdsMap.get(installedBundle
- .getBundleId());
- if (parentDependentBundleIds != null) {
- dependentBundleIds.addAll(parentDependentBundleIds);
- }
+ if (pluginArtifactType == null) {
+ return;
+ }
+ List<DependencyType> dependencies = pluginArtifactType.getDependency();
+ Set<Long> dependentBundleIds = new HashSet<Long>();
+ Set<Long> fullDependentBundleIds = new HashSet<Long>();
+ try {
+ for (DependencyType dependencyType : dependencies) {
+ if (log.isDebugEnabled()) {
+ log.debug("Installing artifact: " + dependencyType);
+ }
+ Artifact artifact = dependencyType.toArtifact();
+ if (artifactResolver != null) {
+ artifact = artifactResolver.resolveInClassLoader(artifact);
+ }
+ String location = locateBundle(artifact);
+ try {
+ Bundle installedDependentBundle = bundleContext.installBundle(location);
+ long installedDependentBundleId = installedDependentBundle.getBundleId();
+ dependentBundleIds.add(installedDependentBundleId);
+ if (fullDependentBundleIds.add(installedDependentBundleId)) {
+ Set<Long> parentDependentBundleIds = fullDependentBundleIdsMap.get(installedDependentBundleId);
+ if (parentDependentBundleIds != null) {
+ fullDependentBundleIds.addAll(parentDependentBundleIds);
}
- } catch (BundleException e) {
- log.warn("Could not install bundle for artifact: " + artifact, e);
}
+ } catch (BundleException e) {
+ log.warn("Could not install bundle for artifact: " + artifact, e);
}
- dependentBundleIdsMap.put(bundle.getBundleId(), dependentBundleIds);
- } catch (Exception e) {
- log.error("Could not install bundle dependency", e);
}
+ fullDependentBundleIdsMap.put(bundle.getBundleId(), fullDependentBundleIds);
+ dependentBundleIdsMap.put(bundle.getBundleId(), dependentBundleIds);
+ } catch (Exception e) {
+ log.error("Could not install bundle dependency", e);
}
}
@@ -328,7 +411,7 @@ public class DependencyManager implement
}
String location = locateBundle(artifact);
Bundle b = bundleContext.installBundle(location);
- if (b.getState() != Bundle.ACTIVE) {
+ if (b.getState() != Bundle.ACTIVE ) {
bundles.add(b);
}
}
@@ -350,7 +433,8 @@ public class DependencyManager implement
private String locateBundle(Artifact configurationId) throws NoSuchConfigException, IOException, InvalidConfigException {
if (System.getProperty("geronimo.build.car") == null) {
- return "mvn:" + configurationId.getGroupId() + "/" + configurationId.getArtifactId() + "/" + configurationId.getVersion() + ("jar".equals(configurationId.getType())? "": "/" + configurationId.getType());
+ return "mvn:" + configurationId.getGroupId() + "/" + configurationId.getArtifactId() + "/" + configurationId.getVersion()
+ + ("jar".equals(configurationId.getType()) ? "" : "/" + configurationId.getType());
}
for (Repository repo : repositories) {
if (repo.contains(configurationId)) {
Modified: geronimo/server/trunk/plugins/client/client/src/main/history/dependencies.xml
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/client/client/src/main/history/dependencies.xml?rev=1061636&r1=1061635&r2=1061636&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/client/client/src/main/history/dependencies.xml (original)
+++ geronimo/server/trunk/plugins/client/client/src/main/history/dependencies.xml Fri Jan 21 05:10:17 2011
@@ -28,6 +28,16 @@
</dependency>
<dependency>
<groupId>org.apache.bval</groupId>
+ <artifactId>bval-core</artifactId>
+ <type>jar</type>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.bval</groupId>
+ <artifactId>bval-jsr303</artifactId>
+ <type>jar</type>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.bval</groupId>
<artifactId>org.apache.bval.bundle</artifactId>
<type>jar</type>
</dependency>
Modified: geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/test/java/org/apache/geronimo/connector/deployment/ConnectorModuleBuilderTest.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/test/java/org/apache/geronimo/connector/deployment/ConnectorModuleBuilderTest.java?rev=1061636&r1=1061635&r2=1061636&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/test/java/org/apache/geronimo/connector/deployment/ConnectorModuleBuilderTest.java (original)
+++ geronimo/server/trunk/plugins/connector-1_6/geronimo-connector-builder-1_6/src/test/java/org/apache/geronimo/connector/deployment/ConnectorModuleBuilderTest.java Fri Jan 21 05:10:17 2011
@@ -22,8 +22,10 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.sql.Connection;
import java.sql.Statement;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
+import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -61,7 +63,6 @@ import org.apache.geronimo.kernel.config
import org.apache.geronimo.kernel.config.ConfigurationStore;
import org.apache.geronimo.kernel.config.ConfigurationUtil;
import org.apache.geronimo.kernel.config.KernelConfigurationManager;
-import org.apache.geronimo.kernel.config.LifecycleException;
import org.apache.geronimo.kernel.management.State;
import org.apache.geronimo.kernel.mock.MockConfigStore;
import org.apache.geronimo.kernel.mock.MockRepository;
@@ -73,12 +74,16 @@ import org.apache.geronimo.kernel.reposi
import org.apache.geronimo.kernel.repository.DefaultArtifactResolver;
import org.apache.geronimo.kernel.repository.Environment;
import org.apache.geronimo.kernel.repository.ImportType;
+import org.apache.geronimo.kernel.repository.Repository;
import org.apache.geronimo.kernel.util.FileUtils;
import org.apache.geronimo.kernel.util.JarUtils;
+import org.apache.geronimo.system.configuration.DependencyManager;
import org.apache.geronimo.system.serverinfo.BasicServerInfo;
import org.apache.geronimo.testsupport.TestSupport;
import org.apache.geronimo.transaction.wrapper.manager.GeronimoTransactionManagerGBean;
+import org.apache.xbean.osgi.bundle.util.BundleDescription.ExportPackage;
import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
import org.osgi.service.packageadmin.ExportedPackage;
import org.osgi.service.packageadmin.PackageAdmin;
import org.osgi.service.packageadmin.RequiredBundle;
@@ -160,7 +165,7 @@ public class ConnectorModuleBuilderTest
context = configBuilder.buildConfiguration(false, configBuilder.getConfigurationID(plan, rarFile, idBuilder), plan, rarFile, Collections.singleton(configurationStore), artifactResolver, configurationStore);
// add the a j2ee server so the application context reference can be resolved
context.addGBean("geronimo", J2EEServerImpl.GBEAN_INFO);
- // add the module validator so the connector artifacts will resolve to an instance
+ // add the module validator so the connector artifacts will resolve to an instance
AbstractName abstractName = context.getNaming().createChildName(((Module)plan).getModuleName(), "ValidatorFactory", NameFactory.VALIDATOR_FACTORY);
GBeanData gbeanData = new GBeanData(abstractName, ValidatorFactoryGBean.class);
context.addGBean(gbeanData);
@@ -199,8 +204,8 @@ public class ConnectorModuleBuilderTest
executeTestBuildModule(action, true);
fail("ConstraintViolation not thrown");
} catch (org.apache.geronimo.kernel.config.LifecycleException e) {
- // we'll get a deployment failure. The root reason will be a ValidationException,
- // but for now, that's difficult to root out and locate.
+ // we'll get a deployment failure. The root reason will be a ValidationException,
+ // but for now, that's difficult to root out and locate.
}
}
@@ -214,8 +219,8 @@ public class ConnectorModuleBuilderTest
executeTestBuildModule(action, true);
fail("ConstraintViolation not thrown");
} catch (org.apache.geronimo.kernel.config.LifecycleException e) {
- // we'll get a deployment failure. The root reason will be a ValidationException,
- // but for now, that's difficult to root out and locate.
+ // we'll get a deployment failure. The root reason will be a ValidationException,
+ // but for now, that's difficult to root out and locate.
}
}
@@ -229,12 +234,12 @@ public class ConnectorModuleBuilderTest
executeTestBuildModule(action, true);
fail("ConstraintViolation not thrown");
} catch (org.apache.geronimo.kernel.config.LifecycleException e) {
- // we'll get a deployment failure. The root reason will be a ValidationException,
- // but for now, that's difficult to root out and locate.
+ // we'll get a deployment failure. The root reason will be a ValidationException,
+ // but for now, that's difficult to root out and locate.
}
}
-/* TODO: figure out what the lifecycle is here so this can be processed
+/* TODO: figure out what the lifecycle is here so this can be processed
public void testActivationSpecBeanValidation() throws Exception {
InstallAction action = new InstallAction() {
public File getRARFile() {
@@ -245,11 +250,11 @@ public class ConnectorModuleBuilderTest
executeTestBuildModule(action, true);
fail("ConstraintViolation not thrown");
} catch (org.apache.geronimo.kernel.config.LifecycleException e) {
- // we'll get a deployment failure. The root reason will be a ValidationException,
- // but for now, that's difficult to root out and locate.
+ // we'll get a deployment failure. The root reason will be a ValidationException,
+ // but for now, that's difficult to root out and locate.
}
}
- */
+ */
public void testBuildUnpackedAltSpecDDModule() throws Exception {
InstallAction action = new InstallAction() {
@@ -446,7 +451,7 @@ public class ConnectorModuleBuilderTest
Bundle bundle = earContext.getDeploymentBundle();
moduleBuilder.initContext(earContext, module, bundle);
moduleBuilder.addGBeans(earContext, module, bundle, Collections.singleton(repository));
- // add the module validator so the connector artifacts will resolve to an instance
+ // add the module validator so the connector artifacts will resolve to an instance
AbstractName abstractName = earContext.getNaming().createChildName(module.getModuleName(), "ValidatorFactory", NameFactory.VALIDATOR_FACTORY);
GBeanData gbeanData = new GBeanData(abstractName, ValidatorFactoryGBean.class);
earContext.addGBean(gbeanData);
@@ -474,8 +479,8 @@ public class ConnectorModuleBuilderTest
// load the configuration
configurationManager.loadConfiguration(configurationData);
- Configuration configuration = configurationManager.getConfiguration(configurationId);
configurationManager.startConfiguration(configurationId);
+ Configuration configuration = configurationManager.getConfiguration(configurationId);
Set<AbstractName> gb = configuration.getGBeans().keySet();
for (AbstractName name : gb) {
if (State.RUNNING_INDEX != kernel.getGBeanState(name)) {
@@ -665,6 +670,7 @@ public class ConnectorModuleBuilderTest
}
};
bundleContext.registerService(PackageAdmin.class.getName(), packageAdmin, null);
+ bundleContext.registerService(DependencyManager.class.getName(), new MockDependencyManager(bundleContext, Collections.<Repository> emptyList(), null), new Hashtable());
kernel = KernelFactory.newInstance(bundleContext).createKernel("test");
kernel.boot();
@@ -726,7 +732,7 @@ public class ConnectorModuleBuilderTest
protected void tearDown() throws Exception {
kernel.shutdown();
- ((MockConfigStore)configurationStore).cleanup();
+ ((MockConfigStore)configurationStore).cleanup();
super.tearDown();
}
@@ -746,4 +752,26 @@ public class ConnectorModuleBuilderTest
}
}
+ private class MockDependencyManager extends DependencyManager {
+
+ public MockDependencyManager(BundleContext bundleContext, Collection<Repository> repositories, ArtifactResolver artifactResolver) {
+ super(bundleContext, repositories, artifactResolver);
+ }
+
+ @Override
+ public synchronized Set<ExportPackage> getExportedPackages(Bundle bundle) {
+ return Collections.<ExportPackage>emptySet();
+ }
+
+ @Override
+ public List<Bundle> getDependentBundles(Bundle bundle) {
+ return Collections.<Bundle>emptyList();
+ }
+
+ @Override
+ public Bundle getBundle(Artifact artifact) {
+ return null;
+ }
+
+ }
}
Modified: geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilderTestSupport.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilderTestSupport.java?rev=1061636&r1=1061635&r2=1061636&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilderTestSupport.java (original)
+++ geronimo/server/trunk/plugins/j2ee/geronimo-j2ee-builder/src/test/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilderTestSupport.java Fri Jan 21 05:10:17 2011
@@ -20,6 +20,8 @@ import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.jar.JarFile;
@@ -48,8 +50,13 @@ import org.apache.geronimo.kernel.reposi
import org.apache.geronimo.kernel.repository.Environment;
import org.apache.geronimo.kernel.repository.ImportType;
import org.apache.geronimo.kernel.repository.ListableRepository;
+import org.apache.geronimo.kernel.repository.Repository;
import org.apache.geronimo.kernel.util.FileUtils;
+import org.apache.geronimo.system.configuration.DependencyManager;
import org.apache.geronimo.testsupport.TestSupport;
+import org.apache.xbean.osgi.bundle.util.BundleDescription.ExportPackage;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
/**
* Provides support for EAR config builder tests.
@@ -140,6 +147,7 @@ public abstract class EARConfigBuilderTe
super.setUp();
bundleContext = new MockBundleContext(getClass().getClassLoader(), "", new HashMap<Artifact, ConfigurationData>(), locations);
((MockBundleContext)bundleContext).setConfigurationManager(new MockConfigurationManager());
+ bundleContext.registerService(DependencyManager.class.getName(), new MockDependencyManager(bundleContext, Collections.<Repository> emptyList(), null), new Hashtable());
Set<Artifact> repo = new HashSet<Artifact>();
repo.add(Artifact.create("org.apache.geronimo.tests/test/1/car"));
repository = new MockRepository(repo);
@@ -148,7 +156,7 @@ public abstract class EARConfigBuilderTe
}
protected void tearDown() throws Exception {
- configStore.cleanup();
+ configStore.cleanup();
super.tearDown();
}
@@ -483,4 +491,26 @@ public abstract class EARConfigBuilderTe
}
}
+ private class MockDependencyManager extends DependencyManager {
+
+ public MockDependencyManager(BundleContext bundleContext, Collection<Repository> repositories, ArtifactResolver artifactResolver) {
+ super(bundleContext, repositories, artifactResolver);
+ }
+
+ @Override
+ public synchronized Set<ExportPackage> getExportedPackages(Bundle bundle) {
+ return Collections.<ExportPackage>emptySet();
+ }
+
+ @Override
+ public List<Bundle> getDependentBundles(Bundle bundle) {
+ return Collections.<Bundle>emptyList();
+ }
+
+ @Override
+ public Bundle getBundle(Artifact artifact) {
+ return null;
+ }
+
+ }
}
Modified: geronimo/server/trunk/plugins/j2ee/j2ee-deployer/src/main/history/dependencies.xml
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/j2ee/j2ee-deployer/src/main/history/dependencies.xml?rev=1061636&r1=1061635&r2=1061636&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/j2ee/j2ee-deployer/src/main/history/dependencies.xml (original)
+++ geronimo/server/trunk/plugins/j2ee/j2ee-deployer/src/main/history/dependencies.xml Fri Jan 21 05:10:17 2011
@@ -76,4 +76,9 @@
<artifactId>xbean-bundleutils</artifactId>
<type>jar</type>
</dependency>
+ <dependency>
+ <groupId>org.apache.xbean</groupId>
+ <artifactId>xbean-finder</artifactId>
+ <type>jar</type>
+ </dependency>
</plugin-artifact>
Modified: geronimo/server/trunk/plugins/openejb/openejb/src/main/history/dependencies.xml
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/openejb/openejb/src/main/history/dependencies.xml?rev=1061636&r1=1061635&r2=1061636&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/openejb/openejb/src/main/history/dependencies.xml (original)
+++ geronimo/server/trunk/plugins/openejb/openejb/src/main/history/dependencies.xml Fri Jan 21 05:10:17 2011
@@ -7,6 +7,16 @@
<type>car</type>
</module-id>
<dependency>
+ <groupId>org.apache.bval</groupId>
+ <artifactId>bval-core</artifactId>
+ <type>jar</type>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.bval</groupId>
+ <artifactId>bval-jsr303</artifactId>
+ <type>jar</type>
+ </dependency>
+ <dependency>
<groupId>org.apache.geronimo.configs</groupId>
<artifactId>j2ee-server</artifactId>
<type>car</type>
@@ -137,6 +147,16 @@
<type>jar</type>
</dependency>
<dependency>
+ <groupId>org.apache.xbean</groupId>
+ <artifactId>xbean-bundleutils</artifactId>
+ <type>jar</type>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.xbean</groupId>
+ <artifactId>xbean-finder</artifactId>
+ <type>jar</type>
+ </dependency>
+ <dependency>
<groupId>org.apache.yoko</groupId>
<artifactId>yoko-spec-corba</artifactId>
<type>jar</type>