/*
* 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.extension.convertor;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.teiid.designer.extension.convertor.mxd.DisplayType;
import org.teiid.designer.extension.convertor.mxd.MetaclassType;
import org.teiid.designer.extension.convertor.mxd.ObjectFactory;
import org.teiid.designer.extension.convertor.mxd.PropertyType;
import org.teiid.designer.runtime.spi.TeiidPropertyDefinition;
/**
*
*/
public class TeiidPropertyDefinitionConvertor implements MxdConstants {
private final ObjectFactory factory = new ObjectFactory();
private Map<String, MetaclassType> metaclassTypeMap;
private MetaclassType getMetaclassType(String name) {
if (name == null)
throw new IllegalStateException("The MetaclassType name cannot be null"); //$NON-NLS-1$
MetaclassType metaclassType = metaclassTypeMap.get(name);
if (metaclassType == null) {
/*
* <p:extendedMetaclass name="org.teiid.designer.metamodels.relational.impl.ColumnImpl">
*/
metaclassType = factory.createMetaclassType();
if (TargetObjectMappings.TABLE.getTeiidClass().equals(name))
metaclassType.setName(TargetObjectMappings.TABLE.getDesignerClass());
else if (TargetObjectMappings.PROCEDURE.getTeiidClass().equals(name))
metaclassType.setName(TargetObjectMappings.PROCEDURE.getDesignerClass());
else if (TargetObjectMappings.COLUMN.getTeiidClass().equals(name))
metaclassType.setName(TargetObjectMappings.COLUMN.getDesignerClass());
else if (TargetObjectMappings.PROCEDUREPARAMETER.getTeiidClass().equalsIgnoreCase(name))
metaclassType.setName(TargetObjectMappings.PROCEDUREPARAMETER.getDesignerClass());
else
throw new IllegalStateException("Unsupported MetaclassType " + name); //$NON-NLS-1$
metaclassTypeMap.put(name, metaclassType);
}
return metaclassType;
}
/**
* @param extensions
* @return resulting collection of {@link MetaclassType}s
*/
public Collection<MetaclassType> getMetaclasses(Collection<TeiidPropertyDefinition> extensions) {
metaclassTypeMap = new HashMap<String, MetaclassType>();
for(TeiidPropertyDefinition defn : extensions) {
String owner = defn.getOwner();
if (owner == null)
throw new IllegalStateException("A translator property definition " + defn.getName() + " does not contain an owner property"); //$NON-NLS-1$ //$NON-NLS-2$
String[] appClasses = owner.split(COMMA);
for (String appClass : appClasses) {
MetaclassType metaclassType = getMetaclassType(appClass);
PropertyType propertyType = factory.createPropertyType();
metaclassType.getProperty().add(propertyType);
/*
*<p:property advanced="false" index="true" masked="false" name="JoinColumn" required="false" type="string">
* <p:display locale="en_US">Join Column</p:display>
*</p:property>
*/
// Teiid tends to have an url prefixed to the literal
String name = defn.getName();
{
String[] segments = name.split("}"); //$NON-NLS-1$
name = segments[segments.length - 1];
}
propertyType.setName(name);
propertyType.setAdvanced(defn.isAdvanced());
propertyType.setRequired(defn.isRequired());
propertyType.setMasked(defn.isMasked());
if (defn.isConstrainedToAllowedValues()) {
for (String allowedValue : defn.getAllowedValues()) {
propertyType.getAllowedValue().add(allowedValue);
}
}
String description = defn.getDescription();
if (description != null && description.length() > 0) {
DisplayType descriptionType = factory.createDisplayType();
descriptionType.setValue(description);
propertyType.getDescription().add(descriptionType);
}
String displayName = defn.getDisplayName();
if (displayName != null && displayName.length() > 0) {
displayName = displayName.replaceAll("\"", EMPTY_STRING); //$NON-NLS-1$
DisplayType displayType = factory.createDisplayType();
displayType.setValue(displayName);
propertyType.getDisplay().add(displayType);
}
String dataType = defn.getPropertyTypeClassName();
if (dataType != null && dataType.length() > 0) {
// Remove package prefix
String[] segments = dataType.toLowerCase().split("\\."); //$NON-NLS-1$
dataType = segments[segments.length - 1];
ValidDataTypes.validateDataType(dataType);
propertyType.setType(dataType);
}
Object defaultValue = defn.getDefaultValue();
if (defaultValue != null)
propertyType.setDefaultValue(defaultValue.toString());
}
}
return metaclassTypeMap.values();
}
}