X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflow-protocol-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowjava%2Fprotocol%2Fimpl%2Fdeserialization%2Ffactories%2FErrorMessageFactory.java;h=4b18f2121c0da76ef306670aad05d10fb39b4a64;hb=05bc9fb5cb06c747be728f8d695d2723db911514;hp=45c30ef9c1577a08c02758a8daedb4f56a9864a1;hpb=2dff6e684f5358bf57a2b25f17909ede04228901;p=openflowjava.git diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/ErrorMessageFactory.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/ErrorMessageFactory.java index 45c30ef9..4b18f212 100644 --- a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/ErrorMessageFactory.java +++ b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/ErrorMessageFactory.java @@ -1,221 +1,251 @@ -/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */ -package org.opendaylight.openflowjava.protocol.impl.deserialization.factories; - -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.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; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadRequestCode; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ErrorType; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFailedCode; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModFailedCode; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloFailedCode; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModFailedCode; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortModFailedCode; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.QueueOpFailedCode; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.RoleRequestFailedCode; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.SwitchConfigFailedCode; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableFeaturesFailedCode; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableModFailedCode; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessageBuilder; - -/** - * Translates Error messages - * @author michal.polkorab - * @author timotej.kubas - */ -public class ErrorMessageFactory implements OFDeserializer { - - private static final String UNKNOWN_CODE = "UNKNOWN_CODE"; - private static final String UNKNOWN_TYPE = "UNKNOWN_TYPE"; - private static final int NO_CORRECT_ENUM_FOUND_VALUE = -1; - - 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; - } - - @Override - public ErrorMessage bufferToMessage(ByteBuf rawMessage, short version) { - ErrorMessageBuilder builder = new ErrorMessageBuilder(); - builder.setVersion(version); - builder.setXid(rawMessage.readUnsignedInt()); - ErrorType type = ErrorType.forValue(rawMessage.readUnsignedShort()); - decodeType(builder, type); - decodeCode(rawMessage, builder, type); - if (rawMessage.readableBytes() > 0) { - builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array()); - } - return builder.build(); - } - - private static void decodeCode(ByteBuf rawMessage, ErrorMessageBuilder builder, - ErrorType type) { - - switch (type) { - case HELLOFAILED: - { - HelloFailedCode code = HelloFailedCode.forValue(rawMessage.readUnsignedShort()); - if (code != null) { - builder.setCode(code.getIntValue()); - builder.setCodeString(code.name()); - } - break; - } - case BADREQUEST: - { - BadRequestCode code = BadRequestCode.forValue(rawMessage.readUnsignedShort()); - if (code != null) { - builder.setCode(code.getIntValue()); - builder.setCodeString(code.name()); - } - break; - } - case BADACTION: - { - BadActionCode code = BadActionCode.forValue(rawMessage.readUnsignedShort()); - if (code != null) { - builder.setCode(code.getIntValue()); - builder.setCodeString(code.name()); - } - break; - } - case BADINSTRUCTION: - { - BadInstructionCode code = BadInstructionCode.forValue(rawMessage.readUnsignedShort()); - if (code != null) { - builder.setCode(code.getIntValue()); - builder.setCodeString(code.name()); - } - break; - } - case BADMATCH: - { - BadMatchCode code = BadMatchCode.forValue(rawMessage.readUnsignedShort()); - if (code != null) { - builder.setCode(code.getIntValue()); - builder.setCodeString(code.name()); - } - break; - } - case FLOWMODFAILED: - { - FlowModFailedCode code = FlowModFailedCode.forValue(rawMessage.readUnsignedShort()); - if (code != null) { - builder.setCode(code.getIntValue()); - builder.setCodeString(code.name()); - } - break; - } - case GROUPMODFAILED: - { - GroupModFailedCode code = GroupModFailedCode.forValue(rawMessage.readUnsignedShort()); - if (code != null) { - builder.setCode(code.getIntValue()); - builder.setCodeString(code.name()); - } - break; - } - case PORTMODFAILED: - { - PortModFailedCode code = PortModFailedCode.forValue(rawMessage.readUnsignedShort()); - if (code != null) { - builder.setCode(code.getIntValue()); - builder.setCodeString(code.name()); - } - break; - } - case TABLEMODFAILED: - { - TableModFailedCode code = TableModFailedCode.forValue(rawMessage.readUnsignedShort()); - if (code != null) { - builder.setCode(code.getIntValue()); - builder.setCodeString(code.name()); - } - break; - } - case QUEUEOPFAILED: - { - QueueOpFailedCode code = QueueOpFailedCode.forValue(rawMessage.readUnsignedShort()); - if (code != null) { - builder.setCode(code.getIntValue()); - builder.setCodeString(code.name()); - } - break; - } - case SWITCHCONFIGFAILED: - { - SwitchConfigFailedCode code = SwitchConfigFailedCode.forValue(rawMessage.readUnsignedShort()); - if (code != null) { - builder.setCode(code.getIntValue()); - builder.setCodeString(code.name()); - } - break; - } - case ROLEREQUESTFAILED: - { - RoleRequestFailedCode code = RoleRequestFailedCode.forValue(rawMessage.readUnsignedShort()); - if (code != null) { - builder.setCode(code.getIntValue()); - builder.setCodeString(code.name()); - } - break; - } - case METERMODFAILED: - { - MeterModFailedCode code = MeterModFailedCode.forValue(rawMessage.readUnsignedShort()); - if (code != null) { - builder.setCode(code.getIntValue()); - builder.setCodeString(code.name()); - } - break; - } - case TABLEFEATURESFAILED: - { - TableFeaturesFailedCode code = TableFeaturesFailedCode.forValue(rawMessage.readUnsignedShort()); - if (code != null) { - builder.setCode(code.getIntValue()); - builder.setCodeString(code.name()); - } - break; - } - case EXPERIMENTER: - ExperimenterErrorBuilder expBuilder = new ExperimenterErrorBuilder(); - expBuilder.setExpType(rawMessage.readUnsignedShort()); - expBuilder.setExperimenter(rawMessage.readUnsignedInt()); - builder.addAugmentation(ExperimenterError.class, expBuilder.build()); - break; - default: - builder.setCode(NO_CORRECT_ENUM_FOUND_VALUE); - builder.setCodeString(UNKNOWN_CODE); - break; - } - } - - private static void decodeType(ErrorMessageBuilder builder, ErrorType type) { - if (type != null) { - builder.setType(type.getIntValue()); - builder.setTypeString(type.name()); - } else { - builder.setType(NO_CORRECT_ENUM_FOUND_VALUE); - builder.setTypeString(UNKNOWN_TYPE); - } - } - -} +/* + * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.openflowjava.protocol.impl.deserialization.factories; + +import io.netty.buffer.ByteBuf; + +import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry; +import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector; +import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey; +import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdError; +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; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadRequestCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ErrorType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFailedCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModFailedCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloFailedCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModFailedCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortModFailedCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.QueueOpFailedCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.RoleRequestFailedCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.SwitchConfigFailedCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableFeaturesFailedCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableModFailedCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessageBuilder; + +/** + * Translates Error messages + * @author michal.polkorab + * @author timotej.kubas + */ +public class ErrorMessageFactory implements OFDeserializer, + DeserializerRegistryInjector { + + private static final String UNKNOWN_CODE = "UNKNOWN_CODE"; + private static final String UNKNOWN_TYPE = "UNKNOWN_TYPE"; + private DeserializerRegistry registry; + + @Override + public ErrorMessage deserialize(ByteBuf rawMessage) { + ErrorMessageBuilder builder = new ErrorMessageBuilder(); + 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)) { + builder.setType(errorType.getIntValue()); + OFDeserializer deserializer = registry.getDeserializer(new MessageCodeKey( + EncodeConstants.OF13_VERSION_ID, EncodeConstants.EXPERIMENTER_VALUE, ErrorMessage.class)); + ExperimenterIdError error = deserializer.deserialize(rawMessage); + builder.addAugmentation(ExperimenterIdError.class, error); + } else { + decodeType(builder, errorType, type); + decodeCode(rawMessage, builder, errorType); + if (rawMessage.readableBytes() > 0) { + builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array()); + } + } + return builder.build(); + } + + private static void decodeType(ErrorMessageBuilder builder, ErrorType type, int readValue) { + if (type != null) { + builder.setType(type.getIntValue()); + builder.setTypeString(type.name()); + } else { + builder.setType(readValue); + builder.setTypeString(UNKNOWN_TYPE); + } + } + + private static void decodeCode(ByteBuf rawMessage, ErrorMessageBuilder builder, + ErrorType type) { + int code = rawMessage.readUnsignedShort(); + if (type != null) { + switch (type) { + case HELLOFAILED: + { + HelloFailedCode errorCode = HelloFailedCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case BADREQUEST: + { + BadRequestCode errorCode = BadRequestCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case BADACTION: + { + BadActionCode errorCode = BadActionCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case BADINSTRUCTION: + { + BadInstructionCode errorCode = BadInstructionCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case BADMATCH: + { + BadMatchCode errorCode = BadMatchCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case FLOWMODFAILED: + { + FlowModFailedCode errorCode = FlowModFailedCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case GROUPMODFAILED: + { + GroupModFailedCode errorCode = GroupModFailedCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case PORTMODFAILED: + { + PortModFailedCode errorCode = PortModFailedCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case TABLEMODFAILED: + { + TableModFailedCode errorCode = TableModFailedCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case QUEUEOPFAILED: + { + QueueOpFailedCode errorCode = QueueOpFailedCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case SWITCHCONFIGFAILED: + { + SwitchConfigFailedCode errorCode = SwitchConfigFailedCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case ROLEREQUESTFAILED: + { + RoleRequestFailedCode errorCode = RoleRequestFailedCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case METERMODFAILED: + { + MeterModFailedCode errorCode = MeterModFailedCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case TABLEFEATURESFAILED: + { + TableFeaturesFailedCode errorCode = TableFeaturesFailedCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + default: + setUnknownCode(builder, code); + break; + } + } else { + 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; + } + +}