package org.teiid.designer.core.workspace; import java.util.HashSet; import java.util.Properties; import java.util.Set; import org.eclipse.emf.common.util.EMap; import org.teiid.core.designer.util.CoreArgCheck; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.util.ModelContents; import org.teiid.designer.core.util.ModelResourceContainerFactory; import org.teiid.designer.metamodels.core.Annotation; import org.teiid.designer.metamodels.core.AnnotationContainer; /** * This class is intended to provide a method of injecting additional info and properties into a Model. * * Basically it provides access to an Annotation whose reference is the ModelAnnotation EObject. * Annotations provide for a "tag" map, equivalent to a EObject Properties() object. * * Users of this class can add specific name-space key'd Properties to the model for persistence and retrieval at a later time. * * * * @since 8.0 */ public class ResourceAnnotationHelper { public ResourceAnnotationHelper() { super(); } private static String getNamespace(final String str) { CoreArgCheck.isNotNull(str, "str"); //$NON-NLS-1$ int semiColonIndex = str.indexOf(':') + 1; if( semiColonIndex > 0 ) { return str.substring(0, semiColonIndex); } return null; } /** * Retrieves the tagged resource <code>Annotation</code> object referenced to a <code>ModelResource</code>'s <code>ModelAnnotation</code> * @param modelResource the <code>ModelResource</code>. may not be null * @param forceCreate forces creation of the annotation if it does not exist. * @return the <code>Annotation</code> * @throws ModelWorkspaceException */ public Annotation getResourceAnnotation(final ModelResource modelResource, final boolean forceCreate) throws ModelWorkspaceException { CoreArgCheck.isNotNull(modelResource, "modelResource"); //$NON-NLS-1$ Annotation annotation = null; if( modelResource.getAnnotations() != null && modelResource.getModelAnnotation() != null ) { annotation = modelResource.getAnnotations().getAnnotation(modelResource.getModelAnnotation()); if( annotation == null && forceCreate ) { annotation = ModelResourceContainerFactory.createNewAnnotation(modelResource.getModelAnnotation(), modelResource.getEmfResource()); ModelContents contents = ModelerCore.getModelEditor().getModelContents(modelResource); AnnotationContainer ac = contents.getAnnotationContainer(true); if( ac != null ) annotation.setAnnotationContainer(ac); } } return annotation; } /** * Retrieves the value of an object stored on an <code>Annotation</code> in the tags map based on the input key * * @param modelResource the Model Resource. may not be null; * @param key the key for the mapped value. may not be null; * @return the object value stored in the annotation's tags * @throws ModelWorkspaceException */ public Object getPropertyValue(final ModelResource modelResource, final String key) throws ModelWorkspaceException { CoreArgCheck.isNotNull(modelResource, "modelResource"); //$NON-NLS-1$ CoreArgCheck.isNotNull(key, "key"); //$NON-NLS-1$ Annotation annotation = getResourceAnnotation(modelResource, false); if( annotation != null ) { return annotation.getTags().get(key); } return null; } /** * Returns all properties who's keys are prefixed with the given name-space prefix * * @param modelResource * @param namespacePrefix * @return the properties (never <code>null</code>) * @throws ModelWorkspaceException */ public Properties getProperties(final ModelResource modelResource, final String namespacePrefix) throws ModelWorkspaceException { CoreArgCheck.isNotNull(modelResource, "modelResource"); //$NON-NLS-1$ CoreArgCheck.isNotNull(namespacePrefix, "namespacePrefix"); //$NON-NLS-1$ Properties props = new Properties(); Annotation annotation = getResourceAnnotation(modelResource, false); if( annotation != null ) { EMap tags = annotation.getTags(); Set<Object> keys = tags.keySet(); for(Object nextKey : keys ) { String namespace = getNamespace((String)nextKey); if( namespace != null && namespace.equals(namespacePrefix)) { props.put(nextKey, tags.get(nextKey)); } } } return props; } public Properties getAllProperties(final ModelResource modelResource) throws ModelWorkspaceException { CoreArgCheck.isNotNull(modelResource, "modelResource"); //$NON-NLS-1$ Properties props = new Properties(); Annotation annotation = getResourceAnnotation(modelResource, false); if( annotation != null ) { EMap tags = annotation.getTags(); Set<Object> keys = tags.keySet(); for(Object nextKey : keys ) { props.put(nextKey, tags.get(nextKey)); } } return props; } public void removeProperties(final ModelResource modelResource, final String namespacePrefix) throws ModelWorkspaceException { CoreArgCheck.isNotNull(modelResource, "modelResource"); //$NON-NLS-1$ CoreArgCheck.isNotNull(namespacePrefix, "namespacePrefix"); //$NON-NLS-1$ Annotation annotation = getResourceAnnotation(modelResource, false); if( annotation != null ) { EMap tags = annotation.getTags(); Set<Object> keys = new HashSet(tags.keySet()); for(Object nextKey : keys ) { String namespace = getNamespace((String)nextKey); if( namespace != null && namespace.equals(namespacePrefix)) { tags.remove(nextKey); } } } } public void removeProperty(final ModelResource modelResource, final String key) throws ModelWorkspaceException { CoreArgCheck.isNotNull(modelResource, "modelResource"); //$NON-NLS-1$ CoreArgCheck.isNotNull(key, "key"); //$NON-NLS-1$ Annotation annotation = getResourceAnnotation(modelResource, false); if( annotation != null ) { EMap tags = annotation.getTags(); Set<Object> keys = new HashSet(tags.keySet()); tags.remove(key); } } /** * Sets the value of an object stored on an <code>Annotation</code> in the tags map based on the input key * * @param modelResource the Model Resource. may not be null; * @param key the key for the mapped value. may not be null; * @param value the object value to store in the annotation * @throws ModelWorkspaceException */ public void setProperty(final ModelResource modelResource, final String key, final Object value) throws ModelWorkspaceException { CoreArgCheck.isNotNull(modelResource, "modelResource"); //$NON-NLS-1$ CoreArgCheck.isNotNull(key, "key"); //$NON-NLS-1$ if( value == null ) { removeProperty(modelResource, key); return; } Annotation annotation = getResourceAnnotation(modelResource, true); annotation.getTags().put(key, value); } public void setProperties(final ModelResource modelResource, final Properties props) throws ModelWorkspaceException { CoreArgCheck.isNotNull(modelResource, "modelResource"); //$NON-NLS-1$ CoreArgCheck.isNotNull(props, "props"); //$NON-NLS-1$ Annotation annotation = getResourceAnnotation(modelResource, true); Set<Object> keys = props.keySet(); for(Object nextKey : keys ) { annotation.getTags().put(nextKey, props.get(nextKey)); } } }