diff options
Diffstat (limited to 'jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt')
60 files changed, 2495 insertions, 822 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/JpaPlatform.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/JpaPlatform.java index d8a7c30ba5..a5c1c7fd0a 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/JpaPlatform.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/JpaPlatform.java @@ -18,6 +18,7 @@ import org.eclipse.jpt.common.core.utility.jdt.AnnotationEditFormatter; import org.eclipse.jpt.common.utility.filter.Filter; import org.eclipse.jpt.jpa.core.context.java.DefaultJavaAttributeMappingDefinition; import org.eclipse.jpt.jpa.core.context.java.JavaAttributeMappingDefinition; +import org.eclipse.jpt.jpa.core.context.java.JavaManagedTypeDefinition; import org.eclipse.jpt.jpa.core.context.java.JavaTypeMappingDefinition; import org.eclipse.jpt.jpa.core.jpa2.JpaProject2_0; import org.eclipse.jpt.jpa.core.platform.JpaPlatformManager; @@ -98,6 +99,15 @@ public interface JpaPlatform IContentType getContentType(IFile file); + // ********** Managed Types ********** + + /** + * Return the Java managed type definitions that will be used to build Java + * managed types and their corresponding annotations. + */ + Iterable<JavaManagedTypeDefinition> getJavaManagedTypeDefinitions(); + + // ********** Java annotations ********** /** diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/JpaPlatformProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/JpaPlatformProvider.java index 07d91b19a8..b5f159afc0 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/JpaPlatformProvider.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/JpaPlatformProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009, 2012 Oracle. All rights reserved. + * Copyright (c) 2009, 2013 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. @@ -12,6 +12,7 @@ package org.eclipse.jpt.jpa.core; import org.eclipse.jpt.common.core.JptResourceType; import org.eclipse.jpt.jpa.core.context.java.DefaultJavaAttributeMappingDefinition; import org.eclipse.jpt.jpa.core.context.java.JavaAttributeMappingDefinition; +import org.eclipse.jpt.jpa.core.context.java.JavaManagedTypeDefinition; import org.eclipse.jpt.jpa.core.context.java.JavaTypeMappingDefinition; /** @@ -54,6 +55,11 @@ public interface JpaPlatformProvider { Iterable<ResourceDefinition> getResourceDefinitions(); /** + * Return the JPA platform's Java managed type definitions. + */ + Iterable<JavaManagedTypeDefinition> getJavaManagedTypeDefinitions(); + + /** * Return the JPA platform's Java type mapping definitions. */ Iterable<JavaTypeMappingDefinition> getJavaTypeMappingDefinitions(); diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/JpaProject.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/JpaProject.java index 2620e57464..5eed62a13a 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/JpaProject.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/JpaProject.java @@ -27,6 +27,8 @@ import org.eclipse.jpt.common.utility.command.ExtendedCommandExecutor; import org.eclipse.jpt.common.utility.internal.transformer.AbstractTransformer; import org.eclipse.jpt.common.utility.transformer.Transformer; import org.eclipse.jpt.jpa.core.context.JpaRootContextNode; +import org.eclipse.jpt.jpa.core.context.java.JavaManagedTypeDefinition; +import org.eclipse.jpt.jpa.core.context.java.JavaTypeMappingDefinition; import org.eclipse.jpt.jpa.core.resource.orm.XmlEntityMappings; import org.eclipse.jpt.jpa.core.resource.persistence.XmlPersistence; import org.eclipse.jpt.jpa.db.Catalog; @@ -239,15 +241,32 @@ public interface JpaProject * (ignoring classes in JARs referenced in the <code>persistence.xml</code>). */ Iterable<JavaResourceAbstractType> getAnnotatedJavaSourceTypes(); - + /** - * Return only the types of those valid <em>mapped</em> (i.e. annotated with - * <code>@Entity</code>, <code>@Embeddable</code>, etc.) Java resource + * Return only the valid <em>potential</em> types (i.e. those annotated with + * <code>@Entity</code>, <code>@Embeddable</code>, <code>@MappedSuperclass</code>, + * <code>@Converter</code> in JPA 2.1). Java resource * types that are directly part of the JPA project, ignoring * those in JARs referenced in <code>persistence.xml</code>. + * @see #getManagedTypeAnnotationNames() */ - Iterable<JavaResourceAbstractType> getMappedJavaSourceTypes(); + Iterable<JavaResourceAbstractType> getPotentialJavaSourceTypes(); + /** + * Return only the valid <em>managed</em> type annotation names + * (i.e. <code>@Entity</code>, <code>@Embeddable</code>, + * <code>@MappedSuperclass</code>, <code>@Converter</code> in JPA 2.1). + * @see JavaManagedTypeDefinition#getAnnotationNames(JpaProject) + * @see JpaPlatform#getJavaManagedTypeDefinitions() + */ + Iterable<String> getManagedTypeAnnotationNames(); + + /** + * Return the valid type mapping annotation names + * (i.e. <code>@Entity</code>, <code>@Embeddable</code>, <code>@MappedSuperclass</code>). + * @see JavaTypeMappingDefinition#getAnnotationName() + * @see JpaPlatform#getJavaTypeMappingDefinitions() + */ Iterable<String> getTypeMappingAnnotationNames(); /** diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/ManagedType.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/ManagedType.java new file mode 100644 index 0000000000..12c668de63 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/ManagedType.java @@ -0,0 +1,97 @@ +/*******************************************************************************
+ * Copyright (c) 2013 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.jpa.core.context;
+
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jpt.common.core.resource.java.JavaResourceType;
+import org.eclipse.jpt.common.utility.internal.transformer.TransformerAdapter;
+import org.eclipse.jpt.common.utility.transformer.Transformer;
+
+/**
+ * Context managed type.
+ * <p>
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ *
+ * @version 3.3
+ * @since 3.3
+ */
+public interface ManagedType
+ extends JpaContextNode
+{
+
+ /**
+ * Return the managed type's type.
+ * @see org.eclipse.jpt.jpa.core.context.orm.OrmManagedTypeDefinition#getContextType()
+ * @see org.eclipse.jpt.jpa.core.context.java.JavaManagedTypeDefinition#getType()
+ */
+ Class<? extends ManagedType> getType();
+
+
+ // ********** name **********
+
+ /**
+ * Return the managed type's [fully-qualified] name.
+ * The enclosing type separator is <code>'.'</code>,
+ * as opposed to <code>'$'</code>.
+ * @see #getSimpleName()
+ * @see #getTypeQualifiedName()
+ */
+ String getName();
+ String NAME_PROPERTY = "name"; //$NON-NLS-1$
+ Transformer<ManagedType, String> NAME_TRANSFORMER = new NameTransformer();
+ class NameTransformer
+ extends TransformerAdapter<ManagedType, String>
+ {
+ @Override
+ public String transform(ManagedType mt) {
+ return mt.getName();
+ }
+ }
+
+ /**
+ * Return the managed type's simple name.
+ * @see #getName()
+ * @see #getTypeQualifiedName()
+ */
+ String getSimpleName();
+
+ /**
+ * Return the persistent type's type-qualified name; i.e. the type's
+ * name without its package qualification.
+ * @see #getName()
+ * @see #getSimpleName()
+ */
+ String getTypeQualifiedName();
+
+ /**
+ * Return the Java resource type.
+ */
+ JavaResourceType getJavaResourceType();
+
+
+ // ********** misc **********
+
+ /**
+ * Return whether the managed type applies to the
+ * specified type name qualified with <code>'.'</code>.
+ */
+ boolean isFor(String typeName);
+
+ /**
+ * Return whether the managed type resolves to a Java class in the
+ * specified package fragment.
+ */
+ boolean isIn(IPackageFragment packageFragment);
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/PersistentType.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/PersistentType.java index d0fb5e4017..212068c3a8 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/PersistentType.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/PersistentType.java @@ -9,7 +9,6 @@ ******************************************************************************/ package org.eclipse.jpt.jpa.core.context; -import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jpt.common.core.utility.jdt.TypeBinding; import org.eclipse.jpt.common.utility.internal.transformer.AbstractTransformer; import org.eclipse.jpt.common.utility.internal.transformer.TransformerAdapter; @@ -30,44 +29,9 @@ import org.eclipse.jpt.jpa.core.JpaStructureNode; * @since 2.0 */ public interface PersistentType - extends JpaStructureNode, AccessHolder + extends ManagedType, JpaStructureNode, AccessHolder { - // ********** name ********** - - /** - * Return the persistent type's [fully-qualified] name. - * The enclosing type separator is <code>'.'</code>, - * as opposed to <code>'$'</code>. - * @see #getSimpleName() - * @see #getTypeQualifiedName() - */ - String getName(); - String NAME_PROPERTY = "name"; //$NON-NLS-1$ - Transformer<PersistentType, String> NAME_TRANSFORMER = new NameTransformer(); - class NameTransformer - extends TransformerAdapter<PersistentType, String> - { - @Override - public String transform(PersistentType pt) { - return pt.getName(); - } - } - - /** - * Return the persistent type's simple name. - * @see #getName() - * @see #getTypeQualifiedName() - */ - String getSimpleName(); - - /** - * Return the persistent type's type-qualified name; i.e. the type's - * name without its package qualification. - * @see #getName() - * @see #getSimpleName() - */ - String getTypeQualifiedName(); - + Class<? extends PersistentType> getType(); // ********** mapping ********** @@ -206,18 +170,6 @@ public interface PersistentType // ********** misc ********** /** - * Return whether the persistent type applies to the - * specified type name qualified with <code>'.'</code>. - */ - boolean isFor(String typeName); - - /** - * Return whether the persistent type resolves to a Java class in the - * specified package fragment. - */ - boolean isIn(IPackageFragment packageFragment); - - /** * Return the persistent type the persistent type overrides. * Typically this is the Java persistent type overridden by a * non-metadata-complete <code>orm.xml</code> persistent type. diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/java/JarFile.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/java/JarFile.java index ae064409b4..39aa21146e 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/java/JarFile.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/java/JarFile.java @@ -34,19 +34,19 @@ public interface JarFile JavaResourcePackageFragmentRoot getJarResourcePackageFragmentRoot(); - // ********** Java persistent types ********** + // ********** Java managed types ********** /** - * Return the JAR file's Java persistent types. + * Return the JAR file's Java managed types. * Return only the types that are annotated with JPA annotations. */ - Iterable<JavaPersistentType> getJavaPersistentTypes(); - String JAVA_PERSISTENT_TYPES_COLLECTION = "javaPersistentTypes"; //$NON-NLS-1$ + Iterable<JavaManagedType> getJavaManagedTypes(); + String JAVA_MANAGED_TYPES_COLLECTION = "javaManagedTypes"; //$NON-NLS-1$ /** - * Return the size of the JAR file's Java persistent types. + * Return the size of the JAR file's Java managed types. */ - int getJavaPersistentTypesSize(); + int getJavaManagedTypesSize(); // ********** misc ********** diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/java/JavaManagedType.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/java/JavaManagedType.java new file mode 100644 index 0000000000..79f47c1c99 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/java/JavaManagedType.java @@ -0,0 +1,36 @@ +/*******************************************************************************
+ * Copyright (c) 2013 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.jpa.core.context.java;
+
+import org.eclipse.jpt.jpa.core.context.ManagedType;
+
+/**
+ * Context managed type.
+ * <p>
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ *
+ * @version 3.3
+ * @since 3.3
+ */
+public interface JavaManagedType
+ extends ManagedType, JavaElementReference
+{
+ // ********** covariant overrides **********
+
+ /**
+ * Return the managed type's type.
+ */
+ Class<? extends JavaManagedType> getType();
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/java/JavaManagedTypeDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/java/JavaManagedTypeDefinition.java new file mode 100644 index 0000000000..d7ce74e3f4 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/java/JavaManagedTypeDefinition.java @@ -0,0 +1,64 @@ +/*******************************************************************************
+ * Copyright (c) 2013 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.jpa.core.context.java;
+
+import org.eclipse.jpt.common.core.resource.java.JavaResourceType;
+import org.eclipse.jpt.common.utility.internal.transformer.TransformerAdapter;
+import org.eclipse.jpt.jpa.core.JpaFactory;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.context.JpaContextNode;
+import org.eclipse.jpt.jpa.core.context.ManagedType;
+
+/**
+ * Map a type to a context managed type and its corresponding
+ * Java annotations.
+ * <p>
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ *
+ * @version 3.3
+ * @since 3.3
+ */
+public interface JavaManagedTypeDefinition
+{
+ /**
+ * Return a class that corresponds to the managed type.
+ * @see ManagedType#getType()
+ */
+ Class<? extends JavaManagedType> getType();
+
+ /**
+ * Return the names of the annotations applicable to this managed type
+ */
+ Iterable<String> getAnnotationNames(JpaProject jpaProject);
+
+ class AnnotationNameTransformer
+ extends TransformerAdapter<JavaManagedTypeDefinition, Iterable<String>>
+ {
+ private JpaProject jpaProject;
+
+ public AnnotationNameTransformer(JpaProject jpaProject) {
+ super();
+ this.jpaProject = jpaProject;
+ }
+ @Override
+ public Iterable<String> transform(JavaManagedTypeDefinition def) {
+ return def.getAnnotationNames(this.jpaProject);
+ }
+ }
+
+ /**
+ * Return a new <code>JavaManagedType</code>
+ */
+ JavaManagedType buildContextManagedType(JpaContextNode parent, JavaResourceType jrt, JpaFactory factory);
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/java/JavaPersistentType.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/java/JavaPersistentType.java index 07ab734616..80753b8060 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/java/JavaPersistentType.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/java/JavaPersistentType.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2012 Oracle. All rights reserved. + * Copyright (c) 2006, 2013 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. @@ -10,7 +10,6 @@ package org.eclipse.jpt.jpa.core.context.java; import org.eclipse.jpt.common.core.resource.java.JavaResourceAttribute; -import org.eclipse.jpt.common.core.resource.java.JavaResourceType; import org.eclipse.jpt.common.utility.iterable.ListIterable; import org.eclipse.jpt.jpa.core.context.PersistentType; @@ -27,10 +26,12 @@ import org.eclipse.jpt.jpa.core.context.PersistentType; * @since 2.0 */ public interface JavaPersistentType - extends PersistentType, JavaElementReference + extends PersistentType, JavaManagedType { // ********** covariant overrides ********** + Class<? extends JavaPersistentType> getType(); + JavaTypeMapping getMapping(); ListIterable<JavaPersistentAttribute> getAttributes(); @@ -46,10 +47,5 @@ public interface JavaPersistentType */ boolean hasAnyAnnotatedAttributes(); - /** - * Return the Java resource persistent type. - */ - JavaResourceType getJavaResourceType(); - JavaPersistentAttribute getAttributeFor(JavaResourceAttribute javaResourceAttribute); } diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/EntityMappings.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/EntityMappings.java index f3b0b45dc9..0f5146cb32 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/EntityMappings.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/EntityMappings.java @@ -104,15 +104,20 @@ public interface EntityMappings /** * Covariant override. */ - ListIterable<OrmPersistentType> getPersistentTypes(); + ListIterable<OrmManagedType> getManagedTypes(); + int getManagedTypesSize(); + OrmManagedType getManagedType(String typeName); + void removeManagedType(int index); + void removeManagedType(OrmManagedType managedType); + boolean containsManagedType(String typeName); + String MANAGED_TYPES_LIST = "managedTypes"; //$NON-NLS-1$ + + /** + * Covariant override. + */ + Iterable<OrmPersistentType> getPersistentTypes(); OrmPersistentType getPersistentType(String className); - int getPersistentTypesSize(); OrmPersistentType addPersistentType(String mappingKey, String className); - void removePersistentType(int index); - void removePersistentType(OrmPersistentType persistentType); - //void movePersistentType(int targetIndex, int sourceIndex); - boolean containsPersistentType(String className); - String PERSISTENT_TYPES_LIST = "persistentTypes"; //$NON-NLS-1$ ListIterable<OrmSequenceGenerator> getSequenceGenerators(); int getSequenceGeneratorsSize(); diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/OrmManagedType.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/OrmManagedType.java new file mode 100644 index 0000000000..b517251258 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/OrmManagedType.java @@ -0,0 +1,106 @@ +/*******************************************************************************
+ * Copyright (c) 2013 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.jpa.core.context.orm;
+
+import org.eclipse.jpt.jpa.core.context.DeleteTypeRefactoringParticipant;
+import org.eclipse.jpt.jpa.core.context.ManagedType;
+import org.eclipse.jpt.jpa.core.context.TypeRefactoringParticipant;
+import org.eclipse.jpt.jpa.core.context.java.JavaManagedType;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlEntityMappings;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlManagedType;
+
+/**
+ * Context managed type.
+ * <p>
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ *
+ * @version 3.3
+ * @since 3.3
+ */
+public interface OrmManagedType
+ extends ManagedType, DeleteTypeRefactoringParticipant, TypeRefactoringParticipant
+{
+ // ********** class **********
+
+ /**
+ * Member class names will be qualified with a <code>'$'</code>
+ * between each declaring class name and member class name.
+ * <strong>NB:</strong> This may be an unqualified name to be prefixed by the
+ * entity mappings's 'package' value.
+ *
+ * @see EntityMappings#getPackage()
+ */
+ String getClass_();
+
+ /**
+ * @see #getClass_()
+ */
+ void setClass(String class_);
+ String CLASS_PROPERTY = "class"; //$NON-NLS-1$
+
+
+ // ********** covariant overrides **********
+
+ EntityMappings getParent();
+
+ XmlManagedType getXmlManagedType();
+
+ /**
+ * Return the managed type's type.
+ */
+ Class<? extends OrmManagedType> getType();
+
+ /**
+ * Managed types are in a sequence in the orm schema. We must keep
+ * the list of managed in the appropriate order so the wtp xml
+ * translators will write them to the xml in that order and they
+ * will adhere to the schema.
+ * <p>
+ * Each concrete implementation must implement this
+ * method and return an int that matches its order in the schema.
+ */
+ int getXmlSequence();
+
+ /**
+ * Add the managed type's XML managed type to the appropriate list
+ * in the specified XML entity mappings.
+ */
+ void addXmlManagedTypeTo(XmlEntityMappings entityMappings);
+
+ /**
+ * Remove the managed type's XML managed type from the appropriate list
+ * in the specified XML entity mappings.
+ */
+ void removeXmlManagedTypeFrom(XmlEntityMappings entityMappings);
+
+
+ // ********** misc **********
+
+ /**
+ * Return the Java managed type that is referred to by the
+ * <code>orm.xml</code> managed type.
+ * Return <code>null</code> if it is missing.
+ */
+ JavaManagedType getJavaManagedType();
+ String JAVA_MANAGED_TYPE_PROPERTY = "javaManagedType"; //$NON-NLS-1$
+
+ /**
+ * Return the managed type's default package, as set in its entity
+ * mappings.
+ */
+ String getDefaultPackage();
+
+ //TODO would like to remove this eventually
+ void dispose();
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/OrmManagedTypeDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/OrmManagedTypeDefinition.java new file mode 100644 index 0000000000..035c0b129f --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/OrmManagedTypeDefinition.java @@ -0,0 +1,47 @@ +/*******************************************************************************
+ * Copyright (c) 2013 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.jpa.core.context.orm;
+
+import org.eclipse.jpt.jpa.core.context.JpaContextNode;
+import org.eclipse.jpt.jpa.core.context.ManagedType;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlManagedType;
+
+/**
+ * Map an orm managed type context type and resource type.
+ * <p>
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ *
+ * @version 3.3
+ * @since 3.3
+ */
+public interface OrmManagedTypeDefinition
+{
+ /**
+ * Return a class that corresponds to the context managed type's type.
+ * @see ManagedType#getType()
+ */
+ Class<? extends OrmManagedType> getContextType();
+
+ /**
+ * Return a class that corresponds to the resource managed type's type.
+ * @see XmlManagedType#getType()
+ */
+ Class<? extends XmlManagedType> getResourceType();
+
+ /**
+ * Build a context managed type for the specified parent
+ * and resource managed type, using the specified factory.
+ */
+ OrmManagedType buildContextManagedType(JpaContextNode parent, XmlManagedType resourceManagedType, OrmXmlContextNodeFactory factory);
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/OrmPersistentType.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/OrmPersistentType.java index c4ea189e08..2e7dc29458 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/OrmPersistentType.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/OrmPersistentType.java @@ -10,11 +10,10 @@ package org.eclipse.jpt.jpa.core.context.orm; import org.eclipse.jpt.common.utility.iterable.ListIterable; -import org.eclipse.jpt.jpa.core.context.DeleteTypeRefactoringParticipant; import org.eclipse.jpt.jpa.core.context.PersistentAttribute; import org.eclipse.jpt.jpa.core.context.PersistentType; -import org.eclipse.jpt.jpa.core.context.TypeRefactoringParticipant; import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType; +import org.eclipse.jpt.jpa.core.resource.orm.XmlTypeMapping; /** * <code>orm.xml</code> persistent type @@ -29,11 +28,14 @@ import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType; * @since 2.0 */ public interface OrmPersistentType - extends PersistentType, PersistentType.Owner, DeleteTypeRefactoringParticipant, TypeRefactoringParticipant + extends OrmManagedType, PersistentType, PersistentType.Owner { + // ********** covariant overrides ********** - EntityMappings getParent(); + Class<? extends OrmPersistentType> getType(); + + XmlTypeMapping getXmlManagedType(); OrmTypeMapping getMapping(); @@ -138,16 +140,7 @@ public interface OrmPersistentType * Return the Java persistent type that is referred to by the * <code>orm.xml</code> persistent type. * Return <code>null</code> if it is missing. + * @see #getJavaManagedType() */ JavaPersistentType getJavaPersistentType(); - String JAVA_PERSISTENT_TYPE_PROPERTY = "javaPersistentType"; //$NON-NLS-1$ - - /** - * Return the persistent type's default package, as set in its entity - * mappings. - */ - String getDefaultPackage(); - - //TODO would like to remove this eventually - void dispose(); } diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/OrmTypeMapping.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/OrmTypeMapping.java index 44e6759491..efbab98634 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/OrmTypeMapping.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/OrmTypeMapping.java @@ -15,7 +15,6 @@ import org.eclipse.jpt.jpa.core.context.TypeRefactoringParticipant; import org.eclipse.jpt.jpa.core.context.java.JavaTypeMapping; import org.eclipse.jpt.jpa.core.resource.orm.XmlEntityMappings; import org.eclipse.jpt.jpa.core.resource.orm.XmlTypeMapping; -import org.eclipse.text.edits.DeleteEdit; /** * <code>orm.xml</code> type mapping @@ -32,24 +31,6 @@ import org.eclipse.text.edits.DeleteEdit; public interface OrmTypeMapping extends TypeMapping, TypeRefactoringParticipant { - // ********** class ********** - - /** - * Member class names will be qualified with a <code>'$'</code> - * between each declaring class name and member class name. - * <strong>NB:</strong> This may be an unqualified name to be prefixed by the - * entity mappings's 'package' value. - * - * @see EntityMappings#getPackage() - */ - String getClass_(); - - /** - * @see #getClass_() - */ - void setClass(String class_); - String CLASS_PROPERTY = "class"; //$NON-NLS-1$ - // ********** metadata complete ********** @@ -101,6 +82,7 @@ public interface OrmTypeMapping * <p> * Each concrete implementation must implement this * method and return an int that matches its order in the schema. + * @see OrmManagedType#getXmlSequence() */ int getXmlSequence(); @@ -120,8 +102,6 @@ public interface OrmTypeMapping TextRange getSelectionTextRange(); - TextRange getClassTextRange(); - TextRange getAttributesTextRange(); @@ -147,14 +127,6 @@ public interface OrmTypeMapping JavaTypeMapping getJavaTypeMappingForDefaults(); - // ********** refactoring ********** - - /** - * Create a text DeleteEdit for deleting the type mapping element and any text that precedes it - */ - DeleteEdit createDeleteEdit(); - - // ********** misc ********** OrmPersistentType getPersistentType(); diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/OrmXmlDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/OrmXmlDefinition.java index 7ed177a093..dbdad15878 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/OrmXmlDefinition.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/orm/OrmXmlDefinition.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009, 2010 Oracle. All rights reserved. + * Copyright (c) 2009, 2013 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. @@ -10,6 +10,7 @@ package org.eclipse.jpt.jpa.core.context.orm; import org.eclipse.emf.ecore.EFactory; +import org.eclipse.jpt.jpa.core.resource.orm.XmlManagedType; /** * <code>orm.xml</code> definition @@ -37,6 +38,16 @@ public interface OrmXmlDefinition OrmXmlContextNodeFactory getContextNodeFactory(); + // ********** managed types ********** + + /** + * Return the OrmManagedTypeDefinition corresponding to the given resource type + * @throws IllegalArgumentException if the resource type is not supported + * @see OrmManagedTypeDefinition#getResourceType() + */ + OrmManagedTypeDefinition getManagedTypeDefinition(Class<? extends XmlManagedType> resourceType); + + // ********** type/attribute mappings ********** /** diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/persistence/ClassRef.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/persistence/ClassRef.java index a46579c721..c6b8469290 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/persistence/ClassRef.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/persistence/ClassRef.java @@ -16,6 +16,7 @@ import org.eclipse.jpt.jpa.core.JpaStructureNode; import org.eclipse.jpt.jpa.core.context.DeleteTypeRefactoringParticipant; import org.eclipse.jpt.jpa.core.context.PersistentType; import org.eclipse.jpt.jpa.core.context.TypeRefactoringParticipant; +import org.eclipse.jpt.jpa.core.context.java.JavaManagedType; import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType; import org.eclipse.jpt.jpa.core.resource.persistence.XmlJavaClassRef; @@ -80,28 +81,36 @@ public interface ClassRef JavaResourceAbstractType getJavaResourceType(); - // ********** java persistent type ********** + // ********** java managed type ********** /** - * String constant associated with changes to the java persistent type + * String constant associated with changes to the java managed type */ - final static String JAVA_PERSISTENT_TYPE_PROPERTY = "javaPersistentType"; //$NON-NLS-1$ + final static String JAVA_MANAGED_TYPE_PROPERTY = "javaManagedType"; //$NON-NLS-1$ /** - * Return the JavaPersistentType that corresponds to this IClassRef. + * Return the JavaManagedType that corresponds to this ClassRef. * This can be null. * This is not settable by users of this API. */ + JavaManagedType getJavaManagedType(); + + /** + * Convenience method for returning the JavaManagedType if it is a JavaPersistentType. + * It will return null if the JavaManagedType is null or is not a JavaPersistentType. + * @see ClassRef#getJavaManagedType() + * @see ManagedType#getContextType() + */ JavaPersistentType getJavaPersistentType(); - Transformer<ClassRef, JavaPersistentType> JAVA_PERSISTENT_TYPE_TRANSFORMER = new JavaPersistentTypeTransformer(); + Transformer<ClassRef, JavaManagedType> JAVA_MANAGED_TYPE_TRANSFORMER = new JavaManagedTypeTransformer(); - class JavaPersistentTypeTransformer - extends AbstractTransformer<ClassRef, JavaPersistentType> + class JavaManagedTypeTransformer + extends AbstractTransformer<ClassRef, JavaManagedType> { @Override - protected JavaPersistentType transform_(ClassRef ref) { - return ref.getJavaPersistentType(); + protected JavaManagedType transform_(ClassRef ref) { + return ref.getJavaManagedType(); } } } diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/persistence/ManagedTypeContainer.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/persistence/ManagedTypeContainer.java new file mode 100644 index 0000000000..1349e6f7b0 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/persistence/ManagedTypeContainer.java @@ -0,0 +1,67 @@ +/******************************************************************************* + * Copyright (c) 2013 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.jpa.core.context.persistence; + +import org.eclipse.jpt.common.utility.transformer.Transformer; +import org.eclipse.jpt.jpa.core.context.ManagedType; + +/** + * Interface used by persistence unit to gather up managed types. + * <p> + * Provisional API: This interface is part of an interim API that is still + * under development and expected to change significantly before reaching + * stability. It is available at this early stage to solicit feedback from + * pioneering adopters on the understanding that any code that uses this API + * will almost certainly be broken (repeatedly) as the API evolves. + * + * @version 3.3 + * @since 3.3 + */ +public interface ManagedTypeContainer { + + /** + * Return the container's managed types. The returned list may contain + * multiple managed types for the same Java class; e.g.<ul> + * <li>the same type is specified in both the <code>persistence.xml</code> and + * <code>orm.xml</code> files + * <Li>the same type is specified multiple times in the same + * <code>persistence.xml</code> or <code>orm.xml</code> file + * <li>the same type is in a jar file specified in the + * <code>persistence.xml</code> file and is specified in the + * <code>persistence.xml</code> file and/or an <code>orm.xml</code> file + * </ul> + */ + Iterable<? extends ManagedType> getManagedTypes(); + + /** + * Return the managed type with the specified name. + * Return <code>null</code> if the managed type is not found. + * If the persistent unit has more than one managed type with the + * specified name, return the first one found, using the following + * search order:<ul> + * <li>mapping files + * <li>classes + * <li>jar files + * </ul> + */ + ManagedType getManagedType(String typeName); + + + Transformer<ManagedTypeContainer, Iterable<? extends ManagedType>> TRANSFORMER = + new Transformer<ManagedTypeContainer, Iterable<? extends ManagedType>>() { + public Iterable<? extends ManagedType> transform(ManagedTypeContainer container) { + return container.getManagedTypes(); + } + @Override + public String toString() { + return "ManagedTypeContainer.TRANSFORMER"; //$NON-NLS-1$ + } + }; +} diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/persistence/PersistenceUnit.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/persistence/PersistenceUnit.java index 670a90a2dc..71bc08cf33 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/persistence/PersistenceUnit.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/persistence/PersistenceUnit.java @@ -753,11 +753,11 @@ public interface PersistenceUnit XmlPersistenceUnit getXmlPersistenceUnit(); /** - * Return whether the persistence unit specifies a persistent type with the + * Return whether the persistence unit specifies a managed type with the * specified name (i.e. the type is listed either in the persistence unit's * list of specified classes or in one of the persistent unit's mapping files). */ - boolean specifiesPersistentType(String typeName); + boolean specifiesManagedType(String typeName); /** * Return the persistence unit's Java persistent types, as specified by diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/persistence/PersistentTypeContainer.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/persistence/PersistentTypeContainer.java index 6617b08972..547b573f5e 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/persistence/PersistentTypeContainer.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/context/persistence/PersistentTypeContainer.java @@ -22,10 +22,10 @@ import org.eclipse.jpt.jpa.core.context.PersistentType; * pioneering adopters on the understanding that any code that uses this API * will almost certainly be broken (repeatedly) as the API evolves. * - * @version 2.3 + * @version 3.3 * @since 2.3 */ -public interface PersistentTypeContainer { +public interface PersistentTypeContainer extends ManagedTypeContainer { /** * Return the container's persistent types. The returned list may contain diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/AbstractJpaNode.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/AbstractJpaNode.java index 4d1cd05d62..fb2fab7817 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/AbstractJpaNode.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/AbstractJpaNode.java @@ -39,6 +39,8 @@ import org.eclipse.jpt.jpa.core.JpaProject; import org.eclipse.jpt.jpa.core.context.JpaContextNode; import org.eclipse.jpt.jpa.core.jpa2.JpaFactory2_0; import org.eclipse.jpt.jpa.core.jpa2.JpaProject2_0; +import org.eclipse.jpt.jpa.core.jpa2_1.JpaFactory2_1; +import org.eclipse.jpt.jpa.core.jpa2_1.JpaProject2_1; import org.eclipse.jpt.jpa.db.Catalog; import org.eclipse.jpt.jpa.db.Database; @@ -146,12 +148,22 @@ public abstract class AbstractJpaNode return this.getJpaPlatformVersion().isCompatibleWithJpaVersion(JpaProject2_0.FACET_VERSION_STRING); } + protected boolean isJpa2_1Compatible() { + return this.getJpaPlatformVersion().isCompatibleWithJpaVersion(JpaProject2_1.FACET_VERSION_STRING); + } + /** * Call {@link #isJpa2_0Compatible()} before calling this method. */ protected JpaFactory2_0 getJpaFactory2_0() { return (JpaFactory2_0) this.getJpaFactory(); } + /** + * Call {@link #isJpa2_1Compatible()} before calling this method. + */ + protected JpaFactory2_1 getJpaFactory2_1() { + return (JpaFactory2_1) this.getJpaFactory(); + } protected JpaFactory getJpaFactory() { return this.getJpaPlatform().getJpaFactory(); diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/AbstractJpaPlatformProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/AbstractJpaPlatformProvider.java index 73df173017..c1a670b1d9 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/AbstractJpaPlatformProvider.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/AbstractJpaPlatformProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2012 Oracle. All rights reserved. + * Copyright (c) 2007, 2013 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. @@ -14,13 +14,17 @@ import java.util.HashMap; import java.util.Map; import org.eclipse.jpt.common.core.ContentTypeReference; import org.eclipse.jpt.common.core.JptResourceType; +import org.eclipse.jpt.common.core.JptResourceTypeReference; +import org.eclipse.jpt.common.utility.internal.collection.CollectionTools; import org.eclipse.jpt.common.utility.transformer.Transformer; import org.eclipse.jpt.jpa.core.JpaPlatformProvider; import org.eclipse.jpt.jpa.core.JpaResourceModelProvider; import org.eclipse.jpt.jpa.core.ResourceDefinition; import org.eclipse.jpt.jpa.core.context.java.DefaultJavaAttributeMappingDefinition; import org.eclipse.jpt.jpa.core.context.java.JavaAttributeMappingDefinition; +import org.eclipse.jpt.jpa.core.context.java.JavaManagedTypeDefinition; import org.eclipse.jpt.jpa.core.context.java.JavaTypeMappingDefinition; +import org.eclipse.jpt.jpa.core.internal.context.java.JavaPersistentTypeDefinition; import org.eclipse.jpt.jpa.core.internal.plugin.JptJpaCorePlugin; /** @@ -34,6 +38,8 @@ public abstract class AbstractJpaPlatformProvider protected ArrayList<JpaResourceModelProvider> resourceModelProviders; + protected ArrayList<JavaManagedTypeDefinition> javaManagedTypeDefinitions; + protected ArrayList<JavaTypeMappingDefinition> javaTypeMappingDefinitions; protected ArrayList<DefaultJavaAttributeMappingDefinition> defaultJavaAttributeMappingDefinitions; @@ -99,6 +105,36 @@ public abstract class AbstractJpaPlatformProvider } + // ********** Java managed types ********** + + public final synchronized Iterable<JavaManagedTypeDefinition> getJavaManagedTypeDefinitions() { + if (this.javaManagedTypeDefinitions == null) { + this.javaManagedTypeDefinitions = this.buildJavaManagedTypeDefinitions(); + } + return this.javaManagedTypeDefinitions; + } + + protected ArrayList<JavaManagedTypeDefinition> buildJavaManagedTypeDefinitions() { + ArrayList<JavaManagedTypeDefinition> definitions = new ArrayList<JavaManagedTypeDefinition>(); + this.addJavaManagedTypeDefinitionsTo(definitions); + return definitions; + } + + /** + * To the specified list, add Java managed type definitions to use for + * analyzing the type given all annotations on it. The order is + * important, as once a managed type definition tests positive for a + * type, all following managed type definitions are ignored. + */ + protected void addJavaManagedTypeDefinitionsTo(ArrayList<JavaManagedTypeDefinition> definitions) { + CollectionTools.addAll(definitions, JAVA_MANAGED_TYPE_DEFINITIONS); + } + + protected static final JavaManagedTypeDefinition[] JAVA_MANAGED_TYPE_DEFINITIONS = new JavaManagedTypeDefinition[] { + JavaPersistentTypeDefinition.instance() + }; + + // ********** Java type mappings ********** public final synchronized Iterable<JavaTypeMappingDefinition> getJavaTypeMappingDefinitions() { @@ -188,7 +224,7 @@ public abstract class AbstractJpaPlatformProvider protected void validateResourceDefinitions(ArrayList<ResourceDefinition> definitions) { String message = "Duplicate resource definitions listed for resource type ''{0}'': {1}"; //$NON-NLS-1$ - this.validate(definitions, ResourceDefinition.RESOURCE_TYPE_TRANSFORMER, message); + this.validate(definitions, JptResourceTypeReference.RESOURCE_TYPE_TRANSFORMER, message); } diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/AbstractJpaProject.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/AbstractJpaProject.java index 0805f61e74..d0567528d9 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/AbstractJpaProject.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/AbstractJpaProject.java @@ -80,6 +80,7 @@ import org.eclipse.jpt.jpa.core.JpaPreferences; import org.eclipse.jpt.jpa.core.JpaProject; import org.eclipse.jpt.jpa.core.JptJpaCoreMessages; import org.eclipse.jpt.jpa.core.context.JpaRootContextNode; +import org.eclipse.jpt.jpa.core.context.java.JavaManagedTypeDefinition; import org.eclipse.jpt.jpa.core.context.java.JavaTypeMappingDefinition; import org.eclipse.jpt.jpa.core.internal.plugin.JptJpaCorePlugin; import org.eclipse.jpt.jpa.core.internal.validation.DefaultJpaValidationMessages; @@ -828,26 +829,26 @@ public abstract class AbstractJpaProject } /** - * Return only the types of those valid <em>mapped</em> (i.e. annotated with - * <code>@Entity</code>, <code>@Embeddable</code>, etc.) Java resource - * types that are directly part of the JPA project, ignoring + * Return only the types of those valid <em>managed</em> (i.e. annotated with + * <code>@Entity</code>, <code>@Embeddable</code>, <code>@Converter</code>etc.) + * Java resource types that are directly part of the JPA project, ignoring * those in JARs referenced in <code>persistence.xml</code>. */ - public Iterable<JavaResourceAbstractType> getMappedJavaSourceTypes() { - return getInternalMappedSourceJavaResourceTypes(); + public Iterable<JavaResourceAbstractType> getPotentialJavaSourceTypes() { + return getInternalPotentialSourceJavaResourceTypes(); } /** - * Return only those valid <em>mapped</em> (i.e. annotated with - * <code>@Entity</code>, <code>@Embeddable</code>, etc.) Java resource - * persistent types that are directly part of the JPA project, ignoring + * Return only those valid <em>managed</em> (i.e. annotated with + * <code>@Entity</code>, <code>@Embeddable</code>, <code>@Converter</code>etc.) Java resource + * types that are directly part of the JPA project, ignoring * those in JARs referenced in <code>persistence.xml</code>. */ - protected Iterable<JavaResourceAbstractType> getInternalMappedSourceJavaResourceTypes() { - Iterable<String> typeMappingAnnotationNames = this.getTypeMappingAnnotationNames(); + protected Iterable<JavaResourceAbstractType> getInternalPotentialSourceJavaResourceTypes() { + Iterable<String> annotationNames = this.getManagedTypeAnnotationNames(); return IterableTools.filter( this.getAnnotatedJavaSourceTypes(), - new JavaResourceAnnotatedElement.IsAnnotatedWithAnyOf(typeMappingAnnotationNames) + new JavaResourceAnnotatedElement.IsAnnotatedWithAnyOf(annotationNames) ); } @@ -855,6 +856,13 @@ public abstract class AbstractJpaProject return IterableTools.transform(this.getJpaPlatform().getJavaTypeMappingDefinitions(), JavaTypeMappingDefinition.ANNOTATION_NAME_TRANSFORMER); } + public Iterable<String> getManagedTypeAnnotationNames() { + return IterableTools.concatenate( + IterableTools.transform( + this.getJpaPlatform().getJavaManagedTypeDefinitions(), + new JavaManagedTypeDefinition.AnnotationNameTransformer(this.getJpaProject()))); + } + /** * Return only those Java resource persistent types that are directly * part of the JPA project, ignoring those in JARs referenced in diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/GenericJpaPlatform.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/GenericJpaPlatform.java index 21b4a9f1b1..06b12cc881 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/GenericJpaPlatform.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/GenericJpaPlatform.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2012 Oracle. All rights reserved. + * Copyright (c) 2007, 2013 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. @@ -31,6 +31,7 @@ import org.eclipse.jpt.jpa.core.JpaResourceModelProvider; import org.eclipse.jpt.jpa.core.ResourceDefinition; import org.eclipse.jpt.jpa.core.context.java.DefaultJavaAttributeMappingDefinition; import org.eclipse.jpt.jpa.core.context.java.JavaAttributeMappingDefinition; +import org.eclipse.jpt.jpa.core.context.java.JavaManagedTypeDefinition; import org.eclipse.jpt.jpa.core.context.java.JavaTypeMappingDefinition; import org.eclipse.jpt.jpa.db.ConnectionProfileFactory; import org.eclipse.persistence.jpa.jpql.parser.JPQLGrammar; @@ -169,6 +170,13 @@ public class GenericJpaPlatform } + // ********** Java managed types ********** + + public Iterable<JavaManagedTypeDefinition> getJavaManagedTypeDefinitions() { + return this.platformProvider.getJavaManagedTypeDefinitions(); + } + + // ********** Java type mappings ********** public Iterable<JavaTypeMappingDefinition> getJavaTypeMappingDefinitions() { diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/AbstractJavaManagedType.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/AbstractJavaManagedType.java new file mode 100644 index 0000000000..081bb13767 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/AbstractJavaManagedType.java @@ -0,0 +1,126 @@ +/*******************************************************************************
+ * Copyright (c) 2013 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.jpa.core.internal.context.java;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jpt.common.core.resource.java.JavaResourceType;
+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.jpa.core.JpaFile;
+import org.eclipse.jpt.jpa.core.context.JpaContextNode;
+import org.eclipse.jpt.jpa.core.context.java.JavaManagedType;
+import org.eclipse.jpt.jpa.core.internal.plugin.JptJpaCorePlugin;
+
+public abstract class AbstractJavaManagedType
+ extends AbstractJavaJpaContextNode
+ implements JavaManagedType
+{
+ protected final JavaResourceType resourceType;
+
+ protected String name;
+
+
+ protected AbstractJavaManagedType(JpaContextNode parent, JavaResourceType resourceType) {
+ super(parent);
+ this.resourceType = resourceType;
+ this.name = this.resourceType.getTypeBinding().getQualifiedName();
+ }
+
+
+ // ********** synchronize/update **********
+
+ @Override
+ public void synchronizeWithResourceModel() {
+ super.synchronizeWithResourceModel();
+ this.setName(this.resourceType.getTypeBinding().getQualifiedName());
+ }
+
+ @Override
+ public void update() {
+ super.update();
+ }
+
+
+ // ********** name **********
+
+ public String getName() {
+ return this.name;
+ }
+
+ public String getSimpleName(){
+ return ClassNameTools.simpleName(this.name);
+ }
+
+ public String getTypeQualifiedName() {
+ String packageName = this.getPackageName();
+ return StringTools.isBlank(packageName) ? this.name : this.name.substring(packageName.length() + 1);
+ }
+
+ protected void setName(String name) {
+ String old = this.name;
+ this.name = name;
+ this.firePropertyChanged(NAME_PROPERTY, old, name);
+ }
+
+ public TextRange getValidationTextRange() {
+ return this.getSelectionTextRange();
+ }
+
+ public TextRange getSelectionTextRange() {
+ return this.resourceType.getNameTextRange();
+ }
+
+
+ // ********** misc **********
+
+ @Override
+ public IResource getResource() {
+ return this.resourceType.getFile();
+ }
+
+ public JavaResourceType getJavaResourceType() {
+ return this.resourceType;
+ }
+
+ protected JpaFile getJpaFile() {
+ return this.getJpaFile(this.resourceType.getFile());
+ }
+
+ public boolean isFor(String typeName) {
+ return ObjectTools.equals(typeName, this.name);
+ }
+
+ public boolean isIn(IPackageFragment packageFragment) {
+ return ObjectTools.equals(packageFragment.getElementName(), this.getPackageName());
+ }
+
+ protected String getPackageName() {
+ return this.getJavaResourceType().getTypeBinding().getPackageName();
+ }
+
+ public IJavaElement getJavaElement() {
+ try {
+ return this.getJavaProject().findType(this.name);
+ } catch (JavaModelException ex) {
+ JptJpaCorePlugin.instance().logError(ex);
+ return null;
+ }
+ }
+
+ @Override
+ public void toString(StringBuilder sb) {
+ sb.append(this.name);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/AbstractJavaPersistentType.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/AbstractJavaPersistentType.java index 5ecc3ae75b..a282aa6f0e 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/AbstractJavaPersistentType.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/AbstractJavaPersistentType.java @@ -15,10 +15,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Vector; -import org.eclipse.core.resources.IResource; -import org.eclipse.jdt.core.IJavaElement; -import org.eclipse.jdt.core.IPackageFragment; -import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jpt.common.core.resource.java.Annotation; import org.eclipse.jpt.common.core.resource.java.JavaResourceAbstractType; import org.eclipse.jpt.common.core.resource.java.JavaResourceAnnotatedElement; @@ -30,7 +26,6 @@ import org.eclipse.jpt.common.core.resource.java.JavaResourceType; import org.eclipse.jpt.common.core.utility.TextRange; import org.eclipse.jpt.common.core.utility.jdt.TypeBinding; import org.eclipse.jpt.common.utility.filter.Filter; -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.collection.CollectionTools; @@ -43,6 +38,7 @@ import org.eclipse.jpt.jpa.core.JpaStructureNode; import org.eclipse.jpt.jpa.core.context.AccessType; import org.eclipse.jpt.jpa.core.context.PersistentType; import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute; +import org.eclipse.jpt.jpa.core.context.java.JavaManagedType; import org.eclipse.jpt.jpa.core.context.java.JavaPersistentAttribute; import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType; import org.eclipse.jpt.jpa.core.context.java.JavaTypeMapping; @@ -63,12 +59,9 @@ import org.eclipse.wst.validation.internal.provisional.core.IReporter; * </ul> */ public abstract class AbstractJavaPersistentType - extends AbstractJavaJpaContextNode + extends AbstractJavaManagedType implements JavaPersistentType { - protected final JavaResourceType resourceType; - - protected String name; protected PersistentType superPersistentType; @@ -83,9 +76,7 @@ public abstract class AbstractJavaPersistentType protected AbstractJavaPersistentType(PersistentType.Owner parent, JavaResourceType resourceType) { - super(parent); - this.resourceType = resourceType; - this.name = this.resourceType.getTypeBinding().getQualifiedName(); + super(parent, resourceType); this.specifiedAccess = this.buildSpecifiedAccess(); // keep this non-null @@ -102,7 +93,6 @@ public abstract class AbstractJavaPersistentType @Override public void synchronizeWithResourceModel() { super.synchronizeWithResourceModel(); - this.setName(this.resourceType.getTypeBinding().getQualifiedName()); this.setSpecifiedAccess_(this.buildSpecifiedAccess()); this.syncMapping(); this.synchronizeNodesWithResourceModel(this.getAttributes()); @@ -119,28 +109,6 @@ public abstract class AbstractJavaPersistentType } - // ********** name ********** - - public String getName() { - return this.name; - } - - public String getSimpleName(){ - return ClassNameTools.simpleName(this.name); - } - - public String getTypeQualifiedName() { - String packageName = this.getPackageName(); - return StringTools.isBlank(packageName) ? this.name : this.name.substring(packageName.length() + 1); - } - - protected void setName(String name) { - String old = this.name; - this.name = name; - this.firePropertyChanged(NAME_PROPERTY, old, name); - } - - // ********** super persistent type ********** public PersistentType getSuperPersistentType() { @@ -969,18 +937,14 @@ public abstract class AbstractJavaPersistentType return (fullTextRange == null) ? false : fullTextRange.includes(offset); } - public TextRange getSelectionTextRange() { - return this.resourceType.getNameTextRange(); - } - public void gatherRootStructureNodes(JpaFile jpaFile, Collection<JpaStructureNode> rootStructureNodes) { // the type's resource can be null if the resource type is "external" if (ObjectTools.equals(this.getResource(), jpaFile.getFile())) { for (JpaStructureNode root : rootStructureNodes) { // the JPA file is a java file, so the already-added root nodes must be - // Java persistent types - JavaPersistentType jpt = (JavaPersistentType) root; - if (jpt.getName().equals(this.name)) { + // Java managed types + JavaManagedType jmt = (JavaManagedType) root; + if (jmt.getName().equals(this.name)) { // no duplicates - // the first one found is used as a root in the structure view, // the others are ignored... @@ -1063,10 +1027,6 @@ public abstract class AbstractJavaPersistentType } } - public TextRange getValidationTextRange() { - return this.getSelectionTextRange(); - } - // ********** misc ********** @@ -1075,15 +1035,6 @@ public abstract class AbstractJavaPersistentType return (PersistentType.Owner) super.getParent(); } - @Override - public IResource getResource() { - return this.resourceType.getFile(); - } - - public JavaResourceType getJavaResourceType() { - return this.resourceType; - } - public AccessType getOwnerOverrideAccess() { return this.getParent().getOverridePersistentTypeAccess(); } @@ -1092,40 +1043,10 @@ public abstract class AbstractJavaPersistentType return this.getParent().getDefaultPersistentTypeAccess(); } - protected JpaFile getJpaFile() { - return this.getJpaFile(this.resourceType.getFile()); - } - - public boolean isFor(String typeName) { - return ObjectTools.equals(typeName, this.name); - } - - public boolean isIn(IPackageFragment packageFragment) { - return ObjectTools.equals(packageFragment.getElementName(), this.getPackageName()); - } - - protected String getPackageName() { - return this.getJavaResourceType().getTypeBinding().getPackageName(); - } - public PersistentType getOverriddenPersistentType() { return null; // Java persistent types do not override anything } - public IJavaElement getJavaElement() { - try { - return this.getJavaProject().findType(this.name); - } catch (JavaModelException ex) { - JptJpaCorePlugin.instance().logError(ex); - return null; - } - } - - @Override - public void toString(StringBuilder sb) { - sb.append(this.name); - } - // ********** Access type ********** diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/AbstractJavaTypeMapping.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/AbstractJavaTypeMapping.java index 359aa2d0d0..2e5ee53a8b 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/AbstractJavaTypeMapping.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/AbstractJavaTypeMapping.java @@ -13,12 +13,9 @@ import java.util.List; import org.eclipse.jpt.common.core.resource.java.Annotation; import org.eclipse.jpt.common.core.resource.java.JavaResourceType; import org.eclipse.jpt.common.core.utility.TextRange; -import org.eclipse.jpt.common.utility.filter.Filter; -import org.eclipse.jpt.common.utility.internal.filter.FilterAdapter; import org.eclipse.jpt.common.utility.internal.iterable.EmptyIterable; import org.eclipse.jpt.common.utility.internal.iterable.FilteringIterable; import org.eclipse.jpt.common.utility.internal.iterable.IterableTools; -import org.eclipse.jpt.jpa.core.MappingKeys; import org.eclipse.jpt.jpa.core.context.AttributeMapping; import org.eclipse.jpt.jpa.core.context.Column; import org.eclipse.jpt.jpa.core.context.Entity; diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/JavaPersistentTypeDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/JavaPersistentTypeDefinition.java new file mode 100644 index 0000000000..c61c868deb --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/JavaPersistentTypeDefinition.java @@ -0,0 +1,50 @@ +/*******************************************************************************
+ * Copyright (c) 2013 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.jpa.core.internal.context.java;
+
+import org.eclipse.jpt.common.core.resource.java.JavaResourceType;
+import org.eclipse.jpt.jpa.core.JpaFactory;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.context.JpaContextNode;
+import org.eclipse.jpt.jpa.core.context.java.JavaManagedTypeDefinition;
+import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType;
+import org.eclipse.jpt.jpa.core.context.persistence.ClassRef;
+
+public class JavaPersistentTypeDefinition implements JavaManagedTypeDefinition
+{
+ // singleton
+ private static final JavaManagedTypeDefinition INSTANCE = new JavaPersistentTypeDefinition();
+
+ /**
+ * Return the singleton.
+ */
+ public static JavaManagedTypeDefinition instance() {
+ return INSTANCE;
+ }
+
+ /**
+ * Enforce singleton usage
+ */
+ private JavaPersistentTypeDefinition() {
+ super();
+ }
+
+ public Class<? extends JavaPersistentType> getType() {
+ return JavaPersistentType.class;
+ }
+
+ public Iterable<String> getAnnotationNames(JpaProject jpaProject) {
+ return jpaProject.getTypeMappingAnnotationNames();
+ }
+
+ public JavaPersistentType buildContextManagedType(JpaContextNode parent, JavaResourceType jrt, JpaFactory factory) {
+ return factory.buildJavaPersistentType((ClassRef) parent, jrt);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractEntityMappings.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractEntityMappings.java index cc18aebc73..7406045415 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractEntityMappings.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractEntityMappings.java @@ -25,9 +25,12 @@ import org.eclipse.jdt.core.IType; import org.eclipse.jpt.common.core.internal.utility.JDTTools; import org.eclipse.jpt.common.core.resource.java.JavaResourceAbstractType; import org.eclipse.jpt.common.core.resource.java.JavaResourceAnnotatedElement; +import org.eclipse.jpt.common.core.resource.xml.EmfTools; import org.eclipse.jpt.common.core.utility.TextRange; +import org.eclipse.jpt.common.utility.filter.Filter; import org.eclipse.jpt.common.utility.internal.ObjectTools; import org.eclipse.jpt.common.utility.internal.StringTools; +import org.eclipse.jpt.common.utility.internal.collection.CollectionTools; import org.eclipse.jpt.common.utility.internal.collection.ListTools; import org.eclipse.jpt.common.utility.internal.iterable.EmptyIterable; import org.eclipse.jpt.common.utility.internal.iterable.IterableTools; @@ -40,12 +43,15 @@ import org.eclipse.jpt.jpa.core.MappingKeys; import org.eclipse.jpt.jpa.core.context.AccessType; import org.eclipse.jpt.jpa.core.context.DeleteTypeRefactoringParticipant; import org.eclipse.jpt.jpa.core.context.Generator; +import org.eclipse.jpt.jpa.core.context.ManagedType; import org.eclipse.jpt.jpa.core.context.PersistentType; import org.eclipse.jpt.jpa.core.context.Query; import org.eclipse.jpt.jpa.core.context.TypeMapping; import org.eclipse.jpt.jpa.core.context.TypeRefactoringParticipant; import org.eclipse.jpt.jpa.core.context.orm.EntityMappings; import org.eclipse.jpt.jpa.core.context.orm.OrmIdClassReference; +import org.eclipse.jpt.jpa.core.context.orm.OrmManagedType; +import org.eclipse.jpt.jpa.core.context.orm.OrmManagedTypeDefinition; import org.eclipse.jpt.jpa.core.context.orm.OrmPersistenceUnitMetadata; import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType; import org.eclipse.jpt.jpa.core.context.orm.OrmQueryContainer; @@ -58,14 +64,19 @@ import org.eclipse.jpt.jpa.core.internal.context.ContextContainerTools; import org.eclipse.jpt.jpa.core.internal.context.persistence.AbstractPersistenceUnit; import org.eclipse.jpt.jpa.core.internal.plugin.JptJpaCorePlugin; import org.eclipse.jpt.jpa.core.internal.validation.DefaultJpaValidationMessages; +import org.eclipse.jpt.jpa.core.jpa2_1.context.orm.EntityMappings2_1; +import org.eclipse.jpt.jpa.core.jpa2_1.context.orm.OrmConverterType2_1; import org.eclipse.jpt.jpa.core.resource.orm.OrmFactory; +import org.eclipse.jpt.jpa.core.resource.orm.OrmPackage; import org.eclipse.jpt.jpa.core.resource.orm.XmlEmbeddable; import org.eclipse.jpt.jpa.core.resource.orm.XmlEntity; import org.eclipse.jpt.jpa.core.resource.orm.XmlEntityMappings; +import org.eclipse.jpt.jpa.core.resource.orm.XmlManagedType; import org.eclipse.jpt.jpa.core.resource.orm.XmlMappedSuperclass; import org.eclipse.jpt.jpa.core.resource.orm.XmlSequenceGenerator; import org.eclipse.jpt.jpa.core.resource.orm.XmlTableGenerator; import org.eclipse.jpt.jpa.core.resource.orm.XmlTypeMapping; +import org.eclipse.jpt.jpa.core.resource.orm.v2_1.XmlConverter_2_1; import org.eclipse.jpt.jpa.core.validation.JptJpaCoreValidationMessages; import org.eclipse.jpt.jpa.db.Catalog; import org.eclipse.jpt.jpa.db.Database; @@ -84,7 +95,7 @@ import org.eclipse.wst.validation.internal.provisional.core.IReporter; */ public abstract class AbstractEntityMappings extends AbstractOrmXmlContextNode - implements EntityMappings + implements EntityMappings2_1 { protected final XmlEntityMappings xmlEntityMappings; @@ -103,8 +114,8 @@ public abstract class AbstractEntityMappings protected final OrmPersistenceUnitMetadata persistenceUnitMetadata; - protected final Vector<OrmPersistentType> persistentTypes = new Vector<OrmPersistentType>(); - protected final PersistentTypeContainerAdapter persistentTypeContainerAdapter = new PersistentTypeContainerAdapter(); + protected final Vector<OrmManagedType> managedTypes = new Vector<OrmManagedType>(); + protected final ManagedTypeContainerAdapter managedTypeContainerAdapter = new ManagedTypeContainerAdapter(); protected final ContextListContainer<OrmSequenceGenerator, XmlSequenceGenerator> sequenceGeneratorContainer; @@ -131,7 +142,8 @@ public abstract class AbstractEntityMappings this.persistenceUnitMetadata = this.buildPersistenceUnitMetadata(); - this.initializePersistentTypes(); + this.initializeManagedTypes(); + this.sequenceGeneratorContainer = this.buildSequenceGeneratorContainer(); this.tableGeneratorContainer = this.buildTableGeneratorContainer(); this.queryContainer = this.buildQueryContainer(); @@ -155,7 +167,8 @@ public abstract class AbstractEntityMappings this.persistenceUnitMetadata.synchronizeWithResourceModel(); - this.syncPersistentTypes(); + this.syncManagedTypes(); + this.syncSequenceGenerators(); this.syncTableGenerators(); @@ -172,7 +185,8 @@ public abstract class AbstractEntityMappings this.persistenceUnitMetadata.update(); - this.updateNodes(this.getPersistentTypes()); + this.updateNodes(this.getManagedTypes()); + this.updateNodes(this.getSequenceGenerators()); this.updateNodes(this.getTableGenerators()); @@ -222,14 +236,14 @@ public abstract class AbstractEntityMappings return this.xmlEntityMappings.getSelectionTextRange(); } - //TODO I think children needs to include all managed types, - //thus JPA 2.1 converters are going to appear in the structure and project explorer views?? + //for now I am making the children only PersistentTypes. If we decide + //we want Converters listed in the structure view for an orm.xml, we can change this. protected void initializeChildren() { - this.children.addAll(this.persistentTypes); + CollectionTools.addAll(this.children, this.getPersistentTypes()); } protected void updateChildren() { - this.synchronizeCollection(this.persistentTypes, this.children, CHILDREN_COLLECTION); + this.synchronizeCollection(this.getPersistentTypes(), this.children, CHILDREN_COLLECTION); } public Iterable<OrmPersistentType> getChildren() { @@ -306,17 +320,17 @@ public abstract class AbstractEntityMappings public void changeMapping(OrmPersistentType ormPersistentType, OrmTypeMapping oldMapping, OrmTypeMapping newMapping) { AccessType savedAccess = ormPersistentType.getSpecifiedAccess(); - int sourceIndex = this.persistentTypes.indexOf(ormPersistentType); - this.persistentTypes.remove(sourceIndex); + int sourceIndex = this.managedTypes.indexOf(ormPersistentType); + this.managedTypes.remove(sourceIndex); oldMapping.removeXmlTypeMappingFrom(this.xmlEntityMappings); int targetIndex = this.calculateInsertionIndex(ormPersistentType); - this.persistentTypes.add(targetIndex, ormPersistentType); + this.managedTypes.add(targetIndex, ormPersistentType); newMapping.addXmlTypeMappingTo(this.xmlEntityMappings); newMapping.initializeFrom(oldMapping); //not sure where else to put this, need to set the access on the resource model ormPersistentType.setSpecifiedAccess(savedAccess); - this.fireItemMoved(PERSISTENT_TYPES_LIST, targetIndex, sourceIndex); + this.fireItemMoved(MANAGED_TYPES_LIST, targetIndex, sourceIndex); } public TextRange getValidationTextRange() { @@ -507,21 +521,49 @@ public abstract class AbstractEntityMappings } - // ********** persistent types ********** + // ********** managed types ********** - public ListIterable<OrmPersistentType> getPersistentTypes() { - return IterableTools.cloneLive(this.persistentTypes); + public ListIterable<OrmManagedType> getManagedTypes() { + return IterableTools.cloneLive(this.managedTypes); } - public int getPersistentTypesSize() { - return this.persistentTypes.size(); + public int getManagedTypesSize() { + return this.managedTypes.size(); } - public OrmPersistentType getPersistentType(String className) { - for (OrmPersistentType ormPersistentType : this.getPersistentTypes()) { - if (ormPersistentType.isFor(className)) { - return ormPersistentType; + public OrmManagedType getManagedType(String typeName) { + for (OrmManagedType ormManagedType : this.getManagedTypes()) { + if (ormManagedType.isFor(typeName)) { + return ormManagedType; + } + } + return null; + } + + public boolean containsManagedType(String typeName) { + return this.getManagedType(typeName) != null; + } + + + // ********** persistent types ********** + + public Iterable<OrmPersistentType> getPersistentTypes() { + return IterableTools.downCast(IterableTools.filter( + this.getManagedTypes(), + ORM_PERSISTENT_TYPE_FILTER)); + } + + protected static final Filter<OrmManagedType> ORM_PERSISTENT_TYPE_FILTER = + new Filter<OrmManagedType>() { + public boolean accept(OrmManagedType mt) { + return mt.getType() == OrmPersistentType.class; } + }; + + public OrmPersistentType getPersistentType(String typeName) { + ManagedType mt = this.getManagedType(typeName); + if (mt != null && (mt.getType() == OrmPersistentType.class)) { + return (OrmPersistentType) mt; } return null; } @@ -656,26 +698,26 @@ public abstract class AbstractEntityMappings return (className == null) ? null : PRIMITIVE_CLASSES.get(className); } + public OrmPersistentType addPersistentType(String mappingKey, String className) { + OrmTypeMappingDefinition md = this.getMappingFileDefinition().getTypeMappingDefinition(mappingKey); + XmlTypeMapping xmlManagedType = md.buildResourceMapping(this.getResourceNodeFactory()); + return (OrmPersistentType) this.addManagedType(xmlManagedType, className); + } + /** - * We have to calculate the new persistent type's index. + * We have to calculate the new managed type's index. * We will use the type's short name if the entity mappings's * package is the same as the type's package. */ - public OrmPersistentType addPersistentType(String mappingKey, String className) { - OrmTypeMappingDefinition md = this.getMappingFileDefinition().getTypeMappingDefinition(mappingKey); - XmlTypeMapping xmlTypeMapping = md.buildResourceMapping(this.getResourceNodeFactory()); - + protected OrmManagedType addManagedType(XmlManagedType xmlManagedType, String className) { // adds short name if package name is relevant - className = this.normalizeClassName(className); - xmlTypeMapping.setClassName(className); - - OrmPersistentType persistentType = this.buildPersistentType(xmlTypeMapping); - int index = this.calculateInsertionIndex(persistentType); - this.addItemToList(index, persistentType, this.persistentTypes, PERSISTENT_TYPES_LIST); - - persistentType.getMapping().addXmlTypeMappingTo(this.xmlEntityMappings); + xmlManagedType.setClassName(this.normalizeClassName(className)); - return persistentType; + OrmManagedType managedType = this.buildManagedType(xmlManagedType); + int index = this.calculateInsertionIndex(managedType); + this.addItemToList(index, managedType, this.managedTypes, MANAGED_TYPES_LIST); + managedType.addXmlManagedTypeTo(this.xmlEntityMappings); + return managedType; } //TODO add API - added this post-M6 @@ -704,7 +746,7 @@ public abstract class AbstractEntityMappings } List<XmlMappedSuperclass> mappedSuperclasses = new ArrayList<XmlMappedSuperclass>(addedItems.size()); for (OrmPersistentType persistentType : addedItems) { - mappedSuperclasses.add((XmlMappedSuperclass) persistentType.getMapping().getXmlTypeMapping()); + mappedSuperclasses.add((XmlMappedSuperclass) persistentType.getXmlManagedType()); } sm.subTask(JptJpaCoreMessages.MAKE_PERSISTENT_ADD_TO_XML_RESOURCE_MODEL); //use addAll to minimize change notifications to our model @@ -721,7 +763,7 @@ public abstract class AbstractEntityMappings } List<XmlEntity> entities = new ArrayList<XmlEntity>(addedItems.size()); for (OrmPersistentType persistentType : addedItems) { - entities.add((XmlEntity) persistentType.getMapping().getXmlTypeMapping()); + entities.add((XmlEntity) persistentType.getXmlManagedType()); } sm.subTask(JptJpaCoreMessages.MAKE_PERSISTENT_ADD_TO_XML_RESOURCE_MODEL); //use addAll to minimize change notifications to our model @@ -738,7 +780,7 @@ public abstract class AbstractEntityMappings } List<XmlEmbeddable> embeddables = new ArrayList<XmlEmbeddable>(addedItems.size()); for (OrmPersistentType persistentType : addedItems) { - embeddables.add((XmlEmbeddable) persistentType.getMapping().getXmlTypeMapping()); + embeddables.add((XmlEmbeddable) persistentType.getXmlManagedType()); } sm.subTask(JptJpaCoreMessages.MAKE_PERSISTENT_ADD_TO_XML_RESOURCE_MODEL); //use addAll to minimize change notifications to our model @@ -760,7 +802,7 @@ public abstract class AbstractEntityMappings className = this.normalizeClassName(className); xmlTypeMapping.setClassName(className); - addedItems.add(this.buildPersistentType(xmlTypeMapping)); + addedItems.add((OrmPersistentType) this.buildManagedType(xmlTypeMapping)); } } if (addedItems.size() == 0 || sm.isCanceled()) { @@ -770,7 +812,7 @@ public abstract class AbstractEntityMappings int index = this.calculateInsertionIndex(addedItems.get(0)); sm.subTask(JptJpaCoreMessages.MAKE_PERSISTENT_UPDATING_JPA_MODEL); - this.addItemsToList(index, addedItems, this.persistentTypes, PERSISTENT_TYPES_LIST); + this.addItemsToList(index, addedItems, this.managedTypes, MANAGED_TYPES_LIST); sm.worked(9); return addedItems; } @@ -787,19 +829,20 @@ public abstract class AbstractEntityMappings className; } - protected OrmPersistentType buildPersistentType(XmlTypeMapping xmlTypeMapping) { - return this.getContextNodeFactory().buildOrmPersistentType(this, xmlTypeMapping); + protected OrmManagedType buildManagedType(XmlManagedType xmlManagedType) { + OrmManagedTypeDefinition md = this.getMappingFileDefinition().getManagedTypeDefinition(xmlManagedType.getType()); + return md.buildContextManagedType(this, xmlManagedType, this.getContextNodeFactory()); } - protected int calculateInsertionIndex(OrmPersistentType ormPersistentType) { - return ListTools.insertionIndexOf(this.persistentTypes, ormPersistentType, MAPPING_COMPARATOR); + protected int calculateInsertionIndex(OrmManagedType ormManagedType) { + return ListTools.insertionIndexOf(this.managedTypes, ormManagedType, MAPPING_COMPARATOR); } - protected static final Comparator<OrmPersistentType> MAPPING_COMPARATOR = - new Comparator<OrmPersistentType>() { - public int compare(OrmPersistentType o1, OrmPersistentType o2) { - int o1Sequence = o1.getMapping().getXmlSequence(); - int o2Sequence = o2.getMapping().getXmlSequence(); + protected static final Comparator<OrmManagedType> MAPPING_COMPARATOR = + new Comparator<OrmManagedType>() { + public int compare(OrmManagedType o1, OrmManagedType o2) { + int o1Sequence = o1.getXmlSequence(); + int o2Sequence = o2.getXmlSequence(); if (o1Sequence < o2Sequence) { return -1; } @@ -810,74 +853,94 @@ public abstract class AbstractEntityMappings } }; - public void removePersistentType(int index) { - OrmPersistentType persistentType = this.removePersistentType_(index); - persistentType.getMapping().removeXmlTypeMappingFrom(this.xmlEntityMappings); + public void removeManagedType(int index) { + OrmManagedType managedType = this.removeManagedType_(index); + managedType.removeXmlManagedTypeFrom(this.xmlEntityMappings); } /** - * dispose and return the persistent type + * dispose and return the managed type */ - protected OrmPersistentType removePersistentType_(int index) { - OrmPersistentType persistentType = this.removeItemFromList(index, this.persistentTypes, PERSISTENT_TYPES_LIST); - persistentType.dispose(); - return persistentType; + protected OrmManagedType removeManagedType_(int index) { + OrmManagedType managedType = this.removeItemFromList(index, this.managedTypes, MANAGED_TYPES_LIST); + managedType.dispose(); + return managedType; } - public void removePersistentType(OrmPersistentType persistentType) { - this.removePersistentType(this.persistentTypes.indexOf(persistentType)); + public void removeManagedType(OrmManagedType managedType) { + this.removeManagedType(this.managedTypes.indexOf(managedType)); } - protected void initializePersistentTypes() { - for (XmlTypeMapping xmlTypeMapping : this.getXmlTypeMappings()) { - this.persistentTypes.add(this.buildPersistentType(xmlTypeMapping)); + protected void initializeManagedTypes() { + for (XmlManagedType xmlManagedType : this.getXmlManagedTypes()) { + this.managedTypes.add(this.buildManagedType(xmlManagedType)); } } - protected void syncPersistentTypes() { - ContextContainerTools.synchronizeWithResourceModel(this.persistentTypeContainerAdapter); + protected void syncManagedTypes() { + ContextContainerTools.synchronizeWithResourceModel(this.managedTypeContainerAdapter); } - protected Iterable<XmlTypeMapping> getXmlTypeMappings() { + protected Iterable<XmlManagedType> getXmlManagedTypes() { // clone to reduce chance of concurrency problems - return IterableTools.cloneLive(this.xmlEntityMappings.getTypeMappings()); + return IterableTools.cloneLive(this.getXmlManagedTypes_()); } - protected void movePersistentType_(int index, OrmPersistentType persistentType) { - this.moveItemInList(index, persistentType, this.persistentTypes, PERSISTENT_TYPES_LIST); + // ********** managed types ********** + + protected List<XmlManagedType> getXmlManagedTypes_() { + // convert lists to arrays to *reduce* risk of ConcurrentModificationException + ArrayList<XmlManagedType> managedTypes = new ArrayList<XmlManagedType>(); + CollectionTools.addAll(managedTypes, this.xmlEntityMappings.getMappedSuperclasses().toArray(EMPTY_XML_MANAGED_TYPE_ARRAY)); + CollectionTools.addAll(managedTypes, this.xmlEntityMappings.getEntities().toArray(EMPTY_XML_MANAGED_TYPE_ARRAY)); + CollectionTools.addAll(managedTypes, this.xmlEntityMappings.getEmbeddables().toArray(EMPTY_XML_MANAGED_TYPE_ARRAY)); + if (this.isJpa2_1Compatible()) { + CollectionTools.addAll(managedTypes, this.getXml2_1Converters().toArray(EMPTY_XML_MANAGED_TYPE_ARRAY)); + } + return managedTypes; + } + + protected List<XmlConverter_2_1> getXml2_1Converters() { + return this.xmlEntityMappings.getConverters(); + } + + protected static final XmlManagedType[] EMPTY_XML_MANAGED_TYPE_ARRAY = new XmlManagedType[0]; + + protected void moveManagedType_(int index, OrmManagedType managedType) { + this.moveItemInList(index, managedType, this.managedTypes, MANAGED_TYPES_LIST); } - protected void addPersistentType_(int index, XmlTypeMapping xmlTypeMapping) { - this.addItemToList(index, this.buildPersistentType(xmlTypeMapping), this.persistentTypes, PERSISTENT_TYPES_LIST); + protected void addManagedType_(int index, XmlManagedType xmlManagedType) { + this.addItemToList(index, this.buildManagedType(xmlManagedType), this.managedTypes, MANAGED_TYPES_LIST); } - protected void removePersistentType_(OrmPersistentType persistentType) { - this.removePersistentType_(this.persistentTypes.indexOf(persistentType)); + protected void removeManagedType_(OrmManagedType managedType) { + this.removeManagedType_(this.managedTypes.indexOf(managedType)); } /** - * persistent type container adapter + * managed type container adapter */ - protected class PersistentTypeContainerAdapter - implements ContextContainerTools.Adapter<OrmPersistentType, XmlTypeMapping> + protected class ManagedTypeContainerAdapter + implements ContextContainerTools.Adapter<OrmManagedType, XmlManagedType> { - public Iterable<OrmPersistentType> getContextElements() { - return AbstractEntityMappings.this.getPersistentTypes(); + public Iterable<OrmManagedType> getContextElements() { + return AbstractEntityMappings.this.getManagedTypes(); } - public Iterable<XmlTypeMapping> getResourceElements() { - return AbstractEntityMappings.this.getXmlTypeMappings(); + public Iterable<XmlManagedType> getResourceElements() { + return AbstractEntityMappings.this.getXmlManagedTypes(); } - public XmlTypeMapping getResourceElement(OrmPersistentType contextElement) { - return contextElement.getMapping().getXmlTypeMapping(); + public XmlManagedType getResourceElement(OrmManagedType contextElement) { + return contextElement.getXmlManagedType(); } - public void moveContextElement(int index, OrmPersistentType element) { - AbstractEntityMappings.this.movePersistentType_(index, element); + public void moveContextElement(int index, OrmManagedType element) { + AbstractEntityMappings.this.moveManagedType_(index, element); } - public void addContextElement(int index, XmlTypeMapping resourceElement) { - AbstractEntityMappings.this.addPersistentType_(index, resourceElement); + public void addContextElement(int index, XmlManagedType resourceElement) { + AbstractEntityMappings.this.addManagedType_(index, resourceElement); } - public void removeContextElement(OrmPersistentType element) { - AbstractEntityMappings.this.removePersistentType_(element); + public void removeContextElement(OrmManagedType element) { + AbstractEntityMappings.this.removeManagedType_(element); } } @@ -1048,6 +1111,45 @@ public abstract class AbstractEntityMappings } + // ********** converter types ********** + + public Iterable<OrmConverterType2_1> getConverterTypes() { + return IterableTools.downCast(IterableTools.filter( + this.getManagedTypes(), + ORM_CONVERTER_TYPE_FILTER)); + } + + protected static final Filter<OrmManagedType> ORM_CONVERTER_TYPE_FILTER = + new Filter<OrmManagedType>() { + public boolean accept(OrmManagedType mt) { + return mt.getType() == OrmConverterType2_1.class; + } + }; + + public OrmConverterType2_1 getConverterType(String typeName) { + ManagedType mt = this.getManagedType(typeName); + if (mt != null && (mt.getType() == OrmPersistentType.class)) { + return (OrmConverterType2_1) mt; + } + return null; + } + + public boolean containsConverterType(String typeName) { + return this.getConverterType(typeName) != null; + } + + public OrmConverterType2_1 addConverterType(String className) { + return (OrmConverterType2_1) this.addManagedType(this.buildXmlConverter(), className); + } + + protected XmlConverter_2_1 buildXmlConverter() { + return EmfTools.create( + this.getResourceNodeFactory(), + OrmPackage.eINSTANCE.getXmlConverter(), + XmlConverter_2_1.class); + } + + // ********** query container ********** public OrmQueryContainer getQueryContainer() { @@ -1103,8 +1205,8 @@ public abstract class AbstractEntityMappings this.validateVersion(messages); // generators are validated in the persistence unit this.queryContainer.validate(messages, reporter); - for (OrmPersistentType ormPersistentType : this.getPersistentTypes()) { - this.validatePersistentType(ormPersistentType, messages, reporter); + for (OrmManagedType managedType : this.getManagedTypes()) { + this.validateManagedType(managedType, messages, reporter); } } @@ -1132,9 +1234,9 @@ public abstract class AbstractEntityMappings return XmlEntityMappings.CONTENT_TYPE; } - protected void validatePersistentType(OrmPersistentType persistentType, List<IMessage> messages, IReporter reporter) { + protected void validateManagedType(OrmManagedType managedType, List<IMessage> messages, IReporter reporter) { try { - persistentType.validate(messages, reporter); + managedType.validate(messages, reporter); } catch (Throwable exception) { JptJpaCorePlugin.instance().logError(exception); } @@ -1144,26 +1246,26 @@ public abstract class AbstractEntityMappings // ********** refactoring ********** public Iterable<DeleteEdit> createDeleteTypeEdits(IType type) { - return IterableTools.children(this.getPersistentTypes(), new DeleteTypeRefactoringParticipant.DeleteTypeEditsTransformer(type)); + return IterableTools.children(this.getManagedTypes(), new DeleteTypeRefactoringParticipant.DeleteTypeEditsTransformer(type)); } public Iterable<ReplaceEdit> createRenameTypeEdits(IType originalType, String newName) { - return IterableTools.children(this.getPersistentTypes(), new TypeRefactoringParticipant.RenameTypeEditsTransformer(originalType, newName)); + return IterableTools.children(this.getManagedTypes(), new TypeRefactoringParticipant.RenameTypeEditsTransformer(originalType, newName)); } public Iterable<ReplaceEdit> createMoveTypeEdits(IType originalType, IPackageFragment newPackage) { - return IterableTools.children(this.getPersistentTypes(), new TypeRefactoringParticipant.MoveTypeEditsTransformer(originalType, newPackage)); + return IterableTools.children(this.getManagedTypes(), new TypeRefactoringParticipant.MoveTypeEditsTransformer(originalType, newPackage)); } @SuppressWarnings("unchecked") public Iterable<ReplaceEdit> createRenamePackageEdits(IPackageFragment originalPackage, String newName) { return IterableTools.concatenate( - this.createPersistentTypeRenamePackageEdits(originalPackage, newName), + this.createManagedTypeRenamePackageEdits(originalPackage, newName), this.createRenamePackageEdit(originalPackage, newName)); } - protected Iterable<ReplaceEdit> createPersistentTypeRenamePackageEdits(IPackageFragment originalPackage, String newName) { - return IterableTools.children(this.getPersistentTypes(), new TypeRefactoringParticipant.RenamePackageEditsTransformer(originalPackage, newName)); + protected Iterable<ReplaceEdit> createManagedTypeRenamePackageEdits(IPackageFragment originalPackage, String newName) { + return IterableTools.children(this.getManagedTypes(), new TypeRefactoringParticipant.RenamePackageEditsTransformer(originalPackage, newName)); } protected Iterable<ReplaceEdit> createRenamePackageEdit(IPackageFragment originalPackage, String newName) { @@ -1203,8 +1305,8 @@ public abstract class AbstractEntityMappings if (this.packageTouches(pos)) { return this.getCandidatePackages(); } - for (OrmPersistentType persistentType : this.getPersistentTypes()) { - result = persistentType.getCompletionProposals(pos); + for (OrmManagedType managedType : this.getManagedTypes()) { + result = managedType.getCompletionProposals(pos); if (result != null) { return result; } diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmEntity.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmEntity.java index becb45d714..de6f09be1c 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmEntity.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmEntity.java @@ -300,7 +300,7 @@ public abstract class AbstractOrmEntity<X extends XmlEntity> if (javaEntity != null) { return javaEntity.getName(); } - String className = this.getClass_(); + String className = this.getPersistentType().getClass_(); return StringTools.isBlank(className) ? null : ClassNameTools.simpleName(className); } @@ -1744,7 +1744,7 @@ public abstract class AbstractOrmEntity<X extends XmlEntity> DefaultJpaValidationMessages.buildMessage( IMessage.HIGH_SEVERITY, JptJpaCoreValidationMessages.ENTITY_NAME_MISSING, - new String[] {this.getClass_()}, + new String[] {this.getPersistentType().getClass_()}, this, this.getNameTextRange() ) @@ -1756,7 +1756,6 @@ public abstract class AbstractOrmEntity<X extends XmlEntity> return true; } - @Override public TextRange getNameTextRange() { return this.getXmlTypeMapping().getNameTextRange(); } diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmManagedType.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmManagedType.java new file mode 100644 index 0000000000..02528f1be1 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmManagedType.java @@ -0,0 +1,377 @@ +/******************************************************************************* + * Copyright (c) 2013 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.jpa.core.internal.context.orm; + +import java.util.List; +import org.eclipse.jdt.core.IPackageFragment; +import org.eclipse.jdt.core.IType; +import org.eclipse.jpt.common.core.resource.java.JavaResourceAnnotatedElement.AstNodeType; +import org.eclipse.jpt.common.core.resource.java.JavaResourceType; +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.iterable.IterableTools; +import org.eclipse.jpt.jpa.core.context.ManagedType; +import org.eclipse.jpt.jpa.core.context.java.JavaManagedType; +import org.eclipse.jpt.jpa.core.context.orm.EntityMappings; +import org.eclipse.jpt.jpa.core.context.orm.OrmManagedType; +import org.eclipse.jpt.jpa.core.internal.context.MappingTools; +import org.eclipse.jpt.jpa.core.internal.validation.DefaultJpaValidationMessages; +import org.eclipse.jpt.jpa.core.resource.orm.XmlManagedType; +import org.eclipse.jpt.jpa.core.validation.JptJpaCoreValidationMessages; +import org.eclipse.text.edits.DeleteEdit; +import org.eclipse.text.edits.ReplaceEdit; +import org.eclipse.wst.validation.internal.provisional.core.IMessage; +import org.eclipse.wst.validation.internal.provisional.core.IReporter; + +/** + * specified <code>orm.xml</code> managed type:<ul> + + * <li>Java managed type + * </ul> + */ +public abstract class AbstractOrmManagedType + extends AbstractOrmXmlContextNode + implements OrmManagedType { + + protected XmlManagedType xmlManagedType; + + protected String class_; + + protected String name; + + protected JavaManagedType javaManagedType; + + + protected AbstractOrmManagedType(EntityMappings parent, XmlManagedType xmlManagedType) { + super(parent); + this.xmlManagedType = xmlManagedType; + this.class_ = this.xmlManagedType.getClassName(); + this.name = this.buildName(); + // 'javaManagedType' is resolved in the update + } + + + // ********** synchronize/update ********** + + @Override + public void synchronizeWithResourceModel() { + super.synchronizeWithResourceModel(); + this.setClass_(this.xmlManagedType.getClassName()); + this.setName(this.buildName()); + this.syncJavaManagedType(); + } + + @Override + public void update() { + super.update(); + this.updateJavaManagedType(); + } + + public XmlManagedType getXmlManagedType() { + return this.xmlManagedType; + } + + + // ********** class ********** + + public String getClass_() { + return this.class_; + } + + public void setClass(String class_) { + this.setClass_(class_); + this.xmlManagedType.setClassName(class_); + } + + protected void setClass_(String class_) { + String old = this.class_; + this.class_ = class_; + this.firePropertyChanged(CLASS_PROPERTY, old, class_); + } + + + // ********** name ********** + + public String getName() { + return this.name; + } + + protected void setName(String name) { + String old = this.name; + this.name = name; + if (this.firePropertyChanged(NAME_PROPERTY, old, name)) { + // clear out the Java managed type here, it will be rebuilt during "update" + if (this.javaManagedType != null) { + this.setJavaManagedType(null); + } + } + } + + protected String buildName() { + return this.getEntityMappings().qualify(this.class_); + } + + public String getSimpleName(){ + String className = this.getName(); + return StringTools.isBlank(className) ? null : ClassNameTools.simpleName(className); + } + + public String getTypeQualifiedName() { + String className = this.class_; + if (className == null) { + return null; + } + int lastPeriod = className.lastIndexOf('.'); + className = (lastPeriod == -1) ? className : className.substring(lastPeriod + 1); + className = className.replace('$', '.'); + return className; + } + + protected TextRange getClassTextRange() { + return this.getValidationTextRange(this.getXmlManagedType().getClassTextRange()); + } + + + // ********** Java managed type ********** + + public JavaManagedType getJavaManagedType() { + return this.javaManagedType; + } + + protected void setJavaManagedType(JavaManagedType javaManagedType) { + ManagedType old = this.javaManagedType; + this.javaManagedType = javaManagedType; + this.firePropertyChanged(JAVA_MANAGED_TYPE_PROPERTY, old, javaManagedType); + } + + /** + * If the managed type's name changes during <em>update</em>, + * the Java managed type will be cleared out in + * {@link #setName(String)}. If we get here and + * the Java managed type is present, we can + * <em>sync</em> it. In some circumstances it will be obsolete + * since the name is changed during update (the class name or + * the entity mapping's package affect the name) + * + * @see #updateJavaManagedType() + */ + protected void syncJavaManagedType() { + if (this.javaManagedType != null) { + this.javaManagedType.synchronizeWithResourceModel(); + } + } + + /** + * @see #syncJavaManagedType() + */ + protected void updateJavaManagedType() { + if (this.getName() == null) { + if (this.javaManagedType != null) { + this.setJavaManagedType(null); + } + } + else { + JavaResourceType resourceType = this.resolveJavaResourceType(); + if (this.javaManagedType == null) { + this.setJavaManagedType(this.buildJavaManagedType(resourceType)); + } + else { + // bug 379051 using == here because it is possible that the names are the same, + // but the location has changed: the java resource type has moved from "external" + // to part of the jpa project's jpa files. + if (this.javaManagedType.getJavaResourceType() == resourceType) { + this.javaManagedType.update(); + } else { + this.setJavaManagedType(this.buildJavaManagedType(resourceType)); + } + } + } + } + + /** + * Return null it's an enum; don't build a JavaManagedType + * @see #updateJavaManagedType() + */ + protected JavaResourceType resolveJavaResourceType() { + if (this.name == null) { + return null; + } + return (JavaResourceType) this.getJpaProject().getJavaResourceType(this.name, AstNodeType.TYPE); + } + + protected abstract JavaManagedType buildJavaManagedType(JavaResourceType jrt); + + + public JavaResourceType getJavaResourceType() { + return (this.javaManagedType == null) ? null : this.javaManagedType.getJavaResourceType(); + } + + public TextRange getValidationTextRange() { + // this should never be null; + TextRange textRange = this.getXmlManagedType().getValidationTextRange(); + //*return an Empty text range because validation sometimes run concurrently + //with the code adding the type mapping to xml; the IDOMNode might not + //be set when this is called. Brian's batch update changes in 3.2 should + //fix this problem. bug 358745 + return (textRange != null) ? textRange : TextRange.Empty.instance(); + } + + public TextRange getFullTextRange() { + return this.getXmlManagedType().getFullTextRange(); + } + + public boolean containsOffset(int textOffset) { + return this.getXmlManagedType().containsOffset(textOffset); + } + + + // ********** completion proposals ********** + + @Override + public Iterable<String> getCompletionProposals(int pos) { + Iterable<String> result = super.getCompletionProposals(pos); + if (result != null) { + return result; + } + if (this.classNameTouches(pos)) { + return this.getCandidateClassNames(); + } + return null; + } + + protected Iterable<String> getCandidateClassNames() { + return MappingTools.getSortedJavaClassNames(this.getJavaProject()); + } + + protected boolean classNameTouches(int pos) { + return this.getXmlManagedType().classNameTouches(pos); + } + + + //*********** refactoring *********** + + public Iterable<DeleteEdit> createDeleteTypeEdits(IType type) { + return this.isFor(type.getFullyQualifiedName('.')) ? + IterableTools.singletonIterable(this.createDeleteTypeEdit()) : + IterableTools.<DeleteEdit>emptyIterable(); + } + + protected DeleteEdit createDeleteTypeEdit() { + return this.getXmlManagedType().createDeleteEdit(); + } + + public Iterable<ReplaceEdit> createRenameTypeEdits(IType originalType, String newName) { + return this.isFor(originalType.getFullyQualifiedName('.')) ? + IterableTools.singletonIterable(this.createRenameTypeEdit(originalType, newName)) : + IterableTools.<ReplaceEdit>emptyIterable(); + } + + protected ReplaceEdit createRenameTypeEdit(IType originalType, String newName) { + return this.getXmlManagedType().createRenameTypeEdit(originalType, newName); + } + + public Iterable<ReplaceEdit> createMoveTypeEdits(IType originalType, IPackageFragment newPackage) { + return this.isFor(originalType.getFullyQualifiedName('.')) ? + IterableTools.singletonIterable(this.createRenamePackageEdit(newPackage.getElementName())) : + IterableTools.<ReplaceEdit>emptyIterable(); + } + + public Iterable<ReplaceEdit> createRenamePackageEdits(IPackageFragment originalPackage, String newName) { + return this.isIn(originalPackage) ? + IterableTools.singletonIterable(this.createRenamePackageEdit(newName)) : + IterableTools.<ReplaceEdit>emptyIterable(); + } + + protected ReplaceEdit createRenamePackageEdit(String newName) { + return this.getXmlManagedType().createRenamePackageEdit(newName); + } + + + // ********** validation ********** + + @Override + public void validate(List<IMessage> messages, IReporter reporter) { + super.validate(messages, reporter); + this.validateClass(messages); + } + + protected void validateClass(List<IMessage> messages) { + if (StringTools.isBlank(this.class_)) { + messages.add( + DefaultJpaValidationMessages.buildMessage( + IMessage.HIGH_SEVERITY, + JptJpaCoreValidationMessages.MANAGED_TYPE_UNSPECIFIED_CLASS, + this, + this.getClassTextRange() + ) + ); + return; + } + this.validateClassResolves(messages); + } + + protected void validateClassResolves(List<IMessage> messages) { + if (this.javaManagedType == null) { + messages.add( + DefaultJpaValidationMessages.buildMessage( + IMessage.HIGH_SEVERITY, + JptJpaCoreValidationMessages.MANAGED_TYPE_UNRESOLVED_CLASS, + new String[] {this.getName()}, + this, + this.getClassTextRange() + ) + ); + } + } + + + // ********** misc ********** + + @Override + public EntityMappings getParent() { + return (EntityMappings) super.getParent(); + } + + protected EntityMappings getEntityMappings() { + return this.getParent(); + } + + public String getDefaultPackage() { + return this.getEntityMappings().getDefaultPersistentTypePackage(); + } + + public boolean isFor(String typeName) { + return ObjectTools.equals(typeName, this.getName()); + } + + public boolean isIn(IPackageFragment packageFragment) { + String packageName = this.getPackageName(); + if (ObjectTools.equals(packageName, packageFragment.getElementName())) { + return true; + } + return false; + } + + protected String getPackageName() { + String className = this.class_; + if (className == null) { + return null; + } + int lastPeriod = className.lastIndexOf('.'); + return (lastPeriod == -1) ? this.getDefaultPackage() : className.substring(0, lastPeriod); + } + + @Override + public void toString(StringBuilder sb) { + sb.append(this.getName()); + } +} diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmTypeMapping.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmTypeMapping.java index a3b1b776be..34bc00a956 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmTypeMapping.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmTypeMapping.java @@ -14,10 +14,8 @@ import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IType; import org.eclipse.jpt.common.core.resource.java.JavaResourceType; import org.eclipse.jpt.common.core.utility.TextRange; -import org.eclipse.jpt.common.utility.internal.StringTools; import org.eclipse.jpt.common.utility.internal.iterable.FilteringIterable; import org.eclipse.jpt.common.utility.internal.iterable.IterableTools; -import org.eclipse.jpt.jpa.core.JpaStructureNode; import org.eclipse.jpt.jpa.core.context.AttributeMapping; import org.eclipse.jpt.jpa.core.context.Column; import org.eclipse.jpt.jpa.core.context.Entity; @@ -37,12 +35,9 @@ import org.eclipse.jpt.jpa.core.internal.context.JptValidator; import org.eclipse.jpt.jpa.core.internal.context.MappingTools; import org.eclipse.jpt.jpa.core.internal.context.TypeMappingTools; import org.eclipse.jpt.jpa.core.internal.jpa1.context.GenericTypeMappingValidator; -import org.eclipse.jpt.jpa.core.internal.validation.DefaultJpaValidationMessages; import org.eclipse.jpt.jpa.core.resource.orm.XmlTypeMapping; -import org.eclipse.jpt.jpa.core.validation.JptJpaCoreValidationMessages; import org.eclipse.jpt.jpa.db.Schema; import org.eclipse.jpt.jpa.db.Table; -import org.eclipse.text.edits.DeleteEdit; import org.eclipse.text.edits.ReplaceEdit; import org.eclipse.wst.validation.internal.provisional.core.IMessage; import org.eclipse.wst.validation.internal.provisional.core.IReporter; @@ -57,8 +52,6 @@ public abstract class AbstractOrmTypeMapping<X extends XmlTypeMapping> // never null protected final X xmlTypeMapping; - protected String class_; - protected Boolean specifiedMetadataComplete; protected boolean overrideMetadataComplete; @@ -69,7 +62,6 @@ public abstract class AbstractOrmTypeMapping<X extends XmlTypeMapping> protected AbstractOrmTypeMapping(OrmPersistentType parent, X xmlTypeMapping) { super(parent); this.xmlTypeMapping = xmlTypeMapping; - this.class_ = xmlTypeMapping.getClassName(); this.specifiedMetadataComplete = xmlTypeMapping.getMetadataComplete(); this.specifiedParentClass = this.buildSpecifiedParentClass(); } @@ -80,7 +72,6 @@ public abstract class AbstractOrmTypeMapping<X extends XmlTypeMapping> @Override public void synchronizeWithResourceModel() { super.synchronizeWithResourceModel(); - this.setClass_(this.xmlTypeMapping.getClassName()); this.setSpecifiedMetadataComplete_(this.xmlTypeMapping.getMetadataComplete()); this.setSpecifiedParentClass_(this.buildSpecifiedParentClass()); } @@ -94,24 +85,6 @@ public abstract class AbstractOrmTypeMapping<X extends XmlTypeMapping> } - // ********** class ********** - - public String getClass_() { - return this.class_; - } - - public void setClass(String class_) { - this.setClass_(class_); - this.xmlTypeMapping.setClassName(class_); - } - - protected void setClass_(String class_) { - String old = this.class_; - this.class_ = class_; - this.firePropertyChanged(CLASS_PROPERTY, old, class_); - } - - // ********** metadata complete ********** /** @@ -283,7 +256,6 @@ public abstract class AbstractOrmTypeMapping<X extends XmlTypeMapping> * mapping to the new (this). */ public void initializeFrom(OrmTypeMapping oldMapping) { - this.setClass(oldMapping.getClass_()); this.setSpecifiedMetadataComplete(oldMapping.getSpecifiedMetadataComplete()); this.setOverrideMetadataComplete(oldMapping.isOverrideMetadataComplete()); } @@ -435,57 +407,27 @@ public abstract class AbstractOrmTypeMapping<X extends XmlTypeMapping> // ********** text ranges ********** - public JpaStructureNode getStructureNode(int offset) { - return this.xmlTypeMapping.containsOffset(offset) ? this.getPersistentType() : null; - } - public TextRange getSelectionTextRange() { return this.xmlTypeMapping.getSelectionTextRange(); } - public TextRange getClassTextRange() { - return this.getValidationTextRange(this.xmlTypeMapping.getClassTextRange()); - } - public TextRange getAttributesTextRange() { return this.getValidationTextRange(this.xmlTypeMapping.getAttributesTextRange()); } - public TextRange getNameTextRange() { - return this.getValidationTextRange(this.xmlTypeMapping.getNameTextRange()); - } - // ********** refactoring ********** - public DeleteEdit createDeleteEdit() { - return this.xmlTypeMapping.createDeleteEdit(); - } - public Iterable<ReplaceEdit> createRenameTypeEdits(IType originalType, String newName) { - return this.getPersistentType().isFor(originalType.getFullyQualifiedName('.')) ? - IterableTools.singletonIterable(this.createRenameTypeEdit(originalType, newName)) : - IterableTools.<ReplaceEdit>emptyIterable(); - } - - protected ReplaceEdit createRenameTypeEdit(IType originalType, String newName) { - return this.xmlTypeMapping.createRenameTypeEdit(originalType, newName); + return IterableTools.<ReplaceEdit>emptyIterable(); } public Iterable<ReplaceEdit> createMoveTypeEdits(IType originalType, IPackageFragment newPackage) { - return this.getPersistentType().isFor(originalType.getFullyQualifiedName('.')) ? - IterableTools.singletonIterable(this.createRenamePackageEdit(newPackage.getElementName())) : - IterableTools.<ReplaceEdit>emptyIterable(); + return IterableTools.<ReplaceEdit>emptyIterable(); } public Iterable<ReplaceEdit> createRenamePackageEdits(IPackageFragment originalPackage, String newName) { - return this.getPersistentType().isIn(originalPackage) ? - IterableTools.singletonIterable(this.createRenamePackageEdit(newName)) : - IterableTools.<ReplaceEdit>emptyIterable(); - } - - protected ReplaceEdit createRenamePackageEdit(String newName) { - return this.xmlTypeMapping.createRenamePackageEdit(newName); + return IterableTools.<ReplaceEdit>emptyIterable(); } @@ -505,17 +447,6 @@ public abstract class AbstractOrmTypeMapping<X extends XmlTypeMapping> } protected void validateClass(List<IMessage> messages, IReporter reporter) { - if (StringTools.isBlank(this.class_)) { - messages.add( - DefaultJpaValidationMessages.buildMessage( - IMessage.HIGH_SEVERITY, - JptJpaCoreValidationMessages.PERSISTENT_TYPE_UNSPECIFIED_CLASS, - this, - this.getClassTextRange() - ) - ); - return; - } if (this.getJavaResourceType() != null) { this.buildTypeMappingValidator().validate(messages, reporter); } @@ -534,35 +465,11 @@ public abstract class AbstractOrmTypeMapping<X extends XmlTypeMapping> } public TextRange getValidationTextRange() { - // this should never be null; also, the persistent type delegates - // to here, so don't delegate back to it (or we will get a stack overflow) bug 355415 - TextRange textRange = this.xmlTypeMapping.getValidationTextRange(); - //*return an Empty text range because validation sometimes run concurrently - //with the code adding the type mapping to xml; the IDOMNode might not - //be set when this is called. Brian's batch update changes in 3.2 should - //fix this problem. bug 358745 - return (textRange != null) ? textRange : TextRange.Empty.instance(); - } - - // ********** completion proposals ********** - - @Override - public Iterable<String> getCompletionProposals(int pos) { - Iterable<String> result = super.getCompletionProposals(pos); - if (result != null) { - return result; - } - if (this.classNameTouches(pos)) { - return this.getCandidateClassNames(); - } - return null; + return this.getPersistentType().getValidationTextRange(); } protected Iterable<String> getCandidateClassNames() { return MappingTools.getSortedJavaClassNames(this.getJavaProject()); } - protected boolean classNameTouches(int pos) { - return this.getXmlTypeMapping().classNameTouches(pos); - } } diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmXmlContextNode.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmXmlContextNode.java index 9e513ddad1..7096ae8048 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmXmlContextNode.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmXmlContextNode.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2012 Oracle. All rights reserved. + * Copyright (c) 2007, 2013 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. @@ -17,7 +17,9 @@ import org.eclipse.jpt.jpa.core.context.orm.OrmXmlContextNodeFactory; import org.eclipse.jpt.jpa.core.context.orm.OrmXmlDefinition; import org.eclipse.jpt.jpa.core.internal.context.AbstractJpaContextNode; import org.eclipse.jpt.jpa.core.internal.jpa2.context.orm.GenericOrmXml2_0Definition; +import org.eclipse.jpt.jpa.core.internal.jpa2.context.orm.GenericOrmXml2_1Definition; import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmXml2_0ContextNodeFactory; +import org.eclipse.jpt.jpa.core.jpa2_1.context.orm.OrmXml2_1ContextNodeFactory; /** * Use this abstract class for context nodes that are part of an @@ -56,6 +58,10 @@ public abstract class AbstractOrmXmlContextNode return this.getResourceType().isKindOf(GenericOrmXml2_0Definition.instance().getResourceType()); } + protected boolean isOrmXml2_1Compatible() { + return this.getResourceType().isKindOf(GenericOrmXml2_1Definition.instance().getResourceType()); + } + /** * Call {@link #isOrmXml2_0Compatible()} before calling this method. */ @@ -63,6 +69,13 @@ public abstract class AbstractOrmXmlContextNode return (OrmXml2_0ContextNodeFactory) this.getContextNodeFactory(); } + /** + * Call {@link #isOrmXml2_1Compatible()} before calling this method. + */ + protected OrmXml2_1ContextNodeFactory getContextNodeFactory2_1() { + return (OrmXml2_1ContextNodeFactory) this.getContextNodeFactory(); + } + protected OrmXmlContextNodeFactory getContextNodeFactory() { return this.getMappingFileDefinition().getContextNodeFactory(); } diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmXmlDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmXmlDefinition.java index 3b492ec5e5..ccf3ad4202 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmXmlDefinition.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmXmlDefinition.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009, 2012 Oracle. All rights reserved. + * Copyright (c) 2009, 2013 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. @@ -16,10 +16,12 @@ import org.eclipse.jpt.common.core.internal.utility.PlatformTools; import org.eclipse.jpt.common.utility.internal.ObjectTools; import org.eclipse.jpt.common.utility.internal.collection.CollectionTools; import org.eclipse.jpt.jpa.core.context.orm.OrmAttributeMappingDefinition; +import org.eclipse.jpt.jpa.core.context.orm.OrmManagedTypeDefinition; import org.eclipse.jpt.jpa.core.context.orm.OrmTypeMappingDefinition; import org.eclipse.jpt.jpa.core.context.orm.OrmXmlContextNodeFactory; import org.eclipse.jpt.jpa.core.context.orm.OrmXmlDefinition; import org.eclipse.jpt.jpa.core.context.orm.UnsupportedOrmAttributeMappingDefinition; +import org.eclipse.jpt.jpa.core.resource.orm.XmlManagedType; /** * All the state in the definition should be "static" @@ -30,6 +32,8 @@ public abstract class AbstractOrmXmlDefinition { protected final OrmXmlContextNodeFactory factory; + protected ArrayList<OrmManagedTypeDefinition> managedTypeDefinitions; + protected ArrayList<OrmTypeMappingDefinition> typeMappingDefinitions; protected ArrayList<OrmAttributeMappingDefinition> attributeMappingDefinitions; @@ -52,6 +56,47 @@ public abstract class AbstractOrmXmlDefinition return this.factory; } + // ********** managed type definitions ********** + + public OrmManagedTypeDefinition getManagedTypeDefinition(Class<? extends XmlManagedType> resourceType) { + for (OrmManagedTypeDefinition definition : this.getManagedTypeDefinitions()) { + if (definition.getResourceType() == resourceType) { + return definition; + } + } + throw new IllegalArgumentException("Illegal managed type resource type: " + resourceType); //$NON-NLS-1$ + } + + /** + * Return a list of mapping definitions to use for types in + * <code>orm.xml</code> mapping files. + * The order is unimportant. + */ + protected synchronized ArrayList<OrmManagedTypeDefinition> getManagedTypeDefinitions() { + if (this.managedTypeDefinitions == null) { + this.managedTypeDefinitions = this.buildManagedTypeDefinitions(); + } + return this.managedTypeDefinitions; + } + + protected ArrayList<OrmManagedTypeDefinition> buildManagedTypeDefinitions() { + ArrayList<OrmManagedTypeDefinition> definitions = new ArrayList<OrmManagedTypeDefinition>(); + this.addManagedTypeDefinitionsTo(definitions); + return definitions; + } + + protected void addManagedTypeDefinitionsTo(ArrayList<OrmManagedTypeDefinition> definitions) { + CollectionTools.addAll(definitions, MANAGED_TYPE_DEFINITIONS); + } + + /** + * Order should not matter here; but we'll use the same order as for Java. + * @see org.eclipse.jpt.jpa.core.internal.GenericJpaPlatformProvider + */ + protected static final OrmManagedTypeDefinition[] MANAGED_TYPE_DEFINITIONS = new OrmManagedTypeDefinition[] { + OrmPersistentTypeDefinition.instance(), + }; + // ********** type mapping definitions ********** diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/OrmPersistentTypeDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/OrmPersistentTypeDefinition.java new file mode 100644 index 0000000000..c3de65cba1 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/OrmPersistentTypeDefinition.java @@ -0,0 +1,52 @@ +/*******************************************************************************
+ * Copyright (c) 2013 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.jpa.core.internal.context.orm;
+
+import org.eclipse.jpt.jpa.core.context.JpaContextNode;
+import org.eclipse.jpt.jpa.core.context.orm.EntityMappings;
+import org.eclipse.jpt.jpa.core.context.orm.OrmManagedType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmManagedTypeDefinition;
+import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmXmlContextNodeFactory;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlManagedType;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlTypeMapping;
+
+public class OrmPersistentTypeDefinition
+ implements OrmManagedTypeDefinition
+{
+ // singleton
+ private static final OrmManagedTypeDefinition INSTANCE = new OrmPersistentTypeDefinition();
+
+ /**
+ * Return the singleton.
+ */
+ public static OrmManagedTypeDefinition instance() {
+ return INSTANCE;
+ }
+
+ /**
+ * Enforce singleton usage
+ */
+ private OrmPersistentTypeDefinition() {
+ super();
+ }
+
+ public Class<? extends OrmPersistentType> getContextType() {
+ return OrmPersistentType.class;
+ }
+
+ public Class<? extends XmlManagedType> getResourceType() {
+ return XmlTypeMapping.class;
+ }
+
+ public OrmManagedType buildContextManagedType(JpaContextNode parent, XmlManagedType resourceManagedType, OrmXmlContextNodeFactory factory) {
+ return factory.buildOrmPersistentType((EntityMappings) parent, (XmlTypeMapping) resourceManagedType);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/SpecifiedOrmPersistentType.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/SpecifiedOrmPersistentType.java index eac7b8d80a..1aeb24c7d5 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/SpecifiedOrmPersistentType.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/SpecifiedOrmPersistentType.java @@ -28,9 +28,7 @@ import org.eclipse.jpt.common.core.utility.BodySourceWriter; import org.eclipse.jpt.common.core.utility.TextRange; import org.eclipse.jpt.common.core.utility.jdt.TypeBinding; import org.eclipse.jpt.common.utility.filter.Filter; -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.collection.CollectionTools; import org.eclipse.jpt.common.utility.internal.collection.ListTools; import org.eclipse.jpt.common.utility.internal.filter.FilterAdapter; @@ -45,6 +43,7 @@ import org.eclipse.jpt.jpa.core.context.AccessType; import org.eclipse.jpt.jpa.core.context.PersistentType; import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute; import org.eclipse.jpt.jpa.core.context.TypeRefactoringParticipant; +import org.eclipse.jpt.jpa.core.context.java.JavaManagedType; import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType; import org.eclipse.jpt.jpa.core.context.orm.EntityMappings; import org.eclipse.jpt.jpa.core.context.orm.OrmAttributeMapping; @@ -58,15 +57,13 @@ import org.eclipse.jpt.jpa.core.internal.context.ContextContainerTools; import org.eclipse.jpt.jpa.core.internal.context.java.AbstractJavaPersistentType; import org.eclipse.jpt.jpa.core.internal.context.java.PropertyAccessor; import org.eclipse.jpt.jpa.core.internal.plugin.JptJpaCorePlugin; -import org.eclipse.jpt.jpa.core.internal.validation.DefaultJpaValidationMessages; import org.eclipse.jpt.jpa.core.jpa2.context.MetamodelSourceType; import org.eclipse.jpt.jpa.core.jpa2.context.PersistentType2_0; import org.eclipse.jpt.jpa.core.resource.orm.Attributes; import org.eclipse.jpt.jpa.core.resource.orm.OrmPackage; import org.eclipse.jpt.jpa.core.resource.orm.XmlAttributeMapping; +import org.eclipse.jpt.jpa.core.resource.orm.XmlEntityMappings; import org.eclipse.jpt.jpa.core.resource.orm.XmlTypeMapping; -import org.eclipse.jpt.jpa.core.validation.JptJpaCoreValidationMessages; -import org.eclipse.text.edits.DeleteEdit; import org.eclipse.text.edits.ReplaceEdit; import org.eclipse.wst.validation.internal.provisional.core.IMessage; import org.eclipse.wst.validation.internal.provisional.core.IReporter; @@ -81,15 +78,11 @@ import org.eclipse.wst.validation.internal.provisional.core.IReporter; * </ul> */ public abstract class SpecifiedOrmPersistentType - extends AbstractOrmXmlContextNode + extends AbstractOrmManagedType implements OrmPersistentType, PersistentType2_0 { protected OrmTypeMapping mapping; // never null - protected String name; - - protected JavaPersistentType javaPersistentType; - protected AccessType specifiedAccess; protected AccessType defaultAccess; // never null @@ -108,10 +101,8 @@ public abstract class SpecifiedOrmPersistentType protected SpecifiedOrmPersistentType(EntityMappings parent, XmlTypeMapping xmlTypeMapping) { - super(parent); + super(parent, xmlTypeMapping); this.mapping = this.buildMapping(xmlTypeMapping); - this.name = this.buildName(); - // 'javaPersistentType' is resolved in the update this.specifiedAccess = this.buildSpecifiedAccess(); this.defaultAccess = AccessType.FIELD; // keep this non-null this.initializeSpecifiedAttributes(); @@ -126,8 +117,6 @@ public abstract class SpecifiedOrmPersistentType public void synchronizeWithResourceModel() { super.synchronizeWithResourceModel(); this.mapping.synchronizeWithResourceModel(); - this.setName(this.buildName()); - this.syncJavaPersistentType(); this.setSpecifiedAccess_(this.buildSpecifiedAccess()); this.syncSpecifiedAttributes(); this.synchronizeNodesWithResourceModel(this.getDefaultAttributes()); @@ -137,7 +126,6 @@ public abstract class SpecifiedOrmPersistentType public void update() { super.update(); this.mapping.update(); - this.updateJavaPersistentType(); this.setDefaultAccess(this.buildDefaultAccess()); this.updateNodes(this.getSpecifiedAttributes()); this.updateDefaultAttributes(); @@ -146,10 +134,9 @@ public abstract class SpecifiedOrmPersistentType this.updateChildren(); } - public void gatherRootStructureNodes(JpaFile jpaFile, Collection<JpaStructureNode> rootStructureNodes) { - if (this.javaPersistentType != null) { - this.javaPersistentType.gatherRootStructureNodes(jpaFile, rootStructureNodes); - } + @Override + public XmlTypeMapping getXmlManagedType() { + return (XmlTypeMapping) super.getXmlManagedType(); } @@ -172,8 +159,10 @@ public abstract class SpecifiedOrmPersistentType protected void setMappingKey_(String mappingKey) { OrmTypeMapping old = this.mapping; OrmTypeMappingDefinition mappingDefinition = this.getMappingFileDefinition().getTypeMappingDefinition(mappingKey); - XmlTypeMapping xmlTypeMapping = mappingDefinition.buildResourceMapping(this.getResourceNodeFactory()); - this.mapping = this.buildMapping(xmlTypeMapping); + String className = this.getClass_(); + this.xmlManagedType = mappingDefinition.buildResourceMapping(this.getResourceNodeFactory()); + this.xmlManagedType.setClassName(className); + this.mapping = this.buildMapping(this.getXmlTypeMapping()); this.getEntityMappings().changeMapping(this, old, this.mapping); this.firePropertyChanged(MAPPING_PROPERTY, old, this.mapping); } @@ -184,7 +173,7 @@ public abstract class SpecifiedOrmPersistentType } protected XmlTypeMapping getXmlTypeMapping() { - return this.mapping.getXmlTypeMapping(); + return this.getXmlManagedType(); } public boolean isMapped() { @@ -192,115 +181,14 @@ public abstract class SpecifiedOrmPersistentType } - // ********** name ********** - - public String getName() { - return this.name; - } - - protected void setName(String name) { - String old = this.name; - this.name = name; - if (this.firePropertyChanged(NAME_PROPERTY, old, name)) { - // clear out the Java persistent type here, it will be rebuilt during "update" - if (this.javaPersistentType != null) { - this.setJavaPersistentType(null); - } - } - } - - protected String buildName() { - return this.getEntityMappings().qualify(this.getMappingClassName()); - } - - public String getSimpleName(){ - String className = this.getName(); - return StringTools.isBlank(className) ? null : ClassNameTools.simpleName(className); - } - - public String getTypeQualifiedName() { - String className = this.getMappingClassName(); - if (className == null) { - return null; - } - int lastPeriod = className.lastIndexOf('.'); - className = (lastPeriod == -1) ? className : className.substring(lastPeriod + 1); - className = className.replace('$', '.'); - return className; - } - - protected String getMappingClassName() { - return this.mapping.getClass_(); - } - // ********** Java persistent type ********** public JavaPersistentType getJavaPersistentType() { - return this.javaPersistentType; - } - - protected void setJavaPersistentType(JavaPersistentType javaPersistentType) { - JavaPersistentType old = this.javaPersistentType; - this.javaPersistentType = javaPersistentType; - this.firePropertyChanged(JAVA_PERSISTENT_TYPE_PROPERTY, old, javaPersistentType); + return (JavaPersistentType) super.getJavaManagedType(); } - /** - * If the persistent type's name changes during <em>update</em>, - * the Java persistent type will be cleared out in - * {@link #setName(String)}. If we get here and - * the Java persistent type is present, we can - * <em>sync</em> it. In some circumstances it will be obsolete - * since the name is changed during update (the mapping class name or - * the entity mapping's package affect the name) - * - * @see #updateJavaPersistentType() - */ - protected void syncJavaPersistentType() { - if (this.javaPersistentType != null) { - this.javaPersistentType.synchronizeWithResourceModel(); - } - } - - /** - * @see #syncJavaPersistentType() - */ - protected void updateJavaPersistentType() { - if (this.getName() == null) { - if (this.javaPersistentType != null) { - this.setJavaPersistentType(null); - } - } - else { - JavaResourceType resourceType = this.resolveJavaResourceType(); - if (this.javaPersistentType == null) { - this.setJavaPersistentType(this.buildJavaPersistentType(resourceType)); - } - else { - // bug 379051 using == here because it is possible that the names are the same, - // but the location has changed: the java resource type has moved from "external" - // to part of the jpa project's jpa files. - if (this.javaPersistentType.getJavaResourceType() == resourceType) { - this.javaPersistentType.update(); - } else { - this.setJavaPersistentType(this.buildJavaPersistentType(resourceType)); - } - } - } - } - - /** - * Return null it's an enum; don't build a JavaPersistentType - * @see #updateJavaPersistentType() - */ - protected JavaResourceType resolveJavaResourceType() { - if (this.name == null) { - return null; - } - return (JavaResourceType) this.getJpaProject().getJavaResourceType(this.name, AstNodeType.TYPE); - } - - protected JavaPersistentType buildJavaPersistentType(JavaResourceType jrt) { + @Override + protected JavaManagedType buildJavaManagedType(JavaResourceType jrt) { return jrt != null ? this.getJpaFactory().buildJavaPersistentType(this, jrt) : null; } @@ -342,9 +230,9 @@ public abstract class SpecifiedOrmPersistentType protected AccessType buildDefaultAccess() { if ( ! this.mapping.isMetadataComplete()) { - if (this.javaPersistentType != null) { + if (this.getJavaPersistentType() != null) { if (this.javaPersistentTypeHasSpecifiedAccess()) { - return this.javaPersistentType.getAccess(); + return this.getJavaPersistentType().getAccess(); } } if (this.superPersistentType != null) { @@ -359,8 +247,8 @@ public abstract class SpecifiedOrmPersistentType * pre-condition: {@link #javaPersistentType} is not <code>null</code> */ protected boolean javaPersistentTypeHasSpecifiedAccess() { - return (this.javaPersistentType.getSpecifiedAccess() != null) || - this.javaPersistentType.hasAnyAnnotatedAttributes(); + return (this.getJavaPersistentType().getSpecifiedAccess() != null) || + this.getJavaPersistentType().hasAnyAnnotatedAttributes(); } public AccessType getOwnerOverrideAccess() { @@ -419,7 +307,7 @@ public abstract class SpecifiedOrmPersistentType } public TypeBinding getAttributeTypeBinding(ReadOnlyPersistentAttribute attribute) { - return (this.javaPersistentType == null) ? null : this.javaPersistentType.getAttributeTypeBinding(attribute); + return (this.getJavaPersistentType() == null) ? null : this.getJavaPersistentType().getAttributeTypeBinding(attribute); } @@ -908,10 +796,6 @@ public abstract class SpecifiedOrmPersistentType }; } - protected JavaResourceType getJavaResourceType() { - return (this.javaPersistentType == null) ? null : this.javaPersistentType.getJavaResourceType(); - } - /** * Return the access type that determines which Java attributes are to be * used for the <code>orm.xml</code> type's <em>default</em> attributes. @@ -923,7 +807,7 @@ public abstract class SpecifiedOrmPersistentType if (this.mapping.isMetadataComplete()) { return this.defaultAccess; } - AccessType javaAccess = this.javaPersistentType == null ? null : this.javaPersistentType.getSpecifiedAccess(); + AccessType javaAccess = this.getJavaPersistentType() == null ? null : this.getJavaPersistentType().getSpecifiedAccess(); return (javaAccess != null) ? javaAccess : this.defaultAccess; } @@ -1023,7 +907,7 @@ public abstract class SpecifiedOrmPersistentType } protected PersistentType buildSuperPersistentType_() { - return (this.javaPersistentType == null) ? null : this.javaPersistentType.getSuperPersistentType(); + return (this.getJavaPersistentType() == null) ? null : this.getJavaPersistentType().getSuperPersistentType(); } @@ -1060,8 +944,8 @@ public abstract class SpecifiedOrmPersistentType } protected String buildDeclaringTypeName_() { - return (this.javaPersistentType == null) ? - null : ((PersistentType2_0) this.javaPersistentType).getDeclaringTypeName(); + return (this.getJavaPersistentType() == null) ? + null : ((PersistentType2_0) this.getJavaPersistentType()).getDeclaringTypeName(); } @@ -1074,7 +958,7 @@ public abstract class SpecifiedOrmPersistentType } public IFile getMetamodelFile() { - return (this.javaPersistentType == null) ? null : this.metamodelSynchronizer.getFile(); + return (this.getJavaPersistentType() == null) ? null : this.metamodelSynchronizer.getFile(); } public void initializeMetamodel() { @@ -1090,13 +974,13 @@ public abstract class SpecifiedOrmPersistentType * because 1.0 <code>orm.xml</code> files can be referenced from 2.0 persistence.xml files. */ public void synchronizeMetamodel(Map<String, Collection<MetamodelSourceType>> memberTypeTree) { - if (this.javaPersistentType != null) { + if (this.getJavaPersistentType() != null) { this.metamodelSynchronizer.synchronize(memberTypeTree); } } public void printBodySourceOn(BodySourceWriter pw, Map<String, Collection<MetamodelSourceType>> memberTypeTree) { - if (this.javaPersistentType != null) { + if (this.getJavaPersistentType() != null) { this.metamodelSynchronizer.printBodySourceOn(pw, memberTypeTree); } } @@ -1110,6 +994,21 @@ public abstract class SpecifiedOrmPersistentType } + // ********** OrmManagedType implementation ********** + + public int getXmlSequence() { + return this.getMapping().getXmlSequence(); + } + + public void addXmlManagedTypeTo(XmlEntityMappings entityMappings) { + this.getMapping().addXmlTypeMappingTo(entityMappings); + } + + public void removeXmlManagedTypeFrom(XmlEntityMappings entityMappings) { + this.getMapping().removeXmlTypeMappingFrom(entityMappings); + } + + // ********** JpaStructureNode implementation ********** public ContextType getContextType() { @@ -1120,6 +1019,12 @@ public abstract class SpecifiedOrmPersistentType return OrmPersistentType.class; } + public void gatherRootStructureNodes(JpaFile jpaFile, Collection<JpaStructureNode> rootStructureNodes) { + if (this.getJavaPersistentType() != null) { + this.getJavaPersistentType().gatherRootStructureNodes(jpaFile, rootStructureNodes); + } + } + protected void initializeChildren() { this.children.addAll(this.specifiedAttributes); //defaultAttributes haven't been built yet } @@ -1139,12 +1044,9 @@ public abstract class SpecifiedOrmPersistentType return this.children.size(); } - public TextRange getFullTextRange() { - return this.getXmlTypeMapping().getFullTextRange(); - } - public boolean containsOffset(int textOffset) { - return this.getXmlTypeMapping().containsOffset(textOffset); + public TextRange getSelectionTextRange() { + return this.mapping.getSelectionTextRange(); } public JpaStructureNode getStructureNode(int textOffset) { @@ -1156,10 +1058,6 @@ public abstract class SpecifiedOrmPersistentType return this; } - public TextRange getSelectionTextRange() { - return this.mapping.getSelectionTextRange(); - } - public void dispose() { for (OrmReadOnlyPersistentAttribute defaultAttribute : this.getDefaultAttributes()) { defaultAttribute.dispose(); @@ -1206,15 +1104,11 @@ public abstract class SpecifiedOrmPersistentType //*********** refactoring *********** - public Iterable<DeleteEdit> createDeleteTypeEdits(IType type) { - return this.isFor(type.getFullyQualifiedName('.')) ? - IterableTools.singletonIterable(this.mapping.createDeleteEdit()) : - IterableTools.<DeleteEdit>emptyIterable(); - } - + @Override @SuppressWarnings("unchecked") public Iterable<ReplaceEdit> createRenameTypeEdits(IType originalType, String newName) { return IterableTools.concatenate( + super.createRenameTypeEdits(originalType, newName), this.mapping.createRenameTypeEdits(originalType, newName), this.createSpecifiedAttributesRenameTypeEdits(originalType, newName) ); @@ -1224,9 +1118,11 @@ public abstract class SpecifiedOrmPersistentType return IterableTools.children(this.getSpecifiedAttributes(), new TypeRefactoringParticipant.RenameTypeEditsTransformer(originalType, newName)); } + @Override @SuppressWarnings("unchecked") public Iterable<ReplaceEdit> createMoveTypeEdits(IType originalType, IPackageFragment newPackage) { return IterableTools.concatenate( + super.createMoveTypeEdits(originalType, newPackage), this.mapping.createMoveTypeEdits(originalType, newPackage), this.createSpecifiedAttributesMoveTypeEdits(originalType, newPackage) ); @@ -1236,9 +1132,11 @@ public abstract class SpecifiedOrmPersistentType return IterableTools.children(this.getSpecifiedAttributes(), new TypeRefactoringParticipant.MoveTypeEditsTransformer(originalType, newPackage)); } + @Override @SuppressWarnings("unchecked") public Iterable<ReplaceEdit> createRenamePackageEdits(IPackageFragment originalPackage, String newName) { return IterableTools.concatenate( + super.createRenamePackageEdits(originalPackage, newName), this.mapping.createRenamePackageEdits(originalPackage, newName), this.createSpecifiedAttributesRenamePackageEdits(originalPackage, newName) ); @@ -1254,25 +1152,10 @@ public abstract class SpecifiedOrmPersistentType @Override public void validate(List<IMessage> messages, IReporter reporter) { super.validate(messages, reporter); - this.validateClass(messages); this.validateMapping(messages, reporter); this.validateAttributes(messages, reporter); } - protected void validateClass(List<IMessage> messages) { - if (this.javaPersistentType == null) { - messages.add( - DefaultJpaValidationMessages.buildMessage( - IMessage.HIGH_SEVERITY, - JptJpaCoreValidationMessages.PERSISTENT_TYPE_UNRESOLVED_CLASS, - new String[] {this.getName()}, - this, - this.mapping.getClassTextRange() - ) - ); - } - } - protected void validateMapping(List<IMessage> messages, IReporter reporter) { try { this.mapping.validate(messages, reporter); @@ -1295,10 +1178,6 @@ public abstract class SpecifiedOrmPersistentType } } - public TextRange getValidationTextRange() { - return this.mapping.getValidationTextRange(); - } - // ********** completion proposals ********** @Override @@ -1320,48 +1199,10 @@ public abstract class SpecifiedOrmPersistentType return null; } - // ********** misc ********** - - @Override - public EntityMappings getParent() { - return (EntityMappings) super.getParent(); - } - - protected EntityMappings getEntityMappings() { - return this.getParent(); - } - - public String getDefaultPackage() { - return this.getEntityMappings().getDefaultPersistentTypePackage(); - } - - public boolean isFor(String typeName) { - return ObjectTools.equals(typeName, this.getName()); - } - - public boolean isIn(IPackageFragment packageFragment) { - String packageName = this.getPackageName(); - if (ObjectTools.equals(packageName, packageFragment.getElementName())) { - return true; - } - return false; - } - protected String getPackageName() { - String className = this.getMappingClassName(); - if (className == null) { - return null; - } - int lastPeriod = className.lastIndexOf('.'); - return (lastPeriod == -1) ? this.getDefaultPackage() : className.substring(0, lastPeriod); - } + // ********** misc ********** public PersistentType getOverriddenPersistentType() { - return this.mapping.isMetadataComplete() ? null : this.javaPersistentType; - } - - @Override - public void toString(StringBuilder sb) { - sb.append(this.getName()); + return this.mapping.isMetadataComplete() ? null : this.getJavaPersistentType(); } } diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/persistence/AbstractJarFileRef.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/persistence/AbstractJarFileRef.java index 6625e553c7..256144ff55 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/persistence/AbstractJarFileRef.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/persistence/AbstractJarFileRef.java @@ -24,9 +24,9 @@ import org.eclipse.jpt.common.utility.internal.iterable.EmptyIterable; import org.eclipse.jpt.common.utility.internal.iterable.SingleElementIterable; import org.eclipse.jpt.jpa.core.JpaFile; import org.eclipse.jpt.jpa.core.JpaStructureNode; +import org.eclipse.jpt.jpa.core.context.ManagedType; import org.eclipse.jpt.jpa.core.context.PersistentType; import org.eclipse.jpt.jpa.core.context.java.JarFile; -import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType; import org.eclipse.jpt.jpa.core.context.persistence.JarFileRef; import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit; import org.eclipse.jpt.jpa.core.internal.validation.DefaultJpaValidationMessages; @@ -299,15 +299,26 @@ public abstract class AbstractJarFileRef return this.xmlJarFileRef; } + + // ********** PersistentTypeContainer implementation ********** + + public Iterable<? extends PersistentType> getPersistentTypes() { + return (this.jarFile != null) ? this.jarFile.getPersistentTypes() : EmptyIterable.<PersistentType>instance(); + } + public PersistentType getPersistentType(String typeName) { return (this.jarFile == null) ? null : this.jarFile.getPersistentType(typeName); } - // ********** PersistentTypeContainer implementation ********** + // ********** ManagedTypeContainer implementation ********** - public Iterable<? extends PersistentType> getPersistentTypes() { - return (this.jarFile != null) ? this.jarFile.getPersistentTypes() : EmptyIterable.<JavaPersistentType>instance(); + public Iterable<? extends ManagedType> getManagedTypes() { + return (this.jarFile != null) ? this.jarFile.getManagedTypes() : EmptyIterable.<ManagedType>instance(); + } + + public ManagedType getManagedType(String typeName) { + return (this.jarFile == null) ? null : this.jarFile.getManagedType(typeName); } diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/persistence/AbstractMappingFileRef.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/persistence/AbstractMappingFileRef.java index 7fca53e383..1b774ee121 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/persistence/AbstractMappingFileRef.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/persistence/AbstractMappingFileRef.java @@ -23,6 +23,7 @@ import org.eclipse.jpt.common.utility.internal.iterable.IterableTools; import org.eclipse.jpt.jpa.core.JpaFile; import org.eclipse.jpt.jpa.core.JpaStructureNode; import org.eclipse.jpt.jpa.core.context.Generator; +import org.eclipse.jpt.jpa.core.context.ManagedType; import org.eclipse.jpt.jpa.core.context.MappingFile; import org.eclipse.jpt.jpa.core.context.MappingFilePersistenceUnitMetadata; import org.eclipse.jpt.jpa.core.context.PersistentType; @@ -247,16 +248,24 @@ public abstract class AbstractMappingFileRef<MF extends MappingFile> return (PersistenceUnit) super.getParent(); } + public Iterable<? extends PersistentType> getPersistentTypes() { + return (this.mappingFile != null) ? this.mappingFile.getPersistentTypes() : EmptyIterable.<PersistentType>instance(); + } + + public Iterable<? extends ManagedType> getManagedTypes() { + return (this.mappingFile != null) ? this.mappingFile.getManagedTypes() : EmptyIterable.<ManagedType>instance(); + } + + public ManagedType getManagedType(String typeName) { + return (this.mappingFile == null) ? null : this.mappingFile.getManagedType(typeName); + } + @Override public void toString(StringBuilder sb) { super.toString(sb); sb.append(this.fileName); } - public Iterable<? extends PersistentType> getPersistentTypes() { - return (this.mappingFile != null) ? this.mappingFile.getPersistentTypes() : EmptyIterable.<PersistentType>instance(); - } - // ********** validation ********** diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/persistence/AbstractPersistenceUnit.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/persistence/AbstractPersistenceUnit.java index cf1ffae37f..18db7b4959 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/persistence/AbstractPersistenceUnit.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/persistence/AbstractPersistenceUnit.java @@ -37,6 +37,7 @@ import org.eclipse.jpt.common.core.resource.java.JavaResourceNode; import org.eclipse.jpt.common.core.resource.java.JavaResourceType; import org.eclipse.jpt.common.core.utility.BodySourceWriter; import org.eclipse.jpt.common.core.utility.TextRange; +import org.eclipse.jpt.common.utility.filter.Filter; import org.eclipse.jpt.common.utility.internal.ObjectTools; import org.eclipse.jpt.common.utility.internal.StringTools; import org.eclipse.jpt.common.utility.internal.collection.CollectionTools; @@ -61,6 +62,7 @@ import org.eclipse.jpt.jpa.core.context.Embeddable; import org.eclipse.jpt.jpa.core.context.Entity; import org.eclipse.jpt.jpa.core.context.Generator; import org.eclipse.jpt.jpa.core.context.JpaNamedContextNode; +import org.eclipse.jpt.jpa.core.context.ManagedType; import org.eclipse.jpt.jpa.core.context.MappingFile; import org.eclipse.jpt.jpa.core.context.MappingFilePersistenceUnitDefaults; import org.eclipse.jpt.jpa.core.context.MappingFilePersistenceUnitMetadata; @@ -70,13 +72,16 @@ import org.eclipse.jpt.jpa.core.context.ReadOnlyPersistentAttribute; import org.eclipse.jpt.jpa.core.context.TypeMapping; import org.eclipse.jpt.jpa.core.context.TypeRefactoringParticipant; import org.eclipse.jpt.jpa.core.context.java.JavaGenerator; +import org.eclipse.jpt.jpa.core.context.java.JavaManagedType; import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType; import org.eclipse.jpt.jpa.core.context.java.JavaQuery; import org.eclipse.jpt.jpa.core.context.java.JavaTypeMappingDefinition; import org.eclipse.jpt.jpa.core.context.orm.EntityMappings; +import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType; import org.eclipse.jpt.jpa.core.context.orm.OrmQueryContainer; import org.eclipse.jpt.jpa.core.context.persistence.ClassRef; import org.eclipse.jpt.jpa.core.context.persistence.JarFileRef; +import org.eclipse.jpt.jpa.core.context.persistence.ManagedTypeContainer; import org.eclipse.jpt.jpa.core.context.persistence.MappingFileRef; import org.eclipse.jpt.jpa.core.context.persistence.MappingFileRefactoringParticipant; import org.eclipse.jpt.jpa.core.context.persistence.Persistence; @@ -140,9 +145,9 @@ public abstract class AbstractPersistenceUnit * Use with caution since this contains no duplicates (e.g. class is listed in 2 different mappings files) * Rebuilt at the *beginning* of {@link #update()} * - * @see #rebuildPersistentTypeMap() + * @see #rebuildManagedTypeMap() */ - protected final Hashtable<String, PersistentType> persistentTypeMap = new Hashtable<String, PersistentType>(); + protected final Hashtable<String, ManagedType> managedTypeMap = new Hashtable<String, ManagedType>(); protected final ContextListContainer<MappingFileRef, XmlMappingFileRef> specifiedMappingFileRefContainer; @@ -267,9 +272,9 @@ public abstract class AbstractPersistenceUnit public void update() { super.update(); - //Rebuild the persistent type map first. I *think* if anything changes to cause + //Rebuild the managed type map first. I *think* if anything changes to cause //this to be out of sync another update would be triggered by that change. - this.rebuildPersistentTypeMap(); + this.rebuildManagedTypeMap(); this.setDefaultTransactionType(this.buildDefaultTransactionType()); @@ -562,7 +567,7 @@ public abstract class AbstractPersistenceUnit } @Override public boolean accept(MappingFileRef mappingFileRef) { - return mappingFileRef.getPersistentType(this.typeName) != null; + return mappingFileRef.getManagedType(this.typeName) != null; } } @@ -951,19 +956,19 @@ public abstract class AbstractPersistenceUnit /** * Return the names of all the Java classes in the JPA project that are - * mapped (i.e. have the appropriate annotation etc.) but not specified + * managed (i.e. have the appropriate annotation etc.) but not specified * in the persistence unit or any of its mapping files. */ protected Iterable<JavaResourceAbstractType> getImpliedClassResourceTypes_() { - return IterableTools.filter(this.getJpaProject().getMappedJavaSourceTypes(), new SpecifiesPersistentType()); + return IterableTools.filter(this.getJpaProject().getPotentialJavaSourceTypes(), new SpecifiesManagedType()); } - public class SpecifiesPersistentType + public class SpecifiesManagedType extends FilterAdapter<JavaResourceAbstractType> { @Override public boolean accept(JavaResourceAbstractType jrat) { - return ! AbstractPersistenceUnit.this.specifiesPersistentType(jrat.getTypeBinding().getQualifiedName()); + return ! AbstractPersistenceUnit.this.specifiesManagedType(jrat.getTypeBinding().getQualifiedName()); } } @@ -1680,83 +1685,83 @@ public abstract class AbstractPersistenceUnit } - // ********** persistent types ********** + // ********** managed types ********** @SuppressWarnings("unchecked") - public Iterable<PersistentType> getPersistentTypes() { + public Iterable<ManagedType> getManagedTypes() { return IterableTools.concatenate( - this.getMappingFilePersistentTypes(), - this.getClassRefPersistentTypes(), - this.getJarFilePersistentTypes() + this.getMappingFileManagedTypes(), + this.getClassRefManagedTypes(), + this.getJarFileManagedTypes() ); } - protected Iterable<PersistentType> getMappingFilePersistentTypes() { - return IterableTools.children(this.getMappingFileRefs(), PersistentTypeContainer.TRANSFORMER); + protected Iterable<ManagedType> getMappingFileManagedTypes() { + return IterableTools.children(this.getMappingFileRefs(), ManagedTypeContainer.TRANSFORMER); } @SuppressWarnings("unchecked") - public Iterable<PersistentType> getJavaPersistentTypes() { + public Iterable<ManagedType> getJavaManagedTypes() { return IterableTools.concatenate( - this.getClassRefPersistentTypes(), - this.getJarFilePersistentTypes() + this.getClassRefManagedTypes(), + this.getJarFileManagedTypes() ); } /** - * Return the non-<code>null</code> class ref persistent types, + * Return the non-<code>null</code> class ref managed types, * both specified and implied. */ - protected Iterable<PersistentType> getClassRefPersistentTypes() { - return IterableTools.removeNulls(this.getClassRefPersistentTypes_()); + protected Iterable<ManagedType> getClassRefManagedTypes() { + return IterableTools.removeNulls(this.getClassRefManagedTypes_()); } /** * Both specified and implied. May contain <code>null</code>s. - * @see #getClassRefPersistentTypes() + * @see #getClassRefManagedTypes() */ - protected Iterable<PersistentType> getClassRefPersistentTypes_() { - return IterableTools.transform(this.getClassRefs(), CLASS_REF_PERSISTENT_TYPE_TRANSFORMER); + protected Iterable<ManagedType> getClassRefManagedTypes_() { + return IterableTools.transform(this.getClassRefs(), CLASS_REF_MANAGED_TYPE_TRANSFORMER); } - protected static final Transformer<ClassRef, PersistentType> CLASS_REF_PERSISTENT_TYPE_TRANSFORMER = TransformerTools.superTransformer(ClassRef.JAVA_PERSISTENT_TYPE_TRANSFORMER); + protected static final Transformer<ClassRef, ManagedType> CLASS_REF_MANAGED_TYPE_TRANSFORMER = TransformerTools.superTransformer(ClassRef.JAVA_MANAGED_TYPE_TRANSFORMER); /** * We only get <em>annotated</em> types from jar files. */ - protected Iterable<PersistentType> getJarFilePersistentTypes() { - return IterableTools.children(this.getJarFileRefs(), PersistentTypeContainer.TRANSFORMER); + protected Iterable<ManagedType> getJarFileManagedTypes() { + return IterableTools.children(this.getJarFileRefs(), ManagedTypeContainer.TRANSFORMER); } - public PersistentType getPersistentType(String typeName) { - return typeName == null ? null : this.persistentTypeMap.get(typeName); + public ManagedType getManagedType(String typeName) { + return typeName == null ? null : this.managedTypeMap.get(typeName); } - protected void rebuildPersistentTypeMap() { - synchronized (this.persistentTypeMap) { - this.persistentTypeMap.clear(); + protected void rebuildManagedTypeMap() { + synchronized (this.managedTypeMap) { + this.managedTypeMap.clear(); for (MappingFileRef mappingFileRef : this.getMappingFileRefs()) { - for (PersistentType persistentType : mappingFileRef.getPersistentTypes()) { - if (persistentType.getName() != null) { - if (! this.persistentTypeMap.containsKey(persistentType.getName())) { - this.persistentTypeMap.put(persistentType.getName(), persistentType); + for (ManagedType mt : mappingFileRef.getManagedTypes()) { + if (mt.getName() != null) { + if (! this.managedTypeMap.containsKey(mt.getName())) { + this.managedTypeMap.put(mt.getName(), mt); } } } } for (ClassRef classRef : this.getClassRefs()) { - PersistentType persistentType = classRef.getJavaPersistentType(); - if (persistentType != null && persistentType.getName() != null) { - if (! this.persistentTypeMap.containsKey(persistentType.getName())) { - this.persistentTypeMap.put(persistentType.getName(), persistentType); + ManagedType mt = classRef.getJavaManagedType(); + if (mt != null && mt.getName() != null) { + if (! this.managedTypeMap.containsKey(mt.getName())) { + this.managedTypeMap.put(mt.getName(), mt); } } } for (JarFileRef jarFileRef : this.getJarFileRefs()) { - for (PersistentType persistentType : jarFileRef.getPersistentTypes()) { - if (persistentType.getName() != null) { - if (! this.persistentTypeMap.containsKey(persistentType.getName())) { - this.persistentTypeMap.put(persistentType.getName(), persistentType); + for (ManagedType mt : jarFileRef.getManagedTypes()) { + if (mt.getName() != null) { + if (! this.managedTypeMap.containsKey(mt.getName())) { + this.managedTypeMap.put(mt.getName(), mt); } } } @@ -1767,14 +1772,14 @@ public abstract class AbstractPersistenceUnit /** * Ignore implied class refs and jar files. */ - public boolean specifiesPersistentType(String typeName) { + public boolean specifiesManagedType(String typeName) { for (ClassRef classRef : this.getSpecifiedClassRefs()) { if (classRef.isFor(typeName)) { return true; } } for (MappingFileRef mappingFileRef : this.getMappingFileRefs()) { - if (mappingFileRef.getPersistentType(typeName) != null) { + if (mappingFileRef.getManagedType(typeName) != null) { return true; } } @@ -1843,6 +1848,49 @@ public abstract class AbstractPersistenceUnit return IterableTools.transform(this.getMappingFilePersistentTypes(), PersistentType.OVERRIDDEN_PERSISTENT_TYPE_TRANSFORMER); } + public Iterable<PersistentType> getPersistentTypes() { + return IterableTools.downCast(IterableTools.filter( + this.getManagedTypes(), + PERSISTENT_TYPE_FILTER)); + } + + protected static final Filter<ManagedType> PERSISTENT_TYPE_FILTER = + new Filter<ManagedType>() { + public boolean accept(ManagedType mt) { + return mt.getType() == JavaPersistentType.class || mt.getType() == OrmPersistentType.class; //is this right? what about just getType() == PersistentType.class?? + } + }; + + public PersistentType getPersistentType(String typeName) { + ManagedType mt = this.getManagedType(typeName); + if (mt != null && (mt.getType() == JavaPersistentType.class || mt.getType() == OrmPersistentType.class)) { + return (PersistentType) mt; + } + return null; + } + + protected Iterable<PersistentType> getMappingFilePersistentTypes() { + return IterableTools.children(this.getMappingFileRefs(), PersistentTypeContainer.TRANSFORMER); + } + + protected Iterable<PersistentType> getClassRefPersistentTypes() { + return IterableTools.downCast(IterableTools.filter( + this.getClassRefManagedTypes(), + PERSISTENT_TYPE_FILTER)); + } + + protected Iterable<PersistentType> getJarFilePersistentTypes() { + return IterableTools.downCast(IterableTools.filter( + this.getJarFileManagedTypes(), + PERSISTENT_TYPE_FILTER)); + } + + public Iterable<PersistentType> getJavaPersistentTypes() { + return IterableTools.downCast(IterableTools.filter( + this.getJavaManagedTypes(), + PERSISTENT_TYPE_FILTER)); + } + // ********** type mappings ********** @@ -1956,17 +2004,17 @@ public abstract class AbstractPersistenceUnit SubMonitor sm = SubMonitor.convert(monitor, 3); // calculate the refs to remove and add - HashSet<JavaResourceAbstractType> newTypes = CollectionTools.set(this.getJpaProject().getMappedJavaSourceTypes()); + HashSet<JavaResourceAbstractType> newTypes = CollectionTools.set(this.getJpaProject().getPotentialJavaSourceTypes()); ArrayList<ClassRef> deadClassRefs = new ArrayList<ClassRef>(); HashSet<String> mappingFileTypeNames = this.getMappingFileTypeNames(); for (ClassRef classRef : this.getSpecifiedClassRefs()) { - JavaPersistentType specifiedJPT = classRef.getJavaPersistentType(); - if (specifiedJPT == null) { + JavaManagedType specifiedJMT = classRef.getJavaManagedType(); + if (specifiedJMT == null) { // Java type cannot be resolved deadClassRefs.add(classRef); } else { - JavaResourceType specifiedType = specifiedJPT.getJavaResourceType(); + JavaResourceType specifiedType = specifiedJMT.getJavaResourceType(); if ( ! newTypes.remove(specifiedType)) { // Java type is not annotated deadClassRefs.add(classRef); @@ -1998,8 +2046,8 @@ public abstract class AbstractPersistenceUnit protected HashSet<String> getMappingFileTypeNames() { HashSet<String> result = new HashSet<String>(); for (MappingFileRef mappingFileRef : this.getMappingFileRefs()) { - for (PersistentType persistentType : mappingFileRef.getPersistentTypes()) { - result.add(persistentType.getName()); + for (ManagedType managedType : mappingFileRef.getManagedTypes()) { + result.add(managedType.getName()); } } return result; @@ -2136,8 +2184,8 @@ public abstract class AbstractPersistenceUnit public Iterable<String> getPackageNames() { Set<String> packageNames = new HashSet<String>(); - for (PersistentType pType : this.getJavaPersistentTypes()) { - JavaResourceType jrt = ((JavaPersistentType)pType).getJavaResourceType(); + for (ManagedType mType : this.getJavaManagedTypes()) { + JavaResourceType jrt = mType.getJavaResourceType(); packageNames.add(jrt.getTypeBinding().getPackageName()); } return packageNames; @@ -2229,13 +2277,13 @@ public abstract class AbstractPersistenceUnit } protected void checkForDuplicateMappingFileClasses(List<IMessage> messages) { - for (Map.Entry<String, ArrayList<PersistentType>> entry : this.mapMappingFilePersistentTypesByName().entrySet()) { - String ptName = entry.getKey(); - if (StringTools.isNotBlank(ptName)) { - ArrayList<PersistentType> dups = entry.getValue(); + for (Map.Entry<String, ArrayList<ManagedType>> entry : this.mapMappingFileManagedTypesByName().entrySet()) { + String mtName = entry.getKey(); + if (StringTools.isNotBlank(mtName)) { + ArrayList<ManagedType> dups = entry.getValue(); if (dups.size() > 1) { - String[] parms = new String[] {ptName}; - for (PersistentType dup : dups) { + String[] parms = new String[] {mtName}; + for (ManagedType dup : dups) { messages.add( DefaultJpaValidationMessages.buildMessage( IMessage.NORMAL_SEVERITY, @@ -2252,19 +2300,19 @@ public abstract class AbstractPersistenceUnit } /** - * Return the persistence unit's mapping file persistent types + * Return the persistence unit's mapping file managed types * keyed by their class names. */ - protected HashMap<String, ArrayList<PersistentType>> mapMappingFilePersistentTypesByName() { - HashMap<String, ArrayList<PersistentType>> map = new HashMap<String, ArrayList<PersistentType>>(); - for (PersistentType persistentType : this.getMappingFilePersistentTypes()) { - String ptName = persistentType.getName(); - ArrayList<PersistentType> list = map.get(ptName); + protected HashMap<String, ArrayList<ManagedType>> mapMappingFileManagedTypesByName() { + HashMap<String, ArrayList<ManagedType>> map = new HashMap<String, ArrayList<ManagedType>>(); + for (ManagedType managedType : this.getMappingFileManagedTypes()) { + String mtName = managedType.getName(); + ArrayList<ManagedType> list = map.get(mtName); if (list == null) { - list = new ArrayList<PersistentType>(); - map.put(ptName, list); + list = new ArrayList<ManagedType>(); + map.put(mtName, list); } - list.add(persistentType); + list.add(managedType); } return map; } diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/AbstractTypeMappingValidator.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/AbstractTypeMappingValidator.java index 1b8e107053..b1755bfb18 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/AbstractTypeMappingValidator.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/AbstractTypeMappingValidator.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2010, 2012 Oracle. All rights reserved. + * Copyright (c) 2010, 2013 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. @@ -17,6 +17,7 @@ import org.eclipse.jpt.jpa.core.internal.validation.DefaultJpaValidationMessages import org.eclipse.wst.validation.internal.provisional.core.IMessage; import org.eclipse.wst.validation.internal.provisional.core.IReporter; +//AbstractTypeMappingTypeValidator might be a better name public abstract class AbstractTypeMappingValidator<M extends TypeMapping> implements JptValidator { diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/GenericRootContextNode.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/GenericRootContextNode.java index 5e71574f7f..59030ec660 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/GenericRootContextNode.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/GenericRootContextNode.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2012 Oracle. All rights reserved. + * Copyright (c) 2007, 2013 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. @@ -286,7 +286,7 @@ public class GenericRootContextNode HashBag<JavaResourceAbstractType> annotatedTypes = CollectionTools.bag(this.jpaProject.getAnnotatedJavaSourceTypes()); HashBag<JavaResourceAbstractType> orphans = annotatedTypes.clone(); for (JavaResourceAbstractType jrat : annotatedTypes) { - if (persistenceUnit.specifiesPersistentType(jrat.getTypeBinding().getQualifiedName())) { + if (persistenceUnit.specifiesManagedType(jrat.getTypeBinding().getQualifiedName())) { orphans.remove(jrat); } else if (MetamodelSynchronizer.MetamodelTools.isMetamodel(jrat)) { @@ -294,13 +294,13 @@ public class GenericRootContextNode } } - Iterable<String> typeMappingAnnotationNames = this.jpaProject.getTypeMappingAnnotationNames(); + Iterable<String> managedTypeAnnotationNames = this.jpaProject.getManagedTypeAnnotationNames(); for (JavaResourceAbstractType jrat : orphans) { - if (jrat.isAnnotatedWithAnyOf(typeMappingAnnotationNames)) { + if (jrat.isAnnotatedWithAnyOf(managedTypeAnnotationNames)) { messages.add( DefaultJpaValidationMessages.buildMessage( IMessage.HIGH_SEVERITY, - JptJpaCoreValidationMessages.PERSISTENT_TYPE_MAPPED_BUT_NOT_INCLUDED_IN_PERSISTENCE_UNIT, + JptJpaCoreValidationMessages.TYPE_MANAGED_BUT_NOT_LISTED_IN_PERSISTENCE_XML, new String[] {jrat.getTypeBinding().getQualifiedName()}, jrat.getFile(), jrat.getNameTextRange() @@ -311,8 +311,8 @@ public class GenericRootContextNode messages.add( DefaultJpaValidationMessages.buildMessage( IMessage.NORMAL_SEVERITY, - JptJpaCoreValidationMessages.PERSISTENT_TYPE_ANNOTATED_BUT_NOT_INCLUDED_IN_PERSISTENCE_UNIT, - new String[] {jrat.getName()}, + JptJpaCoreValidationMessages.TYPE_ANNOTATED_BUT_NOT_LISTED_IN_PERSISTENCE_XML, + new String[] {jrat.getTypeBinding().getQualifiedName()}, jrat.getFile(), jrat.getNameTextRange() ) diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/java/GenericJarFile.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/java/GenericJarFile.java index 7110f4fa09..5fbcd2a050 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/java/GenericJarFile.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/java/GenericJarFile.java @@ -20,12 +20,16 @@ import org.eclipse.jpt.common.core.resource.java.JavaResourceAnnotatedElement.As import org.eclipse.jpt.common.core.resource.java.JavaResourcePackageFragmentRoot; import org.eclipse.jpt.common.core.resource.java.JavaResourceType; import org.eclipse.jpt.common.core.utility.TextRange; +import org.eclipse.jpt.common.utility.filter.Filter; import org.eclipse.jpt.common.utility.internal.iterable.IterableTools; import org.eclipse.jpt.jpa.core.context.AccessType; import org.eclipse.jpt.jpa.core.context.PersistentType; import org.eclipse.jpt.jpa.core.context.java.JarFile; +import org.eclipse.jpt.jpa.core.context.java.JavaManagedType; +import org.eclipse.jpt.jpa.core.context.java.JavaManagedTypeDefinition; import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType; import org.eclipse.jpt.jpa.core.context.persistence.JarFileRef; +import org.eclipse.jpt.jpa.core.internal.context.java.JavaPersistentTypeDefinition; import org.eclipse.jpt.jpa.core.internal.context.persistence.AbstractPersistenceXmlContextNode; import org.eclipse.wst.validation.internal.provisional.core.IMessage; import org.eclipse.wst.validation.internal.provisional.core.IReporter; @@ -39,7 +43,7 @@ public class GenericJarFile { protected final JavaResourcePackageFragmentRoot jarResourcePackageFragmentRoot; - protected final ContextCollectionContainer<JavaPersistentType, JavaResourceType> javaPersistentTypeContainer; + protected final ContextCollectionContainer<JavaManagedType, JavaResourceType> javaManagedTypeContainer; // ********** constructor/initialization ********** @@ -47,7 +51,7 @@ public class GenericJarFile public GenericJarFile(JarFileRef parent, JavaResourcePackageFragmentRoot jarResourcePackageFragmentRoot) { super(parent); this.jarResourcePackageFragmentRoot = jarResourcePackageFragmentRoot; - this.javaPersistentTypeContainer = this.buildJavaPersistentTypeContainer(); + this.javaManagedTypeContainer = this.buildJavaManagedTypeContainer(); } @@ -56,13 +60,13 @@ public class GenericJarFile @Override public void synchronizeWithResourceModel() { super.synchronizeWithResourceModel(); - this.syncJavaPersistentTypes(); + this.syncJavaManagedTypes(); } @Override public void update() { super.update(); - this.updateNodes(this.getJavaPersistentTypes()); + this.updateNodes(this.getJavaManagedTypes()); } public JavaResourcePackageFragmentRoot getJarResourcePackageFragmentRoot() { @@ -78,35 +82,35 @@ public class GenericJarFile } - // ********** Java persistent types ********** + // ********** Java managed types ********** - public JavaPersistentType getPersistentType(String typeName) { - for (JavaPersistentType pt : this.getJavaPersistentTypes()) { - if (pt.getName().equals(typeName)) { - return pt; + public JavaManagedType getManagedType(String typeName) { + for (JavaManagedType mt : this.getJavaManagedTypes()) { + if (mt.getName().equals(typeName)) { + return mt; } } return null; } - public Iterable<JavaPersistentType> getJavaPersistentTypes() { - return this.javaPersistentTypeContainer.getContextElements(); + public Iterable<JavaManagedType> getJavaManagedTypes() { + return this.javaManagedTypeContainer.getContextElements(); } - public int getJavaPersistentTypesSize() { - return this.javaPersistentTypeContainer.getContextElementsSize(); + public int getJavaManagedTypesSize() { + return this.javaManagedTypeContainer.getContextElementsSize(); } - protected void syncJavaPersistentTypes() { - this.javaPersistentTypeContainer.synchronizeWithResourceModel(); + protected void syncJavaManagedTypes() { + this.javaManagedTypeContainer.synchronizeWithResourceModel(); } - protected void addJavaPersistentType(JavaResourceType jrt) { - this.javaPersistentTypeContainer.addContextElement(getJavaPersistentTypesSize(), jrt); + protected void addJavaManagedType(JavaResourceType jrt) { + this.javaManagedTypeContainer.addContextElement(getJavaManagedTypesSize(), jrt); } - protected void removeJavaPersistentType(JavaPersistentType javaPersistentType ) { - this.javaPersistentTypeContainer.removeContextElement(javaPersistentType); + protected void removeJavaManagedType(JavaManagedType javaManagedType) { + this.javaManagedTypeContainer.removeContextElement(javaManagedType); } //only accept types, enums aren't valid for JPA @@ -127,47 +131,85 @@ public class GenericJarFile return this.jarResourcePackageFragmentRoot.getTypes(); } - protected JavaPersistentType buildJavaPersistentType(JavaResourceType jrt) { - return this.getJpaFactory().buildJavaPersistentType(this, jrt); + protected JavaManagedType buildJavaManagedType(JavaResourceType jrt, JavaManagedTypeDefinition managedTypeDefinition) { + return managedTypeDefinition.buildContextManagedType(this, jrt, this.getJpaFactory()); + } + + protected Iterable<JavaManagedTypeDefinition> getJavaManagedTypeDefinitions() { + return this.getJpaPlatform().getJavaManagedTypeDefinitions(); + } + + protected JavaManagedTypeDefinition getJavaManagedTypeDefinition(JavaResourceType jrt) { + for (JavaManagedTypeDefinition managedTypeDefinition : this.getJavaManagedTypeDefinitions()) { + if (jrt.isAnnotatedWithAnyOf(managedTypeDefinition.getAnnotationNames(this.getJpaProject()))) { + return managedTypeDefinition; + } + } + return JavaPersistentTypeDefinition.instance(); + } + + protected JavaManagedType buildJavaManagedType(JavaResourceType jrt) { + return getJavaManagedTypeDefinition(jrt).buildContextManagedType(this, jrt, getJpaFactory()); } - protected ContextCollectionContainer<JavaPersistentType, JavaResourceType> buildJavaPersistentTypeContainer() { - JavaPersistentTypeContainer container = new JavaPersistentTypeContainer(); + protected ContextCollectionContainer<JavaManagedType, JavaResourceType> buildJavaManagedTypeContainer() { + JavaManagedTypeContainer container = new JavaManagedTypeContainer(); container.initialize(); return container; } /** - * Java persistent type container + * Java managed type container */ - protected class JavaPersistentTypeContainer - extends ContextCollectionContainer<JavaPersistentType, JavaResourceType> + protected class JavaManagedTypeContainer + extends ContextCollectionContainer<JavaManagedType, JavaResourceType> { @Override protected String getContextElementsPropertyName() { - return JAVA_PERSISTENT_TYPES_COLLECTION; + return JAVA_MANAGED_TYPES_COLLECTION; } @Override - protected JavaPersistentType buildContextElement(JavaResourceType resourceElement) { - return GenericJarFile.this.buildJavaPersistentType(resourceElement); + protected JavaManagedType buildContextElement(JavaResourceType resourceElement) { + return GenericJarFile.this.buildJavaManagedType(resourceElement); } @Override protected Iterable<JavaResourceType> getResourceElements() { return GenericJarFile.this.getJavaResourceTypes(); } @Override - protected JavaResourceType getResourceElement(JavaPersistentType contextElement) { + protected JavaResourceType getResourceElement(JavaManagedType contextElement) { return contextElement.getJavaResourceType(); } } + // ********** ManagedTypeContainer implementation ********** + + public Iterable<JavaManagedType> getManagedTypes() { + return this.getJavaManagedTypes(); + } + + // ********** PersistentTypeContainer implementation ********** + public JavaPersistentType getPersistentType(String typeName) { + JavaManagedType managedType = this.getManagedType(typeName); + return managedType.getType() == JavaPersistentType.class ? (JavaPersistentType) managedType : null; + } + public Iterable<JavaPersistentType> getPersistentTypes() { - return this.getJavaPersistentTypes(); + return IterableTools.downCast(IterableTools.filter( + this.getManagedTypes(), + JAVA_PERSISTENT_TYPE_FILTER)); } + protected static final Filter<JavaManagedType> JAVA_PERSISTENT_TYPE_FILTER = + new Filter<JavaManagedType>() { + public boolean accept(JavaManagedType mt) { + return mt.getType() == JavaPersistentType.class; + } + }; + // ********** PersistentType.Owner implementation ********** @@ -203,7 +245,7 @@ public class GenericJarFile @Override public void validate(List<IMessage> messages, IReporter reporter) { super.validate(messages, reporter); - // TODO validate 'javaPersistentTypes' + // TODO validate 'javaManagedTypes' } public boolean isIn(org.eclipse.core.resources.IFolder folder) { diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/orm/GenericOrmPersistentAttribute.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/orm/GenericOrmPersistentAttribute.java index 98e66e60d6..2713e45151 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/orm/GenericOrmPersistentAttribute.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/orm/GenericOrmPersistentAttribute.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2012 Oracle. All rights reserved. + * Copyright (c) 2006, 2013 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. @@ -45,7 +45,7 @@ public class GenericOrmPersistentAttribute JptJpaCoreValidationMessages.PERSISTENT_ATTRIBUTE_INHERITED_ATTRIBUTES_NOT_SUPPORTED, new String[] { this.getName(), - this.getOwningPersistentType().getMapping().getClass_() + this.getOwningPersistentType().getClass_() }, this.mapping, this.mapping.getNameTextRange() diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/orm/GenericOrmXml.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/orm/GenericOrmXml.java index e3b3f17e81..5f30c135f2 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/orm/GenericOrmXml.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/orm/GenericOrmXml.java @@ -25,10 +25,12 @@ import org.eclipse.jpt.common.utility.internal.iterable.IterableTools; import org.eclipse.jpt.jpa.core.JpaFile; import org.eclipse.jpt.jpa.core.JpaStructureNode; import org.eclipse.jpt.jpa.core.context.Generator; +import org.eclipse.jpt.jpa.core.context.ManagedType; import org.eclipse.jpt.jpa.core.context.MappingFile; import org.eclipse.jpt.jpa.core.context.Query; import org.eclipse.jpt.jpa.core.context.XmlFile; import org.eclipse.jpt.jpa.core.context.orm.EntityMappings; +import org.eclipse.jpt.jpa.core.context.orm.OrmManagedType; import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType; import org.eclipse.jpt.jpa.core.context.orm.OrmXml; import org.eclipse.jpt.jpa.core.context.orm.OrmXmlDefinition; @@ -298,6 +300,17 @@ public class GenericOrmXml } + // ********** ManagedTypeContainer implementation ********** + + public Iterable<OrmManagedType> getManagedTypes() { + return (this.root != null) ? this.root.getManagedTypes() : EmptyIterable.<OrmManagedType>instance(); + } + + public ManagedType getManagedType(String typeName) { + return (this.root == null) ? null : this.root.getManagedType(typeName); + } + + // ********** refactoring ********** public Iterable<DeleteEdit> createDeleteTypeEdits(IType type) { diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/persistence/GenericClassRef.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/persistence/GenericClassRef.java index 14ef346f45..fd1913f732 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/persistence/GenericClassRef.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa1/context/persistence/GenericClassRef.java @@ -24,10 +24,14 @@ import org.eclipse.jpt.common.utility.internal.iterable.IterableTools; import org.eclipse.jpt.jpa.core.JpaFile; import org.eclipse.jpt.jpa.core.JpaStructureNode; import org.eclipse.jpt.jpa.core.context.AccessType; +import org.eclipse.jpt.jpa.core.context.ManagedType; +import org.eclipse.jpt.jpa.core.context.java.JavaManagedType; +import org.eclipse.jpt.jpa.core.context.java.JavaManagedTypeDefinition; import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType; import org.eclipse.jpt.jpa.core.context.persistence.ClassRef; import org.eclipse.jpt.jpa.core.context.persistence.MappingFileRef; import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit; +import org.eclipse.jpt.jpa.core.internal.context.java.JavaPersistentTypeDefinition; import org.eclipse.jpt.jpa.core.internal.context.persistence.AbstractPersistenceXmlContextNode; import org.eclipse.jpt.jpa.core.internal.plugin.JptJpaCorePlugin; import org.eclipse.jpt.jpa.core.internal.validation.DefaultJpaValidationMessages; @@ -55,11 +59,11 @@ public class GenericClassRef protected String className; /** - * The Java persistent type corresponding to the ref's class name; + * The Java managed type corresponding to the ref's class name; * this can be <code>null</code> if the className is invalid or * refers to an enum instead of a class or interface. */ - protected JavaPersistentType javaPersistentType; + protected JavaManagedType javaManagedType; /** * Hold on to this for validation if the resourceType is not of type {@link AstNodeType#TYPE} @@ -76,7 +80,7 @@ public class GenericClassRef super(parent); this.xmlJavaClassRef = xmlJavaClassRef; this.className = xmlJavaClassRef.getJavaClass(); - this.initializeJavaPersistentType(this.resolveJavaResourceType()); + this.initializeJavaManagedType(this.resolveJavaResourceType()); } /** @@ -87,13 +91,13 @@ public class GenericClassRef super(parent); this.xmlJavaClassRef = null; this.className = resourceType.getTypeBinding().getQualifiedName(); - this.initializeJavaPersistentType(resourceType); + this.initializeJavaManagedType(resourceType); } - protected void initializeJavaPersistentType(JavaResourceAbstractType jrat) { + protected void initializeJavaManagedType(JavaResourceAbstractType jrat) { this.resourceType = jrat; if (this.resourceType != null && this.resourceType.getAstNodeType() == AstNodeType.TYPE) { - this.javaPersistentType = this.buildJavaPersistentType((JavaResourceType) this.resourceType); + this.javaManagedType = this.buildJavaManagedType((JavaResourceType) this.resourceType); } } @@ -109,20 +113,21 @@ public class GenericClassRef // the name probably never changes... this.setClassName_(this.xmlJavaClassRef.getJavaClass()); } - if (this.javaPersistentType != null) { - this.javaPersistentType.synchronizeWithResourceModel(); + if (this.javaManagedType != null) { + this.javaManagedType.synchronizeWithResourceModel(); } } @Override public void update() { super.update(); - this.updateJavaPersistentType(); + this.updateJavaManagedType(); } public void gatherRootStructureNodes(JpaFile jpaFile, Collection<JpaStructureNode> rootStructureNodes) { - if (this.javaPersistentType != null) { - this.javaPersistentType.gatherRootStructureNodes(jpaFile, rootStructureNodes); + JavaPersistentType javaPersistentType = this.getJavaPersistentType(); + if (javaPersistentType != null) { + javaPersistentType.gatherRootStructureNodes(jpaFile, rootStructureNodes); } } @@ -160,45 +165,68 @@ public class GenericClassRef } - // ********** java persistent type ********** + // ********** Java managed type ********** - public JavaPersistentType getJavaPersistentType() { - return this.javaPersistentType; + public JavaManagedType getJavaManagedType() { + return this.javaManagedType; } - protected void setJavaPersistentType(JavaPersistentType javaPersistentType) { - JavaPersistentType old = this.javaPersistentType; - this.javaPersistentType = javaPersistentType; - this.firePropertyChanged(JAVA_PERSISTENT_TYPE_PROPERTY, old, javaPersistentType); + protected void setJavaManagedType(JavaManagedType managedType) { + ManagedType old = this.javaManagedType; + this.javaManagedType = managedType; + this.firePropertyChanged(JAVA_MANAGED_TYPE_PROPERTY, old, managedType); } - protected void updateJavaPersistentType() { + protected void updateJavaManagedType() { this.resourceType = this.resolveJavaResourceType(); if (this.resourceType == null || this.resourceType.getAstNodeType() != AstNodeType.TYPE) { - if (this.javaPersistentType != null) { - this.setJavaPersistentType(null); + if (this.javaManagedType != null) { + this.setJavaManagedType(null); } } else { JavaResourceType jrt = (JavaResourceType) this.resourceType; - if (this.javaPersistentType == null) { - this.setJavaPersistentType(this.buildJavaPersistentType(jrt)); + JavaManagedTypeDefinition managedTypeDefinition = this.getJavaManagedTypeDefinition(jrt); + if (this.javaManagedType == null) { + this.setJavaManagedType(this.buildJavaManagedType(jrt, managedTypeDefinition)); } else { - if (this.javaPersistentType.getJavaResourceType() == jrt) { - this.javaPersistentType.update(); + if (this.javaManagedType.getType() == managedTypeDefinition.getType()) { + this.javaManagedType.update(); } else { - this.setJavaPersistentType(this.buildJavaPersistentType(jrt)); + this.setJavaManagedType(this.buildJavaManagedType(jrt, managedTypeDefinition)); } } } } + public JavaPersistentType getJavaPersistentType() { + return this.javaManagedType == null ? null : + this.javaManagedType.getType() == JavaPersistentType.class ? (JavaPersistentType) this.javaManagedType : null; + } + protected JavaResourceAbstractType resolveJavaResourceType() { String javaClassName = this.getJavaClassName(); return (javaClassName == null) ? null : this.getJpaProject().getJavaResourceType(javaClassName); } - protected JavaPersistentType buildJavaPersistentType(JavaResourceType jrt) { - return this.getJpaFactory().buildJavaPersistentType(this, jrt); + protected JavaManagedType buildJavaManagedType(JavaResourceType jrt) { + return this.buildJavaManagedType(jrt, this.getJavaManagedTypeDefinition(jrt)); + } + + protected JavaManagedType buildJavaManagedType(JavaResourceType jrt, JavaManagedTypeDefinition managedTypeDefinition) { + return managedTypeDefinition.buildContextManagedType(this, jrt, this.getJpaFactory()); + } + + protected Iterable<JavaManagedTypeDefinition> getJavaManagedTypeDefinitions() { + return this.getJpaPlatform().getJavaManagedTypeDefinitions(); + } + + protected JavaManagedTypeDefinition getJavaManagedTypeDefinition(JavaResourceType jrt) { + for (JavaManagedTypeDefinition managedTypeDefinition : this.getJavaManagedTypeDefinitions()) { + if (jrt.isAnnotatedWithAnyOf(managedTypeDefinition.getAnnotationNames(this.getJpaProject()))) { + return managedTypeDefinition; + } + } + return JavaPersistentTypeDefinition.instance(); } @@ -401,15 +429,15 @@ public class GenericClassRef } } - if (this.javaPersistentType == null) { + if (this.javaManagedType == null) { return; } // 190062 validate Java class only if this is the only reference to it // i.e. the persistence.xml ref is the only ref - none of the mapping // files reference the same class - boolean validateJavaPersistentType = true; + boolean validateJavaManagedType = true; for (MappingFileRef mappingFileRef : this.getPersistenceUnit().getMappingFileRefsContaining(this.getJavaClassName())) { - validateJavaPersistentType = false; + validateJavaManagedType = false; messages.add( DefaultJpaValidationMessages.buildMessage( IMessage.LOW_SEVERITY, @@ -421,14 +449,14 @@ public class GenericClassRef ); } - if (validateJavaPersistentType) { - this.validateJavaPersistentType(messages, reporter); + if (validateJavaManagedType) { + this.validateJavaManagedType(messages, reporter); } } - protected void validateJavaPersistentType(List<IMessage> messages, IReporter reporter) { + protected void validateJavaManagedType(List<IMessage> messages, IReporter reporter) { try { - this.javaPersistentType.validate(messages, reporter); + this.javaManagedType.validate(messages, reporter); } catch (Throwable t) { JptJpaCorePlugin.instance().logError(t); } diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2/context/orm/GenericOrmXml2_1Definition.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2/context/orm/GenericOrmXml2_1Definition.java index 77789952ae..80d29ac945 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2/context/orm/GenericOrmXml2_1Definition.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2/context/orm/GenericOrmXml2_1Definition.java @@ -1,5 +1,5 @@ /*******************************************************************************
- * Copyright (c) 2012 Oracle. All rights reserved.
+ * Copyright (c) 2012, 2013 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.
@@ -10,12 +10,12 @@ package org.eclipse.jpt.jpa.core.internal.jpa2.context.orm;
import java.util.ArrayList;
-
import org.eclipse.emf.ecore.EFactory;
import org.eclipse.jpt.common.core.JptResourceType;
import org.eclipse.jpt.common.utility.internal.collection.CollectionTools;
import org.eclipse.jpt.jpa.core.context.orm.NullOrmAttributeMappingDefinition;
import org.eclipse.jpt.jpa.core.context.orm.OrmAttributeMappingDefinition;
+import org.eclipse.jpt.jpa.core.context.orm.OrmManagedTypeDefinition;
import org.eclipse.jpt.jpa.core.context.orm.OrmXmlContextNodeFactory;
import org.eclipse.jpt.jpa.core.context.orm.OrmXmlDefinition;
import org.eclipse.jpt.jpa.core.internal.context.orm.AbstractOrmXmlDefinition;
@@ -27,8 +27,12 @@ import org.eclipse.jpt.jpa.core.internal.context.orm.OrmManyToManyMappingDefinit import org.eclipse.jpt.jpa.core.internal.context.orm.OrmManyToOneMappingDefinition;
import org.eclipse.jpt.jpa.core.internal.context.orm.OrmOneToManyMappingDefinition;
import org.eclipse.jpt.jpa.core.internal.context.orm.OrmOneToOneMappingDefinition;
+import org.eclipse.jpt.jpa.core.internal.context.orm.OrmPersistentTypeDefinition;
import org.eclipse.jpt.jpa.core.internal.context.orm.OrmTransientMappingDefinition;
import org.eclipse.jpt.jpa.core.internal.context.orm.OrmVersionMappingDefinition;
+import org.eclipse.jpt.jpa.core.internal.jpa2_1.Generic2_1JpaPlatformProvider;
+import org.eclipse.jpt.jpa.core.internal.jpa2_1.context.orm.GenericOrmXml2_1ContextNodeFactory;
+import org.eclipse.jpt.jpa.core.internal.jpa2_1.context.orm.OrmConverterTypeDefinition;
import org.eclipse.jpt.jpa.core.resource.orm.OrmFactory;
import org.eclipse.jpt.jpa.core.resource.orm.XmlEntityMappings;
import org.eclipse.jpt.jpa.core.resource.orm.v2_1.JPA2_1;
@@ -64,9 +68,21 @@ public class GenericOrmXml2_1Definition @Override
protected OrmXmlContextNodeFactory buildContextNodeFactory() {
- return new GenericOrmXml2_0ContextNodeFactory();
+ return new GenericOrmXml2_1ContextNodeFactory();
}
+ // ********* Managed Types *********
+
+ @Override
+ protected void addManagedTypeDefinitionsTo(ArrayList<OrmManagedTypeDefinition> definitions) {
+ CollectionTools.addAll(definitions, MANAGED_TYPE_DEFINITIONS_2_1);
+ }
+
+ protected static final OrmManagedTypeDefinition[] MANAGED_TYPE_DEFINITIONS_2_1 = new OrmManagedTypeDefinition[] {
+ OrmPersistentTypeDefinition.instance(),
+ OrmConverterTypeDefinition.instance(),
+ };
+
@Override
protected void addAttributeMappingDefinitionsTo(ArrayList<OrmAttributeMappingDefinition> definitions) {
CollectionTools.addAll(definitions, ATTRIBUTE_MAPPING_DEFINITIONS);
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/Generic2_1JpaPlatformFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/Generic2_1JpaPlatformFactory.java index 8b698f1b70..14e247a7c0 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/Generic2_1JpaPlatformFactory.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/Generic2_1JpaPlatformFactory.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2012 Oracle. All rights reserved. + * Copyright (c) 2012, 2013 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. @@ -17,7 +17,6 @@ import org.eclipse.jpt.jpa.core.context.AccessType; import org.eclipse.jpt.jpa.core.internal.GenericJpaPlatform; import org.eclipse.jpt.jpa.core.internal.GenericJpaPlatformFactory.GenericJpaPlatformVersion; import org.eclipse.jpt.jpa.core.internal.JpaAnnotationProvider; -import org.eclipse.jpt.jpa.core.internal.jpa2.GenericJpaFactory2_0; import org.eclipse.jpt.jpa.core.jpa2_1.JpaProject2_1; import org.eclipse.persistence.jpa.jpql.parser.JPQLGrammar2_1; @@ -41,7 +40,7 @@ public class Generic2_1JpaPlatformFactory return new GenericJpaPlatform( config, this.buildJpaVersion(), - new GenericJpaFactory2_0(), + new GenericJpaFactory2_1(), new JpaAnnotationProvider(Generic2_1JpaAnnotationDefinitionProvider.instance()), Generic2_1JpaPlatformProvider.instance(), this.buildJpaPlatformVariation(), @@ -66,4 +65,4 @@ public class Generic2_1JpaPlatformFactory } }; } -}
\ No newline at end of file +} diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/Generic2_1JpaPlatformProvider.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/Generic2_1JpaPlatformProvider.java index a7223385c4..ba9654a79f 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/Generic2_1JpaPlatformProvider.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/Generic2_1JpaPlatformProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2012 Oracle. All rights reserved. + * Copyright (c) 2012, 2013 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. @@ -17,6 +17,7 @@ import org.eclipse.jpt.jpa.core.JpaResourceModelProvider; import org.eclipse.jpt.jpa.core.ResourceDefinition; import org.eclipse.jpt.jpa.core.context.java.DefaultJavaAttributeMappingDefinition; import org.eclipse.jpt.jpa.core.context.java.JavaAttributeMappingDefinition; +import org.eclipse.jpt.jpa.core.context.java.JavaManagedTypeDefinition; import org.eclipse.jpt.jpa.core.context.java.JavaTypeMappingDefinition; import org.eclipse.jpt.jpa.core.internal.AbstractJpaPlatformProvider; import org.eclipse.jpt.jpa.core.internal.JarResourceModelProvider; @@ -24,6 +25,7 @@ import org.eclipse.jpt.jpa.core.internal.JavaResourceModelProvider; import org.eclipse.jpt.jpa.core.internal.OrmResourceModelProvider; import org.eclipse.jpt.jpa.core.internal.PersistenceResourceModelProvider; import org.eclipse.jpt.jpa.core.internal.context.java.JarDefinition; +import org.eclipse.jpt.jpa.core.internal.context.java.JavaPersistentTypeDefinition; import org.eclipse.jpt.jpa.core.internal.context.java.JavaSourceFileDefinition; import org.eclipse.jpt.jpa.core.internal.context.java.JavaTransientMappingDefinition; import org.eclipse.jpt.jpa.core.internal.jpa1.context.orm.GenericOrmXmlDefinition; @@ -45,6 +47,7 @@ import org.eclipse.jpt.jpa.core.internal.jpa2.context.orm.GenericOrmXml2_0Defini import org.eclipse.jpt.jpa.core.internal.jpa2.context.orm.GenericOrmXml2_1Definition; import org.eclipse.jpt.jpa.core.internal.jpa2.context.persistence.GenericPersistenceXml2_0Definition; import org.eclipse.jpt.jpa.core.internal.jpa2.context.persistence.GenericPersistenceXml2_1Definition; +import org.eclipse.jpt.jpa.core.internal.jpa2_1.context.java.JavaConverterTypeDefinition; /** * All the state in the JPA platform should be "static" (i.e. unchanging once @@ -100,6 +103,25 @@ public class Generic2_1JpaPlatformProvider }; + // ********* Java managed types ********* + + /** + * To the specified list, add java managed type definitions to use for + * analyzing the type given all annotations on it. The order is + * important, as once a managed type definition tests positive for a + * type, all following managed type definitions are ignored. + */ + @Override + protected void addJavaManagedTypeDefinitionsTo(ArrayList<JavaManagedTypeDefinition> definitions) { + CollectionTools.addAll(definitions, JAVA_MANAGED_TYPE_DEFINITIONS_2_1); + } + + protected static final JavaManagedTypeDefinition[] JAVA_MANAGED_TYPE_DEFINITIONS_2_1 = new JavaManagedTypeDefinition[] { + JavaPersistentTypeDefinition.instance(), + JavaConverterTypeDefinition.instance() + }; + + // ********** Java type mappings ********** @Override diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/GenericJpaFactory2_1.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/GenericJpaFactory2_1.java new file mode 100644 index 0000000000..7662d2977b --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/GenericJpaFactory2_1.java @@ -0,0 +1,36 @@ +/*******************************************************************************
+ * Copyright (c) 2013 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.jpa.core.internal.jpa2_1;
+
+import org.eclipse.jpt.common.core.resource.java.JavaResourceType;
+import org.eclipse.jpt.jpa.core.context.JpaContextNode;
+import org.eclipse.jpt.jpa.core.internal.jpa2.GenericJpaFactory2_0;
+import org.eclipse.jpt.jpa.core.internal.jpa2_1.context.java.GenericJavaConverterType;
+import org.eclipse.jpt.jpa.core.jpa2_1.JpaFactory2_1;
+import org.eclipse.jpt.jpa.core.jpa2_1.context.java.JavaConverterType2_1;
+
+
+/**
+ * Central class that allows extenders to easily replace implementations of
+ * various Dali interfaces.
+ */
+public class GenericJpaFactory2_1
+ extends GenericJpaFactory2_0
+ implements JpaFactory2_1
+{
+
+ public GenericJpaFactory2_1() {
+ super();
+ }
+
+ public JavaConverterType2_1 buildJavaConverterType(JpaContextNode parent, JavaResourceType jrt) {
+ return new GenericJavaConverterType(parent, jrt);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/context/java/GenericJavaConverterType.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/context/java/GenericJavaConverterType.java new file mode 100644 index 0000000000..3b4ffd8cda --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/context/java/GenericJavaConverterType.java @@ -0,0 +1,99 @@ +/*******************************************************************************
+ * Copyright (c) 2013 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.jpa.core.internal.jpa2_1.context.java;
+
+import org.eclipse.jpt.common.core.resource.java.JavaResourceType;
+import org.eclipse.jpt.jpa.core.context.JpaContextNode;
+import org.eclipse.jpt.jpa.core.internal.context.java.AbstractJavaManagedType;
+import org.eclipse.jpt.jpa.core.jpa2_1.context.java.JavaConverterType2_1;
+import org.eclipse.jpt.jpa.core.jpa2_1.resource.java.Converter2_1Annotation;
+
+public class GenericJavaConverterType extends AbstractJavaManagedType
+ implements JavaConverterType2_1
+{
+
+ protected boolean autoApply;
+
+ protected Boolean specifiedAutoApply;
+
+ public GenericJavaConverterType(JpaContextNode parent, JavaResourceType resourceType) {
+ super(parent, resourceType);
+ this.specifiedAutoApply = this.buildSpecifiedAutoApply();
+ this.autoApply = this.buildAutoApply();
+ }
+
+ @Override
+ public void synchronizeWithResourceModel() {
+ super.synchronizeWithResourceModel();
+ this.setSpecifiedAutoApply_(this.buildSpecifiedAutoApply());
+ this.setAutoApply(this.buildAutoApply());
+ }
+
+ @Override
+ public void update() {
+ super.update();
+ }
+
+
+ // ********** auto apply **********
+
+ public boolean isAutoApply() {
+ return this.autoApply;
+ }
+
+ protected void setAutoApply(boolean autoApply) {
+ boolean old = this.autoApply;
+ this.autoApply = autoApply;
+ firePropertyChanged(AUTO_APPLY_PROPERTY, old, autoApply);
+ }
+
+ protected boolean buildAutoApply() {
+ return this.specifiedAutoApply == null ? this.isDefaultAutoApply() : this.specifiedAutoApply.booleanValue();
+ }
+
+ public boolean isDefaultAutoApply() {
+ return DEFAULT_AUTO_APPLY;
+ }
+
+ public Boolean getSpecifiedAutoApply() {
+ return this.specifiedAutoApply;
+ }
+
+ public void setSpecifiedAutoApply(Boolean autoApply) {
+ this.getConverterAnnotation().setAutoApply(autoApply);
+ this.setSpecifiedAutoApply_(autoApply);
+ }
+
+ protected void setSpecifiedAutoApply_(Boolean autoApply) {
+ Boolean old = this.specifiedAutoApply;
+ this.specifiedAutoApply = autoApply;
+ this.firePropertyChanged(SPECIFIED_AUTO_APPLY_PROPERTY, old, autoApply);
+ }
+
+ protected Boolean buildSpecifiedAutoApply() {
+ Converter2_1Annotation converterAnnotation = this.getConverterAnnotation();
+ return converterAnnotation != null ? converterAnnotation.getAutoApply() : null;
+ }
+
+
+ // ********** converter annotation **********
+
+ protected Converter2_1Annotation getConverterAnnotation() {
+ return (Converter2_1Annotation) this.resourceType.getAnnotation(Converter2_1Annotation.ANNOTATION_NAME);
+ }
+
+
+ // ********** ManagedType implementation **********
+
+ public Class<JavaConverterType2_1> getType() {
+ return JavaConverterType2_1.class;
+ }
+
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/context/java/JavaConverterTypeDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/context/java/JavaConverterTypeDefinition.java new file mode 100644 index 0000000000..e9c94e3968 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/context/java/JavaConverterTypeDefinition.java @@ -0,0 +1,52 @@ +/*******************************************************************************
+ * Copyright (c) 2013 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.jpa.core.internal.jpa2_1.context.java;
+
+import org.eclipse.jpt.common.core.resource.java.JavaResourceType;
+import org.eclipse.jpt.common.utility.internal.iterable.IterableTools;
+import org.eclipse.jpt.jpa.core.JpaFactory;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.context.JpaContextNode;
+import org.eclipse.jpt.jpa.core.context.java.JavaManagedTypeDefinition;
+import org.eclipse.jpt.jpa.core.jpa2_1.JpaFactory2_1;
+import org.eclipse.jpt.jpa.core.jpa2_1.context.java.JavaConverterType2_1;
+import org.eclipse.jpt.jpa.core.jpa2_1.resource.java.Converter2_1Annotation;
+
+public class JavaConverterTypeDefinition implements JavaManagedTypeDefinition
+{
+ // singleton
+ private static final JavaManagedTypeDefinition INSTANCE = new JavaConverterTypeDefinition();
+
+ /**
+ * Return the singleton.
+ */
+ public static JavaManagedTypeDefinition instance() {
+ return INSTANCE;
+ }
+
+ /**
+ * Enforce singleton usage
+ */
+ private JavaConverterTypeDefinition() {
+ super();
+ }
+
+ public Class<? extends JavaConverterType2_1> getType() {
+ return JavaConverterType2_1.class;
+ }
+
+ public Iterable<String> getAnnotationNames(JpaProject jpaProject) {
+ return IterableTools.singletonIterable(Converter2_1Annotation.ANNOTATION_NAME);
+ }
+
+ public JavaConverterType2_1 buildContextManagedType(JpaContextNode parent, JavaResourceType jrt, JpaFactory factory) {
+ return ((JpaFactory2_1) factory).buildJavaConverterType(parent, jrt);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/context/orm/GenericOrmConverterType.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/context/orm/GenericOrmConverterType.java new file mode 100644 index 0000000000..1afbfd29e6 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/context/orm/GenericOrmConverterType.java @@ -0,0 +1,124 @@ +/*******************************************************************************
+ * Copyright (c) 2013 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.jpa.core.internal.jpa2_1.context.orm;
+
+import org.eclipse.jpt.common.core.resource.java.JavaResourceType;
+import org.eclipse.jpt.jpa.core.context.java.JavaManagedType;
+import org.eclipse.jpt.jpa.core.internal.context.orm.AbstractOrmManagedType;
+import org.eclipse.jpt.jpa.core.jpa2_1.context.orm.EntityMappings2_1;
+import org.eclipse.jpt.jpa.core.jpa2_1.context.orm.OrmConverterType2_1;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlEntityMappings;
+import org.eclipse.jpt.jpa.core.resource.orm.v2_1.XmlConverter_2_1;
+
+public class GenericOrmConverterType extends AbstractOrmManagedType
+ implements OrmConverterType2_1
+{
+ protected boolean autoApply;
+
+ protected Boolean specifiedAutoApply;
+
+ public GenericOrmConverterType(EntityMappings2_1 parent, XmlConverter_2_1 xmlConverter) {
+ super(parent, xmlConverter);
+ this.specifiedAutoApply = this.buildSpecifiedAutoApply();
+ this.autoApply = this.buildAutoApply();
+ }
+
+ @Override
+ public void synchronizeWithResourceModel() {
+ super.synchronizeWithResourceModel();
+ this.setSpecifiedAutoApply_(this.buildSpecifiedAutoApply());
+ this.setAutoApply(this.buildAutoApply());
+ }
+
+ @Override
+ public void update() {
+ super.update();
+ }
+
+ @Override
+ public XmlConverter_2_1 getXmlManagedType() {
+ return (XmlConverter_2_1) super.getXmlManagedType();
+ }
+
+ public XmlConverter_2_1 getXmlConverter() {
+ return this.getXmlManagedType();
+ }
+
+
+ // ********** auto apply **********
+
+ public boolean isAutoApply() {
+ return this.autoApply;
+ }
+
+ protected void setAutoApply(boolean autoApply) {
+ boolean old = this.autoApply;
+ this.autoApply = autoApply;
+ firePropertyChanged(AUTO_APPLY_PROPERTY, old, autoApply);
+ }
+
+ protected boolean buildAutoApply() {
+ return this.specifiedAutoApply == null ? this.isDefaultAutoApply() : this.specifiedAutoApply.booleanValue();
+ }
+
+ public boolean isDefaultAutoApply() {
+ return DEFAULT_AUTO_APPLY;
+ }
+
+ public Boolean getSpecifiedAutoApply() {
+ return this.specifiedAutoApply;
+ }
+
+ public void setSpecifiedAutoApply(Boolean autoApply) {
+ this.setSpecifiedAutoApply_(autoApply);
+ this.getXmlConverter().setAutoApply(autoApply);
+ }
+
+ protected void setSpecifiedAutoApply_(Boolean autoApply) {
+ Boolean old = this.specifiedAutoApply;
+ this.specifiedAutoApply = autoApply;
+ this.firePropertyChanged(SPECIFIED_AUTO_APPLY_PROPERTY, old, autoApply);
+ }
+
+ protected Boolean buildSpecifiedAutoApply() {
+ return this.getXmlConverter().getAutoApply();
+ }
+
+
+ // ********** JpaStructureNode implementation **********
+
+ public Class<OrmConverterType2_1> getType() {
+ return OrmConverterType2_1.class;
+ }
+
+ public void dispose() {
+ //do nothing
+ }
+
+
+ // ********** OrmManagedType implementation **********
+
+ public int getXmlSequence() {
+ return 4;
+ }
+
+ public void addXmlManagedTypeTo(XmlEntityMappings entityMappings) {
+ entityMappings.getConverters().add(this.getXmlConverter());
+ }
+
+ public void removeXmlManagedTypeFrom(XmlEntityMappings entityMappings) {
+ entityMappings.getConverters().remove(this.getXmlConverter());
+ }
+
+ @Override
+ protected JavaManagedType buildJavaManagedType(JavaResourceType jrt) {
+ return jrt != null ? this.getJpaFactory2_1().buildJavaConverterType(this, jrt) : null;
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/context/orm/GenericOrmXml2_1ContextNodeFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/context/orm/GenericOrmXml2_1ContextNodeFactory.java new file mode 100644 index 0000000000..57b966fb0e --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/context/orm/GenericOrmXml2_1ContextNodeFactory.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2013 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.jpa.core.internal.jpa2_1.context.orm; + +import org.eclipse.jpt.jpa.core.internal.jpa2.context.orm.GenericOrmXml2_0ContextNodeFactory; +import org.eclipse.jpt.jpa.core.jpa2_1.context.orm.EntityMappings2_1; +import org.eclipse.jpt.jpa.core.jpa2_1.context.orm.OrmConverterType2_1; +import org.eclipse.jpt.jpa.core.jpa2_1.context.orm.OrmXml2_1ContextNodeFactory; +import org.eclipse.jpt.jpa.core.resource.orm.v2_1.XmlConverter_2_1; + +public class GenericOrmXml2_1ContextNodeFactory + extends GenericOrmXml2_0ContextNodeFactory + implements OrmXml2_1ContextNodeFactory +{ + + public OrmConverterType2_1 buildOrmConverter(EntityMappings2_1 parent, XmlConverter_2_1 xmlConverter) { + return new GenericOrmConverterType(parent, xmlConverter); + } +} diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/context/orm/OrmConverterTypeDefinition.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/context/orm/OrmConverterTypeDefinition.java new file mode 100644 index 0000000000..bb22d0ad1d --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/jpa2_1/context/orm/OrmConverterTypeDefinition.java @@ -0,0 +1,53 @@ +/*******************************************************************************
+ * Copyright (c) 2013 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.jpa.core.internal.jpa2_1.context.orm;
+
+import org.eclipse.jpt.jpa.core.context.JpaContextNode;
+import org.eclipse.jpt.jpa.core.context.orm.OrmManagedType;
+import org.eclipse.jpt.jpa.core.context.orm.OrmManagedTypeDefinition;
+import org.eclipse.jpt.jpa.core.context.orm.OrmXmlContextNodeFactory;
+import org.eclipse.jpt.jpa.core.jpa2_1.context.orm.EntityMappings2_1;
+import org.eclipse.jpt.jpa.core.jpa2_1.context.orm.OrmConverterType2_1;
+import org.eclipse.jpt.jpa.core.jpa2_1.context.orm.OrmXml2_1ContextNodeFactory;
+import org.eclipse.jpt.jpa.core.resource.orm.XmlManagedType;
+import org.eclipse.jpt.jpa.core.resource.orm.v2_1.XmlConverter_2_1;
+
+public class OrmConverterTypeDefinition
+ implements OrmManagedTypeDefinition
+{
+ // singleton
+ private static final OrmManagedTypeDefinition INSTANCE = new OrmConverterTypeDefinition();
+
+ /**
+ * Return the singleton.
+ */
+ public static OrmManagedTypeDefinition instance() {
+ return INSTANCE;
+ }
+
+ /**
+ * Enforce singleton usage
+ */
+ private OrmConverterTypeDefinition() {
+ super();
+ }
+
+ public Class<? extends OrmConverterType2_1> getContextType() {
+ return OrmConverterType2_1.class;
+ }
+
+ public Class<? extends XmlManagedType> getResourceType() {
+ return XmlConverter_2_1.class;
+ }
+
+ public OrmManagedType buildContextManagedType(JpaContextNode parent, XmlManagedType resourceManagedType, OrmXmlContextNodeFactory factory) {
+ return ((OrmXml2_1ContextNodeFactory) factory).buildOrmConverter((EntityMappings2_1) parent, (XmlConverter_2_1) resourceManagedType);
+ }
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2_1/JpaFactory2_1.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2_1/JpaFactory2_1.java new file mode 100644 index 0000000000..71001de1d6 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2_1/JpaFactory2_1.java @@ -0,0 +1,34 @@ +/*******************************************************************************
+ * Copyright (c) 2013 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.jpa.core.jpa2_1;
+
+import org.eclipse.jpt.common.core.resource.java.JavaResourceType;
+import org.eclipse.jpt.jpa.core.context.JpaContextNode;
+import org.eclipse.jpt.jpa.core.jpa2.JpaFactory2_0;
+import org.eclipse.jpt.jpa.core.jpa2_1.context.java.JavaConverterType2_1;
+
+/**
+ * JPA 2.1 factory
+ *<p>
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ *
+ * @version 3.3
+ * @since 3.3
+ */
+public interface JpaFactory2_1
+ extends JpaFactory2_0
+{
+
+ JavaConverterType2_1 buildJavaConverterType(JpaContextNode parent, JavaResourceType jrt);
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2_1/context/ConverterType2_1.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2_1/context/ConverterType2_1.java new file mode 100644 index 0000000000..ba2bd5d9dd --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2_1/context/ConverterType2_1.java @@ -0,0 +1,39 @@ +/*******************************************************************************
+ * Copyright (c) 2013 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.jpa.core.jpa2_1.context;
+
+import org.eclipse.jpt.jpa.core.context.ManagedType;
+
+/**
+ * Context converter type.
+ * <p>
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ *
+ * @version 3.3
+ * @since 3.3
+ */
+public interface ConverterType2_1
+ extends ManagedType
+{
+
+ boolean isAutoApply();
+ String AUTO_APPLY_PROPERTY = "autoApply"; //$NON-NLS-1$
+
+ boolean isDefaultAutoApply();
+ boolean DEFAULT_AUTO_APPLY = false;
+
+ Boolean getSpecifiedAutoApply();
+ void setSpecifiedAutoApply(Boolean autoApply);
+ String SPECIFIED_AUTO_APPLY_PROPERTY = "specifiedAutoApply"; //$NON-NLS-1$
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2_1/context/java/JavaConverterType2_1.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2_1/context/java/JavaConverterType2_1.java new file mode 100644 index 0000000000..7d45367060 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2_1/context/java/JavaConverterType2_1.java @@ -0,0 +1,31 @@ +/*******************************************************************************
+ * Copyright (c) 2013 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.jpa.core.jpa2_1.context.java;
+
+import org.eclipse.jpt.jpa.core.context.java.JavaManagedType;
+import org.eclipse.jpt.jpa.core.jpa2_1.context.ConverterType2_1;
+
+/**
+ * Context converter type.
+ * <p>
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ *
+ * @version 3.3
+ * @since 3.3
+ */
+public interface JavaConverterType2_1
+ extends ConverterType2_1, JavaManagedType
+{
+ Class<? extends JavaConverterType2_1> getType();
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2_1/context/orm/EntityMappings2_1.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2_1/context/orm/EntityMappings2_1.java new file mode 100644 index 0000000000..50293f923c --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2_1/context/orm/EntityMappings2_1.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * Copyright (c) 2013 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.jpa.core.jpa2_1.context.orm; + +import org.eclipse.jpt.jpa.core.context.orm.EntityMappings; +import org.eclipse.jpt.jpa.core.resource.orm.XmlEntityMappings; + +/** + * Context model corresponding to the + * XML resource model {@link XmlEntityMappings}, + * which corresponds to the <code>entity-mappings</code> element + * in the 2.1 <code>orm.xml</code> file. + * <p> + * Provisional API: This interface is part of an interim API that is still + * under development and expected to change significantly before reaching + * stability. It is available at this early stage to solicit feedback from + * pioneering adopters on the understanding that any code that uses this API + * will almost certainly be broken (repeatedly) as the API evolves. + * + * @version 3.3 + * @since 3.3 +*/ +public interface EntityMappings2_1 + extends EntityMappings +{ + + Iterable<OrmConverterType2_1> getConverterTypes(); + OrmConverterType2_1 getConverterType(String className); + OrmConverterType2_1 addConverterType(String className); + boolean containsConverterType(String className); +} diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2_1/context/orm/OrmConverterType2_1.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2_1/context/orm/OrmConverterType2_1.java new file mode 100644 index 0000000000..118d2285b8 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2_1/context/orm/OrmConverterType2_1.java @@ -0,0 +1,37 @@ +/*******************************************************************************
+ * Copyright (c) 2013 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.jpa.core.jpa2_1.context.orm;
+
+import org.eclipse.jpt.jpa.core.context.orm.OrmManagedType;
+import org.eclipse.jpt.jpa.core.jpa2_1.context.ConverterType2_1;
+import org.eclipse.jpt.jpa.core.resource.orm.v2_1.XmlConverter_2_1;
+
+/**
+ * Context converter type.
+ * <p>
+ * Provisional API: This interface is part of an interim API that is still
+ * under development and expected to change significantly before reaching
+ * stability. It is available at this early stage to solicit feedback from
+ * pioneering adopters on the understanding that any code that uses this API
+ * will almost certainly be broken (repeatedly) as the API evolves.
+ *
+ * @version 3.3
+ * @since 3.3
+ */
+public interface OrmConverterType2_1
+ extends ConverterType2_1, OrmManagedType
+{
+
+ Class<? extends OrmConverterType2_1> getType();
+
+ XmlConverter_2_1 getXmlConverter();
+
+ XmlConverter_2_1 getXmlManagedType();
+}
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2_1/context/orm/OrmXml2_1ContextNodeFactory.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2_1/context/orm/OrmXml2_1ContextNodeFactory.java new file mode 100644 index 0000000000..db67db810d --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/jpa2_1/context/orm/OrmXml2_1ContextNodeFactory.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (c) 2013 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.jpa.core.jpa2_1.context.orm; + +import org.eclipse.jpt.jpa.core.context.orm.OrmXmlContextNodeFactory; +import org.eclipse.jpt.jpa.core.resource.orm.v2_1.XmlConverter_2_1; + +/** + * JPA 2.1 <code>orm.xml</code> context node factory + * <p> + * Provisional API: This interface is part of an interim API that is still + * under development and expected to change significantly before reaching + * stability. It is available at this early stage to solicit feedback from + * pioneering adopters on the understanding that any code that uses this API + * will almost certainly be broken (repeatedly) as the API evolves. + * + * @version 3.3 + * @since 3.3 + */ +public interface OrmXml2_1ContextNodeFactory + extends OrmXmlContextNodeFactory +{ + OrmConverterType2_1 buildOrmConverter(EntityMappings2_1 parent, XmlConverter_2_1 xmlConverter); +} diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/validation/JptJpaCoreValidationMessages.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/validation/JptJpaCoreValidationMessages.java index db6edd6973..66d27b0ad5 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/validation/JptJpaCoreValidationMessages.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/validation/JptJpaCoreValidationMessages.java @@ -58,10 +58,10 @@ public interface JptJpaCoreValidationMessages { public static final String ENTITY_NO_PK = "ENTITY_NO_PK"; public static final String ENTITY_NON_ROOT_ID_ATTRIBUTE_SPECIFIED = "ENTITY_NON_ROOT_ID_ATTRIBUTE_SPECIFIED"; public static final String ENTITY_NON_ROOT_ID_CLASS_SPECIFIED = "ENTITY_NON_ROOT_ID_CLASS_SPECIFIED"; - public static final String PERSISTENT_TYPE_ANNOTATED_BUT_NOT_INCLUDED_IN_PERSISTENCE_UNIT = "PERSISTENT_TYPE_ANNOTATED_BUT_NOT_INCLUDED_IN_PERSISTENCE_UNIT"; - public static final String PERSISTENT_TYPE_MAPPED_BUT_NOT_INCLUDED_IN_PERSISTENCE_UNIT = "PERSISTENT_TYPE_MAPPED_BUT_NOT_INCLUDED_IN_PERSISTENCE_UNIT"; - public static final String PERSISTENT_TYPE_UNRESOLVED_CLASS = "PERSISTENT_TYPE_UNRESOLVED_CLASS"; - public static final String PERSISTENT_TYPE_UNSPECIFIED_CLASS = "PERSISTENT_TYPE_UNSPECIFIED_CLASS"; + public static final String TYPE_ANNOTATED_BUT_NOT_LISTED_IN_PERSISTENCE_XML = "TYPE_ANNOTATED_BUT_NOT_LISTED_IN_PERSISTENCE_XML"; + public static final String TYPE_MANAGED_BUT_NOT_LISTED_IN_PERSISTENCE_XML = "TYPE_MANAGED_BUT_NOT_LISTED_IN_PERSISTENCE_XML"; + public static final String MANAGED_TYPE_UNRESOLVED_CLASS = "MANAGED_TYPE_UNRESOLVED_CLASS"; + public static final String MANAGED_TYPE_UNSPECIFIED_CLASS = "MANAGED_TYPE_UNSPECIFIED_CLASS"; public static final String TARGET_NOT_AN_EMBEDDABLE = "TARGET_NOT_AN_EMBEDDABLE"; public static final String TYPE_MAPPING_CLASS_MISSING_NO_ARG_CONSTRUCTOR = "TYPE_MAPPING_CLASS_MISSING_NO_ARG_CONSTRUCTOR"; public static final String TYPE_MAPPING_CLASS_PRIVATE_NO_ARG_CONSTRUCTOR = "TYPE_MAPPING_CLASS_PRIVATE_NO_ARG_CONSTRUCTOR"; |