1 package net.sf.invicta.type; 2 3 import java.util.ArrayList ; 4 import java.util.HashMap ; 5 import java.util.Iterator ; 6 import java.util.List ; 7 import java.util.Map ; 8 import java.util.StringTokenizer ; 9 10 import net.sf.invicta.InvictaConstants; 11 import net.sf.invicta.api.Target; 12 13 import org.apache.commons.collections.SequencedHashMap; 14 15 18 public class TypeDefinition { 19 private boolean isResolved; 20 private String name; 21 private String initTarget; 22 private String buildTarget; 23 private String cleanTarget; 24 private String distTarget; 25 private String template; 26 private Map targetTemplates = new SequencedHashMap(); 27 private List extendsList = new ArrayList (); 28 private List removeTargets = new ArrayList (); 29 private Map definedProperties = new SequencedHashMap(); 30 private String actualGeneralTemplate; 31 private Map actualTargetTemplates = new SequencedHashMap(); 32 private Map actualDefinedProperties = new SequencedHashMap(); 33 34 38 public String getCleanTarget() { 39 return cleanTarget; 40 } 41 42 46 public String getBuildTarget() { 47 return buildTarget; 48 } 49 50 55 public String getName() { 56 return name; 57 } 58 59 63 public void setCleanTarget(String cleanTarget) { 64 this.cleanTarget = cleanTarget; 65 } 66 67 71 public void setBuildTarget(String buildTarget) { 72 this.buildTarget = buildTarget; 73 } 74 75 79 public void setName(String name) { 80 this.name = name; 81 } 82 83 87 public String getGeneralTemplate() { 88 return this.actualGeneralTemplate; 89 } 90 91 92 96 public String getTemplate() { 97 return this.actualGeneralTemplate; 98 } 99 100 104 public void setTemplate(String template) { 105 this.template = template; 106 } 107 108 111 public void addDefineProperty(BasicDefinedProperty property) throws Exception { 112 if (this.definedProperties.containsKey(property.getName())) 113 throw InvictaTypeException.conflictingDefinedProperties(this.name, property.getName()); 114 property.checkRequiredAttributes(); 115 this.definedProperties.put(property.getName(), property); 116 } 117 118 121 public void addTargetTemplate(TargetTemplate targetTemplate) throws InvictaTypeException { 122 if (this.targetTemplates.containsKey(targetTemplate.getName())) 123 throw InvictaTypeException.duplicateTargetTemplate(this.name, targetTemplate.getName()); 124 this.targetTemplates.put(targetTemplate.getName(), targetTemplate); 125 } 126 127 130 public Map getTargetTemplates() { 131 return this.actualTargetTemplates; 132 } 133 134 137 public Map getDefinedProperties() { 138 return this.actualDefinedProperties; 139 } 140 141 145 public String getDistTarget() { 146 return distTarget; 147 } 148 149 153 public void setDistTarget(String distTarget) { 154 this.distTarget = distTarget; 155 } 156 157 160 public BasicDefinedProperty getDefinedProperty(String propertyName) { 161 return (BasicDefinedProperty)this.actualDefinedProperties.get(propertyName); 162 } 163 164 168 public String getExtends() { 169 return null; 170 } 171 172 176 public String getRemoveTargets() { 177 return null; 178 } 179 180 184 public void setExtends(String extendsListStr) { 185 StringTokenizer st = new StringTokenizer (extendsListStr, InvictaConstants.LIST_DELIMITER); 186 while (st.hasMoreTokens()) 187 this.extendsList.add(st.nextToken().trim()); 188 } 189 190 194 public void setRemoveTargets(String removeTargetsStr) { 195 196 StringTokenizer st = new StringTokenizer (removeTargetsStr, InvictaConstants.LIST_DELIMITER); 197 while (st.hasMoreTokens()) 198 this.removeTargets.add(st.nextToken().trim()); 199 200 } 201 202 205 public void resolve(TypeManager typeManager, int level) throws InvictaTypeException { 206 if (isResolved) 207 return; 208 209 resolveWithExtendsTypes(typeManager, level); 210 211 this.isResolved = true; 212 } 213 214 219 public String getAntTemplateString() { 220 String fullTemplateString = ""; 221 for (Iterator targetIter = this.actualTargetTemplates.values().iterator(); targetIter.hasNext();) { 222 TargetTemplate targetTemplate = (TargetTemplate) targetIter.next(); 223 fullTemplateString += targetTemplate.getAntTemplateString() + "\n"; 224 } 225 if (this.actualGeneralTemplate != null) 226 fullTemplateString += this.actualGeneralTemplate + "\n"; 227 228 return fullTemplateString; 229 } 230 231 234 public boolean containsTarget(String targetName) { 235 return this.actualTargetTemplates.containsKey(targetName); 236 } 237 238 242 public Map getTargetMap() { 243 return new HashMap (this.actualTargetTemplates); 244 } 245 246 250 public List getTargetList() { 251 return (List )new ArrayList (this.actualTargetTemplates.values()); 252 } 253 254 259 public Target getTarget(String targetName) { 260 return (Target)this.actualTargetTemplates.get(targetName); 261 } 262 263 266 public String getInitTarget() { 267 return initTarget; 268 } 269 270 273 public void setInitTarget(String string) { 274 initTarget = string; 275 } 276 277 281 protected void resolveWithExtendsTypes(TypeManager typeManager, int level) throws InvictaTypeException { 282 283 List parentTypes = new ArrayList (); 285 List parentDefinedProperties = new ArrayList (); 286 List parentTargetTemplates = new ArrayList (); 287 for (Iterator extendsIter = this.extendsList.iterator(); extendsIter.hasNext();) { 288 289 String oneTypeName = (String ) extendsIter.next(); 290 TypeDefinition oneType = typeManager.getTypeDefinition(oneTypeName, level + 1); 291 parentTypes.add(oneType); 292 parentDefinedProperties.add(new SequencedHashMap(oneType.getDefinedProperties())); 293 parentTargetTemplates.add(new SequencedHashMap(oneType.getTargetTemplates())); 294 } 295 296 removeTargetsFromParents(parentTargetTemplates); 298 299 resolveActualDefinedProperties(parentDefinedProperties); 301 302 resolveActualTargetTemplates(parentTargetTemplates); 304 305 resolveTargetsDependList(); 307 308 mergeTemplateStrings(parentTypes); 309 } 310 311 312 318 protected void mergeTemplateStrings(List extendTypes) { 319 this.actualGeneralTemplate = ""; 320 for (Iterator parentIter = extendTypes.iterator(); parentIter.hasNext();) { 321 322 TypeDefinition parentType = (TypeDefinition) parentIter.next(); 323 if (parentType.getGeneralTemplate() != null) 324 this.actualGeneralTemplate += parentType.getGeneralTemplate() + "\n"; 325 } 326 if (this.template != null) 327 this.actualGeneralTemplate += this.template; 328 } 329 330 334 protected void resolveActualDefinedProperties(List extendsDefinedProperties) throws InvictaTypeException { 335 336 for (Iterator propIter = this.definedProperties.values().iterator(); propIter.hasNext();) { 338 339 BasicDefinedProperty oneProp = (BasicDefinedProperty)propIter.next(); 340 341 for (Iterator extendsIter = extendsDefinedProperties.iterator(); 343 extendsIter.hasNext();) { 344 Map propsMap = (Map ) extendsIter.next(); 345 346 propsMap.remove(oneProp.getName()); 347 } 348 } 349 350 for (Iterator extendsIter = extendsDefinedProperties.iterator(); 354 extendsIter.hasNext();) { 355 Map propsMap = (Map ) extendsIter.next(); 356 357 for (Iterator propIter = propsMap.entrySet().iterator(); 358 propIter.hasNext();) { 359 Map.Entry entry = (Map.Entry ) propIter.next(); 360 BasicDefinedProperty oneProp = (BasicDefinedProperty)entry.getValue(); 361 362 if (this.actualDefinedProperties.containsKey(oneProp.getName()) && 364 !((BasicDefinedProperty)this.actualDefinedProperties.get(oneProp.getName())).equals(oneProp)) 365 throw InvictaTypeException.conflictingDefinedProperties(this.name, oneProp.getName()); 366 367 if (!this.actualDefinedProperties.containsKey(oneProp.getName())) 369 this.actualDefinedProperties.put(oneProp.getName(), oneProp); 370 } 371 } 372 373 for (Iterator propIter = this.definedProperties.values().iterator(); propIter.hasNext();) { 375 376 BasicDefinedProperty oneProp = (BasicDefinedProperty)propIter.next(); 377 this.actualDefinedProperties.put(oneProp.getName(),oneProp); 378 } 379 } 380 381 391 protected void resolveActualTargetTemplates(List parentTargetTemplates) throws InvictaTypeException { 392 393 395 for (Iterator templateIter = this.targetTemplates.values().iterator(); 399 templateIter.hasNext();) { 400 401 TargetTemplate targetTemplate = (TargetTemplate) templateIter.next(); 402 this.actualTargetTemplates.put(targetTemplate.getName(), targetTemplate); 403 404 if (targetTemplate.getMode().equals(TargetTemplate.MODE_REPLACE)) { 406 for (Iterator extendsIter = parentTargetTemplates.iterator(); 408 extendsIter.hasNext();) 409 ((Map ) extendsIter.next()).remove(targetTemplate.getName()); 410 411 } else if (targetTemplate.getMode().equals(TargetTemplate.MODE_RENAME)) { 413 414 renameTargetTemplates(parentTargetTemplates, targetTemplate); 415 416 } else { 418 addToTargetTemplate(parentTargetTemplates, targetTemplate); 419 } 420 } 421 422 423 for (Iterator extendsIter = parentTargetTemplates.iterator(); 427 extendsIter.hasNext();) { 428 Map templatesMap = (Map ) extendsIter.next(); 429 430 copyActualTargetTemplates(templatesMap); 431 } 432 } 433 434 439 protected void copyActualTargetTemplates(Map templatesMap) 440 throws InvictaTypeException { 441 for (Iterator propIter = templatesMap.values().iterator(); 442 propIter.hasNext();) { 443 TargetTemplate targetTemplate = (TargetTemplate)propIter.next(); 444 445 if (this.actualTargetTemplates.containsKey(targetTemplate.getName()) && 447 !((TargetTemplate)this.actualTargetTemplates.get(targetTemplate.getName())).equals(targetTemplate, true)) 448 throw InvictaTypeException.conflictingTargetTemplates(this.name, targetTemplate.getName()); 449 450 if (!this.actualTargetTemplates.containsKey(targetTemplate.getName())) 452 this.actualTargetTemplates.put(targetTemplate.getName(), targetTemplate); 453 } 454 } 455 456 462 protected void addToTargetTemplate( 463 List parentTargetTemplates, 464 TargetTemplate targetTemplate) 465 throws InvictaTypeException { 466 467 TargetTemplate extendTargetTemplate = null; 468 for (Iterator extendsIter = parentTargetTemplates.iterator(); 469 extendsIter.hasNext();) { 470 Map templatesMap = (Map )extendsIter.next(); 471 if (templatesMap.containsKey(targetTemplate.getName())) { 472 473 TargetTemplate oneExtendsTarget = (TargetTemplate)templatesMap.get(targetTemplate.getName()); 474 475 if ((targetTemplate.getMode().equals(TargetTemplate.MODE_ADD_AFTER) || 477 targetTemplate.getMode().equals(TargetTemplate.MODE_ADD_BEFORE)) && 478 (extendTargetTemplate != null) && 479 !((TargetTemplate)extendTargetTemplate).equals(oneExtendsTarget, false)) 480 throw InvictaTypeException.conflictingTargetTemplates(this.name, targetTemplate.getName()); 481 482 extendTargetTemplate = oneExtendsTarget; 483 484 if (targetTemplate.getMode().equals(TargetTemplate.MODE_ADD_AFTER) || 486 targetTemplate.getMode().equals(TargetTemplate.MODE_ADD_AFTER_ALL)) 487 targetTemplate.setTemplateString 488 (extendTargetTemplate.getTemplateString() + "\n" + targetTemplate.getTemplateString()); 489 else 490 targetTemplate.setTemplateString 491 (targetTemplate.getTemplateString() + "\n" + extendTargetTemplate.getTemplateString()); 492 493 templatesMap.remove(extendTargetTemplate.getName()); 494 } 495 } 496 497 if (extendTargetTemplate == null) 499 throw InvictaTypeException.parentTargetUndefined(this.name, targetTemplate.getName()); 500 } 501 502 507 protected void renameTargetTemplates( 508 List parentTargetTemplates, 509 TargetTemplate targetTemplate) { 510 511 Iterator typeIter = this.extendsList.iterator(); 512 for (Iterator parentTemplateIter = parentTargetTemplates.iterator(); 514 parentTemplateIter.hasNext();) { 515 516 String typeName = (String )typeIter.next(); 517 Map templatesMap = (Map )parentTemplateIter.next(); 518 519 TargetTemplate oneTemplate = 520 (TargetTemplate)templatesMap.remove(targetTemplate.getName()); 521 522 if (oneTemplate != null) { 525 String newName = typeName + InvictaConstants.TARGET_DELIMITER + targetTemplate.getName(); 526 oneTemplate = new TargetTemplate(oneTemplate); 527 oneTemplate.setName(newName); 528 templatesMap.put(oneTemplate.getName(), oneTemplate); 529 } 530 } 531 } 532 533 540 protected void resolveTargetsDependList() throws InvictaTypeException { 541 542 for (Iterator templateIter = this.targetTemplates.values().iterator(); 544 templateIter.hasNext();) { 545 TargetTemplate targetTemplate = (TargetTemplate) templateIter.next(); 546 547 for (Iterator dependIter = targetTemplate.getDependsList().iterator(); 549 dependIter.hasNext();) { 550 String oneDepend = (String ) dependIter.next(); 551 552 if (!targetTemplate.isAbsoluteDepend(oneDepend)) 555 if (!this.actualTargetTemplates.containsKey(oneDepend)) 556 throw InvictaTypeException.targetUndefined(this.name, oneDepend); 557 } 558 } 559 } 560 561 565 private void removeTargetsFromParents(List extendsTargetTemplates) throws InvictaTypeException { 566 567 for (Iterator removeIter = this.removeTargets.iterator(); 569 removeIter.hasNext();) { 570 String removeTargetStr = (String ) removeIter.next(); 571 int dotIndex = removeTargetStr.indexOf(InvictaConstants.TARGET_DELIMITER); 572 if (dotIndex == -1) 573 throw InvictaTypeException.parentTargetUndefined(this.name, removeTargetStr); 574 String removeTypeName = removeTargetStr.substring(0, dotIndex); 575 String removeTargetName = removeTargetStr.substring(dotIndex + 1); 576 577 boolean isFound = false; 578 Iterator typeIter = this.extendsList.iterator(); 580 for (Iterator extendsIter = extendsTargetTemplates.iterator(); 581 extendsIter.hasNext();) { 582 String typeName = (String )typeIter.next(); 583 Map templatesMap = (Map )extendsIter.next(); 584 if (typeName.equalsIgnoreCase(removeTypeName)) { 585 if (!templatesMap.containsKey(removeTargetName)) 586 throw InvictaTypeException.parentTargetUndefined(this.name, removeTargetStr); 587 templatesMap.remove(removeTargetName); 588 isFound = true; 589 break; 590 } 591 } 592 593 if (!isFound) 595 throw InvictaTypeException.parentTargetUndefined(this.name, removeTargetStr); 596 } 597 598 } 599 600 601 } 602 | Popular Tags |