/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.mapping.factory;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.provider.AdapterFactoryItemDelegator;
import org.teiid.designer.core.ModelEditor;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.metamodel.aspect.AspectManager;
import org.teiid.designer.core.metamodel.aspect.MetamodelAspect;
import org.teiid.designer.core.metamodel.aspect.sql.SqlColumnAspect;
import org.teiid.designer.core.metamodel.aspect.sql.SqlProcedureParameterAspect;
/**
* DefaultMappableTree
*
* @since 8.0
*/
public class DefaultMappableTree implements IMappableTree {
private EObject treeRoot;
private AdapterFactoryItemDelegator emfContentProvider;
/**
* Construct an instance of DefaultMappableTree.
*/
public DefaultMappableTree(EObject treeRoot) {
this.treeRoot = treeRoot;
}
public AdapterFactoryItemDelegator getModelContentProvider() {
if ( emfContentProvider == null ) {
AdapterFactory factory = ModelerCore.getMetamodelRegistry().getAdapterFactory();
emfContentProvider = new AdapterFactoryItemDelegator(factory);
}
return emfContentProvider;
}
/* (non-Javadoc)
* @See org.teiid.designer.mapping.factory.MappableTree#getTreeRoot()
*/
@Override
public EObject getTreeRoot() {
return treeRoot;
}
/* (non-Javadoc)
* @See org.teiid.designer.mapping.factory.MappableTree#getParent(org.eclipse.emf.ecore.EObject)
*/
@Override
public EObject getParent(EObject node) {
Object parent = getModelContentProvider().getParent(node);
if ( parent instanceof EObject ) {
return (EObject) parent;
}
return null;
}
/* (non-Javadoc)
* @See org.teiid.designer.mapping.factory.MappableTree#getChildren(org.eclipse.emf.ecore.EObject)
*/
@Override
public Collection getChildren(EObject node) {
return getModelContentProvider().getChildren(node);
}
/* (non-Javadoc)
* @See org.teiid.designer.mapping.factory.IMappableTree#isAncestorOf(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EObject)
*/
@Override
public boolean isAncestorOf(EObject ancestor, EObject descendent) {
EObject parent = getParent(descendent);
while ( parent != null ) {
if ( parent.equals(ancestor) ) {
return true;
}
parent = getParent(parent);
}
return false;
}
/* (non-Javadoc)
* @See org.teiid.designer.mapping.factory.IMappableTree#isParentOf(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EObject)
*/
@Override
public boolean isParentOf(EObject parent, EObject child) {
return getParent(child).equals(parent);
}
/* (non-Javadoc)
* @See org.teiid.designer.mapping.factory.IMappableTree#getExternalRoots(boolean)
*/
@Override
public List getExternalRoots(boolean recurseFragments) {
return Collections.EMPTY_LIST;
}
/* (non-Javadoc)
* @See org.teiid.designer.mapping.factory.IMappableTree#isExternal(org.eclipse.emf.ecore.EObject)
*/
@Override
public boolean isExternal(EObject node) {
return false;
}
/* (non-Javadoc)
* @See org.teiid.designer.mapping.factory.IMappableTree#getDatatype(org.eclipse.emf.ecore.EObject)
*/
@Override
public EObject getDatatype(EObject node) {
EObject result = null;
MetamodelAspect aspect = AspectManager.getSqlAspect(node);
if ( aspect instanceof SqlColumnAspect ) {
result = ((SqlColumnAspect) aspect).getDatatype(node);
} else if ( aspect instanceof SqlProcedureParameterAspect ) {
result = ((SqlProcedureParameterAspect) aspect).getDatatype(node);
}
return result;
}
/* (non-Javadoc)
* @See org.teiid.designer.mapping.factory.IMappableTree#isChoiceNode(org.eclipse.emf.ecore.EObject)
*/
@Override
public boolean isChoiceNode(EObject node) {
IChoiceFactory factory = ChoiceFactoryManager.getChoiceFactory(node);
if ( factory != null && factory.supports(node) ) {
return true;
}
return false;
}
/* (non-Javadoc)
* @See org.teiid.designer.mapping.factory.IMappableTree#isSiblingOf(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EObject, boolean)
*/
@Override
public boolean isSiblingOf(EObject instance, EObject possibleSibling, boolean higherOrderOnly) {
boolean result = false;
result = instance.eContainer().equals(possibleSibling.eContainer());
if ( result && higherOrderOnly ) {
List siblingList = instance.eContainer().eContents();
int a = siblingList.indexOf(instance);
int b = siblingList.indexOf(possibleSibling);
result = b < a;
}
return result;
}
/* (non-Javadoc)
* @See org.teiid.designer.mapping.factory.IMappableTree#areEquivalent(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EObject)
*/
@Override
public boolean areEquivalent(EObject objA, EObject objB) {
return false;
}
/* (non-Javadoc)
* @See org.teiid.designer.mapping.factory.IMappableTree#getUniqueName(org.eclipse.emf.ecore.EObject)
*/
@Override
public String getUniqueName(EObject node) {
ModelEditor editor = ModelerCore.getModelEditor();
String name = editor.getName(node);
return name + '_' + editor.getName(node.eContainer());
}
}