1 15 package org.apache.tapestry.spec; 16 17 import java.util.ArrayList ; 18 import java.util.Collections ; 19 import java.util.HashMap ; 20 import java.util.Iterator ; 21 import java.util.List ; 22 import java.util.Map ; 23 24 import org.apache.hivemind.ApplicationRuntimeException; 25 import org.apache.hivemind.Location; 26 import org.apache.hivemind.Resource; 27 import org.apache.hivemind.util.ToStringBuilder; 28 import org.apache.tapestry.Tapestry; 29 30 37 38 public class LibrarySpecification extends LocatablePropertyHolder implements ILibrarySpecification 39 { 40 43 44 private Map _pages; 45 46 49 private Map _components; 50 51 54 55 private Map _libraries; 56 57 private String _description; 58 59 62 63 private Map _extensions; 64 65 68 69 private Map _instantiatedExtensions; 70 71 76 77 private String _publicId; 78 79 82 83 private Resource _specificationLocation; 84 85 public String getLibrarySpecificationPath(String id) 86 { 87 return (String ) get(_libraries, id); 88 } 89 90 96 97 public void setLibrarySpecificationPath(String id, String path) 98 { 99 if (_libraries == null) 100 _libraries = new HashMap (); 101 102 if (_libraries.containsKey(id)) 103 throw new IllegalArgumentException (Tapestry.format( 104 "LibrarySpecification.duplicate-child-namespace-id", 105 id)); 106 107 _libraries.put(id, path); 108 } 109 110 public List getLibraryIds() 111 { 112 return sortedKeys(_libraries); 113 } 114 115 public String getPageSpecificationPath(String name) 116 { 117 return (String ) get(_pages, name); 118 } 119 120 public void setPageSpecificationPath(String name, String path) 121 { 122 if (_pages == null) 123 _pages = new HashMap (); 124 125 if (_pages.containsKey(name)) 126 throw new IllegalArgumentException (Tapestry.format( 127 "LibrarySpecification.duplicate-page-name", 128 name)); 129 130 _pages.put(name, path); 131 } 132 133 public List getPageNames() 134 { 135 return sortedKeys(_pages); 136 } 137 138 public void setComponentSpecificationPath(String alias, String path) 139 { 140 if (_components == null) 141 _components = new HashMap (); 142 143 if (_components.containsKey(alias)) 144 throw new IllegalArgumentException (Tapestry.format( 145 "LibrarySpecification.duplicate-component-alias", 146 alias)); 147 148 _components.put(alias, path); 149 } 150 151 public String getComponentSpecificationPath(String alias) 152 { 153 return (String ) get(_components, alias); 154 } 155 156 159 160 public List getComponentTypes() 161 { 162 return sortedKeys(_components); 163 } 164 165 public String getServiceClassName(String name) 166 { 167 throw new UnsupportedOperationException (); 168 } 169 170 public List getServiceNames() 171 { 172 return Collections.EMPTY_LIST; 173 } 174 175 public void setServiceClassName(String name, String className) 176 { 177 throw new UnsupportedOperationException (); 178 } 179 180 private List sortedKeys(Map map) 181 { 182 if (map == null) 183 return Collections.EMPTY_LIST; 184 185 List result = new ArrayList (map.keySet()); 186 187 Collections.sort(result); 188 189 return result; 190 } 191 192 private Object get(Map map, Object key) 193 { 194 if (map == null) 195 return null; 196 197 return map.get(key); 198 } 199 200 203 204 public String getDescription() 205 { 206 return _description; 207 } 208 209 212 213 public void setDescription(String description) 214 { 215 _description = description; 216 } 217 218 223 224 public Map getExtensionSpecifications() 225 { 226 if (_extensions == null) 227 return null; 228 229 return Collections.unmodifiableMap(_extensions); 230 } 231 232 238 239 public void addExtensionSpecification(String name, IExtensionSpecification extension) 240 { 241 if (_extensions == null) 242 _extensions = new HashMap (); 243 244 if (_extensions.containsKey(name)) 245 throw new IllegalArgumentException (Tapestry.format( 246 "LibrarySpecification.duplicate-extension-name", 247 this, 248 name)); 249 250 _extensions.put(name, extension); 251 } 252 253 257 258 public synchronized List getExtensionNames() 259 { 260 return sortedKeys(_instantiatedExtensions); 261 } 262 263 266 267 public IExtensionSpecification getExtensionSpecification(String name) 268 { 269 if (_extensions == null) 270 return null; 271 272 return (IExtensionSpecification) _extensions.get(name); 273 } 274 275 278 279 public boolean checkExtension(String name) 280 { 281 if (_extensions == null) 282 return false; 283 284 return _extensions.containsKey(name); 285 } 286 287 293 294 public synchronized Object getExtension(String name) 295 { 296 return getExtension(name, null); 297 } 298 299 300 301 public synchronized Object getExtension(String name, Class typeConstraint) 302 { 303 if (_instantiatedExtensions == null) 304 _instantiatedExtensions = new HashMap (); 305 306 Object result = _instantiatedExtensions.get(name); 307 IExtensionSpecification spec = getExtensionSpecification(name); 308 309 if (spec == null) 310 throw new IllegalArgumentException (Tapestry.format( 311 "LibrarySpecification.no-such-extension", 312 name)); 313 314 if (result == null) 315 { 316 317 result = spec.instantiateExtension(); 318 319 _instantiatedExtensions.put(name, result); 320 } 321 322 if (typeConstraint != null) 323 applyTypeConstraint(name, result, typeConstraint, spec.getLocation()); 324 325 return result; 326 } 327 328 335 336 protected void applyTypeConstraint(String name, Object extension, Class typeConstraint, 337 Location location) 338 { 339 Class extensionClass = extension.getClass(); 340 341 344 if (typeConstraint.isAssignableFrom(extensionClass)) 345 return; 346 347 String key = typeConstraint.isInterface() ? "LibrarySpecification.extension-does-not-implement-interface" 348 : "LibrarySpecification.extension-not-a-subclass"; 349 350 throw new ApplicationRuntimeException(Tapestry.format( 351 key, 352 name, 353 extensionClass.getName(), 354 typeConstraint.getName()), location, null); 355 } 356 357 361 362 public synchronized void instantiateImmediateExtensions() 363 { 364 if (_extensions == null) 365 return; 366 367 Iterator i = _extensions.entrySet().iterator(); 368 369 while (i.hasNext()) 370 { 371 Map.Entry entry = (Map.Entry ) i.next(); 372 373 IExtensionSpecification spec = (IExtensionSpecification) entry.getValue(); 374 375 if (!spec.isImmediate()) 376 continue; 377 378 String name = (String ) entry.getKey(); 379 380 getExtension(name); 381 } 382 383 } 384 385 390 391 protected Map getExtensions() 392 { 393 return _extensions; 394 } 395 396 404 405 protected void setExtensions(Map extension) 406 { 407 _extensions = extension; 408 } 409 410 415 416 protected Map getLibraries() 417 { 418 return _libraries; 419 } 420 421 429 430 protected void setLibraries(Map libraries) 431 { 432 _libraries = libraries; 433 } 434 435 440 441 protected Map getPages() 442 { 443 return _pages; 444 } 445 446 454 455 protected void setPages(Map pages) 456 { 457 _pages = pages; 458 } 459 460 466 467 protected Map getServices() 468 { 469 return Collections.EMPTY_MAP; 470 } 471 472 482 483 protected void setServices(Map services) 484 { 485 } 486 487 492 493 protected Map getComponents() 494 { 495 return _components; 496 } 497 498 505 506 protected void setComponents(Map components) 507 { 508 _components = components; 509 } 510 511 517 518 public String getPublicId() 519 { 520 return _publicId; 521 } 522 523 public void setPublicId(String publicId) 524 { 525 _publicId = publicId; 526 } 527 528 529 530 public Resource getSpecificationLocation() 531 { 532 return _specificationLocation; 533 } 534 535 536 537 public void setSpecificationLocation(Resource specificationLocation) 538 { 539 _specificationLocation = specificationLocation; 540 } 541 542 543 544 public synchronized String toString() 545 { 546 ToStringBuilder builder = new ToStringBuilder(this); 547 548 builder.append("components", _components); 549 builder.append("description", _description); 550 builder.append("instantiatedExtensions", _instantiatedExtensions); 551 builder.append("libraries", _libraries); 552 builder.append("pages", _pages); 553 builder.append("publicId", _publicId); 554 builder.append("specificationLocation", _specificationLocation); 555 556 extendDescription(builder); 557 558 return builder.toString(); 559 } 560 561 567 568 protected void extendDescription(ToStringBuilder builder) 569 { 570 } 571 572 } | Popular Tags |