package org.bimserver.emf;
/******************************************************************************
* Copyright (C) 2009-2014 BIMserver.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*****************************************************************************/
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.bimserver.models.ifc2x3tc1.Ifc2x3tc1Package;
import org.bimserver.models.log.LogPackage;
import org.bimserver.models.store.StorePackage;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
public class MetaDataManager {
private final Map<String, EPackage> ePackages = new TreeMap<String, EPackage>();
private final Map<String, Set<EClass>> directSubClasses = new TreeMap<String, Set<EClass>>();
private final Map<String, Set<EClass>> allSubClasses = new TreeMap<String, Set<EClass>>();
private final Map<String, EClassifier> caseInsensitive = new TreeMap<String, EClassifier>();
private final Map<String, EClassifier> caseSensitive = new TreeMap<String, EClassifier>();
public MetaDataManager(Set<EPackage> ePackages) {
for (EPackage ePackage : ePackages) {
addEPackage(ePackage);
}
}
public MetaDataManager() {
addEPackage(Ifc2x3tc1Package.eINSTANCE);
addEPackage(StorePackage.eINSTANCE);
addEPackage(LogPackage.eINSTANCE);
}
public void addEPackage(EPackage ePackage) {
ePackages.put(ePackage.getName(), ePackage);
for (EClassifier eClassifier : ePackage.getEClassifiers()) {
caseInsensitive.put(eClassifier.getName().toLowerCase(), eClassifier);
caseSensitive.put(eClassifier.getName(), eClassifier);
if (eClassifier instanceof EClass) {
EClass eClass = (EClass)eClassifier;
if (!allSubClasses.containsKey(eClass.getName())) {
allSubClasses.put(eClass.getName(), new HashSet<EClass>());
}
if (!directSubClasses.containsKey(eClass.getName())) {
directSubClasses.put(eClass.getName(), new HashSet<EClass>());
}
for (EClass superClass : eClass.getEAllSuperTypes()) {
if (!allSubClasses.containsKey(superClass.getName())) {
allSubClasses.put(superClass.getName(), new HashSet<EClass>());
}
allSubClasses.get(superClass.getName()).add(eClass);
}
for (EClass superClass : eClass.getESuperTypes()) {
if (!directSubClasses.containsKey(superClass.getName())) {
directSubClasses.put(superClass.getName(), new HashSet<EClass>());
}
directSubClasses.get(superClass.getName()).add(eClass);
}
}
}
}
public Set<EClass> getDirectSubClasses(EClass superClass) {
return directSubClasses.get(superClass.getName());
}
public Set<EClass> getAllSubClasses(EClass superClass) {
return allSubClasses.get(superClass.getName());
}
public EClassifier getEClassifier(String type) {
return caseSensitive.get(type);
}
public EClassifier getEClassifierCaseInsensitive(String type) {
return caseInsensitive.get(type.toLowerCase());
}
public EAttribute getEAttribute(String className, String attributeName) {
// TODO add packageName argument and use hashmap for lookup
for (EPackage ePackage : ePackages.values()) {
EClassifier eClassifier = ePackage.getEClassifier(className);
if (eClassifier instanceof EClass) {
EClass eClass = (EClass)eClassifier;
EStructuralFeature eStructuralFeature = eClass.getEStructuralFeature(attributeName);
if (eStructuralFeature instanceof EAttribute) {
return (EAttribute) eStructuralFeature;
}
}
}
return null;
}
public EReference getEReference(String className, String referenceName) {
// TODO add packageName argument and use hashmap for lookup
for (EPackage ePackage : ePackages.values()) {
EClassifier eClassifier = ePackage.getEClassifier(className);
if (eClassifier instanceof EClass) {
EClass eClass = (EClass)eClassifier;
EStructuralFeature eStructuralFeature = eClass.getEStructuralFeature(referenceName);
if (eStructuralFeature instanceof EReference) {
return (EReference) eStructuralFeature;
}
}
}
return null;
}
}