Java tutorial
/******************************************************************************* * Copyright (c) 2010-2013, Abel Hegedus, Istvan Rath and Daniel Varro * 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: * Abel Hegedus - initial API and implementation *******************************************************************************/ package org.eclipse.viatra.addon.querybasedfeatures.runtime.handler; import java.util.StringTokenizer; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.viatra.addon.querybasedfeatures.runtime.QueryBasedFeatureKind; import com.google.common.collect.Iterables; /** * @author Abel Hegedus * */ public class QueryBasedFeatures { public static final String ANNOTATION_LITERAL = "QueryBasedFeature"; public static final String ANNOTATION_SOURCE = "org.eclipse.viatra.query.querybasedfeature"; public static final String LEGACY_ANNOTATION_SOURCE = "org.eclipse.incquery.querybasedfeature"; public static final String PATTERN_FQN_KEY = "patternFQN"; public static final String ECORE_ANNOTATION = "http://www.eclipse.org/emf/2002/Ecore"; public static final String SETTING_DELEGATES_KEY = "settingDelegates"; private QueryBasedFeatures() { } public static SingleValueQueryBasedFeature newSingleValueFeature(EStructuralFeature feature, boolean keepCache) { return new SingleValueQueryBasedFeature(feature, keepCache); } public static MultiValueQueryBasedFeature newMultiValueFeatue(EStructuralFeature feature, boolean keepCache) { return new MultiValueQueryBasedFeature(feature, keepCache); } public static SumQueryBasedFeature newSumFeature(EStructuralFeature feature) { return new SumQueryBasedFeature(feature, QueryBasedFeatureKind.SUM); } public static boolean checkEcoreAnnotation(EPackage pckg, EStructuralFeature feature, String patternFQN, boolean useModelCode) { boolean annotationsOK = true; if (!useModelCode) { annotationsOK = QueryBasedFeatures.checkEcorePackageAnnotation(pckg); } annotationsOK &= QueryBasedFeatures.checkFeatureAnnotation(feature, patternFQN); return annotationsOK; } public static boolean checkEcorePackageAnnotation(EPackage pckg) { return Iterables.any(pckg.getEAnnotations(), annotation -> { if (QueryBasedFeatures.ECORE_ANNOTATION.equals(annotation.getSource())) { return Iterables.any(annotation.getDetails().entrySet(), entry -> { if (QueryBasedFeatures.SETTING_DELEGATES_KEY.equals(entry.getKey())) { StringTokenizer delegateTokents = new StringTokenizer(entry.getValue()); while (delegateTokents.hasMoreTokens()) { if (QueryBasedFeatures.ANNOTATION_SOURCE.equals(delegateTokents.nextToken())) { return true; } } } return false; }); } return false; }); } public static boolean checkFeatureAnnotation(EStructuralFeature feature, final String patternFQN) { return Iterables.any(feature.getEAnnotations(), annotation -> { if (QueryBasedFeatures.ANNOTATION_SOURCE.equals(annotation.getSource())) { return Iterables.any(annotation.getDetails().entrySet(), entry -> { boolean keyOK = QueryBasedFeatures.PATTERN_FQN_KEY.equals(entry.getKey()); boolean valueOK = patternFQN.equals(entry.getValue()); return keyOK && valueOK; }); } return false; }); } }