1 package com.sourceforge.jpatterns.core.configuration.model; 2 3 import com.sourceforge.jpatterns.schema.CastorNameScopePriorityType; 4 import com.sourceforge.jpatterns.schema.CastorSectionType; 5 import com.zmicer.utils.InputArgumentUtils; 6 import com.zmicer.utils.ObjectStateUtils; 7 import com.zmicer.utils.model.ICheckable; 8 import org.apache.log4j.Logger; 9 10 import java.util.ArrayList; 11 import java.util.HashMap; 12 import java.util.List; 13 import java.util.Map; 14 15 /** 16 * This base class defines the fields are necessary for the defining the context of one/any combination of <code>JPatternsConfig</code> 17 * castor objects. Also it contains the utility methods could be used for the forming this fields (all of them are collections) with the 18 * appropriate information. 19 * <br/> 20 * Currently there are two types of the storages: sections and business items. Both of them are necessary for us as they could be use for 21 * the differenty purposes. E.g. A. the logically separate global configuration item (we would use the business items storage) and 22 * B. factory configuration is represented as storage - in this case for the retrieving the "factory" pattern we would find the appropriate 23 * section based castor object, and then the concrete implementation of the factory would retrieve the business items. 24 * <br/> 25 * The fields are introduced here could be extended (or modified) in the case the structure of the <code>JPatternsConfig</code> castor 26 * object would be changed (and we would need another storages for the configuration). 27 * <p/> 28 * note [zmicer]: be noticed some additional infrustructure methods may be required here. 29 * note [zmicer]: class is not done as abstract to allow the convenient testing. Also there is possibility it could be used as is somewhere. 30 * 31 * $Author:: zmicer $<br/> 32 * $Rev:: 67 $<br/> 33 * $Date:: 2007-08-28 21:37:07 #$<br/> 34 */ 35 public class JPatternsConfigBaseBean implements ICheckable 36 { 37 /** 38 * Logger instance. 39 */ 40 final public static Logger LOG = Logger.getLogger(JPatternsConfigBaseBean.class); 41 42 /** 43 * The structure is necessary for the fast access to the necessary business items using the path. This path is as follows: 44 * Section Scope ID/ Section ID/ Item Scope ID/ Item Name 45 * <br/> 46 * 1st key is the scope of the section<br/> 47 * 2nd key is the name of the section castor object <br/> 48 * 3rd key is the scope of the appropriate CastorNameScopePriorityType object 49 * 4rd key is the name of the appropriate CastorNameScopePriorityType object 50 */ 51 private Map<String, Map<String, Map<String, Map<String, CastorNameScopePriorityType>>>> m_businessItems = 52 new HashMap<String, Map<String, Map<String, Map<String, CastorNameScopePriorityType>>>>(); 53 54 /** 55 * This structure stores the configuration related to the "section based" castor objects used at the JPatterns framework (these types 56 * base on the <code>CastorSectionType</code> base castor type). 57 * <br/> 58 * This structure allows us to access the appropriate <code>CastorSectionType</code> object using two keys:<br/> 59 * 1st key is the scope name,<br/> 60 * 2nd kays is the name of the appropriate section 61 */ 62 private Map<String, Map<String, CastorSectionType>> m_sectionItems = 63 new HashMap<String, Map<String, CastorSectionType>>(); 64 65 /** 66 * Default public constructor. 67 * <br/> 68 * Is tested at the setup method 69 */ 70 public JPatternsConfigBaseBean() 71 { 72 super(); 73 } 74 75 /** 76 * Set the new value for the business items. 77 * <br/> 78 * Tested here <code>com.sourceforge.jpatterns.core.configuration.model.JPatternsConfigBaseBeanTest#testSetGetBusinessItems()</code> 79 * 80 * @param businessItems the new value for the business items storage. 81 * Can not be null (otherwise <code>IllegalArgumentException</code> would appear). 82 */ 83 public void setBusinessItems(Map<String, Map<String, Map<String, Map<String, CastorNameScopePriorityType>>>> businessItems) 84 { 85 InputArgumentUtils.checkObjects(businessItems); 86 m_businessItems = businessItems; 87 } 88 89 /** 90 * Tested here <code>com.sourceforge.jpatterns.core.configuration.model.JPatternsConfigBaseBeanTest#testSetGetBusinessItems()</code> 91 * 92 * @return the business items storage 93 */ 94 public Map<String, Map<String, Map<String, Map<String, CastorNameScopePriorityType>>>> getBusinessItems() 95 { 96 return m_businessItems; 97 } 98 99 /** 100 * Set the new value for the section items 101 * <br/> 102 * Tested here: com.sourceforge.jpatterns.core.configuration.model.JPatternsConfigBaseBeanTest#testSetGetSectionItems() 103 * 104 * @param sectionItems the section items storage 105 * Can not be null (otherwise <code>IllegalArgumentException</code> would appear). 106 */ 107 public void setSectionItems(Map<String, Map<String, CastorSectionType>> sectionItems) 108 { 109 InputArgumentUtils.checkObjects(sectionItems); 110 m_sectionItems = sectionItems; 111 } 112 113 /** 114 * Tested here: com.sourceforge.jpatterns.core.configuration.model.JPatternsConfigBaseBeanTest#testSetGetSectionItems() 115 * 116 * @return the section items storage 117 */ 118 public Map<String, Map<String, CastorSectionType>> getSectionItems() 119 { 120 return m_sectionItems; 121 } 122 123 /** 124 * @return another representation of the section items - the List of the <code>CastorSectionType</code> objects. 125 */ 126 public List<CastorSectionType> getListOfSectionItems() 127 { 128 final List<CastorSectionType> result = new ArrayList<CastorSectionType>(); 129 for (String scope : m_sectionItems.keySet()) 130 { 131 for (String sectionName : m_sectionItems.get(scope).keySet()) 132 { 133 result.add(m_sectionItems.get(scope).get(sectionName)); 134 } 135 } 136 137 return result; 138 } 139 140 /** 141 * @see com.zmicer.utils.model.ICheckable#check() 142 */ 143 public boolean check() 144 { 145 return (null != m_businessItems && null != m_sectionItems); 146 } 147 148 /** 149 * Get the business item - the instance of the CastorNameScopePriorityType class. 150 * <br/> 151 * Tested here: com.sourceforge.jpatterns.core.configuration.model.JPatternsConfigBaseBeanTest#testSetGetBusinessItem() 152 * 153 * @param sectionScope section scope id. Can not be null (otherwise <code>IllegalArgumentException</code> would appear). 154 * @param sectionName section name. Can not be null (otherwise <code>IllegalArgumentException</code> would appear). 155 * @param itemScope item scope. Can not be null (otherwise <code>IllegalArgumentException</code> would appear). 156 * @param itemName business item name. Can not be null (otherwise <code>IllegalArgumentException</code> would appear). 157 * 158 * @return the appropriate <code>CastorNameScopePriorityType</code> castor object or the <code>null</code> in the case 159 * the provided path (these three keys) do not point to the real castor object. 160 */ 161 public CastorNameScopePriorityType getBusinessItem(final String sectionScope, final String sectionName, final String itemScope, 162 final String itemName) 163 { 164 InputArgumentUtils.checkStrings(true, sectionScope, sectionName, itemScope, itemName); 165 ObjectStateUtils.strongCheck(this); 166 try 167 { 168 return m_businessItems.get(sectionScope).get(sectionName).get(itemScope).get(itemName); 169 } 170 catch (NullPointerException npe) 171 { 172 // just catch 173 } 174 return null; 175 } 176 177 /** 178 * Set the provided business item using the provided path. In the case some parts of the path are not constructed yet - they would be 179 * constructed (new maps would be created). In the case another business items has been already stored under the same path - 180 * it would be replaced by this one. 181 * <br/> 182 * tested here:com.sourceforge.jpatterns.core.configuration.model.JPatternsConfigBaseBeanTest#testSetGetBusinessItem() 183 * 184 * @param sectionScope sectionScope name. Can not be null (otherwise <code>IllegalArgumentException</code> would appear). 185 * @param sectionName section name. Can not be null (otherwise <code>IllegalArgumentException</code> would appear). 186 * @param item the castor object to be stored. Can not be null (otherwise <code>IllegalArgumentException</code> would appear). 187 * The item name would be get from this bean too, so <code>item.getName()</code> should not return null or empty 188 * String (<code>IllegalArgumentException</code> would appear in this wrong case) 189 */ 190 public void setBusinessItem(final String sectionScope, final String sectionName, final CastorNameScopePriorityType item) 191 { 192 InputArgumentUtils.checkObjects(item); 193 InputArgumentUtils.checkStrings(true, sectionScope, sectionName, item.getName(), item.getScope()); 194 ObjectStateUtils.strongCheck(this); 195 if (null == m_businessItems.get(sectionScope)) 196 { 197 m_businessItems.put(sectionScope, new HashMap<String, Map<String, Map<String, CastorNameScopePriorityType>>>()); 198 } 199 if (null == m_businessItems.get(sectionScope).get(sectionName)) 200 { 201 m_businessItems.get(sectionScope).put(sectionName, new HashMap<String, Map<String, CastorNameScopePriorityType>>()); 202 } 203 if (null == m_businessItems.get(sectionScope).get(sectionName).get(item.getScope())) 204 { 205 m_businessItems.get(sectionScope).get(sectionName).put(item.getScope(), new HashMap<String, CastorNameScopePriorityType>()); 206 } 207 m_businessItems.get(sectionScope).get(sectionName).get(item.getScope()).put(item.getName(), item); 208 } 209 210 /** 211 * Get the section type castor object by the pointed path (basing on the scope/section name string) 212 * 213 * @param scope the scope name. Can not be null (otherwise <code>IllegalArgumentException</code> would appear). 214 * @param sectionName the section name. Can not be null (otherwise <code>IllegalArgumentException</code> would appear). 215 * 216 * @return the <code>CastorSectionType</code> castor object in the case of success or <code>null</code> otherwise.. 217 */ 218 public CastorSectionType getSection(final String scope, final String sectionName) 219 { 220 InputArgumentUtils.checkStrings(true, scope, sectionName); 221 ObjectStateUtils.strongCheck(this); 222 if (null != m_sectionItems.get(scope)) 223 { 224 return m_sectionItems.get(scope).get(sectionName); 225 } 226 227 return null; 228 } 229 230 /** 231 * Set the pointed section <code>CastorSectionType</code> castor object to the map is used for this purposes. 232 * 233 * @param scope the name of the scope the provided CastorSectionType castor object should belong. 234 * Can not be null (otherwise <code>IllegalArgumentException</code> would appear). 235 * @param section <code>CastorSectionType</code> castor object which is based for all the "section based" JPatterns configurations items 236 */ 237 public void setSection(final String scope, final CastorSectionType section) 238 { 239 InputArgumentUtils.checkObjects(section); 240 InputArgumentUtils.checkStrings(true, scope, section.getName()); 241 ObjectStateUtils.strongCheck(this); 242 if (null == m_sectionItems.get(scope)) 243 { 244 m_sectionItems.put(scope, new HashMap<String, CastorSectionType>()); 245 } 246 m_sectionItems.get(scope).put(section.getName(), section); 247 } 248 }