/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package de.cismet.cids.tools.metaobjectrenderer; import Sirius.server.middleware.types.MetaClass; import Sirius.server.middleware.types.MetaObject; import java.util.Collection; import javax.swing.JComponent; import de.cismet.cids.dynamics.CidsBean; import de.cismet.cids.editors.CidsObjectEditorFactory; import de.cismet.cids.utils.ClassloadingHelper; import de.cismet.tools.collections.TypeSafeCollections; import de.cismet.tools.gui.ComponentWrapper; import de.cismet.tools.gui.DoNotWrap; /** * DOCUMENT ME! * * @author thorsten * @author stefan * @version $Revision$, $Date$ */ public class CidsObjectRendererFactory { //~ Static fields/initializers --------------------------------------------- private static CidsObjectRendererFactory instance = null; //~ Instance fields -------------------------------------------------------- private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass()); // private static final Map<MetaClass, JComponent> singleRenderer = TypeSafeCollections.newHashMap(); // private HashMap<MetaClass,JComponent> aggregationRenderer=new HashMap<MetaClass, JComponent>(); // private static final boolean lazyClassFetching = true; // private static final String RENDERER_PREFIX = "de.cismet.cids.custom.objectrenderer."; // private static final String SINGLE_RENDERER_SUFFIX = "Renderer"; // private static final String AGGREGATION_RENDERER_SUFFIX = "AggregationRenderer"; private final ComponentWrapper cw; //~ Constructors ----------------------------------------------------------- /** * Creates a new CidsObjectRendererFactory object. */ private CidsObjectRendererFactory() { cw = CidsObjectEditorFactory.getInstance().getComponentWrapper(); } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public static CidsObjectRendererFactory getInstance() { if (instance == null) { instance = new CidsObjectRendererFactory(); } return instance; } /** * DOCUMENT ME! * * @param mo DOCUMENT ME! * @param title DOCUMENT ME! * * @return DOCUMENT ME! */ public JComponent getSingleRenderer(final MetaObject mo, final String title) { if (log.isDebugEnabled()) { log.debug("getSingleRenderer"); // NOI18N } // final boolean isEDT = EventQueue.isDispatchThread(); // //Caching bleibt erstmal aus, da sonst nicht mehrere Editoren gleichzeitigt erzeugt werden // ret=singleRenderer.get(mo.getMetaClass()); // if (ret!=null){ // if (ret instanceof CidsBeanRenderer){ // ((CidsBeanRenderer)ret).setCidsBean(mo.getBean()); // return ret; // } // } // Eine Moeglickeit wäre eine bestimmte Anzahl von Renderern zur Verfügung zustellen // anstelle iner hashmap eine multimap und dann über addnotify die instanz des renderers aus dem cahe entferne und bei removenotify (wenn der renderer // nicht mehr bebraucht wird) wieder dem cache zur verfuegung zu stellen. problem ist, das es noch keine // gemeinsame oberklasse für die renderer gibt // insert Ooops here final JComponent componentReferenceHolder; JComponent rendererComp = null; try { final Class<?> rendererClass = ClassloadingHelper.getDynamicClass(mo.getMetaClass(), ClassloadingHelper.CLASS_TYPE.RENDERER); final CidsBean bean; if (rendererClass != null) { if (CidsBeanRenderer.class.isAssignableFrom(rendererClass)) { bean = mo.getBean(); } else { bean = null; } final Object o = rendererClass.newInstance(); if (bean != null) { final CidsBeanRenderer renderer = (CidsBeanRenderer)o; renderer.setTitle(title); renderer.setCidsBean(bean); rendererComp = (JComponent)renderer; } else if (o instanceof MetaObjectRenderer) { final MetaObjectRenderer mor = (MetaObjectRenderer)o; rendererComp = mor.getSingleRenderer(mo, title); } else { throw new RuntimeException( "Not a valid Renderer. The Renderer should be a CidsBeanRenderer or a MetaObjectRenderer"); // NOI18N } } if (rendererComp == null) { rendererComp = new DefaultMetaObjectRenderer().getSingleRenderer(mo, title); } } catch (Throwable e) { log.error("Error during creating the renderer.", e); // NOI18N return new ErrorRenderer(e, mo, title); } // singleRenderer.put(mo.getMetaClass(), rendererComp); if ((cw != null) && !(rendererComp instanceof DoNotWrap)) { componentReferenceHolder = (JComponent)cw.wrapComponent(rendererComp); } else { componentReferenceHolder = rendererComp; } return componentReferenceHolder; } /** * DOCUMENT ME! * * @param rendererClass DOCUMENT ME! * @param moCollection DOCUMENT ME! * @param title DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RuntimeException DOCUMENT ME! */ public JComponent getAggregationRenderer(final Class<?> rendererClass, final Collection<MetaObject> moCollection, final String title) { final Collection<CidsBean> beans; if (CidsBeanAggregationRenderer.class.isAssignableFrom(rendererClass)) { beans = TypeSafeCollections.newArrayList(moCollection.size()); for (final MetaObject currentMO : moCollection) { beans.add(currentMO.getBean()); } } else { beans = null; } try { final Object rendererInstanceObject = rendererClass.newInstance(); if (beans != null) { final CidsBeanAggregationRenderer rendererComp = (CidsBeanAggregationRenderer)rendererInstanceObject; rendererComp.setTitle(title); rendererComp.setCidsBeans(beans); if (log.isDebugEnabled()) { log.debug("Will return " + rendererComp); // NOI18N } if ((cw != null) && !(rendererComp instanceof DoNotWrap)) { return (JComponent)cw.wrapComponent((JComponent)rendererComp); } else { return (JComponent)rendererComp; } } else if (rendererInstanceObject instanceof MetaObjectRenderer) { final MetaObjectRenderer mor = (MetaObjectRenderer)rendererInstanceObject; final JComponent comp = mor.getAggregationRenderer(moCollection, title); if ((cw != null) && !(comp instanceof DoNotWrap)) { return (JComponent)cw.wrapComponent(comp); } else { return comp; } } } catch (Throwable t) { throw new RuntimeException(t); } return null; } /** * DOCUMENT ME! * * @param moCollection DOCUMENT ME! * @param title DOCUMENT ME! * * @return DOCUMENT ME! */ public JComponent getAggregationRenderer(final Collection<MetaObject> moCollection, final String title) { if (moCollection.size() == 1) { return getSingleRenderer(moCollection.iterator().next(), title); } else { final MetaObject mo = moCollection.iterator().next(); final MetaClass mc = mo.getMetaClass(); JComponent resultReferenceHolder = null; try { final Class<?> rendererClass = ClassloadingHelper.getDynamicClass( mc, ClassloadingHelper.CLASS_TYPE.AGGREGATION_RENDERER); if (rendererClass != null) { resultReferenceHolder = getAggregationRenderer(rendererClass, moCollection, title); } } catch (Exception e) { log.error("Error while creating the renderer.", e); // NOI18N } return resultReferenceHolder; } } }