Added implied packages and type name validation on OxmJavaTypes
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/property_files/el_jaxb_validation.properties b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/property_files/el_jaxb_validation.properties
index a122081..4f14e7d 100644
--- a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/property_files/el_jaxb_validation.properties
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/property_files/el_jaxb_validation.properties
@@ -12,6 +12,9 @@
 
 OXM_FILE__VERSION_NOT_SUPPORTED = Only OXM files version 2.2 and later are supported.
 
+OXM_JAVA_TYPE__NAME_NOT_SPECIFIED = The java type name must be specified.
+OXM_JAVA_TYPE__PACKAGE_NAME_NOT_UNIFORM = The package name of java types must be uniform within an OXM file.
+
 XML_DISCRIMINATOR_NODE__NOT_SPECIFIED = XmlDiscriminatorNode not specified.
 
 XML_DISCRIMINATOR_VALUE__NOT_SPECIFIED = XmlDiscriminatorValue not specified.
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/context/oxm/OxmFile.java b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/context/oxm/OxmFile.java
index e024245..fbd778f 100644
--- a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/context/oxm/OxmFile.java
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/context/oxm/OxmFile.java
@@ -29,5 +29,10 @@
 	

 	String getPackageName();

 	

+	

+	// ***** xml bindings *****

+	

+	static final String XML_BINDINGS_PROPERTY = "xmlBindings"; //$NON-NLS-1$

+	

 	OxmXmlBindings getXmlBindings();

 }
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/context/oxm/OxmXmlBindings.java b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/context/oxm/OxmXmlBindings.java
index e59c75c..96943ae 100644
--- a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/context/oxm/OxmXmlBindings.java
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/context/oxm/OxmXmlBindings.java
@@ -13,6 +13,7 @@
 import org.eclipse.jpt.jaxb.core.context.JaxbContextNode;

 import org.eclipse.jpt.jaxb.eclipselink.core.context.ELXmlAccessOrderHolder;

 import org.eclipse.jpt.jaxb.eclipselink.core.context.ELXmlAccessTypeHolder;

+import org.eclipse.jpt.jaxb.eclipselink.core.resource.oxm.EXmlBindings;

 

 /**

  * Provisional API: This interface is part of an interim API that is still

@@ -27,6 +28,9 @@
 public interface OxmXmlBindings

 		extends JaxbContextNode, ELXmlAccessTypeHolder, ELXmlAccessOrderHolder {

 	

+	EXmlBindings getEXmlBindings();

+	

+	

 	// ***** mapping metadata complete *****

 	

 	final static String XML_MAPPING_METADATA_COMPLETE_PROPERTY = "xmlMappingMetadataComplete"; //$NON-NLS-1$

@@ -38,15 +42,26 @@
 	

 	// ***** package name *****

 	

-	final static String PACKAGE_NAME_PROPERTY = "packageName"; //$NON-NLS-1$

+	/** string associated with specifiedPackageName property */

+	final static String SPECIFIED_PACKAGE_NAME_PROPERTY = "specifiedPackageName"; //$NON-NLS-1$

 	

+	/** return the package name specified on the xml-bindings node */

+	String getSpecifiedPackageName();

+	

+	/** set the package name on the xml-bindings node */

+	void setSpecifiedPackageName(String packageName);

+	

+	/** string associated with impliedPackageName property */

+	final static String IMPLIED_PACKAGE_NAME_PROPERTY = "impliedPackageName"; //$NON-NLS-1$

+	

+	/** return the package name implied by querying java types included in this document */

+	String getImpliedPackageName();

+	

+	/** return the specified package name if specified, otherwise the implied package name */

 	String getPackageName();

 	

-	void setPackageName(String packageName);

-	

-	/**

-	 * Return a qualified name for the given child type

-	 */

+	/** Return a qualified name for the given (qualified or unqualified) child type name, 

+	 *  prepending a package name if applicable */

 	String getQualifiedName(String childTypeName);

 	

 	

diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/internal/context/ELJaxbContextRootImpl.java b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/internal/context/ELJaxbContextRootImpl.java
index 6f098e8..186d44d 100644
--- a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/internal/context/ELJaxbContextRootImpl.java
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/internal/context/ELJaxbContextRootImpl.java
@@ -100,6 +100,9 @@
 			if (! unmatchedOxmResources.remove(oxmResource)) {
 				removeOxmFile(oxmFile);
 			}
+			else {
+				oxmFile.update();
+			}
 		}
 		
 		for (JptXmlResource oxmResource : unmatchedOxmResources) {
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/internal/context/oxm/OxmFileImpl.java b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/internal/context/oxm/OxmFileImpl.java
index 36d62e4..d753062 100644
--- a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/internal/context/oxm/OxmFileImpl.java
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/internal/context/oxm/OxmFileImpl.java
@@ -9,21 +9,21 @@
  *******************************************************************************/

 package org.eclipse.jpt.jaxb.eclipselink.core.internal.context.oxm;
 
-import java.util.List;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jpt.common.core.JptResourceType;
-import org.eclipse.jpt.common.core.resource.xml.JptXmlResource;
-import org.eclipse.jpt.common.core.utility.TextRange;
-import org.eclipse.jpt.jaxb.core.internal.context.AbstractJaxbContextNode;
-import org.eclipse.jpt.jaxb.eclipselink.core.context.ELJaxbContextRoot;
-import org.eclipse.jpt.jaxb.eclipselink.core.context.oxm.OxmFile;
-import org.eclipse.jpt.jaxb.eclipselink.core.context.oxm.OxmXmlBindings;
-import org.eclipse.jpt.jaxb.eclipselink.core.internal.validation.ELJaxbValidationMessageBuilder;
-import org.eclipse.jpt.jaxb.eclipselink.core.internal.validation.ELJaxbValidationMessages;
-import org.eclipse.jpt.jaxb.eclipselink.core.resource.oxm.EXmlBindings;
-import org.eclipse.jpt.jaxb.eclipselink.core.resource.oxm.Oxm;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-import org.eclipse.wst.validation.internal.provisional.core.IReporter;
+import java.util.List;

+import org.eclipse.core.resources.IResource;

+import org.eclipse.jpt.common.core.JptResourceType;

+import org.eclipse.jpt.common.core.resource.xml.JptXmlResource;

+import org.eclipse.jpt.common.core.utility.TextRange;

+import org.eclipse.jpt.jaxb.core.internal.context.AbstractJaxbContextNode;

+import org.eclipse.jpt.jaxb.eclipselink.core.context.ELJaxbContextRoot;

+import org.eclipse.jpt.jaxb.eclipselink.core.context.oxm.OxmFile;

+import org.eclipse.jpt.jaxb.eclipselink.core.context.oxm.OxmXmlBindings;

+import org.eclipse.jpt.jaxb.eclipselink.core.internal.validation.ELJaxbValidationMessageBuilder;

+import org.eclipse.jpt.jaxb.eclipselink.core.internal.validation.ELJaxbValidationMessages;

+import org.eclipse.jpt.jaxb.eclipselink.core.resource.oxm.EXmlBindings;

+import org.eclipse.jpt.jaxb.eclipselink.core.resource.oxm.Oxm;

+import org.eclipse.wst.validation.internal.provisional.core.IMessage;

+import org.eclipse.wst.validation.internal.provisional.core.IReporter;

 
 public class OxmFileImpl 
 		extends AbstractJaxbContextNode
@@ -77,11 +77,17 @@
 	@Override
 	public void synchronizeWithResourceModel() {
 		super.synchronizeWithResourceModel();
-		this.resourceType = oxmResource.getResourceType();
-		
-		if (this.xmlBindings != null) {
-			this.xmlBindings.synchronizeWithResourceModel();
-		}
+		this.resourceType = this.oxmResource.getResourceType();
+		syncXmlBindings();
+	}

+	

+	@Override

+	public void update() {

+		super.update();

+		

+		if (this.xmlBindings != null) {

+			this.xmlBindings.update();

+		}

 	}
 	
 	
@@ -90,6 +96,22 @@
 	public OxmXmlBindings getXmlBindings() {
 		return this.xmlBindings;
 	}
+	

+	protected void setXmlBindings(OxmXmlBindings xmlBindings) {

+		OxmXmlBindings oldXmlBindings = this.xmlBindings;

+		this.xmlBindings = xmlBindings;

+		firePropertyChanged(XML_BINDINGS_PROPERTY, oldXmlBindings, xmlBindings);

+	}

+	

+	protected void syncXmlBindings() {

+		EXmlBindings eXmlBindings = (EXmlBindings) this.oxmResource.getRootObject();

+		if (this.xmlBindings == null || this.xmlBindings.getEXmlBindings() != eXmlBindings) {

+			setXmlBindings(buildXmlBindings());

+		}

+		if (this.xmlBindings != null) {

+			this.xmlBindings.synchronizeWithResourceModel();

+		}

+	}

 	
 	protected OxmXmlBindings buildXmlBindings() {
 		// if less than 2.3, then there is no context model support
@@ -124,6 +146,10 @@
 							ELJaxbValidationMessages.OXM_FILE__VERSION_NOT_SUPPORTED,
 							OxmFileImpl.this,
 							getVersionTextRange()));
