/* * 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.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 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<String> 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 <code>null</code>) */ 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; } } }