Ignore:
Timestamp:
09/25/14 15:41:50 (10 years ago)
Author:
sherbold
Message:
  • updated test to newer DSL model version
  • added createScheduling functionality to UMLUtils
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/autoquest-plugin-uml/src/main/java/de/ugoe/cs/autoquest/plugin/uml/UMLUtils.java

    r1761 r1763  
    1616 
    1717import java.util.Collection; 
     18import java.util.Collections; 
     19import java.util.Comparator; 
    1820import java.util.HashMap; 
    1921import java.util.Iterator; 
     22import java.util.LinkedHashMap; 
    2023import java.util.LinkedList; 
    2124import java.util.List; 
     
    2427 
    2528import org.eclipse.emf.common.util.EList; 
     29import org.eclipse.uml2.uml.Activity; 
     30import org.eclipse.uml2.uml.ActivityEdge; 
     31import org.eclipse.uml2.uml.ActivityNode; 
     32import org.eclipse.uml2.uml.CallOperationAction; 
    2633import org.eclipse.uml2.uml.Comment; 
    2734import org.eclipse.uml2.uml.Component; 
    2835import org.eclipse.uml2.uml.Connector; 
    2936import org.eclipse.uml2.uml.ConnectorEnd; 
    30 import org.eclipse.uml2.uml.Element; 
    3137import org.eclipse.uml2.uml.Interaction; 
    3238import org.eclipse.uml2.uml.InteractionFragment; 
     
    4147import org.eclipse.uml2.uml.Profile; 
    4248import org.eclipse.uml2.uml.Property; 
     49import org.eclipse.uml2.uml.Realization; 
    4350import org.eclipse.uml2.uml.Region; 
    4451import org.eclipse.uml2.uml.StateMachine; 
     
    5259import de.ugoe.cs.autoquest.plugin.http.eventcore.SimpleSOAPEventType; 
    5360import de.ugoe.cs.autoquest.plugin.uml.eventcore.UMLTransitionType; 
    54 import de.ugoe.cs.autoquest.usageprofiles.TrieBasedModel; 
     61import de.ugoe.cs.autoquest.usageprofiles.IStochasticProcess; 
    5562 
    5663/** 
     
    265272                                                          String interactionName) 
    266273    { 
    267         Map<String, Interface> interfaceMap = new HashMap<>(); 
    268274        Map<String, Port> portMap = new HashMap<>(); 
    269  
    270         EList<Element> elements = model.getOwnedElements(); 
    271         for (Element element : elements) { 
    272             if (element instanceof Interface) { 
    273                 interfaceMap.put(((Interface) element).getName(), (Interface) element); 
    274             } 
    275         } 
    276275 
    277276        Component testContext = 
     
    281280        final Profile utpProfile = model.getAppliedProfile("utp"); 
    282281        final Stereotype utpTestCase = (Stereotype) utpProfile.getOwnedMember("TestCase"); 
     282        final Stereotype utpTestComponent = (Stereotype) utpProfile.getOwnedMember("TestComponent"); 
     283        final Stereotype utpSUT = (Stereotype) utpProfile.getOwnedMember("SUT"); 
     284         
    283285        Operation operation = testContext.createOwnedOperation(interactionName, null, null); 
    284286        operation.applyStereotype(utpTestCase); 
     
    287289            (Interaction) testContext.createPackagedElement(interactionName + "_Impl", 
    288290                                                            UMLPackage.Literals.INTERACTION); 
     291        operation.getMethods().add(interaction); 
    289292         
    290         operation.getMethods().add(interaction); 
    291  
    292         Lifeline userLifeline = interaction.createLifeline("user"); 
    293  
    294         userLifeline.setRepresents(testContext.getAttribute("user", null)); 
    295  
    296         Component userComponent = 
    297             (Component) model.getPackagedElement("User", true, UMLPackage.Literals.COMPONENT, true); 
    298          
    299         EList<Property> userAttributes = userComponent.getAttributes(); 
     293        // create lifelines 
     294        Lifeline userLifeline = null; 
    300295        List<Port> userPorts = new LinkedList<>(); 
    301         for( Property userAttribute : userAttributes ) { 
    302             if( userAttribute instanceof Port ) { 
    303                 userPorts.add((Port) userAttribute); 
    304             } 
     296        for (Property property : testContext.getAllAttributes()) { 
     297            if (property.getAppliedStereotypes().contains(utpSUT)) { 
     298                String serviceName = getRealizedInterfaceFromProperty(property).getName(); 
     299                 
     300                Lifeline targetLifeline = interaction.createLifeline(serviceName); 
     301                targetLifeline.setRepresents(property); 
     302                portMap.put(serviceName, 
     303                            (Port) ((Component) property.getType()).getAttribute("p_" + serviceName, null)); 
     304            } 
     305            else if (property.getType().getAppliedStereotypes().contains(utpTestComponent)) { 
     306                userLifeline = interaction.createLifeline(property.getName()); 
     307                userLifeline.setRepresents(property); 
     308                EList<Property> userAttributes = ((Component) property.getType()).getAttributes(); 
     309                for (Property userAttribute : userAttributes) { 
     310                    if (userAttribute instanceof Port) { 
     311                        userPorts.add((Port) userAttribute); 
     312                    } 
     313                } 
     314            }  
    305315        } 
    306316 
     
    311321                String methodName = getCalledMethodFromEvent(event); 
    312322 
    313                 Interface targetInterface = interfaceMap.get(serviceName); 
    314                 if (targetInterface == null) { 
    315                     throw new RuntimeException( 
    316                                                "Could not find interface in the UML model that belong to the service: " + 
    317                                                    serviceName); 
    318                 } 
    319  
    320323                Lifeline targetLifeline = interaction.getLifeline(serviceName); 
    321                 if (targetLifeline == null) { 
    322                     targetLifeline = interaction.createLifeline(serviceName); 
    323  
    324                     targetLifeline.setRepresents(testContext 
    325                         .getAttribute(serviceName + "_property", null)); 
    326  
    327                     Component component = 
    328                         (Component) model.getPackagedElement(serviceName, true, 
    329                                                              UMLPackage.Literals.COMPONENT, true); 
    330                     portMap.put(serviceName, 
    331                                 (Port) component.getAttribute("p_" + serviceName, null)); 
    332                 } 
     324                Interface targetInterface = getRealizedInterfaceFromProperty((Property) targetLifeline.getRepresents()); 
     325 
    333326                MessageOccurrenceSpecification sendFragment = 
    334327                    (MessageOccurrenceSpecification) interaction 
     
    352345                message.setSendEvent(sendFragment); 
    353346                message.setReceiveEvent(recvFragment); 
    354                  
     347 
    355348                EList<ConnectorEnd> targetEnds = portMap.get(serviceName).getEnds(); 
    356349 
    357                 for( Port userPort : userPorts ) { 
     350                for (Port userPort : userPorts) { 
    358351                    EList<ConnectorEnd> sourceEnds = userPort.getEnds(); 
    359352                    for (ConnectorEnd sourceEnd : sourceEnds) { 
     
    388381     * @return calculated usage score 
    389382     */ 
    390     public static double calculateUsageScore(Interaction interaction, TrieBasedModel usageProfile) { 
     383    public static double calculateUsageScore(Interaction interaction, 
     384                                             IStochasticProcess usageProfile) 
     385    { 
    391386        double usageScore = 0.0d; 
    392387 
     
    399394            { 
    400395                String serviceName = 
    401                     interactionFragment.getCovereds().get(0).getRepresents().getName(); 
     396                    interactionFragment.getCovereds().get(0).getRepresents().getName().split("_")[0]; 
    402397                String methodName = "UNKNOWN"; 
    403398                if (interactionFragment instanceof MessageOccurrenceSpecification) { 
     
    409404            } 
    410405        } 
     406        eventSequence.add(Event.ENDEVENT); 
    411407        double prob = usageProfile.getLogSum(eventSequence); 
    412         usageScore = prob * eventSequence.size(); 
     408        usageScore = eventSequence.size() * prob; 
    413409 
    414410        return usageScore; 
     411    } 
     412 
     413    /** 
     414     * <p> 
     415     * Extends the given model with an activity for usage-based scheduling of the test cases. 
     416     * </p> 
     417     *  
     418     * @param model 
     419     *            model to be extended 
     420     * @param usageProfile 
     421     *            usage profile used as foundation 
     422     */ 
     423    public static void createScheduling(Model model, IStochasticProcess usageProfile) { 
     424 
     425        final Profile utpProfile = model.getAppliedProfile("utp"); 
     426        final Stereotype utpTestCase = (Stereotype) utpProfile.getOwnedMember("TestCase"); 
     427 
     428        Component testContext = 
     429            (Component) model.getPackagedElement("TestContext", true, 
     430                                                 UMLPackage.Literals.COMPONENT, true); 
     431 
     432        Map<Operation, Double> usageScoreMapUnsorted = new HashMap<>(); 
     433 
     434        // first, we determine all test cases and calculate their usage scores 
     435        for (Operation operation : testContext.getAllOperations()) { 
     436            if (operation.getAppliedStereotypes().contains(utpTestCase)) { 
     437                Interaction interaction = (Interaction) operation.getMethods().get(0); 
     438                usageScoreMapUnsorted 
     439                    .put(operation, calculateUsageScore(interaction, usageProfile)); 
     440            } 
     441        } 
     442        Map<Operation, Double> usageScoreMapSorted = sortByValue(usageScoreMapUnsorted); 
     443 
     444        // now we create the scheduling 
     445        Activity schedulingActivity = 
     446            (Activity) testContext.createOwnedBehavior("UsageBasedScheduling", 
     447                                                       UMLPackage.Literals.ACTIVITY); 
     448        testContext.setClassifierBehavior(schedulingActivity); 
     449 
     450        ActivityNode startNode = 
     451            schedulingActivity.createOwnedNode("final", UMLPackage.Literals.INITIAL_NODE); 
     452        ActivityNode finalNode = 
     453            schedulingActivity.createOwnedNode("final", UMLPackage.Literals.ACTIVITY_FINAL_NODE); 
     454 
     455        ActivityNode currentOperationNode = startNode; 
     456 
     457        for (Entry<Operation, Double> entry : usageScoreMapSorted.entrySet()) { 
     458            Operation operation = entry.getKey(); 
     459            CallOperationAction nextOperationNode = 
     460                (CallOperationAction) schedulingActivity 
     461                    .createOwnedNode(operation.getName(), UMLPackage.Literals.CALL_OPERATION_ACTION); 
     462            nextOperationNode.setOperation(operation); 
     463 
     464            ActivityEdge edge = 
     465                schedulingActivity.createEdge(currentOperationNode.getName() + "_to_" + 
     466                    nextOperationNode.getName(), UMLPackage.Literals.CONTROL_FLOW); 
     467            edge.setSource(currentOperationNode); 
     468            edge.setTarget(nextOperationNode); 
     469 
     470            currentOperationNode = nextOperationNode; 
     471        } 
     472 
     473        ActivityEdge edge = 
     474            schedulingActivity 
     475                .createEdge(currentOperationNode.getName() + "_to_" + finalNode.getName(), 
     476                            UMLPackage.Literals.CONTROL_FLOW); 
     477        edge.setSource(currentOperationNode); 
     478        edge.setTarget(finalNode); 
     479    } 
     480 
     481    /** 
     482     * From 
     483     * http://stackoverflow.com/questions/109383/how-to-sort-a-mapkey-value-on-the-values-in-java 
     484     * and adapted to do an inverse sorting 
     485     */ 
     486    public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) { 
     487        List<Map.Entry<K, V>> list = new LinkedList<>(map.entrySet()); 
     488        Collections.sort(list, new Comparator<Map.Entry<K, V>>() { 
     489            @Override 
     490            public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) { 
     491                return -1 * (o1.getValue()).compareTo(o2.getValue()); 
     492            } 
     493        }); 
     494 
     495        Map<K, V> result = new LinkedHashMap<>(); 
     496        for (Map.Entry<K, V> entry : list) { 
     497            result.put(entry.getKey(), entry.getValue()); 
     498        } 
     499        return result; 
    415500    } 
    416501 
     
    512597        return matching; 
    513598    } 
     599     
     600    private static Interface getRealizedInterfaceFromProperty(Property property) { 
     601        return getRealizedInterfaceFromComponent((Component) property.getType()); 
     602    } 
     603     
     604    private static Interface getRealizedInterfaceFromComponent(Component comp) { 
     605        Realization realization = (Realization) comp.getNestedClassifiers().get(0).getRelationships(UMLPackage.Literals.REALIZATION).get(0); 
     606        return (Interface) realization.getSuppliers().get(0); 
     607    } 
    514608 
    515609} 
Note: See TracChangeset for help on using the changeset viewer.