You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by lq...@apache.org on 2017/09/28 13:36:02 UTC
[05/12] qpid-broker-j git commit: QPID-7531: [Java Broker,
AMQP 1.0] Refactor LazyConstructors in various
DescribedTypeConstructors
QPID-7531: [Java Broker, AMQP 1.0] Refactor LazyConstructors in various DescribedTypeConstructors
Project: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/commit/56cf7b8a
Tree: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/tree/56cf7b8a
Diff: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/diff/56cf7b8a
Branch: refs/heads/master
Commit: 56cf7b8a90cd6f6c6a13b27c52c721abf5578419
Parents: d8613a6
Author: Lorenz Quack <lq...@apache.org>
Authored: Fri Sep 22 16:25:29 2017 +0100
Committer: Lorenz Quack <lq...@apache.org>
Committed: Thu Sep 28 14:30:17 2017 +0100
----------------------------------------------------------------------
.../codec/AbstractLazyConstructor.java | 76 +++++++++++
.../codec/AmqpValueSectionConstructor.java | 125 +++++++------------
.../messaging/codec/DataSectionConstructor.java | 48 ++-----
.../codec/DescribedListSectionConstructor.java | 49 ++------
.../codec/DescribedMapSectionConstructor.java | 52 ++------
5 files changed, 155 insertions(+), 195 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/56cf7b8a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AbstractLazyConstructor.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AbstractLazyConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AbstractLazyConstructor.java
new file mode 100644
index 0000000..3b80153
--- /dev/null
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AbstractLazyConstructor.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.qpid.server.protocol.v1_0.type.messaging.codec;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.server.protocol.v1_0.codec.TypeConstructor;
+import org.apache.qpid.server.protocol.v1_0.codec.ValueHandler;
+import org.apache.qpid.server.protocol.v1_0.type.AmqpErrorException;
+
+public abstract class AbstractLazyConstructor<T> implements TypeConstructor<T>
+{
+ private final int[] _originalPositions;
+
+ AbstractLazyConstructor(final int[] originalPositions)
+ {
+ _originalPositions = originalPositions;
+ }
+
+ @Override
+ public final T construct(final List<QpidByteBuffer> in, final ValueHandler handler) throws AmqpErrorException
+ {
+ skipValue(in);
+
+ List<QpidByteBuffer> encoding = new ArrayList<>();
+ int offset = in.size() - _originalPositions.length;
+ for (int i = offset; i < in.size(); i++)
+ {
+ QpidByteBuffer buf = in.get(i);
+ if (buf.position() == _originalPositions[i - offset])
+ {
+ if (buf.hasRemaining())
+ {
+ break;
+ }
+ }
+ else
+ {
+ QpidByteBuffer dup = buf.duplicate();
+ dup.position(_originalPositions[i - offset]);
+ dup.limit(buf.position());
+ encoding.add(dup);
+ }
+ }
+ T object = createObject(encoding, handler);
+ for (QpidByteBuffer buffer : encoding)
+ {
+ buffer.dispose();
+ }
+ return object;
+ }
+
+ protected abstract T createObject(final List<QpidByteBuffer> encoding, final ValueHandler handler);
+
+ protected abstract void skipValue(final List<QpidByteBuffer> in) throws AmqpErrorException;
+}
http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/56cf7b8a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AmqpValueSectionConstructor.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AmqpValueSectionConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AmqpValueSectionConstructor.java
index daa76a9..274a2aa 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AmqpValueSectionConstructor.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/AmqpValueSectionConstructor.java
@@ -23,7 +23,6 @@
package org.apache.qpid.server.protocol.v1_0.type.messaging.codec;
-import java.util.ArrayList;
import java.util.List;
import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
@@ -68,98 +67,68 @@ public class AmqpValueSectionConstructor implements DescribedTypeConstructor<Amq
}
- private class LazyConstructor implements TypeConstructor<AmqpValueSection>
+ private class LazyConstructor extends AbstractLazyConstructor<AmqpValueSection>
{
-
- private final int[] _originalPositions;
-
- public LazyConstructor(final int[] originalPositions)
+ LazyConstructor(final int[] originalPositions)
{
+ super(originalPositions);
+ }
- _originalPositions = originalPositions;
+ @Override
+ protected AmqpValueSection createObject(final List<QpidByteBuffer> encoding, final ValueHandler handler)
+ {
+ return new AmqpValueSection(encoding);
}
@Override
- public AmqpValueSection construct(final List<QpidByteBuffer> in, final ValueHandler handler)
- throws AmqpErrorException
+ protected void skipValue(final List<QpidByteBuffer> in) throws AmqpErrorException
{
- skipValue(in);
+ byte formatCode = QpidByteBufferUtils.get(in);
- List<QpidByteBuffer> encoding = new ArrayList<>();
- int offset = in.size() - _originalPositions.length;
- for (int i = offset; i < in.size(); i++)
+ if (formatCode == 0)
+ {
+ // This is only valid if the described value is not an array
+ skipValue(in);
+ skipValue(in);
+ }
+ else
{
- QpidByteBuffer buf = in.get(i);
- if (buf.position() == _originalPositions[i - offset])
+ int category = (formatCode >> 4) & 0x0F;
+ switch (category)
{
- if (buf.hasRemaining())
- {
+ case 0x04:
break;
- }
- }
- else
- {
- QpidByteBuffer dup = buf.duplicate();
- dup.position(_originalPositions[i - offset]);
- dup.limit(buf.position());
- encoding.add(dup);
+ case 0x05:
+ QpidByteBufferUtils.skip(in, 1);
+ break;
+ case 0x06:
+ QpidByteBufferUtils.skip(in, 2);
+ break;
+ case 0x07:
+ QpidByteBufferUtils.skip(in, 4);
+ break;
+ case 0x08:
+ QpidByteBufferUtils.skip(in, 8);
+ break;
+ case 0x09:
+ QpidByteBufferUtils.skip(in, 16);
+ break;
+ case 0x0a:
+ case 0x0c:
+ case 0x0e:
+ QpidByteBufferUtils.skip(in, ((int) QpidByteBufferUtils.get(in)) & 0xFF);
+ break;
+ case 0x0b:
+ case 0x0d:
+ case 0x0f:
+ QpidByteBufferUtils.skip(in, QpidByteBufferUtils.getInt(in));
+ break;
+ default:
+ throw new AmqpErrorException(ConnectionError.FRAMING_ERROR, "Unknown type");
}
}
- AmqpValueSection object = new AmqpValueSection(encoding);
- for (QpidByteBuffer buffer: encoding)
- {
- buffer.dispose();
- }
- return object;
}
- }
-
- private void skipValue(final List<QpidByteBuffer> in) throws AmqpErrorException
- {
- byte formatCode = QpidByteBufferUtils.get(in);
- if (formatCode == 0)
- {
- // This is only valid if the described value is not an array
- skipValue(in);
- skipValue(in);
- }
- else
- {
- int category = (formatCode >> 4) & 0x0F;
- switch (category)
- {
- case 0x04:
- break;
- case 0x05:
- QpidByteBufferUtils.skip(in, 1);
- break;
- case 0x06:
- QpidByteBufferUtils.skip(in, 2);
- break;
- case 0x07:
- QpidByteBufferUtils.skip(in, 4);
- break;
- case 0x08:
- QpidByteBufferUtils.skip(in, 8);
- break;
- case 0x09:
- QpidByteBufferUtils.skip(in, 16);
- break;
- case 0x0a:
- case 0x0c:
- case 0x0e:
- QpidByteBufferUtils.skip(in, ((int) QpidByteBufferUtils.get(in)) & 0xFF);
- break;
- case 0x0b:
- case 0x0d:
- case 0x0f:
- QpidByteBufferUtils.skip(in, QpidByteBufferUtils.getInt(in));
- break;
- default:
- throw new AmqpErrorException(ConnectionError.FRAMING_ERROR, "Unknown type");
- }
- }
}
}
http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/56cf7b8a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DataSectionConstructor.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DataSectionConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DataSectionConstructor.java
index a5d2469..d9b331a 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DataSectionConstructor.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DataSectionConstructor.java
@@ -23,7 +23,6 @@
package org.apache.qpid.server.protocol.v1_0.type.messaging.codec;
-import java.util.ArrayList;
import java.util.List;
import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
@@ -84,23 +83,24 @@ public class DataSectionConstructor implements DescribedTypeConstructor<DataSect
}
- private class LazyConstructor implements TypeConstructor<DataSection>
+ private class LazyConstructor extends AbstractLazyConstructor<DataSection>
{
-
private final int _sizeBytes;
- private final int[] _originalPositions;
- public LazyConstructor(final int sizeBytes,
- final int[] originalPositions)
+ public LazyConstructor(final int sizeBytes, final int[] originalPositions)
{
-
+ super(originalPositions);
_sizeBytes = sizeBytes;
- _originalPositions = originalPositions;
}
@Override
- public DataSection construct(final List<QpidByteBuffer> in, final ValueHandler handler)
- throws AmqpErrorException
+ protected DataSection createObject(final List<QpidByteBuffer> encoding, final ValueHandler handler)
+ {
+ return new DataSection(encoding);
+ }
+
+ @Override
+ protected void skipValue(final List<QpidByteBuffer> in) throws AmqpErrorException
{
int size;
switch(_sizeBytes)
@@ -115,34 +115,6 @@ public class DataSectionConstructor implements DescribedTypeConstructor<DataSect
throw new AmqpErrorException(AmqpError.INVALID_FIELD, "Unexpected constructor type, can only be 1 or 4");
}
QpidByteBufferUtils.skip(in, size);
-
- List<QpidByteBuffer> encoding = new ArrayList<>();
- int offset = in.size() - _originalPositions.length;
- for(int i = offset; i < in.size(); i++)
- {
- QpidByteBuffer buf = in.get(i);
- if(buf.position() == _originalPositions[i-offset])
- {
- if(buf.hasRemaining())
- {
- break;
- }
- }
- else
- {
- QpidByteBuffer dup = buf.duplicate();
- dup.position(_originalPositions[i-offset]);
- dup.limit(buf.position());
- encoding.add(dup);
- }
- }
- DataSection object = new DataSection(encoding);
- for (QpidByteBuffer buffer: encoding)
- {
- buffer.dispose();
- }
- return object;
-
}
}
}
http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/56cf7b8a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DescribedListSectionConstructor.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DescribedListSectionConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DescribedListSectionConstructor.java
index c01b560..d038f33 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DescribedListSectionConstructor.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DescribedListSectionConstructor.java
@@ -23,7 +23,6 @@
package org.apache.qpid.server.protocol.v1_0.type.messaging.codec;
-import java.util.ArrayList;
import java.util.List;
import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
@@ -68,24 +67,24 @@ public abstract class DescribedListSectionConstructor<S extends AbstractSection>
}
- private class LazyConstructor implements TypeConstructor<S>
+ private class LazyConstructor extends AbstractLazyConstructor<S>
{
-
private final int _sizeBytes;
- private final int[] _originalPositions;
- private DescribedListSectionConstructor _describedTypeConstructor;
- public LazyConstructor(final int sizeBytes,
- final int[] originalPositions)
+ LazyConstructor(final int sizeBytes, final int[] originalPositions)
{
-
+ super(originalPositions);
_sizeBytes = sizeBytes;
- _originalPositions = originalPositions;
}
@Override
- public S construct(final List<QpidByteBuffer> in, final ValueHandler handler)
- throws AmqpErrorException
+ protected S createObject(final List<QpidByteBuffer> encoding, final ValueHandler handler)
+ {
+ return DescribedListSectionConstructor.this.createObject(encoding);
+ }
+
+ @Override
+ protected void skipValue(final List<QpidByteBuffer> in) throws AmqpErrorException
{
int size;
switch(_sizeBytes)
@@ -103,34 +102,6 @@ public abstract class DescribedListSectionConstructor<S extends AbstractSection>
throw new AmqpErrorException(AmqpError.INVALID_FIELD, "Unexpected constructor type, can only be 0,1 or 4");
}
QpidByteBufferUtils.skip(in, size);
-
- List<QpidByteBuffer> encoding = new ArrayList<>();
- int offset = in.size() - _originalPositions.length;
- for(int i = offset; i < in.size(); i++)
- {
- QpidByteBuffer buf = in.get(i);
- if(buf.position() == _originalPositions[i-offset])
- {
- if(buf.hasRemaining())
- {
- break;
- }
- }
- else
- {
- QpidByteBuffer dup = buf.duplicate();
- dup.position(_originalPositions[i-offset]);
- dup.limit(buf.position());
- encoding.add(dup);
- }
- }
- S object = createObject(encoding);
- for (QpidByteBuffer buffer: encoding)
- {
- buffer.dispose();
- }
- return object;
-
}
}
http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/56cf7b8a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DescribedMapSectionConstructor.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DescribedMapSectionConstructor.java b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DescribedMapSectionConstructor.java
index 718c6da..fb1f545 100644
--- a/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DescribedMapSectionConstructor.java
+++ b/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/type/messaging/codec/DescribedMapSectionConstructor.java
@@ -27,9 +27,9 @@ import java.util.ArrayList;
import java.util.List;
import org.apache.qpid.server.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils;
import org.apache.qpid.server.protocol.v1_0.codec.DescribedTypeConstructor;
import org.apache.qpid.server.protocol.v1_0.codec.DescribedTypeConstructorRegistry;
-import org.apache.qpid.server.bytebuffer.QpidByteBufferUtils;
import org.apache.qpid.server.protocol.v1_0.codec.SectionDecoderRegistry;
import org.apache.qpid.server.protocol.v1_0.codec.TypeConstructor;
import org.apache.qpid.server.protocol.v1_0.codec.ValueHandler;
@@ -67,24 +67,25 @@ public abstract class DescribedMapSectionConstructor<S extends AbstractSection>
}
- private class LazyConstructor implements TypeConstructor<S>
+ private class LazyConstructor extends AbstractLazyConstructor<S>
{
-
private final int _sizeBytes;
- private final int[] _originalPositions;
- private DescribedMapSectionConstructor _describedTypeConstructor;
- public LazyConstructor(final int sizeBytes,
- final int[] originalPositions)
+ LazyConstructor(final int sizeBytes, final int[] originalPositions)
{
-
+ super(originalPositions);
_sizeBytes = sizeBytes;
- _originalPositions = originalPositions;
}
@Override
- public S construct(final List<QpidByteBuffer> in, final ValueHandler handler)
- throws AmqpErrorException
+ protected S createObject(final List<QpidByteBuffer> encoding, final ValueHandler handler)
+ {
+ return DescribedMapSectionConstructor.this.createObject(((SectionDecoderRegistry) handler.getDescribedTypeRegistry())
+ .getUnderlyingRegistry(), encoding);
+ }
+
+ @Override
+ protected void skipValue(final List<QpidByteBuffer> in) throws AmqpErrorException
{
int size;
switch(_sizeBytes)
@@ -99,35 +100,6 @@ public abstract class DescribedMapSectionConstructor<S extends AbstractSection>
throw new AmqpErrorException(AmqpError.INVALID_FIELD, "Unexpected constructor type, can only be 1 or 4");
}
QpidByteBufferUtils.skip(in, size);
-
- List<QpidByteBuffer> encoding = new ArrayList<>();
- int offset = in.size() - _originalPositions.length;
- for(int i = offset; i < in.size(); i++)
- {
- QpidByteBuffer buf = in.get(i);
- if(buf.position() == _originalPositions[i-offset])
- {
- if(buf.hasRemaining())
- {
- break;
- }
- }
- else
- {
- QpidByteBuffer dup = buf.duplicate();
- dup.position(_originalPositions[i-offset]);
- dup.limit(buf.position());
- encoding.add(dup);
- }
- }
- S object = createObject(((SectionDecoderRegistry)handler.getDescribedTypeRegistry()).getUnderlyingRegistry(),
- encoding);
- for (QpidByteBuffer buffer: encoding)
- {
- buffer.dispose();
- }
- return object;
-
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org