summaryrefslogtreecommitdiffstats
path: root/branches/sca-equinox/modules/workspace/src/main
diff options
context:
space:
mode:
authorjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2008-10-06 08:32:38 +0000
committerjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2008-10-06 08:32:38 +0000
commit9fb2fb275d3f69a287ac4f1c7d55190fb7a7bb3b (patch)
tree40a3b6e43c677e8e9321921b95668eba4c75163a /branches/sca-equinox/modules/workspace/src/main
parent4f6fd64d654fec9afb231dd41af9c7d6e41d382f (diff)
Work in progress. Started to clean up cross-bundle dependencies on ContributionService implementation class, the various CompositeBuilder implementation classes and the ContributionDependencyBuilder implementation class. Added extension points for ContributionBuilders and CompositeBuilders to have them discovered and loaded by the Equinox ServiceDiscovery like other extension points. Moved injection of monitors and SCA definitions to the build methods instead of the constructors to remove references to these implementation constructors. Simplified NodeImpl a bit to remove references to other runtime implementation classes.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@702000 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'branches/sca-equinox/modules/workspace/src/main')
-rw-r--r--branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionBuilder.java (renamed from branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionDependencyBuilder.java)23
-rw-r--r--branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionBuilderException.java45
-rw-r--r--branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionBuilderExtensionPoint.java51
-rw-r--r--branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/DefaultContributionBuilderExtensionPoint.java139
-rw-r--r--branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/impl/WorkspaceImpl.java5
-rw-r--r--branches/sca-equinox/modules/workspace/src/main/resources/META-INF/services/org.apache.tuscany.sca.workspace.builder.ContributionBuilderExtensionPoint18
6 files changed, 273 insertions, 8 deletions
diff --git a/branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionDependencyBuilder.java b/branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionBuilder.java
index 6fab700243..b7c11f769b 100644
--- a/branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionDependencyBuilder.java
+++ b/branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionBuilder.java
@@ -19,24 +19,31 @@
package org.apache.tuscany.sca.workspace.builder;
-import java.util.List;
-
import org.apache.tuscany.sca.contribution.Contribution;
+import org.apache.tuscany.sca.monitor.Monitor;
import org.apache.tuscany.sca.workspace.Workspace;
/**
- * A contribution dependency builder.
+ * A contribution builder.
*
* @version $Rev$ $Date$
*/
-public interface ContributionDependencyBuilder {
+public interface ContributionBuilder {
/**
- * Build the set of contributions that a contribution depends on.
- * @param workspace
- * @param contribution
+ * Returns the ID of the builder.
+ *
* @return
*/
- List<Contribution> buildContributionDependencies(Contribution contribution, Workspace workspace);
+ String getID();
+
+ /**
+ * Build a contribution.
+ *
+ * @param contribution
+ * @param workspace
+ * @param monitor
+ */
+ void build(Contribution contribution, Workspace workspace, Monitor monitor) throws ContributionBuilderException;
}
diff --git a/branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionBuilderException.java b/branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionBuilderException.java
new file mode 100644
index 0000000000..10c18def10
--- /dev/null
+++ b/branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionBuilderException.java
@@ -0,0 +1,45 @@
+/*
+ * 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.workspace.builder;
+
+/**
+ * Reports a contribution builder exception.
+ *
+ * @version $Rev$ $Date$
+ */
+public class ContributionBuilderException extends Exception {
+ private static final long serialVersionUID = -1198817287971778953L;
+
+ public ContributionBuilderException() {
+ }
+
+ public ContributionBuilderException(String message) {
+ super(message);
+ }
+
+ public ContributionBuilderException(Throwable cause) {
+ super(cause);
+ }
+
+ public ContributionBuilderException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+}
diff --git a/branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionBuilderExtensionPoint.java b/branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionBuilderExtensionPoint.java
new file mode 100644
index 0000000000..8200321eec
--- /dev/null
+++ b/branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/ContributionBuilderExtensionPoint.java
@@ -0,0 +1,51 @@
+/*
+ * 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.workspace.builder;
+
+/**
+ * An extension point for Contribution builders.
+ *
+ * @version $Rev: $ $Date: $
+ */
+public interface ContributionBuilderExtensionPoint {
+
+ /**
+ * Adds a contribution builder.
+ *
+ * @param contributionBuilder
+ */
+ void addContributionBuilder(ContributionBuilder contributionBuilder);
+
+ /**
+ * Removes a contribution builder.
+ *
+ * @param contributionBuilder
+ */
+ void removeContributionBuilder(ContributionBuilder contributionBuilder);
+
+ /**
+ * Returns the contribution builder with the given id.
+ *
+ * @param id
+ * @return
+ */
+ ContributionBuilder getContributionBuilder(String id);
+
+}
diff --git a/branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/DefaultContributionBuilderExtensionPoint.java b/branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/DefaultContributionBuilderExtensionPoint.java
new file mode 100644
index 0000000000..1918732a25
--- /dev/null
+++ b/branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/builder/DefaultContributionBuilderExtensionPoint.java
@@ -0,0 +1,139 @@
+/*
+ * 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.workspace.builder;
+
+import java.lang.reflect.Constructor;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.tuscany.sca.contribution.Contribution;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.core.FactoryExtensionPoint;
+import org.apache.tuscany.sca.extensibility.ServiceDeclaration;
+import org.apache.tuscany.sca.extensibility.ServiceDiscovery;
+import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
+import org.apache.tuscany.sca.monitor.Monitor;
+import org.apache.tuscany.sca.workspace.Workspace;
+
+/**
+ * Default implementation of a provider factory extension point.
+ *
+ * @version $Rev$ $Date$
+ */
+public class DefaultContributionBuilderExtensionPoint implements ContributionBuilderExtensionPoint {
+
+ private ExtensionPointRegistry registry;
+ private final Map<String, ContributionBuilder> builders = new HashMap<String, ContributionBuilder>();
+ private boolean loaded;
+
+ public DefaultContributionBuilderExtensionPoint(ExtensionPointRegistry registry) {
+ this.registry = registry;
+ }
+
+ public void addContributionBuilder(ContributionBuilder builder) {
+ builders.put(builder.getID(), builder);
+ }
+
+ public void removeContributionBuilder(ContributionBuilder builder) {
+ builders.remove(builder.getID());
+ }
+
+ public ContributionBuilder getContributionBuilder(String id) {
+ loadBuilders();
+ return builders.get(id);
+ }
+
+ /**
+ * Load builders declared under META-INF/services.
+ */
+ private void loadBuilders() {
+ if (loaded)
+ return;
+
+ FactoryExtensionPoint factories = registry.getExtensionPoint(FactoryExtensionPoint.class);
+
+ // Get the provider factory service declarations
+ Set<ServiceDeclaration> builderDeclarations;
+ ServiceDiscovery serviceDiscovery = ServiceDiscovery.getInstance();
+ try {
+ builderDeclarations = serviceDiscovery.getServiceDeclarations(ContributionBuilder.class.getName());
+ } catch (Exception e) {
+ throw new IllegalStateException(e);
+ }
+
+ for (ServiceDeclaration builderDeclaration : builderDeclarations) {
+ Map<String, String> attributes = builderDeclaration.getAttributes();
+ String id = attributes.get("id");
+
+ ContributionBuilder builder = new LazyContributionBuilder(id, builderDeclaration, this, factories);
+ builders.put(id, builder);
+ }
+ }
+
+ /**
+ * A wrapper around a contribution builder allowing lazy
+ * loading and initialization of implementation providers.
+ */
+ private static class LazyContributionBuilder implements ContributionBuilder {
+
+ private FactoryExtensionPoint factories;
+ private String id;
+ private ServiceDeclaration builderDeclaration;
+ private ContributionBuilder builder;
+ private ContributionBuilderExtensionPoint builders;
+
+ private LazyContributionBuilder(String id, ServiceDeclaration factoryDeclaration,
+ ContributionBuilderExtensionPoint builders, FactoryExtensionPoint factories) {
+ this.id = id;
+ this.builderDeclaration = factoryDeclaration;
+ this.builders = builders;
+ this.factories = factories;
+ }
+
+ public String getID() {
+ return id;
+ }
+
+ public void build(Contribution contribution, Workspace workspace, Monitor monitor) throws ContributionBuilderException {
+ getBuilder().build(contribution, workspace, monitor);
+ }
+
+ private ContributionBuilder getBuilder() {
+ if (builder == null) {
+ try {
+ Class<ContributionBuilder> builderClass = (Class<ContributionBuilder>)builderDeclaration.loadClass();
+ try {
+ Constructor<ContributionBuilder> constructor = builderClass.getConstructor(FactoryExtensionPoint.class);
+ builder = constructor.newInstance(factories);
+ } catch (NoSuchMethodException e) {
+ Constructor<ContributionBuilder> constructor = builderClass.getConstructor(ContributionBuilderExtensionPoint.class, FactoryExtensionPoint.class);
+ builder = constructor.newInstance(builders, factories);
+ }
+ } catch (Exception e) {
+ throw new IllegalStateException(e);
+ }
+ }
+ return builder;
+ }
+
+ }
+
+}
diff --git a/branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/impl/WorkspaceImpl.java b/branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/impl/WorkspaceImpl.java
index e60a5d8108..8c2e119493 100644
--- a/branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/impl/WorkspaceImpl.java
+++ b/branches/sca-equinox/modules/workspace/src/main/java/org/apache/tuscany/sca/workspace/impl/WorkspaceImpl.java
@@ -44,6 +44,7 @@ class WorkspaceImpl implements Workspace {
private byte[] contents;
private boolean unresolved;
private ModelResolver modelResolver;
+ private List<Contribution> dependencies = new ArrayList<Contribution>();
/**
* Constructs a new workspace.
@@ -98,6 +99,10 @@ class WorkspaceImpl implements Workspace {
public List<Artifact> getArtifacts() {
return (List<Artifact>)(Object)contributions;
}
+
+ public List<Contribution> getDependencies() {
+ return dependencies;
+ }
public ClassLoader getClassLoader() {
//FIXME Remove later
diff --git a/branches/sca-equinox/modules/workspace/src/main/resources/META-INF/services/org.apache.tuscany.sca.workspace.builder.ContributionBuilderExtensionPoint b/branches/sca-equinox/modules/workspace/src/main/resources/META-INF/services/org.apache.tuscany.sca.workspace.builder.ContributionBuilderExtensionPoint
new file mode 100644
index 0000000000..98ad0b72b0
--- /dev/null
+++ b/branches/sca-equinox/modules/workspace/src/main/resources/META-INF/services/org.apache.tuscany.sca.workspace.builder.ContributionBuilderExtensionPoint
@@ -0,0 +1,18 @@
+# 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.
+
+org.apache.tuscany.sca.workspace.builder.DefaultContributionBuilderExtensionPoint \ No newline at end of file