1 package com.sourceforge.jpatterns.patterns.bhv.chain; 2 3 import java.io.Serializable; 4 import java.util.List; 5 6 /** 7 * This interface represents the concept of hierarchy composition of objects. This "hierarchy" idea includes relations "parent-child", 8 * "container-element" etc. It also could be recursive - when the parent of one "hierarchy item" could be the child of amother parent. 9 * etc. 10 * <br/> 11 * Details: 12 * <ul> 13 * <li>One parent could have lots of childs</li> 14 * <li>One child could belong to lots of parent (some complicated system could allow us to do it). todo: check this and provide some 15 * examples.</li> 16 * <li></li> 17 * </ul> 18 * <p/> 19 * todo: introduce permissions here 20 * todo: think over another type of exception 21 * 22 * todo: IChainItem (direction of running - left > right, right > left), ITreeItem???? 23 * 24 * todo: !!! (direction of running - left > right, right > left) - may be a field of hierarchy item???? In the case we go below 25 * the direction is changed to the opposite what allows us to step 3 items below and then to go to the top!!!! - it allows to organize 26 * interesting loops (we need some kind of engine/runner) not to allow to handlers to run all that by their self. 27 * 28 * $Author:: zmicer $<br/> 29 */ 30 public interface IHierarchyItem extends Serializable, Cloneable 31 { 32 /** 33 * @return theoretically each <code>IHierarchyItem</code> could have the type which is returned here. 34 * In the case the implementation of this interface has not type it could return <code>null</code>. 35 */ 36 String getType(); 37 38 /** 39 * @return the <strong>above</strong> parent item of type <code>IHierarchyItem</code>. Null could be returned if this element is 40 * the on top of hierarchy. 41 */ 42 IHierarchyItem getParent(); 43 44 /** 45 * @return the <strong>top</strong> parent item of type <code>IHierarchyItem</code>. Null could be returned if this element is 46 * the on top of hierarchy. 47 * 48 * @throws UnsupportedOperationException in the case this hierarchy item is not allowed to see the top parent evidently. 49 * It depends on the configuration of the system. 50 * TODO: introduce this configuration 51 */ 52 IHierarchyItem getTopParent() throws UnsupportedOperationException; 53 54 /** 55 * @return <code>List</code> of all the parent of this object (<strong>all the above recursive</strong> parents). Empty 56 * <code>List</code> could be returned if this element is the on top of hierarchy. 57 * 58 * @throws UnsupportedOperationException in the case this hierarchy item is not allowed to see all parent evidently. 59 * It depends on the configuration of the system. 60 */ 61 List getAllParents() throws UnsupportedOperationException; 62 63 /** 64 * Return parent items by type specified. Empty <code>List</code> could be returned if this element is the on top of hierarchy. 65 * 66 * @param type type of the parents. Can not be null (otherwise <code>IllegalArgumentException</code> would appear). 67 * 68 * @return <code>List</code> of all the parent of this object (<strong>all the above recursive</strong> parents) 69 * 70 * @throws UnsupportedOperationException in the case this hierarchy item is not allowed to see all parent by their type evidently. 71 * It depends on the configuration of the system. 72 */ 73 List getParents(String type) throws UnsupportedOperationException; 74 75 /** 76 * @return <code>List</code> of the <code>IHierarchyItem</code> objects. Empty <code>List</code> could be returned if this element 77 * do not have any childs. 78 */ 79 List getChilds(); 80 81 /** 82 * @return <code>List</code> of the <code>IHierarchyItem</code> objects - all the childs of this item (even visible through 83 * recursion). Empty <code>List</code> could be returned if this element 84 * do not have any childs. 85 * 86 * @throws UnsupportedOperationException in the case this hierarchy item is not allowed to see all the childs evidently. 87 * It depends on the configuration of the system. 88 */ 89 List getAllChilds() throws UnsupportedOperationException; 90 91 /** 92 * Return child items by types. 93 * 94 * @param type the type using which the returned items are specified. Empty <code>List</code> could be returned if this element 95 * do not have any childs. 96 * 97 * @return <code>List</code> of the <code>IHierarchyItem</code> objects - all the childs of this item (even visible through 98 * recursion). 99 * 100 * @throws UnsupportedOperationException in the case this hierarchy item is not allowed to see all the childs evidently. 101 * It depends on the configuration of the system. 102 */ 103 List getChilds(String type) throws UnsupportedOperationException; 104 105 /** 106 * Handle the message passed to the method. In that case the message is just <code>String</code> notifying the 107 * <code>IHierarchyItem</code> about some operation. 108 * <br/> 109 * Examples:<br/> 110 * 1. when we need to print to the <code>System.out</code> details about the current item we could pass here smth like 111 * "PRINT_THIS_ITEM_INFO". <br/> 112 * 2. when we need to print all the items above' info we could pass "PRINT_ALL_THE_ITEMS_INFO".<br/> 113 * Notes: 114 * <ul> 115 * <li>in the future this method could be extended by <code>Object handleMessage(String message, Object messageBody)</code> to 116 * allow to pass some message related info - in the case of migrating under Java 5 it would be generics. todo: check it</li> 117 * <li>Be noticed that implementation of this method could use {@link IHierarchyItem#getChainHandler(String)} to perform the 118 * handle operation or could just compare the message with allowed types and perform smth. without the handler.</li> 119 * </ul> 120 * 121 * @param message the message identifier. Can not be null (otherwise <code>IllegalArgumentException</code> would appear). 122 * 123 * @throws UnsupportedOperationException in the case this hierarchy item is not allowed to handle the types of message specified 124 * here and it the system is not configured to pass the control to the parent item. 125 * It depends on the configuration of the system. TODO: introduce this configuration 126 */ 127 void handleMessage(String message) throws UnsupportedOperationException; 128 129 /** 130 * Handle the message passed to the method. In that case the message is <code>IChainMessage</code> notifying the 131 * <code>IHierarchyItem</code> about some operation. This message is rather complicated object cause it allows us to specify the 132 * input and output parameters here (it could be done at the each stage of processing the message - at the hierarhical item, 133 * at the handler, at the inner runner - depending on the security of the system). 134 * <br/> 135 * Notes: 136 * <ul> 137 * <li>Be noticed that implementation of this method could use {@link IHierarchyItem#getChainHandler(IChainMessage)} to perform 138 * the handle operation or could just compare the message type with allowed types and perform smth. without the handler.</li> 139 * </ul> 140 * 141 * @param message the message identifier. Can not be null (otherwise <code>IllegalArgumentException</code> would appear). 142 * 143 * @throws UnsupportedOperationException in the case this hierarchy item is not allowed to handle the types of message specified 144 * here and it the system is not configured to pass the control to the parent item. 145 * It depends on the configuration of the system. TODO: introduce this configuration 146 */ 147 void handleMessage(IChainMessage message) throws UnsupportedOperationException; 148 149 /** 150 * Returns the <code>IChainHandler</code> instance appropriate for this message type provided. 151 * 152 * @param message the type of message for which we have appropriate handler. 153 * Can not be null (otherwise <code>IllegalArgumentException</code> would appear). 154 * 155 * @return instance of {@link IChainHandler} which could be used for performing this operation 156 * 157 * @throws UnsupportedOperationException in the case this item doesn't have appropriate handlers 158 */ 159 IChainHandler getChainHandler(String message) throws UnsupportedOperationException; 160 161 /** 162 * Returns the <code>IChainHandler</code> instance appropriate for this message provided (implementation of the handler could 163 * just take into attention the type of message ot could see at the implementation class or the state of message). 164 * todo: specify at the configuration of the system opportunity to map the message to the handler by implemented class, and also 165 * to introduce types of message for this implementation and allow to map different handler classes to it 166 * 167 * @param message the message for which we have appropriate handler. 168 * Can not be null (otherwise <code>IllegalArgumentException</code> would appear). 169 * 170 * @return instance of {@link IChainHandler} which could be used for performing this operation 171 * 172 * @throws UnsupportedOperationException in the case this item doesn't have appropriate handlers 173 */ 174 IChainHandler getChainHandler(IChainMessage message) throws UnsupportedOperationException; 175 }