Refactor for release; still need integration tests
diff --git a/src/main/java/com/intel/jndn/management/EncodingHelper.java b/src/main/java/com/intel/jndn/management/EncodingHelper.java
new file mode 100644
index 0000000..66e3b9d
--- /dev/null
+++ b/src/main/java/com/intel/jndn/management/EncodingHelper.java
@@ -0,0 +1,142 @@
+/*
+ * File name: EncodingHelper.java
+ *
+ * Purpose: Provide helper methods to cover areas too protected in Tlv0_1_1WireFormat;
+ * this class can be deprecated if WireFormats allow passing in an existing
+ * TlvEncoder/TlvDecoder (currently these methods are protected).
+ *
+ * © Copyright Intel Corporation. All rights reserved.
+ * Intel Corporation, 2200 Mission College Boulevard,
+ * Santa Clara, CA 95052-8119, USA
+ */
+package com.intel.jndn.management;
+
+import java.nio.ByteBuffer;
+import net.named_data.jndn.ControlParameters;
+import net.named_data.jndn.ForwardingFlags;
+import net.named_data.jndn.Name;
+import net.named_data.jndn.encoding.EncodingException;
+import net.named_data.jndn.encoding.tlv.Tlv;
+import net.named_data.jndn.encoding.tlv.TlvDecoder;
+import net.named_data.jndn.encoding.tlv.TlvEncoder;
+import net.named_data.jndn.util.Blob;
+
+/**
+ * Provide helper methods to cover areas too protected in Tlv0_1_1WireFormat;
+ * this class can be deprecated if WireFormats allow passing in an existing
+ * TlvEncoder/TlvDecoder (currently these methods are protected).
+ *
+ * @author Andrew Brown <andrew.brown@intel.com>
+ */
+public class EncodingHelper {
+
+ /**
+ * Helper to decode names since Tlv0_1_1WireFormat.java uses its own
+ * internal, protected implementation.
+ *
+ * @param input
+ * @return
+ * @throws EncodingException
+ */
+ public static Name decodeName(ByteBuffer input) throws EncodingException {
+ TlvDecoder decoder = new TlvDecoder(input);
+ return decodeName(decoder);
+ }
+
+ /**
+ * Helper to decode names using an existing decoding context; could be
+ * merged to Tlv0_1_1WireFormat.java.
+ *
+ * @param decoder
+ * @return
+ * @throws EncodingException
+ */
+ public static Name decodeName(TlvDecoder decoder) throws EncodingException {
+ Name name = new Name();
+ int endOffset = decoder.readNestedTlvsStart(Tlv.Name);
+ while (decoder.getOffset() < endOffset) {
+ name.append(new Blob(decoder.readBlobTlv(Tlv.NameComponent), true));
+ }
+
+ decoder.finishNestedTlvs(endOffset);
+ return name;
+ }
+
+ /**
+ * Helper to encode names since Tlv0_1_1WireFormat.java uses its own
+ * internal, protected implementation.
+ *
+ * @param name
+ * @return
+ */
+ public static Blob encodeName(Name name) {
+ TlvEncoder encoder = new TlvEncoder();
+ encodeName(name, encoder);
+ return new Blob(encoder.getOutput(), false);
+ }
+
+ /**
+ * Helper to encode names using an existing encoding context; could be
+ * merged to Tlv0_1_1WireFormat.java.
+ *
+ * @param name
+ * @param encoder
+ */
+ public static final void encodeName(Name name, TlvEncoder encoder) {
+ int saveLength = encoder.getLength();
+ for (int i = name.size() - 1; i >= 0; --i) {
+ encoder.writeBlobTlv(Tlv.NameComponent, name.get(i).getValue().buf());
+ }
+ encoder.writeTypeAndLength(Tlv.Name, encoder.getLength() - saveLength);
+ }
+
+ /**
+ * Helper to encode control parameters using an existing encoding context;
+ * could be merged to Tlv0_1_1WireFormat.java.
+ *
+ * @param controlParameters
+ * @param encoder
+ */
+ public static final void encodeControlParameters(ControlParameters controlParameters, TlvEncoder encoder) {
+ int saveLength = encoder.getLength();
+
+ // Encode backwards.
+ encoder.writeOptionalNonNegativeIntegerTlvFromDouble(Tlv.ControlParameters_ExpirationPeriod,
+ controlParameters.getExpirationPeriod());
+
+ // Encode strategy
+ if (controlParameters.getStrategy().size() != 0) {
+ int strategySaveLength = encoder.getLength();
+ encodeName(controlParameters.getStrategy(), encoder);
+ encoder.writeTypeAndLength(Tlv.ControlParameters_Strategy,
+ encoder.getLength() - strategySaveLength);
+ }
+
+ // Encode ForwardingFlags
+ int flags = controlParameters.getForwardingFlags().getNfdForwardingFlags();
+ if (flags != new ForwardingFlags().getNfdForwardingFlags()) // The flags are not the default value.
+ {
+ encoder.writeNonNegativeIntegerTlv(Tlv.ControlParameters_Flags, flags);
+ }
+
+ encoder.writeOptionalNonNegativeIntegerTlv(Tlv.ControlParameters_Cost, controlParameters.getCost());
+ encoder.writeOptionalNonNegativeIntegerTlv(Tlv.ControlParameters_Origin, controlParameters.getOrigin());
+ encoder.writeOptionalNonNegativeIntegerTlv(Tlv.ControlParameters_LocalControlFeature,
+ controlParameters.getLocalControlFeature());
+
+ // Encode URI
+ if (!controlParameters.getUri().isEmpty()) {
+ encoder.writeBlobTlv(Tlv.ControlParameters_Uri,
+ new Blob(controlParameters.getUri()).buf());
+ }
+
+ encoder.writeOptionalNonNegativeIntegerTlv(Tlv.ControlParameters_FaceId, controlParameters.getFaceId());
+
+ // Encode name
+ if (controlParameters.getName().size() != 0) {
+ encodeName(controlParameters.getName(), encoder);
+ }
+
+ encoder.writeTypeAndLength(Tlv.ControlParameters_ControlParameters, encoder.getLength() - saveLength);
+ }
+}