use of org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping in project eclipselink by eclipse-ee4j.
the class XMLChoiceWithReferenceProject method getEmployeeDescriptor.
public XMLDescriptor getEmployeeDescriptor() {
XMLDescriptor desc = new XMLDescriptor();
desc.setJavaClass(Employee.class);
XMLDirectMapping name = new XMLDirectMapping();
name.setAttributeName("name");
name.setXPath("name/text()");
desc.addMapping(name);
XMLChoiceCollectionMapping mapping = new XMLChoiceCollectionMapping();
mapping.setAttributeName("contact");
List<XMLField> sourceFields = new ArrayList<XMLField>();
List<XMLField> targetFields = new ArrayList<XMLField>();
XMLField source = new XMLField("address/address-id/text()");
sourceFields.add(source);
source = new XMLField("address/zip/text()");
sourceFields.add(source);
XMLField target = new XMLField("@id");
targetFields.add(target);
target = new XMLField("zip/text()");
targetFields.add(target);
mapping.addChoiceElement(sourceFields, Address.class, targetFields);
sourceFields = new ArrayList<XMLField>();
source = new XMLField("work-address/id/text()");
sourceFields.add(source);
source = new XMLField("work-address/zip/text()");
sourceFields.add(source);
mapping.addChoiceElement(sourceFields, Address.class, targetFields);
sourceFields = new ArrayList<XMLField>();
source = new XMLField("phone/@id");
sourceFields.add(source);
targetFields = new ArrayList<XMLField>();
target = new XMLField("@id");
targetFields.add(target);
mapping.addChoiceElement(sourceFields, PhoneNumber.class, targetFields);
desc.addMapping(mapping);
return desc;
}
use of org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping in project eclipselink by eclipse-ee4j.
the class DBWSModelProject method buildServiceDescriptor.
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;
}
use of org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping in project eclipselink by eclipse-ee4j.
the class XMLDescriptor method initialize.
/**
* INTERNAL:
* Initialize the mappings as a separate step.
* This is done as a separate step to ensure that inheritance has been first resolved.
*/
@Override
public void initialize(AbstractSession session) throws DescriptorException {
if (this.hasInheritance()) {
((org.eclipse.persistence.internal.oxm.QNameInheritancePolicy) this.getInheritancePolicy()).setNamespaceResolver(this.getNamespaceResolver());
}
if (null != this.defaultRootElementField) {
defaultRootElementField.setNamespaceResolver(this.namespaceResolver);
defaultRootElementField.initialize();
}
if (schemaReference != null && schemaReference.getSchemaContext() != null && (schemaReference.getType() == XMLSchemaReference.COMPLEX_TYPE || schemaReference.getType() == XMLSchemaReference.SIMPLE_TYPE) && getDefaultRootElementType() == null) {
if (hasInheritance() && isChildDescriptor()) {
XMLField parentField = ((XMLDescriptor) getInheritancePolicy().getParentDescriptor()).getDefaultRootElementField();
// if this descriptor has a root element field different than it's parent set the leaf element type of the default root field
if (parentField == null || (parentField != null && defaultRootElementField != null && !defaultRootElementField.getXPathFragment().equals(parentField.getXPathFragment()))) {
setDefaultRootElementType(schemaReference.getSchemaContextAsQName(getNamespaceResolver()));
}
} else {
setDefaultRootElementType(schemaReference.getSchemaContextAsQName(getNamespaceResolver()));
}
}
if (null != primaryKeyFields) {
for (int x = 0, primaryKeyFieldsSize = this.primaryKeyFields.size(); x < primaryKeyFieldsSize; x++) {
XMLField pkField = (XMLField) this.primaryKeyFields.get(x);
pkField.setNamespaceResolver(this.namespaceResolver);
pkField.initialize();
}
}
// If defined as read-only, add to it's project's default read-only classes collection.
if (shouldBeReadOnly() && (!session.getDefaultReadOnlyClasses().contains(getJavaClass()))) {
session.getDefaultReadOnlyClasses().add(getJavaClass());
}
// Avoid repetitive initialization (this does not solve loops)
if (isInitialized(INITIALIZED) || isInvalid()) {
return;
}
setInitializationStage(INITIALIZED);
// make sure that parent mappings are initialized?
if (isChildDescriptor()) {
ClassDescriptor parentDescriptor = getInheritancePolicy().getParentDescriptor();
parentDescriptor.initialize(session);
if (parentDescriptor.hasEventManager()) {
getEventManager();
}
}
for (Enumeration<DatabaseMapping> mappingsEnum = getMappings().elements(); mappingsEnum.hasMoreElements(); ) {
DatabaseMapping mapping = mappingsEnum.nextElement();
validateMappingType(mapping);
mapping.initialize(session);
if (mapping.isObjectReferenceMapping()) {
this.hasReferenceMappings = true;
}
if (mapping instanceof XMLChoiceObjectMapping) {
XMLChoiceObjectMapping choiceMapping = ((XMLChoiceObjectMapping) mapping);
for (XMLMapping next : choiceMapping.getChoiceElementMappings().values()) {
if (((DatabaseMapping) next).isObjectReferenceMapping()) {
this.hasReferenceMappings = true;
}
}
}
if (mapping instanceof XMLChoiceCollectionMapping) {
XMLChoiceCollectionMapping choiceMapping = ((XMLChoiceCollectionMapping) mapping);
for (XMLMapping next : choiceMapping.getChoiceElementMappings().values()) {
if (((DatabaseMapping) next).isObjectReferenceMapping()) {
this.hasReferenceMappings = true;
}
}
}
// Add all the fields in the mapping to myself.
Helper.addAllUniqueToVector(getFields(), mapping.getFields());
}
// If this has inheritance then it needs to be initialized before all fields is set.
if (hasInheritance()) {
getInheritancePolicy().initialize(session);
}
// Initialize the allFields to its fields, this can be done now because the fields have been computed.
setAllFields((Vector) getFields().clone());
getObjectBuilder().initialize(session);
if (hasInterfacePolicy()) {
interfaceInitialization(session);
}
if (hasReturningPolicy()) {
getReturningPolicy().initialize(session);
}
if (eventManager != null) {
eventManager.initialize(session);
}
if (copyPolicy != null) {
copyPolicy.initialize(session);
}
getInstantiationPolicy().initialize(session);
if (getSchemaReference() != null) {
getSchemaReference().initialize(session);
}
// If a Location Accessor is set on a superclass, inherit it
if (getInheritancePolicyOrNull() != null && getInheritancePolicy().getParentDescriptor() != null) {
XMLDescriptor d = (XMLDescriptor) getInheritancePolicy().getParentDescriptor();
locationAccessor = d.getLocationAccessor();
}
if (locationAccessor != null) {
locationAccessor.initializeAttributes(getJavaClass());
}
}
use of org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping in project eclipselink by eclipse-ee4j.
the class TestProject method getEmployeeDescriptor.
private XMLDescriptor getEmployeeDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(Employee.class);
descriptor.setAlias("Employee");
descriptor.addPrimaryKeyFieldName("name/text()");
descriptor.setNamespaceResolver(nsr);
if (setSchemaContext) {
XMLSchemaReference sRef = new XMLSchemaURLReference();
sRef.setSchemaContext("/employee-type");
sRef.setType(XMLSchemaReference.COMPLEX_TYPE);
descriptor.setSchemaReference(sRef);
}
if (setDefaultRootElement) {
descriptor.setDefaultRootElement("employee");
}
// create name mapping
XMLDirectMapping nameMapping = new XMLDirectMapping();
nameMapping.setAttributeName("name");
nameMapping.setXPath("name/text()");
descriptor.addMapping(nameMapping);
// create address mapping
XMLCompositeObjectMapping addressMapping = new XMLCompositeObjectMapping();
addressMapping.setAttributeName("address");
addressMapping.setXPath("address");
addressMapping.setReferenceClass(Address.class);
descriptor.addMapping(addressMapping);
// create phoneNumbers mapping
XMLCompositeCollectionMapping phonesMapping = new XMLCompositeCollectionMapping();
phonesMapping.setAttributeName("phoneNumbers");
phonesMapping.useCollectionClass(ArrayList.class);
phonesMapping.setXPath("phone-numbers");
phonesMapping.setReferenceClass(PhoneNumber.class);
descriptor.addMapping(phonesMapping);
// create projectIDs mapping
XMLCompositeDirectCollectionMapping projectIdsMapping = new XMLCompositeDirectCollectionMapping();
projectIdsMapping.setAttributeName("projectIDs");
projectIdsMapping.useCollectionClass(ArrayList.class);
projectIdsMapping.setXPath("project-id");
TypeConversionConverter tcc = new TypeConversionConverter(projectIdsMapping);
tcc.setObjectClass(BigDecimal.class);
projectIdsMapping.setValueConverter(tcc);
descriptor.addMapping(projectIdsMapping);
// create stuff mapping
XMLAnyCollectionMapping acMapping = new XMLAnyCollectionMapping();
acMapping.setAttributeName("stuff");
descriptor.addMapping(acMapping);
// Enable Choice testing when Bug 269880 has been fixed
// create choice mapping - choice
XMLChoiceObjectMapping choiceMapping = new XMLChoiceObjectMapping();
choiceMapping.setAttributeName("choice");
choiceMapping.addChoiceElement("nickname/text()", String.class);
choiceMapping.addChoiceElement("secondAddress", Address.class);
choiceMapping.addChoiceElement("age/text()", Integer.class);
// descriptor.addMapping(choiceMapping);
// Enable ChoiceCollection testing when Bug 269880 has been fixed
// create choices mapping
XMLChoiceCollectionMapping choiceCMapping = new XMLChoiceCollectionMapping();
choiceCMapping.setAttributeName("choices");
choiceCMapping.addChoiceElement("badgeId/text()", Integer.class);
choiceCMapping.addChoiceElement("alternateAddress", Address.class);
choiceCMapping.addChoiceElement("codename/text()", String.class);
// descriptor.addMapping(choiceCMapping);
// create billingAddress mapping
XMLObjectReferenceMapping orMapping = new XMLObjectReferenceMapping();
orMapping.setAttributeName("billingAddress");
orMapping.setReferenceClass(Address.class);
orMapping.addSourceToTargetKeyFieldAssociation("@bill-address-id", "@aid");
orMapping.addSourceToTargetKeyFieldAssociation("bill-address-city/text()", "city/text()");
descriptor.addMapping(orMapping);
// create data mapping
XMLBinaryDataMapping dataMapping = new XMLBinaryDataMapping();
dataMapping.setAttributeName("data");
XMLField field = new XMLField("data");
field.setSchemaType(XMLConstants.BASE_64_BINARY_QNAME);
dataMapping.setField(field);
dataMapping.setShouldInlineBinaryData(false);
dataMapping.setSwaRef(true);
dataMapping.setMimeType("application/binary");
descriptor.addMapping(dataMapping);
// create bytes mapping
XMLBinaryDataCollectionMapping bytesMapping = new XMLBinaryDataCollectionMapping();
bytesMapping.setAttributeName("bytes");
XMLField theField = new XMLField("bytes");
theField.setSchemaType(XMLConstants.BASE_64_BINARY_QNAME);
bytesMapping.setField(theField);
bytesMapping.setShouldInlineBinaryData(false);
bytesMapping.setSwaRef(false);
bytesMapping.setMimeType("text/plain");
descriptor.addMapping(bytesMapping);
// create URL mapping
XMLDirectMapping urlMapping = new XMLDirectMapping();
urlMapping.setAttributeName("aUrl");
urlMapping.setXPath("aUrl/text()");
descriptor.addMapping(urlMapping);
return descriptor;
}
use of org.eclipse.persistence.oxm.mappings.XMLChoiceCollectionMapping in project eclipselink by eclipse-ee4j.
the class MappingsGenerator method generateMappingForReferenceProperty.
public Mapping generateMappingForReferenceProperty(Property property, Descriptor descriptor, NamespaceInfo namespaceInfo) {
boolean isCollection = helper.isCollectionType(property.getType()) || property.getType().isArray();
Mapping mapping;
if (isCollection) {
mapping = new XMLChoiceCollectionMapping();
initializeXMLContainerMapping((ChoiceCollectionMapping) mapping, property.getType().isArray());
JavaClass collectionType = property.getType();
collectionType = containerClassImpl(collectionType);
((ChoiceCollectionMapping) mapping).useCollectionClassName(collectionType.getRawName());
JAXBElementRootConverter jaxbERConverter = new JAXBElementRootConverter(Object.class);
if (property.isSetXmlJavaTypeAdapter()) {
JavaClass adapterClass = helper.getJavaClass(property.getXmlJavaTypeAdapter().getValue());
jaxbERConverter.setNestedConverter(new XMLJavaTypeConverter(adapterClass.getQualifiedName()));
}
((ChoiceCollectionMapping) mapping).setConverter(jaxbERConverter);
if (property.isSetWriteOnly()) {
((ChoiceCollectionMapping) mapping).setIsWriteOnly(property.isWriteOnly());
}
if (property.isSetXmlElementWrapper()) {
((ChoiceCollectionMapping) mapping).setWrapperNullPolicy(getWrapperNullPolicyFromProperty(property));
}
} else {
mapping = new XMLChoiceObjectMapping();
JAXBElementRootConverter jaxbERConverter = new JAXBElementRootConverter(Object.class);
if (property.isSetXmlJavaTypeAdapter()) {
JavaClass adapterClass = helper.getJavaClass(property.getXmlJavaTypeAdapter().getValue());
jaxbERConverter.setNestedConverter(new XMLJavaTypeConverter(adapterClass.getQualifiedName()));
}
((ChoiceObjectMapping) mapping).setConverter(jaxbERConverter);
if (property.isSetWriteOnly()) {
((ChoiceObjectMapping) mapping).setIsWriteOnly(property.isWriteOnly());
}
}
initializeXMLMapping((XMLMapping) mapping, property);
List<ElementDeclaration> referencedElements = property.getReferencedElements();
JavaClass propertyType = property.getType();
if (propertyType.isArray()) {
JAXBArrayAttributeAccessor accessor = new JAXBArrayAttributeAccessor(mapping.getAttributeAccessor(), mapping.getContainerPolicy(), helper.getClassLoader());
accessor.setComponentClassName(property.getType().getComponentType().getQualifiedName());
JavaClass componentType = propertyType.getComponentType();
if (componentType.isArray()) {
Class<?> adaptedClass = classToGeneratedClasses.get(componentType.getQualifiedName());
accessor.setAdaptedClassName(adaptedClass.getName());
}
mapping.setAttributeAccessor(accessor);
}
String wrapperXPath = "";
// handle XmlElementWrapper
if (property.isSetXmlElementWrapper()) {
XmlElementWrapper wrapper = property.getXmlElementWrapper();
String namespace = wrapper.getNamespace();
if (namespace.equals(XMLProcessor.DEFAULT)) {
if (namespaceInfo.isElementFormQualified()) {
namespace = namespaceInfo.getNamespace();
} else {
namespace = "";
}
}
if (namespace.equals("")) {
wrapperXPath += (wrapper.getName() + "/");
} else {
String prefix = getPrefixForNamespace(namespace, getNamespaceResolverForDescriptor(namespaceInfo));
wrapperXPath += getQualifiedString(prefix, wrapper.getName() + "/");
}
}
if (property.isMixedContent() && isCollection) {
if (wrapperXPath.length() == 0) {
((ChoiceCollectionMapping) mapping).setMixedContent(true);
} else {
((ChoiceCollectionMapping) mapping).setMixedContent(wrapperXPath.substring(0, wrapperXPath.length() - 1));
}
}
for (ElementDeclaration element : referencedElements) {
QName elementName = element.getElementName();
JavaClass pType = element.getJavaType();
String pTypeName = element.getJavaTypeName();
boolean isBinaryType = (areEquals(pType, AnnotationsProcessor.JAVAX_ACTIVATION_DATAHANDLER) || areEquals(pType, byte[].class) || areEquals(pType, Image.class) || areEquals(pType, Source.class) || areEquals(pType, AnnotationsProcessor.JAVAX_MAIL_INTERNET_MIMEMULTIPART));
boolean isText = pType.isEnum() || (!isBinaryType && !(this.typeInfo.containsKey(element.getJavaTypeName())) && !(element.getJavaTypeName().equals(OBJECT_CLASS_NAME)));
String xPath = wrapperXPath;
Field xmlField = this.getXPathForElement(xPath, elementName, namespaceInfo, isText);
// ensure byte[] goes to base64 instead of the default hex.
if (helper.getXMLToJavaTypeMap().get(pType.getRawName()) == Constants.BASE_64_BINARY_QNAME) {
xmlField.setSchemaType(Constants.BASE_64_BINARY_QNAME);
}
if (areEquals(pType, Object.class)) {
setTypedTextField(xmlField);
}
Mapping nestedMapping;
AbstractNullPolicy nullPolicy = null;
if (isCollection) {
ChoiceCollectionMapping xmlChoiceCollectionMapping = (ChoiceCollectionMapping) mapping;
xmlChoiceCollectionMapping.addChoiceElement(xmlField, pTypeName);
nestedMapping = (Mapping) xmlChoiceCollectionMapping.getChoiceElementMappings().get(xmlField);
if (nestedMapping.isAbstractCompositeCollectionMapping()) {
((CompositeCollectionMapping) nestedMapping).setKeepAsElementPolicy(UnmarshalKeepAsElementPolicy.KEEP_UNKNOWN_AS_ELEMENT);
nullPolicy = ((CompositeCollectionMapping) nestedMapping).getNullPolicy();
}
if (nestedMapping.isAbstractCompositeDirectCollectionMapping()) {
DirectCollectionMapping nestedCompositeDirectCollectionMapping = (DirectCollectionMapping) nestedMapping;
nullPolicy = nestedCompositeDirectCollectionMapping.getNullPolicy();
if (pType.isEnum()) {
TypeInfo enumTypeInfo = typeInfo.get(pType.getQualifiedName());
nestedCompositeDirectCollectionMapping.setValueConverter(buildJAXBEnumTypeConverter(nestedCompositeDirectCollectionMapping, (EnumTypeInfo) enumTypeInfo));
}
if (element.isList()) {
XMLListConverter listConverter = new XMLListConverter();
listConverter.setObjectClassName(pType.getQualifiedName());
((DirectCollectionMapping) nestedMapping).setValueConverter(listConverter);
}
} else if (nestedMapping instanceof BinaryDataCollectionMapping) {
nullPolicy = ((BinaryDataCollectionMapping) nestedMapping).getNullPolicy();
if (element.isList()) {
((XMLField) nestedMapping.getField()).setUsesSingleNode(true);
}
}
} else {
ChoiceObjectMapping xmlChoiceObjectMapping = (ChoiceObjectMapping) mapping;
xmlChoiceObjectMapping.addChoiceElement(xmlField, pTypeName);
nestedMapping = (Mapping) xmlChoiceObjectMapping.getChoiceElementMappings().get(xmlField);
if (pType.isEnum()) {
TypeInfo enumTypeInfo = typeInfo.get(pType.getQualifiedName());
((DirectMapping) nestedMapping).setConverter(buildJAXBEnumTypeConverter(nestedMapping, (EnumTypeInfo) enumTypeInfo));
}
if (nestedMapping.isAbstractCompositeObjectMapping()) {
((CompositeObjectMapping) nestedMapping).setKeepAsElementPolicy(UnmarshalKeepAsElementPolicy.KEEP_UNKNOWN_AS_ELEMENT);
nullPolicy = ((CompositeObjectMapping) nestedMapping).getNullPolicy();
} else if (nestedMapping instanceof BinaryDataMapping) {
nullPolicy = ((BinaryDataMapping) nestedMapping).getNullPolicy();
} else if (nestedMapping instanceof DirectMapping) {
nullPolicy = ((DirectMapping) nestedMapping).getNullPolicy();
}
}
if (nullPolicy != null) {
nullPolicy.setNullRepresentedByEmptyNode(false);
nullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.XSI_NIL);
nullPolicy.setNullRepresentedByXsiNil(true);
nullPolicy.setIgnoreAttributesForNil(false);
}
if (!element.isXmlRootElement()) {
Class<?> scopeClass = element.getScopeClass();
if (scopeClass == jakarta.xml.bind.annotation.XmlElementDecl.GLOBAL.class) {
scopeClass = JAXBElement.GlobalScope.class;
}
Class<?> declaredType = null;
if (element.getAdaptedJavaType() != null) {
declaredType = org.eclipse.persistence.internal.helper.Helper.getClassFromClasseName(element.getAdaptedJavaType().getQualifiedName(), helper.getClassLoader());
} else {
declaredType = org.eclipse.persistence.internal.helper.Helper.getClassFromClasseName(pType.getQualifiedName(), helper.getClassLoader());
}
JAXBElementConverter converter = new JAXBElementConverter(xmlField, declaredType, scopeClass);
if (isCollection) {
ChoiceCollectionMapping xmlChoiceCollectionMapping = (ChoiceCollectionMapping) mapping;
if (element.getJavaTypeAdapterClass() != null) {
converter.setNestedConverter(new XMLJavaTypeConverter(element.getJavaTypeAdapterClass().getName()));
} else {
CoreConverter originalConverter = xmlChoiceCollectionMapping.getConverter(xmlField);
converter.setNestedConverter(originalConverter);
}
xmlChoiceCollectionMapping.addConverter(xmlField, converter);
} else {
ChoiceObjectMapping xmlChoiceObjectMapping = (ChoiceObjectMapping) mapping;
if (element.getJavaTypeAdapterClass() != null) {
converter.setNestedConverter(new XMLJavaTypeConverter(element.getJavaTypeAdapterClass().getName()));
} else {
CoreConverter originalConverter = xmlChoiceObjectMapping.getConverter(xmlField);
converter.setNestedConverter(originalConverter);
}
xmlChoiceObjectMapping.addConverter(xmlField, converter);
}
}
}
if (property.isAny()) {
if (isCollection) {
XMLChoiceCollectionMapping xmlChoiceCollectionMapping = (XMLChoiceCollectionMapping) mapping;
xmlChoiceCollectionMapping.setIsAny(true);
}
}
return mapping;
}
Aggregations