summaryrefslogtreecommitdiffstats
path: root/sca-java-1.x/tags/java-M1-final/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java
diff options
context:
space:
mode:
Diffstat (limited to 'sca-java-1.x/tags/java-M1-final/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java')
-rw-r--r--sca-java-1.x/tags/java-M1-final/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java206
1 files changed, 206 insertions, 0 deletions
diff --git a/sca-java-1.x/tags/java-M1-final/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java b/sca-java-1.x/tags/java-M1-final/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java
new file mode 100644
index 0000000000..3243ba2388
--- /dev/null
+++ b/sca-java-1.x/tags/java-M1-final/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/UpdateGenerator.java
@@ -0,0 +1,206 @@
+/**
+*
+* Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
+*
+* Licensed 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.das.rdb.generator.impl;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.tuscany.das.rdb.Converter;
+import org.apache.tuscany.das.rdb.Parameter;
+import org.apache.tuscany.das.rdb.config.Column;
+import org.apache.tuscany.das.rdb.config.Table;
+import org.apache.tuscany.das.rdb.config.wrapper.MappingWrapper;
+import org.apache.tuscany.das.rdb.config.wrapper.RelationshipWrapper;
+import org.apache.tuscany.das.rdb.config.wrapper.TableWrapper;
+import org.apache.tuscany.das.rdb.impl.OptimisticWriteCommandImpl;
+import org.apache.tuscany.das.rdb.impl.ParameterImpl;
+import org.apache.tuscany.das.rdb.impl.UpdateCommandImpl;
+import org.apache.tuscany.das.rdb.util.DebugUtil;
+
+import commonj.sdo.ChangeSummary;
+import commonj.sdo.DataObject;
+import commonj.sdo.Property;
+import commonj.sdo.Type;
+
+public class UpdateGenerator {
+
+ private boolean debug = false;
+
+ public static UpdateGenerator instance = new UpdateGenerator();
+
+ public UpdateGenerator() {
+ super();
+ }
+
+ public UpdateCommandImpl getUpdateCommand(MappingWrapper mapping, DataObject changedObject, Table table) {
+ ArrayList parameters = new ArrayList();
+ Type type = changedObject.getType();
+ TableWrapper t = new TableWrapper(table);
+ StringBuffer statement = new StringBuffer("update ");
+ statement.append(table.getName());
+ statement.append(" set ");
+
+
+ ChangeSummary summary = changedObject.getDataGraph().getChangeSummary();
+ Iterator i = getChangedFields(mapping, summary, changedObject).iterator();
+
+ while (i.hasNext()) {
+ Property attr = (Property) i.next();
+ Column c = t.getColumnByPropertyName(attr.getName());
+ if ((c != null) && (c.isCollision() || c.isPrimaryKey())) {
+ // get rid of comma if OCC or PK is last field
+ if (!i.hasNext()) {
+ statement
+ .delete(statement.length() - 2, statement.length());
+ }
+ } else {
+ parameters.add(attr);
+ statement.append(c == null ? attr.getName() : c.getName());
+ statement.append(" = ?");
+ if (i.hasNext())
+ statement.append(", ");
+ }
+ }
+
+ statement.append(" where ");
+
+ Iterator names = t.getPrimaryKeyNames().iterator();
+ Iterator properties = t.getPrimaryKeyProperties().iterator();
+ while (names.hasNext() && properties.hasNext()) {
+ String name = (String) names.next();
+ String property = (String) properties.next();
+ statement.append(name);
+ statement.append(" = ?");
+ if (names.hasNext() && properties.hasNext())
+ statement.append(" and ");
+ parameters.add(type.getProperty(property));
+ }
+
+ if (t.getCollisionColumn() != null) {
+ statement.append(" and ");
+ statement.append(t.getCollisionColumn().getName());
+ statement.append(" = ?");
+ parameters.add(type.getProperty(t.getCollisionColumnPropertyName()));
+ }
+
+
+ UpdateCommandImpl updateCommand;
+ if ( t.getCollisionColumn() != null )
+ updateCommand = new OptimisticWriteCommandImpl(statement.toString());
+ else
+ updateCommand = new UpdateCommandImpl(statement.toString());
+
+ Iterator params = parameters.iterator();
+ for (int idx = 1; params.hasNext(); idx++ ) {
+ Property p = (Property)params.next();
+ Parameter param = new ParameterImpl();
+ param.setName(p.getName());
+ param.setType(p.getType());
+ param.setConverter(getConverter(t, p.getName()));
+ param.setIndex(idx);
+ updateCommand.addParameter(param);
+ }
+ DebugUtil.debugln(getClass(), debug, statement.toString());
+ return updateCommand;
+ }
+
+ private List getAttributeProperties(DataObject obj) {
+ ArrayList fields = new ArrayList();
+ Iterator i = obj.getType().getProperties().iterator();
+ while ( i.hasNext() ) {
+ Property p = (Property) i.next();
+ if ( p.getType().isDataType())
+ fields.add(p);
+ }
+ return fields;
+ }
+
+
+ private List getChangedFields(MappingWrapper mapping, ChangeSummary summary, DataObject obj) {
+ ArrayList changes = new ArrayList();
+ Iterator i = summary.getOldValues(obj).iterator();
+ while (i.hasNext()) {
+ ChangeSummary.Setting setting = (ChangeSummary.Setting) i.next();
+ if (setting.getProperty().getType().isDataType()) {
+ changes.add(setting.getProperty());
+ } else {
+ Property ref = setting.getProperty();
+ if ( !ref.isMany() ) {
+ RelationshipWrapper r = new RelationshipWrapper(mapping.getRelationshipByReference(ref));
+
+ Iterator keys = r.getForeignKeys().iterator();
+ while ( keys.hasNext()) {
+ String key = (String) keys.next();
+ Property p = obj.getType().getProperty(key);
+ changes.add(p);
+ }
+ }
+
+ }
+ }
+ return changes;
+ }
+
+
+ private Converter getConverter(TableWrapper tw, String name) {
+ String converter = tw.getConverter(name);
+ if ( converter != null ) {
+ try {
+ return (Converter) Class.forName(converter).newInstance();
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+ return null;
+ }
+
+ public Collection getUpdateParameters(DataObject changedObject, Table table) {
+ Type type = changedObject.getType();
+ TableWrapper wrapper = new TableWrapper(table);
+ Collection pkNames = wrapper.getPrimaryKeyProperties();
+ ArrayList parameters = new ArrayList();
+ ArrayList pkParams = new ArrayList();
+
+ Iterator i = getAttributeProperties(changedObject).iterator();
+ while (i.hasNext()) {
+ Property attr = (Property) i.next();
+ String field = attr.getName();
+
+ Parameter p = getParameter(wrapper, type.getProperty(field));
+ if (pkNames.contains(field)) {
+ pkParams.add(p);
+ } else {
+ parameters.add(p);
+ }
+ }
+ parameters.addAll(pkParams);
+ return parameters;
+
+ }
+
+ private Parameter getParameter(TableWrapper wrapper, Property property) {
+ Parameter param = new ParameterImpl();
+ param.setName(property.getName());
+ param.setType(property.getType());
+ param.setConverter(getConverter(wrapper, property.getName()));
+
+ return param;
+ }
+}
+