import io.netty.buffer.ByteBuf;
-import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterError;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterErrorBuilder;
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
+import org.opendaylight.openflowjava.util.ExperimenterDeserializerKeyFactory;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadActionCode;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadInstructionCode;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadMatchCode;
* @author michal.polkorab
* @author timotej.kubas
*/
-public class ErrorMessageFactory implements OFDeserializer<ErrorMessage> {
+public class ErrorMessageFactory implements OFDeserializer<ErrorMessage>,
+ DeserializerRegistryInjector {
private static final String UNKNOWN_CODE = "UNKNOWN_CODE";
private static final String UNKNOWN_TYPE = "UNKNOWN_TYPE";
-
- private static ErrorMessageFactory instance;
-
- private ErrorMessageFactory() {
- // do nothing, just singleton
- }
-
- /**
- * @return singleton factory
- */
- public static synchronized ErrorMessageFactory getInstance() {
- if (instance == null) {
- instance = new ErrorMessageFactory();
- }
- return instance;
- }
-
+ private DeserializerRegistry registry;
+
@Override
- public ErrorMessage bufferToMessage(ByteBuf rawMessage, short version) {
+ public ErrorMessage deserialize(ByteBuf rawMessage) {
+ int startIndex = rawMessage.readerIndex();
ErrorMessageBuilder builder = new ErrorMessageBuilder();
- builder.setVersion(version);
+ builder.setVersion((short) EncodeConstants.OF13_VERSION_ID);
builder.setXid(rawMessage.readUnsignedInt());
int type = rawMessage.readUnsignedShort();
ErrorType errorType = ErrorType.forValue(type);
+ if (ErrorType.EXPERIMENTER.equals(errorType)) {
+ OFDeserializer<ErrorMessage> deserializer = registry.getDeserializer(
+ ExperimenterDeserializerKeyFactory.createExperimenterErrorDeserializerKey(
+ EncodeConstants.OF13_VERSION_ID, rawMessage.getUnsignedInt(
+ rawMessage.readerIndex() + EncodeConstants.SIZE_OF_SHORT_IN_BYTES)));
+ rawMessage.readerIndex(startIndex);
+ return deserializer.deserialize(rawMessage);
+ }
decodeType(builder, errorType, type);
decodeCode(rawMessage, builder, errorType);
if (rawMessage.readableBytes() > 0) {
}
return builder.build();
}
-
+
private static void decodeType(ErrorMessageBuilder builder, ErrorType type, int readValue) {
if (type != null) {
builder.setType(type.getIntValue());
}
break;
}
- case EXPERIMENTER:
- ExperimenterErrorBuilder expBuilder = new ExperimenterErrorBuilder();
- expBuilder.setExpType(code);
- expBuilder.setExperimenter(rawMessage.readUnsignedInt());
- builder.addAugmentation(ExperimenterError.class, expBuilder.build());
- break;
default:
setUnknownCode(builder, code);
break;
setUnknownCode(builder, code);
}
}
-
+
private static void setUnknownCode(ErrorMessageBuilder builder, int readValue) {
builder.setCode(readValue);
builder.setCodeString(UNKNOWN_CODE);
}
-
+
private static void setCode(ErrorMessageBuilder builder, int code, String codeString) {
builder.setCode(code);
builder.setCodeString(codeString);
}
+ @Override
+ public void injectDeserializerRegistry(DeserializerRegistry deserializerRegistry) {
+ this.registry = deserializerRegistry;
+ }
+
}