package net.floodlightcontroller.linkdiscovery;

import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.codehaus.jackson.map.ser.std.ToStringSerializer;
import org.openflow.util.HexString;

public interface ILinkDiscovery {

    @JsonSerialize(using=ToStringSerializer.class)
    public enum UpdateOperation {
    	LINK_ADDED("Link Added"), // Operation Added by ONOS
        LINK_UPDATED("Link Updated"),
        LINK_REMOVED("Link Removed"),
        SWITCH_UPDATED("Switch Updated"),
        SWITCH_REMOVED("Switch Removed"),
        PORT_UP("Port Up"),
        PORT_DOWN("Port Down");
        
        private String value;
        UpdateOperation(String v) {
            value = v;
        }
        
        @Override
        public String toString() {
            return value;
        }
    }

    public class LDUpdate {
        protected long src;
        protected short srcPort;
        protected long dst;
        protected short dstPort;
        protected SwitchType srcType;
        protected LinkType type;
        protected UpdateOperation operation;

        public LDUpdate(long src, short srcPort,
                      long dst, short dstPort,
                      ILinkDiscovery.LinkType type,
                      UpdateOperation operation) {
            this.src = src;
            this.srcPort = srcPort;
            this.dst = dst;
            this.dstPort = dstPort;
            this.type = type;
            this.operation = operation;
        }

        public LDUpdate(LDUpdate old) {
            this.src = old.src;
            this.srcPort = old.srcPort;
            this.dst = old.dst;
            this.dstPort = old.dstPort;
            this.srcType = old.srcType;
            this.type = old.type;
            this.operation = old.operation;
        }

        // For updtedSwitch(sw)
        public LDUpdate(long switchId, SwitchType stype, UpdateOperation oper ){
            this.operation = oper;
            this.src = switchId;
            this.srcType = stype;
        }

        // For port up or port down.
        public LDUpdate(long sw, short port, UpdateOperation operation) {
            this.src = sw;
            this.srcPort = port;
            this.operation = operation;
        }

        public long getSrc() {
            return src;
        }

        public short getSrcPort() {
            return srcPort;
        }

        public long getDst() {
            return dst;
        }

        public short getDstPort() {
            return dstPort;
        }

        public SwitchType getSrcType() {
            return srcType;
        }

        public LinkType getType() {
            return type;
        }

        public UpdateOperation getOperation() {
            return operation;
        }

        public void setOperation(UpdateOperation operation) {
            this.operation = operation;
        }
        
        @Override
        public String toString() {
            switch (operation) {
            case LINK_REMOVED:
            case LINK_UPDATED:
                return "LDUpdate [operation=" + operation +
                        ", src=" + HexString.toHexString(src)
                        + ", srcPort=" + srcPort
                        + ", dst=" + HexString.toHexString(dst) 
                        + ", dstPort=" + dstPort
                        + ", type=" + type + "]";
            case PORT_DOWN:
            case PORT_UP:
                return "LDUpdate [operation=" + operation +
                        ", src=" + HexString.toHexString(src)
                        + ", srcPort=" + srcPort + "]";
            case SWITCH_REMOVED:
            case SWITCH_UPDATED:
                return "LDUpdate [operation=" + operation +
                        ", src=" + HexString.toHexString(src) + "]";
            default:
                return "LDUpdate: Unknown update.";
            }
        }
    }

    public enum SwitchType {
        BASIC_SWITCH, CORE_SWITCH
    };

    public enum LinkType {
        INVALID_LINK {
        	@Override
        	public String toString() {
        		return "invalid";
        	}
        }, 
        DIRECT_LINK{
        	@Override
        	public String toString() {
        		return "internal";
        	}
        }, 
        MULTIHOP_LINK {
        	@Override
        	public String toString() {
        		return "external";
        	}
        }, 
        TUNNEL {
        	@Override
        	public String toString() {
        		return "tunnel";
        	}
        }
    };
}

@@ -2964,32 +2964,61 @@
 h (operation) %7B%0A
+            case LINK_ADDED:%0A
             case

Add missing case for ONOS extension