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.Iterator;
import java.util.Map;
import java.util.Set;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EStructuralFeature;
public class FieldIgnoreMap implements ObjectIDM {
private final Set<StructuralFeatureIdentifier> generalIgnoreSet = new HashSet<StructuralFeatureIdentifier>();
private final Map<EClass, Set<StructuralFeatureIdentifier>> specificIncludeMap = new HashMap<EClass, Set<StructuralFeatureIdentifier>>();
private final Set<? extends EPackage> packages;
public FieldIgnoreMap(Set<? extends EPackage> ePackages) {
packages = ePackages;
}
public void addToGeneralIgnoreSet(StructuralFeatureIdentifier structuralFeatureIdentifier) {
generalIgnoreSet.add(structuralFeatureIdentifier);
}
public void addToSpecificIncludeMap(EClass eClass, StructuralFeatureIdentifier structuralFeatureIdentifier) {
if (specificIncludeMap.containsKey(eClass)) {
specificIncludeMap.get(eClass).add(structuralFeatureIdentifier);
} else {
HashSet<StructuralFeatureIdentifier> hashSet = new HashSet<StructuralFeatureIdentifier>();
specificIncludeMap.put(eClass, hashSet);
specificIncludeMap.put(eClass, hashSet);
}
}
protected EClass getEClass(String className) {
for (EPackage ePackage : packages) {
if (ePackage.getEClassifier(className) != null) {
return (EClass)ePackage.getEClassifier(className);
}
}
return null;
}
public void removeFromGeneralIgnoreSet(EStructuralFeature eStructuralFeature) {
Iterator<StructuralFeatureIdentifier> iterator = generalIgnoreSet.iterator();
while (iterator.hasNext()) {
StructuralFeatureIdentifier next = iterator.next();
if (next.geteStructuralFeature().equals(eStructuralFeature.getName())) {
iterator.remove();
}
}
}
public boolean removeFromGeneralIgnoreSet(StructuralFeatureIdentifier structuralFeatureIdentifier) {
return generalIgnoreSet.remove(structuralFeatureIdentifier);
}
protected EStructuralFeature getEStructuralFeature(String className, String fieldName) {
for (EPackage ePackage : packages) {
if (ePackage.getEClassifier(className) != null) {
EClass eClass = (EClass)ePackage.getEClassifier(className);
return eClass.getEStructuralFeature(fieldName);
}
}
return null;
}
public boolean shouldFollowReference(EClass originalQueryClass, EClass eClass, EStructuralFeature eStructuralFeature) {
StructuralFeatureIdentifier o = new StructuralFeatureIdentifier(eClass.getName(), eStructuralFeature.getName());
boolean generalShouldIgnoreAnswer = generalIgnoreSet.contains(o);
if (generalShouldIgnoreAnswer) {
// If the general ignore file says ignore, we should check for a specific override
if (specificIncludeMap.containsKey(originalQueryClass)) {
return specificIncludeMap.get(originalQueryClass).contains(o);
}
return false;
}
return true;
}
@Override
public boolean shouldIncludeClass(EClass originalClass, EClass eClass) {
return true;
}
}