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 }