blob: b23cd3fbc4df6a5450b9ce7a990dd674a0c21e18 [file] [log] [blame]
/*
* Copyright (c) 1998, 2020 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 v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Mike Norman - May 01 2008, created DBWS tools package
package org.eclipse.persistence.tools.dbws;
// javase imports
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;
// Java extension libraries
import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
// TopLink imports
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.exceptions.DescriptorException;
import org.eclipse.persistence.internal.queries.ListContainerPolicy;
import org.eclipse.persistence.mappings.Association;
import org.eclipse.persistence.mappings.AttributeAccessor;
import org.eclipse.persistence.mappings.converters.ObjectTypeConverter;
import org.eclipse.persistence.oxm.NamespaceResolver;
import org.eclipse.persistence.oxm.XMLDescriptor;
import org.eclipse.persistence.oxm.XMLField;
import org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping;
import org.eclipse.persistence.oxm.mappings.XMLChoiceObjectMapping;
import org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping;
import org.eclipse.persistence.oxm.mappings.XMLDirectMapping;
import org.eclipse.persistence.sessions.Project;
@SuppressWarnings({"serial", "unchecked"})
public class DBWSBuilderModelProject extends Project {
protected NamespaceResolver ns;
public DBWSBuilderModelProject() {
setName("DBWSBuilderModelProject");
ns = new NamespaceResolver();
ns.put("xsd", W3C_XML_SCHEMA_NS_URI);
addDescriptor(buildAssociationDescriptor());
addDescriptor(buildDBWSBuilderModelDescriptor());
addDescriptor(buildTableOperationModelDescriptor());
addDescriptor(buildProcedureOperationModelDescriptor());
addDescriptor(buildPLSQLProcedureOperationModelDescriptor());
addDescriptor(buildSQLOperationModelDescriptor());
addDescriptor(buildBindingModelDescriptor());
addDescriptor(buildBatchSQLOperationModelDescriptor());
for (Iterator<ClassDescriptor> descriptors = getDescriptors().values().iterator(); descriptors.hasNext();) {
XMLDescriptor descriptor = (XMLDescriptor)descriptors.next();
descriptor.setNamespaceResolver(ns);
}
}
protected ClassDescriptor buildAssociationDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(Association.class);
descriptor.setDefaultRootElement("property");
XMLDirectMapping keyMapping = new XMLDirectMapping();
keyMapping.setAttributeName("key");
keyMapping.setXPath("@name");
descriptor.addMapping(keyMapping);
XMLDirectMapping valueMapping = new XMLDirectMapping();
valueMapping.setAttributeName("value");
valueMapping.setXPath("text()");
descriptor.addMapping(valueMapping);
return descriptor;
}
protected ClassDescriptor buildDBWSBuilderModelDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(DBWSBuilderModel.class);
descriptor.setDefaultRootElement("dbws-builder");
XMLCompositeCollectionMapping propertiesMapping = new XMLCompositeCollectionMapping();
propertiesMapping.setReferenceClass(Association.class);
propertiesMapping.setAttributeAccessor(new AttributeAccessor() {
@Override
public String getAttributeName() {
return "properties";
}
@Override
public Object getAttributeValueFromObject(Object object) throws DescriptorException {
DBWSBuilderModel model = (DBWSBuilderModel)object;
Vector<Association> associations =
new Vector<Association>();
for (Map.Entry<String, String> me : model.properties.entrySet()) {
associations.add(new Association(me.getKey(), me.getValue()));
}
return associations;
}
@Override
public void setAttributeValueInObject(Object object, Object value)
throws DescriptorException {
DBWSBuilderModel model = (DBWSBuilderModel)object;
Vector<Association> associations =
(Vector<Association>)value;
for (Association a : associations) {
model.properties.put((String)a.getKey(), (String)a.getValue());
}
}
});
propertiesMapping.setXPath("properties/property");
descriptor.addMapping(propertiesMapping);
XMLChoiceCollectionMapping operationsMapping = new XMLChoiceCollectionMapping();
operationsMapping.setAttributeName("operations");
operationsMapping.setContainerPolicy(new ListContainerPolicy(ArrayList.class));
operationsMapping.addChoiceElement("table", TableOperationModel.class);
operationsMapping.addChoiceElement("procedure", ProcedureOperationModel.class);
operationsMapping.addChoiceElement("plsql-procedure", PLSQLProcedureOperationModel.class);
operationsMapping.addChoiceElement("sql", SQLOperationModel.class);
operationsMapping.addChoiceElement("batch-sql", BatchSQLOperationModel.class);
descriptor.addMapping(operationsMapping);
return descriptor;
}
protected ClassDescriptor buildTableOperationModelDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(TableOperationModel.class);
XMLDirectMapping nameMapping = new XMLDirectMapping();
nameMapping.setAttributeName("name");
nameMapping.setXPath("@name");
descriptor.addMapping(nameMapping);
ObjectTypeConverter converter = new ObjectTypeConverter();
converter.addConversionValue("true", Boolean.TRUE);
converter.addConversionValue("false", Boolean.FALSE);
converter.setFieldClassification(String.class);
XMLDirectMapping simpleXMLFormatTagMapping = new XMLDirectMapping();
simpleXMLFormatTagMapping.setAttributeName("simpleXMLFormatTag");
simpleXMLFormatTagMapping.setGetMethodName("getSimpleXMLFormatTag");
simpleXMLFormatTagMapping.setSetMethodName("setSimpleXMLFormatTag");
simpleXMLFormatTagMapping.setXPath("@simpleXMLFormatTag");
descriptor.addMapping(simpleXMLFormatTagMapping);
XMLDirectMapping xmlTagMapping = new XMLDirectMapping();
xmlTagMapping.setAttributeName("xmlTag");
xmlTagMapping.setGetMethodName("getXmlTag");
xmlTagMapping.setSetMethodName("setXmlTag");
xmlTagMapping.setXPath("@xmlTag");
descriptor.addMapping(xmlTagMapping);
XMLDirectMapping isCollectionMapping = new XMLDirectMapping();
isCollectionMapping.setAttributeName("isCollection");
isCollectionMapping.setConverter(converter);
isCollectionMapping.setNullValue(Boolean.FALSE);
isCollectionMapping.setXPath("@isCollection");
descriptor.addMapping(isCollectionMapping);
XMLDirectMapping binaryAttachment = new XMLDirectMapping();
binaryAttachment.setAttributeName("binaryAttachment");
binaryAttachment.setConverter(converter);
binaryAttachment.setNullValue(Boolean.FALSE);
binaryAttachment.setXPath("@binaryAttachment");
descriptor.addMapping(binaryAttachment);
XMLDirectMapping attachmentType = new XMLDirectMapping();
attachmentType.setAttributeName("attachmentType");
attachmentType.setXPath("@attachmentType");
descriptor.addMapping(attachmentType);
XMLDirectMapping returnTypeMapping = new XMLDirectMapping();
returnTypeMapping.setAttributeName("returnType");
returnTypeMapping.setXPath("@returnType");
descriptor.addMapping(returnTypeMapping);
XMLDirectMapping catalogPatternMapping = new XMLDirectMapping();
catalogPatternMapping.setAttributeName("catalogPattern");
catalogPatternMapping.setXPath("@catalogPattern");
descriptor.addMapping(catalogPatternMapping);
XMLDirectMapping schemaPatternMapping = new XMLDirectMapping();
schemaPatternMapping.setAttributeName("schemaPattern");
schemaPatternMapping.setXPath("@schemaPattern");
descriptor.addMapping(schemaPatternMapping);
XMLDirectMapping tableNamePatternMapping = new XMLDirectMapping();
tableNamePatternMapping.setAttributeName("tablePattern");
tableNamePatternMapping.setXPath("@tableNamePattern");
descriptor.addMapping(tableNamePatternMapping);
XMLChoiceCollectionMapping additionalOperationsMapping = new XMLChoiceCollectionMapping();
additionalOperationsMapping.setAttributeName("additionalOperations");
additionalOperationsMapping.setContainerPolicy(new ListContainerPolicy(ArrayList.class));
additionalOperationsMapping.addChoiceElement("procedure", ProcedureOperationModel.class);
additionalOperationsMapping.addChoiceElement("plsql-procedure", PLSQLProcedureOperationModel.class);
additionalOperationsMapping.addChoiceElement("sql", SQLOperationModel.class);
additionalOperationsMapping.addChoiceElement("batch-sql", BatchSQLOperationModel.class);
descriptor.addMapping(additionalOperationsMapping);
return descriptor;
}
protected ClassDescriptor buildProcedureOperationModelDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(ProcedureOperationModel.class);
descriptor.setDefaultRootElement("procedure");
XMLDirectMapping nameMapping = new XMLDirectMapping();
nameMapping.setAttributeName("name");
nameMapping.setXPath("@name");
descriptor.addMapping(nameMapping);
XMLDirectMapping simpleXMLFormatTagMapping = new XMLDirectMapping();
simpleXMLFormatTagMapping.setAttributeName("simpleXMLFormatTag");
simpleXMLFormatTagMapping.setGetMethodName("getSimpleXMLFormatTag");
simpleXMLFormatTagMapping.setSetMethodName("setSimpleXMLFormatTag");
simpleXMLFormatTagMapping.setXPath("@simpleXMLFormatTag");
descriptor.addMapping(simpleXMLFormatTagMapping);
XMLDirectMapping xmlTagMapping = new XMLDirectMapping();
xmlTagMapping.setAttributeName("xmlTag");
xmlTagMapping.setGetMethodName("getXmlTag");
xmlTagMapping.setSetMethodName("setXmlTag");
xmlTagMapping.setXPath("@xmlTag");
descriptor.addMapping(xmlTagMapping);
ObjectTypeConverter converter = new ObjectTypeConverter();
converter.addConversionValue("true", Boolean.TRUE);
converter.addConversionValue("false", Boolean.FALSE);
converter.setFieldClassification(String.class);
XMLDirectMapping isCollectionMapping = new XMLDirectMapping();
isCollectionMapping.setAttributeName("isCollection");
isCollectionMapping.setConverter(converter);
isCollectionMapping.setNullValue(Boolean.FALSE);
isCollectionMapping.setXPath("@isCollection");
descriptor.addMapping(isCollectionMapping);
XMLDirectMapping isSimpleXMLFormatMapping = new XMLDirectMapping();
isSimpleXMLFormatMapping.setAttributeName("isSimpleXMLFormat");
isSimpleXMLFormatMapping.setConverter(converter);
isSimpleXMLFormatMapping.setNullValue(Boolean.FALSE);
isSimpleXMLFormatMapping.setXPath("@isSimpleXMLFormat");
descriptor.addMapping(isSimpleXMLFormatMapping);
XMLDirectMapping binaryAttachment = new XMLDirectMapping();
binaryAttachment.setAttributeName("binaryAttachment");
binaryAttachment.setConverter(converter);
binaryAttachment.setNullValue(Boolean.FALSE);
binaryAttachment.setXPath("@binaryAttachment");
descriptor.addMapping(binaryAttachment);
XMLDirectMapping attachmentType = new XMLDirectMapping();
attachmentType.setAttributeName("attachmentType");
attachmentType.setXPath("@attachmentType");
descriptor.addMapping(attachmentType);
XMLDirectMapping returnTypeMapping = new XMLDirectMapping();
returnTypeMapping.setAttributeName("returnType");
returnTypeMapping.setXPath("@returnType");
descriptor.addMapping(returnTypeMapping);
XMLDirectMapping catalogPatternMapping = new XMLDirectMapping();
catalogPatternMapping.setAttributeName("catalogPattern");
catalogPatternMapping.setXPath("@catalogPattern");
descriptor.addMapping(catalogPatternMapping);
XMLDirectMapping schemaPatternMapping = new XMLDirectMapping();
schemaPatternMapping.setAttributeName("schemaPattern");
schemaPatternMapping.setXPath("@schemaPattern");
descriptor.addMapping(schemaPatternMapping);
XMLDirectMapping procedurePatternMapping = new XMLDirectMapping();
procedurePatternMapping.setAttributeName("procedurePattern");
procedurePatternMapping.setXPath("@procedurePattern");
descriptor.addMapping(procedurePatternMapping);
XMLDirectMapping isAdvancedJDBCMapping = new XMLDirectMapping();
isAdvancedJDBCMapping.setAttributeName("isAdvancedJDBC");
isAdvancedJDBCMapping.setConverter(converter);
isAdvancedJDBCMapping.setNullValue(Boolean.FALSE);
isAdvancedJDBCMapping.setXPath("@isAdvancedJDBC");
descriptor.addMapping(isAdvancedJDBCMapping);
XMLDirectMapping buildStatementMapping = new XMLDirectMapping();
buildStatementMapping.setAttributeName("buildSql");
buildStatementMapping.setXPath("build-statement/text()");
buildStatementMapping.setIsCDATA(true);
descriptor.addMapping(buildStatementMapping);
return descriptor;
}
protected ClassDescriptor buildPLSQLProcedureOperationModelDescriptor() {
XMLDescriptor descriptor = (XMLDescriptor)buildProcedureOperationModelDescriptor();
descriptor.setJavaClass(PLSQLProcedureOperationModel.class);
descriptor.setDefaultRootElement("plsql-procedure");
return descriptor;
}
protected ClassDescriptor buildSQLOperationModelDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(SQLOperationModel.class);
descriptor.setDefaultRootElement("sql");
XMLDirectMapping nameMapping = new XMLDirectMapping();
nameMapping.setAttributeName("name");
nameMapping.setXPath("@name");
descriptor.addMapping(nameMapping);
ObjectTypeConverter converter = new ObjectTypeConverter();
converter.addConversionValue("true", Boolean.TRUE);
converter.addConversionValue("false", Boolean.FALSE);
converter.setFieldClassification(String.class);
XMLDirectMapping simpleXMLFormatTagMapping = new XMLDirectMapping();
simpleXMLFormatTagMapping.setAttributeName("simpleXMLFormatTag");
simpleXMLFormatTagMapping.setGetMethodName("getSimpleXMLFormatTag");
simpleXMLFormatTagMapping.setSetMethodName("setSimpleXMLFormatTag");
simpleXMLFormatTagMapping.setXPath("@simpleXMLFormatTag");
descriptor.addMapping(simpleXMLFormatTagMapping);
XMLDirectMapping xmlTagMapping = new XMLDirectMapping();
xmlTagMapping.setAttributeName("xmlTag");
xmlTagMapping.setGetMethodName("getXmlTag");
xmlTagMapping.setSetMethodName("setXmlTag");
xmlTagMapping.setXPath("@xmlTag");
descriptor.addMapping(xmlTagMapping);
XMLDirectMapping isCollectionMapping = new XMLDirectMapping();
isCollectionMapping.setAttributeName("isCollection");
isCollectionMapping.setConverter(converter);
isCollectionMapping.setNullValue(Boolean.FALSE);
isCollectionMapping.setXPath("@isCollection");
descriptor.addMapping(isCollectionMapping);
XMLDirectMapping binaryAttachment = new XMLDirectMapping();
binaryAttachment.setAttributeName("binaryAttachment");
binaryAttachment.setConverter(converter);
binaryAttachment.setNullValue(Boolean.FALSE);
binaryAttachment.setXPath("@binaryAttachment");
descriptor.addMapping(binaryAttachment);
XMLDirectMapping attachmentType = new XMLDirectMapping();
attachmentType.setAttributeName("attachmentType");
attachmentType.setXPath("@attachmentType");
descriptor.addMapping(attachmentType);
XMLDirectMapping returnTypeMapping = new XMLDirectMapping();
returnTypeMapping.setAttributeName("returnType");
returnTypeMapping.setXPath("@returnType");
descriptor.addMapping(returnTypeMapping);
// bug 322949
XMLChoiceObjectMapping statementMapping = new XMLChoiceObjectMapping();
statementMapping.setAttributeName("sql");
// support old element name 'text' and new name 'statement'
XMLField f1 = new XMLField("statement/text()");
f1.setIsCDATA(true);
statementMapping.addChoiceElement(f1, String.class);
XMLField f2 = new XMLField("text/text()");
f2.setIsCDATA(true);
statementMapping.addChoiceElement(f2, String.class);
descriptor.addMapping(statementMapping);
XMLDirectMapping buildStatementMapping = new XMLDirectMapping();
buildStatementMapping.setAttributeName("buildSql");
buildStatementMapping.setXPath("build-statement/text()");
buildStatementMapping.setIsCDATA(true);
descriptor.addMapping(buildStatementMapping);
XMLCompositeCollectionMapping bindingsMapping = new XMLCompositeCollectionMapping();
bindingsMapping.setAttributeName("bindings");
bindingsMapping.setReferenceClass(BindingModel.class);
bindingsMapping.setContainerPolicy(new ListContainerPolicy(ArrayList.class));
bindingsMapping.setXPath("binding");
descriptor.addMapping(bindingsMapping);
return descriptor;
}
/**
* Build an XMLDescriptor for the BatchSQLOperationModel.
*/
protected ClassDescriptor buildBatchSQLOperationModelDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(BatchSQLOperationModel.class);
descriptor.setDefaultRootElement("batch-sql");
XMLDirectMapping nameMapping = new XMLDirectMapping();
nameMapping.setAttributeName("name");
nameMapping.setXPath("@name");
descriptor.addMapping(nameMapping);
XMLDirectMapping returnTypeMapping = new XMLDirectMapping();
returnTypeMapping.setAttributeName("returnType");
returnTypeMapping.setXPath("@returnType");
descriptor.addMapping(returnTypeMapping);
XMLDirectMapping statementsMapping = new XMLDirectMapping();
statementsMapping.setAttributeName("batchSql");
XMLField f1 = new XMLField("batch-statement/text()");
f1.setIsCDATA(true);
statementsMapping.setField(f1);
// need to setup a custom accessor to convert to/from a List and an '\n' separated string
statementsMapping.setAttributeAccessor(new AttributeAccessor() {
@Override
public void setAttributeValueInObject(Object object, Object value) throws DescriptorException {
String rawBatchStatements = (String) value;
String[] batchStatements = rawBatchStatements.split("\n");
List<String> listOfStatements = Arrays.asList(batchStatements);
((BatchSQLOperationModel)object).setBatchSql(listOfStatements);
}
@Override
public Object getAttributeValueFromObject(Object object) throws DescriptorException {
return ((BatchSQLOperationModel)object).getBatchSql();
}
});
descriptor.addMapping(statementsMapping);
return descriptor;
}
protected ClassDescriptor buildBindingModelDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(BindingModel.class);
descriptor.setDefaultRootElement("binding");
XMLDirectMapping nameMapping = new XMLDirectMapping();
nameMapping.setAttributeName("name");
nameMapping.setXPath("@name");
descriptor.addMapping(nameMapping);
XMLDirectMapping typeMapping = new XMLDirectMapping();
typeMapping.setAttributeName("type");
typeMapping.setXPath("@type");
descriptor.addMapping(typeMapping);
return descriptor;
}
}