/******************************************************************************* | |
* Copyright (c) 1998, 2013 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.testing.oxm.classloader; | |
import java.lang.reflect.Method; | |
import org.eclipse.persistence.oxm.XMLConstants; | |
import org.eclipse.persistence.oxm.XMLDescriptor; | |
import org.eclipse.persistence.oxm.XMLField; | |
import org.eclipse.persistence.oxm.mappings.*; | |
import org.eclipse.persistence.descriptors.ClassDescriptor; | |
import org.eclipse.persistence.internal.helper.ClassConstants; | |
import org.eclipse.persistence.internal.queries.ContainerPolicy; | |
import org.eclipse.persistence.sessions.Project; | |
import org.eclipse.persistence.testing.oxm.OXTestCase; | |
/** | |
* Tests class loader usage in the following mappings: | |
* - XMLAnyAttributeMapping | |
* - XMLAnyCollectionMapping | |
* - XMLAnyObjectMapping | |
* - XMLBinaryDataCollectionMapping | |
* - XMLBinaryDataMapping | |
* - XMLChoiceCollectionMapping | |
* - XMLChoiceObjectMapping | |
* - XMLCollectionReferenceMapping | |
* - XMLCompositeCollectionMapping | |
* - XMLCompositeDirectCollectionMapping | |
* - XMLCompositeObjectMapping | |
* - XMLObjectReferenceMapping | |
*/ | |
public class MappingTestProject extends Project { | |
private Class rootObjectClass; | |
private Class testObjectClass; | |
private Class addressClass; | |
private Class anyObjectClass; | |
private Class listContainerPolicyClass; | |
private Class mapContainerPolicyClass; | |
private OXTestCase.Platform platform; | |
private OXTestCase.Metadata metadata; | |
public MappingTestProject(ClassLoader loader, OXTestCase.Platform platform, OXTestCase.Metadata metadata) { | |
this.platform = platform; | |
this.metadata = metadata; | |
// load classes not on class path | |
try { | |
rootObjectClass = loader.loadClass("org.eclipse.persistence.testing.oxm.classloader.RootObject"); | |
testObjectClass = loader.loadClass("org.eclipse.persistence.testing.oxm.classloader.MappingTestObject"); | |
addressClass = loader.loadClass("org.eclipse.persistence.testing.oxm.classloader.Address"); | |
anyObjectClass = loader.loadClass("org.eclipse.persistence.testing.oxm.classloader.AnyObject"); | |
listContainerPolicyClass = loader.loadClass("org.eclipse.persistence.testing.oxm.classloader.CustomListContainerPolicy"); | |
mapContainerPolicyClass = loader.loadClass("org.eclipse.persistence.testing.oxm.classloader.CustomMapContainerPolicy"); | |
} catch (Exception e) { | |
throw new RuntimeException(e); | |
} | |
// build descriptors | |
this.addDescriptor(buildRootObjectDescriptor()); | |
this.addDescriptor(buildMappingTestObjectDescriptor()); | |
this.addDescriptor(buildAnyObjectDescriptor()); | |
this.addDescriptor(buildAddressDescriptor()); | |
} | |
/** | |
* The root descriptor contains a single mapping test object and a | |
* list of address objects | |
*/ | |
public ClassDescriptor buildRootObjectDescriptor() { | |
XMLDescriptor descriptor = new XMLDescriptor(); | |
descriptor.setJavaClass(rootObjectClass); | |
descriptor.setDefaultRootElement("root-object"); | |
// create test object mapping | |
XMLCompositeObjectMapping testObjectMapping = new XMLCompositeObjectMapping(); | |
testObjectMapping.setAttributeName("testObject"); | |
testObjectMapping.setXPath("mapping-test-object"); | |
testObjectMapping.setReferenceClassName(testObjectClass.getName()); | |
testObjectMapping.setGetMethodName("getTestObject"); | |
testObjectMapping.setSetMethodName("setTestObject"); | |
descriptor.addMapping(testObjectMapping); | |
// create address mapping | |
XMLCompositeCollectionMapping addMapping = new XMLCompositeCollectionMapping(); | |
addMapping.setAttributeName("addresses"); | |
addMapping.setXPath("addresses/address"); | |
addMapping.setReferenceClassName(addressClass.getName()); | |
addMapping.setGetMethodName("getAddresses"); | |
addMapping.setSetMethodName("setAddresses"); | |
ContainerPolicy listPolicy; | |
try { | |
listPolicy = (ContainerPolicy) listContainerPolicyClass.newInstance(); | |
Method meth = listContainerPolicyClass.getDeclaredMethod("setContainerClassName", new Class[] { String.class }); | |
meth.invoke(listPolicy, new Object[] { "java.util.ArrayList" }); | |
} catch (Exception e) { | |
throw new RuntimeException(e); | |
} | |
addMapping.setContainerPolicy(listPolicy); | |
descriptor.addMapping(addMapping); | |
return descriptor; | |
} | |
public ClassDescriptor buildMappingTestObjectDescriptor() { | |
XMLDescriptor descriptor = new XMLDescriptor(); | |
descriptor.setJavaClass(testObjectClass); | |
descriptor.setDefaultRootElement("mapping-test-object"); | |
// any attribute mapping | |
XMLAnyAttributeMapping aamapping = new XMLAnyAttributeMapping(); | |
aamapping.setAttributeName("anyAttribute"); | |
aamapping.setGetMethodName("getAnyAttribute"); | |
aamapping.setSetMethodName("setAnyAttribute"); | |
ContainerPolicy mapPolicy; | |
try { | |
mapPolicy = (ContainerPolicy) mapContainerPolicyClass.newInstance(); | |
Method meth = mapContainerPolicyClass.getDeclaredMethod("setContainerClassName", new Class[] { String.class }); | |
meth.invoke(mapPolicy, new Object[] { "java.util.HashMap" }); | |
} catch (Exception e) { | |
throw new RuntimeException(e); | |
} | |
aamapping.setContainerPolicy(mapPolicy); | |
descriptor.addMapping(aamapping); | |
// any object mapping | |
XMLAnyObjectMapping aomapping = new XMLAnyObjectMapping(); | |
aomapping.setAttributeName("anyObject"); | |
aomapping.setGetMethodName("getAnyObject"); | |
aomapping.setSetMethodName("setAnyObject"); | |
descriptor.addMapping(aomapping); | |
// any collection mapping | |
XMLAnyCollectionMapping acmapping = new XMLAnyCollectionMapping(); | |
acmapping.setXPath("any-collection"); | |
acmapping.setAttributeName("anyCollection"); | |
acmapping.setGetMethodName("getAnyCollection"); | |
acmapping.setSetMethodName("setAnyCollection"); | |
descriptor.addMapping(acmapping); | |
// setup binary data and choice mapping, but only add the mappings in certain cases | |
// binary data mapping | |
XMLBinaryDataMapping photoMapping = new XMLBinaryDataMapping(); | |
photoMapping.setAttributeName("photo"); | |
XMLField field = new XMLField("photo"); | |
field.setSchemaType(XMLConstants.BASE_64_BINARY_QNAME); | |
photoMapping.setField(field); | |
photoMapping.setShouldInlineBinaryData(false); | |
photoMapping.setSwaRef(false); | |
photoMapping.setMimeType("image"); | |
// binary data collection mapping | |
XMLBinaryDataCollectionMapping photosMapping = new XMLBinaryDataCollectionMapping(); | |
photosMapping.setAttributeName("photos"); | |
XMLField xfield = new XMLField("photos/photo"); | |
xfield.setSchemaType(XMLConstants.BASE_64_BINARY_QNAME); | |
photosMapping.setField(xfield); | |
photosMapping.setShouldInlineBinaryData(false); | |
photosMapping.setSwaRef(false); | |
photosMapping.setMimeType("image"); | |
photosMapping.setCollectionContentType(ClassConstants.APBYTE); | |
// choice mapping | |
XMLChoiceObjectMapping choiceMapping = new XMLChoiceObjectMapping(); | |
choiceMapping.setAttributeName("choice"); | |
choiceMapping.setGetMethodName("getChoice"); | |
choiceMapping.setSetMethodName("setChoice"); | |
choiceMapping.addChoiceElement("string-choice/text()", String.class); | |
choiceMapping.addChoiceElement("int-choice/text()", Integer.class); | |
// choice collection mapping | |
XMLChoiceCollectionMapping choiceColMapping = new XMLChoiceCollectionMapping(); | |
choiceColMapping.setAttributeName("choices"); | |
choiceColMapping.setGetMethodName("getChoices"); | |
choiceColMapping.setSetMethodName("setChoices"); | |
choiceColMapping.addChoiceElement("street-choice/text()", String.class); | |
choiceColMapping.addChoiceElement("address-choice", addressClass); | |
choiceColMapping.addChoiceElement("integer-choice/text()", Integer.class); | |
// 1- binary and choice are supported with SAX and Java project | |
// 2- neither is supported with deployment XML | |
// 3- binary is supported with DOM | |
if (metadata == OXTestCase.Metadata.JAVA) { | |
descriptor.addMapping(photoMapping); | |
descriptor.addMapping(photosMapping); | |
} | |
if (platform == OXTestCase.Platform.SAX) { | |
descriptor.addMapping(choiceMapping); | |
descriptor.addMapping(choiceColMapping); | |
} | |
// object reference mapping | |
XMLObjectReferenceMapping orMapping = new XMLObjectReferenceMapping(); | |
orMapping.setAttributeName("address"); | |
orMapping.setReferenceClassName(addressClass.getName()); | |
orMapping.addSourceToTargetKeyFieldAssociation("billing-address-ref/@address-id", "@aid"); | |
descriptor.addMapping(orMapping); | |
// collection reference mapping | |
XMLCollectionReferenceMapping addressesMapping = new XMLCollectionReferenceMapping(); | |
ContainerPolicy listPolicy; | |
try { | |
listPolicy = (ContainerPolicy) listContainerPolicyClass.newInstance(); | |
Method meth = listContainerPolicyClass.getDeclaredMethod("setContainerClassName", new Class[] { String.class }); | |
meth.invoke(listPolicy, new Object[] { "java.util.ArrayList" }); | |
} catch (Exception e) { | |
throw new RuntimeException(e); | |
} | |
addressesMapping.setContainerPolicy(listPolicy); | |
addressesMapping.setAttributeName("addresses"); | |
addressesMapping.setReferenceClassName(addressClass.getName()); | |
addressesMapping.addSourceToTargetKeyFieldAssociation("shipping-address-ref/@address-id", "@aid"); | |
descriptor.addMapping(addressesMapping); | |
// direct collection mapping | |
XMLCompositeDirectCollectionMapping responsibilitiesMapping = new XMLCompositeDirectCollectionMapping(); | |
responsibilitiesMapping.setAttributeName("responsibilities"); | |
ContainerPolicy listPolicy1; | |
try { | |
listPolicy1 = (ContainerPolicy) listContainerPolicyClass.newInstance(); | |
Method meth = listContainerPolicyClass.getDeclaredMethod("setContainerClassName", new Class[] { String.class }); | |
meth.invoke(listPolicy1, new Object[] { "java.util.ArrayList" }); | |
} catch (Exception e) { | |
throw new RuntimeException(e); | |
} | |
responsibilitiesMapping.setContainerPolicy(listPolicy1); | |
responsibilitiesMapping.setXPath("responsibilities/list/@responsibility"); | |
descriptor.addMapping(responsibilitiesMapping); | |
return descriptor; | |
} | |
public ClassDescriptor buildAnyObjectDescriptor() { | |
XMLDescriptor descriptor = new XMLDescriptor(); | |
descriptor.setJavaClass(anyObjectClass); | |
descriptor.setDefaultRootElement("any-object"); | |
// id mapping | |
XMLDirectMapping idMapping = new XMLDirectMapping(); | |
idMapping.setXPath("@id"); | |
idMapping.setAttributeName("id"); | |
idMapping.setGetMethodName("getId"); | |
idMapping.setSetMethodName("setId"); | |
descriptor.addMapping(idMapping); | |
// name mapping | |
XMLDirectMapping nameMapping = new XMLDirectMapping(); | |
nameMapping.setXPath("name"); | |
nameMapping.setAttributeName("name"); | |
nameMapping.setGetMethodName("getName"); | |
nameMapping.setSetMethodName("setName"); | |
descriptor.addMapping(nameMapping); | |
return descriptor; | |
} | |
public ClassDescriptor buildAddressDescriptor() { | |
XMLDescriptor descriptor = new XMLDescriptor(); | |
descriptor.setJavaClass(addressClass); | |
// set primary key for reference mapping tests | |
descriptor.addPrimaryKeyFieldName("@aid"); | |
// id mapping | |
XMLDirectMapping idMapping = new XMLDirectMapping(); | |
idMapping.setAttributeName("id"); | |
idMapping.setXPath("@aid"); | |
descriptor.addMapping(idMapping); | |
// street mapping | |
XMLDirectMapping streetMapping = new XMLDirectMapping(); | |
streetMapping.setAttributeName("street"); | |
streetMapping.setXPath("street/text()"); | |
streetMapping.setGetMethodName("getStreet"); | |
streetMapping.setSetMethodName("setStreet"); | |
descriptor.addMapping(streetMapping); | |
// city mapping | |
XMLDirectMapping cityMapping = new XMLDirectMapping(); | |
cityMapping.setAttributeName("city"); | |
cityMapping.setXPath("city/text()"); | |
cityMapping.setGetMethodName("getCity"); | |
cityMapping.setSetMethodName("setCity"); | |
descriptor.addMapping(cityMapping); | |
return descriptor; | |
} | |
} |