org.eclipse.persistence.dbws.DBWSModelProject Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of eclipselink Show documentation
Show all versions of eclipselink Show documentation
EclipseLink build based upon Git transaction f2b9fc5
The newest version!
/*
* Copyright (c) 1998, 2024 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 operations = dbwsModel.getOperations();
for (Iterator i = v.iterator(); i.hasNext();) {
Object obj = i.next();
if (obj instanceof Operation op) {
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
@SuppressWarnings({"unchecked"})
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 (Class) 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
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
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;
}
}