// Copyright (c) 2008 The Board of Trustees of The Leland Stanford Junior University
// Copyright (c) 2011, 2012 Open Networking Foundation
// Copyright (c) 2012, 2013 Big Switch Networks, Inc.
// This library was generated by the LoxiGen Compiler.
// See the file LICENSE.txt which should have been included in the source distribution

// Automatically generated by LOXI from template of_factories.java
// Do not modify

package org.projectfloodlight.openflow.protocol;

import org.projectfloodlight.openflow.protocol.*;
import org.projectfloodlight.openflow.protocol.action.*;
import org.projectfloodlight.openflow.protocol.actionid.*;
import org.projectfloodlight.openflow.protocol.bsntlv.*;
import org.projectfloodlight.openflow.protocol.errormsg.*;
import org.projectfloodlight.openflow.protocol.meterband.*;
import org.projectfloodlight.openflow.protocol.instruction.*;
import org.projectfloodlight.openflow.protocol.instructionid.*;
import org.projectfloodlight.openflow.protocol.match.*;
import org.projectfloodlight.openflow.protocol.oxm.*;
import org.projectfloodlight.openflow.protocol.queueprop.*;
import org.projectfloodlight.openflow.types.*;
import org.projectfloodlight.openflow.util.*;
import org.projectfloodlight.openflow.exceptions.*;
import org.jboss.netty.buffer.ChannelBuffer;

public final class OFFactories {

    private static final GenericReader GENERIC_READER = new GenericReader();

    public static OFFactory getFactory(OFVersion version) {
        switch(version) {
            case OF_10:
                return org.projectfloodlight.openflow.protocol.ver10.OFFactoryVer10.INSTANCE;
            case OF_11:
                return org.projectfloodlight.openflow.protocol.ver11.OFFactoryVer11.INSTANCE;
            case OF_12:
                return org.projectfloodlight.openflow.protocol.ver12.OFFactoryVer12.INSTANCE;
            case OF_13:
                return org.projectfloodlight.openflow.protocol.ver13.OFFactoryVer13.INSTANCE;
            default:
                throw new IllegalArgumentException("Unknown version: "+version);
            }
    }

    private static class GenericReader implements OFMessageReader<OFMessage> {
        public OFMessage readFrom(ChannelBuffer bb) throws OFParseError {
            short wireVersion = U8.f(bb.getByte(0));
            OFFactory factory;
            switch (wireVersion) {
            case 1:
                factory = org.projectfloodlight.openflow.protocol.ver10.OFFactoryVer10.INSTANCE;
                break;
            case 2:
                factory = org.projectfloodlight.openflow.protocol.ver11.OFFactoryVer11.INSTANCE;
                break;
            case 3:
                factory = org.projectfloodlight.openflow.protocol.ver12.OFFactoryVer12.INSTANCE;
                break;
            case 4:
                factory = org.projectfloodlight.openflow.protocol.ver13.OFFactoryVer13.INSTANCE;
                break;
            default:
                throw new IllegalArgumentException("Unknown wire version: " + wireVersion);
            }
            return factory.getReader().readFrom(bb);
        }
    }

    public static OFMessageReader<OFMessage> getGenericReader() {
        return GENERIC_READER;
    }
}
