Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlEntityContext.java')
-rw-r--r--jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlEntityContext.java364
1 files changed, 364 insertions, 0 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlEntityContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlEntityContext.java
new file mode 100644
index 0000000000..380d659478
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/XmlEntityContext.java
@@ -0,0 +1,364 @@
+/*******************************************************************************
+ * Copyright (c) 2006 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.core.internal.platform;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import org.eclipse.jpt.core.internal.IMappingKeys;
+import org.eclipse.jpt.core.internal.IPersistentAttribute;
+import org.eclipse.jpt.core.internal.content.java.IJavaTypeMapping;
+import org.eclipse.jpt.core.internal.content.java.mappings.JavaEntity;
+import org.eclipse.jpt.core.internal.content.java.mappings.JavaTable;
+import org.eclipse.jpt.core.internal.content.orm.XmlEntity;
+import org.eclipse.jpt.core.internal.content.orm.XmlTable;
+import org.eclipse.jpt.core.internal.content.orm.XmlTypeMapping;
+import org.eclipse.jpt.core.internal.mappings.IAssociationOverride;
+import org.eclipse.jpt.core.internal.mappings.IAttributeOverride;
+import org.eclipse.jpt.core.internal.mappings.IEntity;
+import org.eclipse.jpt.core.internal.mappings.ISecondaryTable;
+import org.eclipse.jpt.core.internal.validation.IJpaValidationMessages;
+import org.eclipse.jpt.core.internal.validation.JpaValidationMessages;
+import org.eclipse.jpt.utility.internal.ClassTools;
+import org.eclipse.jpt.utility.internal.CollectionTools;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+
+public class XmlEntityContext extends XmlTypeContext
+{
+ private TableContext tableContext;
+
+ private Collection<TableContext> secondaryTableContexts;
+
+ private JavaTable javaTable;
+
+ private Collection<AttributeOverrideContext> attributeOverrideContexts;
+
+ private Collection<AssociationOverrideContext> associationOverrideContexts;
+
+ public XmlEntityContext(MappingFileContext parentContext, XmlEntity xmlEntity) {
+ super(parentContext, (XmlTypeMapping) xmlEntity);
+ this.attributeOverrideContexts = buildAttributeOverrideContexts();
+ this.associationOverrideContexts = buildAssociationOverrideContexts();
+ this.secondaryTableContexts = buildSecondaryTableContexts();
+ }
+
+ protected Collection<AttributeOverrideContext> buildAttributeOverrideContexts() {
+ Collection<AttributeOverrideContext> contexts = new ArrayList<AttributeOverrideContext>();
+ for (IAttributeOverride attributeOverride : getEntity().getAttributeOverrides()) {
+ contexts.add(new AttributeOverrideContext(this, attributeOverride));
+ }
+
+ return contexts;
+ }
+
+ //only support default joinColumn information for the default association overrides,
+ //AssociationOverride has no defaults, the name and joinColumns must be specified
+ protected Collection<AssociationOverrideContext> buildAssociationOverrideContexts() {
+ Collection<AssociationOverrideContext> contexts = new ArrayList<AssociationOverrideContext>();
+ for (IAssociationOverride associationOverride : getEntity().getDefaultAssociationOverrides()) {
+ contexts.add(new AssociationOverrideContext(this, associationOverride));
+ }
+
+ return contexts;
+ }
+
+ protected Collection<TableContext> buildSecondaryTableContexts() {
+ Collection<TableContext> contexts = new ArrayList<TableContext>();
+ for (ISecondaryTable secondaryTable : getEntity().getSecondaryTables()) {
+ contexts.add(new TableContext(this, secondaryTable));
+ }
+
+ return contexts;
+ }
+
+ protected XmlEntity getEntity() {
+ return (XmlEntity) getXmlTypeMapping();
+ }
+
+ protected JavaEntity getJavaEntity() {
+ IJavaTypeMapping javaTypeMapping = javaTypeMapping();
+ if (javaTypeMapping != null
+ && javaTypeMapping.getKey() == IMappingKeys.ENTITY_TYPE_MAPPING_KEY) {
+ return (JavaEntity) javaTypeMapping;
+ }
+ return null;
+ }
+
+ @Override
+ public void initialize() {
+ super.initialize();
+ IJavaTypeMapping javaTypeMapping = javaTypeMapping();
+ XmlTable xmlTable = (XmlTable)((XmlEntity) getXmlTypeMapping()).getTable();
+ if (javaTypeMapping instanceof IEntity) {
+ this.javaTable = (JavaTable) ((IEntity) javaTypeMapping).getTable();
+ }
+ this.tableContext = new TableContext(this, xmlTable);
+ }
+
+ /**
+ * XmlIdContexts will populate the generatorRepository themselves.
+ * XmlAttributeContexts are not built until the initialize method, so we
+ * don't have any yet to populate the generatorRepository.
+ */
+ protected void populateGeneratorRepository(GeneratorRepository generatorRepository) {
+ if (getEntity().getTableGenerator() != null) {
+ generatorRepository.addGenerator(getEntity().getTableGenerator());
+ }
+ if (getEntity().getSequenceGenerator() != null) {
+ generatorRepository.addGenerator(getEntity().getSequenceGenerator());
+ }
+ }
+
+ public PersistenceUnitContext getPersistenceUnitContext() {
+ return ((MappingFileContext) getParentContext()).getPersistenceUnitContext();
+ }
+
+ @Override
+ public void refreshDefaults(DefaultsContext parentDefaults) {
+ super.refreshDefaults(parentDefaults);
+ refreshDefaultAttributeOverrides();
+ refreshDefaultAssociationOverrides();
+ refreshDefaultSecondaryTables();
+ for (TableContext context : this.secondaryTableContexts) {
+ context.refreshDefaults(parentDefaults);
+ }
+ for (AttributeOverrideContext context : this.attributeOverrideContexts) {
+ context.refreshDefaults(parentDefaults);
+ }
+ for (AssociationOverrideContext context : this.associationOverrideContexts) {
+ context.refreshDefaults(parentDefaults);
+ }
+ }
+
+ protected void refreshTableContext(DefaultsContext defaultsContext) {
+ this.tableContext.refreshDefaults(defaultsContext);
+ }
+
+ protected void refreshDefaultAttributeOverrides() {
+
+ JavaEntity javaEntity = getJavaEntity();
+ if (javaEntity != null && !getXmlTypeMapping().isXmlMetadataComplete()) {
+ for (IAttributeOverride attributeOverride : javaEntity.getAttributeOverrides()) {
+ if (!getEntity().containsAttributeOverride(attributeOverride.getName())) {
+ IAttributeOverride defaultAttributeOverride = getEntity().createAttributeOverride(0);
+ defaultAttributeOverride.setName(attributeOverride.getName());
+ getEntity().getDefaultAttributeOverrides().add(defaultAttributeOverride);
+ }
+ }
+ }
+ else {
+ for (Iterator<String> i = getEntity().allOverridableAttributeNames(); i.hasNext(); ) {
+ String override = i.next();
+ if (!getEntity().containsAttributeOverride(override)) {
+ IAttributeOverride defaultAttributeOverride = getEntity().createAttributeOverride(0);
+ defaultAttributeOverride.setName(override);
+ getEntity().getDefaultAttributeOverrides().add(defaultAttributeOverride);
+ }
+
+ }
+ }
+
+ Collection<String> attributeNames = CollectionTools.collection(getEntity().allOverridableAttributeNames());
+
+ //remove any default mappings that are not included in the attributeNames collection
+ Collection<IAttributeOverride> overridesToRemove = new ArrayList<IAttributeOverride>();
+ for (IAttributeOverride attributeOverride : getEntity().getDefaultAttributeOverrides()) {
+ if (getEntity().containsSpecifiedAttributeOverride(attributeOverride.getName())) {
+ overridesToRemove.add(attributeOverride);
+ }
+ else if (!attributeNames.contains(attributeOverride.getName())) {
+ if (javaEntity != null
+ && !getXmlTypeMapping().isXmlMetadataComplete()
+ && !javaEntity.containsSpecifiedAttributeOverride(attributeOverride.getName())) {
+
+ overridesToRemove.add(attributeOverride);
+ }
+ }
+ }
+
+ getEntity().getDefaultAttributeOverrides().removeAll(overridesToRemove);
+ }
+
+ protected void refreshDefaultAssociationOverrides() {
+
+ JavaEntity javaEntity = getJavaEntity();
+ if (javaEntity != null && !getXmlTypeMapping().isXmlMetadataComplete()) {
+ for (IAssociationOverride associationOverride : javaEntity.getAssociationOverrides()) {
+ if (!getEntity().containsAssociationOverride(associationOverride.getName())) {
+ IAssociationOverride defaultAssociationOverride = getEntity().createAssociationOverride(0);
+ defaultAssociationOverride.setName(associationOverride.getName());
+ getEntity().getDefaultAssociationOverrides().add(defaultAssociationOverride);
+ }
+ }
+ }
+ else {
+ for (Iterator<String> i = getEntity().allOverridableAssociationNames(); i.hasNext(); ) {
+ String override = i.next();
+ if (!getEntity().containsAssociationOverride(override)) {
+ IAssociationOverride defaultAssociationOverride = getEntity().createAssociationOverride(0);
+ defaultAssociationOverride.setName(override);
+ getEntity().getDefaultAssociationOverrides().add(defaultAssociationOverride);
+ }
+
+ }
+ }
+
+ Collection<String> attributeNames = CollectionTools.collection(getEntity().allOverridableAssociationNames());
+
+ //remove any default mappings that are not included in the attributeNames collection
+ Collection<IAssociationOverride> overridesToRemove = new ArrayList<IAssociationOverride>();
+ for (IAssociationOverride attributeOverride : getEntity().getDefaultAssociationOverrides()) {
+ if (getEntity().containsSpecifiedAssociationOverride(attributeOverride.getName())) {
+ overridesToRemove.add(attributeOverride);
+ }
+ else if (!attributeNames.contains(attributeOverride.getName())) {
+ if (javaEntity != null
+ && !getXmlTypeMapping().isXmlMetadataComplete()
+ && !javaEntity.containsSpecifiedAssociationOverride(attributeOverride.getName())) {
+
+ overridesToRemove.add(attributeOverride);
+ }
+ }
+ }
+
+ getEntity().getDefaultAssociationOverrides().removeAll(overridesToRemove);
+ }
+
+ protected void refreshDefaultSecondaryTables() {
+ JavaEntity javaEntity = getJavaEntity();
+ if (javaEntity != null && !getXmlTypeMapping().isXmlMetadataComplete()) {
+ for (ISecondaryTable secondaryTable : javaEntity.getSecondaryTables()) {
+ if (!getEntity().containsSecondaryTable(secondaryTable.getName())) {
+ ISecondaryTable defaultSecondaryTable = getEntity().createSecondaryTable(0);
+ defaultSecondaryTable.setSpecifiedName(secondaryTable.getName());
+ getEntity().getDefaultSecondaryTables().add(defaultSecondaryTable);
+ }
+ }
+ }
+ Collection<ISecondaryTable> secondaryTablesToRemove = new ArrayList<ISecondaryTable>();
+
+ for (Iterator<ISecondaryTable> i = getEntity().getDefaultSecondaryTables().iterator(); i.hasNext(); ) {
+ ISecondaryTable secondaryTable = i.next();
+ if (getXmlTypeMapping().isXmlMetadataComplete()) {
+ secondaryTablesToRemove.add(secondaryTable);
+ continue;
+ }
+ if (javaEntity == null) {
+ secondaryTablesToRemove.add(secondaryTable);
+ }
+ else if (!javaEntity.containsSecondaryTable(secondaryTable.getName())) {
+ secondaryTablesToRemove.add(secondaryTable);
+ }
+ }
+ getEntity().getDefaultSecondaryTables().removeAll(secondaryTablesToRemove);
+
+ }
+
+ @Override
+ public DefaultsContext wrapDefaultsContext(DefaultsContext defaultsContext) {
+ return super.wrapDefaultsContext(this.tableContext.wrapDefaultsContext(defaultsContext));
+ }
+
+ @Override
+ protected Object getDefault(String key, DefaultsContext defaultsContext) {
+ if (key.equals(BaseJpaPlatform.DEFAULT_ENTITY_NAME_KEY)) {
+ String className = getPersistentType().getClass_();
+ if (className != null) {
+ return ClassTools.shortNameForClassNamed(className);
+ }
+ }
+
+ XmlTable xmlTable = getXmlTable();
+ if (javaTable != null) {
+ if (getXmlTypeMapping().isXmlMetadataComplete() || xmlTable.getNode() != null) {
+ if (key.equals(BaseJpaPlatform.DEFAULT_TABLE_SCHEMA_KEY)) {
+ return javaTable.getDefaultSchema();
+ }
+ if (key.equals(BaseJpaPlatform.DEFAULT_TABLE_CATALOG_KEY)) {
+ return javaTable.getDefaultCatalog();
+ }
+ if (key.equals(BaseJpaPlatform.DEFAULT_TABLE_NAME_KEY)) {
+ return javaTable.getDefaultName();
+ }
+ }
+ else {
+ if (key.equals(BaseJpaPlatform.DEFAULT_TABLE_SCHEMA_KEY)) {
+ return javaTable.getSchema();
+ }
+ if (key.equals(BaseJpaPlatform.DEFAULT_TABLE_CATALOG_KEY)) {
+ return javaTable.getCatalog();
+ }
+ if (key.equals(BaseJpaPlatform.DEFAULT_TABLE_NAME_KEY)) {
+ return javaTable.getName();
+ }
+ }
+ }
+ else if (key.equals(BaseJpaPlatform.DEFAULT_TABLE_NAME_KEY)) {
+ if (getEntity().rootEntity().getInheritanceStrategy().isSingleTable()) {
+ IEntity rootEntity = getEntity().rootEntity();
+ if (rootEntity == getEntity()) {
+ return rootEntity.getName();
+ }
+ return rootEntity.getTable().getName();
+ }
+ return getEntity().getName();
+ }
+ return super.getDefault(key, defaultsContext);
+ }
+
+ private XmlTable getXmlTable() {
+ return (XmlTable) ((XmlEntity) getXmlTypeMapping()).getTable();
+ }
+
+ @Override
+ public void addToMessages(List<IMessage> messages) {
+ super.addToMessages(messages);
+ tableContext.addToMessages(messages);
+ addIdMessages(messages);
+
+ for (AttributeOverrideContext aoContext : attributeOverrideContexts) {
+ aoContext.addToMessages(messages);
+ }
+
+ for (AssociationOverrideContext aoContext : associationOverrideContexts) {
+ aoContext.addToMessages(messages);
+ }
+ }
+
+ protected void addIdMessages(List<IMessage> messages) {
+ addNoIdMessage(messages);
+
+ }
+
+ protected void addNoIdMessage(List<IMessage> messages) {
+ IEntity entity = getEntity();
+ if (entityHasNoId()) {
+ messages.add(
+ JpaValidationMessages.buildMessage(
+ IMessage.HIGH_SEVERITY,
+ IJpaValidationMessages.ENTITY_NO_ID,
+ new String[] {entity.getName()},
+ entity, entity.getTextRange())
+ );
+ }
+ }
+
+ private boolean entityHasNoId() {
+ for (Iterator<IPersistentAttribute> stream = getEntity().getPersistentType().allAttributes(); stream.hasNext(); ) {
+ IPersistentAttribute persistentAttribute = stream.next();
+ String mappingKey = persistentAttribute.getMappingKey();
+ if (mappingKey == IMappingKeys.ID_ATTRIBUTE_MAPPING_KEY
+ || mappingKey == IMappingKeys.EMBEDDED_ID_ATTRIBUTE_MAPPING_KEY) {
+ return false;
+ }
+ }
+ return true;
+ }
+} \ No newline at end of file

Back to the top