+		}

+		

+		if (this.xmlBindings != null) {

+			this.xmlBindings.validate(messages, reporter);

 		}
 	}
 }
\ No newline at end of file
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/internal/context/oxm/OxmJavaTypeImpl.java b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/internal/context/oxm/OxmJavaTypeImpl.java
index 4a4bac2..14504d7 100644
--- a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/internal/context/oxm/OxmJavaTypeImpl.java
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/internal/context/oxm/OxmJavaTypeImpl.java
@@ -9,11 +9,19 @@
  *******************************************************************************/

 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.ObjectTools;

+import org.eclipse.jpt.common.utility.internal.StringTools;

 import org.eclipse.jpt.common.utility.internal.TypeDeclarationTools;

 import org.eclipse.jpt.jaxb.core.internal.context.AbstractJaxbContextNode;

 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.internal.validation.ELJaxbValidationMessageBuilder;

+import org.eclipse.jpt.jaxb.eclipselink.core.internal.validation.ELJaxbValidationMessages;

 import org.eclipse.jpt.jaxb.eclipselink.core.resource.oxm.EJavaType;

+import org.eclipse.wst.validation.internal.provisional.core.IMessage;

+import org.eclipse.wst.validation.internal.provisional.core.IReporter;

 
 public class OxmJavaTypeImpl

 		extends AbstractJaxbContextNode

@@ -90,4 +98,49 @@
 	public String getSimpleName() {

 		return TypeDeclarationTools.simpleName(this.qualifiedName);

 	}

+	

+	

+	// ***** validation *****

+	

+	@Override

+	public TextRange getValidationTextRange() {

+		TextRange textRange = this.eJavaType.getValidationTextRange();

+		return (textRange != null) ? textRange : this.getParent().getValidationTextRange();

+	}

+	

+	protected TextRange getNameTextRange() {

+		return this.eJavaType.getNameTextRange();

+	}

+	

+	@Override

+	public void validate(List<IMessage> messages, IReporter reporter) {

+		super.validate(messages, reporter);

+		

+		validateName(messages, reporter);

+		

+	}

+	

+	protected void validateName(List<IMessage> messages, IReporter reporter) {

+		// type name must be specified

+		if (StringTools.isBlank(this.specifiedName)) {

+			messages.add(

+					ELJaxbValidationMessageBuilder.buildMessage(

+							IMessage.HIGH_SEVERITY,

+							ELJaxbValidationMessages.OXM_JAVA_TYPE__NAME_NOT_SPECIFIED,

+							this,

+							getNameTextRange()));

+			return;

+		}

+		

+		// package name must be uniform across oxm file

+		String packageName = TypeDeclarationTools.packageName(this.specifiedName);

+		if (! StringTools.isBlank(packageName) && ! ObjectTools.equals(packageName, getXmlBindings().getPackageName())) {

+			messages.add(

+					ELJaxbValidationMessageBuilder.buildMessage(

+							IMessage.HIGH_SEVERITY,

+							ELJaxbValidationMessages.OXM_JAVA_TYPE__PACKAGE_NAME_NOT_UNIFORM,

+							this,

+							getNameTextRange()));

+		}

+	}

 }
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/internal/context/oxm/OxmXmlBindingsImpl.java b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/internal/context/oxm/OxmXmlBindingsImpl.java
index 7ce3683..bdb0386 100644
--- a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/internal/context/oxm/OxmXmlBindingsImpl.java
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/internal/context/oxm/OxmXmlBindingsImpl.java
@@ -9,6 +9,7 @@
  *******************************************************************************/

 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;

