blob: 24b79b6e28d4a433be3b51e4ff6507d06e52f430 [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 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:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.dbws;
//javase imports
// Java extension imports
import static javax.xml.XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI;
import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
import static org.eclipse.persistence.internal.oxm.Constants.BOOLEAN_QNAME;
import static org.eclipse.persistence.internal.xr.sxf.SimpleXMLFormat.DEFAULT_SIMPLE_XML_FORMAT_TAG;
import static org.eclipse.persistence.internal.xr.sxf.SimpleXMLFormat.DEFAULT_SIMPLE_XML_TAG;
import java.util.Iterator;
import java.util.Map;
import java.util.Vector;
// EclipseLink imports
import org.eclipse.persistence.descriptors.ClassExtractor;
import org.eclipse.persistence.exceptions.DescriptorException;
import org.eclipse.persistence.internal.xr.Attachment;
import org.eclipse.persistence.internal.xr.BatchQueryOperation;
import org.eclipse.persistence.internal.xr.CollectionResult;
import org.eclipse.persistence.internal.xr.DeleteOperation;
import org.eclipse.persistence.internal.xr.InsertOperation;
import org.eclipse.persistence.internal.xr.JPQLQueryHandler;
import org.eclipse.persistence.internal.xr.NamedQueryHandler;
import org.eclipse.persistence.internal.xr.Operation;
import org.eclipse.persistence.internal.xr.Parameter;
import org.eclipse.persistence.internal.xr.ProcedureArgument;
import org.eclipse.persistence.internal.xr.ProcedureOutputArgument;
import org.eclipse.persistence.internal.xr.QNameTransformer;
import org.eclipse.persistence.internal.xr.QueryOperation;
import org.eclipse.persistence.internal.xr.Result;
import org.eclipse.persistence.internal.xr.SQLQueryHandler;
import org.eclipse.persistence.internal.xr.StoredFunctionQueryHandler;
import org.eclipse.persistence.internal.xr.StoredProcedureQueryHandler;
import org.eclipse.persistence.internal.xr.UpdateOperation;
import org.eclipse.persistence.internal.xr.XRServiceModel;
import org.eclipse.persistence.internal.xr.sxf.SimpleXMLFormat;
import org.eclipse.persistence.mappings.AttributeAccessor;
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.XMLCompositeDirectCollectionMapping;
import org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping;
import org.eclipse.persistence.oxm.mappings.XMLDirectMapping;
import org.eclipse.persistence.oxm.mappings.XMLTransformationMapping;
import org.eclipse.persistence.oxm.record.UnmarshalRecord;
import org.eclipse.persistence.sessions.DataRecord;
import org.eclipse.persistence.sessions.Project;
import org.eclipse.persistence.sessions.Session;
import org.xml.sax.Attributes;
@SuppressWarnings({"serial", "rawtypes"})
public class DBWSModelProject extends Project {
public transient NamespaceResolver ns;
public DBWSModelProject() {
setName("DBWSModelProject");
ns = new NamespaceResolver();
ns.put("xsi", W3C_XML_SCHEMA_INSTANCE_NS_URI);
ns.put("xsd", W3C_XML_SCHEMA_NS_URI);
addDescriptor(buildServiceDescriptor());
addDescriptor(buildAttachmentDescriptor());
addDescriptor(buildResultDescriptor());
addDescriptor(buildCollectionResultDescriptor());
addDescriptor(buildParameterDescriptor());
addDescriptor(buildSimpleXMLFormatDescriptor());
addDescriptor(buildNamedQueryDescriptor());
addDescriptor(buildSqlQueryDescriptor());
addDescriptor(buildJpqlQueryDescriptor());
addDescriptor(buildStoredProcedureQueryDescriptor());
addDescriptor(buildProcedureArgumentDescriptor());
addDescriptor(buildProcedureOutputArgumentDescriptor());
addDescriptor(buildStoredFunctionQueryDescriptor());
addDescriptor(buildQueryDescriptor());
addDescriptor(buildInsertDescriptor());
addDescriptor(buildDeleteDescriptor());
addDescriptor(buildUpdateDescriptor());
addDescriptor(buildBatchQueryDescriptor());
for (Iterator descriptors = getDescriptors().values().iterator(); descriptors.hasNext();) {
XMLDescriptor descriptor = (XMLDescriptor)descriptors.next();
descriptor.setNamespaceResolver(ns);
}
}
protected XMLDescriptor buildServiceDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(DBWSModel.class);
descriptor.setDefaultRootElement("dbws");
XMLDirectMapping name = new XMLDirectMapping();
name.setAttributeName("name");
name.setXPath("name/text()");
descriptor.addMapping(name);
XMLDirectMapping sessionFile = new XMLDirectMapping();
sessionFile.setAttributeName("sessionsFile");
sessionFile.setXPath("sessions-file/text()");
descriptor.addMapping(sessionFile);
XMLChoiceCollectionMapping operationsMapping = new XMLChoiceCollectionMapping();
operationsMapping.setAttributeName("operations");
operationsMapping.setAttributeAccessor(new AttributeAccessor() {
@Override
public Object getAttributeValueFromObject(Object object) {
return ((XRServiceModel)object).getOperationsList();
}
@Override
public void setAttributeValueInObject(Object object, Object value) {
Vector v = (Vector)value;
XRServiceModel dbwsModel = (XRServiceModel)object;
Map<String, Operation> operations = dbwsModel.getOperations();
for (Iterator i = v.iterator(); i.hasNext();) {
Object obj = i.next();
if (obj instanceof Operation) {
Operation op = (Operation)obj;
operations.put(op.getName(), op);
}
}
}
});
operationsMapping.addChoiceElement("insert", InsertOperation.class);
operationsMapping.addChoiceElement("query", QueryOperation.class);
operationsMapping.addChoiceElement("update", UpdateOperation.class);
operationsMapping.addChoiceElement("delete", DeleteOperation.class);
operationsMapping.addChoiceElement("batch-sql-query", BatchQueryOperation.class);
descriptor.addMapping(operationsMapping);
return descriptor;
}
// query
//
// name,parameter*,result,named-query|sql|jpql|stored-procedure|stored-function
protected XMLDescriptor buildQueryDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(QueryOperation.class);
descriptor.setDefaultRootElement("query");
XMLDirectMapping name = new XMLDirectMapping();
name.setAttributeName("name");
name.setXPath("name/text()");
descriptor.addMapping(name);
XMLCompositeCollectionMapping parameters = new XMLCompositeCollectionMapping();
parameters.setAttributeName("parameters");
parameters.setReferenceClass(Parameter.class);
parameters.setXPath("parameter");
descriptor.addMapping(parameters);
XMLCompositeObjectMapping resultMapping = new XMLCompositeObjectMapping();
resultMapping.setAttributeName("result");
resultMapping.setReferenceClass(Result.class);
resultMapping.setXPath( "result");
descriptor.addMapping(resultMapping);
XMLChoiceObjectMapping queryHandlerMapping = new XMLChoiceObjectMapping();
queryHandlerMapping.setAttributeName("queryHandler");
queryHandlerMapping.addChoiceElement("jpql", JPQLQueryHandler.class);
queryHandlerMapping.addChoiceElement("named-query", NamedQueryHandler.class);
queryHandlerMapping.addChoiceElement("sql", SQLQueryHandler.class);
queryHandlerMapping.addChoiceElement("stored-procedure",
StoredProcedureQueryHandler.class);
queryHandlerMapping.addChoiceElement("stored-function",
StoredFunctionQueryHandler.class);
descriptor.addMapping(queryHandlerMapping);
return descriptor;
}
/**
* Build an XMLDescriptor for BatchQueryOperation.
*/
protected XMLDescriptor buildBatchQueryDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(BatchQueryOperation.class);
descriptor.setDefaultRootElement("batch-sql-query");
XMLDirectMapping name = new XMLDirectMapping();
name.setAttributeName("name");
name.setXPath("name/text()");
descriptor.addMapping(name);
XMLCompositeDirectCollectionMapping statementsMapping = new XMLCompositeDirectCollectionMapping();
statementsMapping.setAttributeName("batchSql");
XMLField f1 = new XMLField("batch-statement/text()");
f1.setIsCDATA(true);
statementsMapping.setField(f1);
descriptor.addMapping(statementsMapping);
return descriptor;
}
// parameter
//
// name,type
protected XMLDescriptor buildParameterDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(Parameter.class);
XMLDirectMapping name = new XMLDirectMapping();
name.setAttributeName("name");
name.setXPath("name/text()");
descriptor.addMapping(name);
XMLTransformationMapping type = new XMLTransformationMapping();
type.setAttributeName("type");
QNameTransformer qNameTransformer = new QNameTransformer("type/text()");
type.addFieldTransformer("type/text()", qNameTransformer);
type.setAttributeTransformer(qNameTransformer);
descriptor.addMapping(type);
XMLDirectMapping optional = new XMLDirectMapping();
optional.setAttributeName("optional");
optional.setXPath("@optional");
optional.setNullValue(false);
descriptor.addMapping(optional);
return descriptor;
}
// attachment
//
// mime-type
protected XMLDescriptor buildAttachmentDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(Attachment.class);
XMLDirectMapping mimeType = new XMLDirectMapping();
mimeType.setAttributeName("mimeType");
mimeType.setXPath("mime-type/text()");
descriptor.addMapping(mimeType);
return descriptor;
}
// result
//
// type|attachment
protected XMLDescriptor buildResultDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(Result.class);
descriptor.setDefaultRootElement("result");
XMLTransformationMapping type = new XMLTransformationMapping();
type.setAttributeName("type");
QNameTransformer qNameTransformer = new QNameTransformer("type/text()");
type.addFieldTransformer("type/text()", qNameTransformer);
type.setAttributeTransformer(qNameTransformer);
descriptor.addMapping(type);
XMLCompositeObjectMapping attachment = new XMLCompositeObjectMapping();
attachment.setAttributeName("attachment");
attachment.setXPath("attachment");
attachment.setReferenceClass(Attachment.class);
descriptor.addMapping(attachment);
XMLCompositeObjectMapping sxf = new XMLCompositeObjectMapping();
sxf.setAttributeName("simpleXMLFormat");
sxf.setXPath("simple-xml-format");
sxf.setReferenceClass(SimpleXMLFormat.class);
descriptor.addMapping(sxf);
XMLDirectMapping isCollection = new XMLDirectMapping();
isCollection.setAttributeAccessor(new AttributeAccessor() {
@Override
public String getAttributeName() {
return "isCollection";
}
@Override
public Object getAttributeValueFromObject(Object object) throws DescriptorException {
if (object instanceof CollectionResult) {
return Boolean.TRUE;
}
return null;
}
@Override
public void setAttributeValueInObject(Object object, Object value)
throws DescriptorException {
}
});
isCollection.setXPath("@isCollection");
descriptor.addMapping(isCollection);
XMLField isColl = new XMLField("@isCollection");
isColl.setSchemaType(BOOLEAN_QNAME);
descriptor.getInheritancePolicy().setClassIndicatorField(isColl);
descriptor.getInheritancePolicy().setClassExtractor(new ClassExtractor() {
@Override
public Class<?> extractClassFromRow(DataRecord dataRecord, Session session) {
Class<?> clz = Result.class;
UnmarshalRecord uRecord = (UnmarshalRecord) dataRecord;
Attributes attrs = uRecord.getAttributes();
if (attrs != null) {
for (int i = 0, l = attrs.getLength(); i < l; i++) {
String attributeName = attrs.getQName(i);
if (attributeName.equals("isCollection")) {
String value = attrs.getValue(i);
if (value.equalsIgnoreCase("true")) {
clz = CollectionResult.class;
break;
}
}
}
}
return clz;
}
});
XMLDirectMapping jdbcTypeMapping = new XMLDirectMapping();
jdbcTypeMapping.setAttributeName("jdbcType");
jdbcTypeMapping.setXPath("@jdbcType");
descriptor.addMapping(jdbcTypeMapping);
return descriptor;
}
// result isCollection="true"
//
protected XMLDescriptor buildCollectionResultDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(CollectionResult.class);
descriptor.getInheritancePolicy().setParentClass(Result.class);
descriptor.setDefaultRootElement("result");
return descriptor;
}
// simple-xml-format
//
// simple-xml-format-tag?,simple-xml-tag?
protected XMLDescriptor buildSimpleXMLFormatDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(SimpleXMLFormat.class);
descriptor.setDefaultRootElement(DEFAULT_SIMPLE_XML_FORMAT_TAG);
XMLDirectMapping simpleXMLFormatTag = new XMLDirectMapping();
simpleXMLFormatTag.setAttributeName("simpleXMLFormatTag");
simpleXMLFormatTag.setXPath(DEFAULT_SIMPLE_XML_FORMAT_TAG + "-tag/text()");
descriptor.addMapping(simpleXMLFormatTag);
XMLDirectMapping xmlTag = new XMLDirectMapping();
xmlTag.setAttributeName("xmlTag");
xmlTag.setXPath(DEFAULT_SIMPLE_XML_TAG + "-tag/text()");
descriptor.addMapping(xmlTag);
return descriptor;
}
// named-query
//
// name,descriptor?
protected XMLDescriptor buildNamedQueryDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(NamedQueryHandler.class);
descriptor.setDefaultRootElement("named-query");
XMLDirectMapping queryName = new XMLDirectMapping();
queryName.setAttributeName("name");
queryName.setXPath("name/text()");
descriptor.addMapping(queryName);
XMLDirectMapping alias = new XMLDirectMapping();
alias.setAttributeName("descriptor");
alias.setXPath("descriptor/text()");
descriptor.addMapping(alias);
return descriptor;
}
// sql <![CDATA[ ... ]]>
protected XMLDescriptor buildSqlQueryDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(SQLQueryHandler.class);
descriptor.setDefaultRootElement("sql");
XMLDirectMapping queryName = new XMLDirectMapping();
queryName.setAttributeName("sqlString");
queryName.setXPath("text()");
queryName.setIsCDATA(true);
descriptor.addMapping(queryName);
return descriptor;
}
// jpql <![CDATA[ ... ]]>
protected XMLDescriptor buildJpqlQueryDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(JPQLQueryHandler.class);
descriptor.setDefaultRootElement("jpql");
XMLDirectMapping queryName = new XMLDirectMapping();
queryName.setAttributeName("jpqlString");
queryName.setXPath("text()");
queryName.setIsCDATA(true);
descriptor.addMapping(queryName);
return descriptor;
}
// stored-procedure
//
// name, in-argument*, inout-argument*, out-argument*
protected XMLDescriptor buildStoredProcedureQueryDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(StoredProcedureQueryHandler.class);
descriptor.setDefaultRootElement("stored-procedure");
XMLDirectMapping procedureName = new XMLDirectMapping();
procedureName.setAttributeName("name");
procedureName.setXPath("name/text()");
descriptor.addMapping(procedureName);
XMLCompositeCollectionMapping inArguments = new XMLCompositeCollectionMapping();
inArguments.setAttributeName("inArguments");
inArguments.setXPath("in-argument");
inArguments.setReferenceClass(ProcedureArgument.class);
descriptor.addMapping(inArguments);
XMLCompositeCollectionMapping inOutArguments = new XMLCompositeCollectionMapping();
inOutArguments.setAttributeName("inOutArguments");
inOutArguments.setXPath("inout-argument");
inOutArguments.setReferenceClass(ProcedureOutputArgument.class);
descriptor.addMapping(inOutArguments);
XMLCompositeCollectionMapping outArguments = new XMLCompositeCollectionMapping();
outArguments.setAttributeName("outArguments");
outArguments.setXPath("out-argument");
outArguments.setReferenceClass(ProcedureOutputArgument.class);
descriptor.addMapping(outArguments);
return descriptor;
}
protected XMLDescriptor buildStoredFunctionQueryDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(StoredFunctionQueryHandler.class);
descriptor.setDefaultRootElement("stored-function");
XMLDirectMapping procedureName = new XMLDirectMapping();
procedureName.setAttributeName("name");
procedureName.setXPath("name/text()");
descriptor.addMapping(procedureName);
XMLCompositeCollectionMapping inArguments = new XMLCompositeCollectionMapping();
inArguments.setAttributeName("inArguments");
inArguments.setXPath("in-argument");
inArguments.setReferenceClass(ProcedureArgument.class);
descriptor.addMapping(inArguments);
XMLCompositeCollectionMapping inOutArguments = new XMLCompositeCollectionMapping();
inOutArguments.setAttributeName("inOutArguments");
inOutArguments.setXPath("inout-argument");
inOutArguments.setReferenceClass(ProcedureOutputArgument.class);
descriptor.addMapping(inOutArguments);
XMLCompositeCollectionMapping outArguments = new XMLCompositeCollectionMapping();
outArguments.setAttributeName("outArguments");
outArguments.setXPath("out-argument");
outArguments.setReferenceClass(ProcedureOutputArgument.class);
descriptor.addMapping(outArguments);
return descriptor;
}
// in-argument
//
// name, parameter?
protected XMLDescriptor buildProcedureArgumentDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(ProcedureArgument.class);
XMLDirectMapping argumentName = new XMLDirectMapping();
argumentName.setAttributeName("name");
argumentName.setXPath("name");
descriptor.addMapping(argumentName);
XMLDirectMapping parameterName = new XMLDirectMapping();
parameterName.setAttributeName("parameterName");
parameterName.setXPath("parameter");
descriptor.addMapping(parameterName);
XMLDirectMapping complexTypeName = new XMLDirectMapping();
complexTypeName.setAttributeName("complexTypeName");
complexTypeName.setXPath("complex-type");
descriptor.addMapping(complexTypeName);
XMLDirectMapping jdbcTypeMapping = new XMLDirectMapping();
jdbcTypeMapping.setAttributeName("jdbcType");
jdbcTypeMapping.setXPath("@jdbcType");
descriptor.addMapping(jdbcTypeMapping);
return descriptor;
}
// inout-argument and out-argument
//
// name, parameter?, type?
protected XMLDescriptor buildProcedureOutputArgumentDescriptor() {
XMLDescriptor descriptor = buildProcedureArgumentDescriptor();
descriptor.setJavaClass(ProcedureOutputArgument.class);
XMLTransformationMapping resultType = new XMLTransformationMapping();
resultType.setAttributeName("resultType");
QNameTransformer qNameTransformer = new QNameTransformer("type/text()");
resultType.addFieldTransformer("type/text()", qNameTransformer);
resultType.setAttributeTransformer(qNameTransformer);
descriptor.addMapping(resultType);
return descriptor;
}
// insert
//
// name, parameter
protected XMLDescriptor buildInsertDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(InsertOperation.class);
descriptor.setDefaultRootElement("insert");
XMLDirectMapping name = new XMLDirectMapping();
name.setAttributeName("name");
name.setXPath("name/text()");
descriptor.addMapping(name);
XMLCompositeCollectionMapping parameters = new XMLCompositeCollectionMapping();
parameters.setAttributeName("parameters");
parameters.setReferenceClass(Parameter.class);
parameters.setXPath("parameter");
descriptor.addMapping(parameters);
return descriptor;
}
// delete
//
// name, parameter
protected XMLDescriptor buildDeleteDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(DeleteOperation.class);
descriptor.setDefaultRootElement("delete");
XMLDirectMapping name = new XMLDirectMapping();
name.setAttributeName("name");
name.setXPath("name/text()");
descriptor.addMapping(name);
XMLDirectMapping descriptorName = new XMLDirectMapping();
descriptorName.setAttributeName("descriptorName");
descriptorName.setXPath("descriptor-name/text()");
descriptor.addMapping(descriptorName);
XMLDirectMapping findByPKQuery = new XMLDirectMapping();
findByPKQuery.setAttributeName("findByPKQuery");
findByPKQuery.setXPath("find-by-pk-query/text()");
descriptor.addMapping(findByPKQuery);
XMLCompositeCollectionMapping parameters = new XMLCompositeCollectionMapping();
parameters.setAttributeName("parameters");
parameters.setReferenceClass(Parameter.class);
parameters.setXPath("parameter");
descriptor.addMapping(parameters);
return descriptor;
}
// update
//
// name, parameter
protected XMLDescriptor buildUpdateDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(UpdateOperation.class);
descriptor.setDefaultRootElement("update");
XMLDirectMapping name = new XMLDirectMapping();
name.setAttributeName("name");
name.setXPath("name/text()");
descriptor.addMapping(name);
XMLCompositeCollectionMapping parameters = new XMLCompositeCollectionMapping();
parameters.setAttributeName("parameters");
parameters.setReferenceClass(Parameter.class);
parameters.setXPath("parameter");
descriptor.addMapping(parameters);
return descriptor;
}
}