//# 10 errors, 296 messages
//#
/*
    //#ActionComponentChain.java:1:1: class: com.dmdirc.actions.ActionComponentChain
    //#ActionComponentChain.java:1:1: method: com.dmdirc.actions.ActionComponentChain.com.dmdirc.actions.ActionComponentChain__static_init
 * Copyright (c) 2006-2009 Chris Smith, Shane Mc Cormack, Gregory Holmes
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package com.dmdirc.actions;

import com.dmdirc.actions.interfaces.ActionComponent;
import com.dmdirc.Precondition;
import com.dmdirc.logger.Logger;

import java.util.ArrayList;
import java.util.List;

/**
 * An action component chain supports chaining of multiple action components
 * together.
 *
 * @author chris
 */
public class ActionComponentChain implements ActionComponent {
    
    /**
     * A list of components in this chain.
     */
    private final List<ActionComponent> components = new ArrayList<ActionComponent>();
    
    /**
     * Creates a new component chain from the specified text representation.
     * Chains are separated with full stops (.).
     *
     * @param source The class that this chain needs to start with
     * @param chain The textual representation of the chain
     */
    public ActionComponentChain(final Class source, final String chain) {
    //#ActionComponentChain.java:52: method: void com.dmdirc.actions.ActionComponentChain.com.dmdirc.actions.ActionComponentChain(Class, String)
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): " cannot be applied to "._tainted
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): " not found"._tainted
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): "Component "._tainted
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): __Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): __Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): chain
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): chain._tainted
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/ActionManager.actionComponents
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[others]
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): source
    //#input(void com.dmdirc.actions.ActionComponentChain(Class, String)): this
    //#output(void com.dmdirc.actions.ActionComponentChain(Class, String)): new ArrayList(ActionComponentChain#1) num objects
    //#output(void com.dmdirc.actions.ActionComponentChain(Class, String)): this.components
    //#new obj(void com.dmdirc.actions.ActionComponentChain(Class, String)): new ArrayList(ActionComponentChain#1)
    //#pre[1] (void com.dmdirc.actions.ActionComponentChain(Class, String)): chain != null
    //#post(void com.dmdirc.actions.ActionComponentChain(Class, String)): this.components == &new ArrayList(ActionComponentChain#1)
    //#post(void com.dmdirc.actions.ActionComponentChain(Class, String)): new ArrayList(ActionComponentChain#1) num objects == 1
    //#unanalyzed(void com.dmdirc.actions.ActionComponentChain(Class, String)): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void com.dmdirc.actions.ActionComponentChain(Class, String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void com.dmdirc.actions.ActionComponentChain(Class, String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void com.dmdirc.actions.ActionComponentChain(Class, String)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void com.dmdirc.actions.ActionComponentChain(Class, String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void com.dmdirc.actions.ActionComponentChain(Class, String)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void com.dmdirc.actions.ActionComponentChain(Class, String)): Effects-of-calling:java.lang.Enum:name
        Class current = source;
        
        for (String componentName : chain.split("\\.")) {
    //#ActionComponentChain.java:55: ?use of default init
    //#    init'ed(arr$.length)
    //#    severity: LOW
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: void com.dmdirc.actions.ActionComponentChain(Class, String)
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(arr$.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ActionComponentChain.java:55: ?use of default init
    //#    init'ed(len$)
    //#    severity: LOW
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: void com.dmdirc.actions.ActionComponentChain(Class, String)
    //#    basic block: bb_2
    //#    assertion: init'ed(len$)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ActionComponentChain.java:55: Warning: test always goes same way
    //#    Test predetermined because i$ == len$
    //#    severity: LOW
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: void com.dmdirc.actions.ActionComponentChain(Class, String)
    //#    from bb: bb_2
    //#    live edge: bb_2-->bb_9
    //#    tested vn: i$ - undefined
    //#    tested vn values: {0}
    //#ActionComponentChain.java:55: Warning: dead code
    //#    Dead code here because i$ == len$
    //#    severity: LOW
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: void com.dmdirc.actions.ActionComponentChain(Class, String)
    //#    dead bb: bb_3
    //#ActionComponentChain.java:55: Warning: dead code continues
    //#    Dead code continues
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: void com.dmdirc.actions.ActionComponentChain(Class, String)
    //#    dead bb: bb_8
            final ActionComponent component = ActionManager.getActionComponent(componentName);
            
            if (component == null) {
                throw new IllegalArgumentException("Component " + componentName
                        + " not found");
            } else if (component.appliesTo() == current) {
    //#ActionComponentChain.java:61: Warning: dead code continues
    //#    Dead code continues
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: void com.dmdirc.actions.ActionComponentChain(Class, String)
    //#    dead bb: bb_5
                components.add(component);
    //#ActionComponentChain.java:62: Warning: dead code continues
    //#    Dead code continues
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: void com.dmdirc.actions.ActionComponentChain(Class, String)
    //#    dead bb: bb_6
                current = component.getType();
            } else {
                throw new IllegalArgumentException("Component " + componentName
                        + " cannot be applied to " + current.getName());
            }
        }
        
    }
    //#ActionComponentChain.java:70: end of method: void com.dmdirc.actions.ActionComponentChain.com.dmdirc.actions.ActionComponentChain(Class, String)
    
    /** {@inheritDoc} */
    @Override
    public Object get(final Object argument) {
        Object res = argument;
    //#ActionComponentChain.java:75: method: Object com.dmdirc.actions.ActionComponentChain.get(Object)
    //#input(Object get(Object)): __Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): argument
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[others]
    //#input(Object get(Object)): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#input(Object get(Object)): this
    //#input(Object get(Object)): this.components
    //#output(Object get(Object)): return_value
    //#pre[3] (Object get(Object)): this.components != null
    //#presumption(Object get(Object)): java.util.Iterator:next(...)@77 != null
    //#post(Object get(Object)): init'ed(return_value)
    //#test_vector(Object get(Object)): java.util.Iterator:hasNext(...)@77: {0}, {1}
        
        for (ActionComponent component : components) {
    //#ActionComponentChain.java:77: ?use of default init
    //#    init'ed(com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: Object get(Object)
    //#    basic block: bb_6
    //#    assertion: init'ed(com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag])
    //#    VN: com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java.util.Iterator:next(...).__Tag]
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#ActionComponentChain.java:77: ?ClassCastException check
    //#    com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: Object get(Object)
    //#    basic block: bb_6
    //#    assertion: com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag] != null
    //#    VN: !(com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java.util.Iterator:next(...).__Tag] == null)
    //#    Expected: {-Inf..-1, 1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad > Exp
            res = component.get(res);
    //#ActionComponentChain.java:78: Warning: call too complex - analysis skipped
    //#    call on Object get(Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: Object get(Object)
    //#    unanalyzed callee: Object get(Object)
        }
        
        return res;
    //#ActionComponentChain.java:81: end of method: Object com.dmdirc.actions.ActionComponentChain.get(Object)
    }
    
    /** {@inheritDoc} */
    @Precondition("This component chain has one or more components")
    @Override
    public Class appliesTo() {
        Logger.assertTrue(!components.isEmpty());
    //#ActionComponentChain.java:88: method: Class com.dmdirc.actions.ActionComponentChain.appliesTo()
    //#ActionComponentChain.java:88: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: Class appliesTo()
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
    //#input(Class appliesTo()): __Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[others]
    //#input(Class appliesTo()): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#input(Class appliesTo()): this
    //#input(Class appliesTo()): this.components
    //#output(Class appliesTo()): return_value
    //#pre[2] (Class appliesTo()): this.components != null
    //#presumption(Class appliesTo()): java.util.List:get(...)@90 != null
    //#post(Class appliesTo()): init'ed(return_value)
        
        return components.get(0).appliesTo();
    //#ActionComponentChain.java:90: ?use of default init
    //#    init'ed(com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/List:get(...).__Tag])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: Class appliesTo()
    //#    basic block: bb_6
    //#    assertion: init'ed(com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/List:get(...).__Tag])
    //#    VN: com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java.util.List:get(...).__Tag]
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#ActionComponentChain.java:90: ?ClassCastException check
    //#    com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/List:get(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: Class appliesTo()
    //#    basic block: bb_6
    //#    assertion: com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/List:get(...).__Tag] != null
    //#    VN: !(com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java.util.List:get(...).__Tag] == null)
    //#    Expected: {-Inf..-1, 1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad > Exp
    //#ActionComponentChain.java:90: Warning: call too complex - analysis skipped
    //#    call on Class appliesTo()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: Class appliesTo()
    //#    unanalyzed callee: Class appliesTo()
    //#ActionComponentChain.java:90: end of method: Class com.dmdirc.actions.ActionComponentChain.appliesTo()
    }
    
    /** {@inheritDoc} */
    @Precondition("This component chain has one or more components")
    @Override
    public Class getType() {
        Logger.assertTrue(!components.isEmpty());
    //#ActionComponentChain.java:97: method: Class com.dmdirc.actions.ActionComponentChain.getType()
    //#ActionComponentChain.java:97: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: Class getType()
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
    //#input(Class getType()): __Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[others]
    //#input(Class getType()): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.getType()Ljava/lang/Class;
    //#input(Class getType()): this
    //#input(Class getType()): this.components
    //#output(Class getType()): return_value
    //#pre[2] (Class getType()): this.components != null
    //#presumption(Class getType()): java.util.List:get(...)@99 != null
    //#presumption(Class getType()): java.util.List:size(...)@99 >= -2_147_483_647
    //#post(Class getType()): init'ed(return_value)
        
        return components.get(components.size() - 1).getType();
    //#ActionComponentChain.java:99: ?use of default init
    //#    init'ed(com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/List:get(...).__Tag])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: Class getType()
    //#    basic block: bb_6
    //#    assertion: init'ed(com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/List:get(...).__Tag])
    //#    VN: com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java.util.List:get(...).__Tag]
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#ActionComponentChain.java:99: ?ClassCastException check
    //#    com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/List:get(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: Class getType()
    //#    basic block: bb_6
    //#    assertion: com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/List:get(...).__Tag] != null
    //#    VN: !(com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java.util.List:get(...).__Tag] == null)
    //#    Expected: {-Inf..-1, 1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad > Exp
    //#ActionComponentChain.java:99: Warning: call too complex - analysis skipped
    //#    call on Class getType()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: Class getType()
    //#    unanalyzed callee: Class getType()
    //#ActionComponentChain.java:99: end of method: Class com.dmdirc.actions.ActionComponentChain.getType()
    }
    
    /** {@inheritDoc} */
    @Precondition("This component chain has one or more components")
    @Override
    public String getName() {
        Logger.assertTrue(!components.isEmpty());
    //#ActionComponentChain.java:106: method: String com.dmdirc.actions.ActionComponentChain.getName()
    //#ActionComponentChain.java:106: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: String getName()
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
    //#input(String getName()): "'s "._tainted
    //#input(String getName()): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$1.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$10.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$11.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$12.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$13.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$14.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$15.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$16.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$17.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$18.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$19.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$2.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$20.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$21.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$22.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$23.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$24.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$25.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$26.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$27.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$3.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$4.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$5.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$6.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$7.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$8.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent$9.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/CoreActionComponent.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[others]
    //#input(String getName()): com/dmdirc/actions/interfaces/ActionComponent.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(String getName()): this
    //#input(String getName()): this.components
    //#output(String getName()): return_value
    //#pre[2] (String getName()): this.components != null
    //#presumption(String getName()): java.util.Iterator:next(...)@110 != null
    //#post(String getName()): return_value != null
    //#test_vector(String getName()): java.util.Iterator:hasNext(...)@110: {0}, {1}
        
        final StringBuilder name = new StringBuilder();
        
        for (ActionComponent component : components) {
    //#ActionComponentChain.java:110: ?ClassCastException check
    //#    com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: String getName()
    //#    basic block: bb_9
    //#    assertion: com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag] != null
    //#    VN: !(com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java.util.Iterator:next(...).__Tag] == null)
    //#    Expected: {-Inf..-1, 1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad > Exp
            name.append("'s ");
            name.append(component.getName());
    //#ActionComponentChain.java:112: Warning: call too complex - analysis skipped
    //#    call on String getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: String getName()
    //#    unanalyzed callee: String getName()
        }
        
        return name.substring(3);
    //#ActionComponentChain.java:115: end of method: String com.dmdirc.actions.ActionComponentChain.getName()
    }
    
    /** {@inheritDoc} */
    @Override
    @Precondition("This component chain has one or more components")
    public String toString() {
        Logger.assertTrue(!components.isEmpty());
    //#ActionComponentChain.java:122: method: String com.dmdirc.actions.ActionComponentChain.toString()
    //#ActionComponentChain.java:122: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.logger.Logger:assertTrue(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: String toString()
    //#    unanalyzed callee: void com.dmdirc.logger.Logger:assertTrue(bool)
    //#input(String toString()): com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[others]
    //#input(String toString()): this
    //#input(String toString()): this.components
    //#output(String toString()): return_value
    //#pre[2] (String toString()): this.components != null
    //#presumption(String toString()): java.util.Iterator:next(...)@126 != null
    //#post(String toString()): return_value != null
    //#test_vector(String toString()): java.util.Iterator:hasNext(...)@126: {0}, {1}
        
        final StringBuilder name = new StringBuilder();
        
        for (ActionComponent component : components) {
    //#ActionComponentChain.java:126: ?ClassCastException check
    //#    com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.actions.ActionComponentChain
    //#    method: String toString()
    //#    basic block: bb_9
    //#    assertion: com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java/util/Iterator:next(...).__Tag] != null
    //#    VN: !(com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[java.util.Iterator:next(...).__Tag] == null)
    //#    Expected: {-Inf..-1, 1..+Inf}
    //#    Bad: {0}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Bad > Exp
            name.append('.');
            name.append(component.toString());
        }
        
        return name.substring(1);
    //#ActionComponentChain.java:131: end of method: String com.dmdirc.actions.ActionComponentChain.toString()
    }
    
}    //#output(com.dmdirc.actions.ActionComponentChain__static_init): __Descendant_Table[com/dmdirc/actions/ActionComponentChain]
    //#output(com.dmdirc.actions.ActionComponentChain__static_init): __Dispatch_Table.appliesTo()Ljava/lang/Class;
    //#output(com.dmdirc.actions.ActionComponentChain__static_init): __Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object;
    //#output(com.dmdirc.actions.ActionComponentChain__static_init): __Dispatch_Table.getName()Ljava/lang/String;
    //#output(com.dmdirc.actions.ActionComponentChain__static_init): __Dispatch_Table.getType()Ljava/lang/Class;
    //#output(com.dmdirc.actions.ActionComponentChain__static_init): __Dispatch_Table.toString()Ljava/lang/String;
    //#output(com.dmdirc.actions.ActionComponentChain__static_init): com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[com/dmdirc/actions/ActionComponentChain]
    //#post(com.dmdirc.actions.ActionComponentChain__static_init): __Descendant_Table[com/dmdirc/actions/ActionComponentChain] == &__Dispatch_Table
    //#post(com.dmdirc.actions.ActionComponentChain__static_init): com/dmdirc/actions/interfaces/ActionComponent.__Descendant_Table[com/dmdirc/actions/ActionComponentChain] == &__Dispatch_Table
    //#post(com.dmdirc.actions.ActionComponentChain__static_init): __Dispatch_Table.appliesTo()Ljava/lang/Class; == &appliesTo
    //#post(com.dmdirc.actions.ActionComponentChain__static_init): __Dispatch_Table.get(Ljava/lang/Object;)Ljava/lang/Object; == &get
    //#post(com.dmdirc.actions.ActionComponentChain__static_init): __Dispatch_Table.getName()Ljava/lang/String; == &getName
    //#post(com.dmdirc.actions.ActionComponentChain__static_init): __Dispatch_Table.getType()Ljava/lang/Class; == &getType
    //#post(com.dmdirc.actions.ActionComponentChain__static_init): __Dispatch_Table.toString()Ljava/lang/String; == &toString
    //#ActionComponentChain.java:: end of method: com.dmdirc.actions.ActionComponentChain.com.dmdirc.actions.ActionComponentChain__static_init
    //#ActionComponentChain.java:: end of class: com.dmdirc.actions.ActionComponentChain
