/* * 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.transformation.metadata; import java.util.Arrays; import java.util.Collection; import org.eclipse.core.runtime.CoreException; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.teiid.core.designer.util.CoreArgCheck; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.container.Container; import org.teiid.designer.core.index.ModelResourceIndexSelector; import org.teiid.designer.core.workspace.ModelWorkspace; import org.teiid.designer.query.metadata.IQueryMetadataInterface; import org.teiid.designer.transformation.TransformationPlugin; /** * TransformationMetadataFactory * * @since 8.0 */ public class TransformationMetadataFactory extends ServerMetadataFactory { private static final TransformationMetadataFactory INSTANCE = new TransformationMetadataFactory(); public static TransformationMetadataFactory getInstance() { return INSTANCE; } /** * Return a reference to a {@link IQueryMetadataInterface} implementation given the * context for metadata. * @param context Object containing the info needed to lookup metadta. * @return the IQueryMetadataInterface implementation; never null */ public IQueryMetadataInterface getModelerMetadata(final QueryMetadataContext context, Container container) { // Create the IQueryMetadataInterface implementation to use // for query validation and resolution return new ModelerMetadata(context, container); } /** * Return a reference to a {@link IQueryMetadataInterface} implementation that for the given * eObject , its resourceand the resources that depend ont it. * @param eObject The eObject for which metadata instance is returned * @return the IQueryMetadataInterface implementation; never null */ public IQueryMetadataInterface getModelerMetadata(final EObject eObject) { CoreArgCheck.isNotNull(eObject); return getModelerMetadata(eObject, false); } /** * Return a reference to a {@link IQueryMetadataInterface} implementation that for the given * eObject , its resourceand the resources that depend ont it. This assumes the Eobject is in * a modelContainer, should be used only for workspace validation. * @param eObject The eObject for which metadata instance is returned * @param restrictSearch A boolean indicating if the search needs to be restricted to model imports * or if the whole workspace needs to be searched * @return the IQueryMetadataInterface implementation; never null */ public IQueryMetadataInterface getModelerMetadata(final EObject eObject, final boolean restrictSearch) { CoreArgCheck.isNotNull(eObject); QueryMetadataContext context = buildQueryMetadataContext(eObject, restrictSearch); Container container = null; try { container = ModelerCore.getModelContainer(); } catch (CoreException e) { TransformationPlugin.Util.log(e); } return getModelerMetadata(context, container); } public static QueryMetadataContext buildQueryMetadataContext(final EObject eObject, final boolean restrictSearch) { Collection resources = null; Container container = null; try { // assume model container...modler metadata is for workspace container = ModelerCore.getModelContainer(); ModelWorkspace workspace = ModelerCore.getModelWorkspace(); if(workspace.isOpen()) { resources = Arrays.asList(workspace.getEmfResources()); }else { resources = container.getResources(); } } catch(CoreException e) { TransformationPlugin.Util.log(e); } // find the resoucre for the eObject in the container Resource resource = ModelerCore.getModelEditor().findResource(container, eObject); // create a indexSelector for this resource and instantiate transformation validator ModelResourceIndexSelector selector = new ModelResourceIndexSelector(resource); QueryMetadataContext context = new QueryMetadataContext(selector); // set the resource scope (all model resources in open model projects) context.setResources(resources); // set the restrict search flag context.setRestrictedSearch(restrictSearch); return context; } /** * Return a reference to a {@link IQueryMetadataInterface} implementation, the metadata * is assumed not to change. * @param context Object containing the info needed to lookup metadta. * @return the IQueryMetadataInterface implementation; never null */ public IQueryMetadataInterface getVdbMetadata(final QueryMetadataContext context, Container container) { CoreArgCheck.isNotNull(context); // Create the IQueryMetadataInterface implementation to use // for query validation and resolution return new TransformationMetadataFacade(new VdbMetadata(context, container)); // return new VdbMetadata(context); } }