From 3ac2d800d840f03618fc364090d786effde84b1f Mon Sep 17 00:00:00 2001 From: lresende Date: Wed, 11 Nov 2009 23:13:16 +0000 Subject: Moving 1.x branches git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@835142 13f79535-47bb-0310-9956-ffa450edef68 --- .../engine/ConnectionInfoArtifactProcessor.java | 197 ++++++++++++++ .../tuscany/sca/data/engine/DataAccessEngine.java | 286 +++++++++++++++++++++ .../sca/data/engine/DataAccessEngineManager.java | 141 ++++++++++ .../data/engine/MissingConfigFileException.java | 44 ++++ .../sca/data/engine/config/ConnectionInfo.java | 47 ++++ .../data/engine/config/ConnectionProperties.java | 78 ++++++ 6 files changed, 793 insertions(+) create mode 100644 sca-java-1.x/branches/sca-java-20080910/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/ConnectionInfoArtifactProcessor.java create mode 100644 sca-java-1.x/branches/sca-java-20080910/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/DataAccessEngine.java create mode 100644 sca-java-1.x/branches/sca-java-20080910/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/DataAccessEngineManager.java create mode 100644 sca-java-1.x/branches/sca-java-20080910/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/MissingConfigFileException.java create mode 100644 sca-java-1.x/branches/sca-java-20080910/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/config/ConnectionInfo.java create mode 100644 sca-java-1.x/branches/sca-java-20080910/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/config/ConnectionProperties.java (limited to 'sca-java-1.x/branches/sca-java-20080910/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine') diff --git a/sca-java-1.x/branches/sca-java-20080910/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/ConnectionInfoArtifactProcessor.java b/sca-java-1.x/branches/sca-java-20080910/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/branches/sca-java-20080910/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 + * elements in SCA assembly XML composite files. + * + * @version $Rev$ $Date$ + */ +public class ConnectionInfoArtifactProcessor implements StAXArtifactProcessor { + 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 getModelType() { + // Returns the type of model processed by this processor + return ConnectionInfo.class; + } + + /* + * + * + * + * + * + * + * + * + * + */ + 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(); + + /* + * + */ + 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); + + /* + * + */ + + 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/branches/sca-java-20080910/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/DataAccessEngine.java b/sca-java-1.x/branches/sca-java-20080910/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/branches/sca-java-20080910/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 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 executeGetAll(String table, String key) { + try { + String sqlQuery = "select * from " + table.toUpperCase(); + Command command = this.das.createCommand(sqlQuery); + DataObject result = command.executeQuery(); + List keys = getKeys(key); + List resultDataObjects = result.getList(table); + + return getMappedDataObjects(resultDataObjects, keys); + } catch (Exception e) { + //e.printStackTrace(); + throw new RuntimeException(e); + } + } + + public Map executeQuery(String queryString, String table, String key) { + try { + Command command = this.das.createCommand(queryString); + DataObject result = command.executeQuery(); + List keys = getKeys(key); + List 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 keys = getKeys(key); + for(int i=0; i keys = getKeys(key); + for(int i=0; i 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 resultDOs = result.getList(table); + if(resultDOs != null) { + for(int i=0; i getMappedDataObjects(List resultDataObjects, List keys) { + Map resultMap = new HashMap(); + ArrayList keyCols = null; + for(int j=0; j(); + for(int i=0; i 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/branches/sca-java-20080910/modules/data-engine-helper/src/main/java/org/apache/tuscany/sca/data/engine/DataAccessEngineManager.java b/sca-java-1.x/branches/sca-java-20080910/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/branches/sca-java-20080910/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 registry = new HashMap(); + + 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 pkColsList = DataAccessEngine.getKeys(pkColumns); + for(int i=0; i