/* * 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.util; import java.util.HashMap; import java.util.Map; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.teiid.designer.core.resource.EmfResource; import org.teiid.designer.metamodels.core.ModelAnnotation; /** * A {@link ModelVisitor} implementation that records the number of instances of each {@link EClass primary metamodel EClass} and * the number of {@link Resource} instances. For a {@link ModelVisitor} that records the number of all instances of each * {@link EClass}, see {@link org.teiid.designer.core.util.ModelStatisticsVisitor}. * <p> * This class is not thread safe. * </p> * <p> * For usage information, see {@link ModelVisitor} * </p> * * @since 8.0 */ public class PrimaryMetamodelStatisticsVisitor extends ModelStatisticsVisitor { private final Map resourceToPrimaryMetamodelUri; private static final String NO_PACKAGE_FOUND_URI = ""; //$NON-NLS-1$ /** * Construct an instance of PrimaryMetamodelModelStatisticsVisitor. */ public PrimaryMetamodelStatisticsVisitor() { super(); this.resourceToPrimaryMetamodelUri = new HashMap(); } /** * @see org.teiid.designer.core.util.ModelStatisticsVisitor#visit(org.eclipse.emf.ecore.EObject) */ @Override public boolean visit( final EObject object ) { // see if object is instance of a metaclass in the model's primary metamodel if (object != null) { final Resource resource = object.eResource(); if (resource != null) { String primaryMetamodelUri = (String)this.resourceToPrimaryMetamodelUri.get(resource); if (primaryMetamodelUri == null) { if (resource instanceof EmfResource) { final ModelAnnotation modelAnn = ((EmfResource)resource).getModelAnnotation(); if (modelAnn != null) { primaryMetamodelUri = modelAnn.getPrimaryMetamodelUri(); } } if (primaryMetamodelUri == null) { // Metamodel was not found, so use the constant primaryMetamodelUri = NO_PACKAGE_FOUND_URI; } this.resourceToPrimaryMetamodelUri.put(resource, primaryMetamodelUri); } // See if the primary metamodel matches the object's metamodel ... if (primaryMetamodelUri != NO_PACKAGE_FOUND_URI) { final String metamodelUri = object.eClass().getEPackage().getNsURI(); if (!primaryMetamodelUri.equals(metamodelUri)) { return true; // skip this object, but continue down } } } } return super.visit(object); } /** * @see org.teiid.designer.core.util.ModelStatisticsVisitor#clear() */ @Override public void clear() { super.clear(); this.resourceToPrimaryMetamodelUri.clear(); } }