Author: jsdelfino
Date: Wed Mar 5 10:54:33 2008
New Revision: 633974
URL: http://svn.apache.org/viewvc?rev=633974&view=rev
Log:
Use proper IRIs to represent deployable composites and deployed composites.
Integrated calls to the CompositeBuilder to generated deployed/built
composites. Minor related fixes in the client side components.
Modified:
incubator/tuscany/java/sca/modules/workspace-admin/pom.xml
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeCollectionImpl.java
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionCollectionImpl.java
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionFileCollectionImpl.java
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionFileServiceImpl.java
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DeployableCompositeCollectionImpl.java
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/Admin.composite
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/cloud.html
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/composite.html
incubator/tuscany/java/sca/modules/workspace-admin/src/test/java/org/apache/tuscany/sca/workspace/admin/impl/AdminTestCase.java
Modified: incubator/tuscany/java/sca/modules/workspace-admin/pom.xml
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/pom.xml?rev=633974&r1=633973&r2=633974&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-admin/pom.xml (original)
+++ incubator/tuscany/java/sca/modules/workspace-admin/pom.xml Wed Mar 5
10:54:33 2008
@@ -43,6 +43,18 @@
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-implementation-node</artifactId>
+ <version>1.2-incubating-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-implementation-node-xml</artifactId>
+ <version>1.2-incubating-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-workspace-impl</artifactId>
<version>1.2-incubating-SNAPSHOT</version>
</dependency>
Modified:
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeCollectionImpl.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeCollectionImpl.java?rev=633974&r1=633973&r2=633974&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeCollectionImpl.java
(original)
+++
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeCollectionImpl.java
Wed Mar 5 10:54:33 2008
@@ -59,6 +59,7 @@
import org.osoa.sca.annotations.Property;
import org.osoa.sca.annotations.Reference;
import org.osoa.sca.annotations.Scope;
+import org.osoa.sca.annotations.Service;
import org.w3c.dom.Document;
/**
@@ -67,6 +68,7 @@
* @version $Rev: 632617 $ $Date: 2008-03-01 08:24:33 -0800 (Sat, 01 Mar 2008)
$
*/
@Scope("COMPOSITE")
[EMAIL PROTECTED](CompositeCollection.class)
public class CompositeCollectionImpl implements CompositeCollection {
@Property
@@ -81,10 +83,10 @@
private XMLOutputFactory outputFactory;
/**
- * Initialize the workspace administration component.
+ * Initialize the component.
*/
@Init
- public void init() throws IOException, ContributionReadException,
XMLStreamException, ParserConfigurationException {
+ public void initialize() throws IOException, ContributionReadException,
XMLStreamException, ParserConfigurationException {
// Create factories
ModelFactoryExtensionPoint modelFactories = new
DefaultModelFactoryExtensionPoint();
@@ -114,10 +116,12 @@
for (Composite composite: compositeCollection.getIncludes()) {
Entry<String, Item> entry = new Entry<String, Item>();
QName qname = composite.getName();
- entry.setKey(name(qname));
+ String contributionURI = composite.getURI();
+ String key = key(contributionURI, qname);
+ entry.setKey(key);
Item item = new Item();
- item.setTitle(name(qname));
- item.setLink(compositeLink(qname, composite.getURI()));
+ item.setTitle(key);
+ item.setLink(compositeLink(contributionURI, qname));
entry.setData(item);
entries.add(entry);
}
@@ -125,14 +129,15 @@
}
public Item get(String key) throws NotFoundException {
+ String contributionURI = uri(key);
+ QName qname = qname(key);
// Returns the composite with the given name key
for (Composite composite: compositeCollection.getIncludes()) {
- QName qname = composite.getName();
- if (key.equals(name(qname))) {
+ if (contributionURI.equals(composite.getURI()) &&
qname.equals(composite.getName())) {
Item item = new Item();
- item.setTitle(name(qname));
- item.setLink(compositeLink(qname, composite.getURI()));
+ item.setTitle(key);
+ item.setLink(compositeLink(composite.getURI(), qname));
return item;
}
}
@@ -140,11 +145,13 @@
}
public String post(String key, Item item) {
+ String contributionURI = uri(key);
+ QName qname = qname(key);
// Adds a new composite to the domain composite
Composite composite = assemblyFactory.createComposite();
- composite.setName(qname(key));
- composite.setURI(item.getLink());
+ composite.setName(qname);
+ composite.setURI(contributionURI);
composite.setUnresolved(true);
compositeCollection.getIncludes().add(composite);
@@ -155,15 +162,18 @@
}
public void put(String key, Item item) throws NotFoundException {
+ String contributionURI = uri(key);
+ QName qname = qname(key);
// Update a composite already in the domain composite
Composite newComposite = assemblyFactory.createComposite();
- newComposite.setName(qname(key));
- newComposite.setURI(item.getLink());
+ newComposite.setName(qname);
+ newComposite.setURI(contributionURI);
newComposite.setUnresolved(true);
List<Composite> composites = compositeCollection.getIncludes();
for (int i = 0, n = composites.size(); i < n; i++) {
- if (name(composites.get(i).getName()).equals(key)) {
+ Composite composite = composites.get(i);
+ if (contributionURI.equals(composite.getURI()) &&
qname.equals(composite.getName())) {
composites.set(i, newComposite);
// Write the domain composite
@@ -176,11 +186,14 @@
}
public void delete(String key) throws NotFoundException {
+ String contributionURI = uri(key);
+ QName qname = qname(key);
// Delete a composite from the domain composite
List<Composite> composites = compositeCollection.getIncludes();
for (int i = 0, n = composites.size(); i < n; i++) {
- if (name(composites.get(i).getName()).equals(key)) {
+ Composite composite = composites.get(i);
+ if (contributionURI.equals(composite.getURI()) &&
qname.equals(composite.getName())) {
composites.remove(i);
// Write the domain composite
@@ -193,7 +206,7 @@
}
public Entry<String, Item>[] query(String queryString) {
- if (queryString.startsWith("usedBy=")) {
+ if (queryString.startsWith("uris=true")) {
//FIXME Invoke the Composite processing code from workspace-impl
return getAll();
} else {
@@ -228,11 +241,11 @@
}
}
- private String compositeLink(QName qname, String contributionURI) {
- String name = name(qname);
+ private String compositeLink(String contributionURI, QName qname) {
+ String key = key(contributionURI, qname);
Entry<String, Item>[] entries =
deployableCompositeCollection.query("contribution=" + contributionURI);
for (Entry<String, Item> entry: entries) {
- if (name.equals(entry.getKey())) {
+ if (key.equals(entry.getKey())) {
return entry.getData().getLink();
}
}
@@ -240,30 +253,33 @@
}
/**
- * Returns a qname object from its expression as namespace#localpart.
- * @param name
+ * Extracts a qname from a key expressed as
contributionURI;namespace;localpart.
+ * @param key
* @return
*/
- private static QName qname(String name) {
- int i = name.indexOf(';');
- if (i != -1) {
- return new QName(name.substring(0, i), name.substring(i + 1));
- } else {
- return new QName(name);
- }
+ private static QName qname(String key) {
+ int i = key.indexOf(';');
+ key = key.substring(i + 1);
+ i = key.indexOf(';');
+ return new QName(key.substring(0, i), key.substring(i + 1));
+ }
+
+ /**
+ * Extracts a contribution uri from a key expressed as
contributionURI;namespace;localpart.
+ * @param key
+ * @return
+ */
+ private static String uri(String key) {
+ int i = key.indexOf(';');
+ return key.substring("composite:".length(), i);
}
/**
- * Returns a qname expressed as namespace;localpart.
+ * Returns a composite key expressed as
contributionURI;namespace;localpart.
* @param qname
* @return
*/
- private static String name(QName qname) {
- String ns = qname.getNamespaceURI();
- if (ns != null) {
- return ns + ';' + qname.getLocalPart();
- } else {
- return qname.getLocalPart();
- }
+ private static String key(String uri, QName qname) {
+ return "composite:" + uri + ';' + qname.getNamespaceURI() + ';' +
qname.getLocalPart();
}
}
Modified:
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionCollectionImpl.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionCollectionImpl.java?rev=633974&r1=633973&r2=633974&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionCollectionImpl.java
(original)
+++
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionCollectionImpl.java
Wed Mar 5 10:54:33 2008
@@ -30,7 +30,6 @@
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
-import java.util.Set;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
@@ -101,10 +100,10 @@
private XMLOutputFactory outputFactory;
/**
- * Initialize the workspace administration component.
+ * Initialize the component.
*/
@Init
- public void init() throws IOException, ContributionReadException,
XMLStreamException, ParserConfigurationException {
+ public void initialize() throws IOException, ContributionReadException,
XMLStreamException, ParserConfigurationException {
// Create model factories
ModelFactoryExtensionPoint modelFactories = new
DefaultModelFactoryExtensionPoint();
Modified:
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionFileCollectionImpl.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionFileCollectionImpl.java?rev=633974&r1=633973&r2=633974&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionFileCollectionImpl.java
(original)
+++
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionFileCollectionImpl.java
Wed Mar 5 10:54:33 2008
@@ -31,6 +31,7 @@
import org.osoa.sca.annotations.Init;
import org.osoa.sca.annotations.Property;
import org.osoa.sca.annotations.Scope;
+import org.osoa.sca.annotations.Service;
/**
* Implementation of a file collection service component.
@@ -38,6 +39,7 @@
* @version $Rev$ $Date$
*/
@Scope("COMPOSITE")
[EMAIL PROTECTED](ContributionFileCollection.class)
public class ContributionFileCollectionImpl implements
ContributionFileCollection {
@Property
@@ -49,7 +51,7 @@
* Initialize the component.
*/
@Init
- public void init() throws IOException {
+ public void initialize() throws IOException {
files = new File(directoryName);
if (!files.exists()) {
files.mkdirs();
Modified:
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionFileServiceImpl.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionFileServiceImpl.java?rev=633974&r1=633973&r2=633974&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionFileServiceImpl.java
(original)
+++
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/ContributionFileServiceImpl.java
Wed Mar 5 10:54:33 2008
@@ -27,6 +27,7 @@
import java.net.URLDecoder;
import java.util.List;
+import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
@@ -39,6 +40,7 @@
import org.osoa.sca.annotations.Init;
import org.osoa.sca.annotations.Property;
import org.osoa.sca.annotations.Scope;
+import org.osoa.sca.annotations.Service;
/**
* Implementation of a servlet component supporting file upload/download.
@@ -46,6 +48,7 @@
* @version $Rev$ $Date$
*/
@Scope("COMPOSITE")
[EMAIL PROTECTED](Servlet.class)
public class ContributionFileServiceImpl extends HttpServlet {
private static final long serialVersionUID = -4560385595481971616L;
Modified:
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DeployableCompositeCollectionImpl.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DeployableCompositeCollectionImpl.java?rev=633974&r1=633973&r2=633974&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DeployableCompositeCollectionImpl.java
(original)
+++
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/DeployableCompositeCollectionImpl.java
Wed Mar 5 10:54:33 2008
@@ -19,22 +19,37 @@
package org.apache.tuscany.sca.workspace.admin.impl;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
+import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
import org.apache.tuscany.sca.assembly.AssemblyFactory;
import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.assembly.SCABindingFactory;
+import org.apache.tuscany.sca.assembly.builder.CompositeBuilder;
+import org.apache.tuscany.sca.assembly.builder.CompositeBuilderException;
+import org.apache.tuscany.sca.assembly.builder.impl.CompositeBuilderImpl;
import org.apache.tuscany.sca.assembly.xml.CompositeDocumentProcessor;
import org.apache.tuscany.sca.assembly.xml.CompositeProcessor;
import org.apache.tuscany.sca.contribution.Contribution;
@@ -60,16 +75,23 @@
import org.apache.tuscany.sca.implementation.data.collection.Entry;
import org.apache.tuscany.sca.implementation.data.collection.Item;
import org.apache.tuscany.sca.implementation.data.collection.NotFoundException;
+import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
+import org.apache.tuscany.sca.interfacedef.impl.InterfaceContractMapperImpl;
+import org.apache.tuscany.sca.policy.IntentAttachPointTypeFactory;
import org.apache.tuscany.sca.policy.PolicyFactory;
+import org.apache.tuscany.sca.policy.PolicySet;
import org.apache.tuscany.sca.workspace.admin.CompositeCollection;
import org.apache.tuscany.sca.workspace.admin.LocalCompositeCollection;
import org.apache.tuscany.sca.workspace.admin.LocalContributionCollection;
import
org.apache.tuscany.sca.workspace.processor.impl.ContributionContentProcessor;
+import org.apache.xml.serialize.OutputFormat;
+import org.apache.xml.serialize.XMLSerializer;
import org.osoa.sca.ServiceRuntimeException;
import org.osoa.sca.annotations.Init;
import org.osoa.sca.annotations.Reference;
import org.osoa.sca.annotations.Scope;
import org.osoa.sca.annotations.Service;
+import org.w3c.dom.Document;
/**
* Implementation of a deployable composite collection service.
@@ -77,9 +99,10 @@
* @version $Rev$ $Date$
*/
@Scope("COMPOSITE")
[EMAIL PROTECTED](interfaces={CompositeCollection.class,
LocalCompositeCollection.class})
-public class DeployableCompositeCollectionImpl implements CompositeCollection,
LocalCompositeCollection {
-
[EMAIL PROTECTED](interfaces={CompositeCollection.class,
LocalCompositeCollection.class, Servlet.class})
+public class DeployableCompositeCollectionImpl extends HttpServlet implements
CompositeCollection, LocalCompositeCollection {
+ private static final long serialVersionUID = -8809641932774129151L;
+
@Reference
public LocalContributionCollection contributionCollection;
@@ -87,30 +110,31 @@
private ModelResolverExtensionPoint modelResolvers;
private AssemblyFactory assemblyFactory;
private URLArtifactProcessor<Contribution> contributionContentProcessor;
+ private StAXArtifactProcessor<Composite> compositeProcessor;
+ private XMLOutputFactory outputFactory;
+ private CompositeBuilder compositeBuilder;
/**
- * Initialize the workspace administration component.
+ * Initialize the component.
*/
@Init
- public void init() throws IOException, ContributionReadException,
XMLStreamException, ParserConfigurationException {
+ public void initialize() throws IOException, ContributionReadException,
XMLStreamException, ParserConfigurationException {
// Create factories
modelFactories = new DefaultModelFactoryExtensionPoint();
assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
XMLInputFactory inputFactory =
modelFactories.getFactory(XMLInputFactory.class);
- XMLOutputFactory outputFactory =
modelFactories.getFactory(XMLOutputFactory.class);
+ outputFactory = modelFactories.getFactory(XMLOutputFactory.class);
outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES,
true);
ContributionFactory contributionFactory =
modelFactories.getFactory(ContributionFactory.class);
PolicyFactory policyFactory =
modelFactories.getFactory(PolicyFactory.class);
- // Create model resolvers
- modelResolvers = new DefaultModelResolverExtensionPoint();
-
// Create artifact processors
StAXArtifactProcessorExtensionPoint staxProcessors = new
DefaultStAXArtifactProcessorExtensionPoint(modelFactories);
StAXArtifactProcessor<Object> staxProcessor = new
ExtensibleStAXArtifactProcessor(staxProcessors, inputFactory, outputFactory);
staxProcessors.addArtifactProcessor(new
ContributionMetadataProcessor(assemblyFactory, contributionFactory,
staxProcessor));
- staxProcessors.addArtifactProcessor(new
CompositeProcessor(contributionFactory, assemblyFactory, policyFactory,
staxProcessor));
+ compositeProcessor = new CompositeProcessor(contributionFactory,
assemblyFactory, policyFactory, staxProcessor);
+ staxProcessors.addArtifactProcessor(compositeProcessor);
URLArtifactProcessorExtensionPoint urlProcessors = new
DefaultURLArtifactProcessorExtensionPoint(modelFactories);
URLArtifactProcessor<Object> urlProcessor = new
ExtensibleURLArtifactProcessor(urlProcessors);
@@ -118,9 +142,17 @@
urlProcessors.addArtifactProcessor(new
ContributionGeneratedMetadataDocumentProcessor(staxProcessor, inputFactory));
urlProcessors.addArtifactProcessor(new
CompositeDocumentProcessor(staxProcessor, inputFactory));
- // Create contribution processors
+ // Create contribution processor
+ modelResolvers = new DefaultModelResolverExtensionPoint();
contributionContentProcessor = new
ContributionContentProcessor(modelFactories, modelResolvers, urlProcessor);
+ // Create composite builder
+ SCABindingFactory scaBindingFactory =
modelFactories.getFactory(SCABindingFactory.class);
+ IntentAttachPointTypeFactory intentAttachPointTypeFactory =
modelFactories.getFactory(IntentAttachPointTypeFactory.class);
+ InterfaceContractMapper contractMapper = new
InterfaceContractMapperImpl();
+ List<PolicySet> domainPolicySets = new ArrayList<PolicySet>();
+ compositeBuilder = new CompositeBuilderImpl(assemblyFactory,
scaBindingFactory, intentAttachPointTypeFactory,
+
contractMapper, domainPolicySets, null);
}
public Entry<String, Item>[] getAll() {
@@ -132,7 +164,7 @@
// Read contribution metadata
for (Entry<String, Item> contributionEntry: contributionEntries) {
- Contribution contribution;
+ Contribution contribution =
contribution(contributionEntry.getKey(), contributionEntry.getData().getLink());
try {
URI uri = URI.create(contributionEntry.getKey());
URL url = url(contributionEntry.getData().getLink());
@@ -146,9 +178,10 @@
// Create entries for the deployable composites
for (Composite deployable: contribution.getDeployables()) {
Entry<String, Item> entry = new Entry<String, Item>();
- entry.setKey(name(deployable.getName()));
+ String key = key(contribution.getURI(), deployable.getName());
+ entry.setKey(key);
Item item = new Item();
- item.setTitle(name(deployable.getName()));
+ item.setTitle(key);
item.setLink(deployableLink(contribution.getLocation(),
deployable.getURI()));
entry.setData(item);
entries.add(entry);
@@ -159,7 +192,28 @@
}
public Item get(String key) throws NotFoundException {
- throw new UnsupportedOperationException();
+
+ // Get the specified contribution info
+ String contributionURI = uri(key);
+ Item contributionItem = contributionCollection.get(contributionURI);
+
+ // Read the contribution
+ Contribution contribution = contribution(contributionURI,
contributionItem.getLink());
+
+ // Find the specified deployable composite
+ QName qname = qname(key);
+ for (Composite deployable: contribution.getDeployables()) {
+ if (qname.equals(deployable.getName())) {
+
+ // Return an item describing the deployable composite
+ Item item = new Item();
+ item.setTitle(key);
+ item.setLink(deployableLink(contribution.getLocation(),
deployable.getURI()));
+ return item;
+ }
+ }
+
+ throw new NotFoundException();
}
public String post(String key, Item item) {
@@ -173,7 +227,7 @@
public void delete(String key) throws NotFoundException {
throw new UnsupportedOperationException();
}
-
+
public Entry<String, Item>[] query(String queryString) {
if (queryString.startsWith("contribution=")) {
@@ -182,31 +236,24 @@
List<Entry<String, Item>> entries = new ArrayList<Entry<String,
Item>>();
// Get the specified contribution info
- String key = queryString.substring(13);
+ String contributionURI = queryString.substring(13);
Item contributionItem;
try {
- contributionItem = contributionCollection.get(key);
+ contributionItem = contributionCollection.get(contributionURI);
} catch (NotFoundException e) {
return entries.toArray(new Entry[entries.size()]);
}
-
- Contribution contribution;
- try {
- URI uri = URI.create(key);
- URL url = url(contributionItem.getLink());
- contribution =
(Contribution)contributionContentProcessor.read(null, uri, url);
- ModelResolver modelResolver = new
ExtensibleModelResolver(contribution, modelResolvers, modelFactories);
- contributionContentProcessor.resolve(contribution,
modelResolver);
- } catch (Exception e) {
- throw new ServiceRuntimeException(e);
- }
+
+ // Read the contribution
+ Contribution contribution = contribution(contributionURI,
contributionItem.getLink());
// Create entries for the deployable composites
for (Composite deployable: contribution.getDeployables()) {
Entry<String, Item> entry = new Entry<String, Item>();
- entry.setKey(name(deployable.getName()));
+ String key = key(contributionURI, deployable.getName());
+ entry.setKey(key);
Item item = new Item();
- item.setTitle(name(deployable.getName()));
+ item.setTitle(key);
item.setLink(deployableLink(contribution.getLocation(),
deployable.getURI()));
entry.setData(item);
entries.add(entry);
@@ -219,27 +266,152 @@
}
}
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
+
+ // Get the request path
+ String path =
URLDecoder.decode(request.getRequestURI().substring(request.getServletPath().length()),
"UTF-8");
+ String key = path.startsWith("/")? path.substring(1) : path;
+
+ // Get the specified contribution info
+ String contributionURI = uri(key);
+ Item contributionItem;
+ try {
+ contributionItem = contributionCollection.get(contributionURI);
+ } catch (NotFoundException e) {
+ response.sendError(HttpServletResponse.SC_NOT_FOUND);
+ return;
+ }
+
+ // Read the contribution
+ Contribution contribution = contribution(contributionURI,
contributionItem.getLink());
+
+ // Find the specified deployable composite
+ Composite deployable = null;
+ QName qname = qname(key);
+ for (Composite d: contribution.getDeployables()) {
+ if (qname.equals(d.getName())) {
+ deployable = d;
+ break;
+ }
+ }
+ if (deployable == null) {
+ response.sendError(HttpServletResponse.SC_NOT_FOUND);
+ return;
+ }
+
+ // Build the composite
+ try {
+ compositeBuilder.build(deployable);
+ } catch (CompositeBuilderException e) {
+ throw new ServletException(e);
+ }
+
+ // Write the deployable composite back to XML
+ try {
+ // First write to a byte stream
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ XMLStreamWriter writer = outputFactory.createXMLStreamWriter(bos);
+ compositeProcessor.write(deployable, writer);
+
+ // Parse again to pretty format the document
+ DocumentBuilder documentBuilder =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
+ Document document = documentBuilder.parse(new
ByteArrayInputStream(bos.toByteArray()));
+ OutputFormat format = new OutputFormat();
+ format.setIndenting(true);
+ format.setIndent(2);
+
+ // Write to domain.composite
+ XMLSerializer serializer = new
XMLSerializer(response.getOutputStream(), format);
+ serializer.serialize(document);
+
+ } catch (Exception e) {
+ throw new ServletException(e);
+ }
+ }
+
+ /**
+ * Returns the contribution with the given URI.
+ *
+ * @param contributionURI
+ * @return
+ * @throws NotFoundException
+ */
+ private Contribution contribution(String contributionURI, String
contributionURL) {
+ try {
+ URI uri = URI.create(contributionURI);
+ URL url = url(contributionURL);
+ Contribution contribution =
(Contribution)contributionContentProcessor.read(null, uri, url);
+ ModelResolver modelResolver = new
ExtensibleModelResolver(contribution, modelResolvers, modelFactories);
+ contributionContentProcessor.resolve(contribution, modelResolver);
+ return contribution;
+
+ } catch (Exception e) {
+ throw new ServiceRuntimeException(e);
+ }
+ }
+
+ /**
+ * Returns a link to a deployable composite.
+ *
+ * If the containing contribution is a local directory, return the URI of
the local composite file
+ * inside the contribution.
+ *
+ * If the containing contribution is a local or remote file, return a URI
of the form:
+ * /files/ contribution URI !/ composite URI.
+ * The contribution file servlet at '/files/' will open the contribution
and extract the composite
+ * file from it.
+ *
+ * @param contributionLocation
+ * @param deployableURI
+ * @return
+ */
private static String deployableLink(String contributionLocation, String
deployableURI) {
URI uri = URI.create(contributionLocation);
- if (uri.getPath().startsWith("/files/")) {
- return contributionLocation + "!/" + deployableURI;
+ if ("file".equals(uri.getScheme())) {
+ if (new File(uri).isDirectory()) {
+ return contributionLocation + "/" + deployableURI;
+ } else {
+ return "/files/" + contributionLocation + "!/" +
deployableURI;
+ }
} else {
- return "/files/" + contributionLocation + "!/" + deployableURI;
+ if (uri.getPath().startsWith("/files/")) {
+ return contributionLocation + "!/" + deployableURI;
+ } else {
+ return "/files/" + contributionLocation + "!/" + deployableURI;
+ }
}
}
/**
- * Returns a qname expressed as namespace#localpart.
+ * Extracts a qname from a key expressed as
contributionURI;namespace;localpart.
+ * @param key
+ * @return
+ */
+ private static QName qname(String key) {
+ int i = key.indexOf(';');
+ key = key.substring(i + 1);
+ i = key.indexOf(';');
+ return new QName(key.substring(0, i), key.substring(i + 1));
+ }
+
+ /**
+ * Extracts a contribution uri from a key expressed as
contributionURI;namespace;localpart.
+ * @param key
+ * @return
+ */
+ private static String uri(String key) {
+ int i = key.indexOf(';');
+ return key.substring("composite:".length(), i);
+ }
+
+ /**
+ * Returns a composite key expressed as
contributionURI;namespace;localpart.
* @param qname
* @return
*/
- private static String name(QName qname) {
- String ns = qname.getNamespaceURI();
- if (ns != null) {
- return ns + ';' + qname.getLocalPart();
- } else {
- return qname.getLocalPart();
- }
+ private static String key(String uri, QName qname) {
+ return "composite:" + uri + ';' + qname.getNamespaceURI() + ';' +
qname.getLocalPart();
}
/**
Modified:
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/Admin.composite
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/Admin.composite?rev=633974&r1=633973&r2=633974&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/Admin.composite
(original)
+++
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/Admin.composite
Wed Mar 5 10:54:33 2008
@@ -88,7 +88,7 @@
<component name="ContributionFileServiceComponent">
<implementation.java
class="org.apache.tuscany.sca.workspace.admin.impl.ContributionFileServiceImpl"/>
<property name="directoryName">contributions</property>
- <service name="ContributionFileServiceImpl">
+ <service name="Servlet">
<t:binding.http uri="http://localhost:9990/files"/>
</service>
</component>
@@ -106,6 +106,9 @@
<implementation.java
class="org.apache.tuscany.sca.workspace.admin.impl.DeployableCompositeCollectionImpl"/>
<service name="CompositeCollection">
<t:binding.atom uri="http://localhost:9990/deployable"/>
+ </service>
+ <service name="Servlet">
+ <t:binding.http
uri="http://localhost:9990/resolved/composite/"/>
</service>
<reference name="contributionCollection"
target="ContributionCollectionComponent/LocalContributionCollection"/>
</component>
Modified:
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/cloud.html
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/cloud.html?rev=633974&r1=633973&r2=633974&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/cloud.html
(original)
+++
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/cloud.html
Wed Mar 5 10:54:33 2008
@@ -65,13 +65,12 @@
}
function addComposite() {
- var id = document.newCompositeForm.compositeQName.value;
- var location = document.newCompositeForm.contributionURI.value;
+ var id = 'composite:' +
+ document.newCompositeForm.contributionURI.value + ';' +
+ document.newCompositeForm.compositeQName.value;
var entry = '<entry xmlns="http://www.w3.org/2005/Atom">' +
- '<title>Contribution - ' + id +'</title>' +
+ '<title>' + id +'</title>' +
'<id>' + id + '</id>' +
- '<link rel="alternate" href="' + location + '" />' +
- '<link rel="edit" href="' + location + '" />' +
'</entry>';
cloudComposite.post(entry, addCompositeResponse);
}
@@ -108,8 +107,8 @@
<b>Add Node</b>
<form name="newCompositeForm">
<table border="0">
- <tr><td>QName:</td><td><input type="text" name="compositeQName"
/></td></tr>
<tr><td>Contribution URI:</td><td><input type="text"
name="contributionURI" /></td></tr>
+ <tr><td>QName:</td><td><input type="text" name="compositeQName"
/></td></tr>
</table>
<br/>
<input type="button" onClick="addComposite()" value="Add" />
Modified:
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/composite.html
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/composite.html?rev=633974&r1=633973&r2=633974&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/composite.html
(original)
+++
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/composite.html
Wed Mar 5 10:54:33 2008
@@ -43,6 +43,7 @@
composites += '<tr valign="bottom">'
composites += '<td><input name="composites"
type="checkbox" value="' + id + '">' +
'<a href=\"' + location + '\">' + id + '</a></td>';
+ composites += '<td> <a
href=\"/resolved/composite/' + id + '\">resolved</a></td>';
composites += '</tr>';
}
composites += '</table>';
@@ -65,13 +66,12 @@
}
function addComposite() {
- var id = document.newCompositeForm.compositeQName.value;
- var location = document.newCompositeForm.contributionURI.value;
+ var id = 'composite:' +
+ document.newCompositeForm.contributionURI.value + ';' +
+ document.newCompositeForm.compositeQName.value;
var entry = '<entry xmlns="http://www.w3.org/2005/Atom">' +
- '<title>Contribution - ' + id +'</title>' +
+ '<title>' + id +'</title>' +
'<id>' + id + '</id>' +
- '<link rel="alternate" href="' + location + '" />' +
- '<link rel="edit" href="' + location + '" />' +
'</entry>';
domainComposite.post(entry, addCompositeResponse);
}
@@ -104,8 +104,8 @@
<b>Add Composite</b>
<form name="newCompositeForm">
<table border="0">
- <tr><td>QName:</td><td><input type="text" name="compositeQName"
/></td></tr>
<tr><td>Contribution URI:</td><td><input type="text"
name="contributionURI" /></td></tr>
+ <tr><td>QName:</td><td><input type="text" name="compositeQName"
/></td></tr>
</table>
<br/>
<input type="button" onClick="addComposite()" value="Add" />
Modified:
incubator/tuscany/java/sca/modules/workspace-admin/src/test/java/org/apache/tuscany/sca/workspace/admin/impl/AdminTestCase.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/test/java/org/apache/tuscany/sca/workspace/admin/impl/AdminTestCase.java?rev=633974&r1=633973&r2=633974&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/workspace-admin/src/test/java/org/apache/tuscany/sca/workspace/admin/impl/AdminTestCase.java
(original)
+++
incubator/tuscany/java/sca/modules/workspace-admin/src/test/java/org/apache/tuscany/sca/workspace/admin/impl/AdminTestCase.java
Wed Mar 5 10:54:33 2008
@@ -63,7 +63,7 @@
contributionCollection.workspaceFileName = url.getFile();
deployableCollection = new DeployableCompositeCollectionImpl();
deployableCollection.contributionCollection = contributionCollection;
- contributionCollection.init();
+ contributionCollection.initialize();
deployableCollection.init();
// Populate the workspace with test data
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]