Changeset 1896 for trunk/autoquest-plugin-uml/src/main/java
- Timestamp:
- 03/05/15 17:19:36 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/autoquest-plugin-uml/src/main/java/de/ugoe/cs/autoquest/plugin/uml/UMLUtils.java
r1835 r1896 30 30 import org.eclipse.uml2.uml.ActivityEdge; 31 31 import org.eclipse.uml2.uml.ActivityNode; 32 import org.eclipse.uml2.uml.BehaviorExecutionSpecification; 32 33 import org.eclipse.uml2.uml.CallOperationAction; 33 34 import org.eclipse.uml2.uml.Comment; … … 45 46 import org.eclipse.uml2.uml.Model; 46 47 import org.eclipse.uml2.uml.Operation; 48 import org.eclipse.uml2.uml.Package; 47 49 import org.eclipse.uml2.uml.Port; 48 50 import org.eclipse.uml2.uml.Profile; … … 267 269 * @param interactionName 268 270 * name of the interaction 271 * @param testContextName 272 * Name of the test context that should be used. If this value is null, the first test context found is used. 269 273 */ 270 274 public static void createInteractionFromEventSequence(List<Event> sequence, 271 275 Model model, 272 String interactionName) 276 String interactionName, 277 String testContextName) 273 278 { 274 275 Component testContext = fetchTestContext(model);276 277 279 final Profile utpProfile = model.getAppliedProfile("utp"); 278 280 final Stereotype utpTestCase = (Stereotype) utpProfile.getOwnedMember("TestCase"); 279 281 final Stereotype utpTestComponent = (Stereotype) utpProfile.getOwnedMember("TestComponent"); 280 282 final Stereotype utpSUT = (Stereotype) utpProfile.getOwnedMember("SUT"); 283 final Stereotype utpTestContext = (Stereotype) utpProfile.getOwnedMember("TestContext"); 284 285 Component testContext = fetchTestContext(model, utpTestContext, testContextName); 286 if( testContext==null ) { 287 throw new RuntimeException("Could not find any test context in the model"); 288 } 281 289 282 290 Operation operation = testContext.createOwnedOperation(interactionName, null, null); … … 310 318 String serviceName = getServiceNameFromEvent(event); 311 319 String methodName = getCalledMethodFromEvent(event); 312 313 320 // determine lifelines 314 321 Lifeline msgTargetLifeline; … … 332 339 msgTargetLifeline = interaction.getLifeline(serviceName); 333 340 } 334 335 // determine target interface336 Interface targetInterface = getRealizedInterfaceFromProperty((Property) msgTargetLifeline.getRepresents());337 341 338 // create message 339 MessageOccurrenceSpecification sendFragment = 340 (MessageOccurrenceSpecification) interaction 341 .createFragment(i + ":" + methodName + "_sendFragment", 342 UMLPackage.Literals.MESSAGE_OCCURRENCE_SPECIFICATION); 343 MessageOccurrenceSpecification recvFragment = 344 (MessageOccurrenceSpecification) interaction 345 .createFragment(i + ":" + methodName + "_recvFragment", 346 UMLPackage.Literals.MESSAGE_OCCURRENCE_SPECIFICATION); 347 348 sendFragment.setCovered(msgSourceLifeline); 349 recvFragment.setCovered(msgTargetLifeline); 350 351 Message message = interaction.createMessage(methodName); 352 if (getOperationFromName(targetInterface.getOperations(), methodName) == null) { 353 System.out.println("operation not found in the " + targetInterface.getName() + " interface: " + methodName); 354 } 355 message.setSignature(getOperationFromName(targetInterface.getOperations(), 356 methodName)); 357 message.setMessageSort(MessageSort.ASYNCH_CALL_LITERAL); 358 message.setSendEvent(sendFragment); 359 message.setReceiveEvent(recvFragment); 360 361 // now the connector needs to be determined 362 EList<Property> userAttributes = ((Component) msgSourceLifeline.getRepresents().getType()).getAttributes(); 363 EList<Property> targetAttributes = ((Component) msgTargetLifeline.getRepresents().getType()).getAttributes(); 342 // TODO null checks for lifelines 343 344 // determine target interface and be able to deal with multiple interfaces 345 List<Interface> targetInterfaces = getRealizedInterfacesFromProperty((Property) msgTargetLifeline.getRepresents()); 346 if( targetInterfaces.isEmpty() ) { 347 throw new RuntimeException("no interface associated with the property " + msgTargetLifeline.getRepresents().getName()); 348 } 349 Interface targetInterface = null; 350 for( Interface intface : targetInterfaces ) { 351 System.out.println(intface.getOperations()); 352 if (getOperationFromName(intface.getOperations(), methodName) != null) { 353 // interface found 354 targetInterface = intface; 355 break; 356 } 357 } 358 if( targetInterface == null ) { 359 StringBuilder errStrBuilder = new StringBuilder(); 360 errStrBuilder.append("operation not found in the implementing interfaces ("); 361 Iterator<Interface> iter = targetInterfaces.iterator(); 362 while( iter.hasNext() ) { 363 String interfaceName = iter.next().getName(); 364 errStrBuilder.append(interfaceName); 365 if( iter.hasNext() ) { 366 errStrBuilder.append(","); 367 } else { 368 errStrBuilder.append("): " + methodName); 369 } 370 } 371 throw new RuntimeException(errStrBuilder.toString()); 372 } 364 373 365 for( Property userAttribute : userAttributes ) { 366 if( userAttribute instanceof Port ) { 367 EList<ConnectorEnd> userEnds = ((Port) userAttribute).getEnds(); 368 for( ConnectorEnd userEnd : userEnds ) { 369 Connector userConnector = (Connector) userEnd.eContainer(); 370 for( Property targetAttribute : targetAttributes ) { 371 if( targetAttribute instanceof Port ) { 372 EList<ConnectorEnd> targetEnds = ((Port) targetAttribute).getEnds(); 373 for( ConnectorEnd targetEnd : targetEnds ) { 374 Connector targetConnector = (Connector) targetEnd.eContainer(); 375 if( targetConnector==userConnector ) { 376 message.setConnector(targetConnector); 374 // create message ASYNCH 375 boolean asynch = false; 376 if( asynch ) { 377 MessageOccurrenceSpecification sendFragment = 378 (MessageOccurrenceSpecification) interaction 379 .createFragment(i + ":" + methodName + "_sendFragment", 380 UMLPackage.Literals.MESSAGE_OCCURRENCE_SPECIFICATION); 381 MessageOccurrenceSpecification recvFragment = 382 (MessageOccurrenceSpecification) interaction 383 .createFragment(i + ":" + methodName + "_recvFragment", 384 UMLPackage.Literals.MESSAGE_OCCURRENCE_SPECIFICATION); 385 386 sendFragment.setCovered(msgSourceLifeline); 387 recvFragment.setCovered(msgTargetLifeline); 388 389 Message message = interaction.createMessage(methodName); 390 if (getOperationFromName(targetInterface.getOperations(), methodName) == null) { 391 System.out.println("operation not found in the " + targetInterface.getName() + " interface: " + methodName); 392 } 393 message.setSignature(getOperationFromName(targetInterface.getOperations(), 394 methodName)); 395 message.setMessageSort(MessageSort.ASYNCH_CALL_LITERAL); 396 message.setSendEvent(sendFragment); 397 message.setReceiveEvent(recvFragment); 398 399 // now the connector needs to be determined 400 EList<Property> userAttributes = ((Component) msgSourceLifeline.getRepresents().getType()).getAttributes(); 401 EList<Property> targetAttributes = ((Component) msgTargetLifeline.getRepresents().getType()).getAttributes(); 402 403 for( Property userAttribute : userAttributes ) { 404 if( userAttribute instanceof Port ) { 405 EList<ConnectorEnd> userEnds = ((Port) userAttribute).getEnds(); 406 for( ConnectorEnd userEnd : userEnds ) { 407 Connector userConnector = (Connector) userEnd.eContainer(); 408 for( Property targetAttribute : targetAttributes ) { 409 if( targetAttribute instanceof Port ) { 410 EList<ConnectorEnd> targetEnds = ((Port) targetAttribute).getEnds(); 411 for( ConnectorEnd targetEnd : targetEnds ) { 412 Connector targetConnector = (Connector) targetEnd.eContainer(); 413 if( targetConnector==userConnector ) { 414 message.setConnector(targetConnector); 415 } 377 416 } 378 417 } … … 381 420 } 382 421 } 422 sendFragment.setMessage(message); 423 recvFragment.setMessage(message); 424 } else { 425 // SYNCH call 426 MessageOccurrenceSpecification callSendFragment = 427 (MessageOccurrenceSpecification) interaction 428 .createFragment(i + ":" + methodName + "_callSendFragment", 429 UMLPackage.Literals.MESSAGE_OCCURRENCE_SPECIFICATION); 430 MessageOccurrenceSpecification callRecvFragment = 431 (MessageOccurrenceSpecification) interaction 432 .createFragment(i + ":" + methodName + "_callRecvFragment", 433 UMLPackage.Literals.MESSAGE_OCCURRENCE_SPECIFICATION); 434 435 MessageOccurrenceSpecification replySendFragment = 436 (MessageOccurrenceSpecification) interaction 437 .createFragment(i + ":" + methodName + "_replySendFragment", 438 UMLPackage.Literals.MESSAGE_OCCURRENCE_SPECIFICATION); 439 MessageOccurrenceSpecification replyRecvFragment = 440 (MessageOccurrenceSpecification) interaction 441 .createFragment(i + ":" + methodName + "_replyRecvFragment", 442 UMLPackage.Literals.MESSAGE_OCCURRENCE_SPECIFICATION); 443 444 BehaviorExecutionSpecification sourceBehaviorExecutionSpecification = 445 (BehaviorExecutionSpecification) interaction 446 .createFragment(":" + methodName + "_sourceBhvExecSpec", 447 UMLPackage.Literals.BEHAVIOR_EXECUTION_SPECIFICATION); 448 BehaviorExecutionSpecification targetBehaviorExecutionSpecification = 449 (BehaviorExecutionSpecification) interaction 450 .createFragment(":" + methodName + "_targetBhvExecSpec", 451 UMLPackage.Literals.BEHAVIOR_EXECUTION_SPECIFICATION); 452 453 454 callSendFragment.setCovered(msgSourceLifeline); 455 callRecvFragment.setCovered(msgTargetLifeline); 456 replySendFragment.setCovered(msgTargetLifeline); 457 replyRecvFragment.setCovered(msgSourceLifeline); 458 459 sourceBehaviorExecutionSpecification.setStart(callSendFragment); 460 sourceBehaviorExecutionSpecification.setFinish(replyRecvFragment); 461 targetBehaviorExecutionSpecification.setStart(callRecvFragment); 462 targetBehaviorExecutionSpecification.setFinish(replySendFragment); 463 464 Operation calledOperation = getOperationFromName(targetInterface.getOperations(), methodName); 465 466 // create call 467 Message callMessage = interaction.createMessage(methodName); 468 callMessage.setSignature(calledOperation); 469 callMessage.setMessageSort(MessageSort.SYNCH_CALL_LITERAL); 470 callMessage.setSendEvent(callSendFragment); 471 callMessage.setReceiveEvent(callRecvFragment); 472 callSendFragment.setMessage(callMessage); 473 callRecvFragment.setMessage(callMessage); 474 475 // now the connector needs to be determined 476 EList<Property> userAttributes = ((Component) msgSourceLifeline.getRepresents().getType()).getAttributes(); 477 EList<Property> targetAttributes = ((Component) msgTargetLifeline.getRepresents().getType()).getAttributes(); 478 479 for( Property userAttribute : userAttributes ) { 480 if( userAttribute instanceof Port ) { 481 EList<ConnectorEnd> userEnds = ((Port) userAttribute).getEnds(); 482 for( ConnectorEnd userEnd : userEnds ) { 483 Connector userConnector = (Connector) userEnd.eContainer(); 484 for( Property targetAttribute : targetAttributes ) { 485 if( targetAttribute instanceof Port ) { 486 EList<ConnectorEnd> targetEnds = ((Port) targetAttribute).getEnds(); 487 for( ConnectorEnd targetEnd : targetEnds ) { 488 Connector targetConnector = (Connector) targetEnd.eContainer(); 489 if( targetConnector==userConnector ) { 490 callMessage.setConnector(targetConnector); 491 } 492 } 493 } 494 } 495 } 496 } 497 } 498 499 // create reply 500 Message replyMessage = interaction.createMessage(methodName + "_reply"); 501 replyMessage.setMessageSort(MessageSort.REPLY_LITERAL); 502 replyMessage.setSignature(calledOperation); 503 replyMessage.setSendEvent(replySendFragment); 504 replyMessage.setReceiveEvent(replyRecvFragment); 505 replySendFragment.setMessage(replyMessage); 506 replyRecvFragment.setMessage(replyMessage); 383 507 } 384 508 385 sendFragment.setMessage(message);386 recvFragment.setMessage(message);387 509 388 510 i++; … … 441 563 * model to be extended 442 564 * @param usageProfile 443 * usage profile used as foundation 444 */ 445 public static void createScheduling(Model model, IStochasticProcess usageProfile ) {565 * usage profile used as foundation 566 */ 567 public static void createScheduling(Model model, IStochasticProcess usageProfile, String testContextName) { 446 568 447 569 final Profile utpProfile = model.getAppliedProfile("utp"); 448 570 final Stereotype utpTestCase = (Stereotype) utpProfile.getOwnedMember("TestCase"); 449 450 Component testContext = fetchTestContext(model); 571 final Stereotype utpTestContext = (Stereotype) utpProfile.getOwnedMember("TestContext"); 572 573 Component testContext = fetchTestContext(model, utpTestContext, testContextName); 574 if( testContext==null ) { 575 throw new RuntimeException("Could not find any test context in the model"); 576 } 451 577 452 578 Map<Operation, Double> usageScoreMapUnsorted = new HashMap<>(); … … 618 744 } 619 745 620 private static Interface getRealizedInterfaceFromProperty(Property property) {746 private static List<Interface> getRealizedInterfacesFromProperty(Property property) { 621 747 return getRealizedInterfaceFromComponent((Component) property.getType()); 622 748 } 623 749 624 private static Interface getRealizedInterfaceFromComponent(Component comp) { 625 Interface myInterface = null; 750 private static List<Interface> getRealizedInterfaceFromComponent(Component comp) { 751 List<Interface> interfaces = new LinkedList<>(); 752 //Interface myInterface = null; 626 753 for( Property property : comp.getAttributes() ) { 627 754 if( property instanceof Port ) { 628 755 Port port = (Port) property; 629 756 if( !port.isConjugated() ) { 757 interfaces.addAll(port.getProvideds()); 758 /* 630 759 if( myInterface==null ) { 631 760 myInterface = port.getProvideds().get(0); … … 634 763 System.err.println("multiple different interfaces found"); 635 764 } 636 } 637 } 638 } 639 return myInterface; 765 */ 766 } 767 } 768 } 769 return interfaces; 770 //return myInterface; 640 771 //return ((Port) comp.getAttributes().get(0)).getInterface(); 641 772 //Realization realization = (Realization) comp.getNestedClassifiers().get(0).getRelationships(UMLPackage.Literals.REALIZATION).get(0); … … 643 774 } 644 775 645 private static Component fetchTestContext(Model model) { 646 final Profile utpProfile = model.getAppliedProfile("utp"); 647 final Stereotype utpTestContext = (Stereotype) utpProfile.getOwnedMember("TestContext"); 648 649 for( Element element : model.getOwnedElements() ) { 650 if( element instanceof Component && element.getApplicableStereotypes().contains(utpTestContext) ) { 651 return (Component) element; 652 } 653 } 654 return null; 776 private static Component fetchTestContext(Package pkg, Stereotype utpTestContext, String testContextName) { 777 List<Component> testContexts = fetchTestContextRecursively(pkg, utpTestContext); 778 if( testContexts.isEmpty() ) { 779 return null; 780 } 781 if( testContextName!=null ) { 782 for( Component testContext : testContexts ) { 783 if( testContextName.equals(testContext.getName()) ) { 784 return testContext; 785 } 786 } 787 return null; 788 } else { 789 return testContexts.get(0); 790 } 791 } 792 793 private static List<Component> fetchTestContextRecursively(Package pkg, Stereotype utpTestContext) { 794 List<Component> testContexts = new LinkedList<>(); 795 for( Element element : pkg.getOwnedElements() ) { 796 if( element instanceof Package ) { 797 testContexts.addAll(fetchTestContextRecursively((Package) element, utpTestContext)); 798 } 799 if( element instanceof Component && element.getAppliedStereotypes().contains(utpTestContext) ) { 800 testContexts.add((Component) element); 801 } 802 } 803 return testContexts; 655 804 } 656 805 }
Note: See TracChangeset
for help on using the changeset viewer.