package com.onaro.sanscreen.client.view.tabular; import java.text.MessageFormat; import java.util.HashMap; import java.util.Map; import java.util.ResourceBundle; import com.onaro.sanscreen.client.SANscreenClientPlugin; import com.onaro.sanscreen.client.view.init.ConfigurableTableModelInitInfo; import com.onaro.sanscreen.client.view.init.ConfigurableTableModelInitInfo.AnnotationColumnInitInfo; import com.onaro.sanscreen.client.view.init.ConfigurableTableModelInitInfo.AnnotationContextColumnInitInfo; import com.onaro.util.IllegalInitException; import com.onaro.util.InvalidConfigException; import com.onaro.util.enumeration.EnumPresentation; import com.onaro.util.xml.XmlIterator; /** * Creates configurable columns based on the requested column type. */ public class ColumnFactory { private static Map typeToColumnFactoryWorker = new HashMap(); static { ColumnFactoryWorker basicColumnFactoryWorker = new ColumnFactoryWorker() { public ITabularColumn createColumn(String tableName, ConfigurableTableModelInitInfo.ColumnInitInfo columnInitInfo, ResourceBundle resources, EnumPresentation enumerations) throws IllegalInitException { return new BasicColumn(tableName, (ConfigurableTableModelInitInfo.BasicColumnInitInfo) columnInitInfo, resources, enumerations); } public ConfigurableTableModelInitInfo.ColumnInitInfo getColumnInitInfo(XmlIterator confItr) { return new ConfigurableTableModelInitInfo.BasicColumnInitInfo(confItr); } }; ColumnFactoryWorker dateColumnFactoryWorker = new ColumnFactoryWorker() { public ITabularColumn createColumn(String tableName, ConfigurableTableModelInitInfo.ColumnInitInfo columnInitInfo, ResourceBundle resources, EnumPresentation enumerations) throws IllegalInitException { return new DateColumn(tableName, (ConfigurableTableModelInitInfo.DateColumnInitInfo) columnInitInfo, resources, enumerations); } public ConfigurableTableModelInitInfo.ColumnInitInfo getColumnInitInfo(XmlIterator confItr) { return new ConfigurableTableModelInitInfo.DateColumnInitInfo(confItr); } }; ColumnFactoryWorker numberColumnFactoryWorker = new ColumnFactoryWorker() { public ITabularColumn createColumn(String tableName, ConfigurableTableModelInitInfo.ColumnInitInfo columnInitInfo, ResourceBundle resources, EnumPresentation enumerations) throws IllegalInitException { return new NumberColumn(tableName, (ConfigurableTableModelInitInfo.NumberColumnInitInfo) columnInitInfo, resources, enumerations); } public ConfigurableTableModelInitInfo.ColumnInitInfo getColumnInitInfo(XmlIterator confItr) throws InvalidConfigException { return new ConfigurableTableModelInitInfo.NumberColumnInitInfo(confItr); } }; ColumnFactoryWorker contextColumnFactoryWorker = new ColumnFactoryWorker() { public ITabularColumn createColumn(String tableName, ConfigurableTableModelInitInfo.ColumnInitInfo columnInitInfo, ResourceBundle resources, EnumPresentation enumerations) throws IllegalInitException { return new ContextColumn(tableName, (ConfigurableTableModelInitInfo.ContextColumnInitInfo) columnInitInfo, resources); } public ConfigurableTableModelInitInfo.ColumnInitInfo getColumnInitInfo(XmlIterator confItr) throws InvalidConfigException { return new ConfigurableTableModelInitInfo.ContextColumnInitInfo(confItr); } }; ColumnFactoryWorker htmlColumnFactoryWorker = new ColumnFactoryWorker() { public ITabularColumn createColumn(String tableName, ConfigurableTableModelInitInfo.ColumnInitInfo columnInitInfo, ResourceBundle resources, EnumPresentation enumerations) throws IllegalInitException { return new HtmlColumn(tableName, (ConfigurableTableModelInitInfo.HtmlColumnInitInfo) columnInitInfo, resources, enumerations); } public ConfigurableTableModelInitInfo.ColumnInitInfo getColumnInitInfo(XmlIterator confItr) { return new ConfigurableTableModelInitInfo.HtmlColumnInitInfo(confItr); } }; ColumnFactoryWorker derivedColumnFactoryWorker = new ColumnFactoryWorker() { public ITabularColumn createColumn(String tableName, ConfigurableTableModelInitInfo.ColumnInitInfo columnInitInfo, ResourceBundle resources, EnumPresentation enumerations) throws IllegalInitException { return new DerivedNumberColumn(tableName, (ConfigurableTableModelInitInfo.NumberColumnInitInfo) columnInitInfo, resources, enumerations); } public ConfigurableTableModelInitInfo.ColumnInitInfo getColumnInitInfo(XmlIterator confItr) throws InvalidConfigException { return new ConfigurableTableModelInitInfo.NumberColumnInitInfo(confItr); } }; ColumnFactoryWorker annotationsColumnFactoryWorker = new ColumnFactoryWorker() { public ITabularColumn createColumn(String tableName, ConfigurableTableModelInitInfo.ColumnInitInfo columnInitInfo, ResourceBundle resources, EnumPresentation enumerations) throws IllegalInitException { return new AnnotationColumn(tableName, (ConfigurableTableModelInitInfo.AnnotationColumnInitInfo) columnInitInfo); } public ConfigurableTableModelInitInfo.ColumnInitInfo getColumnInitInfo(XmlIterator confItr) throws InvalidConfigException { throw new UnsupportedOperationException(); } }; ColumnFactoryWorker annotationContextColumnFactoryWorker = new ColumnFactoryWorker() { public ITabularColumn createColumn(String tableName, ConfigurableTableModelInitInfo.ColumnInitInfo columnInitInfo, ResourceBundle resources, EnumPresentation enumerations) throws IllegalInitException { return new AnnotationContextColumn(tableName, (ConfigurableTableModelInitInfo.AnnotationContextColumnInitInfo) columnInitInfo, resources); } public ConfigurableTableModelInitInfo.ColumnInitInfo getColumnInitInfo(XmlIterator confItr) throws InvalidConfigException { return new ConfigurableTableModelInitInfo.AnnotationContextColumnInitInfo(confItr); } }; put("column", basicColumnFactoryWorker); //$NON-NLS-1$ put("row", basicColumnFactoryWorker); //$NON-NLS-1$ put("datecolumn", dateColumnFactoryWorker); //$NON-NLS-1$ put("numbercolumn", numberColumnFactoryWorker); //$NON-NLS-1$ put("contextcolumn", contextColumnFactoryWorker); //$NON-NLS-1$ put("htmlcolumn", htmlColumnFactoryWorker); //$NON-NLS-1$ put("derivedcolumn", derivedColumnFactoryWorker); //$NON-NLS-1$ put(AnnotationColumnInitInfo.COLUMN_TYPE, annotationsColumnFactoryWorker); put(AnnotationContextColumnInitInfo.COLUMN_TYPE, annotationContextColumnFactoryWorker); } private static void put(String type, ColumnFactoryWorker columnFactoryWorker) { typeToColumnFactoryWorker.put(type, columnFactoryWorker); } public static ConfigurableTableModelInitInfo.ColumnInitInfo getColumnInitInfo(String type, XmlIterator confItr) throws InvalidConfigException { ColumnFactoryWorker columnFactoryWorker = typeToColumnFactoryWorker.get(type); return columnFactoryWorker.getColumnInitInfo(confItr); } /** * Creates a column of the given type for the given table. * * @param tableName * the table the column belongs to * @param resources * provides locale dependant resources * */ public static ITabularColumn createColumn(String tableName, ConfigurableTableModelInitInfo.ColumnInitInfo columnInitInfo, ResourceBundle resources) throws IllegalInitException { SANscreenClientPlugin clientPlugin = SANscreenClientPlugin.getDefault(); EnumPresentation enumPresentation = clientPlugin.getEnumPresentation(); String colType = columnInitInfo.getType(); ColumnFactoryWorker columnFactoryWorker = typeToColumnFactoryWorker.get(colType); if (columnFactoryWorker == null) { String msgPattern = "Failed to find column type: {0} instantiator for: {0}"; //$NON-NLS-1$ String msg = MessageFormat.format(msgPattern, colType, columnInitInfo.getClass().getName()); throw new IllegalArgumentException(msg); } return columnFactoryWorker.createColumn(tableName, columnInitInfo, resources, enumPresentation); } private interface ColumnFactoryWorker { public ConfigurableTableModelInitInfo.ColumnInitInfo getColumnInitInfo(XmlIterator confItr) throws InvalidConfigException; public ITabularColumn createColumn(String tableName, ConfigurableTableModelInitInfo.ColumnInitInfo columnInitInfo, ResourceBundle resources, EnumPresentation enumerations) throws IllegalInitException; } }