@Override protected void updateListeners(Object oldOwner, Object newOwner) { Set<Object[]> l = new HashSet<Object[]>(); if (newOwner != null) { /* Don't listen to all property names * We only need to listen to its "type", and "remove". */ l.add(new Object[] {newOwner, new String[] {"type", "remove"}}); // register for events from the type Object type = Model.getFacade().getType(newOwner); if (Model.getFacade().isAClassifier(type)) { if (Model.getFacade().isAClassifierInState(type)) { Object classifier = Model.getFacade().getType(type); l.add(new Object[] {classifier, "name"}); l.add(new Object[] {type, "inState"}); Collection states = Model.getFacade().getInStates(type); Iterator i = states.iterator(); while (i.hasNext()) { l.add(new Object[] {i.next(), "name"}); } } else { l.add(new Object[] {type, "name"}); } } } updateElementListeners(l); }
@Override protected void updateListeners(Object oldOwner, Object newOwner) { Set<Object[]> listeners = new HashSet<Object[]>(); // Collect the set of model elements that we want to listen to if (newOwner != null) { // TODO: Because we get called on each and every change event, when // the model is in a state of flux, we'll often get an // InvalidElementException before we finish this collection. The // only saving grace is that we're called SO many times that on the // last time, things should be stable again and we'll get a good set // of elements for the final update. We need a better mechanism. // add the listeners to the newOwner listeners.add(new Object[] {newOwner, null}); // and its stereotypes // TODO: Aren't stereotypes handled elsewhere? for (Object stereotype : Model.getFacade().getStereotypes(newOwner)) { listeners.add(new Object[] {stereotype, null}); } // and its features for (Object feat : Model.getFacade().getFeatures(newOwner)) { listeners.add(new Object[] {feat, null}); // and the stereotypes of its features for (Object stereotype : Model.getFacade().getStereotypes(feat)) { listeners.add(new Object[] {stereotype, null}); } // and the parameter of its operations if (Model.getFacade().isAOperation(feat)) { for (Object param : Model.getFacade().getParameters(feat)) { listeners.add(new Object[] {param, null}); /* Testing: Add a parameter to an operation on an Interface. * Does the Interface Fig adapt its width? */ } } } } // Update the listeners to match the desired set using the minimal // update facility updateElementListeners(listeners); }
Clone fragments detected by clone detection tool
File path: /ArgoUML-0.34-src/argouml/src/argouml-app/src/org/argouml/uml/diagram/activity/ui/FigObjectFlowState.java File path: /ArgoUML-0.34-src/argouml/src/argouml-app/src/org/argouml/uml/diagram/static_structure/ui/FigInterface.java
Method name: void updateListeners(Object, Object) Method name: void updateListeners(Object, Object)
Number of AST nodes: 2 Number of AST nodes: 2
1
@Override
1
@Override
2
    protected void updateListeners(Object oldOwner, Object newOwner) {
2
    protected void updateListeners(Object oldOwner, Object newOwner) {
3
        Set<Object[]> l = new HashSet<Object[]>();
3
        Set<Object[]> listeners = new HashSet<Object[]>();
4
4
5
        if (newOwner != null) {
5
        // Collect the set of model elements that we want to listen to
6
            /* Don't listen to all property names
6
        if (newOwner != null) {
7
             * We only need to listen to its "type", and "remove". */
7
            // TODO: Because we get called on each and every change event, when
8
            l.add(new Object[] {newOwner, new String[] {"type", "remove"}});
8
            // the model is in a state of flux, we'll often get an
9
            // register for events from the type
9
            // InvalidElementException before we finish this collection. The
10
            Object type = Model.getFacade().getType(newOwner);
10
            // only saving grace is that we're called SO many times that on the
11
            if (Model.getFacade().isAClassifier(type)) {
11
            // last time, things should be stable again and we'll get a good set
12
                if (Model.getFacade().isAClassifierInState(type)) {
12
            // of elements for the final update.  We need a better mechanism.
13
                    Object classifier = Model.getFacade().getType(type);
13
            
14
                    l.add(new Object[] {classifier, "name"});
14
            // add the listeners to the newOwner
15
                    l.add(new Object[] {type, "inState"});
15
            listeners.add(new Object[] {newOwner, null});
16
                    Collection states = Model.getFacade().getInStates(type);
16
            
17
                    Iterator i = states.iterator();
17
            // and its stereotypes
18
                    while (i.hasNext()) {
18
            // TODO: Aren't stereotypes handled elsewhere?
19
                        l.add(new Object[] {i.next(), "name"});
19
            for (Object stereotype 
20
                    }
20
                    : Model.getFacade().getStereotypes(newOwner)) {
21
                } else {
21
                listeners.add(new Object[] {stereotype, null});
22
                    l.add(new Object[] {type, "name"});
22
            }
23
                }
23
24
            }
24
            // and its features
25
        }
25
            for (Object feat : Model.getFacade().getFeatures(newOwner)) {
26
26
                listeners.add(new Object[] {feat, null});
27
        updateElementListeners(l);
27
                // and the stereotypes of its features
28
    }
28
                for (Object stereotype 
29
                        : Model.getFacade().getStereotypes(feat)) {
30
                    listeners.add(new Object[] {stereotype, null});
31
                }
32
                // and the parameter of its operations
33
                if (Model.getFacade().isAOperation(feat)) {
34
                    for (Object param : Model.getFacade().getParameters(feat)) {
35
                        listeners.add(new Object[] {param, null});
36
                        /* Testing: Add a parameter to an operation on an Interface.
37
                         * Does the Interface Fig adapt its width? */
38
                    }
39
                }
40
            }
41
        }
42
        
43
        // Update the listeners to match the desired set using the minimal
44
        // update facility
45
        updateElementListeners(listeners);
46
    }
  1. {Non-refactorable}
    Mapping Summary
    Number of mapped statements3
    Number of unmapped statements in the first code fragment0
    Number of unmapped statements in the second code fragment0
    Time elapsed for statement mapping (ms)0.0
    Similarity Score0.600
    Clone typeType 2
    Mapped Statements
    ID Statement ID Statement
    12
    while (i.hasNext())
    12
    while (i.hasNext())
    11
    for (Object param : Model.getFacade().getParameters(feat))
    Differences
    Expression1Expression2Difference
    statesModel.getFacade().getParameters(feat)TYPE_COMPATIBLE_REPLACEMENT
    11
    for (Object param : Model.getFacade().getParameters(feat))
    13
    l.add(new Object[] {i.next(), "name"});
    13
    l.add(new Object[] {i.next(), "name"});
    12
    listeners.add(new Object[] {param, null});
    Differences
    Expression1Expression2Difference
    i.next()paramTYPE_COMPATIBLE_REPLACEMENT
    "name"nullTYPE_COMPATIBLE_REPLACEMENT
    llistenersVARIABLE_NAME_MISMATCH
    Preondition Violations
    Expression param cannot be parameterized, because it has dependencies to/from statements that will be extracted
    12
    listeners.add(new Object[] {param, null});
    Precondition Violations (1)
    Row Violation
    1Expression param cannot be parameterized, because it has dependencies to/from statements that will be extracted