diff options
Diffstat (limited to 'jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/base/Persistence.java')
-rw-r--r-- | jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/base/Persistence.java | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/base/Persistence.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/base/Persistence.java new file mode 100644 index 0000000000..f4645e44d4 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/base/Persistence.java @@ -0,0 +1,179 @@ +/******************************************************************************* + * Copyright (c) 2007 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.context.base; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; + +import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jpt.core.internal.ITextRange; +import org.eclipse.jpt.core.internal.resource.persistence.PersistenceFactory; +import org.eclipse.jpt.core.internal.resource.persistence.XmlPersistence; +import org.eclipse.jpt.core.internal.resource.persistence.XmlPersistenceUnit; +import org.eclipse.jpt.core.internal.validation.IJpaValidationMessages; +import org.eclipse.jpt.core.internal.validation.JpaValidationMessages; +import org.eclipse.jpt.utility.internal.iterators.CloneListIterator; +import org.eclipse.wst.validation.internal.provisional.core.IMessage; + +public class Persistence extends JpaContextNode + implements IPersistence +{ + protected XmlPersistence xmlPersistence; + + protected final List<IPersistenceUnit> persistenceUnits; + + + public Persistence(IPersistenceXml parent) { + super(parent); + this.persistenceUnits = new ArrayList<IPersistenceUnit>(); + } + + + // **************** persistence units ************************************** + + public ListIterator<IPersistenceUnit> persistenceUnits() { + return new CloneListIterator<IPersistenceUnit>(persistenceUnits); + } + + public IPersistenceUnit addPersistenceUnit() { + return addPersistenceUnit(persistenceUnits.size()); + } + + // TODO - add better change support + public IPersistenceUnit addPersistenceUnit(int index) { + XmlPersistenceUnit xmlPersistenceUnit = PersistenceFactory.eINSTANCE.createXmlPersistenceUnit(); + IPersistenceUnit persistenceUnit = createPersistenceUnit(xmlPersistenceUnit); + persistenceUnits.add(index, persistenceUnit); + xmlPersistence.getPersistenceUnits().add(xmlPersistenceUnit); + fireListChanged(PERSISTENCE_UNITS_LIST); + return persistenceUnit; + } + + public void removePersistenceUnit(IPersistenceUnit persistenceUnit) { + removePersistenceUnit(persistenceUnits.indexOf(persistenceUnit)); + } + + public void removePersistenceUnit(int index) { + persistenceUnits.remove(index); + xmlPersistence.getPersistenceUnits().remove(index); + fireListChanged(PERSISTENCE_UNITS_LIST); + } + + protected void addPersistenceUnit_(IPersistenceUnit persistenceUnit) { + addPersistenceUnit_(persistenceUnits.size(), persistenceUnit); + } + + protected void addPersistenceUnit_(int index, IPersistenceUnit persistenceUnit) { + persistenceUnits.add(index, persistenceUnit); + fireListChanged(PERSISTENCE_UNITS_LIST); + } + + protected void removePersistenceUnit_(IPersistenceUnit persistenceUnit) { + removePersistenceUnit_(persistenceUnits.indexOf(persistenceUnit)); + } + + protected void removePersistenceUnit_(int index) { + persistenceUnits.remove(index); + fireListChanged(PERSISTENCE_UNITS_LIST); + } + + + // **************** updating *********************************************** + + public void initialize(XmlPersistence xmlPersistence) { + this.xmlPersistence = xmlPersistence; + initializePersistenceUnits(xmlPersistence); + } + + protected void initializePersistenceUnits(XmlPersistence persistence) { + for (XmlPersistenceUnit xmlPersistenceUnit : persistence.getPersistenceUnits()) { + this.persistenceUnits.add(createPersistenceUnit(xmlPersistenceUnit)); + } + } + + public void update(XmlPersistence persistence) { + this.xmlPersistence = persistence; + Iterator<IPersistenceUnit> stream = persistenceUnits(); + Iterator<XmlPersistenceUnit> stream2 = persistence.getPersistenceUnits().iterator(); + + while (stream.hasNext()) { + IPersistenceUnit persistenceUnit = stream.next(); + if (stream2.hasNext()) { + persistenceUnit.update(stream2.next()); + } + else { + removePersistenceUnit_(persistenceUnit); + } + } + + while (stream2.hasNext()) { + addPersistenceUnit_(createPersistenceUnit(stream2.next())); + } + } + + protected IPersistenceUnit createPersistenceUnit(XmlPersistenceUnit xmlPersistenceUnit) { + IPersistenceUnit persistenceUnit = jpaFactory().createPersistenceUnit(this); + persistenceUnit.initialize(xmlPersistenceUnit); + return persistenceUnit; + } + + + // ************************************************************************* + + @Override + public IPersistenceUnit persistenceUnit() { + throw new UnsupportedOperationException("No PersistenceUnit in this context"); + } + + public ITextRange validationTextRange() { + return this.xmlPersistence.validationTextRange(); + } + + + @Override + public void addToMessages(List<IMessage> messages, CompilationUnit astRoot) { + super.addToMessages(messages, astRoot); + + //persistence root validation + addNoPersistenceUnitMessage(messages); + addMultiplePersistenceUnitMessage(messages); + + + //persistence unit validation + for (IPersistenceUnit pu : persistenceUnits){ + pu.addToMessages(messages, astRoot); + } + } + + protected void addNoPersistenceUnitMessage(List<IMessage> messages) { + if (persistenceUnits.size() == 0) { + messages.add( + JpaValidationMessages.buildMessage( + IMessage.HIGH_SEVERITY, + IJpaValidationMessages.PERSISTENCE_NO_PERSISTENCE_UNIT, + this, this.validationTextRange()) + ); + } + } + + protected void addMultiplePersistenceUnitMessage(List<IMessage> messages) { + if (persistenceUnits.size() > 1) { + messages.add( + JpaValidationMessages.buildMessage( + IMessage.HIGH_SEVERITY, + IJpaValidationMessages.PERSISTENCE_MULTIPLE_PERSISTENCE_UNITS, + this, this.validationTextRange()) + ); + } + } +} |