java/ch/wlkl/wsm/Flow.java

package ch.wlkl.wsm;

import static ch.wlkl.wsm.Parser.xQuote;

/**
 * @author walter
 * a normal flow with a result
 */
class FlowNormal extends Flow {
    public FlowNormal(Object obj) {
        super(obj);
    }
    public boolean isNormal() {
        return true;
    }
}

class FlowReturn extends Flow {
    public FlowReturn(Object obj) {
        super(obj);
    }
    public boolean isReturn() {
        return true;
    }
}

class FlowThrow extends Flow {
    public FlowThrow(Object obj) {
        super(obj);
    }
    public boolean isThrow() {
        return true;
    }
}

/**
 * @author walter
 *
 */
public abstract class Flow {
    private Object u;
    public Flow(Object obj) {
        u = obj;
    }
    public static Flow normal(Object obj) {
        return new FlowNormal(obj);
    }

    public static Flow ret(Object obj) {
        return new FlowReturn(obj);
    }
    
    public static Flow thrw(Object obj) {
        return new FlowThrow(obj);
    }
    
    public Object u() {
        return u;
    }
    public boolean isNormal() {
        return false;
    }
    public boolean isReturn() {
        return false;
    }
    public boolean isThrow() {
        return false;
    }
    public Flow exe(Frame cf) {
        if (! isNormal())
            return new FlowThrow("cannot exe " + this);
        Ex ex;
        try {
            ex = (Ex) u();
        } catch (Exception e) {
            return new FlowThrow("cannot exe " + this + ": " + e);
        }
        return ex.exe(cf);
        }

        public String uString() {
        return u == null ? "null" : u instanceof String ? xQuote((String) u) : u.toString();
    }

        public String toString() {
        return this.getClass().getSimpleName() + ':' + uString();
    }
}