blob: d28332e4454197d16d0ec142a158241078f262b7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2008 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.orm;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import org.eclipse.jpt.core.context.BaseEmbeddedMapping;
import org.eclipse.jpt.core.context.BaseOverride;
import org.eclipse.jpt.core.context.ColumnMapping;
import org.eclipse.jpt.core.context.Embeddable;
import org.eclipse.jpt.core.context.PersistentAttribute;
import org.eclipse.jpt.core.context.java.JavaPersistentAttribute;
import org.eclipse.jpt.core.context.orm.OrmAttributeOverride;
import org.eclipse.jpt.core.context.orm.OrmBaseEmbeddedMapping;
import org.eclipse.jpt.core.context.orm.OrmPersistentAttribute;
import org.eclipse.jpt.core.internal.context.MappingTools;
import org.eclipse.jpt.core.resource.orm.BaseXmlEmbedded;
import org.eclipse.jpt.core.resource.orm.OrmFactory;
import org.eclipse.jpt.core.resource.orm.XmlAttributeOverride;
import org.eclipse.jpt.utility.internal.CollectionTools;
import org.eclipse.jpt.utility.internal.iterators.CloneListIterator;
import org.eclipse.jpt.utility.internal.iterators.CompositeListIterator;
import org.eclipse.jpt.utility.internal.iterators.EmptyIterator;
import org.eclipse.jpt.utility.internal.iterators.FilteringIterator;
import org.eclipse.jpt.utility.internal.iterators.TransformationIterator;
public abstract class AbstractOrmBaseEmbeddedMapping<T extends BaseXmlEmbedded> extends AbstractOrmAttributeMapping<T> implements OrmBaseEmbeddedMapping
{
protected final List<OrmAttributeOverride> specifiedAttributeOverrides;
protected final List<OrmAttributeOverride> virtualAttributeOverrides;
private Embeddable embeddable;
protected AbstractOrmBaseEmbeddedMapping(OrmPersistentAttribute parent) {
super(parent);
this.specifiedAttributeOverrides = new ArrayList<OrmAttributeOverride>();
this.virtualAttributeOverrides = new ArrayList<OrmAttributeOverride>();
}
@Override
public void initializeFromOrmBaseEmbeddedMapping(OrmBaseEmbeddedMapping oldMapping) {
super.initializeFromOrmBaseEmbeddedMapping(oldMapping);
int index = 0;
for (OrmAttributeOverride attributeOverride : CollectionTools.iterable(oldMapping.specifiedAttributeOverrides())) {
OrmAttributeOverride newAttributeOverride = addSpecifiedAttributeOverride(index++);
newAttributeOverride.setName(attributeOverride.getName());
newAttributeOverride.getColumn().initializeFrom(attributeOverride.getColumn());
}
}
@SuppressWarnings("unchecked")
public ListIterator<OrmAttributeOverride> attributeOverrides() {
return new CompositeListIterator<OrmAttributeOverride>(specifiedAttributeOverrides(), virtualAttributeOverrides());
}
public int attributeOverridesSize() {
// TODO Auto-generated method stub
return 0;
}
public ListIterator<OrmAttributeOverride> virtualAttributeOverrides() {
return new CloneListIterator<OrmAttributeOverride>(this.virtualAttributeOverrides);
}
public int virtualAttributeOverridesSize() {
return this.virtualAttributeOverrides.size();
}
public ListIterator<OrmAttributeOverride> specifiedAttributeOverrides() {
return new CloneListIterator<OrmAttributeOverride>(this.specifiedAttributeOverrides);
}
public int specifiedAttributeOverridesSize() {
return this.specifiedAttributeOverrides.size();
}
protected OrmAttributeOverride addSpecifiedAttributeOverride(int index) {
XmlAttributeOverride xmlAttributeOverride = OrmFactory.eINSTANCE.createXmlAttributeOverrideImpl();
OrmAttributeOverride attributeOverride = buildAttributeOverride(xmlAttributeOverride);
this.specifiedAttributeOverrides.add(index, attributeOverride);
this.getAttributeMapping().getAttributeOverrides().add(index, xmlAttributeOverride);
this.fireItemAdded(BaseEmbeddedMapping.SPECIFIED_ATTRIBUTE_OVERRIDES_LIST, index, attributeOverride);
return attributeOverride;
}
protected void addSpecifiedAttributeOverride(int index, OrmAttributeOverride attributeOverride) {
addItemToList(index, attributeOverride, this.specifiedAttributeOverrides, BaseEmbeddedMapping.SPECIFIED_ATTRIBUTE_OVERRIDES_LIST);
}
protected void removeSpecifiedAttributeOverride_(OrmAttributeOverride attributeOverride) {
removeItemFromList(attributeOverride, this.specifiedAttributeOverrides, BaseEmbeddedMapping.SPECIFIED_ATTRIBUTE_OVERRIDES_LIST);
}
public void moveSpecifiedAttributeOverride(int targetIndex, int sourceIndex) {
CollectionTools.move(this.specifiedAttributeOverrides, targetIndex, sourceIndex);
this.getAttributeMapping().getAttributeOverrides().move(targetIndex, sourceIndex);
fireItemMoved(BaseEmbeddedMapping.SPECIFIED_ATTRIBUTE_OVERRIDES_LIST, targetIndex, sourceIndex);
}
//****************** AttributeOverride.Owner implemenation *******************
public boolean isVirtual(BaseOverride override) {
return this.virtualAttributeOverrides.contains(override);
}
public BaseOverride setVirtual(boolean virtual, BaseOverride override) {
// TODO Auto-generated method stub
return null;
}
public ColumnMapping getColumnMapping(String attributeName) {
return MappingTools.getColumnMapping(attributeName, getEmbeddable());
}
public Embeddable getEmbeddable() {
return this.embeddable;
}
public Iterator<String> allOverridableAttributeNames() {
return new TransformationIterator<PersistentAttribute, String>(this.allOverridableAttributes()) {
@Override
protected String transform(PersistentAttribute attribute) {
return attribute.getName();
}
};
}
public Iterator<PersistentAttribute> allOverridableAttributes() {
if (this.getEmbeddable() == null) {
return EmptyIterator.instance();
}
return new FilteringIterator<PersistentAttribute, PersistentAttribute>(this.getEmbeddable().getPersistentType().attributes()) {
@Override
protected boolean accept(PersistentAttribute o) {
return o.isOverridableAttribute();
}
};
}
@Override
public void initialize(T embedded) {
super.initialize(embedded);
this.embeddable = embeddableFor(findJavaPersistentAttribute());
this.initializeSpecifiedAttributeOverrides(embedded);
}
protected void initializeSpecifiedAttributeOverrides(T embedded) {
for (XmlAttributeOverride attributeOverride : embedded.getAttributeOverrides()) {
this.specifiedAttributeOverrides.add(buildAttributeOverride(attributeOverride));
}
}
//
// protected void initializeDefaultAttributeOverrides(JavaPersistentAttributeResource persistentAttributeResource) {
// for (Iterator<String> i = allOverridableAttributeNames(); i.hasNext(); ) {
// String attributeName = i.next();
// XmlAttributeOverride attributeOverride = attributeOverrideNamed(attributeName);
// if (attributeOverride == null) {
// attributeOverride = createAttributeOverride(new NullAttributeOverride(persistentAttributeResource));
// attributeOverride.setName(attributeName);
// this.defaultAttributeOverrides.add(attributeOverride);
// }
// }
// }
protected OrmAttributeOverride buildAttributeOverride(XmlAttributeOverride attributeOverride) {
return getJpaFactory().buildOrmAttributeOverride(this, this, attributeOverride);
}
@Override
public void update(T embedded) {
super.update(embedded);
this.embeddable = embeddableFor(findJavaPersistentAttribute());
this.updateSpecifiedAttributeOverrides(embedded);
}
protected void updateSpecifiedAttributeOverrides(T embedded) {
ListIterator<OrmAttributeOverride> attributeOverrides = specifiedAttributeOverrides();
ListIterator<XmlAttributeOverride> resourceAttributeOverrides = new CloneListIterator<XmlAttributeOverride>(embedded.getAttributeOverrides());//prevent ConcurrentModificiationException
while (attributeOverrides.hasNext()) {
OrmAttributeOverride attributeOverride = attributeOverrides.next();
if (resourceAttributeOverrides.hasNext()) {
attributeOverride.update(resourceAttributeOverrides.next());
}
else {
removeSpecifiedAttributeOverride_(attributeOverride);
}
}
while (resourceAttributeOverrides.hasNext()) {
addSpecifiedAttributeOverride(specifiedAttributeOverridesSize(), buildAttributeOverride(resourceAttributeOverrides.next()));
}
}
//************ static methods ************
public static Embeddable embeddableFor(JavaPersistentAttribute javaPersistentAttribute) {
if (javaPersistentAttribute == null) {
return null;
}
return MappingTools.getEmbeddableFor(javaPersistentAttribute);
}
}