package org.bimserver.plugins.objectidms;
/******************************************************************************
* 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.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.bimserver.emf.MetaDataManager;
import org.bimserver.models.ifc2x3tc1.Ifc2x3tc1Package;
import org.bimserver.plugins.schema.Attribute;
import org.bimserver.plugins.schema.EntityDefinition;
import org.bimserver.plugins.schema.InverseAttribute;
import org.bimserver.plugins.schema.SchemaDefinition;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
public class AbstractObjectIDM implements ObjectIDM {
private final Set<EClass> includedClasses = new HashSet<EClass>();
private final Map<EClass, Set<EStructuralFeature>> includedFeatures = new HashMap<EClass, Set<EStructuralFeature>>();
private final MetaDataManager metaDataManager = new MetaDataManager();
private final Map<EClass, AbstractObjectIDM> originMap = new HashMap<EClass, AbstractObjectIDM>();
private final SchemaDefinition schema;
public AbstractObjectIDM(SchemaDefinition schema) {
this.schema = schema;
}
public void includeAllClasses() {
for (EClassifier eClassifier : Ifc2x3tc1Package.eINSTANCE.getEClassifiers()) {
if (eClassifier instanceof EClass) {
includedClasses.add((EClass)eClassifier);
}
}
}
public void exclude(EClass eClass) {
includedClasses.remove(eClass);
for (EClass subClass : metaDataManager.getDirectSubClasses(eClass)) {
exclude(subClass);
}
}
public SchemaDefinition getSchema() {
return schema;
}
public void include(EClass eClass) {
includedClasses.add(eClass);
for (EClass subClass : metaDataManager.getDirectSubClasses(eClass)) {
include(subClass);
}
}
public AbstractObjectIDM getOrigin(EClass originalClass) {
if (!originMap.containsKey(originalClass)) {
AbstractObjectIDM originObjectIdm = new AbstractObjectIDM(getSchema());
originMap.put(originalClass, originObjectIdm);
return originObjectIdm;
}
return originMap.get(originalClass);
}
protected boolean isInverse(EStructuralFeature eStructuralFeature) throws ObjectIDMException {
if (eStructuralFeature instanceof EReference && eStructuralFeature.getEContainingClass().getEAnnotation("wrapped") == null) {
if (eStructuralFeature.getEAnnotation("hidden") == null && eStructuralFeature.getEContainingClass().getEAnnotation("hidden") == null) {
EntityDefinition entityBN = schema.getEntityBN(eStructuralFeature.getEContainingClass().getName());
if (entityBN == null) {
throw new ObjectIDMException(eStructuralFeature.getEContainingClass().getName() + " not found");
}
Attribute attribute = entityBN.getAttributeBNWithSuper(eStructuralFeature.getName());
return attribute instanceof InverseAttribute;
} else {
return false;
}
}
return false;
}
public void include(EClass eClass, EStructuralFeature eStructuralFeature) {
if (!includedFeatures.containsKey(eClass)) {
includedFeatures.put(eClass, new HashSet<EStructuralFeature>());
}
includedFeatures.get(eClass).add(eStructuralFeature);
for (EClass subClass : metaDataManager.getDirectSubClasses(eClass)) {
include(subClass, eStructuralFeature);
}
}
public void exclude(EClass eClass, EStructuralFeature eStructuralFeature) {
if (includedFeatures.containsKey(eClass)) {
includedFeatures.get(eClass).remove(eStructuralFeature);
}
for (EClass subClass : metaDataManager.getDirectSubClasses(eClass)) {
exclude(subClass, eStructuralFeature);
}
}
@Override
public boolean shouldFollowReference(EClass originalClass, EClass eClass, EStructuralFeature eStructuralFeature) {
if (originMap.containsKey(originalClass)) {
return originMap.get(originalClass).shouldFollowReference(originalClass, eClass, eStructuralFeature);
} else {
return includedFeatures.containsKey(eClass) && includedFeatures.get(eClass).contains(eStructuralFeature);
}
}
@Override
public boolean shouldIncludeClass(EClass originalClass, EClass eClass) {
if (originMap.containsKey(originalClass)) {
return originMap.get(originalClass).shouldIncludeClass(originalClass, eClass);
} else {
return includedClasses.contains(eClass);
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("Included classes:\n");
for (EClass eClass : includedClasses) {
sb.append(" " + eClass.getName() + "\n");
}
sb.append("Included features:\n");
for (EClass eClass : includedFeatures.keySet()) {
sb.append(" " + eClass.getName() + "\n");
for (EStructuralFeature eStructuralFeature : includedFeatures.get(eClass)) {
sb.append(" " + eStructuralFeature.getName() + "\n");
}
}
return sb.toString();
}
}