| /** |
| * Copyright (c) 2008 The Board of Trustees of The Leland Stanford Junior |
| * University |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may |
| * not use this file except in compliance with the License. You may obtain |
| * a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations |
| * under the License. |
| **/ |
| |
| package org.openflow.protocol.statistics; |
| |
| import java.lang.reflect.Constructor; |
| |
| import org.openflow.protocol.Instantiable; |
| import org.openflow.protocol.OFType; |
| |
| public enum OFStatisticsType { |
| DESC (0, OFDescriptionStatistics.class, OFDescriptionStatistics.class, |
| new Instantiable<OFStatistics>() { |
| @Override |
| public OFStatistics instantiate() { |
| return new OFDescriptionStatistics(); |
| } |
| }, |
| new Instantiable<OFStatistics>() { |
| @Override |
| public OFStatistics instantiate() { |
| return new OFDescriptionStatistics(); |
| } |
| }), |
| FLOW (1, OFFlowStatisticsRequest.class, OFFlowStatisticsReply.class, |
| new Instantiable<OFStatistics>() { |
| @Override |
| public OFStatistics instantiate() { |
| return new OFFlowStatisticsRequest(); |
| } |
| }, |
| new Instantiable<OFStatistics>() { |
| @Override |
| public OFStatistics instantiate() { |
| return new OFFlowStatisticsReply(); |
| } |
| }), |
| AGGREGATE (2, OFAggregateStatisticsRequest.class, OFAggregateStatisticsReply.class, |
| new Instantiable<OFStatistics>() { |
| @Override |
| public OFStatistics instantiate() { |
| return new OFAggregateStatisticsRequest(); |
| } |
| }, |
| new Instantiable<OFStatistics>() { |
| @Override |
| public OFStatistics instantiate() { |
| return new OFAggregateStatisticsReply(); |
| } |
| }), |
| TABLE (3, OFTableStatistics.class, OFTableStatistics.class, |
| new Instantiable<OFStatistics>() { |
| @Override |
| public OFStatistics instantiate() { |
| return new OFTableStatistics(); |
| } |
| }, |
| new Instantiable<OFStatistics>() { |
| @Override |
| public OFStatistics instantiate() { |
| return new OFTableStatistics(); |
| } |
| }), |
| PORT (4, OFPortStatisticsRequest.class, OFPortStatisticsReply.class, |
| new Instantiable<OFStatistics>() { |
| @Override |
| public OFStatistics instantiate() { |
| return new OFPortStatisticsRequest(); |
| } |
| }, |
| new Instantiable<OFStatistics>() { |
| @Override |
| public OFStatistics instantiate() { |
| return new OFPortStatisticsReply(); |
| } |
| }), |
| QUEUE (5, OFQueueStatisticsRequest.class, OFQueueStatisticsReply.class, |
| new Instantiable<OFStatistics>() { |
| @Override |
| public OFStatistics instantiate() { |
| return new OFQueueStatisticsRequest(); |
| } |
| }, |
| new Instantiable<OFStatistics>() { |
| @Override |
| public OFStatistics instantiate() { |
| return new OFQueueStatisticsReply(); |
| } |
| }), |
| VENDOR (0xffff, OFVendorStatistics.class, OFVendorStatistics.class, |
| new Instantiable<OFStatistics>() { |
| @Override |
| public OFStatistics instantiate() { |
| return new OFVendorStatistics(); |
| } |
| }, |
| new Instantiable<OFStatistics>() { |
| @Override |
| public OFStatistics instantiate() { |
| return new OFVendorStatistics(); |
| } |
| }); |
| |
| static OFStatisticsType[] requestMapping; |
| static OFStatisticsType[] replyMapping; |
| |
| protected Class<? extends OFStatistics> requestClass; |
| protected Constructor<? extends OFStatistics> requestConstructor; |
| protected Instantiable<OFStatistics> requestInstantiable; |
| protected Class<? extends OFStatistics> replyClass; |
| protected Constructor<? extends OFStatistics> replyConstructor; |
| protected Instantiable<OFStatistics> replyInstantiable; |
| protected short type; |
| |
| /** |
| * Store some information about the OpenFlow Statistic type, including wire |
| * protocol type number, and derived class |
| * |
| * @param type Wire protocol number associated with this OFStatisticsType |
| * @param requestClass The Statistics Java class to return when the |
| * containing OFType is STATS_REQUEST |
| * @param replyClass The Statistics Java class to return when the |
| * containing OFType is STATS_REPLY |
| */ |
| OFStatisticsType(int type, Class<? extends OFStatistics> requestClass, |
| Class<? extends OFStatistics> replyClass, |
| Instantiable<OFStatistics> requestInstantiable, |
| Instantiable<OFStatistics> replyInstantiable) { |
| this.type = (short) type; |
| this.requestClass = requestClass; |
| try { |
| this.requestConstructor = requestClass.getConstructor(new Class[]{}); |
| } catch (Exception e) { |
| throw new RuntimeException( |
| "Failure getting constructor for class: " + requestClass, e); |
| } |
| |
| this.replyClass = replyClass; |
| try { |
| this.replyConstructor = replyClass.getConstructor(new Class[]{}); |
| } catch (Exception e) { |
| throw new RuntimeException( |
| "Failure getting constructor for class: " + replyClass, e); |
| } |
| this.requestInstantiable = requestInstantiable; |
| this.replyInstantiable = replyInstantiable; |
| OFStatisticsType.addMapping(this.type, OFType.STATS_REQUEST, this); |
| OFStatisticsType.addMapping(this.type, OFType.STATS_REPLY, this); |
| } |
| |
| /** |
| * Adds a mapping from type value to OFStatisticsType enum |
| * |
| * @param i OpenFlow wire protocol type |
| * @param t type of containing OFMessage, only accepts STATS_REQUEST or |
| * STATS_REPLY |
| * @param st type |
| */ |
| static public void addMapping(short i, OFType t, OFStatisticsType st) { |
| if (i < 0) |
| i = (short) (16+i); |
| if (t == OFType.STATS_REQUEST) { |
| if (requestMapping == null) |
| requestMapping = new OFStatisticsType[16]; |
| OFStatisticsType.requestMapping[i] = st; |
| } else if (t == OFType.STATS_REPLY){ |
| if (replyMapping == null) |
| replyMapping = new OFStatisticsType[16]; |
| OFStatisticsType.replyMapping[i] = st; |
| } else { |
| throw new RuntimeException(t.toString() + " is an invalid OFType"); |
| } |
| } |
| |
| /** |
| * Remove a mapping from type value to OFStatisticsType enum |
| * |
| * @param i OpenFlow wire protocol type |
| * @param t type of containing OFMessage, only accepts STATS_REQUEST or |
| * STATS_REPLY |
| */ |
| static public void removeMapping(short i, OFType t) { |
| if (i < 0) |
| i = (short) (16+i); |
| if (t == OFType.STATS_REQUEST) { |
| requestMapping[i] = null; |
| } else if (t == OFType.STATS_REPLY){ |
| replyMapping[i] = null; |
| } else { |
| throw new RuntimeException(t.toString() + " is an invalid OFType"); |
| } |
| } |
| |
| /** |
| * Given a wire protocol OpenFlow type number, return the OFStatisticsType |
| * associated with it |
| * |
| * @param i wire protocol number |
| * @param t type of containing OFMessage, only accepts STATS_REQUEST or |
| * STATS_REPLY |
| * @return OFStatisticsType enum type |
| */ |
| static public OFStatisticsType valueOf(short i, OFType t) { |
| if (i < 0) |
| i = (short) (16+i); |
| if (t == OFType.STATS_REQUEST) { |
| return requestMapping[i]; |
| } else if (t == OFType.STATS_REPLY){ |
| return replyMapping[i]; |
| } else { |
| throw new RuntimeException(t.toString() + " is an invalid OFType"); |
| } |
| } |
| |
| /** |
| * @return Returns the wire protocol value corresponding to this |
| * OFStatisticsType |
| */ |
| public short getTypeValue() { |
| return this.type; |
| } |
| |
| /** |
| * @param t type of containing OFMessage, only accepts STATS_REQUEST or |
| * STATS_REPLY |
| * @return return the OFMessage subclass corresponding to this |
| * OFStatisticsType |
| */ |
| public Class<? extends OFStatistics> toClass(OFType t) { |
| if (t == OFType.STATS_REQUEST) { |
| return requestClass; |
| } else if (t == OFType.STATS_REPLY){ |
| return replyClass; |
| } else { |
| throw new RuntimeException(t.toString() + " is an invalid OFType"); |
| } |
| } |
| |
| /** |
| * Returns the no-argument Constructor of the implementation class for |
| * this OFStatisticsType, either request or reply based on the supplied |
| * OFType |
| * |
| * @param t |
| * @return |
| */ |
| public Constructor<? extends OFStatistics> getConstructor(OFType t) { |
| if (t == OFType.STATS_REQUEST) { |
| return requestConstructor; |
| } else if (t == OFType.STATS_REPLY) { |
| return replyConstructor; |
| } else { |
| throw new RuntimeException(t.toString() + " is an invalid OFType"); |
| } |
| } |
| |
| /** |
| * @return the requestInstantiable |
| */ |
| public Instantiable<OFStatistics> getRequestInstantiable() { |
| return requestInstantiable; |
| } |
| |
| /** |
| * @param requestInstantiable the requestInstantiable to set |
| */ |
| public void setRequestInstantiable( |
| Instantiable<OFStatistics> requestInstantiable) { |
| this.requestInstantiable = requestInstantiable; |
| } |
| |
| /** |
| * @return the replyInstantiable |
| */ |
| public Instantiable<OFStatistics> getReplyInstantiable() { |
| return replyInstantiable; |
| } |
| |
| /** |
| * @param replyInstantiable the replyInstantiable to set |
| */ |
| public void setReplyInstantiable(Instantiable<OFStatistics> replyInstantiable) { |
| this.replyInstantiable = replyInstantiable; |
| } |
| |
| /** |
| * Returns a new instance of the implementation class for |
| * this OFStatisticsType, either request or reply based on the supplied |
| * OFType |
| * |
| * @param t |
| * @return |
| */ |
| public OFStatistics newInstance(OFType t) { |
| if (t == OFType.STATS_REQUEST) { |
| return requestInstantiable.instantiate(); |
| } else if (t == OFType.STATS_REPLY) { |
| return replyInstantiable.instantiate(); |
| } else { |
| throw new RuntimeException(t.toString() + " is an invalid OFType"); |
| } |
| } |
| } |