/******************************************************************************* * Copyright (c) 2009, 2010 SAP AG and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * SAP AG - initial API and implementation ******************************************************************************/ package org.eclipse.ocl.examples.impactanalyzer.benchmark.preparation.ocl; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import org.eclipse.emf.ecore.EAnnotation; 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.EcorePackage; import org.eclipse.ocl.ecore.OCLExpression; import org.eclipse.ocl.ecore.delegate.OCLDelegateDomain; import org.eclipse.ocl.ecore.delegate.SettingBehavior; import org.eclipse.ocl.ecore.delegate.ValidationBehavior; import org.eclipse.ocl.examples.impactanalyzer.util.OCL; /** * The {@link OCLExpressionFromModelPicker} extracts constraints out of the * NGPM meta model and parses them. * * @author Manuel Holzleitner (D049667) */ public class OCLExpressionFromModelPicker implements OCLExpressionPicker { public List<OCLExpressionWithContext> pickUpExpressions() { return pickUpExpressions(data.classes.ClassesPackage.eINSTANCE, data.constraints.ConstraintsPackage.eINSTANCE, data.documents.DocumentsPackage.eINSTANCE, data.generics.GenericsPackage.eINSTANCE, data.quantitystructure.QuantitystructurePackage.eINSTANCE, data.timedependency.TimedependencyPackage.eINSTANCE, data.tuples.TuplesPackage.eINSTANCE, dataaccess.analytics.AnalyticsPackage.eINSTANCE, dataaccess.expressions.ExpressionsPackage.eINSTANCE, dataaccess.expressions.fp.FpPackage.eINSTANCE, dataaccess.expressions.literals.LiteralsPackage.eINSTANCE, dataaccess.query.QueryPackage.eINSTANCE, behavioral.actions.ActionsPackage.eINSTANCE, behavioral.bpdm.BpdmPackage.eINSTANCE, behavioral.businesstasks.BusinesstasksPackage.eINSTANCE, behavioral.events.EventsPackage.eINSTANCE, behavioral.rules.RulesPackage.eINSTANCE, persistence.actions.ActionsPackage.eINSTANCE, persistence.expressions.ExpressionsPackage.eINSTANCE); } public List<OCLExpressionWithContext> pickUpExpressions(EPackage... packages){ List<OCLExpressionWithContext> expressionSet = new ArrayList<OCLExpressionWithContext>( searchAndParseExpressions(packages)); return expressionSet; } private Collection<OCLExpressionWithContext> searchAndParseExpressions(EPackage... ps) { Collection<OCLExpressionWithContext> allConstraints = new HashSet<OCLExpressionWithContext>(); for (EPackage p : ps) { for (EClassifier c : p.getEClassifiers()) { if (c instanceof EClass) { for (OCLExpression invariant : getInvariants((EClass) c)) { allConstraints.add(new OCLExpressionWithContext(invariant, (EClass) c)); } for (EAttribute at : ((EClass) c).getEAttributes()) { EAnnotation a = at.getEAnnotation(OCLDelegateDomain.OCL_DELEGATE_URI); if (a != null) { System.out.println("hurra"); allConstraints.add(new OCLExpressionWithContext(SettingBehavior.INSTANCE.getFeatureBody( OCL.newInstance(), at), (EClass) c)); } } } } } return allConstraints; } private Collection<OCLExpression> getInvariants(EClass c) { Collection<OCLExpression> result = new HashSet<OCLExpression>(); EAnnotation ann = c.getEAnnotation(EcorePackage.eNS_URI); if (ann != null) { String spaceSeparatedConstraintNames = ann.getDetails().get("constraints"); if (spaceSeparatedConstraintNames != null) { String[] constraintNames = spaceSeparatedConstraintNames.split(" "); for (final String constraintName : constraintNames) { OCLExpression invariant = ValidationBehavior.INSTANCE.getInvariant(c, constraintName, OCL.newInstance()); result.add(invariant); } } } return result; } }