Author: jsdelfino
Date: Mon Mar 3 10:13:51 2008
New Revision: 633220
URL: http://svn.apache.org/viewvc?rev=633220&view=rev
Log:
Improved admin app UI, added a toolbar. Added code to represent one checkbox or
multiple checkboxes consistently in an array. Added support for finding
deployables inside contributions and returning their URL.
Added:
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/LocalCompositeCollection.java
(with props)
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/resources/home.html
(with props)
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/utils.js
(with props)
Modified:
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/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/main/resources/files.html
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/workspace.html
incubator/tuscany/java/sca/modules/workspace-admin/src/test/java/org/apache/tuscany/sca/workspace/admin/impl/AdminTestCase.java
Added:
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/LocalCompositeCollection.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/LocalCompositeCollection.java?rev=633220&view=auto
==============================================================================
---
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/LocalCompositeCollection.java
(added)
+++
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/LocalCompositeCollection.java
Mon Mar 3 10:13:51 2008
@@ -0,0 +1,32 @@
+/*
+ * 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.admin;
+
+import org.apache.tuscany.sca.implementation.data.collection.Collection;
+import org.apache.tuscany.sca.implementation.data.collection.Item;
+
+/**
+ * A local interface for the composite collection service.
+ *
+ * @version $Rev$ $Date$
+ */
+public interface LocalCompositeCollection extends Collection<String, Item>{
+
+}
Propchange:
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/LocalCompositeCollection.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/LocalCompositeCollection.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added:
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=633220&view=auto
==============================================================================
---
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeCollectionImpl.java
(added)
+++
incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/impl/CompositeCollectionImpl.java
Mon Mar 3 10:13:51 2008
@@ -0,0 +1,269 @@
+/*
+ * 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.admin.impl;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+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.XMLStreamReader;
+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.xml.CompositeProcessor;
+import org.apache.tuscany.sca.assembly.xml.Constants;
+import org.apache.tuscany.sca.contribution.ContributionFactory;
+import org.apache.tuscany.sca.contribution.DefaultModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.contribution.service.ContributionReadException;
+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.policy.PolicyFactory;
+import org.apache.tuscany.sca.workspace.admin.CompositeCollection;
+import org.apache.tuscany.sca.workspace.admin.LocalCompositeCollection;
+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.Property;
+import org.osoa.sca.annotations.Reference;
+import org.osoa.sca.annotations.Scope;
+import org.w3c.dom.Document;
+
+/**
+ * Implementation of a composite collection service.
+ *
+ * @version $Rev$ $Date$
+ */
[EMAIL PROTECTED]("COMPOSITE")
+public class CompositeCollectionImpl implements CompositeCollection {
+
+ @Property
+ public String compositeFileName;
+
+ @Reference
+ public LocalCompositeCollection deployableCompositeCollection;
+
+ private AssemblyFactory assemblyFactory;
+ private Composite compositeCollection;
+ private CompositeProcessor compositeProcessor;
+ private XMLOutputFactory outputFactory;
+
+ /**
+ * Initialize the workspace administration component.
+ */
+ @Init
+ public void init() throws IOException, ContributionReadException,
XMLStreamException, ParserConfigurationException {
+
+ // Create factories
+ ModelFactoryExtensionPoint modelFactories = new
DefaultModelFactoryExtensionPoint();
+ assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
+ outputFactory = modelFactories.getFactory(XMLOutputFactory.class);
+ outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES,
true);
+
+ // Read domain.composite
+ ContributionFactory contributionFactory =
modelFactories.getFactory(ContributionFactory.class);
+ PolicyFactory policyFactory =
modelFactories.getFactory(PolicyFactory.class);
+ compositeProcessor = new CompositeProcessor(contributionFactory,
assemblyFactory, policyFactory, null);
+ File file = new File(compositeFileName);
+ if (file.exists()) {
+ XMLInputFactory inputFactory =
modelFactories.getFactory(XMLInputFactory.class);
+ FileInputStream is = new FileInputStream(file);
+ XMLStreamReader reader = inputFactory.createXMLStreamReader(is);
+ compositeCollection = compositeProcessor.read(reader);
+ } else {
+ compositeCollection = assemblyFactory.createComposite();
+ compositeCollection.setName(new QName(Constants.SCA10_TUSCANY_NS,
compositeFileName));
+ }
+ }
+
+ public Entry<String, Item>[] getAll() {
+ // Return all the composites in the domain composite
+ List<Entry<String, Item>> entries = new ArrayList<Entry<String,
Item>>();
+ for (Composite composite: compositeCollection.getIncludes()) {
+ Entry<String, Item> entry = new Entry<String, Item>();
+ QName qname = composite.getName();
+ entry.setKey(name(qname));
+ Item item = new Item();
+ item.setTitle(name(qname));
+ item.setLink(compositeLink(qname, composite.getURI()));
+ entry.setData(item);
+ entries.add(entry);
+ }
+ return entries.toArray(new Entry[entries.size()]);
+ }
+
+ public Item get(String key) throws NotFoundException {
+
+ // Returns the composite with the given name key
+ for (Composite composite: compositeCollection.getIncludes()) {
+ QName qname = composite.getName();
+ if (key.equals(name(qname))) {
+ Item item = new Item();
+ item.setTitle(name(qname));
+ item.setLink(compositeLink(qname, composite.getURI()));
+ return item;
+ }
+ }
+ throw new NotFoundException(key);
+ }
+
+ public String post(String key, Item item) {
+
+ // Adds a new composite to the domain composite
+ Composite composite = assemblyFactory.createComposite();
+ composite.setName(qname(key));
+ composite.setURI(item.getLink());
+ composite.setUnresolved(true);
+ compositeCollection.getIncludes().add(composite);
+
+ // Write the domain composite
+ write();
+
+ return key;
+ }
+
+ public void put(String key, Item item) throws NotFoundException {
+
+ // Update a composite already in the domain composite
+ Composite newComposite = assemblyFactory.createComposite();
+ newComposite.setName(qname(key));
+ newComposite.setURI(item.getLink());
+ 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)) {
+ composites.set(i, newComposite);
+
+ // Write the domain composite
+ write();
+
+ return;
+ }
+ }
+ throw new NotFoundException(key);
+ }
+
+ public void delete(String key) throws NotFoundException {
+
+ // 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)) {
+ composites.remove(i);
+
+ // Write the domain composite
+ write();
+
+ return;
+ }
+ }
+ throw new NotFoundException(key);
+ }
+
+ public Entry<String, Item>[] query(String queryString) {
+ if (queryString.startsWith("usedBy=")) {
+ //FIXME Invoke the Composite processing code from workspace-impl
+ return getAll();
+ } else {
+ throw new UnsupportedOperationException();
+ }
+ }
+
+ /**
+ * Write the domain composite back to disk
+ */
+ private void write() {
+ try {
+ // First write to a byte stream
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ XMLStreamWriter writer = outputFactory.createXMLStreamWriter(bos);
+ compositeProcessor.write(compositeCollection, 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
+ FileOutputStream os = new FileOutputStream(new
File(compositeFileName));
+ XMLSerializer serializer = new XMLSerializer(os, format);
+ serializer.serialize(document);
+
+ } catch (Exception e) {
+ throw new ServiceRuntimeException(e);
+ }
+ }
+
+ private String compositeLink(QName qname, String contributionURI) {
+ String name = name(qname);
+ Entry<String, Item>[] entries =
deployableCompositeCollection.query("contribution=" + contributionURI);
+ for (Entry<String, Item> entry: entries) {
+ if (name.equals(entry.getKey())) {
+ return entry.getData().getLink();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Returns a qname object from its expression as namespace#localpart.
+ * @param name
+ * @return
+ */
+ private static QName qname(String name) {
+ int i = name.indexOf('}');
+ if (i != -1) {
+ return new QName(name.substring(1, i), name.substring(i + 1));
+ } else {
+ return new QName(name);
+ }
+ }
+
+ /**
+ * Returns a qname expressed as 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();
+ }
+ }
+}
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=633220&r1=633219&r2=633220&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
Mon Mar 3 10:13:51 2008
@@ -109,6 +109,7 @@
// Create model factories
ModelFactoryExtensionPoint modelFactories = new
DefaultModelFactoryExtensionPoint();
outputFactory = modelFactories.getFactory(XMLOutputFactory.class);
+ outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES,
true);
contributionFactory =
modelFactories.getFactory(ContributionFactory.class);
assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
workspaceFactory = modelFactories.getFactory(WorkspaceFactory.class);
@@ -219,7 +220,7 @@
}
public Entry<String, Item>[] query(String queryString) {
- if (queryString.startsWith("importedBy=")) {
+ if (queryString.startsWith("requiredBy=")) {
// Return the collection of dependencies of the specified
contribution
List<Entry<String, Item>> entries = new
ArrayList<Entry<String,Item>>();
@@ -241,10 +242,8 @@
String key = queryString.substring(11);
for (Contribution contribution:
dependencyWorkspace.getContributions()) {
if (key.equals(contribution.getURI())) {
- entries.add(entry(contribution));
-
ContributionDependencyAnalyzer analyzer = new
ContributionDependencyAnalyzer();
- Set<Contribution> dependencies =
analyzer.calculateContributionDependencies(dependencyWorkspace, contribution);
+ List<Contribution> dependencies =
analyzer.calculateContributionDependencies(dependencyWorkspace, contribution);
// Build the collection of dependencies
for (Contribution dependency: dependencies) {
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=633220&r1=633219&r2=633220&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
Mon Mar 3 10:13:51 2008
@@ -20,9 +20,11 @@
package org.apache.tuscany.sca.workspace.admin.impl;
import java.io.File;
-import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URLDecoder;
import java.util.List;
import javax.servlet.ServletException;
@@ -86,13 +88,38 @@
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
- // Download a contribution
- String path = request.getPathInfo();
+ // Download a contribution file
+ String requestURI = URLDecoder.decode(request.getRequestURI(),
"UTF-8");
+ String path = requestURI.substring(request.getServletPath().length());
if (path.startsWith("/")) {
path = path.substring(1);
}
try {
- FileInputStream is = new FileInputStream(new File(files, path));
+ URI uri = URI.create(path);
+
+ // Default to file protocol
+ if (uri.getScheme() == null) {
+ uri = new File(files, path).toURI();
+ }
+
+ // Support the following syntaxes
+ // foo.jar!/file.txt
+ // directory!/file.txt
+ // directory/!/file.txt
+ String str = uri.toString();
+ int e = str.indexOf("!/");
+ if (e != -1) {
+ int s = str.lastIndexOf('/', e - 2) +1;
+ if (str.substring(s, e).contains(".")) {
+ str = "jar:" + str;
+ } else {
+ str = str.substring(0, e) + str.substring(e + 1);
+ }
+ uri = URI.create(str);
+ }
+
+ // Read the file and write to response
+ InputStream is = uri.toURL().openStream();
ServletOutputStream os = response.getOutputStream();
byte[] buffer = new byte[4096];
for (;;) {
@@ -104,6 +131,7 @@
}
is.close();
os.flush();
+
} catch (FileNotFoundException e) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
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=633220&r1=633219&r2=633220&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
Mon Mar 3 10:13:51 2008
@@ -35,6 +35,8 @@
import org.apache.tuscany.sca.assembly.AssemblyFactory;
import org.apache.tuscany.sca.assembly.Composite;
+import org.apache.tuscany.sca.assembly.xml.CompositeDocumentProcessor;
+import org.apache.tuscany.sca.assembly.xml.CompositeProcessor;
import org.apache.tuscany.sca.contribution.Contribution;
import org.apache.tuscany.sca.contribution.ContributionFactory;
import org.apache.tuscany.sca.contribution.DefaultModelFactoryExtensionPoint;
@@ -48,6 +50,8 @@
import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor;
import
org.apache.tuscany.sca.contribution.processor.URLArtifactProcessorExtensionPoint;
import
org.apache.tuscany.sca.contribution.resolver.DefaultModelResolverExtensionPoint;
+import org.apache.tuscany.sca.contribution.resolver.ExtensibleModelResolver;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
import
org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint;
import org.apache.tuscany.sca.contribution.service.ContributionReadException;
import
org.apache.tuscany.sca.contribution.xml.ContributionGeneratedMetadataDocumentProcessor;
@@ -56,13 +60,16 @@
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.policy.PolicyFactory;
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.ContributionInfoProcessor;
+import
org.apache.tuscany.sca.workspace.processor.impl.ContributionContentProcessor;
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;
/**
* Implementation of a deployable composite collection service.
@@ -70,13 +77,16 @@
* @version $Rev$ $Date$
*/
@Scope("COMPOSITE")
-public class DeployableCompositeCollectionImpl implements CompositeCollection {
[EMAIL PROTECTED](interfaces={CompositeCollection.class,
LocalCompositeCollection.class})
+public class DeployableCompositeCollectionImpl implements CompositeCollection,
LocalCompositeCollection {
@Reference
public LocalContributionCollection contributionCollection;
+ private ModelFactoryExtensionPoint modelFactories;
+ private ModelResolverExtensionPoint modelResolvers;
private AssemblyFactory assemblyFactory;
- private URLArtifactProcessor<Contribution> contributionInfoProcessor;
+ private URLArtifactProcessor<Contribution> contributionContentProcessor;
/**
* Initialize the workspace administration component.
@@ -85,27 +95,31 @@
public void init() throws IOException, ContributionReadException,
XMLStreamException, ParserConfigurationException {
// Create factories
- ModelFactoryExtensionPoint modelFactories = new
DefaultModelFactoryExtensionPoint();
+ modelFactories = new DefaultModelFactoryExtensionPoint();
assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
XMLInputFactory inputFactory =
modelFactories.getFactory(XMLInputFactory.class);
XMLOutputFactory 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
- ModelResolverExtensionPoint modelResolvers = new
DefaultModelResolverExtensionPoint();
+ 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));
URLArtifactProcessorExtensionPoint urlProcessors = new
DefaultURLArtifactProcessorExtensionPoint(modelFactories);
URLArtifactProcessor<Object> urlProcessor = new
ExtensibleURLArtifactProcessor(urlProcessors);
urlProcessors.addArtifactProcessor(new
ContributionMetadataDocumentProcessor(staxProcessor, inputFactory));
urlProcessors.addArtifactProcessor(new
ContributionGeneratedMetadataDocumentProcessor(staxProcessor, inputFactory));
+ urlProcessors.addArtifactProcessor(new
CompositeDocumentProcessor(staxProcessor, inputFactory));
- // Create contribution info processor
- contributionInfoProcessor = new
ContributionInfoProcessor(modelFactories, modelResolvers, urlProcessor);
+ // Create contribution processors
+ contributionContentProcessor = new
ContributionContentProcessor(modelFactories, modelResolvers, urlProcessor);
}
@@ -122,7 +136,9 @@
try {
URI uri = URI.create(contributionEntry.getKey());
URL url = url(contributionEntry.getData().getLink());
- contribution =
(Contribution)contributionInfoProcessor.read(null, uri, url);
+ 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);
}
@@ -133,7 +149,7 @@
entry.setKey(name(deployable.getName()));
Item item = new Item();
item.setTitle(name(deployable.getName()));
- item.setLink("/workspace/" + contribution.getURI());
+ item.setLink(deployableLink(contribution.getLocation(),
deployable.getURI()));
entry.setData(item);
entries.add(entry);
}
@@ -171,14 +187,16 @@
try {
contributionItem = contributionCollection.get(key);
} catch (NotFoundException e) {
- return null;
+ return entries.toArray(new Entry[entries.size()]);
}
Contribution contribution;
try {
URI uri = URI.create(key);
URL url = url(contributionItem.getLink());
- contribution =
(Contribution)contributionInfoProcessor.read(null, uri, url);
+ 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);
}
@@ -189,7 +207,7 @@
entry.setKey(name(deployable.getName()));
Item item = new Item();
item.setTitle(name(deployable.getName()));
- item.setLink("/workspace/" + deployable.getURI());
+ item.setLink(deployableLink(contribution.getLocation(),
deployable.getURI()));
entry.setData(item);
entries.add(entry);
}
@@ -198,6 +216,15 @@
} else {
throw new UnsupportedOperationException();
+ }
+ }
+
+ private static String deployableLink(String contributionLocation, String
deployableURI) {
+ URI uri = URI.create(contributionLocation);
+ if (uri.getPath().startsWith("/files/")) {
+ return contributionLocation + "!/" + deployableURI;
+ } else {
+ return "/files/" + contributionLocation + "!/" + deployableURI;
}
}
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=633220&r1=633219&r2=633220&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
Mon Mar 3 10:13:51 2008
@@ -22,6 +22,13 @@
targetNamespace="http://tuscany.apache.org/xmlns/sca/1.0"
name="Admin">
+ <component name="AdminUI">
+ <t:implementation.widget location="home.html"/>
+ <service name="Widget">
+ <t:binding.http uri="http://localhost:9990/ui/home"/>
+ </service>
+ </component>
+
<component name="ContributionUI">
<t:implementation.widget location="workspace.html"/>
<service name="Widget">
@@ -47,7 +54,7 @@
<service name="Widget">
<t:binding.http uri="http://localhost:9990/ui/composite"/>
</service>
- <reference name="domainComposite"
target="DomainCompositeCollectionComponent">
+ <reference name="domainComposite"
target="DomainCompositeCollectionComponent/CompositeCollection">
<t:binding.atom/>
</reference>
</component>
@@ -57,7 +64,7 @@
<service name="Widget">
<t:binding.http uri="http://localhost:9990/ui/cloud"/>
</service>
- <reference name="cloudComposite"
target="CloudCollectionComponent">
+ <reference name="cloudComposite"
target="CloudCollectionComponent/CompositeCollection">
<t:binding.atom/>
</reference>
</component>
@@ -92,6 +99,7 @@
<service name="CompositeCollection">
<t:binding.atom uri="http://localhost:9990/composite"/>
</service>
+ <reference name="deployableCompositeCollection"
target="DeployableCompositeCollectionComponent/LocalCompositeCollection"/>
</component>
<component name="DeployableCompositeCollectionComponent">
@@ -108,6 +116,7 @@
<service name="CompositeCollection">
<t:binding.atom uri="http://localhost:9990/cloud"/>
</service>
+ <reference name="deployableCompositeCollection"
target="DeployableCompositeCollectionComponent/LocalCompositeCollection"/>
</component>
</composite>
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=633220&r1=633219&r2=633220&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
Mon Mar 3 10:13:51 2008
@@ -21,6 +21,7 @@
<title>SCA Node Cloud</title>
<script type="text/javascript" src="cloud.js"></script>
+<script type="text/javascript" src="utils.js"></script>
<script language="JavaScript">
@@ -50,7 +51,7 @@
}
function deleteComposite() {
- var composites = document.cloudCompositeForm.composites;
+ var composites = array(document.cloudCompositeForm.composites);
for (var i = 0; i < composites.length; i++) {
if (composites[i].checked) {
var id = composites[i].value;
@@ -82,24 +83,29 @@
}
getComposites();
+
</script>
</head>
-<body>
+<body onload="toolbar()">
+ <div id="toolbar"></div>
+
<div id="cloudComposite">
<p style="font-size:150%">
- <b>SCA Node Cloud</b> <a href="/cloud/"><img src="icons/feed-icon.png"
border="0"></a>
+ <b>SCA Domain</b><br><br><b>Node Cloud</b> <a href="/cloud/"><img
src="icons/feed-icon.png" border="0"></a>
</p>
<form name="cloudCompositeForm">
<div id="composites" ></div>
<br/>
+ <input type="button" onClick="startComposite()" value="Start" />
+ <input type="button" onClick="stopComposite()" value="Stop" />
+
<input type="button" onClick="deleteComposite()" value="Delete" />
- <a href="/cloud/">(feed)</a>
</form>
<br/>
- <b>Add Composite</b>
+ <b>Add Node</b>
<form name="newCompositeForm">
<table border="0">
<tr><td>QName:</td><td><input type="text" name="compositeQName"
/></td></tr>
@@ -111,4 +117,5 @@
</div>
</body>
+
</html>
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=633220&r1=633219&r2=633220&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
Mon Mar 3 10:13:51 2008
@@ -21,6 +21,7 @@
<title>SCA Domain Composites</title>
<script type="text/javascript" src="composite.js"></script>
+<script type="text/javascript" src="utils.js"></script>
<script language="JavaScript">
@@ -50,7 +51,7 @@
}
function deleteComposite() {
- var composites = document.domainCompositeForm.composites;
+ var composites =
array(document.domainCompositeForm.composites);
for (var i = 0; i < composites.length; i++) {
if (composites[i].checked) {
var id = composites[i].value;
@@ -86,10 +87,12 @@
</head>
-<body>
+<body onload="toolbar()">
+ <div id="toolbar"></div>
+
<div id="domainComposite">
<p style="font-size:150%">
- <b>SCA Domain Composites</b> <a href="/composite/"><img
src="icons/feed-icon.png" border="0"></a>
+ <b>SCA Domain</b><br><br><b>Included Composites</b> <a
href="/composite/"><img src="icons/feed-icon.png" border="0"></a>
</p>
<form name="domainCompositeForm">
<div id="composites" ></div>
Modified:
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/files.html
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/files.html?rev=633220&r1=633219&r2=633220&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/files.html
(original)
+++
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/files.html
Mon Mar 3 10:13:51 2008
@@ -21,6 +21,7 @@
<title>SCA Contribution File Server</title>
<script type="text/javascript" src="files.js"></script>
+<script type="text/javascript" src="utils.js"></script>
<script language="JavaScript">
@@ -46,7 +47,7 @@
}
function deleteFile() {
- var list = document.filesForm.files;
+ var list = array(document.filesForm.files);
for (var i=0; i < list.length; i++) {
if (list[i].checked) {
var id = list[i].value;
@@ -68,10 +69,12 @@
</head>
-<body>
+<body onload="toolbar()">
+ <div id="toolbar"></div>
+
<div id="fileServer">
<p style="font-size:150%">
- <b>SCA Contribution Files</b> <a href="/feed/files/"><img
src="icons/feed-icon.png" border="0"></a>
+ <b>SCA Contribution File Server</b> <a href="/feed/files/"><img
src="icons/feed-icon.png" border="0"></a>
</p>
<form name="filesForm">
<div id="files" ></div>
Added:
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/home.html
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/home.html?rev=633220&view=auto
==============================================================================
---
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/home.html
(added)
+++
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/home.html
Mon Mar 3 10:13:51 2008
@@ -0,0 +1,47 @@
+<!--
+ * 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.
+-->
+<html>
+<head>
+<title>SCA Admin</title>
+
+<script type="text/javascript" src="home.js"></script>
+<script type="text/javascript" src="utils.js"></script>
+
+<script language="JavaScript">
+</script>
+
+</head>
+
+<body onload="toolbar()">
+ <div id="toolbar"></div>
+
+ <p style="font-size:150%">
+ <b>SCA Domain</b>
+ </p>
+
+ <br><br><br><br><br>
+ <form>
+ <table border="0" align="center">
+ <tr><td valign="top"><span style="font-size:150%; color:
blue">Search:</span></td><td><input type="text" name="search"
size="50"/></td></tr>
+ <tr><td></td><td align="center"><input type="button" name="search"
value="Search" /></td></tr>
+ </table>
+ </form>
+
+</body>
+</html>
Propchange:
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/home.html
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/home.html
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added:
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/utils.js
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/utils.js?rev=633220&view=auto
==============================================================================
---
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/utils.js
(added)
+++
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/utils.js
Mon Mar 3 10:13:51 2008
@@ -0,0 +1,74 @@
+/*
+ * 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.
+ */
+
+function Tool(name, href) {
+ this.name = name;
+ this.href = href;
+}
+
+Tool.prototype.print = function() {
+ var loc = '' + location;
+ if (loc.match(this.href) == null) {
+ return '<a href="' + this.href + '" style="color: blue">' +
this.name + '</a>';
+ } else {
+ return '<span>' + this.name + '</span>';
+ }
+}
+
+function toolbar() {
+
+ var toolbar = '<table border="0" cellspacing="0" cellpadding="0"
width="100%" ' +
+ ' style="padding-bottom: 2px; border-bottom: 1px solid blue"><tr>' +
+ '<td>' +
+ '<table border="0" cellspacing="0" cellpadding="0"><tr>';
+
+ for (var i = 0; i < tools.length; i++) {
+ toolbar = toolbar + '<td>' +tools[i].print() +
' </td>'
+ }
+
+ toolbar = toolbar + '</tr></table>' +
+ '</td>' +
+ '<td>' +
+ '<table border="0" cellspacing="0" cellpadding="0" align="right"><tr>' +
+ '<td>' + home.print() + '</td>' +
+ '</tr></table>' +
+ '</td>' +
+ '</tr></table>';
+
+ document.getElementById('toolbar').innerHTML = toolbar;
+}
+
+function array(obj) {
+ if (obj.length == undefined) {
+ var a = new Array();
+ a[0] = obj;
+ return a;
+ }
+ else {
+ return obj;
+ }
+}
+
+var tools = new Array();
+tools[0] = new Tool("Contributions", "/ui/workspace");
+tools[1] = new Tool("Composites", "/ui/composite");
+tools[2] = new Tool("Nodes", "/ui/cloud");
+tools[3] = new Tool("Files", "/ui/files");
+
+var home = new Tool("Home", "/ui/home");
Propchange:
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/utils.js
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/utils.js
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified:
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/workspace.html
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/workspace.html?rev=633220&r1=633219&r2=633220&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/workspace.html
(original)
+++
incubator/tuscany/java/sca/modules/workspace-admin/src/main/resources/workspace.html
Mon Mar 3 10:13:51 2008
@@ -21,6 +21,7 @@
<title>SCA Contributions</title>
<script type="text/javascript" src="workspace.js"></script>
+<script type="text/javascript" src="utils.js"></script>
<script language="JavaScript">
@@ -42,7 +43,7 @@
contributions += '<tr valign="bottom">'
contributions += '<td><input
name="contributions" type="checkbox" value="' + id + '">' +
'<a href=\"' + location + '\">' + id + '</a></td>';
- contributions += '<td> <a
href=\"/workspace/?importedBy=' + id + '\">dependencies</a></td>';
+ contributions += '<td> <a
href=\"/workspace/?requiredBy=' + id + '\">dependencies</a></td>';
contributions += '<td> <a
href=\"/deployable/?contribution=' + id + '\">deployables</a></td>';
contributions += '</tr>';
}
@@ -52,7 +53,7 @@
}
function deleteContribution() {
- var contributions = document.workspaceForm.contributions;
+ var contributions =
array(document.workspaceForm.contributions);
for (var i=0; i < contributions.length; i++) {
if (contributions[i].checked) {
var id = contributions[i].value;
@@ -88,10 +89,12 @@
</head>
-<body>
+<body onload="toolbar()">
+ <div id="toolbar"></div>
+
<div id="workspace">
<p style="font-size:150%">
- <b>SCA Contributions</b> <a href="/workspace/"><img
src="icons/feed-icon.png" border="0"></a>
+ <b>SCA Domain</b><br><br><b>Contributions</b> <a
href="/workspace/"><img src="icons/feed-icon.png" border="0"></a>
</p>
<form name="workspaceForm">
<div id="contributions" ></div>
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=633220&r1=633219&r2=633220&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
Mon Mar 3 10:13:51 2008
@@ -86,12 +86,12 @@
}
public void testDependencies1() {
- Entry<String, Item>[] entries =
contributionCollection.query("importedBy=store");
+ Entry<String, Item>[] entries =
contributionCollection.query("requiredBy=store");
assertEquals(2, entries.length);
}
public void testDependencies2() {
- Entry<String, Item>[] entries =
contributionCollection.query("importedBy=assets");
+ Entry<String, Item>[] entries =
contributionCollection.query("requiredBy=assets");
assertEquals(1, entries.length);
assertEquals("assets", entries[0].getKey());
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]