regs.add(context.registerEROSubobjectSerializer(UnnumberedCase.class, unnumberedParser));
final EROPathKey32SubobjectParser pathKeyParser = new EROPathKey32SubobjectParser();
- regs.add(context.registerEROSubobjectParser(EROPathKey32SubobjectParser.TYPE, pathKeyParser));
- regs.add(context.registerEROSubobjectParser(EROPathKey128SubobjectParser.TYPE, new EROPathKey128SubobjectParser()));
+ regs.add(context.registerEROSubobjectParser(EROPathKey32SubobjectParser.TYPE_32, pathKeyParser));
+ regs.add(context.registerEROSubobjectParser(EROPathKey128SubobjectParser.TYPE_128, new EROPathKey128SubobjectParser()));
regs.add(context.registerEROSubobjectSerializer(PathKeyCase.class, pathKeyParser));
final EROLabelSubobjectParser labelParser = new EROLabelSubobjectParser(labelReg);
*/
package org.opendaylight.protocol.pcep.impl.subobject;
-import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeUnsignedShort;
-
-import com.google.common.base.Preconditions;
import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
-import org.opendaylight.protocol.pcep.spi.EROSubobjectParser;
-import org.opendaylight.protocol.pcep.spi.EROSubobjectUtil;
+import org.opendaylight.protocol.pcep.spi.AbstractEROPathKeySubobjectParser;
import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
import org.opendaylight.protocol.util.ByteArray;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.Subobject;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.SubobjectBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.PathKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.PceId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.explicit.route.subobjects.subobject.type.PathKeyCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.explicit.route.subobjects.subobject.type.PathKeyCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.explicit.route.subobjects.subobject.type.path.key._case.PathKeyBuilder;
-
-/**
- * Parser for {@link PathKey}
- */
-public class EROPathKey128SubobjectParser implements EROSubobjectParser {
-
- public static final int TYPE = 65;
- protected static final int PCE128_ID_F_LENGTH = 16;
-
- private static final int CONTENT128_LENGTH = 2 + PCE128_ID_F_LENGTH;
+public final class EROPathKey128SubobjectParser extends AbstractEROPathKeySubobjectParser {
@Override
- public Subobject parseSubobject(final ByteBuf buffer, final boolean loose) throws PCEPDeserializerException {
- Preconditions.checkArgument(buffer != null && buffer.isReadable(), "Array of bytes is mandatory. Can't be null or empty.");
- if (buffer.readableBytes() != CONTENT128_LENGTH) {
- throw new PCEPDeserializerException("Wrong length of array of bytes. Passed: " + buffer.readableBytes() + "; Expected: >"
- + CONTENT128_LENGTH + ".");
- }
- final int pathKey = buffer.readUnsignedShort();
- final byte[] pceId = ByteArray.readBytes(buffer, PCE128_ID_F_LENGTH);
- final SubobjectBuilder builder = new SubobjectBuilder();
- final PathKeyBuilder pBuilder = new PathKeyBuilder();
- pBuilder.setPceId(new PceId(pceId));
- pBuilder.setPathKey(new PathKey(pathKey));
- builder.setLoose(loose);
- builder.setSubobjectType(new PathKeyCaseBuilder().setPathKey(pBuilder.build()).build());
- return builder.build();
+ protected final byte[] readPceId(final ByteBuf buffer) {
+ return ByteArray.readBytes(buffer, PCE128_ID_F_LENGTH);
}
- public static void serializeSubobject(final Subobject subobject, final ByteBuf buffer) {
- Preconditions.checkArgument(subobject.getSubobjectType() instanceof PathKeyCase, "Unknown subobject instance. Passed %s. Needed PathKey.", subobject.getSubobjectType().getClass());
- final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.explicit.route
- .subobjects.subobject.type.path.key._case.PathKey pk = ((PathKeyCase) subobject.getSubobjectType()).getPathKey();
- final ByteBuf body = Unpooled.buffer();
- Preconditions.checkArgument(pk.getPathKey() != null, "PathKey is mandatory.");
- writeUnsignedShort(pk.getPathKey().getValue(), body);
- Preconditions.checkArgument(pk.getPceId() != null, "PceId is mandatory.");
- body.writeBytes(pk.getPceId().getBinary());
- EROSubobjectUtil.formatSubobject(TYPE, subobject.isLoose(), body, buffer);
+ @Override
+ protected final void checkContentLenght(final int lenght) throws PCEPDeserializerException {
+ if (lenght != CONTENT128_LENGTH) {
+ throw new PCEPDeserializerException("Wrong length of array of bytes. Passed: " + lenght + "; Expected: >"
+ + CONTENT128_LENGTH + ".");
+ }
}
}
*/
package org.opendaylight.protocol.pcep.impl.subobject;
-import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeUnsignedShort;
-
-import com.google.common.base.Preconditions;
import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
-import org.opendaylight.protocol.pcep.spi.EROSubobjectParser;
-import org.opendaylight.protocol.pcep.spi.EROSubobjectSerializer;
-import org.opendaylight.protocol.pcep.spi.EROSubobjectUtil;
+import org.opendaylight.protocol.pcep.spi.AbstractEROPathKeySubobjectParser;
import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
import org.opendaylight.protocol.util.ByteArray;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.Subobject;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.SubobjectBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.PathKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.PceId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.explicit.route.subobjects.subobject.type.PathKeyCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.explicit.route.subobjects.subobject.type.PathKeyCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.explicit.route.subobjects.subobject.type.path.key._case.PathKeyBuilder;
-
-/**
- * Parser for {@link PathKey}
- */
-// TODO: refactor to abstract class
-public class EROPathKey32SubobjectParser implements EROSubobjectParser, EROSubobjectSerializer {
- public static final int TYPE = 64;
-
- private static final int PCE_ID_F_LENGTH = 4;
-
- private static final int CONTENT_LENGTH = 2 + PCE_ID_F_LENGTH;
+public final class EROPathKey32SubobjectParser extends AbstractEROPathKeySubobjectParser {
@Override
- public Subobject parseSubobject(final ByteBuf buffer, final boolean loose) throws PCEPDeserializerException {
- Preconditions.checkArgument(buffer != null && buffer.isReadable(), "Array of bytes is mandatory. Can't be null or empty.");
- if (buffer.readableBytes() != CONTENT_LENGTH) {
- throw new PCEPDeserializerException("Wrong length of array of bytes. Passed: " + buffer.readableBytes() + "; Expected: >"
- + CONTENT_LENGTH + ".");
- }
- final int pathKey = buffer.readUnsignedShort();
- final byte[] pceId = ByteArray.readBytes(buffer, PCE_ID_F_LENGTH);
- final SubobjectBuilder builder = new SubobjectBuilder();
- final PathKeyBuilder pBuilder = new PathKeyBuilder();
- pBuilder.setPceId(new PceId(pceId));
- pBuilder.setPathKey(new PathKey(pathKey));
- builder.setLoose(loose);
- builder.setSubobjectType(new PathKeyCaseBuilder().setPathKey(pBuilder.build()).build());
- return builder.build();
+ protected final byte[] readPceId(final ByteBuf buffer) {
+ return ByteArray.readBytes(buffer, PCE_ID_F_LENGTH);
}
@Override
- public void serializeSubobject(final Subobject subobject, final ByteBuf buffer) {
- Preconditions.checkArgument(subobject.getSubobjectType() instanceof PathKeyCase, "Unknown subobject instance. Passed %s. Needed PathKey.", subobject.getSubobjectType().getClass());
- final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.explicit.route
- .subobjects.subobject.type.path.key._case.PathKey pk = ((PathKeyCase) subobject.getSubobjectType()).getPathKey();
- final ByteBuf body = Unpooled.buffer();
- Preconditions.checkArgument(pk.getPceId() != null, "PceId is mandatory.");
- if(pk.getPceId().getBinary().length == EROPathKey128SubobjectParser.PCE128_ID_F_LENGTH) {
- EROPathKey128SubobjectParser.serializeSubobject(subobject,buffer);
+ protected final void checkContentLenght(final int lenght) throws PCEPDeserializerException {
+ if (lenght != CONTENT_LENGTH) {
+ throw new PCEPDeserializerException("Wrong length of array of bytes. Passed: " + lenght + "; Expected: >"
+ + CONTENT_LENGTH + ".");
}
- Preconditions.checkArgument(pk.getPathKey() != null, "PathKey is mandatory.");
- writeUnsignedShort(pk.getPathKey().getValue(), body);
- Preconditions.checkArgument(pk.getPceId().getBinary().length == PCE_ID_F_LENGTH, "PceId 32 Bit required.");
- body.writeBytes(pk.getPceId().getBinary());
- EROSubobjectUtil.formatSubobject(TYPE, subobject.isLoose(), body, buffer);
}
}
--- /dev/null
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. 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.protocol.pcep.spi;
+
+import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeUnsignedShort;
+
+import com.google.common.base.Preconditions;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.Subobject;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.SubobjectBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.PathKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.PceId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.explicit.route.subobjects.subobject.type.PathKeyCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.explicit.route.subobjects.subobject.type.PathKeyCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.explicit.route.subobjects.subobject.type.path.key._case.PathKeyBuilder;
+
+/**
+ * Parser for {@link PathKey}
+ */
+public abstract class AbstractEROPathKeySubobjectParser implements EROSubobjectParser, EROSubobjectSerializer {
+
+ public static final int TYPE_32 = 64;
+ public static final int TYPE_128 = 65;
+ protected static final int PCE_ID_F_LENGTH = 4;
+ protected static final int PCE128_ID_F_LENGTH = 16;
+ protected static final int CONTENT128_LENGTH = 2 + PCE128_ID_F_LENGTH;
+ protected static final int CONTENT_LENGTH = 2 + PCE_ID_F_LENGTH;
+
+ protected abstract byte[] readPceId(final ByteBuf buffer);
+
+ protected abstract void checkContentLenght(final int i) throws PCEPDeserializerException;
+
+ @Override
+ public final Subobject parseSubobject(final ByteBuf buffer, final boolean loose) throws PCEPDeserializerException {
+ Preconditions.checkArgument(buffer != null && buffer.isReadable(), "Array of bytes is mandatory. Can't be null or empty.");
+ checkContentLenght(buffer.readableBytes());
+ final int pathKey = buffer.readUnsignedShort();
+ final byte[] pceId = readPceId(buffer);
+ final PathKeyBuilder pBuilder = new PathKeyBuilder();
+ pBuilder.setPceId(new PceId(pceId));
+ pBuilder.setPathKey(new PathKey(pathKey));
+ final SubobjectBuilder builder = new SubobjectBuilder();
+ builder.setLoose(loose);
+ builder.setSubobjectType(new PathKeyCaseBuilder().setPathKey(pBuilder.build()).build());
+ return builder.build();
+ }
+
+ @Override
+ public final void serializeSubobject(final Subobject subobject, final ByteBuf buffer) {
+ Preconditions.checkArgument(subobject.getSubobjectType() instanceof PathKeyCase, "Unknown subobject instance. Passed %s. Needed PathKey.",
+ subobject.getSubobjectType().getClass());
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.explicit.route
+ .subobjects.subobject.type.path.key._case.PathKey pk = ((PathKeyCase) subobject.getSubobjectType()).getPathKey();
+ Preconditions.checkArgument(pk.getPceId() != null, "PceId is mandatory.");
+ Preconditions.checkArgument(pk.getPathKey() != null, "PathKey is mandatory.");
+ final byte[] pceID = pk.getPceId().getBinary();
+ Preconditions.checkArgument(pceID.length == PCE_ID_F_LENGTH || pceID.length == PCE128_ID_F_LENGTH, "PceId 32/128 Bit required.");
+ final ByteBuf body = Unpooled.buffer();
+ writeUnsignedShort(pk.getPathKey().getValue(), body);
+ body.writeBytes(pceID);
+ EROSubobjectUtil.formatSubobject(pceID.length == PCE_ID_F_LENGTH ? TYPE_32 : TYPE_128, subobject.isLoose(), body, buffer);
+ }
+}