blob: bdb0386eb57f62a77dee774e4bee6b7bcd4620ab [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 Oracle. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0, which accompanies this distribution
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Oracle - initial API and implementation
*******************************************************************************/
package org.eclipse.jpt.jaxb.eclipselink.core.internal.context.oxm;
import java.util.List;
import org.eclipse.jpt.common.core.utility.TextRange;
import org.eclipse.jpt.common.utility.internal.ClassNameTools;
import org.eclipse.jpt.common.utility.internal.ObjectTools;
import org.eclipse.jpt.common.utility.internal.StringTools;
import org.eclipse.jpt.common.utility.internal.TypeDeclarationTools;
import org.eclipse.jpt.common.utility.internal.iterable.LiveCloneListIterable;
import org.eclipse.jpt.common.utility.iterable.ListIterable;
import org.eclipse.jpt.jaxb.core.internal.context.AbstractJaxbContextNode;
import org.eclipse.jpt.jaxb.eclipselink.core.context.ELXmlAccessOrder;
import org.eclipse.jpt.jaxb.eclipselink.core.context.ELXmlAccessType;
import org.eclipse.jpt.jaxb.eclipselink.core.context.oxm.OxmFile;
import org.eclipse.jpt.jaxb.eclipselink.core.context.oxm.OxmJavaType;
import org.eclipse.jpt.jaxb.eclipselink.core.context.oxm.OxmXmlBindings;
import org.eclipse.jpt.jaxb.eclipselink.core.resource.oxm.EJavaType;
import org.eclipse.jpt.jaxb.eclipselink.core.resource.oxm.EXmlBindings;
import org.eclipse.jpt.jaxb.eclipselink.core.resource.oxm.OxmFactory;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
import org.eclipse.wst.validation.internal.provisional.core.IReporter;
public class OxmXmlBindingsImpl
extends AbstractJaxbContextNode
implements OxmXmlBindings {
protected EXmlBindings eXmlBindings;
protected ELXmlAccessType specifiedAccessType;
protected ELXmlAccessOrder specifiedAccessOrder;
protected boolean xmlMappingMetadataComplete;
protected String specifiedPackageName;
protected String impliedPackageName;
protected final ContextListContainer<OxmJavaType, EJavaType> javaTypeContainer;
public OxmXmlBindingsImpl(OxmFile parent, EXmlBindings eXmlBindings) {
super(parent);
this.eXmlBindings = eXmlBindings;
this.specifiedAccessType = buildSpecifiedAccessType();
this.specifiedAccessOrder = buildSpecifiedAccessOrder();
this.xmlMappingMetadataComplete = buildXmlMappingMetadataComplete();
this.specifiedPackageName = buildSpecifiedPackageName();
// impliedPackageName not built until update, as it depends on sub-nodes
this.javaTypeContainer = buildJavaTypeContainer();
}
public EXmlBindings getEXmlBindings() {
return this.eXmlBindings;
}
// ***** sync/update *****
@Override
public void synchronizeWithResourceModel() {
super.synchronizeWithResourceModel();
setSpecifiedAccessType_(buildSpecifiedAccessType());
setSpecifiedAccessOrder_(buildSpecifiedAccessOrder());
setXmlMappingMetadataComplete_(buildXmlMappingMetadataComplete());
setSpecifiedPackageName_(buildSpecifiedPackageName());
this.javaTypeContainer.synchronizeWithResourceModel();
}
@Override
public void update() {
super.update();
setImpliedPackageName_(buildImpliedPackageName());
this.javaTypeContainer.update();
}
// ***** xml access type *****
public ELXmlAccessType getAccessType() {
return (this.specifiedAccessType != null) ? this.specifiedAccessType : getDefaultAccessType();
}
public ELXmlAccessType getDefaultAccessType() {
return ELXmlAccessType.PUBLIC_MEMBER;
}
public ELXmlAccessType getSpecifiedAccessType() {
return this.specifiedAccessType;
}
public void setSpecifiedAccessType(ELXmlAccessType newAccessType) {
this.eXmlBindings.setXmlAccessorType(ELXmlAccessType.toOxmResourceModel(newAccessType));
setSpecifiedAccessType_(newAccessType);
}
protected void setSpecifiedAccessType_(ELXmlAccessType newAccessType) {
ELXmlAccessType oldAccessType = this.specifiedAccessType;
this.specifiedAccessType = newAccessType;
firePropertyChanged(SPECIFIED_ACCESS_TYPE_PROPERTY, oldAccessType, newAccessType);
}
protected ELXmlAccessType buildSpecifiedAccessType() {
return ELXmlAccessType.fromOxmResourceModel(this.eXmlBindings.getXmlAccessorType());
}
// ***** xml access order *****
public ELXmlAccessOrder getAccessOrder() {
return (this.specifiedAccessOrder != null) ? this.specifiedAccessOrder : getDefaultAccessOrder();
}
public ELXmlAccessOrder getDefaultAccessOrder() {
return ELXmlAccessOrder.UNDEFINED;
}
public ELXmlAccessOrder getSpecifiedAccessOrder() {
return this.specifiedAccessOrder;
}
public void setSpecifiedAccessOrder(ELXmlAccessOrder newAccessOrder) {
this.eXmlBindings.setXmlAccessorOrder(ELXmlAccessOrder.toOxmResourceModel(newAccessOrder));
setSpecifiedAccessOrder_(newAccessOrder);
}
protected void setSpecifiedAccessOrder_(ELXmlAccessOrder newAccessOrder) {
ELXmlAccessOrder oldAccessOrder = this.specifiedAccessOrder;
this.specifiedAccessOrder = newAccessOrder;
firePropertyChanged(SPECIFIED_ACCESS_ORDER_PROPERTY, oldAccessOrder, newAccessOrder);
}
protected ELXmlAccessOrder buildSpecifiedAccessOrder() {
return ELXmlAccessOrder.fromOxmResourceModel(this.eXmlBindings.getXmlAccessorOrder());
}
// ***** xml mapping metadata complete *****
public boolean isXmlMappingMetadataComplete() {
return this.xmlMappingMetadataComplete;
}
public void setXmlMappingMetadataComplete(boolean newValue) {
this.eXmlBindings.setXmlMappingMetadataComplete((newValue) ? newValue : null); // set to null if false
setXmlMappingMetadataComplete_(newValue);
}
protected void setXmlMappingMetadataComplete_(boolean newValue) {
boolean oldValue = this.xmlMappingMetadataComplete;
this.xmlMappingMetadataComplete = newValue;
firePropertyChanged(XML_MAPPING_METADATA_COMPLETE_PROPERTY, oldValue, newValue);
}
protected boolean buildXmlMappingMetadataComplete() {
Boolean eValue = this.eXmlBindings.getXmlMappingMetadataComplete();
return (eValue == null) ? false : eValue.booleanValue(); // if xml value is null or false, use false
}
// ***** package name *****
public String getSpecifiedPackageName() {
return this.specifiedPackageName;
}
public void setSpecifiedPackageName(String packageName) {
this.eXmlBindings.setPackageName(packageName);
setSpecifiedPackageName_(packageName);
}
protected void setSpecifiedPackageName_(String packageName) {
String oldPackageName = this.specifiedPackageName;
this.specifiedPackageName = packageName;
firePropertyChanged(SPECIFIED_PACKAGE_NAME_PROPERTY, oldPackageName, packageName);
}
protected String buildSpecifiedPackageName() {
return this.eXmlBindings.getPackageName();
}
public String getImpliedPackageName() {
return this.impliedPackageName;
}
protected void setImpliedPackageName_(String packageName) {
String oldPackageName = this.impliedPackageName;
this.impliedPackageName = packageName;
firePropertyChanged(IMPLIED_PACKAGE_NAME_PROPERTY, oldPackageName, packageName);
}
protected String buildImpliedPackageName() {
for (OxmJavaType javaType : getJavaTypes()) {
String packageName = TypeDeclarationTools.packageName(javaType.getSpecifiedName());
if (! StringTools.isBlank(packageName)) {
return packageName;
}
}
return StringTools.EMPTY_STRING;
}
public String getPackageName() {
return (this.specifiedPackageName != null) ? this.specifiedPackageName : this.impliedPackageName;
}
/**
* append package if the name is not qualified
*/
public String getQualifiedName(String className) {
if (StringTools.isBlank(className)) {
return StringTools.EMPTY_STRING;
}
if (className.indexOf('.') >= 0) {
return className;
}
// account for arrays
String componentClassName = TypeDeclarationTools.elementTypeName(className);
if (ClassNameTools.isPrimitive(componentClassName)) {
return className;
}
if (TypeDeclarationTools.isJavaLangClass(className)) {
return StringTools.concatenate("java.lang.", className);
}
if (StringTools.isBlank(this.specifiedPackageName)) {
return className;
}
return StringTools.concatenate(this.specifiedPackageName, ".", className);
}
// ***** java types *****
public ListIterable<OxmJavaType> getJavaTypes() {
return this.javaTypeContainer.getContextElements();
}
public int getJavaTypesSize() {
return this.javaTypeContainer.getContextElementsSize();
}
public OxmJavaType getJavaType(int index) {
return this.javaTypeContainer.getContextElement(index);
}
public OxmJavaType getJavaType(String qualifiedName) {
for (OxmJavaType javaType : getJavaTypes()) {
if (ObjectTools.equals(javaType.getQualifiedName(), qualifiedName)) {
return javaType;
}
}
return null;
}
public OxmJavaType addJavaType(int index) {
EJavaType eJavaType = OxmFactory.eINSTANCE.createEJavaType();
OxmJavaType javaType = this.javaTypeContainer.addContextElement(index, eJavaType);
this.eXmlBindings.getJavaTypes().add(index, eJavaType);
return javaType;
}
public void removeJavaType(int index) {
removeJavaType_(index);
this.eXmlBindings.getJavaTypes().remove(index);
}
protected void removeJavaType_(int index) {
this.javaTypeContainer.removeContextElement(index);
}
protected ListIterable<EJavaType> getEJavaTypes() {
return new LiveCloneListIterable<EJavaType>(this.eXmlBindings.getJavaTypes());
}
protected OxmJavaType buildJavaType(EJavaType eJavaType) {
return new OxmJavaTypeImpl(this, eJavaType);
}
protected ContextListContainer<OxmJavaType, EJavaType> buildJavaTypeContainer() {
JavaTypeContainer container = new JavaTypeContainer();
container.initialize();
return container;
}
protected class JavaTypeContainer
extends ContextListContainer<OxmJavaType, EJavaType> {
@Override
protected String getContextElementsPropertyName() {
return JAVA_TYPES_LIST;
}
@Override
protected OxmJavaType buildContextElement(EJavaType resourceElement) {
return OxmXmlBindingsImpl.this.buildJavaType(resourceElement);
}
@Override
protected ListIterable<EJavaType> getResourceElements() {
return OxmXmlBindingsImpl.this.getEJavaTypes();
}
@Override
protected EJavaType getResourceElement(OxmJavaType contextElement) {
return contextElement.getEJavaType();
}
// @Override
// protected void disposeElement(OxmJavaType element) {
// element.dispose();
// }
}
// ***** validation *****
@Override
public TextRange getValidationTextRange() {
TextRange textRange = this.eXmlBindings.getValidationTextRange();
return (textRange != null) ? textRange : this.getParent().getValidationTextRange();
}
@Override
public void validate(List<IMessage> messages, IReporter reporter) {
super.validate(messages, reporter);
for (OxmJavaType javaType : getJavaTypes()) {
javaType.validate(messages, reporter);
}
}
}