From 85915519f4c197ab7f7931beb4e355a163e7dc6f Mon Sep 17 00:00:00 2001 From: Dan Florian Date: Mon, 18 Feb 2013 16:21:58 -0500 Subject: [PATCH] TEIIDDES-1597 Remove the concept of extention properties for ViewImpl objects for virtual models Added back in ViewImpl to physical model. Also refactored metamodel-specific information from base provider to their specific metamodel provider. --- .../AbstractMetaclassNameProvider.java | 257 ++++++++---------- .../ModelTypeMetaclassNameFactory.java | 24 ++ .../ui/editors/EditPropertyDialog.java | 13 +- .../ui/editors/PropertiesEditorPage.java | 28 +- ...ctionModelExtendableClassnameProvider.java | 12 +- ...RelationalExtendableClassnameProvider.java | 100 ++++++- .../RelationalModelExtensionAssistant.java | 8 +- ...WebServiceExtendableClassnameProvider.java | 24 +- .../XmlExtendableClassnameProvider.java | 28 +- 9 files changed, 316 insertions(+), 178 deletions(-) create mode 100644 plugins/org.teiid.designer.core/src/org/teiid/designer/core/extension/ModelTypeMetaclassNameFactory.java diff --git a/plugins/org.teiid.designer.core/src/org/teiid/designer/core/extension/AbstractMetaclassNameProvider.java b/plugins/org.teiid.designer.core/src/org/teiid/designer/core/extension/AbstractMetaclassNameProvider.java index 0a8935fa66..32ee729711 100644 --- a/plugins/org.teiid.designer.core/src/org/teiid/designer/core/extension/AbstractMetaclassNameProvider.java +++ b/plugins/org.teiid.designer.core/src/org/teiid/designer/core/extension/AbstractMetaclassNameProvider.java @@ -7,198 +7,159 @@ */ package org.teiid.designer.core.extension; -import java.awt.Image; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; - -import org.teiid.core.designer.util.CoreStringUtil; +import org.teiid.core.designer.util.CoreArgCheck; import org.teiid.designer.extension.definition.ExtendableMetaclassNameProvider; /** - * + * Base class for all metamodel extendable metaclass name providers. * * @since 8.0 */ public abstract class AbstractMetaclassNameProvider implements ExtendableMetaclassNameProvider { - private static final String RELATIONAL_URI = "http://www.metamatrix.com/metamodels/Relational"; //$NON-NLS-1$ - private static final String SOURCE_FUNCTION_URI = "http://www.metamatrix.com/metamodels/MetaMatrixFunction"; //$NON-NLS-1$ - private static final String WEB_SERVICE_URI = "http://www.metamatrix.com/metamodels/WebService"; //$NON-NLS-1$ - private static final String XML_DOCUMENT_URI = "http://www.metamatrix.com/metamodels/XmlDocument"; //$NON-NLS-1$ - - private static final String RELATIONAL_COLUMN = "org.teiid.designer.metamodels.relational.impl.ColumnImpl"; //$NON-NLS-1$ - private static final String RELATIONAL_PRIMARY_KEY = "org.teiid.designer.metamodels.relational.impl.PrimaryKeyImpl"; //$NON-NLS-1$ - private static final String RELATIONAL_FOREIGN_KEY = "org.teiid.designer.metamodels.relational.impl.ForeignKeyImpl"; //$NON-NLS-1$ - private static final String RELATIONAL_PROCEDURE = "org.teiid.designer.metamodels.relational.impl.ProcedureImpl"; //$NON-NLS-1$ - private static final String RELATIONAL_INDEX = "org.teiid.designer.metamodels.relational.impl.IndexImpl"; //$NON-NLS-1$ - private static final String RELATIONAL_PROCEDURE_PARAMETER = "org.teiid.designer.metamodels.relational.impl.ProcedureParameterImpl"; //$NON-NLS-1$ - private static final String RELATIONAL_UNIQUE_CONSTRAINT = "org.teiid.designer.metamodels.relational.impl.UniqueConstraintImpl"; //$NON-NLS-1$ - private static final String RELATIONAL_ACCESS_PATTERN = "org.teiid.designer.metamodels.relational.impl.AccessPatternImpl"; //$NON-NLS-1$ - private static final String RELATIONAL_BASE_TABLE = "org.teiid.designer.metamodels.relational.impl.BaseTableImpl"; //$NON-NLS-1$ - private static final String RELATIONAL_PROCEDURE_RESULT = "org.teiid.designer.metamodels.relational.impl.ProcedureResultImpl"; //$NON-NLS-1$ - - private static final String FUNCTION_SCALAR_FUNCTION = "org.teiid.designer.metamodels.function.impl.ScalarFunctionImpl"; //$NON-NLS-1$ - private static final String FUNCTION_FUNCTION_PARAMETER = "org.teiid.designer.metamodels.function.impl.FunctionParameterImpl"; //$NON-NLS-1$ - private static final String FUNCTION_RETURN_PARAMETER = "org.teiid.designer.metamodels.function.impl.ReturnParameterImpl"; //$NON-NLS-1$ - - private static final String WEB_SERVICE_OPERATION = "org.teiid.designer.metamodels.webservice.impl.OperationImpl"; //$NON-NLS-1$ - private static final String WEB_SERVICE_INPUT = "org.teiid.designer.metamodels.webservice.impl.InputImpl"; //$NON-NLS-1$ - private static final String WEB_SERVICE_OUTPUT = "org.teiid.designer.metamodels.webservice.impl.OutputImpl"; //$NON-NLS-1$ - private static final String WEB_SERVICE_INTERFACE = "org.teiid.designer.metamodels.webservice.impl.InterfaceImpl"; //$NON-NLS-1$ - private static final String WEB_SERVICE_SAMPLE_MESSAGES = "org.teiid.designer.metamodels.webservice.impl.SampleMessagesImpl"; //$NON-NLS-1$ - private static final String WEB_SERVICE_SAMPLE_FILE = "org.teiid.designer.metamodels.webservice.impl.SampleFileImpl"; //$NON-NLS-1$ - private static final String WEB_SERVICE_SAMPLE_XSD = "org.teiid.designer.metamodels.webservice.impl.SampleFromXsdImpl"; //$NON-NLS-1$ - - private static final String XML_XMLDOCUMENT = "org.teiid.designer.metamodels.xml.impl.XmlDocumentImpl"; //$NON-NLS-1$ - private static final String XML_XMLELEMENT = "org.teiid.designer.metamodels.xml.impl.XmlElementImpl"; //$NON-NLS-1$ - private static final String XML_XMLATTRIBUTE = "org.teiid.designer.metamodels.xml.impl.XmlAttributeImpl"; //$NON-NLS-1$ - private static final String XML_XMLROOT = "org.teiid.designer.metamodels.xml.impl.XmlRootImpl"; //$NON-NLS-1$ - private static final String XML_XMLCOMMENT = "org.teiid.designer.metamodels.xml.impl.XmlCommentImpl"; //$NON-NLS-1$ - private static final String XML_XMLNAMESPACE = "org.teiid.designer.metamodels.xml.impl.XmlNamespaceImpl"; //$NON-NLS-1$ - private static final String XML_XMLSEQUENCE = "org.teiid.designer.metamodels.xml.impl.XmlSequenceImpl"; //$NON-NLS-1$ - private static final String XML_XMLALL = "org.teiid.designer.metamodels.xml.impl.XmlAllImpl"; //$NON-NLS-1$ - private static final String XML_XMLCHOICE = "org.teiid.designer.metamodels.xml.impl.XmlChoiceImpl"; //$NON-NLS-1$ - private static final String XML_XMLPROCESSING_INSTRUCTION = "org.teiid.designer.metamodels.xml.impl.ProcessingInstructionImpl"; //$NON-NLS-1$ - private static final String MC_PREFIX = ".impl."; //$NON-NLS-1$ private static final String MC_SUFFIX = "Impl"; //$NON-NLS-1$ + protected static final String[] NO_PARENTS = {}; + + /** + * @param metaclassName the name whose short name is being requested (cannot be null or empty) + * @return the label (never null or empty) + */ + public static final String getLabel(final String metaclassName) { + CoreArgCheck.isNotEmpty(metaclassName); + + // try and extract the name between ".impl." and "Impl" from the metaclass name + int index1 = metaclassName.indexOf(MC_PREFIX); + + if (index1 == -1) { + index1 = metaclassName.lastIndexOf("."); //$NON-NLS-1$ + + if (index1 != -1) { + return metaclassName.substring(index1 + 1); + } + } else { + int index2 = metaclassName.indexOf(MC_SUFFIX); + + if (index1 != -1) { + return metaclassName.substring(index1 + MC_PREFIX.length(), index2); + } + } - private Map> parentChildMap; + return metaclassName; + } - private String metamodelUri; + private final List metaclassNames; + private final String metamodelUri; + private final Map> parentChildMap; + private final List roots; - public AbstractMetaclassNameProvider( final String metamodelUri ) { + protected AbstractMetaclassNameProvider(final String metamodelUri) { + CoreArgCheck.isNotEmpty(metamodelUri); + this.metaclassNames = new ArrayList(); this.metamodelUri = metamodelUri; - populateParentChildMap(this.metamodelUri); - } - - private void populateParentChildMap( String metamodelUri ) { this.parentChildMap = new HashMap>(); - if (RELATIONAL_URI.equals(this.metamodelUri)) { - // BaseTable - List children = new ArrayList(); - children.add(RELATIONAL_COLUMN); - children.add(RELATIONAL_PRIMARY_KEY); - children.add(RELATIONAL_FOREIGN_KEY); - children.add(RELATIONAL_ACCESS_PATTERN); - children.add(RELATIONAL_UNIQUE_CONSTRAINT); - this.parentChildMap.put(RELATIONAL_BASE_TABLE, children); - // Procedure - children = new ArrayList(); - children.add(RELATIONAL_PROCEDURE_RESULT); - children.add(RELATIONAL_PROCEDURE_PARAMETER); - this.parentChildMap.put(RELATIONAL_PROCEDURE, children); - // Procedure - children = new ArrayList(); - children.add(RELATIONAL_COLUMN); - this.parentChildMap.put(RELATIONAL_PROCEDURE_RESULT, children); - } else if (SOURCE_FUNCTION_URI.equals(this.metamodelUri)) { - // Function - List children = new ArrayList(); - children.add(FUNCTION_FUNCTION_PARAMETER); - children.add(FUNCTION_RETURN_PARAMETER); - this.parentChildMap.put(FUNCTION_SCALAR_FUNCTION, children); - } else if (WEB_SERVICE_URI.equals(this.metamodelUri)) { - // Interface - List children = new ArrayList(); - children.add(WEB_SERVICE_OPERATION); - this.parentChildMap.put(WEB_SERVICE_INTERFACE, children); - // Operation - children = new ArrayList(); - children.add(WEB_SERVICE_INPUT); - children.add(WEB_SERVICE_OUTPUT); - this.parentChildMap.put(WEB_SERVICE_OPERATION, children); - // Input and Output - children = new ArrayList(); - children.add(WEB_SERVICE_SAMPLE_MESSAGES); - this.parentChildMap.put(WEB_SERVICE_INPUT, children); - this.parentChildMap.put(WEB_SERVICE_OUTPUT, children); - // Message Samples - children = new ArrayList(); - children.add(WEB_SERVICE_SAMPLE_FILE); - children.add(WEB_SERVICE_SAMPLE_XSD); - this.parentChildMap.put(WEB_SERVICE_SAMPLE_MESSAGES, children); - } else if (XML_DOCUMENT_URI.equals(this.metamodelUri)) { - // XML Doc - List children = new ArrayList(); - children.add(XML_XMLROOT); - children.add(XML_XMLCOMMENT); - this.parentChildMap.put(XML_XMLDOCUMENT, children); - // XML Root and Element - children = new ArrayList(); - children.add(XML_XMLELEMENT); - children.add(XML_XMLATTRIBUTE); - children.add(XML_XMLCOMMENT); - children.add(XML_XMLNAMESPACE); - children.add(XML_XMLPROCESSING_INSTRUCTION); - children.add(XML_XMLALL); - children.add(XML_XMLCHOICE); - children.add(XML_XMLSEQUENCE); - this.parentChildMap.put(XML_XMLROOT, children); - } + this.roots = new ArrayList(); } - @Override - public String[] getExtendableMetaclassRoots() { - String[] resultArray = new String[0]; - if (RELATIONAL_URI.equals(this.metamodelUri)) { - resultArray = new String[] {RELATIONAL_BASE_TABLE, RELATIONAL_PROCEDURE, RELATIONAL_INDEX}; - } else if (SOURCE_FUNCTION_URI.equals(this.metamodelUri)) { - resultArray = new String[1]; - resultArray[0] = FUNCTION_SCALAR_FUNCTION; - } else if (WEB_SERVICE_URI.equals(this.metamodelUri)) { - resultArray = new String[1]; - resultArray[0] = WEB_SERVICE_INTERFACE; - } else if (XML_DOCUMENT_URI.equals(this.metamodelUri)) { - resultArray = new String[1]; - resultArray[0] = XML_XMLDOCUMENT; + protected final void addMetaclass(final String metaclassName, + final String... parents) { + CoreArgCheck.isNotEmpty(metaclassName); + + if (!this.metaclassNames.contains(metaclassName)) { + this.metaclassNames.add(metaclassName); + + if ((parents == null) || (parents.length == 0)) { + this.roots.add(metaclassName); + } else { + for (final String parent : parents) { + List kids = this.parentChildMap.get(parent); + + if (kids == null) { + kids = new ArrayList(); + this.parentChildMap.put(parent, kids); + } + + kids.add(metaclassName); + } + } } - return resultArray; } + /** + * @see org.teiid.designer.extension.definition.ExtendableMetaclassNameProvider#getExtendableMetaclassChildren(java.lang.String) + */ @Override - public String[] getExtendableMetaclassChildren( String metaclassName ) { - if (!this.parentChildMap.containsKey(metaclassName)) { + public String[] getExtendableMetaclassChildren(final String parentMetaclassName) { + CoreArgCheck.isNotEmpty(parentMetaclassName); + final List kidNames = this.parentChildMap.get(parentMetaclassName); + + if ((kidNames == null) || kidNames.isEmpty()) { return new String[0]; } - List childList = this.parentChildMap.get(metaclassName); - String[] childNames = new String[childList.size()]; - for (int i = 0; i < childList.size(); i++) { - childNames[i] = childList.get(i); + + final String[] result = new String[kidNames.size()]; + int i = 0; + + for (final String kidName : kidNames) { + result[i++] = kidName; } - return childNames; + + return result; } + /** + * @see org.teiid.designer.extension.definition.ExtendableMetaclassNameProvider#getExtendableMetaclassRoots() + */ @Override - public boolean hasChildren( String metaclassName ) { - return getExtendableMetaclassChildren(metaclassName).length > 0; + public String[] getExtendableMetaclassRoots() { + return this.roots.toArray(new String[this.roots.size()]); } + /** + * @see org.teiid.designer.extension.definition.ExtendableMetaclassNameProvider#getLabelText(java.lang.String) + */ @Override - public String getParent( String metaclassName ) { - return null; + public final String getLabelText(final String metaclassName) { + CoreArgCheck.isNotEmpty(metaclassName); + return getLabel(metaclassName); } - public Image getImage( String metaclassName ) { - return null; + /** + * @see org.teiid.designer.extension.definition.ExtendableMetaclassNameProvider#getMetamodelUri() + */ + @Override + public final String getMetamodelUri() { + return this.metamodelUri; } + /** + * @see org.teiid.designer.extension.definition.ExtendableMetaclassNameProvider#getParent(java.lang.String) + */ @Override - public String getLabelText( String metaclassName ) { - // This extracts the name between ".impl." and "Impl" from the metaclass name - if (!CoreStringUtil.isEmpty(metaclassName)) { - int indx1 = metaclassName.indexOf(MC_PREFIX); - int indx2 = metaclassName.indexOf(MC_SUFFIX); - return metaclassName.substring(indx1 + MC_PREFIX.length(), indx2); + public String getParent(String metaclassName) { + CoreArgCheck.isNotEmpty(metaclassName); + + for (final Map.Entry> entry : this.parentChildMap.entrySet()) { + if (entry.getValue().contains(metaclassName)) { + return entry.getKey(); + } } + + assert false; return null; } + /** + * @see org.teiid.designer.extension.definition.ExtendableMetaclassNameProvider#hasChildren(java.lang.String) + */ @Override - public String getMetamodelUri() { - return this.metamodelUri; + public boolean hasChildren(String metaclassName) { + CoreArgCheck.isNotEmpty(metaclassName); + return (getExtendableMetaclassChildren(metaclassName).length != 0); } } diff --git a/plugins/org.teiid.designer.core/src/org/teiid/designer/core/extension/ModelTypeMetaclassNameFactory.java b/plugins/org.teiid.designer.core/src/org/teiid/designer/core/extension/ModelTypeMetaclassNameFactory.java new file mode 100644 index 0000000000..332916b293 --- /dev/null +++ b/plugins/org.teiid.designer.core/src/org/teiid/designer/core/extension/ModelTypeMetaclassNameFactory.java @@ -0,0 +1,24 @@ +/* + * 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.core.extension; + +import java.util.Set; +import org.teiid.designer.extension.definition.ExtendableMetaclassNameProvider; + +/** + * Provides extendable metaclass name provider based on model types. + */ +public interface ModelTypeMetaclassNameFactory { + + /** + * @param modelTypes the model types that pertain to the provider being requested (can be null or empty) + * @return the provider (never null) + */ + ExtendableMetaclassNameProvider getProvider(final Set modelTypes); + +} diff --git a/plugins/org.teiid.designer.extension.ui/src/org/teiid/designer/extension/ui/editors/EditPropertyDialog.java b/plugins/org.teiid.designer.extension.ui/src/org/teiid/designer/extension/ui/editors/EditPropertyDialog.java index 964b655212..425050b792 100644 --- a/plugins/org.teiid.designer.extension.ui/src/org/teiid/designer/extension/ui/editors/EditPropertyDialog.java +++ b/plugins/org.teiid.designer.extension.ui/src/org/teiid/designer/extension/ui/editors/EditPropertyDialog.java @@ -59,6 +59,7 @@ import org.eclipse.ui.forms.widgets.Section; import org.teiid.core.designer.util.CoreArgCheck; import org.teiid.core.designer.util.CoreStringUtil; +import org.teiid.designer.core.extension.AbstractMetaclassNameProvider; import org.teiid.designer.extension.definition.ModelExtensionDefinitionValidator; import org.teiid.designer.extension.definition.ValidationStatus; import org.teiid.designer.extension.properties.ModelExtensionPropertyDefinition; @@ -79,9 +80,6 @@ */ final class EditPropertyDialog extends FormDialog { - private static final String MC_PREFIX = ".impl."; //$NON-NLS-1$ - private static final String MC_SUFFIX = "Impl"; //$NON-NLS-1$ - private final String metaclassName; private final NamespaceProvider namespaceProvider; @@ -1065,14 +1063,7 @@ public void widgetSelected(SelectionEvent e) { } private String getMetaclassShortName(String metaclass) { - String elemString = metaclass.toString(); - // This extracts the name between ".impl." and "Impl" from the metaclass name - if (!CoreStringUtil.isEmpty(elemString)) { - int indx1 = elemString.indexOf(MC_PREFIX); - int indx2 = elemString.indexOf(MC_SUFFIX); - return elemString.substring(indx1 + MC_PREFIX.length(), indx2); - } - return elemString; + return AbstractMetaclassNameProvider.getLabel(metaclassName); } ModelExtensionPropertyDefinition getPropertyDefinition() { diff --git a/plugins/org.teiid.designer.extension.ui/src/org/teiid/designer/extension/ui/editors/PropertiesEditorPage.java b/plugins/org.teiid.designer.extension.ui/src/org/teiid/designer/extension/ui/editors/PropertiesEditorPage.java index 77a4b4363b..a9dbe4ab59 100644 --- a/plugins/org.teiid.designer.extension.ui/src/org/teiid/designer/extension/ui/editors/PropertiesEditorPage.java +++ b/plugins/org.teiid.designer.extension.ui/src/org/teiid/designer/extension/ui/editors/PropertiesEditorPage.java @@ -54,6 +54,8 @@ import org.eclipse.ui.forms.widgets.Section; import org.teiid.core.designer.util.ArrayUtil; import org.teiid.core.designer.util.CoreStringUtil; +import org.teiid.designer.core.extension.AbstractMetaclassNameProvider; +import org.teiid.designer.core.extension.ModelTypeMetaclassNameFactory; import org.teiid.designer.extension.ExtensionPlugin; import org.teiid.designer.extension.definition.ExtendableMetaclassNameProvider; import org.teiid.designer.extension.definition.ModelExtensionDefinition.PropertyName; @@ -90,9 +92,6 @@ public class PropertiesEditorPage extends MedEditorPage { private final ErrorMessage metaclassError; private final ErrorMessage propertyError; - private static final String MC_PREFIX = ".impl."; //$NON-NLS-1$ - private static final String MC_SUFFIX = "Impl"; //$NON-NLS-1$ - /** * @param medEditor the MED editor this page belongs to (cannot be null) */ @@ -366,13 +365,7 @@ public void selectionChanged( SelectionChangedEvent event ) { } private String getMetaclassShortName( String metaclassName ) { - // This extracts the name between ".impl." and "Impl" from the metaclass name - if (!CoreStringUtil.isEmpty(metaclassName)) { - int indx1 = metaclassName.indexOf(MC_PREFIX); - int indx2 = metaclassName.indexOf(MC_SUFFIX); - return metaclassName.substring(indx1 + MC_PREFIX.length(), indx2); - } - return null; + return AbstractMetaclassNameProvider.getLabel(metaclassName); } @SuppressWarnings("unused") @@ -618,6 +611,11 @@ void handleAddMetaclass() { // Get the metaclass name provider for the med's metamodelUri ExtendableMetaclassNameProvider metaclassNameProvider = ExtensionPlugin.getInstance() .getMetaclassNameProvider(getMed().getMetamodelUri()); + + if (metaclassNameProvider instanceof ModelTypeMetaclassNameFactory) { + metaclassNameProvider = ((ModelTypeMetaclassNameFactory)metaclassNameProvider).getProvider(getMed().getSupportedModelTypes()); + } + // Current metaclasses extended by the MED List currentlyExtendedMetaclasses = Arrays.asList(getMed().getExtendedMetaclasses()); @@ -645,6 +643,10 @@ void handleEditMetaclass() { ExtendableMetaclassNameProvider metaclassNameProvider = ExtensionPlugin.getInstance() .getMetaclassNameProvider(metamodelUri); + if (metaclassNameProvider instanceof ModelTypeMetaclassNameFactory) { + metaclassNameProvider = ((ModelTypeMetaclassNameFactory)metaclassNameProvider).getProvider(getMed().getSupportedModelTypes()); + } + // Current metaclasses extended by the MED List currentlyExtendedMetaclasses = Arrays.asList(getMed().getExtendedMetaclasses()); @@ -898,7 +900,11 @@ private void validateMetaclasses() { if (!status.isError()) { // validate against metamodel - final ExtendableMetaclassNameProvider provider = ExtensionPlugin.getInstance().getMetaclassNameProvider(getMed().getMetamodelUri()); + ExtendableMetaclassNameProvider provider = ExtensionPlugin.getInstance().getMetaclassNameProvider(getMed().getMetamodelUri()); + + if (provider instanceof ModelTypeMetaclassNameFactory) { + provider = ((ModelTypeMetaclassNameFactory)provider).getProvider(getMed().getSupportedModelTypes()); + } OUTER: for (final String metaclass : metaclasses) { INNER: for (final String metaclassRoot : provider.getExtendableMetaclassRoots()) { diff --git a/plugins/org.teiid.designer.metamodels.function/src/org/teiid/designer/metamodels/function/extension/FunctionModelExtendableClassnameProvider.java b/plugins/org.teiid.designer.metamodels.function/src/org/teiid/designer/metamodels/function/extension/FunctionModelExtendableClassnameProvider.java index 69a08a4610..af62f565fc 100644 --- a/plugins/org.teiid.designer.metamodels.function/src/org/teiid/designer/metamodels/function/extension/FunctionModelExtendableClassnameProvider.java +++ b/plugins/org.teiid.designer.metamodels.function/src/org/teiid/designer/metamodels/function/extension/FunctionModelExtendableClassnameProvider.java @@ -11,17 +11,25 @@ import org.teiid.designer.metamodels.function.FunctionPackage; /** - * + * Provides extendable metaclass names for the Function metamodel. * * @since 8.0 */ public class FunctionModelExtendableClassnameProvider extends AbstractMetaclassNameProvider { /** - * + * Constructs a provider. */ public FunctionModelExtendableClassnameProvider() { super(FunctionPackage.eNS_URI); + + final String scalarFunction = "org.teiid.designer.metamodels.function.impl.ScalarFunctionImpl"; //$NON-NLS-1$ + final String functionParameter = "org.teiid.designer.metamodels.function.impl.FunctionParameterImpl"; //$NON-NLS-1$ + final String returnParamater = "org.teiid.designer.metamodels.function.impl.ReturnParameterImpl"; //$NON-NLS-1$ + + addMetaclass(scalarFunction, NO_PARENTS); + addMetaclass(functionParameter, scalarFunction); + addMetaclass(returnParamater, scalarFunction); } } diff --git a/plugins/org.teiid.designer.metamodels.relational/src/org/teiid/designer/metamodels/relational/extension/RelationalExtendableClassnameProvider.java b/plugins/org.teiid.designer.metamodels.relational/src/org/teiid/designer/metamodels/relational/extension/RelationalExtendableClassnameProvider.java index 5bfac7f111..24a661954e 100644 --- a/plugins/org.teiid.designer.metamodels.relational/src/org/teiid/designer/metamodels/relational/extension/RelationalExtendableClassnameProvider.java +++ b/plugins/org.teiid.designer.metamodels.relational/src/org/teiid/designer/metamodels/relational/extension/RelationalExtendableClassnameProvider.java @@ -7,20 +7,114 @@ */ package org.teiid.designer.metamodels.relational.extension; +import java.util.Set; import org.teiid.designer.core.extension.AbstractMetaclassNameProvider; +import org.teiid.designer.core.extension.ModelTypeMetaclassNameFactory; +import org.teiid.designer.extension.definition.ExtendableMetaclassNameProvider; +import org.teiid.designer.metamodels.core.ModelType; import org.teiid.designer.metamodels.relational.RelationalPackage; /** + * Provides extendable metaclass names for the Web Service metamodel. * - * * @since 8.0 */ -public class RelationalExtendableClassnameProvider extends AbstractMetaclassNameProvider { +public class RelationalExtendableClassnameProvider extends AbstractMetaclassNameProvider implements ModelTypeMetaclassNameFactory { + + private static final String VIEW = "org.teiid.designer.metamodels.relational.impl.ViewImpl"; //$NON-NLS-1$ + + private VirtualModelProvider virtualModelProvider; /** - * + * Constructs a provider. */ public RelationalExtendableClassnameProvider() { super(RelationalPackage.eNS_URI); + + final String column = "org.teiid.designer.metamodels.relational.impl.ColumnImpl"; //$NON-NLS-1$ + final String primaryKey = "org.teiid.designer.metamodels.relational.impl.PrimaryKeyImpl"; //$NON-NLS-1$ + final String foreignKey = "org.teiid.designer.metamodels.relational.impl.ForeignKeyImpl"; //$NON-NLS-1$ + final String procedure = "org.teiid.designer.metamodels.relational.impl.ProcedureImpl"; //$NON-NLS-1$ + final String index = "org.teiid.designer.metamodels.relational.impl.IndexImpl"; //$NON-NLS-1$ + final String procedureParameter = "org.teiid.designer.metamodels.relational.impl.ProcedureParameterImpl"; //$NON-NLS-1$ + final String uniqueConstraint = "org.teiid.designer.metamodels.relational.impl.UniqueConstraintImpl"; //$NON-NLS-1$ + final String accessPattern = "org.teiid.designer.metamodels.relational.impl.AccessPatternImpl"; //$NON-NLS-1$ + final String baseTable = "org.teiid.designer.metamodels.relational.impl.BaseTableImpl"; //$NON-NLS-1$ + final String procedureResult = "org.teiid.designer.metamodels.relational.impl.ProcedureResultImpl"; //$NON-NLS-1$ + + addMetaclass(baseTable, NO_PARENTS); + addMetaclass(VIEW, NO_PARENTS); + addMetaclass(procedure, NO_PARENTS); + addMetaclass(index, NO_PARENTS); + + addMetaclass(column, baseTable, VIEW, procedureResult); + addMetaclass(primaryKey, baseTable); + addMetaclass(foreignKey, baseTable); + addMetaclass(accessPattern, baseTable, VIEW); + addMetaclass(uniqueConstraint, baseTable); + + addMetaclass(procedureParameter, procedure); + addMetaclass(procedureResult, procedure); + } + + /** + * @see org.teiid.designer.core.extension.ModelTypeMetaclassNameFactory#getProvider(java.util.Set) + */ + @Override + public ExtendableMetaclassNameProvider getProvider(final Set modelTypes) { + if ((modelTypes != null) && (modelTypes.size() == 1) + && ModelType.VIRTUAL_LITERAL.getName().equals(modelTypes.iterator().next())) { + if (this.virtualModelProvider == null) { + this.virtualModelProvider = new VirtualModelProvider(this); + } + + return this.virtualModelProvider; + } + + return this; + } + + class VirtualModelProvider extends AbstractMetaclassNameProvider { + + private final RelationalExtendableClassnameProvider baseProvider; + + /** + * @param baseProvider the base relational metamodel metaclass name provider (never null) + */ + VirtualModelProvider(final RelationalExtendableClassnameProvider baseProvider) { + super(baseProvider.getMetamodelUri()); + this.baseProvider = baseProvider; + } + + /** + * @see org.teiid.designer.core.extension.AbstractMetaclassNameProvider#getExtendableMetaclassChildren(java.lang.String) + */ + @Override + public String[] getExtendableMetaclassChildren(String parentMetaclassName) { + return this.baseProvider.getExtendableMetaclassChildren(parentMetaclassName); + } + + /** + * @see org.teiid.designer.core.extension.AbstractMetaclassNameProvider#getExtendableMetaclassRoots() + */ + @Override + public String[] getExtendableMetaclassRoots() { + final String[] allRoots = this.baseProvider.getExtendableMetaclassRoots(); + final String[] rootsMinusView = new String[allRoots.length - 1]; + int i = 0; + + // need to filter out view + for (final String root : allRoots) { + if (VIEW.equals(root)) { + continue; + } + + rootsMinusView[i++] = root; + } + + return rootsMinusView; + } + } + } diff --git a/plugins/org.teiid.designer.metamodels.relational/src/org/teiid/designer/metamodels/relational/extension/RelationalModelExtensionAssistant.java b/plugins/org.teiid.designer.metamodels.relational/src/org/teiid/designer/metamodels/relational/extension/RelationalModelExtensionAssistant.java index 49c14b97db..bc9ed29bac 100644 --- a/plugins/org.teiid.designer.metamodels.relational/src/org/teiid/designer/metamodels/relational/extension/RelationalModelExtensionAssistant.java +++ b/plugins/org.teiid.designer.metamodels.relational/src/org/teiid/designer/metamodels/relational/extension/RelationalModelExtensionAssistant.java @@ -20,6 +20,7 @@ import org.teiid.designer.metamodels.relational.Procedure; import org.teiid.designer.metamodels.relational.RelationalPackage; import org.teiid.designer.metamodels.relational.Table; +import org.teiid.designer.metamodels.relational.View; /** * @since 8.0 @@ -104,7 +105,12 @@ protected ModelExtensionPropertyDefinition getPropertyDefinition(final Object mo final ModelExtensionPropertyDefinition propDefn = super.getPropertyDefinition(modelObject, propId); if (propDefn != null) { - boolean isPhysical = ModelUtil.isPhysical(modelObject); + // View objects in virtual models should not have extension properties + if (ModelUtil.isVirtual(modelObject) && (modelObject instanceof View)) { + return null; + } + + boolean isPhysical = ModelUtil.isPhysical(modelObject); boolean isFunction = false; if( modelObject instanceof Procedure ) { isFunction = ((Procedure)modelObject).isFunction(); diff --git a/plugins/org.teiid.designer.metamodels.webservice/src/org/teiid/designer/metamodels/webservice/extension/WebServiceExtendableClassnameProvider.java b/plugins/org.teiid.designer.metamodels.webservice/src/org/teiid/designer/metamodels/webservice/extension/WebServiceExtendableClassnameProvider.java index 9e31231b38..762a1b7d66 100644 --- a/plugins/org.teiid.designer.metamodels.webservice/src/org/teiid/designer/metamodels/webservice/extension/WebServiceExtendableClassnameProvider.java +++ b/plugins/org.teiid.designer.metamodels.webservice/src/org/teiid/designer/metamodels/webservice/extension/WebServiceExtendableClassnameProvider.java @@ -11,13 +11,35 @@ import org.teiid.designer.metamodels.webservice.WebServicePackage; /** + * Provides extendable metaclass names for the Web Service metamodel. * - * * @since 8.0 */ public class WebServiceExtendableClassnameProvider extends AbstractMetaclassNameProvider { + /** + * Constructs a provider. + */ public WebServiceExtendableClassnameProvider() { super(WebServicePackage.eNS_URI); + + final String operation = "org.teiid.designer.metamodels.webservice.impl.OperationImpl"; //$NON-NLS-1$ + final String input = "org.teiid.designer.metamodels.webservice.impl.InputImpl"; //$NON-NLS-1$ + final String output = "org.teiid.designer.metamodels.webservice.impl.OutputImpl"; //$NON-NLS-1$ + final String wsInterface = "org.teiid.designer.metamodels.webservice.impl.InterfaceImpl"; //$NON-NLS-1$ + final String sampleMessages = "org.teiid.designer.metamodels.webservice.impl.SampleMessagesImpl"; //$NON-NLS-1$ + final String sampleFile = "org.teiid.designer.metamodels.webservice.impl.SampleFileImpl"; //$NON-NLS-1$ + final String sampleXsd = "org.teiid.designer.metamodels.webservice.impl.SampleFromXsdImpl"; //$NON-NLS-1$ + + addMetaclass(wsInterface, NO_PARENTS); + addMetaclass(operation, wsInterface); + + addMetaclass(input, operation); + addMetaclass(output, operation); + + addMetaclass(sampleMessages, input, output); + addMetaclass(sampleFile, sampleMessages); + addMetaclass(sampleXsd, sampleMessages); } + } diff --git a/plugins/org.teiid.designer.metamodels.xml/src/org/teiid/designer/metamodels/xml/extension/XmlExtendableClassnameProvider.java b/plugins/org.teiid.designer.metamodels.xml/src/org/teiid/designer/metamodels/xml/extension/XmlExtendableClassnameProvider.java index de01dc9736..6f7eeae3ac 100644 --- a/plugins/org.teiid.designer.metamodels.xml/src/org/teiid/designer/metamodels/xml/extension/XmlExtendableClassnameProvider.java +++ b/plugins/org.teiid.designer.metamodels.xml/src/org/teiid/designer/metamodels/xml/extension/XmlExtendableClassnameProvider.java @@ -11,14 +11,40 @@ import org.teiid.designer.metamodels.xml.XmlDocumentPackage; /** + * Provides extendable metaclass names for the XML Document metamodel. * - * * @since 8.0 */ public class XmlExtendableClassnameProvider extends AbstractMetaclassNameProvider { + /** + * Constructs a provider. + */ public XmlExtendableClassnameProvider() { super(XmlDocumentPackage.eNS_URI); + + final String document = "org.teiid.designer.metamodels.xml.impl.XmlDocumentImpl"; //$NON-NLS-1$ + final String element = "org.teiid.designer.metamodels.xml.impl.XmlElementImpl"; //$NON-NLS-1$ + final String attribute = "org.teiid.designer.metamodels.xml.impl.XmlAttributeImpl"; //$NON-NLS-1$ + final String root = "org.teiid.designer.metamodels.xml.impl.XmlRootImpl"; //$NON-NLS-1$ + final String comment = "org.teiid.designer.metamodels.xml.impl.XmlCommentImpl"; //$NON-NLS-1$ + final String namespace = "org.teiid.designer.metamodels.xml.impl.XmlNamespaceImpl"; //$NON-NLS-1$ + final String sequence = "org.teiid.designer.metamodels.xml.impl.XmlSequenceImpl"; //$NON-NLS-1$ + final String all = "org.teiid.designer.metamodels.xml.impl.XmlAllImpl"; //$NON-NLS-1$ + final String choice = "org.teiid.designer.metamodels.xml.impl.XmlChoiceImpl"; //$NON-NLS-1$ + final String processingInstruction = "org.teiid.designer.metamodels.xml.impl.ProcessingInstructionImpl"; //$NON-NLS-1$ + + addMetaclass(document, NO_PARENTS); + addMetaclass(root, document); + addMetaclass(comment, document, root); + + addMetaclass(element, root); + addMetaclass(attribute, root); + addMetaclass(namespace, root); + addMetaclass(processingInstruction, root); + addMetaclass(all, root); + addMetaclass(choice, root); + addMetaclass(sequence, root); } }