blob: f4645e44d4216da71bfa67dc655d693e6c8b3b37 [file] [log] [blame]
/*******************************************************************************
* 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())
);
}
}
}