[420464] - Add new functionality to Teneo to select teneo annotations
diff --git a/core/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/PersistenceOptions.java b/core/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/PersistenceOptions.java
index 8c74465..e4ad013 100755
--- a/core/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/PersistenceOptions.java
+++ b/core/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/PersistenceOptions.java
@@ -482,6 +482,16 @@
 	 */
 	public static final String EXTRA_ANNOTATION_SOURCES = MAPPING_PREFIX + "extra_annotation_sources";
 
+	/**
+	 * If set to true then the extra annotation source will override/replace the default annotation
+	 * sources, so they are used if present, but if the extra annotation is not present on the model
+	 * element then the default annotation is checked.
+	 * 
+	 * Default is false for backward compatibility.
+	 */
+	public static final String EXTRA_ANNOTATIONS_OVERRIDES_DEFAULT = MAPPING_PREFIX
+			+ "use_default_if_no_extra_annotation_sources";
+
 	public final static String ECONTAINER_CLASS_COLUMN = "econtainer_class_column";
 	public final static String ECONTAINER_COLUMN = "e_container_column";
 	public final static String ECONTAINER_FEATURE_NAME_COLUMN = "e_container_feature_name_column";
@@ -563,6 +573,7 @@
 		props.setProperty(ECONTAINER_FEATURE_NAME_COLUMN, Constants.COLUMN_ECONTAINER_FEATURE_NAME);
 		props.setProperty(FEATUREMAP_AS_COMPONENT, "false");
 		props.setProperty(EXTRA_ANNOTATION_SOURCES, "");
+		props.setProperty(EXTRA_ANNOTATIONS_OVERRIDES_DEFAULT, "false");
 		props.setProperty(AUTO_ADAPT_MANUAL_SET_SQL_NAMES, "true");
 
 		return props;
