summaryrefslogtreecommitdiffstats
path: root/sca-java-1.x/contrib/modules/data-engine-helper/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'sca-java-1.x/contrib/modules/data-engine-helper/src/main')
-rw-r--r--sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/ConnectionInfoArtifactProcessor.java197
-rw-r--r--sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/DataAccessEngine.java286
-rw-r--r--sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/DataAccessEngineManager.java141
-rw-r--r--sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/MissingConfigFileException.java44
-rw-r--r--sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/config/ConnectionInfo.java47
-rw-r--r--sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/config/ConnectionProperties.java78
-rw-r--r--sca-java-1.x/contrib/modules/data-engine-helper/src/main/resources/dataengine-helper-validation-messages.properties21
7 files changed, 814 insertions, 0 deletions
diff --git a/sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/ConnectionInfoArtifactProcessor.java b/sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/ConnectionInfoArtifactProcessor.java
new file mode 100644
index 0000000000..99709857b8
--- /dev/null
+++ b/sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/ConnectionInfoArtifactProcessor.java
@@ -0,0 +1,197 @@
+/*
+ * 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.data.engine;
+
+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.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.config.ConnectionInfo;
+import org.apache.tuscany.sca.data.engine.config.ConnectionProperties;
+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 ConnectionInfo.
+ * This processor is shared between implementation.das and implementation.data component type implementations,
+ * and can be used for other applications that require database connectivity information.
+ *
+ * The artifact processor is responsible for processing <ConnectionInfo>
+ * elements in SCA assembly XML composite files.
+ *
+ * @version $Rev$ $Date$
+ */
+public class ConnectionInfoArtifactProcessor implements StAXArtifactProcessor<ConnectionInfo> {
+ public static final QName CONNECTION_INFO = new QName(Constants.SCA10_TUSCANY_NS, "connectionInfo");
+ private static final QName CONNECTION_PROPERTIES = new QName(Constants.SCA10_TUSCANY_NS, "connectionProperties");
+
+ private Monitor monitor;
+ public ConnectionInfoArtifactProcessor(ModelFactoryExtensionPoint modelFactories, Monitor monitor) {
+ this.monitor = monitor;
+ }
+
+ public QName getArtifactType() {
+ // Returns the QName of the XML element processed by this processor
+ return CONNECTION_INFO;
+ }
+
+ /**
+ * Report a exception.
+ *
+ * @param problems
+ * @param message
+ * @param model
+ */
+ private void error(String message, Object model, Exception ex) {
+ if (monitor != null) {
+ Problem problem = new ProblemImpl(this.getClass().getName(), "dataengine-helper-validation-messages", Severity.ERROR, model, message, ex);
+ monitor.problem(problem);
+ }
+ }
+
+ public Class<ConnectionInfo> getModelType() {
+ // Returns the type of model processed by this processor
+ return ConnectionInfo.class;
+ }
+
+ /*
+ * <component name="CompanyDataComponent">
+ * <implementation.data table="company">
+ *
+ * <connectionInfo>
+ * <connectionProperties
+ * driverClass="org.apache.derby.jdbc.EmbeddedDriver"
+ * databaseURL="jdbc:derby:target/test-classes/dastest; create = true"
+ * loginTimeout="600000"/>
+ * </connectionInfo>
+ *
+ * </implementation.data>
+ * </component>
+ */
+ public ConnectionInfo read(XMLStreamReader reader) throws ContributionReadException {
+ assert CONNECTION_INFO.equals(reader.getName());
+
+ // Create a ConnectionInfo from the component type model
+ ConnectionInfo connectionInfo = new ConnectionInfo();
+
+ /*
+ * <connectionInfo dataSource="jdbc:derby:target/test-classes/dastest; create = true"/>
+ */
+ String dataSource = reader.getAttributeValue(null, "datasource"); // exclusive with connection properties
+ if (dataSource != null && dataSource.length() > 0) {
+ connectionInfo.setDataSource(dataSource);
+ } else {
+ try {
+ int event = reader.next();
+ while (event == XMLStreamConstants.CHARACTERS) {
+ event = reader.next();
+ }
+ } catch (XMLStreamException e) {
+ ContributionReadException ce = new ContributionReadException(e);
+ error("ContributionReadException", reader, ce);
+ throw ce;
+ }
+
+ QName element = reader.getName();
+
+ assert CONNECTION_PROPERTIES.equals(element);
+
+ /*
+ * <connectionProperties
+ * driverClass="org.apache.derby.jdbc.EmbeddedDriver"
+ * databaseURL="jdbc:derby:target/test-classes/dastest; create = true"
+ * username=""
+ * password=""
+ * loginTimeout="600000"/>
+ */
+
+ String driverClass = reader.getAttributeValue(null, "driverClass");
+ String databaseURL = reader.getAttributeValue(null, "databaseURL");
+ String username = reader.getAttributeValue(null, "username");
+ String password = reader.getAttributeValue(null, "password");
+ String loginTimeout = reader.getAttributeValue(null, "loginTimeout");
+
+ // FIXME: validation sending info to monitor....
+ ConnectionProperties connectionProperties = new ConnectionProperties();
+ connectionProperties.setDriverClass(driverClass);
+ connectionProperties.setDatabaseURL(databaseURL);
+ connectionProperties.setUsername(username);
+ connectionProperties.setPassword(password);
+ if (loginTimeout != null) {
+ connectionProperties.setLoginTimeout(Integer.parseInt(loginTimeout));
+ }
+
+ connectionInfo.setConnectionProperties(connectionProperties);
+ }
+
+ return connectionInfo;
+ }
+
+ public void resolve(ConnectionInfo impl, ModelResolver resolver) throws ContributionResolveException {
+
+ }
+
+ public void write(ConnectionInfo connectionInfo, XMLStreamWriter writer) throws ContributionWriteException, XMLStreamException {
+
+ writer.writeStartElement(CONNECTION_INFO.getNamespaceURI(), CONNECTION_INFO.getLocalPart());
+
+ if (connectionInfo.getDataSource() != null) {
+ writer.writeAttribute("dataSource", connectionInfo.getDataSource());
+ }
+
+ ConnectionProperties connectionProperties = connectionInfo.getConnectionProperties();
+ if (connectionProperties != null) {
+ writer.writeStartElement(CONNECTION_PROPERTIES.getNamespaceURI(), CONNECTION_PROPERTIES.getLocalPart());
+
+ if (connectionProperties.getDriverClass() != null) {
+ writer.writeAttribute("driverClass", connectionProperties.getDriverClass());
+ }
+ if (connectionProperties.getDatabaseURL() != null) {
+ writer.writeAttribute("databaseURL", connectionProperties.getDatabaseURL());
+ }
+ if (connectionProperties.getUsername() != null) {
+ writer.writeAttribute("username", connectionProperties.getUsername());
+ }
+ if (connectionProperties.getPassword() != null) {
+ writer.writeAttribute("password", connectionProperties.getPassword());
+ }
+ if (connectionProperties.getLoginTimeout() != null) {
+ writer.writeAttribute("loginTimeout", String.valueOf(connectionProperties.getLoginTimeout()));
+ }
+
+ writer.writeEndElement();
+ }
+
+
+ writer.writeEndElement();
+
+ }
+}
diff --git a/sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/DataAccessEngine.java b/sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/DataAccessEngine.java
new file mode 100644
index 0000000000..aef9ac3261
--- /dev/null
+++ b/sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/DataAccessEngine.java
@@ -0,0 +1,286 @@
+/*
+ * 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.data.engine;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.tuscany.das.rdb.Command;
+import org.apache.tuscany.das.rdb.DAS;
+
+import commonj.sdo.DataObject;
+import commonj.sdo.Property;
+
+/**
+ * Facade to hide DAS implementation details of handling commands
+ *
+ * @version $Rev$ $Date$
+ */
+public class DataAccessEngine {
+ private final DAS das;
+
+ public DataAccessEngine(DAS das) {
+ this.das = das;
+ }
+
+ public DataObject executeGet(ArrayList keyVals, String table, String key) {//TODO need to consider compound keys
+ try {
+ String sqlQuery = "select * from " + table.toUpperCase();
+ List<String> keys = null;
+
+ if(key == null) {
+ if(keyVals != null && keyVals.size() == 1) {
+ sqlQuery += " where ID = " + keyVals.get(0);
+ }
+ } else {//can be other than ID , can be compound keys
+ keys = getKeys(key);
+ if(keyVals.size() != keys.size()) {
+ throw new RuntimeException("One or more PK values missing");
+ }
+
+ sqlQuery += " where ";
+
+ for(int i=0; i<keys.size(); i++) {
+ sqlQuery += keys.get(i)+" = ? AND ";
+ }
+
+ sqlQuery = sqlQuery.substring(0, sqlQuery.lastIndexOf(" AND "));
+ }
+
+ Command command = this.das.createCommand(sqlQuery);
+
+ if(key != null) {
+ for(int i=1; i<=keyVals.size(); i++) {
+ command.setParameter(i, keyVals.get(i-1));
+ }
+ }
+
+ DataObject returnDO = command.executeQuery();
+ return returnDO;
+ } catch (Exception e) {
+ //e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ *
+ * @param table table'e Type name - should be same as table name
+ * @param key column's Property name - should be same as column name
+ * @return
+ */
+ public Map<Object, DataObject> executeGetAll(String table, String key) {
+ try {
+ String sqlQuery = "select * from " + table.toUpperCase();
+ Command command = this.das.createCommand(sqlQuery);
+ DataObject result = command.executeQuery();
+ List<String> keys = getKeys(key);
+ List<DataObject> resultDataObjects = result.getList(table);
+
+ return getMappedDataObjects(resultDataObjects, keys);
+ } catch (Exception e) {
+ //e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+ }
+
+ public Map<Object, DataObject> executeQuery(String queryString, String table, String key) {
+ try {
+ Command command = this.das.createCommand(queryString);
+ DataObject result = command.executeQuery();
+ List<String> keys = getKeys(key);
+ List<DataObject> resultDataObjects = result.getList(table);
+
+ return getMappedDataObjects(resultDataObjects, keys);
+ } catch (Exception e) {
+ //e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+ }
+
+ //origDataObject should be with change summary. table, pk is already known to DAS, so no need to have these here
+ public void executePut(DataObject origDataObject) {
+ this.das.applyChanges(origDataObject);
+ return;
+ }
+
+ //return PK/s
+ public ArrayList executePost(DataObject origDataObject, String table, String key){
+ //TODO check that PKs are present before insert - this is not correct for auto incr PKs, so let it be upto user whether to send PK or not
+ /*List<String> keys = getKeys(key);
+ for(int i=0; i<keys.size(); i++) {
+ String currentKey = keys.get(i);
+ Object currentKeyValue = origDataObject.get(currentKey);
+ if(currentKeyValue == null) {
+ throw new RuntimeException("PK missing during INSERT");
+ }
+ }*/
+
+ String sqlString = "insert into "+table+" (";
+ List props = origDataObject.getType().getProperties();
+ if(props.size() != 0) {
+ for(int i=0; i<props.size(); i++) {
+ String currPropName = ((Property)props.get(i)).getName();
+ if(origDataObject.get(currPropName) != null) {
+ sqlString += currPropName+",";
+ }
+ }
+ sqlString = sqlString.substring(0, sqlString.length()-1);
+ sqlString += ") values (";
+ for(int i=0; i<props.size(); i++) {
+ String currPropName = ((Property)props.get(i)).getName();
+ if(origDataObject.get(currPropName) != null) {
+ sqlString += "?,";
+ }
+ }
+
+ sqlString = sqlString.substring(0, sqlString.length()-1);
+ sqlString += ")";
+
+ Command insertCommand = this.das.createCommand(sqlString);
+ int paramIdx = 1;
+ for(int i=1; i<=props.size(); i++) {
+ String currPropName = ((Property)props.get(i-1)).getName();
+ if(origDataObject.get(currPropName) != null) {
+ insertCommand.setParameter(paramIdx, origDataObject.get(currPropName));
+ paramIdx++;
+ }
+ }
+
+ insertCommand.execute();
+
+ //there can be different possibilities
+ //1- there is autogen key - insertCommand.getGeneratedKey() will return value and not exception
+ //2- there is no autogen key - insertCommand.getGeneratedKey() will return exception and value needs to be taken from origDataObject
+ //for 2 it is straight forward to know the column name same as property name
+ //for 1 it is possible for only 1 column so no question of compound PK
+
+ //now get the PK/s to be returned
+ ArrayList pks = new ArrayList();
+
+ try {
+ int newId = insertCommand.getGeneratedKey();
+ pks.add(newId);
+ return pks;
+ } catch(Exception e) {
+ List<String> keys = getKeys(key);
+ for(int i=0; i<keys.size(); i++) {
+ String currentKey = keys.get(i);
+ Object currentKeyValue = origDataObject.get(currentKey);
+ if(currentKeyValue == null) {
+ throw new RuntimeException("PK missing during INSERT");
+ }
+ pks.add(currentKeyValue);
+ }
+ return pks;
+ }
+
+ }
+ return null;
+ }
+
+ //when keyVal is null can be used as deleteAll
+ public void executeDelete(ArrayList keyVals, String table, String key) {
+ try {
+ String sqlQuery = "select * from " + table.toUpperCase();
+ List<String> keys = null;
+
+ if(key == null) {
+ if(keyVals != null && keyVals.size() == 1) {
+ sqlQuery += " where ID = " + keyVals.get(0);
+ }
+ } else {//can be other than ID , can be compound keys
+ keys = getKeys(key);
+ if(keyVals.size() != keys.size()) {
+ throw new RuntimeException("One or more PK values missing");
+ }
+
+ sqlQuery += " where ";
+
+ for(int i=0; i<keys.size(); i++) {
+ sqlQuery += keys.get(i)+" = ? AND ";
+ }
+
+ sqlQuery = sqlQuery.substring(0, sqlQuery.lastIndexOf(" AND "));
+ }
+
+ Command command = this.das.createCommand(sqlQuery);
+
+ if(key != null) {
+ for(int i=1; i<=keyVals.size(); i++) {
+ command.setParameter(i, keyVals.get(i-1));
+ }
+ }
+
+ DataObject result = command.executeQuery();
+ List<DataObject> resultDOs = result.getList(table);
+ if(resultDOs != null) {
+ for(int i=0; i<resultDOs.size(); i++) {
+ ((DataObject)resultDOs.get(i)).delete();
+ }
+ }
+ this.das.applyChanges(result);
+ } catch (Exception e) {
+ //e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+ }
+
+ public Map<Object, DataObject> getMappedDataObjects(List<DataObject> resultDataObjects, List<String> keys) {
+ Map<Object, DataObject> resultMap = new HashMap<Object, DataObject>();
+ ArrayList<Object> keyCols = null;
+ for(int j=0; j<resultDataObjects.size(); j++) {
+ DataObject currentDO = resultDataObjects.get(j);
+
+ keyCols = new ArrayList<Object>();
+ for(int i=0; i<keys.size(); i++) {
+ String currentKey = keys.get(i);
+ Object currentKeyValue = currentDO.get(currentKey);
+ keyCols.add(currentKeyValue);
+ }
+
+ resultMap.put(keyCols, currentDO);
+ }
+ return resultMap;
+ }
+
+ public static List<String> getKeys(String key) {
+ String[] keys = key.split(",");
+ return Arrays.asList(keys);
+ }
+
+ public DataObject executeCommand(String commandName) {
+ try {
+ Command command = this.das.getCommand(commandName);
+ return command.executeQuery();
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ public DataObject executeCommand(String commandName, String xPath) {
+ DataObject root = executeCommand(commandName);
+ return root.getDataObject(xPath);
+ }
+}
diff --git a/sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/DataAccessEngineManager.java b/sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/DataAccessEngineManager.java
new file mode 100644
index 0000000000..572c190037
--- /dev/null
+++ b/sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/DataAccessEngineManager.java
@@ -0,0 +1,141 @@
+/*
+ * 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.data.engine;
+
+import java.io.InputStream;
+import java.util.List;
+
+import org.apache.tuscany.das.rdb.ConfigHelper;
+import org.apache.tuscany.das.rdb.DAS;
+import org.apache.tuscany.das.rdb.config.wrapper.MappingWrapper;
+import org.apache.tuscany.sca.data.engine.config.ConnectionInfo;
+
+/**
+ * The DataAccessEngineManager acts like a registry and factory for DAS instances
+ * It holds DAS by it's config file name, reusing the same DAS for all components
+ * using the same config file.
+ *
+ * @version $Rev$ $Date$
+ */
+public class DataAccessEngineManager {
+ //private final Map<String, DAS> registry = new HashMap<String, DAS>();
+
+ public DataAccessEngineManager() {
+ super();
+ }
+
+ protected DAS initializeDAS(String config, ConnectionInfo connectionInfo, String table, String pkColumns) throws MissingConfigFileException {
+ //load the config file
+ //System.out.println("Initializing DAS");
+
+ ConfigHelper configHelper;
+
+ if(config == null) {
+ //no config information
+ configHelper = new ConfigHelper();
+ } else {
+ //initialize the config helper by loading config file
+ configHelper = new ConfigHelper(this.getConfigStream(config));
+ }
+
+ //add additional connectionInfo if provided in the SCA Composite file
+ if( connectionInfo != null) {
+ String dataSource = connectionInfo.getDataSource();
+ if(dataSource != null && dataSource.length() > 0) {
+ configHelper.addConnectionInfo(dataSource);
+ } else {
+ String driverClass = connectionInfo.getConnectionProperties().getDriverClass();
+ String connectionURL = connectionInfo.getConnectionProperties().getDatabaseURL();
+ String userName = connectionInfo.getConnectionProperties().getUsername();
+ String password = connectionInfo.getConnectionProperties().getPassword();
+ int loginTimeout = connectionInfo.getConnectionProperties().getLoginTimeout();
+
+ configHelper.addConnectionInfo(driverClass, connectionURL, userName, password, loginTimeout);
+ }
+
+ }
+
+ if(table != null && pkColumns != null) {
+ MappingWrapper configWrapper = new MappingWrapper(configHelper.getConfig());
+ List<String> pkColsList = DataAccessEngine.getKeys(pkColumns);
+ for(int i=0; i<pkColsList.size(); i++) {
+ configWrapper.addPrimaryKey(table+"."+pkColsList.get(i), pkColsList.get(i));
+ }
+ }
+
+ DAS das = DAS.FACTORY.createDAS(configHelper.getConfig());
+
+ return das;
+ }
+
+/*
+ public DAS getDAS(String config) throws MissingConfigFileException {
+ //DAS das = registry.get(config);
+ //if ( das == null) {
+ // das = this.initializeDAS(config);
+ // this.registry.put(config, das);
+ //}
+ return initializeDAS(config, null);
+ }
+
+ public DAS getDAS(ConnectionInfo connectionInfo) {
+ assert connectionInfo != null;
+
+ //FIXME: cache the das, we need to define the keys to use (datasource and databaseurl + hashed(username + password))
+ DAS das = null;
+ try {
+ das = initializeDAS(null, connectionInfo);
+ }catch (MissingConfigFileException e) {
+ //this should never happen, as configFile == null
+ }
+
+ return das;
+ }
+*/
+ public DAS getDAS(String config, ConnectionInfo connectionInfo) throws MissingConfigFileException {
+ assert connectionInfo != null;
+
+ //FIXME: cache the das, we need to define the keys to use (datasource and databaseurl + hashed(username + password))
+
+ return initializeDAS(config, connectionInfo, null, null);
+ }
+
+ public DAS getDAS(String config, ConnectionInfo connectionInfo, String table, String pkColumns) throws MissingConfigFileException {
+ assert connectionInfo != null;
+
+ //FIXME: cache the das, we need to define the keys to use (datasource and databaseurl + hashed(username + password))
+
+ return initializeDAS(config, connectionInfo, table, pkColumns);
+ }
+
+ protected InputStream getConfigStream(String config) throws MissingConfigFileException{
+ InputStream configStream = null;
+
+ try {
+ configStream = this.getClass().getClassLoader().getResourceAsStream(config);
+ } catch (Exception e) {
+ throw new MissingConfigFileException(config);
+ }
+
+ return configStream;
+ }
+
+
+}
diff --git a/sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/MissingConfigFileException.java b/sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/MissingConfigFileException.java
new file mode 100644
index 0000000000..a010e089e9
--- /dev/null
+++ b/sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/MissingConfigFileException.java
@@ -0,0 +1,44 @@
+/*
+ * 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.data.engine;
+
+import org.apache.tuscany.sca.contribution.service.ContributionReadException;
+
+
+/**
+ * Exception to be used when DAS configuration side file is not available
+ *
+ * @version $Rev$ $Date$
+ */
+public class MissingConfigFileException extends ContributionReadException {
+
+ private static final long serialVersionUID = -2616590185174691724L;
+
+ public MissingConfigFileException(String message) {
+ super(message);
+ }
+
+ public MissingConfigFileException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public MissingConfigFileException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/config/ConnectionInfo.java b/sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/config/ConnectionInfo.java
new file mode 100644
index 0000000000..c72308f733
--- /dev/null
+++ b/sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/config/ConnectionInfo.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.data.engine.config;
+
+/**
+ * Database connection information to be used for implementation.data
+ *
+ * @version $Rev$ $Date$
+ */
+public class ConnectionInfo {
+ private ConnectionProperties connectionProperties;
+
+ private String dataSource;
+
+ public String getDataSource() {
+ return this.dataSource;
+ }
+
+ public void setDataSource(String dataSource) {
+ this.dataSource = dataSource;
+ }
+
+ public ConnectionProperties getConnectionProperties() {
+ return this.connectionProperties;
+ }
+
+ public void setConnectionProperties(ConnectionProperties connectionProperties) {
+ this.connectionProperties = connectionProperties;
+ }
+
+}
diff --git a/sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/config/ConnectionProperties.java b/sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/config/ConnectionProperties.java
new file mode 100644
index 0000000000..df08a970b3
--- /dev/null
+++ b/sca-java-1.x/contrib/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/config/ConnectionProperties.java
@@ -0,0 +1,78 @@
+/*
+ * 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.data.engine.config;
+
+/**
+ * Database connection properties to be used for implementation.data
+ *
+ * @version $Rev$ $Date$
+ */
+public class ConnectionProperties {
+
+ private String driverClass;
+
+ private String databaseURL;
+
+ private String userName;
+
+ private String password;
+
+ private Integer loginTimeOut;
+
+ public String getDriverClass() {
+ return this.driverClass;
+ }
+
+ public void setDriverClass(String driverClass) {
+ this.driverClass = driverClass;
+ }
+
+ public String getDatabaseURL() {
+ return this.databaseURL;
+ }
+
+ public void setDatabaseURL(String databaseURL) {
+ this.databaseURL = databaseURL;
+ }
+
+ public String getUsername() {
+ return this.userName;
+ }
+
+ public void setUsername(String userName) {
+ this.userName = userName;
+ }
+
+ public String getPassword() {
+ return this.password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public Integer getLoginTimeout() {
+ return this.loginTimeOut;
+ }
+
+ public void setLoginTimeout(Integer loginTimeOut) {
+ this.loginTimeOut = loginTimeOut;
+ }
+
+}
diff --git a/sca-java-1.x/contrib/modules/data-engine-helper/src/main/resources/dataengine-helper-validation-messages.properties b/sca-java-1.x/contrib/modules/data-engine-helper/src/main/resources/dataengine-helper-validation-messages.properties
new file mode 100644
index 0000000000..b040d69cc5
--- /dev/null
+++ b/sca-java-1.x/contrib/modules/data-engine-helper/src/main/resources/dataengine-helper-validation-messages.properties
@@ -0,0 +1,21 @@
+#
+#
+# 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.
+#
+#
+ContributionReadException = ContributionReadException occured due to : \ No newline at end of file