/* * 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.modelgenerator.xml.modelextension.impl; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EEnum; import org.eclipse.emf.ecore.EEnumLiteral; import org.eclipse.emf.ecore.EcorePackage; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.ObjectExtension; import org.teiid.designer.metamodels.core.extension.ExtensionFactory; import org.teiid.designer.metamodels.core.extension.XAttribute; import org.teiid.designer.metamodels.core.extension.XClass; import org.teiid.designer.metamodels.core.extension.XEnumLiteral; import org.teiid.designer.metamodels.relational.Column; import org.teiid.designer.metamodels.relational.RelationalEntity; import org.teiid.designer.modelgenerator.xml.modelextension.XMLRequestResponseExtensionManager; /** * @since 8.0 */ public abstract class XMLRequestResponseExtensionManagerImpl extends BaseXMLRelationalExtensionManagerImpl implements XMLRequestResponseExtensionManager { protected Map multipleValueEnumValues; protected Map columnRoleEnumValues; protected Map multipleValueEnumLookup; protected Map columnRoleEnumLookup; static final String COLUMN_INPUT_PARAM = "IsInputParameter"; //$NON-NLS-1$ static final String COLUMN_PARENT_ATTRIBUTE = "AttributeOfParent"; //$NON-NLS-1$ static final String COLUMN_DATA_ATTRIBUTE = "DataAttributeName"; //$NON-NLS-1$ static final String COLUMN_MULTIPLE_VALUES = "MultipleValues"; //$NON-NLS-1$ static final String COLUMN_REQUIRED_VALUE = "RequiredValue"; //$NON-NLS-1$ static final String COLUMN_ALLOW_EMPTY_INPUT = "AllowEmptyInputElement"; //$NON-NLS-1$ static final String COLUMN_XPATH_FOR_INPUT = "XPathForInputParameter"; //$NON-NLS-1$ static final String COLUMN_ROLE = "Role"; //$NON-NLS-1$ static final String TABLE_XPATH_ROOT_INPUT = "XPathRootForInput"; //$NON-NLS-1$ public static final Integer DATA_ROLE = 0; public static final Integer RESPONSE_OUT_ROLE = 1; public static final Integer RESPONSE_IN_ROLE = 2; public static final Integer LOCATION_ROLE = 3; public static final Integer NO_MULTIPLE_VALUES = 0; public static final Integer COMMA_DELIMTED_MULTIPLE_VALUES = 1; public static final Integer MULTI_ELEMENT_MULTIPLE_VALUES = 2; private EEnum multipleValuesEnum; private EEnum columnRoleEnum; private XAttribute xPathRootForInputTableAttribute; private XAttribute isInputParameterColumnAttribute; private XAttribute attributeOfParentColumnAttribute; private XAttribute dataAttributeNameColumnAttribute; private XAttribute multipleValuesColumnAttribute; private XAttribute requiredValueColumnAttribute; private XAttribute allowEmptyInputElementColumnAttribute; private XAttribute xPathForInputParameterColumnAttribute; private XAttribute roleColumnAttribute; protected XMLRequestResponseExtensionManagerImpl() { multipleValueEnumLookup = new HashMap(); columnRoleEnumLookup = new HashMap(); multipleValueEnumValues = new HashMap(); multipleValueEnumValues.put("No", NO_MULTIPLE_VALUES); //$NON-NLS-1$ multipleValueEnumValues.put("CommaDelimited", COMMA_DELIMTED_MULTIPLE_VALUES); //$NON-NLS-1$ multipleValueEnumValues.put("MultiElement", MULTI_ELEMENT_MULTIPLE_VALUES); //$NON-NLS-1$ columnRoleEnumValues = new HashMap(); columnRoleEnumValues.put("Data", DATA_ROLE); //$NON-NLS-1$ columnRoleEnumValues.put("ResponseOut", RESPONSE_OUT_ROLE); //$NON-NLS-1$ columnRoleEnumValues.put("ResponseIn", RESPONSE_IN_ROLE); //$NON-NLS-1$ columnRoleEnumValues.put("Location", LOCATION_ROLE); //$NON-NLS-1$ } @Override public void assignClassifier( EClassifier classifier ) { if (classifier.getName().equals("MultipleValuesEnum")) { //$NON-NLS-1$ multipleValuesEnum = (EEnum)classifier; loadLiterals(multipleValuesEnum.getELiterals(), multipleValueEnumLookup); } else if (classifier.getName().equals("ColumnRoleEnum")) { //$NON-NLS-1$ columnRoleEnum = (EEnum)classifier; loadLiterals(columnRoleEnum.getELiterals(), columnRoleEnumLookup); } } private void loadLiterals( EList literals, Map lookup ) { Iterator iter = literals.iterator(); EEnumLiteral lit; while (iter.hasNext()) { lit = (EEnumLiteral)iter.next(); lookup.put(lit.getValue(), lit); } } @Override public void createTableExtensions( ExtensionFactory xFactory, XClass table ) { super.createTableExtensions(xFactory, table); xPathRootForInputTableAttribute = xFactory.createXAttribute(); xPathRootForInputTableAttribute.setName(TABLE_XPATH_ROOT_INPUT); xPathRootForInputTableAttribute.setEType(EcorePackage.eINSTANCE.getEString()); table.getEStructuralFeatures().add(xPathRootForInputTableAttribute); } @Override public void createColumnExtensions( ExtensionFactory xFactory, XClass column ) { isInputParameterColumnAttribute = xFactory.createXAttribute(); isInputParameterColumnAttribute.setName(COLUMN_INPUT_PARAM); isInputParameterColumnAttribute.setEType(EcorePackage.eINSTANCE.getEBoolean()); column.getEStructuralFeatures().add(isInputParameterColumnAttribute); attributeOfParentColumnAttribute = xFactory.createXAttribute(); attributeOfParentColumnAttribute.setName(COLUMN_PARENT_ATTRIBUTE); attributeOfParentColumnAttribute.setEType(EcorePackage.eINSTANCE.getEBoolean()); column.getEStructuralFeatures().add(attributeOfParentColumnAttribute); dataAttributeNameColumnAttribute = xFactory.createXAttribute(); dataAttributeNameColumnAttribute.setName(COLUMN_DATA_ATTRIBUTE); dataAttributeNameColumnAttribute.setEType(EcorePackage.eINSTANCE.getEString()); column.getEStructuralFeatures().add(dataAttributeNameColumnAttribute); multipleValuesColumnAttribute = xFactory.createXAttribute(); multipleValuesColumnAttribute.setName(COLUMN_MULTIPLE_VALUES); multipleValuesColumnAttribute.setEType(multipleValuesEnum); column.getEStructuralFeatures().add(multipleValuesColumnAttribute); requiredValueColumnAttribute = xFactory.createXAttribute(); requiredValueColumnAttribute.setName(COLUMN_REQUIRED_VALUE); requiredValueColumnAttribute.setEType(EcorePackage.eINSTANCE.getEBoolean()); requiredValueColumnAttribute.setDefaultValueLiteral(Boolean.FALSE.toString()); column.getEStructuralFeatures().add(requiredValueColumnAttribute); allowEmptyInputElementColumnAttribute = xFactory.createXAttribute(); allowEmptyInputElementColumnAttribute.setName(COLUMN_ALLOW_EMPTY_INPUT); allowEmptyInputElementColumnAttribute.setEType(EcorePackage.eINSTANCE.getEBoolean()); allowEmptyInputElementColumnAttribute.setDefaultValueLiteral(Boolean.FALSE.toString()); column.getEStructuralFeatures().add(allowEmptyInputElementColumnAttribute); xPathForInputParameterColumnAttribute = xFactory.createXAttribute(); xPathForInputParameterColumnAttribute.setName(COLUMN_XPATH_FOR_INPUT); xPathForInputParameterColumnAttribute.setEType(EcorePackage.eINSTANCE.getEString()); column.getEStructuralFeatures().add(xPathForInputParameterColumnAttribute); roleColumnAttribute = xFactory.createXAttribute(); roleColumnAttribute.setName(COLUMN_ROLE); roleColumnAttribute.setEType(columnRoleEnum); roleColumnAttribute.setDefaultValue(columnRoleEnumLookup.get(DATA_ROLE)); column.getEStructuralFeatures().add(roleColumnAttribute); } @Override public void createEnums( ExtensionFactory xFactory ) { multipleValuesEnum = xFactory.createXEnum(); multipleValuesEnum.setName("MultipleValuesEnum"); //$NON-NLS-1$ getPackage().getEClassifiers().add(multipleValuesEnum); createLiterals(xFactory, multipleValuesEnum, multipleValueEnumValues, multipleValueEnumLookup); columnRoleEnum = xFactory.createXEnum(); columnRoleEnum.setName("ColumnRoleEnum"); //$NON-NLS-1$ getPackage().getEClassifiers().add(columnRoleEnum); createLiterals(xFactory, columnRoleEnum, columnRoleEnumValues, columnRoleEnumLookup); } private void createLiterals( ExtensionFactory xFactory, EEnum xEnum, Map enumValues, Map lookup ) { Iterator values; values = enumValues.entrySet().iterator(); while (values.hasNext()) { Map.Entry value = (Entry)values.next(); XEnumLiteral lit = xFactory.createXEnumLiteral(); lit.setName((String)value.getKey()); lit.setValue(((Integer)value.getValue()).intValue()); xEnum.getELiterals().add(lit); lookup.put(value.getValue(), lit); } } @Override public void assignAttribute( XAttribute attribute ) { super.assignAttribute(attribute); if (attribute.getName().equals(COLUMN_ALLOW_EMPTY_INPUT)) { allowEmptyInputElementColumnAttribute = attribute; } else if (attribute.getName().equals(COLUMN_DATA_ATTRIBUTE)) { dataAttributeNameColumnAttribute = attribute; } else if (attribute.getName().equals(COLUMN_INPUT_PARAM)) { isInputParameterColumnAttribute = attribute; } else if (attribute.getName().equals(COLUMN_MULTIPLE_VALUES)) { multipleValuesColumnAttribute = attribute; } else if (attribute.getName().equals(COLUMN_PARENT_ATTRIBUTE)) { attributeOfParentColumnAttribute = attribute; } else if (attribute.getName().equals(COLUMN_REQUIRED_VALUE)) { requiredValueColumnAttribute = attribute; } else if (attribute.getName().equals(COLUMN_ROLE)) { roleColumnAttribute = attribute; } else if (attribute.getName().equals(COLUMN_XPATH_FOR_INPUT)) { xPathForInputParameterColumnAttribute = attribute; } else if (attribute.getName().equals(TABLE_XPATH_ROOT_INPUT)) { xPathRootForInputTableAttribute = attribute; } } /* (non-Javadoc) * @See org.teiid.designer.modelgenerator.wsdl.modelextension.IXMLRequestResponseExtensionManager#setColumnRoleAttribute(org.teiid.designer.metamodels.relational.Column, java.lang.Integer) */ @Override public void setColumnRoleAttribute( Column column, Integer role ) { ObjectExtension extension = new ObjectExtension(column, theColumnXClass, ModelerCore.getModelEditor()); extension.eDynamicSet(roleColumnAttribute, columnRoleEnumLookup.get(role)); } /* (non-Javadoc) * @See org.teiid.designer.modelgenerator.wsdl.modelextension.IXMLRequestResponseExtensionManager#setColumnInputParamAttribute(org.teiid.designer.metamodels.relational.Column, java.lang.Boolean) */ @Override public void setColumnInputParamAttribute( Column column, Boolean input ) { ObjectExtension extension = new ObjectExtension(column, theColumnXClass, ModelerCore.getModelEditor()); extension.eDynamicSet(isInputParameterColumnAttribute, input); } /* (non-Javadoc) * @See org.teiid.designer.modelgenerator.wsdl.modelextension.IXMLRequestResponseExtensionManager#setXPathRootForInputAttribute(org.teiid.designer.metamodels.relational.RelationalEntity, java.lang.String) */ @Override public void setXPathRootForInputAttribute( RelationalEntity table, String xrfi_attribute_value ) { ObjectExtension extension = new ObjectExtension(table, theTableXClass, ModelerCore.getModelEditor()); extension.eDynamicSet(xPathRootForInputTableAttribute, xrfi_attribute_value); } /* (non-Javadoc) * @See org.teiid.designer.modelgenerator.wsdl.modelextension.IXMLRequestResponseExtensionManager#setColumnXPathForInput(org.teiid.designer.metamodels.relational.Column, java.lang.String) */ @Override public void setColumnXPathForInput( Column relColumn, String xpath ) { ObjectExtension objectExtension2 = new ObjectExtension(relColumn, theColumnXClass, ModelerCore.getModelEditor()); objectExtension2.eDynamicSet(xPathForInputParameterColumnAttribute, xpath); } /* (non-Javadoc) * @See org.teiid.designer.modelgenerator.wsdl.modelextension.IXMLRequestResponseExtensionManager#setAllowEmptyInputElement(org.teiid.designer.metamodels.relational.Column, boolean) */ @Override public void setAllowEmptyInputElement( Column relCol, boolean request ) { ObjectExtension objectExtension2 = new ObjectExtension(relCol, theColumnXClass, ModelerCore.getModelEditor()); objectExtension2.eDynamicSet(allowEmptyInputElementColumnAttribute, Boolean.FALSE); ObjectExtension objExt = new ObjectExtension(relCol, theColumnXClass, ModelerCore.getModelEditor()); objExt.eDynamicSet(requiredValueColumnAttribute, Boolean.valueOf(request)); } /* (non-Javadoc) * @See org.teiid.designer.modelgenerator.wsdl.modelextension.IXMLRequestResponseExtensionManager#setMultipleValue(org.teiid.designer.metamodels.relational.Column, java.lang.Integer) */ @Override public void setMultipleValue( Column relColumn, Integer value ) { ObjectExtension objectExtension = new ObjectExtension(relColumn, theColumnXClass, ModelerCore.getModelEditor()); objectExtension.eDynamicSet(multipleValuesColumnAttribute, multipleValueEnumLookup.get(value)); } }