/*
* 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.core.metamodel;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EReference;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.metamodel.aspect.MetamodelAspect;
import org.teiid.designer.core.metamodel.aspect.MetamodelEntity;
/**
* MetamodelEntityImpl
*
* @since 8.0
*/
public class MetamodelEntityImpl implements MetamodelEntity {
private final URI metamodelURI;
private final EClass eClass;
private Map aspectMap; // keyed on aspect id
private List referencedClasses;
private List containedClasses;
private List attributes;
private List uniReferences;
/**
* Construct an instance of MetamodelEntityImpl.
*
*/
public MetamodelEntityImpl(final URI metamodelURI, final EClass eClass) {
if (metamodelURI == null) {
final String msg = ModelerCore.Util.getString("MetamodelEntityImpl.The_metamodel_URI_reference_may_not_be_null_1"); //$NON-NLS-1$
throw new IllegalArgumentException(msg);
}
if (eClass == null) {
final String msg = ModelerCore.Util.getString("MetamodelEntityImpl.The_EObject_reference_may_not_be_null_1"); //$NON-NLS-1$
throw new IllegalArgumentException(msg);
}
this.metamodelURI = metamodelURI;
this.eClass = eClass;
}
//#############################################################################
//# MetamodelEntity method implementations
//#############################################################################
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.MetamodelEntity#getDisplayName()
*/
@Override
public String getDisplayName() {
return null;
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.MetamodelEntity#getPluralDisplayName()
*/
@Override
public String getPluralDisplayName() {
return null;
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.MetamodelEntity#getIconPath()
*/
@Override
public String getIconPath() {
return null;
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.MetamodelEntity#getTooltip()
*/
@Override
public String getTooltip() {
return null;
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.MetamodelEntity#getMetamodelAspect(java.lang.String)
*/
@Override
public MetamodelAspect getMetamodelAspect(final String id) {
if ( aspectMap == null ) {
return null;
}
return (MetamodelAspect) aspectMap.get(id);
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.MetamodelEntity#getMetamodelAspects()
*/
@Override
public Collection getMetamodelAspects() {
if ( aspectMap == null ) {
return Collections.EMPTY_LIST;
}
return aspectMap.values();
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.MetamodelEntity#getEClass()
*/
@Override
public EClass getEClass() {
return this.eClass;
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.MetamodelEntity#getAttributes()
*/
@Override
public List getAttributes() {
final EClass metamodelClass = this.getEClass();
if ( attributes == null ) {
final List attribs = metamodelClass.getEAllAttributes();
attributes = new ArrayList(attribs.size());
}
return attributes;
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.MetamodelEntity#getContainedClasses()
*/
@Override
public List getContainedClasses() {
final EClass metamodelClass = this.getEClass();
if ( containedClasses == null ) {
final List refs = metamodelClass.getEAllContainments();
containedClasses = new ArrayList(refs.size());
for (Iterator iter = refs.iterator(); iter.hasNext();) {
final EReference eRef = (EReference) iter.next();
if (eRef.getEType() instanceof EClass) {
containedClasses.add(eRef.getEType());
}
}
}
return containedClasses;
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.MetamodelEntity#getReferencedClasses()
*/
@Override
public List getReferencedClasses() {
final EClass metamodelClass = this.getEClass();
if ( referencedClasses == null ) {
final List refs = metamodelClass.getEAllReferences();
referencedClasses = new ArrayList(refs.size());
// Find all EClass instances that are referenced by this class
for (Iterator iter = refs.iterator(); iter.hasNext();) {
final EReference eRef = (EReference) iter.next();
if ( !eRef.isContainment() && eRef.getEType() instanceof EClass) {
referencedClasses.add(eRef.getEType());
}
}
}
return referencedClasses;
}
/* (non-Javadoc)
* @See org.teiid.designer.core.metamodel.aspect.MetamodelEntity#getUniDirectionalReferences()
*/
@Override
public List getUniDirectionalReferences() {
final EClass metamodelClass = this.getEClass();
if ( uniReferences == null ) {
final List refs = metamodelClass.getEAllReferences();
uniReferences = new ArrayList();
// Find all references by this class that do not have an oppossite reference
for (Iterator iter = refs.iterator(); iter.hasNext();) {
final EReference eRef = (EReference) iter.next();
if ( !eRef.isContainment() && eRef.getEOpposite() == null) {
uniReferences.add(eRef);
}
}
}
return uniReferences;
}
//#############################################################################
//# public methods
//#############################################################################
public URI getMetamodelURI() {
return this.metamodelURI;
}
public void addMetamodelAspect(final String id, final MetamodelAspect aspect) {
if ( aspectMap == null ) {
aspectMap = new HashMap();
}
aspectMap.put(id,aspect);
}
}