001    package de.deepamehta.plugins.boxrenderer.dom;
002    
003    import de.deepamehta.plugins.topicmaps.ViewmodelCustomizer;
004    import de.deepamehta.plugins.topicmaps.service.TopicmapsService;
005    
006    import de.deepamehta.core.Topic;
007    import de.deepamehta.core.model.ChildTopicsModel;
008    import de.deepamehta.core.osgi.PluginActivator;
009    import de.deepamehta.core.service.Inject;
010    import de.deepamehta.core.service.PluginService;
011    
012    import java.util.logging.Logger;
013    
014    
015    
016    public class BoxRendererPlugin extends PluginActivator implements ViewmodelCustomizer {
017    
018        // ------------------------------------------------------------------------------------------------------- Constants
019    
020        private static final String PROP_COLOR    = "dm4.boxrenderer.color";
021        private static final String PROP_EXPANDED = "dm4.boxrenderer.expanded";
022    
023        // ---------------------------------------------------------------------------------------------- Instance Variables
024    
025        // Note: this instance variable is not used but we must declare it in order to initiate service tracking.
026        // The Topicmaps service is accessed only on-the-fly within the serviceArrived() and serviceGone() hooks.
027        @Inject
028        private TopicmapsService topicmapsService;
029    
030        private Logger logger = Logger.getLogger(getClass().getName());
031    
032        // -------------------------------------------------------------------------------------------------- Public Methods
033    
034        // *** Hook Implementations ***
035    
036        @Override
037        public void serviceArrived(PluginService service) {
038            ((TopicmapsService) service).registerViewmodelCustomizer(this);
039        }
040    
041        @Override
042        public void serviceGone(PluginService service) {
043            // Note 1: unregistering is crucial. Otherwise the Topicmaps plugin would hold a viewmodel customizer with
044            // a stale dms instance as soon as the Box Renderer is redeployed. A subsequent storeViewProperties() call
045            // (see below) would fail.
046            // Note 2: we must unregister via serviceGone() hook, that is immediately when the Topicmaps service is about
047            // to go away. Using the shutdown() hook instead would be too late as the Topicmaps service might already gone.
048            ((TopicmapsService) service).unregisterViewmodelCustomizer(this);
049        }
050    
051        // *** ViewmodelCustomizer Implementation ***
052    
053        @Override
054        public void enrichViewProperties(Topic topic, ChildTopicsModel viewProps) {
055            boolean expanded = _enrichViewProperties(topic, viewProps);
056            if (expanded) {
057                topic.loadChildTopics("dm4.notes.text");
058            }
059        }
060    
061        @Override
062        public void storeViewProperties(Topic topic, ChildTopicsModel viewProps) {
063            storeColor(topic, viewProps);
064            storeExpanded(topic, viewProps);
065        }
066    
067        // ------------------------------------------------------------------------------------------------- Private Methods
068    
069        private boolean _enrichViewProperties(Topic topic, ChildTopicsModel viewProps) {
070            // 1) color
071            if (topic.hasProperty(PROP_COLOR)) {
072                String color = (String) topic.getProperty(PROP_COLOR);
073                viewProps.put(PROP_COLOR, color);
074            }
075            // 2) expanded
076            boolean expanded = false;
077            if (topic.getTypeUri().equals("dm4.notes.note")) {
078                if (topic.hasProperty(PROP_EXPANDED)) {
079                    expanded = (Boolean) topic.getProperty(PROP_EXPANDED);
080                    viewProps.put(PROP_EXPANDED, expanded);
081                }
082            }
083            return expanded;
084        }
085    
086        // ---
087    
088        private void storeColor(Topic topic, ChildTopicsModel viewProps) {
089            if (viewProps.has(PROP_COLOR)) {
090                String color = viewProps.getString(PROP_COLOR);
091                topic.setProperty(PROP_COLOR, color, false);        // addToIndex = false
092            }
093        }
094    
095        private void storeExpanded(Topic topic, ChildTopicsModel viewProps) {
096            if (viewProps.has(PROP_EXPANDED)) {
097                boolean expanded = viewProps.getBoolean(PROP_EXPANDED);
098                topic.setProperty(PROP_EXPANDED, expanded, false);  // addToIndex = false
099                // ### TODO: store the expanded flag *per-topicmap*
100            }
101        }
102    }