/** * Licensed under the Artistic License; you may not use this file * except in compliance with the License. * You may obtain a copy of the License at * * http://displaytag.sourceforge.net/license.html * * THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ package org.displaytag.export; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.displaytag.Messages; import org.displaytag.exception.WrappedRuntimeException; import org.displaytag.model.TableModel; import org.displaytag.properties.MediaTypeEnum; import org.displaytag.properties.TableProperties; import org.displaytag.util.ReflectHelper; /** * Factory for export views. * @author Fabrizio Giustina * @version $Revision$ ($Author$) */ public final class ExportViewFactory { /** * Singleton. */ private static ExportViewFactory instance; /** * logger. */ private static Log log = LogFactory.getLog(ExportViewFactory.class); /** * Map containing MediaTypeEnum - View class. */ private final Map<MediaTypeEnum, Class> viewClasses = new HashMap<MediaTypeEnum, Class>(); /** * Private constructor. */ private ExportViewFactory() { TableProperties properties = TableProperties.getInstance(null); String[] exportTypes = properties.getExportTypes(); if (log.isInfoEnabled()) { log.info(Messages.getString("ExportViewFactory.initializing", //$NON-NLS-1$ new Object[]{ArrayUtils.toString(exportTypes)})); } for (int j = 0; j < exportTypes.length; j++) { String className = properties.getExportClass(exportTypes[j]); registerExportView(exportTypes[j], className); } } /** * Returns the simgleton for this class. * @return ExportViewFactory instance */ public static synchronized ExportViewFactory getInstance() { if (instance == null) { instance = new ExportViewFactory(); } return instance; } /** * Register a new Export View, associated with a Media Type. If another export view is currently associated with the * given media type it's replaced. * @param name media name * @param viewClassName export view class name */ public void registerExportView(String name, String viewClassName) { Class exportClass; try { exportClass = ReflectHelper.classForName(viewClassName); } catch (ClassNotFoundException e) { log.error(Messages.getString("ExportViewFactory.classnotfound", //$NON-NLS-1$ new Object[]{name, viewClassName})); return; } catch (NoClassDefFoundError e) { log.warn(Messages.getString("ExportViewFactory.noclassdef" //$NON-NLS-1$ , new Object[]{name, viewClassName, e.getMessage()})); return; } try { exportClass.newInstance(); } catch (InstantiationException e) { log.error(Messages.getString("ExportViewFactory.instantiationexception", //$NON-NLS-1$ new Object[]{name, viewClassName, e.getMessage()})); return; } catch (IllegalAccessException e) { log.error(Messages.getString("ExportViewFactory.illegalaccess", //$NON-NLS-1$ new Object[]{name, viewClassName, e.getMessage()})); return; } catch (NoClassDefFoundError e) { log.warn(Messages.getString("ExportViewFactory.noclassdef" //$NON-NLS-1$ , new Object[]{name, viewClassName, e.getMessage()})); return; } MediaTypeEnum media = MediaTypeEnum.registerMediaType(name); viewClasses.put(media, exportClass); if (log.isDebugEnabled()) { log.debug(Messages.getString("ExportViewFactory.added", //$NON-NLS-1$ new Object[]{media, viewClassName})); } } /** * returns an instance of export view associated with the given export type. * @param exportType MediaTypeEnum * @param tableModel table model containing data to render * @param exportFullList should the complete list be exported? * @param includeHeader should header be included in export? * @param decorateValues should ouput be decorated? * @return specialized instance of BaseExportView */ public ExportView getView(MediaTypeEnum exportType, TableModel tableModel, boolean exportFullList, boolean includeHeader, boolean decorateValues) { ExportView view; Class viewClass = viewClasses.get(exportType); try { view = (ExportView) viewClass.newInstance(); } catch (InstantiationException e) { // should not happen (class has already been instantiated before) throw new WrappedRuntimeException(getClass(), e); } catch (IllegalAccessException e) { // should not happen (class has already been instantiated before) throw new WrappedRuntimeException(getClass(), e); } view.setParameters(tableModel, exportFullList, includeHeader, decorateValues); return view; } }