@@ -581,6 +592,14 @@
 	}
 
 	/**
+	 * @return value of {@link #EXTRA_ANNOTATIONS_OVERRIDES_DEFAULT}
+	 */
+	public boolean isExtraAnnotationsOverridesDefault() {
+		return Boolean.valueOf(properties.getProperty(EXTRA_ANNOTATIONS_OVERRIDES_DEFAULT))
+				.booleanValue();
+	}
+
+	/**
 	 * @return value of {@link #HIBERNATE_VERSION}
 	 */
 	public String getHibernateVersion() {
diff --git a/core/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/annotations/parser/EAnnotationParserImporter.java b/core/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/annotations/parser/EAnnotationParserImporter.java
index 5f522c4..6c96c1c 100755
--- a/core/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/annotations/parser/EAnnotationParserImporter.java
+++ b/core/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/annotations/parser/EAnnotationParserImporter.java
@@ -22,6 +22,7 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.ENamedElement;
@@ -58,6 +59,8 @@
 
 	private String[] extraAnnotationsSources = new String[] {};
 
+	private PersistenceOptions persistenceOptions = null;
+
 	/** Parse an pamodel */
 	public void process(PAnnotatedModel paModel) {
 		for (PAnnotatedEPackage pap : paModel.getPaEPackages()) {
@@ -165,10 +168,11 @@
 	private ArrayList<NamedParserNode> process(EAnnotation ea, ENamedElement ene) {
 		final ArrayList<NamedParserNode> result = new ArrayList<NamedParserNode>();
 
-		if (!isValidSource(ea.getSource())) {
+		if (!isValidSource(ea.getSource(), ene.getEAnnotations())) {
 			return result;
 		}
 
+
 		log.debug("Processing annotations ");
 		for (Map.Entry<String, String> pAnnotationDetails : ea.getDetails().entrySet()) {
 			final String fName = pAnnotationDetails.getKey();
@@ -215,7 +219,7 @@
 	}
 
 	/** Is a valid source */
-	protected boolean isValidSource(String source) {
+	protected boolean isValidSource(String source, EList<EAnnotation> eAnnotations) {
 		if (source == null) {
 			return false;
 		}
@@ -226,6 +230,18 @@
 					return true;
 				}
 			}
+
+			// check if there is an extra annotation which could have been used
+			// if so then return false, it should already have been caught in the above if
+			if (persistenceOptions != null && persistenceOptions.isExtraAnnotationsOverridesDefault()) {
+				for (EAnnotation eAnnotation : eAnnotations) {
+					for (String annotationSource : extraAnnotationsSources) {
+						if (eAnnotation.getSource().equals(annotationSource)) {
+							return false;
+						}
+					}
+				}
+			}
 		}
 
 		if (source.equals(Constants.ANNOTATION_SOURCE_TENEO_JPA_AUDITING)) {
@@ -236,12 +252,15 @@
 				|| source.startsWith(Constants.ANNOTATION_SOURCE_TENEO_MAPPING);
 	}
 
+
+
 	/** Find the efeature */
 	public EStructuralFeature getEStructuralFeature(EClass eClass, String name) {
 		return ParserUtil.getEStructuralFeature(eClass, name);
 	}
 
 	public void setExtraAnnotationSources(PersistenceOptions po) {
+		persistenceOptions = po;
 		if (po.getExtraAnnotationSources() != null
 				&& po.getExtraAnnotationSources().trim().length() > 0) {
 			extraAnnotationsSources = po.getExtraAnnotationSources().split(",");
diff --git a/hibernate/org.eclipse.emf.teneo.hibernate.mapper/src/org/eclipse/emf/teneo/hibernate/annotations/HbEAnnotationParserImporter.java b/hibernate/org.eclipse.emf.teneo.hibernate.mapper/src/org/eclipse/emf/teneo/hibernate/annotations/HbEAnnotationParserImporter.java
index 0574d43..93b7295 100755
--- a/hibernate/org.eclipse.emf.teneo.hibernate.mapper/src/org/eclipse/emf/teneo/hibernate/annotations/HbEAnnotationParserImporter.java
+++ b/hibernate/org.eclipse.emf.teneo.hibernate.mapper/src/org/eclipse/emf/teneo/hibernate/annotations/HbEAnnotationParserImporter.java
@@ -15,6 +15,8 @@
  */
 package org.eclipse.emf.teneo.hibernate.annotations;
 
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.teneo.annotations.parser.EAnnotationParserImporter;
@@ -30,11 +32,11 @@
 
 	/** Returns true if the source is a hibernate source or a generic source */
 	@Override
-	protected boolean isValidSource(String source) {
+	protected boolean isValidSource(String source, EList<EAnnotation> eAnnotations) {
 		if (source == null) {
 			return false;
 		}
-		return source.startsWith("teneo.hibernate") || super.isValidSource(source);
+		return source.startsWith("teneo.hibernate") || super.isValidSource(source, eAnnotations);
 	}
 
 	/*
diff --git a/hibernate/org.eclipse.emf.teneo.hibernate/src/org/eclipse/emf/teneo/hibernate/HbEntityDataStore.java b/hibernate/org.eclipse.emf.teneo.hibernate/src/org/eclipse/emf/teneo/hibernate/HbEntityDataStore.java
index 67b686c..114adf2 100755
--- a/hibernate/org.eclipse.emf.teneo.hibernate/src/org/eclipse/emf/teneo/hibernate/HbEntityDataStore.java
+++ b/hibernate/org.eclipse.emf.teneo.hibernate/src/org/eclipse/emf/teneo/hibernate/HbEntityDataStore.java
@@ -23,13 +23,11 @@
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 
 import javax.persistence.Cache;
-import javax.persistence.EntityGraph;
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.EntityTransaction;
@@ -479,9 +477,10 @@
 			return delegate.isOpen();
 		}
 
-		public <T> void addNamedEntityGraph(String arg0, EntityGraph<T> arg1) {
-			delegate.addNamedEntityGraph(arg0, arg1);
-		}
+		// JPA 2.1
+		// public <T> void addNamedEntityGraph(String arg0, EntityGraph<T> arg1) {
+		// delegate.addNamedEntityGraph(arg0, arg1);
+		// }
 
 		public void addNamedQuery(String arg0, Query arg1) {
 			delegate.addNamedQuery(arg0, arg1);
@@ -701,13 +700,14 @@
 			this.delegateEntityManager = delegateEntityManager;
 		}
 
-		public <T> EntityGraph<T> createEntityGraph(Class<T> arg0) {
-			return delegateEntityManager.createEntityGraph(arg0);
-		}
-
-		public EntityGraph<?> createEntityGraph(String arg0) {
-			return delegateEntityManager.createEntityGraph(arg0);
-		}
+		// JPA 2.1
+		// public <T> EntityGraph<T> createEntityGraph(Class<T> arg0) {
+		// return delegateEntityManager.createEntityGraph(arg0);
+		// }
+		//
+		// public EntityGraph<?> createEntityGraph(String arg0) {
+		// return delegateEntityManager.createEntityGraph(arg0);
+		// }
 
 		public StoredProcedureQuery createNamedStoredProcedureQuery(String arg0) {
 			return delegateEntityManager.createNamedStoredProcedureQuery(arg0);
@@ -734,13 +734,14 @@
 			return delegateEntityManager.createStoredProcedureQuery(arg0, arg1);
 		}
 
-		public EntityGraph<?> getEntityGraph(String arg0) {
-			return delegateEntityManager.getEntityGraph(arg0);
-		}
-
-		public <T> List<EntityGraph<? super T>> getEntityGraphs(Class<T> arg0) {
-			return delegateEntityManager.getEntityGraphs(arg0);
-		}
+		// JPA 2.1
+		// public EntityGraph<?> getEntityGraph(String arg0) {
+		// return delegateEntityManager.getEntityGraph(arg0);
+		// }
+		//
+		// public <T> List<EntityGraph<? super T>> getEntityGraphs(Class<T> arg0) {
+		// return delegateEntityManager.getEntityGraphs(arg0);
+		// }
 
 		public boolean isJoinedToTransaction() {
 			return delegateEntityManager.isJoinedToTransaction();
@@ -823,13 +824,14 @@
 		}
 	}
 
-	public <T> void addNamedEntityGraph(String arg0, EntityGraph<T> arg1) {
-		getEntityManagerFactory().addNamedEntityGraph(arg0, arg1);
-	}
-
-	public void addNamedQuery(String arg0, Query arg1) {
-		getEntityManagerFactory().addNamedQuery(arg0, arg1);
-	}
+	// JPA 2.1
+	// public <T> void addNamedEntityGraph(String arg0, EntityGraph<T> arg1) {
+	// getEntityManagerFactory().addNamedEntityGraph(arg0, arg1);
+	// }
+	//
+	// public void addNamedQuery(String arg0, Query arg1) {
+	// getEntityManagerFactory().addNamedQuery(arg0, arg1);
+	// }
 
 	public EntityManager createEntityManager(SynchronizationType arg0) {
 		return getEntityManagerFactory().createEntityManager(arg0);
diff --git a/tests/org.eclipse.emf.teneo.commontest/src/org/eclipse/emf/teneo/test/emf/sample/ClaimAction.java b/tests/org.eclipse.emf.teneo.commontest/src/org/eclipse/emf/teneo/test/emf/sample/ClaimAction.java
index 1dae89c..c1388f1 100755
--- a/tests/org.eclipse.emf.teneo.commontest/src/org/eclipse/emf/teneo/test/emf/sample/ClaimAction.java
+++ b/tests/org.eclipse.emf.teneo.commontest/src/org/eclipse/emf/teneo/test/emf/sample/ClaimAction.java
@@ -52,6 +52,8 @@
 		final Properties props = new Properties();
 		props.setProperty(PersistenceOptions.EXTRA_ANNOTATION_SOURCES,
 				"teneo.extra, teneo.extra.test, teneo.extra.test2");
+		props.setProperty(PersistenceOptions.EXTRA_ANNOTATIONS_OVERRIDES_DEFAULT,
+				"true");
 		return props;
 	}