@@ -25,6 +26,8 @@
 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
@@ -38,7 +41,8 @@
 	
 	protected boolean xmlMappingMetadataComplete;
 	
-	protected String packageName;

+	protected String specifiedPackageName;

+	protected String impliedPackageName;

 	

 	protected final ContextListContainer<OxmJavaType, EJavaType> javaTypeContainer;

 	
@@ -49,10 +53,15 @@
 		this.specifiedAccessType = buildSpecifiedAccessType();
 		this.specifiedAccessOrder = buildSpecifiedAccessOrder();
 		this.xmlMappingMetadataComplete = buildXmlMappingMetadataComplete();
-		this.packageName = buildPackageName();

+		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 *****
 	
@@ -62,13 +71,14 @@
 		setSpecifiedAccessType_(buildSpecifiedAccessType());
 		setSpecifiedAccessOrder_(buildSpecifiedAccessOrder());
 		setXmlMappingMetadataComplete_(buildXmlMappingMetadataComplete());
-		setPackageName_(buildPackageName());

+		setSpecifiedPackageName_(buildSpecifiedPackageName());

 		this.javaTypeContainer.synchronizeWithResourceModel();
 	}

 	

 	@Override

 	public void update() {

 		super.update();

+		setImpliedPackageName_(buildImpliedPackageName());

 		this.javaTypeContainer.update();

 	}
 	
@@ -158,25 +168,49 @@
 	
 	// ***** package name *****
 	
-	public String getPackageName() {
-		return this.packageName;
+	public String getSpecifiedPackageName() {
+		return this.specifiedPackageName;
 	}
 	
-	public void setPackageName(String packageName) {
+	public void setSpecifiedPackageName(String packageName) {
 		this.eXmlBindings.setPackageName(packageName);
-		setPackageName_(packageName);
+		setSpecifiedPackageName_(packageName);
 	}
 	
-	protected void setPackageName_(String packageName) {
-		String oldPackageName = this.packageName;
-		this.packageName = packageName;
-		firePropertyChanged(PACKAGE_NAME_PROPERTY, oldPackageName, packageName);
-	}
-	
-	protected String buildPackageName() {
-		return this.eXmlBindings.getPackageName();
+	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

 	 */

@@ -200,7 +234,11 @@
 			return StringTools.concatenate("java.lang.", className);

 		}

 		

-		return StringTools.concatenate(this.packageName, ".", className);

+		if (StringTools.isBlank(this.specifiedPackageName)) {

+			return className;

+		}

+		

+		return StringTools.concatenate(this.specifiedPackageName, ".", className);

 	}

 	

 	

@@ -288,5 +326,14 @@
 	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);

+		}

 	}
 }
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/internal/validation/ELJaxbValidationMessages.java b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/internal/validation/ELJaxbValidationMessages.java
index 0977c7c..0918ebb 100644
--- a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/internal/validation/ELJaxbValidationMessages.java
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/internal/validation/ELJaxbValidationMessages.java
@@ -22,6 +22,10 @@
 	// oxm file
 	String OXM_FILE__VERSION_NOT_SUPPORTED = "OXM_FILE__VERSION_NOT_SUPPORTED";
 	
