/*
* 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.aspect;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.metamodel.aspect.relationship.RelationshipMetamodelAspect;
import org.teiid.designer.core.metamodel.aspect.sql.SqlAspect;
import org.teiid.designer.core.metamodel.aspect.uml.UmlDiagramAspect;
/**
* This class looks up aspects and caches them.
*
* @since 8.0
*/
public class AspectManager {
private static Class sqlAspectId = SqlAspect.class;
private static Class validationAspectId = ValidationAspect.class;
private static Class umlDiagramAspectId = UmlDiagramAspect.class;
private static Class relationshipAspectId = RelationshipMetamodelAspect.class;
private static Class importsAspectId = ImportsAspect.class;
// --------------------------------------------------------
// Modified 3/20/07 - BML (reviewed by John V.)
// Defect 23839 - the call to the MetamodelRegistry's MetamodelAspect factory is expensive.
// So, let's cache the aspects in this manager
private static Map sqlAspectMap = new HashMap();
private static Map validationAspectMap = new HashMap();
private static Map umlDiagramAspectMap = new HashMap();
private static Map relationshipsAspectMap = new HashMap();
private static Map modelImportsAspectMap = new HashMap();
// --------------------------------------------------------
/**
* Get the SqlAspect given an EObject
* @param eObject the EObject
* @return the SqlAspect for the supplied EObject
*/
public static SqlAspect getSqlAspect(final EObject eObject) {
SqlAspect existingAspect = null;
if(eObject != null) {
EClass eClass = (eObject instanceof EClass ? (EClass)eObject : eObject.eClass());
existingAspect = (SqlAspect)sqlAspectMap.get(eClass.getName());
if( existingAspect == null ) {
existingAspect = (SqlAspect) ModelerCore.getMetamodelRegistry().getMetamodelAspect( eClass, sqlAspectId );
if( existingAspect != null ) {
sqlAspectMap.put(eClass.getName(), existingAspect);
}
}
}
return existingAspect;
}
/**
* Get the SqlAspect given an EObject
* @param eObject the EObject
* @return the SqlAspect for the supplied EObject
*/
public static ValidationAspect getValidationAspect(EObject eObject) {
ValidationAspect existingAspect = null;
if(eObject != null) {
EClass eClass = (eObject instanceof EClass ? (EClass)eObject : eObject.eClass());
existingAspect = (ValidationAspect)validationAspectMap.get(eClass.getName());
if( existingAspect == null ) {
existingAspect = (ValidationAspect) ModelerCore.getMetamodelRegistry().getMetamodelAspect( eClass, validationAspectId );
if( existingAspect != null ) {
validationAspectMap.put(eClass.getName(), existingAspect);
}
}
}
return existingAspect;
}
/**
* Get the SqlAspect given an EObject
* @param eObject the EObject
* @return the SqlAspect for the supplied EObject
*/
public static UmlDiagramAspect getUmlDiagramAspect(EObject eObject) {
UmlDiagramAspect existingAspect = null;
if(eObject != null) {
EClass eClass = (eObject instanceof EClass ? (EClass)eObject : eObject.eClass());
existingAspect = (UmlDiagramAspect)umlDiagramAspectMap.get(eClass.getName());
if( existingAspect == null ) {
existingAspect = (UmlDiagramAspect) ModelerCore.getMetamodelRegistry().getMetamodelAspect( eClass, umlDiagramAspectId );
if( existingAspect != null ) {
umlDiagramAspectMap.put(eClass.getName(), existingAspect);
}
}
}
return existingAspect;
}
/**
* Get the RelationshipAspect given an EObject
* @param eObject the EObject
* @return the RelationshipAspect for the supplied EObject
*/
public static RelationshipMetamodelAspect getRelationshipAspect(EObject eObject) {
RelationshipMetamodelAspect existingAspect = null;
if(eObject != null) {
EClass eClass = (eObject instanceof EClass ? (EClass)eObject : eObject.eClass());
existingAspect = (RelationshipMetamodelAspect)relationshipsAspectMap.get(eClass.getName());
if( existingAspect == null ) {
existingAspect = (RelationshipMetamodelAspect) ModelerCore.getMetamodelRegistry().getMetamodelAspect( eClass, relationshipAspectId );
if( existingAspect != null ) {
relationshipsAspectMap.put(eClass.getName(), existingAspect);
}
}
}
return existingAspect;
}
/**
* Get the ImportsAspect given an EObject
* @param eObject the EObject
* @return the ImportsAspect for the supplied EObject
*/
public static ImportsAspect getModelImportsAspect(EObject eObject) {
ImportsAspect existingAspect = null;
if(eObject != null) {
EClass eClass = (eObject instanceof EClass ? (EClass)eObject : eObject.eClass());
existingAspect = (ImportsAspect)modelImportsAspectMap.get(eClass.getName());
if( existingAspect == null ) {
existingAspect = (ImportsAspect) ModelerCore.getMetamodelRegistry().getMetamodelAspect( eClass, importsAspectId );
if( existingAspect != null ) {
modelImportsAspectMap.put(eClass.getName(), existingAspect);
}
}
}
return existingAspect;
}
}