package org.nightlabs.jfire.reporting.ui.parameter; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Set; import javax.jdo.FetchPlan; import org.nightlabs.jdo.ObjectID; import org.nightlabs.jfire.base.JFireEjb3Factory; import org.nightlabs.jfire.base.jdo.GlobalJDOManagerProvider; import org.nightlabs.jfire.base.ui.jdo.tree.ActiveJDOObjectTreeController; import org.nightlabs.jfire.jdo.notification.IJDOLifecycleListenerFilter; import org.nightlabs.jfire.jdo.notification.JDOLifecycleState; import org.nightlabs.jfire.jdo.notification.TreeLifecycleListenerFilter; import org.nightlabs.jfire.jdo.notification.TreeNodeParentResolver; import org.nightlabs.jfire.reporting.parameter.ReportParameterManagerRemote; import org.nightlabs.jfire.reporting.parameter.ValueProvider; import org.nightlabs.jfire.reporting.parameter.ValueProviderCategory; import org.nightlabs.jfire.reporting.parameter.ValueProviderParentResolver; import org.nightlabs.jfire.reporting.parameter.dao.ValueProviderCategoryDAO; import org.nightlabs.jfire.reporting.parameter.dao.ValueProviderDAO; import org.nightlabs.jfire.reporting.parameter.id.ValueProviderCategoryID; import org.nightlabs.jfire.reporting.parameter.id.ValueProviderID; import org.nightlabs.jfire.reporting.ui.resource.Messages; import org.nightlabs.jfire.security.GlobalSecurityReflector; import org.nightlabs.progress.ProgressMonitor; import org.nightlabs.progress.SubProgressMonitor; /** * Active controller for {@link ValueProviderCategory}s and {@link ValueProvider}s. * * @author Alexander Bieber <!-- alex [AT] nightlabs [DOT] de --> * */ public abstract class ValueProviderController extends ActiveJDOObjectTreeController<ObjectID, Object, ValueProviderTreeNode> { public static final String[] CATEGORY_FETCH_GROUPS = new String[] { FetchPlan.DEFAULT, ValueProviderCategory.FETCH_GROUP_NAME, ValueProviderCategory.FETCH_GROUP_PARENT_ID }; public static final String[] PROVIDER_FETCH_GROUPS = new String[] { FetchPlan.DEFAULT, ValueProvider.FETCH_GROUP_NAME, ValueProvider.FETCH_GROUP_CATEGORY_ID }; @Override protected ValueProviderTreeNode createNode() { return new ValueProviderTreeNode(); } @Override protected TreeNodeParentResolver createTreeNodeParentResolver() { return new ValueProviderParentResolver(); } @Override protected Class<Object> getJDOObjectClass() { throw new UnsupportedOperationException("Should never be called!"); //$NON-NLS-1$ } @Override protected IJDOLifecycleListenerFilter createJDOLifecycleListenerFilter(Set<? extends ObjectID> parentObjectIDs) { return new TreeLifecycleListenerFilter( new Class[] {ValueProviderCategory.class, ValueProvider.class}, true, parentObjectIDs, getTreeNodeParentResolver(), new JDOLifecycleState[] { JDOLifecycleState.NEW } ); } private ChangeListener changeListener; @Override protected void createRegisterChangeListener() { if (changeListener == null) { changeListener = new ChangeListener(Messages.getString("org.nightlabs.jfire.reporting.ui.parameter.ValueProviderController.registerChangeListener.name")); //$NON-NLS-1$ GlobalJDOManagerProvider.sharedInstance().getLifecycleManager().addNotificationListener(new Class[] {ValueProviderCategory.class, ValueProvider.class}, changeListener); } } @Override protected void unregisterChangeListener() { if (changeListener == null) { GlobalJDOManagerProvider.sharedInstance().getLifecycleManager().addNotificationListener(new Class[] {ValueProviderCategory.class, ValueProvider.class}, changeListener); changeListener = null; } } @SuppressWarnings("unchecked") @Override protected Collection<Object> retrieveChildren(ObjectID parentID, Object parent, ProgressMonitor monitor) { ReportParameterManagerRemote reportParameterManager = JFireEjb3Factory.getRemoteBean( ReportParameterManagerRemote.class, GlobalSecurityReflector.sharedInstance().getInitialContextProperties()); if (parentID == null) { try { Set<ValueProviderCategoryID> topCategories = reportParameterManager.getValueProviderCategoryIDsForParent(null); return (Collection)ValueProviderCategoryDAO.sharedInstance().getValueProviderCategories(topCategories, CATEGORY_FETCH_GROUPS, monitor); } catch (Exception e) { throw new RuntimeException(e); } } if (parentID instanceof ValueProviderCategoryID) { monitor.beginTask(Messages.getString("org.nightlabs.jfire.reporting.ui.parameter.ValueProviderController.task.loadValueProviders"), 100); //$NON-NLS-1$ try { Set<ValueProviderCategoryID> categoryIDs; categoryIDs = reportParameterManager.getValueProviderCategoryIDsForParent((ValueProviderCategoryID) parentID); Collection<Object> categories = (Collection)ValueProviderCategoryDAO.sharedInstance().getValueProviderCategories(categoryIDs, CATEGORY_FETCH_GROUPS, new SubProgressMonitor(monitor, 50)); Set<ValueProviderID> providerIDs = reportParameterManager.getValueProviderIDsForParent((ValueProviderCategoryID) parentID); Collection<Object> providers = (Collection)ValueProviderDAO.sharedInstance().getValueProviders(providerIDs, PROVIDER_FETCH_GROUPS, new SubProgressMonitor(monitor, 50)); categories.addAll(providers); return categories; } catch (Exception e) { throw new RuntimeException(e); } finally { monitor.done(); } } else return Collections.emptySet(); } @SuppressWarnings("unchecked") @Override protected Collection<Object> retrieveJDOObjects(Set<ObjectID> objectIDs, ProgressMonitor monitor) { if (objectIDs.size() <= 0) return Collections.emptySet(); if (objectIDs.iterator().next() instanceof ValueProviderCategoryID) { Set<ValueProviderCategoryID> catIDs = ((Set)objectIDs); return ((Collection)ValueProviderCategoryDAO.sharedInstance().getValueProviderCategories(catIDs, CATEGORY_FETCH_GROUPS, monitor)); } else { Set<ValueProviderID> providerIDs = ((Set)objectIDs); return ((Collection)ValueProviderDAO.sharedInstance().getValueProviders(providerIDs, PROVIDER_FETCH_GROUPS, monitor)); } } @Override protected void sortJDOObjects(List<Object> objects) { } // @Override // protected abstract void onJDOObjectsChanged(JDOTreeNodesChangedEvent<ObjectID, ValueProviderTreeNode> changedEvent); }