+	// oxm java type
+	String OXM_JAVA_TYPE__NAME_NOT_SPECIFIED = "OXM_JAVA_TYPE__NAME_NOT_SPECIFIED";
+	String OXM_JAVA_TYPE__PACKAGE_NAME_NOT_UNIFORM = "OXM_JAVA_TYPE__PACKAGE_NAME_NOT_UNIFORM";
+	
 	// xml discriminator node
 	String XML_DISCRIMINATOR_NODE__NOT_SPECIFIED = "XML_DISCRIMINATOR_NODE__NOT_SPECIFIED";
 	
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/resource/oxm/EJavaType.java b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/resource/oxm/EJavaType.java
index 8ad6164..760ee0f 100644
--- a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/resource/oxm/EJavaType.java
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/resource/oxm/EJavaType.java
@@ -21,6 +21,7 @@
 import org.eclipse.emf.ecore.util.InternalEList;

 import org.eclipse.jpt.common.core.internal.utility.translators.SimpleTranslator;

 import org.eclipse.jpt.common.core.resource.xml.EBaseObjectImpl;

+import org.eclipse.jpt.common.core.utility.TextRange;

 import org.eclipse.wst.common.internal.emf.resource.Translator;

 

 /**

@@ -1381,6 +1382,14 @@
 		result.append(')');

 		return result.toString();

 	}

+	

+	

+	// ***** text range *****

+	

+	public TextRange getNameTextRange() {

+		return getAttributeTextRange(Oxm.NAME);

+	}

+	

 

 	// ***** translators *****

 	

diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/resource/oxm/EXmlBindings.java b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/resource/oxm/EXmlBindings.java
index 77bd82a..a6624ff 100644
--- a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/resource/oxm/EXmlBindings.java
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/resource/oxm/EXmlBindings.java
@@ -905,7 +905,7 @@
 		result.append(xmlAccessorOrder);

 		result.append(", xmlMappingMetadataComplete: ");

 		result.append(xmlMappingMetadataComplete);

-		result.append(", packageName: ");

+		result.append(", specifiedPackageName: ");

 		result.append(packageName);

 		result.append(", xmlNameTransformer: ");

 		result.append(xmlNameTransformer);

diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/resource/oxm/OxmPackage.java b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/resource/oxm/OxmPackage.java
index c3f90a0..122b4e1 100644
--- a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/resource/oxm/OxmPackage.java
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.core/src/org/eclipse/jpt/jaxb/eclipselink/core/resource/oxm/OxmPackage.java
@@ -7284,7 +7284,7 @@
 		initEAttribute(getEXmlBindings_XmlAccessorType(), this.getEXmlAccessType(), "xmlAccessorType", null, 0, 1, EXmlBindings.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

 		initEAttribute(getEXmlBindings_XmlAccessorOrder(), this.getEXmlAccessOrder(), "xmlAccessorOrder", null, 0, 1, EXmlBindings.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

 		initEAttribute(getEXmlBindings_XmlMappingMetadataComplete(), theXMLTypePackage.getBooleanObject(), "xmlMappingMetadataComplete", null, 0, 1, EXmlBindings.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

-		initEAttribute(getEXmlBindings_PackageName(), ecorePackage.getEString(), "packageName", null, 0, 1, EXmlBindings.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

+		initEAttribute(getEXmlBindings_PackageName(), ecorePackage.getEString(), "specifiedPackageName", null, 0, 1, EXmlBindings.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

 		initEAttribute(getEXmlBindings_XmlNameTransformer(), ecorePackage.getEString(), "xmlNameTransformer", null, 0, 1, EXmlBindings.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

 		initEReference(getEXmlBindings_XmlSchema(), this.getEXmlSchema(), null, "xmlSchema", null, 0, 1, EXmlBindings.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

 		initEReference(getEXmlBindings_XmlSchemaType(), this.getEXmlSchemaType(), null, "xmlSchemaType", null, 0, 1, EXmlBindings.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.ui/src/org/eclipse/jpt/jaxb/eclipselink/ui/internal/navigator/OxmFileContentProvider.java b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.ui/src/org/eclipse/jpt/jaxb/eclipselink/ui/internal/navigator/OxmFileContentProvider.java
index 78b09b8..ad61bfd 100644
--- a/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.ui/src/org/eclipse/jpt/jaxb/eclipselink/ui/internal/navigator/OxmFileContentProvider.java
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.eclipselink.ui/src/org/eclipse/jpt/jaxb/eclipselink/ui/internal/navigator/OxmFileContentProvider.java
@@ -13,8 +13,10 @@
 import org.eclipse.jpt.common.utility.internal.model.value.ItemPropertyListValueModelAdapter;

 import org.eclipse.jpt.common.utility.internal.model.value.ListAspectAdapter;

 import org.eclipse.jpt.common.utility.internal.model.value.ListCollectionValueModelAdapter;

+import org.eclipse.jpt.common.utility.internal.model.value.PropertyAspectAdapter;

 import org.eclipse.jpt.common.utility.iterable.ListIterable;

 import org.eclipse.jpt.common.utility.model.value.CollectionValueModel;

+import org.eclipse.jpt.common.utility.model.value.PropertyValueModel;

 import org.eclipse.jpt.jaxb.eclipselink.core.context.ELJaxbPackage;

 import org.eclipse.jpt.jaxb.eclipselink.core.context.oxm.OxmFile;

 import org.eclipse.jpt.jaxb.eclipselink.core.context.oxm.OxmJavaType;

@@ -36,7 +38,7 @@
 	protected CollectionValueModel<OxmJavaType> buildChildrenModel() {

 		return new ListCollectionValueModelAdapter<OxmJavaType>(

 				new ItemPropertyListValueModelAdapter<OxmJavaType>(

-						new ListAspectAdapter<OxmXmlBindings, OxmJavaType>(OxmXmlBindings.JAVA_TYPES_LIST, this.item.getXmlBindings()) {

+						new ListAspectAdapter<OxmXmlBindings, OxmJavaType>(buildXmlBindingsModel(), OxmXmlBindings.JAVA_TYPES_LIST) {

 							@Override

 							protected ListIterable<OxmJavaType> getListIterable() {

 								return this.subject.getJavaTypes();

@@ -47,4 +49,13 @@
 							}

 						}));

 	}

+	

+	protected PropertyValueModel<OxmXmlBindings> buildXmlBindingsModel() {

+		return new PropertyAspectAdapter<OxmFile, OxmXmlBindings>(OxmFile.XML_BINDINGS_PROPERTY, this.item) {

+			@Override

+			protected OxmXmlBindings buildValue_() {

+				return this.subject.getXmlBindings();

+			}

+		};

+	}

 }
diff --git a/jaxb/tests/org.eclipse.jpt.jaxb.eclipselink.core.tests/src/org/eclipse/jpt/jaxb/eclipselink/core/tests/internal/context/oxm/OxmJavaTypeTests.java b/jaxb/tests/org.eclipse.jpt.jaxb.eclipselink.core.tests/src/org/eclipse/jpt/jaxb/eclipselink/core/tests/internal/context/oxm/OxmJavaTypeTests.java
index e48c32b..4f8e43a 100644
--- a/jaxb/tests/org.eclipse.jpt.jaxb.eclipselink.core.tests/src/org/eclipse/jpt/jaxb/eclipselink/core/tests/internal/context/oxm/OxmJavaTypeTests.java
+++ b/jaxb/tests/org.eclipse.jpt.jaxb.eclipselink.core.tests/src/org/eclipse/jpt/jaxb/eclipselink/core/tests/internal/context/oxm/OxmJavaTypeTests.java
@@ -136,7 +136,7 @@
 		assertEquals("java.lang.String", javaType.getQualifiedName());

 		assertEquals("String", javaType.getSimpleName());

 		

-		xmlBindings.setPackageName("test.oxm2");

+		xmlBindings.setSpecifiedPackageName("test.oxm2");

 		javaType.setSpecifiedName("Foo");

 		oxmResource.save();

 		

diff --git a/jaxb/tests/org.eclipse.jpt.jaxb.eclipselink.core.tests/src/org/eclipse/jpt/jaxb/eclipselink/core/tests/internal/context/oxm/OxmXmlBindingsTests.java b/jaxb/tests/org.eclipse.jpt.jaxb.eclipselink.core.tests/src/org/eclipse/jpt/jaxb/eclipselink/core/tests/internal/context/oxm/OxmXmlBindingsTests.java
index fa51981..3175da7 100644
--- a/jaxb/tests/org.eclipse.jpt.jaxb.eclipselink.core.tests/src/org/eclipse/jpt/jaxb/eclipselink/core/tests/internal/context/oxm/OxmXmlBindingsTests.java
+++ b/jaxb/tests/org.eclipse.jpt.jaxb.eclipselink.core.tests/src/org/eclipse/jpt/jaxb/eclipselink/core/tests/internal/context/oxm/OxmXmlBindingsTests.java
@@ -10,6 +10,7 @@
 package org.eclipse.jpt.jaxb.eclipselink.core.tests.internal.context.oxm;
 

 import org.eclipse.jpt.common.core.resource.xml.JptXmlResource;

+import org.eclipse.jpt.common.utility.internal.StringTools;

 import org.eclipse.jpt.common.utility.internal.iterable.IterableTools;

 import org.eclipse.jpt.jaxb.eclipselink.core.context.ELJaxbContextRoot;

 import org.eclipse.jpt.jaxb.eclipselink.core.context.ELXmlAccessOrder;

@@ -276,6 +277,8 @@
 		EXmlBindings eXmlBindings = (EXmlBindings) oxmResource.getRootObject();

 		

 		assertEquals("test.oxm", eXmlBindings.getPackageName());

+		assertEquals("test.oxm", xmlBindings.getSpecifiedPackageName());

+		assertEquals(StringTools.EMPTY_STRING, xmlBindings.getImpliedPackageName());

 		assertEquals("test.oxm", xmlBindings.getPackageName());

 		

 		eXmlBindings.setPackageName("foo");

@@ -283,14 +286,21 @@
 		

 		assertFileContentsContains("oxm.xml", "package-name=\"foo\"", true);

 		assertEquals("foo", eXmlBindings.getPackageName());

+		assertEquals("foo", xmlBindings.getSpecifiedPackageName());

+		assertEquals(StringTools.EMPTY_STRING, xmlBindings.getImpliedPackageName());

 		assertEquals("foo", xmlBindings.getPackageName());

 		

 		eXmlBindings.setPackageName(null);

+		EJavaType eJavaType = OxmFactory.eINSTANCE.createEJavaType();

+		eJavaType.setName("test.foo.Foo");

+		eXmlBindings.getJavaTypes().add(eJavaType);

 		oxmResource.save();

 		

 		assertFileContentsContains("oxm.xml", "package-name=", false);

 		assertNull(eXmlBindings.getPackageName());

-		assertNull(xmlBindings.getPackageName());

+		assertNull(xmlBindings.getSpecifiedPackageName());

+		assertEquals("test.foo", xmlBindings.getImpliedPackageName());

+		assertEquals("test.foo", xmlBindings.getPackageName());

 	}

 	

 	public void testModifyPackageName() throws Exception {

@@ -302,21 +312,21 @@
 		EXmlBindings eXmlBindings = (EXmlBindings) oxmResource.getRootObject();

 		

 		assertEquals("test.oxm", eXmlBindings.getPackageName());

-		assertEquals("test.oxm", xmlBindings.getPackageName());

+		assertEquals("test.oxm", xmlBindings.getSpecifiedPackageName());

 		

-		xmlBindings.setPackageName("foo");

+		xmlBindings.setSpecifiedPackageName("foo");

 		oxmResource.save();

 		

 		assertFileContentsContains("oxm.xml", "package-name=\"foo\"", true);

 		assertEquals("foo", eXmlBindings.getPackageName());

-		assertEquals("foo", xmlBindings.getPackageName());

+		assertEquals("foo", xmlBindings.getSpecifiedPackageName());

 		

-		xmlBindings.setPackageName(null);

+		xmlBindings.setSpecifiedPackageName(null);

 		oxmResource.save();

 		

 		assertFileContentsContains("oxm.xml", "package-name=", false);

 		assertNull(eXmlBindings.getPackageName());

-		assertNull(xmlBindings.getPackageName());

+		assertNull(xmlBindings.getSpecifiedPackageName());

 	}

 	

 	public void testUpdateJavaTypes() throws Exception {