summaryrefslogtreecommitdiffstats
path: root/branches/trunk-20080910/modules/implementation-das/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/Constants.java33
-rw-r--r--branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/DAS.java49
-rw-r--r--branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/DASImplementation.java146
-rw-r--r--branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/DASImplementationFactory.java36
-rw-r--r--branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/DASImplementationProcessor.java271
-rw-r--r--branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/DefaultDASImplementationFactory.java46
-rw-r--r--branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/annotations/Command.java36
-rw-r--r--branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/provider/DASImplementationProvider.java75
-rw-r--r--branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/provider/DASImplementationProviderFactory.java47
-rw-r--r--branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/provider/DASInvoker.java87
-rw-r--r--branches/trunk-20080910/modules/implementation-das/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor19
-rw-r--r--branches/trunk-20080910/modules/implementation-das/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory19
-rw-r--r--branches/trunk-20080910/modules/implementation-das/src/main/resources/impl-das-validation-messages.properties23
-rw-r--r--branches/trunk-20080910/modules/implementation-das/src/test/java/org/apache/tuscany/sca/implementation/das/DASImplementationProcessorTestCase.java179
-rw-r--r--branches/trunk-20080910/modules/implementation-das/src/test/java/org/apache/tuscany/sca/implementation/das/DASTestCase.java73
-rw-r--r--branches/trunk-20080910/modules/implementation-das/src/test/java/org/apache/tuscany/sca/implementation/das/company/CompanyService.java33
-rw-r--r--branches/trunk-20080910/modules/implementation-das/src/test/java/org/apache/tuscany/sca/implementation/das/company/CompanyServiceTestCase.java62
-rw-r--r--branches/trunk-20080910/modules/implementation-das/src/test/resources/company.componentType29
-rw-r--r--branches/trunk-20080910/modules/implementation-das/src/test/resources/company.composite35
-rw-r--r--branches/trunk-20080910/modules/implementation-das/src/test/resources/company.xml45
-rw-r--r--branches/trunk-20080910/modules/implementation-das/src/test/resources/das.composite35
21 files changed, 1378 insertions, 0 deletions
diff --git a/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/Constants.java b/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/Constants.java
new file mode 100644
index 0000000000..b0b4b132e6
--- /dev/null
+++ b/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/Constants.java
@@ -0,0 +1,33 @@
+/*
+ * 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.implementation.das;
+
+/**
+ * Generic constants used in this implementation
+ *
+ * @version $Rev$ $Date$
+ */
+public interface Constants {
+ /**
+ * Identify Relation Database data store
+ */
+ String DATA_ACCESS_TYPE_RDB = "rdb";
+
+}
diff --git a/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/DAS.java b/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/DAS.java
new file mode 100644
index 0000000000..1fc46ea710
--- /dev/null
+++ b/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/DAS.java
@@ -0,0 +1,49 @@
+/*
+ * 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.implementation.das;
+
+import commonj.sdo.DataObject;
+
+
+/**
+ * The service interface of a DAS service provided by DAS components.
+ *
+ * @version $Rev$ $Date$
+ */
+public interface DAS {
+
+ /**
+ * Execute a DAS Command specified on the DAS config file.
+ * @param commandName The name of the command
+ * @return
+ */
+ DataObject executeCommand(String commandName);
+
+ /**Execute a DAS Command specified on the DAS config file,
+ * and narrow the results based on the provided XPath
+ *
+ * @param commandName The name of the command
+ * @param xPath The xPath filter
+ * @return
+ */
+ DataObject executeCommand(String commandName, String xPath);
+
+
+
+}
diff --git a/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/DASImplementation.java b/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/DASImplementation.java
new file mode 100644
index 0000000000..0e0c689b41
--- /dev/null
+++ b/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/DASImplementation.java
@@ -0,0 +1,146 @@
+/*
+ * 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.implementation.das;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.assembly.ConstrainingType;
+import org.apache.tuscany.sca.assembly.Implementation;
+import org.apache.tuscany.sca.assembly.Property;
+import org.apache.tuscany.sca.assembly.Reference;
+import org.apache.tuscany.sca.assembly.Service;
+import org.apache.tuscany.sca.data.engine.config.ConnectionInfo;
+import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
+
+
+/**
+ * The model representing a sample DAS implementation in an SCA assembly model.
+ *
+ * @version $Rev$ $Date$
+ */
+public class DASImplementation implements Implementation {
+
+ private String dasConfig;
+ private String dataAccessType;
+
+ private ConnectionInfo connectionInfo;
+
+ private boolean unresolved;
+ private List<Service> services = new ArrayList<Service>();
+
+ /**
+ * Constructs a new DAS implementation.
+ */
+ public DASImplementation(AssemblyFactory assemblyFactory,
+ JavaInterfaceFactory javaFactory) {
+
+ // DAS implementation always provide a single service exposing
+ // the DAS interface, and have no references and properties
+ Service dasService = null;
+ dasService = assemblyFactory.createService();
+ dasService.setName("DAS");
+ JavaInterface javaInterface;
+ try {
+ javaInterface = javaFactory.createJavaInterface(DAS.class);
+ } catch (InvalidInterfaceException e) {
+ throw new IllegalArgumentException(e);
+ }
+ JavaInterfaceContract interfaceContract = javaFactory.createJavaInterfaceContract();
+ interfaceContract.setInterface(javaInterface);
+ dasService.setInterfaceContract(interfaceContract);
+
+ services.add(dasService);
+ }
+
+ /* DAS Model Information */
+
+ public String getConfig() {
+ return this.dasConfig;
+ }
+
+ public void setConfig(String config) {
+ this.dasConfig = config;
+ }
+
+ public String getDataAccessType() {
+ return this.dataAccessType;
+ }
+
+ public void setDataAccessType (String dataAccessType) {
+ this.dataAccessType = dataAccessType;
+ }
+
+ public ConnectionInfo getConnectionInfo() {
+ return this.connectionInfo;
+ }
+
+ public void setConnectionInfo(ConnectionInfo connectionInfo) {
+ this.connectionInfo = connectionInfo;
+ }
+
+ /* SCA Model Information */
+
+ public ConstrainingType getConstrainingType() {
+ // DAS implementation does not support constrainingTypes
+ return null;
+ }
+
+ public List<Property> getProperties() {
+ // DAS implementation does not support properties
+ return Collections.emptyList();
+ }
+
+ public List<Reference> getReferences() {
+ // DAS implementation does not support references
+ return Collections.emptyList();
+ }
+
+ public List<Service> getServices() {
+ return services;
+ }
+
+ public String getURI() {
+ // DAS implementation does not have a URI
+ return null;
+ }
+
+ public boolean isUnresolved() {
+ return unresolved;
+ }
+
+ public void setConstrainingType(ConstrainingType constrainingType) {
+ // DAS implementation does not support constrainingTypes
+ }
+
+ public void setURI(String uri) {
+ // DAS implementation does not have a URI
+
+ }
+
+ public void setUnresolved(boolean undefined) {
+ this.unresolved = undefined;
+ }
+
+}
diff --git a/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/DASImplementationFactory.java b/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/DASImplementationFactory.java
new file mode 100644
index 0000000000..93d22d2d5a
--- /dev/null
+++ b/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/DASImplementationFactory.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tuscany.sca.implementation.das;
+
+/**
+ * A factory for the sample DAS implementation model.
+ *
+ * @version $Rev$ $Date$
+ */
+public interface DASImplementationFactory {
+
+ /**
+ * Creates a new CRUD implementation.
+ *
+ * @return
+ */
+ DASImplementation createDASImplementation();
+
+}
diff --git a/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/DASImplementationProcessor.java b/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/DASImplementationProcessor.java
new file mode 100644
index 0000000000..0e90c90082
--- /dev/null
+++ b/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/DASImplementationProcessor.java
@@ -0,0 +1,271 @@
+/*
+ * 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.implementation.das;
+
+import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamConstants;
+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.ComponentType;
+import org.apache.tuscany.sca.assembly.Property;
+import org.apache.tuscany.sca.assembly.Service;
+import org.apache.tuscany.sca.assembly.builder.impl.ProblemImpl;
+import org.apache.tuscany.sca.assembly.xml.Constants;
+import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+import org.apache.tuscany.sca.contribution.service.ContributionReadException;
+import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
+import org.apache.tuscany.sca.contribution.service.ContributionWriteException;
+import org.apache.tuscany.sca.data.engine.ConnectionInfoArtifactProcessor;
+import org.apache.tuscany.sca.data.engine.config.ConnectionInfo;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
+import org.apache.tuscany.sca.monitor.Monitor;
+import org.apache.tuscany.sca.monitor.Problem;
+import org.apache.tuscany.sca.monitor.Problem.Severity;
+
+
+/**
+ * Implements a StAX artifact processor for DAS implementations.
+ *
+ * The artifact processor is responsible for processing <implementation.das>
+ * elements in SCA assembly XML composite files and populating the DAS
+ * implementation model, resolving its references to other artifacts in the SCA
+ * contribution, and optionally write the model back to SCA assembly XML.
+ *
+ * @version $Rev$ $Date$
+ */
+public class DASImplementationProcessor implements StAXArtifactProcessor<DASImplementation> {
+ private static final QName IMPLEMENTATION_DAS = new QName(Constants.SCA10_TUSCANY_NS, "implementation.das");
+
+ private DASImplementationFactory dasFactory;
+
+ private final AssemblyFactory assemblyFactory;
+ private final JavaInterfaceFactory javaFactory;
+ private Monitor monitor;
+ private StAXArtifactProcessor<ConnectionInfo> connectionInfoProcessor;
+
+ public DASImplementationProcessor(ModelFactoryExtensionPoint modelFactories, Monitor monitor) {
+ assemblyFactory = modelFactories.getFactory(AssemblyFactory.class);
+ javaFactory = modelFactories.getFactory(JavaInterfaceFactory.class);
+ this.monitor = monitor;
+ this.dasFactory = new DefaultDASImplementationFactory(assemblyFactory, javaFactory);
+ this.connectionInfoProcessor = new ConnectionInfoArtifactProcessor(modelFactories, this.monitor);
+ }
+
+ public QName getArtifactType() {
+ // Returns the QName of the XML element processed by this processor
+ return IMPLEMENTATION_DAS;
+ }
+
+ public Class<DASImplementation> getModelType() {
+ // Returns the type of model processed by this processor
+ return DASImplementation.class;
+ }
+
+ /**
+ * Report a error.
+ *
+ * @param problems
+ * @param message
+ * @param model
+ */
+ private void error(String message, Object model, Object... messageParameters) {
+ if (monitor != null) {
+ Problem problem = new ProblemImpl(this.getClass().getName(), "impl-das-validation-messages", Severity.ERROR, model, message, (Object[])messageParameters);
+ monitor.problem(problem);
+ }
+ }
+
+ /*
+ * <component name="CompanyDataComponent">
+ * <implementation.das config="/CompanyConfig.xml" dataAccessType="rdb">
+ * <connectionInfo>
+ * <connectionProperties
+ * driverClass="org.apache.derby.jdbc.EmbeddedDriver"
+ * databaseURL="jdbc:derby:target/test-classes/dastest; create = true"
+ * loginTimeout="600000"/>
+ * </connectionInfo>
+ * </implementation.data>
+ * </component>
+ */
+ public DASImplementation read(XMLStreamReader reader) throws ContributionReadException, XMLStreamException {
+ assert IMPLEMENTATION_DAS.equals(reader.getName());
+
+ // Read an <implementation.das> element
+
+ // Create an initialize the DAS implementation model
+ DASImplementation implementation = null;
+
+ // Read the das config file attribute.
+ // This is das configuration side file to use
+ String config = reader.getAttributeValue(null, "config");
+
+ // Read the data access type attribute
+ // This is the type of data store in use (e.g RDB, XML, etc)
+ String dataAccessType = reader.getAttributeValue(null, "dataAccessType");
+
+ // Both config and dataAccessType are required attributes, hence validating.
+ if (config == null || dataAccessType == null) {
+ if (config == null)
+ error("ConfigAttributeMissing", reader);
+ if (dataAccessType == null)
+ error("DataAccessTypeAttributeMissing", reader);
+ return implementation;
+ }
+
+ // Create an initialize the DAS implementation model
+ implementation = dasFactory.createDASImplementation();
+ implementation.setConfig(config);
+ implementation.setDataAccessType(dataAccessType);
+ implementation.setUnresolved(true);
+
+ while (true) {
+ int event = reader.next();
+ switch (event) {
+
+ case START_ELEMENT:
+ if (ConnectionInfoArtifactProcessor.CONNECTION_INFO.equals(reader.getName())) {
+
+ // Read connection info
+ ConnectionInfo connectionInfo = (ConnectionInfo) connectionInfoProcessor.read(reader);
+ implementation.setConnectionInfo(connectionInfo);
+ }
+ break;
+ case XMLStreamConstants.END_ELEMENT:
+ if (IMPLEMENTATION_DAS.equals(reader.getName())) {
+ return implementation;
+ }
+ break;
+ }
+ }
+ }
+
+ public void resolve(DASImplementation impl, ModelResolver resolver) throws ContributionResolveException {
+ if( impl != null && impl.isUnresolved()) {
+ //resolve component type
+ mergeComponentType(resolver, impl);
+
+ //set current implementation resolved
+ impl.setUnresolved(false);
+ }
+ }
+
+ public void write(DASImplementation implementation, XMLStreamWriter writer) throws ContributionWriteException, XMLStreamException {
+
+ writer.writeStartElement(IMPLEMENTATION_DAS.getNamespaceURI(), IMPLEMENTATION_DAS.getLocalPart());
+
+ if (implementation.getConfig() != null) {
+ writer.writeAttribute("config", implementation.getConfig());
+ }
+ if (implementation.getDataAccessType() != null) {
+ writer.writeAttribute("dataAccessType", implementation.getDataAccessType());
+ }
+
+ if (implementation.getConnectionInfo() != null) {
+ connectionInfoProcessor.write(implementation.getConnectionInfo(), writer);
+ }
+
+ writer.writeEndElement();
+ }
+
+ /**
+ * Merge the componentType from introspection and external file
+ * @param resolver
+ * @param impl
+ */
+ private void mergeComponentType(ModelResolver resolver, DASImplementation impl) {
+ // FIXME: Need to clarify how to merge
+ ComponentType componentType = getComponentType(resolver, impl);
+ if (componentType != null && !componentType.isUnresolved()) {
+ /*
+ Map<String, Reference> refMap = new HashMap<String, Reference>();
+ for (Reference ref : impl.getReferences()) {
+ refMap.put(ref.getName(), ref);
+ }
+ for (Reference reference : componentType.getReferences()) {
+ refMap.put(reference.getName(), reference);
+ }
+ impl.getReferences().clear();
+ impl.getReferences().addAll(refMap.values());
+
+ // Try to match references by type
+ Map<String, JavaElementImpl> refMembers = impl.getReferenceMembers();
+ for (Reference ref : impl.getReferences()) {
+ if (ref.getInterfaceContract() != null) {
+ Interface i = ref.getInterfaceContract().getInterface();
+ if (i instanceof JavaInterface) {
+ Class<?> type = ((JavaInterface)i).getJavaClass();
+ if (!refMembers.containsKey(ref.getName())) {
+ JavaElementImpl e = getMemeber(impl, ref.getName(), type);
+ if (e != null) {
+ refMembers.put(ref.getName(), e);
+ }
+ }
+ }
+ }
+ }*/
+
+ Map<String, Service> serviceMap = new HashMap<String, Service>();
+ for (Service svc : impl.getServices()) {
+ if(svc != null) {
+ serviceMap.put(svc.getName(), svc);
+ }
+ }
+ for (Service service : componentType.getServices()) {
+ serviceMap.put(service.getName(), service);
+ }
+ impl.getServices().clear();
+ impl.getServices().addAll(serviceMap.values());
+
+ Map<String, Property> propMap = new HashMap<String, Property>();
+ for (Property prop : impl.getProperties()) {
+ propMap.put(prop.getName(), prop);
+ }
+ }
+ }
+
+ private String getFileName(String filePath) {
+ int pos = filePath.lastIndexOf(".");
+
+ return filePath.substring(0, pos);
+
+ }
+
+ private ComponentType getComponentType(ModelResolver resolver, DASImplementation impl) {
+ String dasConfig = this.getFileName(impl.getConfig());
+ String componentTypeURI = dasConfig.replace('.', '/') + ".componentType";
+ ComponentType componentType = assemblyFactory.createComponentType();
+ componentType.setUnresolved(true);
+ componentType.setURI(componentTypeURI);
+ componentType = resolver.resolveModel(ComponentType.class, componentType);
+ if (!componentType.isUnresolved()) {
+ return componentType;
+ }
+ return null;
+ }
+}
diff --git a/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/DefaultDASImplementationFactory.java b/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/DefaultDASImplementationFactory.java
new file mode 100644
index 0000000000..2e18541b3b
--- /dev/null
+++ b/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/DefaultDASImplementationFactory.java
@@ -0,0 +1,46 @@
+/*
+ * 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.implementation.das;
+
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
+
+
+/**
+ * A default factory for the DAS implementation model.
+ *
+ * @version $Rev$ $Date$
+ */
+public class DefaultDASImplementationFactory implements DASImplementationFactory {
+
+ private AssemblyFactory assemblyFactory;
+ private JavaInterfaceFactory javaFactory;
+
+ public DefaultDASImplementationFactory(AssemblyFactory assemblyFactory,
+ JavaInterfaceFactory javaFactory) {
+ this.assemblyFactory = assemblyFactory;
+ this.javaFactory = javaFactory;
+ }
+
+ public DASImplementation createDASImplementation() {
+ return new DASImplementation(assemblyFactory, javaFactory);
+ }
+
+}
diff --git a/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/annotations/Command.java b/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/annotations/Command.java
new file mode 100644
index 0000000000..c8c3fd75e6
--- /dev/null
+++ b/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/annotations/Command.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tuscany.sca.implementation.das.annotations;
+
+/**
+ *
+ * @version $Rev$ $Date$
+ */
+public @interface Command {
+ enum TYPE {SELECT, INSERT, DELETE, UPDATE}
+
+ /**
+ * Defines an Ad hoc command query
+ * @return
+ */
+ String query() default "";
+
+ TYPE type() default TYPE.SELECT;
+}
diff --git a/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/provider/DASImplementationProvider.java b/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/provider/DASImplementationProvider.java
new file mode 100644
index 0000000000..40f414b7ef
--- /dev/null
+++ b/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/provider/DASImplementationProvider.java
@@ -0,0 +1,75 @@
+/*
+ * 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.implementation.das.provider;
+
+import org.apache.tuscany.das.rdb.DAS;
+import org.apache.tuscany.sca.data.engine.DataAccessEngine;
+import org.apache.tuscany.sca.data.engine.DataAccessEngineManager;
+import org.apache.tuscany.sca.implementation.das.DASImplementation;
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.invocation.Invoker;
+import org.apache.tuscany.sca.provider.ImplementationProvider;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentService;
+
+/**
+ * DAS Implementation provider
+ *
+ * @version $Rev$ $Date$
+ */
+public class DASImplementationProvider implements ImplementationProvider {
+
+ private RuntimeComponent component;
+ private DASImplementation implementation;
+ private final DataAccessEngineManager dataAccessEngineManager;
+
+ /**
+ * Constructs a new DAS implementation.
+ */
+ public DASImplementationProvider(RuntimeComponent component, DASImplementation implementation) {
+ this.component = component;
+ this.implementation = implementation;
+ this.dataAccessEngineManager = new DataAccessEngineManager();
+ }
+
+ public Invoker createInvoker(RuntimeComponentService service, Operation operation) {
+ DAS das = null;
+ try {
+ das = dataAccessEngineManager.getDAS(implementation.getConfig(), implementation.getConnectionInfo());
+ } catch(Exception e) {
+ e.printStackTrace();
+ //what now ?
+ }
+ DASInvoker invoker = new DASInvoker(operation, new DataAccessEngine(das) );
+ return invoker;
+ }
+
+ public boolean supportsOneWayInvocation() {
+ return false;
+ }
+
+ public void start() {
+ System.out.println("Starting " + component.getName());
+ }
+
+ public void stop() {
+ System.out.println("Stopping " + component.getName());
+ }
+
+}
diff --git a/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/provider/DASImplementationProviderFactory.java b/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/provider/DASImplementationProviderFactory.java
new file mode 100644
index 0000000000..3ce182347c
--- /dev/null
+++ b/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/provider/DASImplementationProviderFactory.java
@@ -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.
+ */
+package org.apache.tuscany.sca.implementation.das.provider;
+
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.implementation.das.DASImplementation;
+import org.apache.tuscany.sca.provider.ImplementationProvider;
+import org.apache.tuscany.sca.provider.ImplementationProviderFactory;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+
+/**
+ * Factory for DAS Implementation Provider
+ *
+ * @version $Rev$ $Date$
+ */
+public class DASImplementationProviderFactory implements ImplementationProviderFactory<DASImplementation> {
+
+ /**
+ * Constructs a new DAS implementation.
+ */
+ public DASImplementationProviderFactory(ExtensionPointRegistry extensionPoints) {
+ }
+
+ public ImplementationProvider createImplementationProvider(RuntimeComponent component, DASImplementation implementation) {
+ return new DASImplementationProvider(component, implementation);
+ }
+
+ public Class<DASImplementation> getModelType() {
+ return DASImplementation.class;
+ }
+}
diff --git a/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/provider/DASInvoker.java b/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/provider/DASInvoker.java
new file mode 100644
index 0000000000..4cd227717c
--- /dev/null
+++ b/branches/trunk-20080910/modules/implementation-das/src/main/java/org/apache/tuscany/sca/implementation/das/provider/DASInvoker.java
@@ -0,0 +1,87 @@
+/*
+ * 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.implementation.das.provider;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.tuscany.sca.data.engine.DataAccessEngine;
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.invocation.Invoker;
+import org.apache.tuscany.sca.invocation.Message;
+
+
+/**
+ * Implements a target invoker for DAS component implementations.
+ *
+ * The target invoker is responsible for dispatching invocations to the particular
+ * component implementation logic. The current component implementation will
+ * dispatch calls to the DAS APIs to retrieve the requested data from the back-end store
+ *
+ * @version $Rev$ $Date$
+ */
+public class DASInvoker implements Invoker {
+ private final Operation operation;
+ private final DataAccessEngine dataAccessEngine;
+
+ public DASInvoker(Operation operation, DataAccessEngine dataAccessEngine) {
+ this.operation = operation;
+ this.dataAccessEngine = dataAccessEngine;
+ }
+
+ public Message invoke(Message msg) {
+ try {
+ Object[] args = msg.getBody();
+ Object resp = doTheWork(args);
+ msg.setBody(resp);
+ } catch (InvocationTargetException e) {
+ msg.setFaultBody(e.getCause());
+ }
+ return msg;
+ }
+
+ public Object doTheWork(Object[] args) throws InvocationTargetException {
+ //check annotation
+// try {
+// Method methodDeclaration = this.getClass().getMethod(operation.getName(), null);
+// methodDeclaration.getAnnotation(org.apache.tuscany.sca.implementation.das.annotations.Command.class);
+// } catch (Exception e) {
+// //ignore
+// }
+
+ //check if static way
+ if (operation.getName().equals("executeCommand")) {
+ String commandName, xPath;
+
+ //simple execute command by name
+ if( args.length == 1){
+ commandName = (String) args[0];
+ return this.dataAccessEngine.executeCommand(commandName);
+ } else {
+ commandName = (String) args[0];
+ xPath = (String) args[1];
+
+ return this.dataAccessEngine.executeCommand(commandName, xPath);
+ }
+ } else { // dynamic mapping to command
+
+ return this.dataAccessEngine.executeCommand(operation.getName());
+ }
+ }
+}
diff --git a/branches/trunk-20080910/modules/implementation-das/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor b/branches/trunk-20080910/modules/implementation-das/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor
new file mode 100644
index 0000000000..417195c684
--- /dev/null
+++ b/branches/trunk-20080910/modules/implementation-das/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor
@@ -0,0 +1,19 @@
+# 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.
+
+# Implementation class for the artifact processor extension
+org.apache.tuscany.sca.implementation.das.DASImplementationProcessor;qname=http://tuscany.apache.org/xmlns/sca/1.0#implementation.das,model=org.apache.tuscany.sca.implementation.das.DASImplementation
diff --git a/branches/trunk-20080910/modules/implementation-das/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory b/branches/trunk-20080910/modules/implementation-das/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory
new file mode 100644
index 0000000000..290f05d03e
--- /dev/null
+++ b/branches/trunk-20080910/modules/implementation-das/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory
@@ -0,0 +1,19 @@
+# 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.
+
+# Implementation class for the implementation extension
+org.apache.tuscany.sca.implementation.das.provider.DASImplementationProviderFactory;model=org.apache.tuscany.sca.implementation.das.DASImplementation
diff --git a/branches/trunk-20080910/modules/implementation-das/src/main/resources/impl-das-validation-messages.properties b/branches/trunk-20080910/modules/implementation-das/src/main/resources/impl-das-validation-messages.properties
new file mode 100644
index 0000000000..a002d3cef0
--- /dev/null
+++ b/branches/trunk-20080910/modules/implementation-das/src/main/resources/impl-das-validation-messages.properties
@@ -0,0 +1,23 @@
+#
+#
+# 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.
+#
+#
+ConfigAttributeMissing = Attribute 'config' is missing.
+DataAccessTypeAttributeMissing = Attribute 'dataAccessType' is missing.
+
diff --git a/branches/trunk-20080910/modules/implementation-das/src/test/java/org/apache/tuscany/sca/implementation/das/DASImplementationProcessorTestCase.java b/branches/trunk-20080910/modules/implementation-das/src/test/java/org/apache/tuscany/sca/implementation/das/DASImplementationProcessorTestCase.java
new file mode 100644
index 0000000000..8659280891
--- /dev/null
+++ b/branches/trunk-20080910/modules/implementation-das/src/test/java/org/apache/tuscany/sca/implementation/das/DASImplementationProcessorTestCase.java
@@ -0,0 +1,179 @@
+/*
+ * 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.implementation.das;
+
+import java.io.StringReader;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamReader;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.assembly.DefaultAssemblyFactory;
+import org.apache.tuscany.sca.assembly.xml.Constants;
+import org.apache.tuscany.sca.contribution.DefaultModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.data.engine.config.ConnectionInfo;
+import org.apache.tuscany.sca.data.engine.config.ConnectionProperties;
+import org.apache.tuscany.sca.interfacedef.java.DefaultJavaInterfaceFactory;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
+import org.apache.tuscany.sca.monitor.Monitor;
+import org.apache.tuscany.sca.monitor.MonitorFactory;
+import org.apache.tuscany.sca.monitor.Problem;
+import org.apache.tuscany.sca.monitor.impl.DefaultMonitorFactoryImpl;
+import org.apache.tuscany.sca.monitor.impl.DefaultMonitorImpl;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class DASImplementationProcessorTestCase extends TestCase {
+
+ protected static final QName IMPLEMENTATION_DAS = new QName(Constants.SCA10_TUSCANY_NS, "implementation.das");
+
+ private static final String COMPOSITE_USING_DATASOURCE =
+ "<?xml version=\"1.0\" encoding=\"ASCII\"?>"
+ + "<composite xmlns=\"http://www.osoa.org/xmlns/sca/1.0\" xmlns:tuscany=\"http://tuscany.apache.org/xmlns/sca/1.0\" targetNamespace=\"http://data\" name=\"data\">"
+ + " <component name=\"DasComponent\">"
+ + " <tuscany:implementation.das config=\"config.xml\" dataAccessType=\"rdb\">"
+ + " <tuscany:connectionInfo datasource=\"dataSource\"/>"
+ + " </tuscany:implementation.das>"
+ + "</component>";
+
+ private static final String COMPOSITE_USING_CONNECTION_PROPERTIES =
+ "<?xml version=\"1.0\" encoding=\"ASCII\"?>"
+ + "<composite xmlns=\"http://www.osoa.org/xmlns/sca/1.0\" xmlns:tuscany=\"http://tuscany.apache.org/xmlns/sca/1.0\" targetNamespace=\"http://data\" name=\"data\">"
+ + " <component name=\"DasComponent\">"
+ + " <tuscany:implementation.das config=\"config.xml\" dataAccessType=\"rdb\">"
+ + " <tuscany:connectionInfo>"
+ + " <tuscany:connectionProperties"
+ + " driverClass=\"driverClass\""
+ + " databaseURL=\"databaseURL\""
+ + " loginTimeout=\"1\"/>"
+ + " </tuscany:connectionInfo>"
+ + " </tuscany:implementation.das>"
+ + "</component>";
+
+ private static final String INVALID_XML =
+ "<?xml version=\"1.0\" encoding=\"ASCII\"?>"
+ + "<composite xmlns=\"http://www.osoa.org/xmlns/sca/1.0\" xmlns:tuscany=\"http://tuscany.apache.org/xmlns/sca/1.0\" targetNamespace=\"http://data\" name=\"data\">"
+ + " <component name=\"DasComponent\">"
+ + " <tuscany:implementation.das>"
+ + " <tuscany:connectionInfo datasource=\"dataSource\"/>"
+ + " </tuscany:implementation.das>"
+ + "</component>";
+
+ private XMLInputFactory xmlFactory;
+ private ModelFactoryExtensionPoint modelFactories;
+ private Monitor monitor;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ xmlFactory = XMLInputFactory.newInstance();
+ // Create a monitor
+ MonitorFactory monitorFactory = new DefaultMonitorFactoryImpl();
+ if (monitorFactory != null)
+ this.monitor = monitorFactory.createMonitor();
+ modelFactories = new DefaultModelFactoryExtensionPoint();
+ AssemblyFactory assemblyFactory = new DefaultAssemblyFactory();
+ modelFactories.addFactory(assemblyFactory);
+ JavaInterfaceFactory javaFactory = new DefaultJavaInterfaceFactory();
+ modelFactories.addFactory(javaFactory);
+ }
+
+ public void testLoadCompositeUsingDatasource() throws Exception {
+ XMLStreamReader reader = xmlFactory.createXMLStreamReader(new StringReader(COMPOSITE_USING_DATASOURCE));
+
+ DASImplementationProcessor dataProcessor = new DASImplementationProcessor(modelFactories, monitor);
+
+ while(true) {
+ int event = reader.next();
+ if(event == XMLStreamConstants.START_ELEMENT && IMPLEMENTATION_DAS.equals(reader.getName())) {
+ break;
+ }
+ }
+
+ DASImplementation implementation = dataProcessor.read(reader);
+
+ assertNotNull(implementation);
+ assertEquals("config.xml", implementation.getConfig());
+ assertEquals("rdb", implementation.getDataAccessType());
+
+ ConnectionInfo connInfo = implementation.getConnectionInfo();
+ assertNotNull(connInfo);
+ assertEquals("dataSource", connInfo.getDataSource());
+
+ ConnectionProperties connProperties = connInfo.getConnectionProperties();
+ assertNull(connProperties);
+ }
+
+ public void testLoadCompositeUsingConnectionProperties() throws Exception {
+ XMLStreamReader reader = xmlFactory.createXMLStreamReader(new StringReader(COMPOSITE_USING_CONNECTION_PROPERTIES));
+
+ DASImplementationProcessor dataProcessor = new DASImplementationProcessor(modelFactories, monitor);
+
+ while(true) {
+ int event = reader.next();
+ if(event == XMLStreamConstants.START_ELEMENT && IMPLEMENTATION_DAS.equals(reader.getName())) {
+ break;
+ }
+ }
+
+ DASImplementation implementation = dataProcessor.read(reader);
+
+ assertNotNull(implementation);
+ assertEquals("config.xml", implementation.getConfig());
+ assertEquals("rdb", implementation.getDataAccessType());
+
+ ConnectionInfo connInfo = implementation.getConnectionInfo();
+ assertNotNull(connInfo);
+ assertNull("dataSource", connInfo.getDataSource());
+
+ ConnectionProperties connProperties = connInfo.getConnectionProperties();
+ assertNotNull(connProperties);
+ assertEquals("driverClass",connProperties.getDriverClass());
+ assertEquals("databaseURL",connProperties.getDatabaseURL());
+ assertEquals(1,connProperties.getLoginTimeout().intValue());
+ }
+
+ /**
+ * Test loading an INVALID implementation.das element from a contribution metadata stream
+ */
+ public void testLoadInvalid() throws Exception {
+ XMLStreamReader reader = xmlFactory.createXMLStreamReader(new StringReader(INVALID_XML));
+
+ DASImplementationProcessor dataProcessor = new DASImplementationProcessor(modelFactories, monitor);
+
+ while(true) {
+ int event = reader.next();
+ if(event == XMLStreamConstants.START_ELEMENT && IMPLEMENTATION_DAS.equals(reader.getName())) {
+ break;
+ }
+ }
+
+ dataProcessor.read(reader);
+ Problem problem = ((DefaultMonitorImpl)monitor).getLastLoggedProblem();
+ assertNotNull(problem);
+ assertEquals("DataAccessTypeAttributeMissing", problem.getMessageId());
+ }
+}
diff --git a/branches/trunk-20080910/modules/implementation-das/src/test/java/org/apache/tuscany/sca/implementation/das/DASTestCase.java b/branches/trunk-20080910/modules/implementation-das/src/test/java/org/apache/tuscany/sca/implementation/das/DASTestCase.java
new file mode 100644
index 0000000000..7d8b4181c1
--- /dev/null
+++ b/branches/trunk-20080910/modules/implementation-das/src/test/java/org/apache/tuscany/sca/implementation/das/DASTestCase.java
@@ -0,0 +1,73 @@
+/*
+ * 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.implementation.das;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.sca.host.embedded.SCADomain;
+
+import commonj.sdo.DataObject;
+
+/**
+ * Tests the DAS service
+ *
+ * @version $Rev$ $Date$
+ */
+public class DASTestCase extends TestCase {
+
+ private SCADomain scaDomain;
+ private DAS dasService;
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Override
+ protected void setUp() throws Exception {
+ scaDomain = SCADomain.newInstance("das.composite");
+ dasService = scaDomain.getService(DAS.class, "DASServiceComponent/DAS");
+
+ }
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Override
+ protected void tearDown() throws Exception {
+ scaDomain.close();
+ }
+
+
+ public void testExecuteCommand() throws Exception {
+ String commandName = "all companies";
+
+ DataObject resultRoot= dasService.executeCommand(commandName);
+ assertNotNull(resultRoot);
+ assertEquals(3, resultRoot.getList("COMPANY").size());
+ }
+
+ public void testExecuteCommandWithFilter() throws Exception {
+ String commandName = "all companies";
+
+ DataObject resultRoot= dasService.executeCommand(commandName, "COMPANY[1]");
+ assertNotNull(resultRoot);
+ }
+
+
+}
diff --git a/branches/trunk-20080910/modules/implementation-das/src/test/java/org/apache/tuscany/sca/implementation/das/company/CompanyService.java b/branches/trunk-20080910/modules/implementation-das/src/test/java/org/apache/tuscany/sca/implementation/das/company/CompanyService.java
new file mode 100644
index 0000000000..63d0c92683
--- /dev/null
+++ b/branches/trunk-20080910/modules/implementation-das/src/test/java/org/apache/tuscany/sca/implementation/das/company/CompanyService.java
@@ -0,0 +1,33 @@
+/*
+ * 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.implementation.das.company;
+
+import org.apache.tuscany.sca.implementation.das.annotations.Command;
+
+import commonj.sdo.DataObject;
+
+/**
+ *
+ * @version $Rev$ $Date$
+ */
+public interface CompanyService {
+ @Command(query="select * from COMPANY")
+ DataObject getCompanies();
+}
diff --git a/branches/trunk-20080910/modules/implementation-das/src/test/java/org/apache/tuscany/sca/implementation/das/company/CompanyServiceTestCase.java b/branches/trunk-20080910/modules/implementation-das/src/test/java/org/apache/tuscany/sca/implementation/das/company/CompanyServiceTestCase.java
new file mode 100644
index 0000000000..565a930ebe
--- /dev/null
+++ b/branches/trunk-20080910/modules/implementation-das/src/test/java/org/apache/tuscany/sca/implementation/das/company/CompanyServiceTestCase.java
@@ -0,0 +1,62 @@
+/*
+ * 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.implementation.das.company;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.sca.host.embedded.SCADomain;
+
+import commonj.sdo.DataObject;
+
+/**
+ * Tests the DAS service
+ *
+ * @version $Rev$ $Date$
+ */
+public class CompanyServiceTestCase extends TestCase {
+
+ private SCADomain scaDomain;
+ private CompanyService dasCompanyService;
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Override
+ protected void setUp() throws Exception {
+ scaDomain = SCADomain.newInstance("company.composite");
+ dasCompanyService = scaDomain.getService(CompanyService.class, "CompanyServiceComponent/CompanyService");
+ }
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Override
+ protected void tearDown() throws Exception {
+ scaDomain.close();
+ }
+
+ public void testGetCompanies() throws Exception {
+ DataObject root = dasCompanyService.getCompanies();
+ assertNotNull(root);
+ String nome = root.getString("COMPANY[1]/NAME");
+ assertEquals("ACME Publishing", root.getString("COMPANY[1]/NAME"));
+ }
+
+}
diff --git a/branches/trunk-20080910/modules/implementation-das/src/test/resources/company.componentType b/branches/trunk-20080910/modules/implementation-das/src/test/resources/company.componentType
new file mode 100644
index 0000000000..5017cfcffd
--- /dev/null
+++ b/branches/trunk-20080910/modules/implementation-das/src/test/resources/company.componentType
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--
+ * 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.
+-->
+<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0"
+ xmlns:wsdli="http://www.w3.org/2006/01/wsdl-instance"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+ <service name="CompanyService">
+ <interface.java interface="org.apache.tuscany.sca.implementation.das.company.CompanyService"/>
+ </service>
+
+</componentType> \ No newline at end of file
diff --git a/branches/trunk-20080910/modules/implementation-das/src/test/resources/company.composite b/branches/trunk-20080910/modules/implementation-das/src/test/resources/company.composite
new file mode 100644
index 0000000000..ee6104360e
--- /dev/null
+++ b/branches/trunk-20080910/modules/implementation-das/src/test/resources/company.composite
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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.
+-->
+<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0"
+ targetNamespace="http://sample/das"
+ name="das">
+
+ <component name="CompanyServiceComponent">
+ <tuscany:implementation.das config="company.xml" dataAccessType="rdb">
+ <tuscany:connectionInfo>
+ <tuscany:connectionProperties
+ driverClass="org.apache.derby.jdbc.EmbeddedDriver"
+ databaseURL="jdbc:derby:target/test-classes/company; create = true"
+ loginTimeout="600000"/>
+ </tuscany:connectionInfo>
+ </tuscany:implementation.das>
+ </component>
+</composite>
diff --git a/branches/trunk-20080910/modules/implementation-das/src/test/resources/company.xml b/branches/trunk-20080910/modules/implementation-das/src/test/resources/company.xml
new file mode 100644
index 0000000000..350c8b99ce
--- /dev/null
+++ b/branches/trunk-20080910/modules/implementation-das/src/test/resources/company.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+ -->
+<Config xmlns="http:///org.apache.tuscany.das.rdb/config.xsd">
+
+ <Command name="getCompanies" SQL="select * from COMPANY" kind="Select"/>
+
+ <Command name="all companies" SQL="select * from COMPANY" kind="Select"/>
+
+ <Command name="all companies and departments" SQL="select * from COMPANY left outer join DEPARTMENT on COMPANY.ID = DEPARTMENT.COMPANYID" kind="Select"/>
+
+ <Command name="all departments for company" SQL="select * from COMPANY inner join DEPARTMENT on COMPANY.ID = DEPARTMENT.COMPANYID where COMPANY.ID = ?" kind="Select"/>
+
+ <Command name="company by id with departments" SQL="select * from COMPANY left outer join DEPARTMENT on COMPANY.ID = DEPARTMENT.COMPANYID where COMPANY.ID = ?" kind="Select"/>
+
+ <Table tableName="COMPANY">
+ <Column columnName="ID" primaryKey="true" generated="true"/>
+ </Table>
+
+ <Table tableName="DEPARTMENT">
+ <Column columnName="ID" primaryKey="true" generated="true"/>
+ </Table>
+
+ <Relationship name="departments" primaryKeyTable="COMPANY" foreignKeyTable="DEPARTMENT" many="true">
+ <KeyPair primaryKeyColumn="ID" foreignKeyColumn="COMPANYID"/>
+ </Relationship>
+
+
+</Config>
diff --git a/branches/trunk-20080910/modules/implementation-das/src/test/resources/das.composite b/branches/trunk-20080910/modules/implementation-das/src/test/resources/das.composite
new file mode 100644
index 0000000000..e54f4390ac
--- /dev/null
+++ b/branches/trunk-20080910/modules/implementation-das/src/test/resources/das.composite
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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.
+-->
+<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0"
+ targetNamespace="http://sample/das"
+ name="das">
+
+ <component name="DASServiceComponent">
+ <tuscany:implementation.das config="company.xml" dataAccessType="rdb">
+ <tuscany:connectionInfo>
+ <tuscany:connectionProperties
+ driverClass="org.apache.derby.jdbc.EmbeddedDriver"
+ databaseURL="jdbc:derby:target/test-classes/company; create = true"
+ loginTimeout="600000"/>
+ </tuscany:connectionInfo>
+ </tuscany:implementation.das>
+ </component>
+</composite>