Skip to content

Commit

Permalink
TEIIDDES-1597 Remove the concept of extention properties for ViewImpl…
Browse files Browse the repository at this point in the history
… objects for virtual models

Added back in ViewImpl to physical model. Also refactored metamodel-specific information from base provider to their specific metamodel provider.
  • Loading branch information
elvisisking committed Feb 18, 2013
1 parent b3cfb55 commit 8591551
Show file tree
Hide file tree
Showing 9 changed files with 316 additions and 178 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 <code>null</code> or empty)
* @return the label (never <code>null</code> 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<String, List<String>> parentChildMap;
return metaclassName;
}

private String metamodelUri;
private final List<String> metaclassNames;
private final String metamodelUri;
private final Map<String, List<String>> parentChildMap;
private final List<String> roots;

public AbstractMetaclassNameProvider( final String metamodelUri ) {
protected AbstractMetaclassNameProvider(final String metamodelUri) {
CoreArgCheck.isNotEmpty(metamodelUri);
this.metaclassNames = new ArrayList<String>();
this.metamodelUri = metamodelUri;
populateParentChildMap(this.metamodelUri);
}

private void populateParentChildMap( String metamodelUri ) {
this.parentChildMap = new HashMap<String, List<String>>();
if (RELATIONAL_URI.equals(this.metamodelUri)) {
// BaseTable
List<String> children = new ArrayList<String>();
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<String>();
children.add(RELATIONAL_PROCEDURE_RESULT);
children.add(RELATIONAL_PROCEDURE_PARAMETER);
this.parentChildMap.put(RELATIONAL_PROCEDURE, children);
// Procedure
children = new ArrayList<String>();
children.add(RELATIONAL_COLUMN);
this.parentChildMap.put(RELATIONAL_PROCEDURE_RESULT, children);
} else if (SOURCE_FUNCTION_URI.equals(this.metamodelUri)) {
// Function
List<String> children = new ArrayList<String>();
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<String> children = new ArrayList<String>();
children.add(WEB_SERVICE_OPERATION);
this.parentChildMap.put(WEB_SERVICE_INTERFACE, children);
// Operation
children = new ArrayList<String>();
children.add(WEB_SERVICE_INPUT);
children.add(WEB_SERVICE_OUTPUT);
this.parentChildMap.put(WEB_SERVICE_OPERATION, children);
// Input and Output
children = new ArrayList<String>();
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<String>();
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<String> children = new ArrayList<String>();
children.add(XML_XMLROOT);
children.add(XML_XMLCOMMENT);
this.parentChildMap.put(XML_XMLDOCUMENT, children);
// XML Root and Element
children = new ArrayList<String>();
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<String>();
}

@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<String> kids = this.parentChildMap.get(parent);

if (kids == null) {
kids = new ArrayList<String>();
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<String> kidNames = this.parentChildMap.get(parentMetaclassName);

if ((kidNames == null) || kidNames.isEmpty()) {
return new String[0];
}
List<String> 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<String, List<String>> 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);
}

}
Original file line number Diff line number Diff line change
@@ -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 <code>null</code> or empty)
* @return the provider (never <code>null</code>)
*/
ExtendableMetaclassNameProvider getProvider(final Set<String> modelTypes);

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand Down Expand Up @@ -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() {
Expand Down

0 comments on commit 8591551

Please sign in to comment.