/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.tools.workbench.mappingsmodel.query.relational; import java.util.Iterator; import java.util.List; import org.eclipse.persistence.descriptors.ClassDescriptor; import org.eclipse.persistence.descriptors.DescriptorEvent; import org.eclipse.persistence.descriptors.DescriptorQueryManager; import org.eclipse.persistence.oxm.XMLDescriptor; import org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping; import org.eclipse.persistence.queries.DeleteObjectQuery; import org.eclipse.persistence.queries.InsertObjectQuery; import org.eclipse.persistence.queries.ReadAllQuery; import org.eclipse.persistence.queries.ReadObjectQuery; import org.eclipse.persistence.queries.UpdateObjectQuery; import org.eclipse.persistence.tools.workbench.mappingsmodel.MWModel; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.relational.MWRelationalTransactionalPolicy; import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWQueryManager; import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWReadAllQuery; import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWReadObjectQuery; import org.eclipse.persistence.tools.workbench.utility.node.Node; /** * This class holds any custom sql the user has created. */ public final class MWRelationalQueryManager extends MWQueryManager { private volatile MWInsertQuery insertQuery; public final static String INSERT_QUERY_PROPERTY = "insertQuery"; private volatile MWUpdateQuery updateQuery; public final static String UPDATE_QUERY_PROPERTY = "updateQuery"; private volatile MWDeleteQuery deleteQuery; public final static String DELETE_QUERY_PROPERTY = "deleteQuery"; private volatile MWCustomReadObjectQuery readObjectQuery; public final static String READ_OBJECT_QUERY_PROPERTY = "readObjectQuery"; private volatile MWCustomReadAllQuery readAllQuery; public final static String READ_ALL_QUERY_PROPERTY = "readAllQuery"; private String legacyDescriptorAlias; //Toplink persistence use only please private MWRelationalQueryManager() { super(); } public MWRelationalQueryManager(MWRelationalTransactionalPolicy descriptor) { super(descriptor); } @Override protected void initialize() { super.initialize(); this.insertQuery = new MWInsertQuery(this); this.deleteQuery = new MWDeleteQuery(this); this.updateQuery = new MWUpdateQuery(this); this.readObjectQuery = new MWCustomReadObjectQuery(this); this.readAllQuery = new MWCustomReadAllQuery(this); } @Override protected void addChildrenTo(List children) { super.addChildrenTo(children); children.add(this.insertQuery); children.add(this.deleteQuery); children.add(this.updateQuery); children.add(this.readObjectQuery); children.add(this.readAllQuery); } //Persistence public static XMLDescriptor buildDescriptor() { XMLDescriptor descriptor = new XMLDescriptor(); descriptor.setJavaClass(MWRelationalQueryManager.class); descriptor.getInheritancePolicy().setParentClass(MWQueryManager.class); //custom queries XMLCompositeObjectMapping insertQueryMapping = new XMLCompositeObjectMapping(); insertQueryMapping.setAttributeName("insertQuery"); insertQueryMapping.setGetMethodName("getInsertQueryForTopLink"); insertQueryMapping.setSetMethodName("setInsertQueryForTopLink"); insertQueryMapping.setReferenceClass(MWInsertQuery.class); insertQueryMapping.setXPath("insert-query"); descriptor.addMapping(insertQueryMapping); XMLCompositeObjectMapping deleteQueryMapping = new XMLCompositeObjectMapping(); deleteQueryMapping.setAttributeName("deleteQuery"); deleteQueryMapping.setGetMethodName("getDeleteQueryForTopLink"); deleteQueryMapping.setSetMethodName("setDeleteQueryForTopLink"); deleteQueryMapping.setReferenceClass(MWDeleteQuery.class); deleteQueryMapping.setXPath("delete-query"); descriptor.addMapping(deleteQueryMapping); XMLCompositeObjectMapping updateQueryMapping = new XMLCompositeObjectMapping(); updateQueryMapping.setAttributeName("updateQuery"); updateQueryMapping.setGetMethodName("getUpdateQueryForTopLink"); updateQueryMapping.setSetMethodName("setUpdateQueryForTopLink"); updateQueryMapping.setReferenceClass(MWUpdateQuery.class); updateQueryMapping.setXPath("update-query"); descriptor.addMapping(updateQueryMapping); XMLCompositeObjectMapping readObjectQueryMapping = new XMLCompositeObjectMapping(); readObjectQueryMapping.setAttributeName("readObjectQuery"); readObjectQueryMapping.setGetMethodName("getReadObjectQueryForTopLink"); readObjectQueryMapping.setSetMethodName("setReadObjectQueryForTopLink"); readObjectQueryMapping.setReferenceClass(MWCustomReadObjectQuery.class); readObjectQueryMapping.setXPath("read-object-query"); descriptor.addMapping(readObjectQueryMapping); XMLCompositeObjectMapping readAllQueryMapping = new XMLCompositeObjectMapping(); readAllQueryMapping.setAttributeName("readAllQuery"); readAllQueryMapping.setGetMethodName("getReadAllQueryForTopLink"); readAllQueryMapping.setSetMethodName("setReadAllQueryForTopLink"); readAllQueryMapping.setReferenceClass(MWCustomReadAllQuery.class); readAllQueryMapping.setXPath("read-all-query"); descriptor.addMapping(readAllQueryMapping); descriptor.addDirectMapping("insertSQLString", "legacyGetInsertSQLString", "legacySetInsertSQLString", "insert-string/text()"); descriptor.addDirectMapping("updateSQLString", "legacyGetUpdateSQLString", "legacySetUpdateSQLString", "update-string/text()"); descriptor.addDirectMapping("deleteSQLString", "legacyGetDeleteSQLString", "legacySetDeleteSQLString", "delete-string/text()"); descriptor.addDirectMapping("readObjectSQLString", "legacyGetReadObjectSQLString", "legacySetReadObjectSQLString", "read-object-string/text()"); descriptor.addDirectMapping("readAllSQLString", "legacyGetReadAllSQLString", "legacySetReadAllSQLString", "read-all-string/text()"); return descriptor; } public static XMLDescriptor buildStandalone60Descriptor() { XMLDescriptor descriptor = MWModel.legacy60BuildStandardDescriptor(); descriptor.setJavaClass(MWRelationalQueryManager.class); descriptor.getInheritancePolicy().setParentClass(MWQueryManager.class); descriptor.addDirectMapping("insertSQLString", "legacyGetInsertSQLString", "legacySetInsertSQLString", "insert-string/text()"); descriptor.addDirectMapping("updateSQLString", "legacyGetUpdateSQLString", "legacySetUpdateSQLString", "update-string/text()"); descriptor.addDirectMapping("deleteSQLString", "legacyGetDeleteSQLString", "legacySetDeleteSQLString", "delete-string/text()"); descriptor.addDirectMapping("readObjectSQLString", "legacyGetReadObjectSQLString", "legacySetReadObjectSQLString", "read-object-string/text()"); descriptor.addDirectMapping("readAllSQLString", "legacyGetReadAllSQLString", "legacySetReadAllSQLString", "read-all-string/text()"); return descriptor; } public MWReportQuery addReportQuery(String queryName) { return (MWReportQuery) this.addQuery(new MWReportQuery(this, queryName)); } public MWReadAllQuery buildReadAllQuery(String queryName) { return new MWRelationalReadAllQuery(this, queryName); } public MWReadObjectQuery buildReadObjectQuery(String queryName) { return new MWRelationalReadObjectQuery(this, queryName); } public boolean supportsReportQueries() { return true; } public MWDeleteQuery getDeleteQuery() { return this.deleteQuery; } public MWInsertQuery getInsertQuery() { return this.insertQuery; } public MWCustomReadAllQuery getReadAllQuery() { return this.readAllQuery; } public MWCustomReadObjectQuery getReadObjectQuery(){ return this.readObjectQuery; } public MWUpdateQuery getUpdateQuery() { return this.updateQuery; } public void setDeleteQuery(MWDeleteQuery delete) { MWDeleteQuery oldDelete = getDeleteQuery(); this.deleteQuery = delete; firePropertyChanged(DELETE_QUERY_PROPERTY, oldDelete, delete); } public void setDeleteSQLString(String sqlString) { this.deleteQuery.setSQLString(sqlString); } public void setInsertQuery(MWInsertQuery insert) { MWInsertQuery oldInsert = getInsertQuery(); this.insertQuery = insert; firePropertyChanged(INSERT_QUERY_PROPERTY, oldInsert, insert); } public void setInsertSQLString(String sqlString) { this.insertQuery.setSQLString(sqlString); } public void setReadAllQuery(MWCustomReadAllQuery readAll) { MWCustomReadAllQuery oldReadAll = getReadAllQuery(); this.readAllQuery = readAll; firePropertyChanged(READ_ALL_QUERY_PROPERTY, oldReadAll, readAll); } public void setReadAllSQLString(String sqlString) { this.readAllQuery.setSQLString(sqlString); } public void setReadObjectQuery(MWCustomReadObjectQuery readObject) { MWCustomReadObjectQuery oldReadObject = getReadObjectQuery(); this.readObjectQuery = readObject; firePropertyChanged(READ_OBJECT_QUERY_PROPERTY, oldReadObject, readObject); } public void setReadObjectSQLString(String sqlString) { this.readObjectQuery.setSQLString(sqlString); } public void setUpdateQuery(MWUpdateQuery update) { MWUpdateQuery oldUpdate = getUpdateQuery(); this.updateQuery = update; firePropertyChanged(UPDATE_QUERY_PROPERTY, oldUpdate, update); } public void setUpdateSQLString(String sqlString) { this.updateQuery.setSQLString(sqlString); } public void notifyExpressionsToRecalculateQueryables(){ for (Iterator queries = queries(); queries.hasNext();) { ((MWRelationalQuery) queries.next()).notifyExpressionsToRecalculateQueryables(); } } //TopLink use only private MWInsertQuery getInsertQueryForTopLink() { return this.insertQuery; } //TopLink use only private MWDeleteQuery getDeleteQueryForTopLink() { return this.deleteQuery; } //TopLink use only private MWUpdateQuery getUpdateQueryForTopLink() { return this.updateQuery; } //TopLink use only private MWCustomReadObjectQuery getReadObjectQueryForTopLink() { return this.readObjectQuery; } //TopLink use only private MWCustomReadAllQuery getReadAllQueryForTopLink() { return this.readAllQuery; } //TopLink use only private void setInsertQueryForTopLink(MWInsertQuery query) { if (query != null) { this.insertQuery = query; } } //TopLink use only private void setDeleteQueryForTopLink(MWDeleteQuery query) { if (query != null) { this.deleteQuery = query; } } //TopLink use only private void setUpdateQueryForTopLink(MWUpdateQuery query) { if (query != null) { this.updateQuery = query; } } //TopLink use only private void setReadObjectQueryForTopLink(MWCustomReadObjectQuery query) { if (query != null) { this.readObjectQuery = query; } } //TopLink use only private void setReadAllQueryForTopLink(MWCustomReadAllQuery query) { if (query != null) { this.readAllQuery = query; } } @Override protected void legacy60PostBuild(DescriptorEvent event) { super.legacy60PostBuild(event); // Checks null since in cases where sql was specified, // these object will be not null. if (this.deleteQuery == null) { this.deleteQuery = new MWDeleteQuery(this); } if (this.insertQuery == null) { this.insertQuery = new MWInsertQuery(this); } if (this.readAllQuery == null) { this.readAllQuery = new MWCustomReadAllQuery(this); } if (this.readObjectQuery == null) { this.readObjectQuery = new MWCustomReadObjectQuery(this);; } if (this.updateQuery == null) { this.updateQuery = new MWUpdateQuery(this); } } //for legacy TopLink use only private String legacyGetInsertSQLString() { return null; } //for legacy TopLink use only private String legacyGetUpdateSQLString() { return null; } //for legacy TopLink use only private String legacyGetDeleteSQLString() { return null; } //for legacy TopLink use only private String legacyGetReadObjectSQLString() { return null; } //for legacy TopLink use only private String legacyGetReadAllSQLString() { return null; } //for legacy TopLink use only private void legacySetInsertSQLString(String sql) { if (sql != null) { this.insertQuery = new MWInsertQuery(this); this.insertQuery.setQueryFormatType(MWRelationalQuery.SQL_FORMAT); MWSQLQueryFormat queryFormat = (MWSQLQueryFormat)this.insertQuery.getQueryFormat(); queryFormat.legacySetQueryStringForTopLink(sql); } } //for legacy TopLink use only private void legacySetUpdateSQLString(String sql) { if (sql != null) { this.updateQuery = new MWUpdateQuery(this); this.updateQuery.setQueryFormatType(MWRelationalQuery.SQL_FORMAT); MWSQLQueryFormat queryFormat = (MWSQLQueryFormat)this.updateQuery.getQueryFormat(); queryFormat.legacySetQueryStringForTopLink(sql); } } //for legacy TopLink use only private void legacySetDeleteSQLString(String sql) { if (sql != null) { this.deleteQuery = new MWDeleteQuery(this); this.deleteQuery.setQueryFormatType(MWRelationalQuery.SQL_FORMAT); MWSQLQueryFormat queryFormat = (MWSQLQueryFormat)this.deleteQuery.getQueryFormat(); queryFormat.legacySetQueryStringForTopLink(sql); } } //for legacy TopLink use only private void legacySetReadObjectSQLString(String sql) { if (sql != null) { this.readObjectQuery = new MWCustomReadObjectQuery(this); this.readObjectQuery.setQueryFormatType(MWRelationalQuery.SQL_FORMAT); MWSQLQueryFormat queryFormat = (MWSQLQueryFormat)this.readObjectQuery.getQueryFormat(); queryFormat.legacySetQueryStringForTopLink(sql); } } //for legacy TopLink use only private void legacySetReadAllSQLString(String sql) { if (sql != null) { this.readAllQuery = new MWCustomReadAllQuery(this); this.readAllQuery.setQueryFormatType(MWRelationalQuery.SQL_FORMAT); MWSQLQueryFormat queryFormat = (MWSQLQueryFormat)this.readAllQuery.getQueryFormat(); queryFormat.legacySetQueryStringForTopLink(sql); } } //Conversion methods public void adjustRuntimeDescriptor(ClassDescriptor runtimeDescriptor) { super.adjustRuntimeDescriptor(runtimeDescriptor); DescriptorQueryManager rtQueryManager = (DescriptorQueryManager) runtimeDescriptor.getQueryManager(); // Custom Calls if (!this.deleteQuery.isContentEmpty()) { DeleteObjectQuery rtDeleteQuery = (DeleteObjectQuery)this.deleteQuery.buildRuntimeQuery(); this.deleteQuery.adjustRuntimeQuery(rtDeleteQuery); rtQueryManager.setDeleteQuery(rtDeleteQuery); } if (!this.insertQuery.isContentEmpty()) { InsertObjectQuery rtInsertQuery = (InsertObjectQuery)this.insertQuery.buildRuntimeQuery(); this.insertQuery.adjustRuntimeQuery(rtInsertQuery); rtQueryManager.setInsertQuery(rtInsertQuery); } if (!this.updateQuery.isContentEmpty()) { UpdateObjectQuery rtUpdateQuery = (UpdateObjectQuery)this.updateQuery.buildRuntimeQuery(); this.updateQuery.adjustRuntimeQuery(rtUpdateQuery); rtQueryManager.setUpdateQuery(rtUpdateQuery); } if (!this.readAllQuery.isContentEmpty()) { ReadAllQuery rtReadAllQuery = (ReadAllQuery)this.readAllQuery.buildRuntimeQuery(); this.readAllQuery.adjustRuntimeQuery(rtReadAllQuery); rtQueryManager.setReadAllQuery(rtReadAllQuery); } if (!this.readObjectQuery.isContentEmpty()) { ReadObjectQuery rtReadObjectQuery = (ReadObjectQuery)this.readObjectQuery.buildRuntimeQuery(); this.readObjectQuery.adjustRuntimeQuery(rtReadObjectQuery); rtQueryManager.setReadObjectQuery(rtReadObjectQuery); } } public void adjustFromRuntimeDescriptor(ClassDescriptor runtimeDescriptor) { super.adjustFromRuntime(runtimeDescriptor); DescriptorQueryManager rtQueryManager = (DescriptorQueryManager) runtimeDescriptor.getQueryManager(); // Custom Calls DeleteObjectQuery rtDeleteQuery = (DeleteObjectQuery)this.deleteQuery.buildRuntimeQuery(); this.deleteQuery.adjustRuntimeQuery(rtDeleteQuery); rtQueryManager.setDeleteQuery(rtDeleteQuery); InsertObjectQuery rtInsertQuery = (InsertObjectQuery)this.insertQuery.buildRuntimeQuery(); this.insertQuery.adjustRuntimeQuery(rtInsertQuery); rtQueryManager.setInsertQuery(rtInsertQuery); UpdateObjectQuery rtUpdateQuery = (UpdateObjectQuery)this.updateQuery.buildRuntimeQuery(); this.updateQuery.adjustRuntimeQuery(rtUpdateQuery); rtQueryManager.setUpdateQuery(rtUpdateQuery); ReadAllQuery rtReadAllQuery = (ReadAllQuery)this.readAllQuery.buildRuntimeQuery(); this.readAllQuery.adjustRuntimeQuery(rtReadAllQuery); rtQueryManager.setReadAllQuery(rtReadAllQuery); ReadObjectQuery rtReadObjectQuery = (ReadObjectQuery)this.readObjectQuery.buildRuntimeQuery(); this.readObjectQuery.adjustRuntimeQuery(rtReadObjectQuery); rtQueryManager.setReadObjectQuery(rtReadObjectQuery); } public static XMLDescriptor legacy60BuildDescriptor() { XMLDescriptor descriptor = MWModel.legacy60BuildStandardDescriptor(); descriptor.setJavaClass(MWRelationalQueryManager.class); descriptor.getInheritancePolicy().setParentClass(MWQueryManager.class); descriptor.addDirectMapping("insertSQLString", "legacyGetInsertSQLString", "legacySetInsertSQLString", "insert-string/text()"); descriptor.addDirectMapping("updateSQLString", "legacyGetUpdateSQLString", "legacySetUpdateSQLString", "update-string/text()"); descriptor.addDirectMapping("deleteSQLString", "legacyGetDeleteSQLString", "legacySetDeleteSQLString", "delete-string/text()"); descriptor.addDirectMapping("readObjectSQLString", "legacyGetReadObjectSQLString", "legacySetReadObjectSQLString", "read-object-string/text()"); descriptor.addDirectMapping("readAllSQLString", "legacyGetReadAllSQLString", "legacySetReadAllSQLString", "read-all-string/text()"); return descriptor; } }