--- /dev/null
+package org.openflow.protocol.queue;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.openflow.protocol.factory.OFQueuePropertyFactory;
+import org.openflow.protocol.factory.OFQueuePropertyFactoryAware;
+import org.openflow.util.U16;
+
+/**
+ * Corresponds to the struct ofp_packet_queue OpenFlow structure
+ *
+ * @author David Erickson (daviderickson@cs.stanford.edu)
+ */
+public class OFPacketQueue implements Cloneable, OFQueuePropertyFactoryAware {
+ public static int MINIMUM_LENGTH = 8;
+
+ protected OFQueuePropertyFactory queuePropertyFactory;
+
+ protected int queueId;
+ protected short length;
+ protected List<OFQueueProperty> properties;
+
+ /**
+ * @return the queueId
+ */
+ public int getQueueId() {
+ return queueId;
+ }
+
+ /**
+ * @param queueId the queueId to set
+ */
+ public OFPacketQueue setQueueId(int queueId) {
+ this.queueId = queueId;
+ return this;
+ }
+
+ /**
+ * @return the length
+ */
+ public short getLength() {
+ return length;
+ }
+
+ /**
+ * @param length the length to set
+ */
+ public void setLength(short length) {
+ this.length = length;
+ }
+
+ /**
+ * @return the properties
+ */
+ public List<OFQueueProperty> getProperties() {
+ return properties;
+ }
+
+ /**
+ * @param properties the properties to set
+ */
+ public OFPacketQueue setProperties(List<OFQueueProperty> properties) {
+ this.properties = properties;
+ return this;
+ }
+
+ public void readFrom(ByteBuffer data) {
+ this.queueId = data.getInt();
+ this.length = data.getShort();
+ data.getShort(); // pad
+ if (this.queuePropertyFactory == null)
+ throw new RuntimeException("OFQueuePropertyFactory not set");
+ this.properties = queuePropertyFactory.parseQueueProperties(data,
+ U16.f(this.length) - MINIMUM_LENGTH);
+ }
+
+ public void writeTo(ByteBuffer data) {
+ data.putInt(this.queueId);
+ data.putShort(this.length);
+ data.putShort((short) 0); // pad
+ if (this.properties != null) {
+ for (OFQueueProperty queueProperty : this.properties) {
+ queueProperty.writeTo(data);
+ }
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 6367;
+ int result = 1;
+ result = prime * result + length;
+ result = prime * result
+ + ((properties == null) ? 0 : properties.hashCode());
+ result = prime * result + queueId;
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (!(obj instanceof OFPacketQueue))
+ return false;
+ OFPacketQueue other = (OFPacketQueue) obj;
+ if (length != other.length)
+ return false;
+ if (properties == null) {
+ if (other.properties != null)
+ return false;
+ } else if (!properties.equals(other.properties))
+ return false;
+ if (queueId != other.queueId)
+ return false;
+ return true;
+ }
+
+ @Override
+ public OFPacketQueue clone() {
+ try {
+ OFPacketQueue clone = (OFPacketQueue) super.clone();
+ if (this.properties != null) {
+ List<OFQueueProperty> queueProps = new ArrayList<OFQueueProperty>();
+ for (OFQueueProperty prop : this.properties) {
+ queueProps.add(prop.clone());
+ }
+ clone.setProperties(queueProps);
+ }
+ return clone;
+ } catch (CloneNotSupportedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void setQueuePropertyFactory(
+ OFQueuePropertyFactory queuePropertyFactory) {
+ this.queuePropertyFactory = queuePropertyFactory;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return "OFPacketQueue [queueId=" + queueId + ", properties="
+ + properties + "]";
+ }
+}