blob: 3b05461497102740d981a79082c3bea8814b7e0c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2016 Oracle. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0, which accompanies this distribution
* and is available at https://www.eclipse.org/legal/epl-2.0/.
*
* Contributors:
* Oracle - initial API and implementation
******************************************************************************/
package org.eclipse.jpt.jpa.eclipselink.core.internal.context.orm;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IType;
import org.eclipse.jpt.common.core.utility.TextRange;
import org.eclipse.jpt.common.utility.internal.iterable.IterableTools;
import org.eclipse.jpt.common.utility.iterable.ListIterable;
import org.eclipse.jpt.jpa.core.context.TypeRefactoringParticipant;
import org.eclipse.jpt.jpa.core.internal.context.orm.AbstractOrmXmlContextModel;
import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkConverter;
import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkCustomConverter;
import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkObjectTypeConverter;
import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkStructConverter;
import org.eclipse.jpt.jpa.eclipselink.core.context.EclipseLinkTypeConverter;
import org.eclipse.jpt.jpa.eclipselink.core.context.orm.EclipseLinkOrmConverterContainer;
import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.EclipseLinkOrmFactory;
import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlConverter;
import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlConverterContainer;
import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlObjectTypeConverter;
import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlStructConverter;
import org.eclipse.jpt.jpa.eclipselink.core.resource.orm.XmlTypeConverter;
import org.eclipse.text.edits.ReplaceEdit;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
import org.eclipse.wst.validation.internal.provisional.core.IReporter;
public abstract class EclipseLinkAbstractOrmConverterContainer
extends AbstractOrmXmlContextModel<EclipseLinkOrmConverterContainer.Parent>
implements EclipseLinkOrmConverterContainer
{
protected final XmlConverterContainer xmlConverterContainer;
protected final ContextListContainer<EclipseLinkOrmCustomConverter, XmlConverter> customConverterContainer;
protected final ContextListContainer<EclipseLinkOrmObjectTypeConverter, XmlObjectTypeConverter> objectTypeConverterContainer;
protected final ContextListContainer<EclipseLinkOrmStructConverter, XmlStructConverter> structConverterContainer;
protected final ContextListContainer<EclipseLinkOrmTypeConverter, XmlTypeConverter> typeConverterContainer;
protected EclipseLinkAbstractOrmConverterContainer(EclipseLinkOrmConverterContainer.Parent parent, XmlConverterContainer xmlConverterContainer) {
super(parent);
this.xmlConverterContainer = xmlConverterContainer;
this.customConverterContainer = this.buildCustomConverterContainer();
this.objectTypeConverterContainer = this.buildObjectTypeConverterContainer();
this.structConverterContainer = this.buildStructConverterContainer();
this.typeConverterContainer = this.buildTypeConverterContainer();
}
// ********** synchronize/update **********
@Override
public void synchronizeWithResourceModel(IProgressMonitor monitor) {
super.synchronizeWithResourceModel(monitor);
this.syncCustomConverters(monitor);
this.syncObjectTypeConverters(monitor);
this.syncStructConverters(monitor);
this.syncTypeConverters(monitor);
}
@Override
public void update(IProgressMonitor monitor) {
super.update(monitor);
this.updateModels(this.getCustomConverters(), monitor);
this.updateModels(this.getObjectTypeConverters(), monitor);
this.updateModels(this.getStructConverters(), monitor);
this.updateModels(this.getTypeConverters(), monitor);
}
// ********** custom converters **********
public ListIterable<EclipseLinkOrmCustomConverter> getCustomConverters() {
return this.customConverterContainer;
}
public int getCustomConvertersSize() {
return this.customConverterContainer.size();
}
public EclipseLinkOrmCustomConverter addCustomConverter(String name) {
return this.addCustomConverter(name, this.getCustomConvertersSize());
}
public EclipseLinkOrmCustomConverter addCustomConverter(String name, int index) {
XmlConverter xmlConverter = this.buildXmlCustomConverter(name);
EclipseLinkOrmCustomConverter converter = this.customConverterContainer.addContextElement(index, xmlConverter);
this.xmlConverterContainer.getConverters().add(index, xmlConverter);
return converter;
}
protected XmlConverter buildXmlCustomConverter(String name) {
XmlConverter converter = EclipseLinkOrmFactory.eINSTANCE.createXmlConverter();
converter.setName(name);
return converter;
}
public void removeCustomConverter(EclipseLinkCustomConverter converter) {
this.removeCustomConverter(this.customConverterContainer.indexOf((EclipseLinkOrmCustomConverter) converter));
}
public void removeCustomConverter(int index) {
this.customConverterContainer.remove(index);
this.xmlConverterContainer.getConverters().remove(index);
}
public void moveCustomConverter(int targetIndex, int sourceIndex) {
this.customConverterContainer.move(targetIndex, sourceIndex);
this.xmlConverterContainer.getConverters().move(targetIndex, sourceIndex);
}
protected EclipseLinkOrmCustomConverter buildCustomConverter(XmlConverter xmlConverter) {
return new EclipseLinkOrmCustomConverter(this, xmlConverter);
}
protected void syncCustomConverters(IProgressMonitor monitor) {
this.customConverterContainer.synchronizeWithResourceModel(monitor);
}
protected ListIterable<XmlConverter> getXmlCustomConverters() {
// clone to reduce chance of concurrency problems
return IterableTools.downCast(IterableTools.cloneLive(this.getXmlConverters()));
}
protected List<org.eclipse.jpt.jpa.core.resource.orm.XmlConverter> getXmlConverters() {
return this.xmlConverterContainer.getConverters();
}
protected ContextListContainer<EclipseLinkOrmCustomConverter, XmlConverter> buildCustomConverterContainer() {
return this.buildSpecifiedContextListContainer(CUSTOM_CONVERTERS_LIST, new CustomConverterContainerAdapter());
}
/**
* custom converter container adapter
*/
public class CustomConverterContainerAdapter
extends AbstractContainerAdapter<EclipseLinkOrmCustomConverter, XmlConverter>
{
public EclipseLinkOrmCustomConverter buildContextElement(XmlConverter resourceElement) {
return EclipseLinkAbstractOrmConverterContainer.this.buildCustomConverter(resourceElement);
}
public ListIterable<XmlConverter> getResourceElements() {
return EclipseLinkAbstractOrmConverterContainer.this.getXmlCustomConverters();
}
public XmlConverter extractResourceElement(EclipseLinkOrmCustomConverter contextElement) {
return contextElement.getXmlConverter();
}
}
// ********** object type converters **********
public ListIterable<EclipseLinkOrmObjectTypeConverter> getObjectTypeConverters() {
return this.objectTypeConverterContainer;
}
public int getObjectTypeConvertersSize() {
return this.objectTypeConverterContainer.size();
}
public EclipseLinkOrmObjectTypeConverter addObjectTypeConverter(String name) {
return this.addObjectTypeConverter(name, this.getObjectTypeConvertersSize());
}
public EclipseLinkOrmObjectTypeConverter addObjectTypeConverter(String name, int index) {
XmlObjectTypeConverter xmlConverter = this.buildXmlObjectTypeConverter(name);
EclipseLinkOrmObjectTypeConverter converter = this.objectTypeConverterContainer.addContextElement(index, xmlConverter);
this.xmlConverterContainer.getObjectTypeConverters().add(index, xmlConverter);
return converter;
}
protected XmlObjectTypeConverter buildXmlObjectTypeConverter(String name) {
XmlObjectTypeConverter converter = EclipseLinkOrmFactory.eINSTANCE.createXmlObjectTypeConverter();
converter.setName(name);
return converter;
}
public void removeObjectTypeConverter(EclipseLinkObjectTypeConverter converter) {
this.removeObjectTypeConverter(this.objectTypeConverterContainer.indexOf((EclipseLinkOrmObjectTypeConverter) converter));
}
public void removeObjectTypeConverter(int index) {
this.objectTypeConverterContainer.remove(index);
this.xmlConverterContainer.getObjectTypeConverters().remove(index);
}
public void moveObjectTypeConverter(int targetIndex, int sourceIndex) {
this.objectTypeConverterContainer.move(targetIndex, sourceIndex);
this.xmlConverterContainer.getObjectTypeConverters().move(targetIndex, sourceIndex);
}
protected EclipseLinkOrmObjectTypeConverter buildObjectTypeConverter(XmlObjectTypeConverter xmlConverter) {
return new EclipseLinkOrmObjectTypeConverter(this, xmlConverter);
}
protected void syncObjectTypeConverters(IProgressMonitor monitor) {
this.objectTypeConverterContainer.synchronizeWithResourceModel(monitor);
}
protected ListIterable<XmlObjectTypeConverter> getXmlObjectTypeConverters() {
// clone to reduce chance of concurrency problems
return IterableTools.cloneLive(this.xmlConverterContainer.getObjectTypeConverters());
}
protected ContextListContainer<EclipseLinkOrmObjectTypeConverter, XmlObjectTypeConverter> buildObjectTypeConverterContainer() {
return this.buildSpecifiedContextListContainer(OBJECT_TYPE_CONVERTERS_LIST, new ObjectTypeConverterContainerAdapter());
}
/**
* object type converter container adapter
*/
public class ObjectTypeConverterContainerAdapter
extends AbstractContainerAdapter<EclipseLinkOrmObjectTypeConverter, XmlObjectTypeConverter>
{
public EclipseLinkOrmObjectTypeConverter buildContextElement(XmlObjectTypeConverter resourceElement) {
return EclipseLinkAbstractOrmConverterContainer.this.buildObjectTypeConverter(resourceElement);
}
public ListIterable<XmlObjectTypeConverter> getResourceElements() {
return EclipseLinkAbstractOrmConverterContainer.this.getXmlObjectTypeConverters();
}
public XmlObjectTypeConverter extractResourceElement(EclipseLinkOrmObjectTypeConverter contextElement) {
return contextElement.getXmlConverter();
}
}
// ********** struct converters **********
public ListIterable<EclipseLinkOrmStructConverter> getStructConverters() {
return this.structConverterContainer;
}
public int getStructConvertersSize() {
return this.structConverterContainer.size();
}
public EclipseLinkOrmStructConverter addStructConverter(String name) {
return this.addStructConverter(name, this.getStructConvertersSize());
}
public EclipseLinkOrmStructConverter addStructConverter(String name, int index) {
XmlStructConverter xmlConverter = this.buildXmlStructConverter(name);
EclipseLinkOrmStructConverter converter = this.structConverterContainer.addContextElement(index, xmlConverter);
this.xmlConverterContainer.getStructConverters().add(index, xmlConverter);
return converter;
}
protected XmlStructConverter buildXmlStructConverter(String name) {
XmlStructConverter converter = EclipseLinkOrmFactory.eINSTANCE.createXmlStructConverter();
converter.setName(name);
return converter;
}
public void removeStructConverter(EclipseLinkStructConverter converter) {
this.removeStructConverter(this.structConverterContainer.indexOf((EclipseLinkOrmStructConverter) converter));
}
public void removeStructConverter(int index) {
this.structConverterContainer.remove(index);
this.xmlConverterContainer.getStructConverters().remove(index);
}
public void moveStructConverter(int targetIndex, int sourceIndex) {
this.structConverterContainer.move(targetIndex, sourceIndex);
this.xmlConverterContainer.getStructConverters().move(targetIndex, sourceIndex);
}
protected EclipseLinkOrmStructConverter buildStructConverter(XmlStructConverter xmlConverter) {
return new EclipseLinkOrmStructConverter(this, xmlConverter);
}
protected void syncStructConverters(IProgressMonitor monitor) {
this.structConverterContainer.synchronizeWithResourceModel(monitor);
}
protected ListIterable<XmlStructConverter> getXmlStructConverters() {
// clone to reduce chance of concurrency problems
return IterableTools.cloneLive(this.xmlConverterContainer.getStructConverters());
}
protected ContextListContainer<EclipseLinkOrmStructConverter, XmlStructConverter> buildStructConverterContainer() {
return this.buildSpecifiedContextListContainer(STRUCT_CONVERTERS_LIST, new StructConverterContainerAdapter());
}
/**
* struct converter container adapter
*/
public class StructConverterContainerAdapter
extends AbstractContainerAdapter<EclipseLinkOrmStructConverter, XmlStructConverter>
{
public EclipseLinkOrmStructConverter buildContextElement(XmlStructConverter resourceElement) {
return EclipseLinkAbstractOrmConverterContainer.this.buildStructConverter(resourceElement);
}
public ListIterable<XmlStructConverter> getResourceElements() {
return EclipseLinkAbstractOrmConverterContainer.this.getXmlStructConverters();
}
public XmlStructConverter extractResourceElement(EclipseLinkOrmStructConverter contextElement) {
return contextElement.getXmlConverter();
}
}
// ********** type converters **********
public ListIterable<EclipseLinkOrmTypeConverter> getTypeConverters() {
return this.typeConverterContainer;
}
public int getTypeConvertersSize() {
return this.typeConverterContainer.size();
}
public EclipseLinkOrmTypeConverter addTypeConverter(String name) {
return this.addTypeConverter(name, this.getTypeConvertersSize());
}
public EclipseLinkOrmTypeConverter addTypeConverter(String name, int index) {
XmlTypeConverter xmlConverter = this.buildXmlTypeConverter(name);
EclipseLinkOrmTypeConverter converter = this.typeConverterContainer.addContextElement(index, xmlConverter);
this.xmlConverterContainer.getTypeConverters().add(index, xmlConverter);
return converter;
}
protected XmlTypeConverter buildXmlTypeConverter(String name) {
XmlTypeConverter converter = EclipseLinkOrmFactory.eINSTANCE.createXmlTypeConverter();
converter.setName(name);
return converter;
}
public void removeTypeConverter(EclipseLinkTypeConverter converter) {
this.removeTypeConverter(this.typeConverterContainer.indexOf((EclipseLinkOrmTypeConverter) converter));
}
public void removeTypeConverter(int index) {
this.typeConverterContainer.remove(index);
this.xmlConverterContainer.getTypeConverters().remove(index);
}
public void moveTypeConverter(int targetIndex, int sourceIndex) {
this.typeConverterContainer.move(targetIndex, sourceIndex);
this.xmlConverterContainer.getTypeConverters().move(targetIndex, sourceIndex);
}
protected EclipseLinkOrmTypeConverter buildTypeConverter(XmlTypeConverter xmlConverter) {
return new EclipseLinkOrmTypeConverter(this, xmlConverter);
}
protected void syncTypeConverters(IProgressMonitor monitor) {
this.typeConverterContainer.synchronizeWithResourceModel(monitor);
}
protected ListIterable<XmlTypeConverter> getXmlTypeConverters() {
// clone to reduce chance of concurrency problems
return IterableTools.cloneLive(this.xmlConverterContainer.getTypeConverters());
}
protected ContextListContainer<EclipseLinkOrmTypeConverter, XmlTypeConverter> buildTypeConverterContainer() {
return this.buildSpecifiedContextListContainer(TYPE_CONVERTERS_LIST, new TypeConverterContainerAdapter());
}
/**
* type converter container adapter
*/
public class TypeConverterContainerAdapter
extends AbstractContainerAdapter<EclipseLinkOrmTypeConverter, XmlTypeConverter>
{
public EclipseLinkOrmTypeConverter buildContextElement(XmlTypeConverter resourceElement) {
return EclipseLinkAbstractOrmConverterContainer.this.buildTypeConverter(resourceElement);
}
public ListIterable<XmlTypeConverter> getResourceElements() {
return EclipseLinkAbstractOrmConverterContainer.this.getXmlTypeConverters();
}
public XmlTypeConverter extractResourceElement(EclipseLinkOrmTypeConverter contextElement) {
return contextElement.getXmlConverter();
}
}
// ********** refactoring **********
@SuppressWarnings("unchecked")
public Iterable<ReplaceEdit> createRenameTypeEdits(IType originalType, String newName) {
return IterableTools.concatenate(
this.createRenameObjectTypeConverterEdits(originalType, newName),
this.createRenameTypeConverterEdits(originalType, newName),
this.createRenameStructConverterEdits(originalType, newName),
this.createRenameCustomConverterEdits(originalType, newName));
}
protected Iterable<ReplaceEdit> createRenameObjectTypeConverterEdits(IType originalType, String newName) {
return IterableTools.children(getObjectTypeConverters(), new TypeRefactoringParticipant.RenameTypeEditsTransformer(originalType, newName));
}
protected Iterable<ReplaceEdit> createRenameTypeConverterEdits(IType originalType, String newName) {
return IterableTools.children(getTypeConverters(), new TypeRefactoringParticipant.RenameTypeEditsTransformer(originalType, newName));
}
protected Iterable<ReplaceEdit> createRenameStructConverterEdits(IType originalType, String newName) {
return IterableTools.children(getStructConverters(), new TypeRefactoringParticipant.RenameTypeEditsTransformer(originalType, newName));
}
protected Iterable<ReplaceEdit> createRenameCustomConverterEdits(IType originalType, String newName) {
return IterableTools.children(getCustomConverters(), new TypeRefactoringParticipant.RenameTypeEditsTransformer(originalType, newName));
}
@SuppressWarnings("unchecked")
public Iterable<ReplaceEdit> createMoveTypeEdits(IType originalType, IPackageFragment newPackage) {
return IterableTools.concatenate(
this.createMoveObjectTypeConverterEdits(originalType, newPackage),
this.createMoveTypeConverterEdits(originalType, newPackage),
this.createMoveStructConverterEdits(originalType, newPackage),
this.createMoveCustomConverterEdits(originalType, newPackage));
}
protected Iterable<ReplaceEdit> createMoveObjectTypeConverterEdits(IType originalType, IPackageFragment newPackage) {
return IterableTools.children(getObjectTypeConverters(), new TypeRefactoringParticipant.MoveTypeEditsTransformer(originalType, newPackage));
}
protected Iterable<ReplaceEdit> createMoveTypeConverterEdits(IType originalType, IPackageFragment newPackage) {
return IterableTools.children(getTypeConverters(), new TypeRefactoringParticipant.MoveTypeEditsTransformer(originalType, newPackage));
}
protected Iterable<ReplaceEdit> createMoveStructConverterEdits(IType originalType, IPackageFragment newPackage) {
return IterableTools.children(getStructConverters(), new TypeRefactoringParticipant.MoveTypeEditsTransformer(originalType, newPackage));
}
protected Iterable<ReplaceEdit> createMoveCustomConverterEdits(IType originalType, IPackageFragment newPackage) {
return IterableTools.children(getCustomConverters(), new TypeRefactoringParticipant.MoveTypeEditsTransformer(originalType, newPackage));
}
@SuppressWarnings("unchecked")
public Iterable<ReplaceEdit> createRenamePackageEdits(IPackageFragment originalPackage, String newName) {
return IterableTools.concatenate(
this.createObjectTypeConverterRenamePackageEdits(originalPackage, newName),
this.createTypeConverterRenamePackageEdits(originalPackage, newName),
this.createStructConverterRenamePackageEdits(originalPackage, newName),
this.createCustomConverterRenamePackageEdits(originalPackage, newName));
}
protected Iterable<ReplaceEdit> createObjectTypeConverterRenamePackageEdits(IPackageFragment originalPackage, String newName) {
return IterableTools.children(getObjectTypeConverters(), new TypeRefactoringParticipant.RenamePackageEditsTransformer(originalPackage, newName));
}
protected Iterable<ReplaceEdit> createTypeConverterRenamePackageEdits(IPackageFragment originalPackage, String newName) {
return IterableTools.children(getTypeConverters(), new TypeRefactoringParticipant.RenamePackageEditsTransformer(originalPackage, newName));
}
protected Iterable<ReplaceEdit> createStructConverterRenamePackageEdits(IPackageFragment originalPackage, String newName) {
return IterableTools.children(getStructConverters(), new TypeRefactoringParticipant.RenamePackageEditsTransformer(originalPackage, newName));
}
protected Iterable<ReplaceEdit> createCustomConverterRenamePackageEdits(IPackageFragment originalPackage, String newName) {
return IterableTools.children(getCustomConverters(), new TypeRefactoringParticipant.RenamePackageEditsTransformer(originalPackage, newName));
}
// ********** validation **********
/**
* The converters are validated in the persistence unit.
* @see org.eclipse.jpt.jpa.eclipselink.core.context.persistence.EclipseLinkPersistenceUnit#validateConverters(List, IReporter)
*/
@Override
public void validate(List<IMessage> messages, IReporter reporter) {
super.validate(messages, reporter);
// converters are validated in the persistence unit
}
public TextRange getValidationTextRange() {
TextRange textRange = this.xmlConverterContainer.getValidationTextRange();
return (textRange != null) ? textRange : this.parent.getValidationTextRange();
}
// ********** misc **********
@SuppressWarnings("unchecked")
public Iterable<EclipseLinkConverter> getConverters() {
return IterableTools.<EclipseLinkConverter>concatenate(
this.getCustomConverters(),
this.getObjectTypeConverters(),
this.getStructConverters(),
this.getTypeConverters()
);
}
public int getConvertersSize() {
return this.getCustomConvertersSize()
+ this.getObjectTypeConvertersSize()
+ this.getStructConvertersSize()
+ this.getTypeConvertersSize();
}
public int getMaximumAllowedConverters() {
return this.parent.getMaximumAllowedConverters();
}
// ********** completion proposals **********
@Override
public Iterable<String> getCompletionProposals(int pos) {
Iterable<String> result = super.getCompletionProposals(pos);
if (result != null) {
return result;
}
for (EclipseLinkOrmCustomConverter converter : this.customConverterContainer) {
result = converter.getCompletionProposals(pos);
if (result != null) {
return result;
}
}
for (EclipseLinkOrmStructConverter converter : this.structConverterContainer) {
result = converter.getCompletionProposals(pos);
if (result != null) {
return result;
}
}
for (EclipseLinkOrmObjectTypeConverter converter : this.objectTypeConverterContainer) {
result = converter.getCompletionProposals(pos);
if (result != null) {
return result;
}
}
for (EclipseLinkOrmTypeConverter converter : this.typeConverterContainer) {
result = converter.getCompletionProposals(pos);
if (result != null) {
return result;
}
}
return null;
}
}