001 package nl.cwi.sen1.visbase.factbrowser.data; 002 003 import java.util.ArrayList; 004 import java.util.Iterator; 005 006 import javax.swing.tree.DefaultMutableTreeNode; 007 008 import nl.cwi.sen1.relationstores.types.RType; 009 010 /** 011 * This class is the dataManager for the different visualizationPlugins and the 012 * RStoreFactTypes (like <str,str>) which are registered. It also caches the 013 * different visualisationPlugins and RStoreFactTypes. 014 * 015 * <b>Relational representation of in memory data structure</b> This 016 * dataManager holds an in memory representation of the RStore with it's 017 * children facts. 018 * 019 * Also it tracks all different types of RStoreFactTypes which are sent. Every 020 * visualisationPlugin which is sent should be coupled with a RStoreFactType. 021 * When a visualisationPlugin registers itself to a cached or new RStoreFactType 022 * a signal is sent to all children facts of the RStores which are 023 * RStoreFactType compatible. 024 * 025 * @author Renze de Vries 026 * @date 14-02-2007 027 * 028 */ 029 030 public class FactBrowserDataManager { 031 private static FactBrowserDataManager dataManagerInstance; 032 033 private ArrayList<RStoreFactType> factTypes; 034 035 private ArrayList<VisualisationPlugin> visPlugins; 036 037 /** 038 * Default constructor where the caching containers for the FactTypes and 039 * the Plugins are initialized. This is also private so it can only be 040 * instantiated from within this class. 041 * 042 * @author Renze de Vries 043 * @date 14-02-2007 044 */ 045 private FactBrowserDataManager() { 046 factTypes = new ArrayList<RStoreFactType>(); 047 visPlugins = new ArrayList<VisualisationPlugin>(); 048 } 049 050 /** 051 * This method makes it possible to centrally access the dataManager and 052 * only create it once. This is the method which enforces the singleton 053 * pattern. 054 * 055 * @author Renze de Vries 056 * @date 22-02-2007 057 * 058 * @return The instance of the DataManager 059 */ 060 public static FactBrowserDataManager getInstance() { 061 if (dataManagerInstance == null) { 062 dataManagerInstance = new FactBrowserDataManager(); 063 } 064 065 return dataManagerInstance; 066 } 067 068 /** 069 * This method makes it possible to reset all the elements so we can if 070 * nessecary start with a clean in memory list. 071 * 072 * @author Renze de Vries 073 * @date 22-02-2007 074 */ 075 public void resetDataManager() { 076 factTypes.clear(); 077 visPlugins.clear(); 078 } 079 080 /** 081 * This method is a method which directs the creation of a new Visualisation 082 * plugin and couples it to the different FactTypes 083 * 084 * @param visNewPlugin 085 * This is the new Visualisation Plugin to be created 086 * @param visFactType 087 * This is the FactType this plugin can display 088 * 089 * @author Renze de Vries 090 * @date 14-02-2007 091 */ 092 public void createVisualisation(VisualisationPlugin visNewPlugin, 093 RStoreFactType visFactType) { 094 // This method call is to get create the plugin in cache 095 // or if not already present get the cached version 096 visNewPlugin = addVisualisation(visNewPlugin); 097 098 // Now we must couple the plugin to the FactType so call the method 099 // which will do this. 100 coupleVisualisation(visNewPlugin, visFactType); 101 } 102 103 /** 104 * This method is to add the Visualisation Plugin to the cache or if already 105 * present give the already present VisualisationPlugin instance back 106 * 107 * @param visNewPlugin 108 * This is the Visualisation Plugin we want to add 109 * @return the instance of the Visualisation plugin which is or newly 110 * created or from the cache 111 * 112 * @author Renze de Vries 113 * @date 14-02-2007 114 */ 115 private VisualisationPlugin addVisualisation( 116 VisualisationPlugin visNewPlugin) { 117 Iterator<VisualisationPlugin> iterator = visPlugins.iterator(); 118 while (iterator.hasNext()) { 119 VisualisationPlugin visPlugin = iterator.next(); 120 if (visPlugin.getPluginId() == visNewPlugin.getPluginId()) { 121 return visPlugin; 122 } 123 } 124 125 visPlugins.add(visNewPlugin); 126 127 return visNewPlugin; 128 } 129 130 /** 131 * This method couples the visualisationPlugin to the nessecary 132 * RStoreFactTypes. When this happens the facts which are a member of the 133 * RStoreFactType will be notified. 134 * 135 * @param visPlugin 136 * The VisualisationPlugin to add to the specific FactType 137 * @param visFactType 138 * The FactType this visualisationPlugin applies to 139 * 140 * @author Renze de Vries 141 * @date 14-02-2007 142 */ 143 private void coupleVisualisation(VisualisationPlugin visPlugin, 144 RStoreFactType visFactType) { 145 146 // Go through all the RStoreFactTypes 147 for (RStoreFactType factType : factTypes) { 148 // If the RStoreFactType of the VisualisationPlugin matches that of 149 // the cached RStoreFactType add the VisualisationPlugin tot it. 150 if (factType == visFactType) { 151 factType.addVisualisationPlugin(visPlugin); 152 } 153 } 154 } 155 156 /** 157 * This method is to register an RStoreFactType. It will check if the 158 * RStoreFactType was already in the cache and if so return that instance. 159 * If not present create such an RStoreFactType and register it in the cache 160 * and return the created instance. 161 * 162 * @param newFactType 163 * The FactType we want to add 164 * 165 * @author Renze de Vries 166 * @date 14-02-2007 167 */ 168 public RStoreFactType addFactType(String newType) { 169 170 // Use the Java foreach iterator to look at all already cached 171 // RStoreFactTypes 172 for (RStoreFactType factType : factTypes) { 173 174 // If the RStoreFactType is already present return that instance. 175 if (factType.getFactType().equalsIgnoreCase(newType)) { 176 return factType; 177 } 178 } 179 180 // If the FactType was not already in the container we can now add it 181 RStoreFactType newFactType = new RStoreFactType(newType); 182 factTypes.add(newFactType); 183 184 return newFactType; 185 } 186 187 /** 188 * This method checks if the given selectedNode from the visual 189 * factBrowser tree was really a visualisationPlugin. 190 * 191 * @param selectedNode The selectedNode from the visual tree 192 * @return true if it was a visualisation plugin else false 193 * 194 * @author Renze de Vries 195 * @date 12-03-2007 196 */ 197 public boolean checkValidVisualisationPlugin( 198 DefaultMutableTreeNode selectedNode) { 199 if (selectedNode.getUserObject() instanceof VisualisationPlugin) { 200 return true; 201 } 202 return false; 203 } 204 205 /** 206 * This method checks if the given selectedNode from the visual 207 * factBrowser tree was a RStoreFact. 208 * 209 * @param selectedNode The selectedNode from the visual Tree 210 * @return true if it was a RStoreFact plugin else false 211 * 212 * @author Renze de Vries 213 * @date 12-03-2007 214 */ 215 public boolean checkValidRStoreFact(DefaultMutableTreeNode selectedNode) { 216 if (selectedNode instanceof RStoreFact) { 217 return true; 218 } 219 return false; 220 } 221 222 public boolean checkValidRStore(DefaultMutableTreeNode selectedNode) { 223 if (selectedNode.getUserObject() instanceof RStore) { 224 return true; 225 } 226 return false; 227 } 228 229 /** 230 * This method gets the Fact Identifier of a RStoreFact. It does this 231 * by a given selected visualisationPlugin and gathers from the in memory 232 * tree the identifier. 233 * 234 * @param selectedNode The selectedNode from the visualTree 235 * @return The RStoreFact Identifier 236 * 237 * @author Renze de Vries 238 * @date 12-03-2007 239 */ 240 public int getFactID(DefaultMutableTreeNode selectedNode) { 241 //check if the given selected node is really a visualisation Plugin 242 if (checkValidVisualisationPlugin(selectedNode)) { 243 RStoreFact rstoreFact = (RStoreFact) selectedNode.getParent(); 244 245 return rstoreFact.getFactId(); 246 } 247 248 //if the selectednode was not a visualisationPlugin return -1 249 return -1; 250 } 251 252 /** 253 * This method gets the RStore Identifier based on a selected VisualisationPlugin 254 * from the visual tree. It gathers the identifiers from the in memory tree. 255 * 256 * @param selectedNode The selectedNode from the visualTree 257 * @return The RStore identifier 258 * 259 * @author Renze de Vries 260 * @date 12-03-2007 261 * 262 * TODO: This method needs refactoring. The comments do not match the intended 263 * purpose of this method. 264 */ 265 public int getRStoreID(DefaultMutableTreeNode selectedNode) { 266 //for this to work it must be a visualisationPlugin 267 if (checkValidVisualisationPlugin(selectedNode)) { 268 269 //get from the visual tree the parent of the selectedNode (VisualisationPlugin) 270 //this parent (RStoreFact) get the parent which is a RStore. 271 DefaultMutableTreeNode rstoreNode = (DefaultMutableTreeNode) selectedNode 272 .getParent().getParent(); 273 274 RStore rstore = (RStore) rstoreNode.getUserObject(); 275 return rstore.getRstoreId(); 276 } 277 else if (checkValidRStore(selectedNode)) { 278 RStore rstore = (RStore) selectedNode.getUserObject(); 279 return rstore.getRstoreId(); 280 } 281 282 //if the selectednode was not a visualisationPlugin return -1 283 return -1; 284 } 285 286 /** 287 * This method returns the identifier of the visualisationPlugin. 288 * 289 * @param selectedNode The given selectedNode from the visual tree 290 * @return The identifier of the visualisationPlugin 291 * 292 * @author Renze de Vries 293 * @date 12-03-2007 294 */ 295 public int getVisPluginID(DefaultMutableTreeNode selectedNode) { 296 //check if the selectedNode was realy a visualisationPlugin 297 if (checkValidVisualisationPlugin(selectedNode)) { 298 VisualisationPlugin visPlugin = (VisualisationPlugin) selectedNode 299 .getUserObject(); 300 301 return visPlugin.getPluginId(); 302 } 303 304 //if the selectednode was not a visualisationPlugin return -1 305 return -1; 306 } 307 308 /** 309 * This method returns the RType of a selectedNode from the visualtree. 310 * For this to work it must be a selected RStoreFact. 311 * 312 * @param selectedNode The selectedNode from the visual tree 313 * @return The RType of the RStoreFact 314 */ 315 public RType getFactRType(DefaultMutableTreeNode selectedNode) { 316 //check if the given selectedNode is really a RStoreFact 317 if(checkValidRStoreFact(selectedNode)) 318 { 319 RStoreFact rstoreFact = (RStoreFact) selectedNode; 320 321 return rstoreFact.getRType(); 322 } 323 324 //if the given selectedNode was not a RStoreFact return null 325 return null; 326 } 327 }