You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2017/05/12 14:07:16 UTC
[3/6] activemq-artemis git commit: ARTEMIS-1156: moving our
collections on its own package
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/TypedProperties.java
----------------------------------------------------------------------
diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/TypedProperties.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/TypedProperties.java
new file mode 100644
index 0000000..9657f36
--- /dev/null
+++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/collections/TypedProperties.java
@@ -0,0 +1,939 @@
+/*
+ * 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.activemq.artemis.utils.collections;
+
+import java.nio.ByteBuffer;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import io.netty.buffer.ByteBuf;
+import org.apache.activemq.artemis.api.core.ActiveMQPropertyConversionException;
+import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.logs.ActiveMQUtilBundle;
+import org.apache.activemq.artemis.utils.ByteUtil;
+import org.apache.activemq.artemis.utils.DataConstants;
+
+import static org.apache.activemq.artemis.utils.DataConstants.BOOLEAN;
+import static org.apache.activemq.artemis.utils.DataConstants.BYTE;
+import static org.apache.activemq.artemis.utils.DataConstants.BYTES;
+import static org.apache.activemq.artemis.utils.DataConstants.CHAR;
+import static org.apache.activemq.artemis.utils.DataConstants.DOUBLE;
+import static org.apache.activemq.artemis.utils.DataConstants.FLOAT;
+import static org.apache.activemq.artemis.utils.DataConstants.INT;
+import static org.apache.activemq.artemis.utils.DataConstants.LONG;
+import static org.apache.activemq.artemis.utils.DataConstants.NULL;
+import static org.apache.activemq.artemis.utils.DataConstants.SHORT;
+import static org.apache.activemq.artemis.utils.DataConstants.STRING;
+
+/**
+ * Property Value Conversion.
+ * <p>
+ * This implementation follows section 3.5.4 of the <i>Java Message Service</i> specification
+ * (Version 1.1 April 12, 2002).
+ * <p>
+ */
+public class TypedProperties {
+
+ private static final SimpleString AMQ_PROPNAME = new SimpleString("_AMQ_");
+
+ private Map<SimpleString, PropertyValue> properties;
+
+ private volatile int size;
+
+ private boolean internalProperties;
+
+ public TypedProperties() {
+ }
+
+ /**
+ * Return the number of properites
+ * */
+ public int size() {
+ return properties.size();
+ }
+
+ public int getMemoryOffset() {
+ // The estimate is basically the encode size + 2 object references for each entry in the map
+ // Note we don't include the attributes or anything else since they already included in the memory estimate
+ // of the ServerMessage
+
+ return properties == null ? 0 : size + 2 * DataConstants.SIZE_INT * properties.size();
+ }
+
+ public TypedProperties(final TypedProperties other) {
+ properties = other.properties == null ? null : new HashMap<>(other.properties);
+ size = other.size;
+ }
+
+ public boolean hasInternalProperties() {
+ return internalProperties;
+ }
+
+ public void putBooleanProperty(final SimpleString key, final boolean value) {
+ checkCreateProperties();
+ doPutValue(key, new BooleanValue(value));
+ }
+
+ public void putByteProperty(final SimpleString key, final byte value) {
+ checkCreateProperties();
+ doPutValue(key, new ByteValue(value));
+ }
+
+ public void putBytesProperty(final SimpleString key, final byte[] value) {
+ checkCreateProperties();
+ doPutValue(key, value == null ? new NullValue() : new BytesValue(value));
+ }
+
+ public void putShortProperty(final SimpleString key, final short value) {
+ checkCreateProperties();
+ doPutValue(key, new ShortValue(value));
+ }
+
+ public void putIntProperty(final SimpleString key, final int value) {
+ checkCreateProperties();
+ doPutValue(key, new IntValue(value));
+ }
+
+ public void putLongProperty(final SimpleString key, final long value) {
+ checkCreateProperties();
+ doPutValue(key, new LongValue(value));
+ }
+
+ public void putFloatProperty(final SimpleString key, final float value) {
+ checkCreateProperties();
+ doPutValue(key, new FloatValue(value));
+ }
+
+ public void putDoubleProperty(final SimpleString key, final double value) {
+ checkCreateProperties();
+ doPutValue(key, new DoubleValue(value));
+ }
+
+ public void putSimpleStringProperty(final SimpleString key, final SimpleString value) {
+ checkCreateProperties();
+ doPutValue(key, value == null ? new NullValue() : new StringValue(value));
+ }
+
+ public void putNullValue(final SimpleString key) {
+ checkCreateProperties();
+ doPutValue(key, new NullValue());
+ }
+
+ public void putCharProperty(final SimpleString key, final char value) {
+ checkCreateProperties();
+ doPutValue(key, new CharValue(value));
+ }
+
+ public void putTypedProperties(final TypedProperties otherProps) {
+ if (otherProps == null || otherProps.properties == null) {
+ return;
+ }
+
+ checkCreateProperties();
+ Set<Entry<SimpleString, PropertyValue>> otherEntries = otherProps.properties.entrySet();
+ for (Entry<SimpleString, PropertyValue> otherEntry : otherEntries) {
+ doPutValue(otherEntry.getKey(), otherEntry.getValue());
+ }
+ }
+
+ public Object getProperty(final SimpleString key) {
+ return doGetProperty(key);
+ }
+
+ public Boolean getBooleanProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
+ Object value = doGetProperty(key);
+ if (value == null) {
+ return Boolean.valueOf(null);
+ } else if (value instanceof Boolean) {
+ return (Boolean) value;
+ } else if (value instanceof SimpleString) {
+ return Boolean.valueOf(((SimpleString) value).toString());
+ }
+ throw new ActiveMQPropertyConversionException("Invalid conversion: " + key);
+ }
+
+ public Byte getByteProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
+ Object value = doGetProperty(key);
+ if (value == null) {
+ return Byte.valueOf(null);
+ } else if (value instanceof Byte) {
+ return (Byte) value;
+ } else if (value instanceof SimpleString) {
+ return Byte.parseByte(((SimpleString) value).toString());
+ }
+ throw new ActiveMQPropertyConversionException("Invalid conversion: " + key);
+ }
+
+ public Character getCharProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
+ Object value = doGetProperty(key);
+ if (value == null) {
+ throw new NullPointerException("Invalid conversion: " + key);
+ }
+
+ if (value instanceof Character) {
+ return ((Character) value);
+ }
+ throw new ActiveMQPropertyConversionException("Invalid conversion: " + key);
+ }
+
+ public byte[] getBytesProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
+ Object value = doGetProperty(key);
+ if (value == null) {
+ return null;
+ } else if (value instanceof byte[]) {
+ return (byte[]) value;
+ }
+ throw new ActiveMQPropertyConversionException("Invalid conversion: " + key);
+ }
+
+ public Double getDoubleProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
+ Object value = doGetProperty(key);
+ if (value == null) {
+ return Double.valueOf(null);
+ } else if (value instanceof Float) {
+ return ((Float) value).doubleValue();
+ } else if (value instanceof Double) {
+ return (Double) value;
+ } else if (value instanceof SimpleString) {
+ return Double.parseDouble(((SimpleString) value).toString());
+ }
+ throw new ActiveMQPropertyConversionException("Invalid conversion: " + key);
+ }
+
+ public Integer getIntProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
+ Object value = doGetProperty(key);
+ if (value == null) {
+ return Integer.valueOf(null);
+ } else if (value instanceof Integer) {
+ return (Integer) value;
+ } else if (value instanceof Byte) {
+ return ((Byte) value).intValue();
+ } else if (value instanceof Short) {
+ return ((Short) value).intValue();
+ } else if (value instanceof SimpleString) {
+ return Integer.parseInt(((SimpleString) value).toString());
+ }
+ throw new ActiveMQPropertyConversionException("Invalid conversion: " + key);
+ }
+
+ public Long getLongProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
+ Object value = doGetProperty(key);
+ if (value == null) {
+ return Long.valueOf(null);
+ } else if (value instanceof Long) {
+ return (Long) value;
+ } else if (value instanceof Byte) {
+ return ((Byte) value).longValue();
+ } else if (value instanceof Short) {
+ return ((Short) value).longValue();
+ } else if (value instanceof Integer) {
+ return ((Integer) value).longValue();
+ } else if (value instanceof SimpleString) {
+ return Long.parseLong(((SimpleString) value).toString());
+ }
+ throw new ActiveMQPropertyConversionException("Invalid conversion: " + key);
+ }
+
+ public Short getShortProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
+ Object value = doGetProperty(key);
+ if (value == null) {
+ return Short.valueOf(null);
+ } else if (value instanceof Byte) {
+ return ((Byte) value).shortValue();
+ } else if (value instanceof Short) {
+ return (Short) value;
+ } else if (value instanceof SimpleString) {
+ return Short.parseShort(((SimpleString) value).toString());
+ }
+ throw new ActiveMQPropertyConversionException("Invalid conversion: " + key);
+ }
+
+ public Float getFloatProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
+ Object value = doGetProperty(key);
+ if (value == null)
+ return Float.valueOf(null);
+ if (value instanceof Float) {
+ return ((Float) value);
+ }
+ if (value instanceof SimpleString) {
+ return Float.parseFloat(((SimpleString) value).toString());
+ }
+ throw new ActiveMQPropertyConversionException("Invalid conversion: " + key);
+ }
+
+ public SimpleString getSimpleStringProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
+ Object value = doGetProperty(key);
+
+ if (value == null) {
+ return null;
+ }
+
+ if (value instanceof SimpleString) {
+ return (SimpleString) value;
+ } else if (value instanceof Boolean) {
+ return new SimpleString(value.toString());
+ } else if (value instanceof Character) {
+ return new SimpleString(value.toString());
+ } else if (value instanceof Byte) {
+ return new SimpleString(value.toString());
+ } else if (value instanceof Short) {
+ return new SimpleString(value.toString());
+ } else if (value instanceof Integer) {
+ return new SimpleString(value.toString());
+ } else if (value instanceof Long) {
+ return new SimpleString(value.toString());
+ } else if (value instanceof Float) {
+ return new SimpleString(value.toString());
+ } else if (value instanceof Double) {
+ return new SimpleString(value.toString());
+ }
+ throw new ActiveMQPropertyConversionException("Invalid conversion: " + key);
+ }
+
+ public Object removeProperty(final SimpleString key) {
+ return doRemoveProperty(key);
+ }
+
+ public boolean containsProperty(final SimpleString key) {
+ if (size == 0) {
+ return false;
+
+ } else {
+ return properties.containsKey(key);
+ }
+ }
+
+ public Set<SimpleString> getPropertyNames() {
+ if (size == 0) {
+ return Collections.emptySet();
+ } else {
+ return properties.keySet();
+ }
+ }
+
+ public synchronized void decode(final ByteBuf buffer) {
+ byte b = buffer.readByte();
+
+ if (b == DataConstants.NULL) {
+ properties = null;
+ } else {
+ int numHeaders = buffer.readInt();
+
+ properties = new HashMap<>(numHeaders);
+ size = 0;
+
+ for (int i = 0; i < numHeaders; i++) {
+ int len = buffer.readInt();
+ byte[] data = new byte[len];
+ buffer.readBytes(data);
+ SimpleString key = new SimpleString(data);
+
+ byte type = buffer.readByte();
+
+ PropertyValue val;
+
+ switch (type) {
+ case NULL: {
+ val = new NullValue();
+ doPutValue(key, val);
+ break;
+ }
+ case CHAR: {
+ val = new CharValue(buffer);
+ doPutValue(key, val);
+ break;
+ }
+ case BOOLEAN: {
+ val = new BooleanValue(buffer);
+ doPutValue(key, val);
+ break;
+ }
+ case BYTE: {
+ val = new ByteValue(buffer);
+ doPutValue(key, val);
+ break;
+ }
+ case BYTES: {
+ val = new BytesValue(buffer);
+ doPutValue(key, val);
+ break;
+ }
+ case SHORT: {
+ val = new ShortValue(buffer);
+ doPutValue(key, val);
+ break;
+ }
+ case INT: {
+ val = new IntValue(buffer);
+ doPutValue(key, val);
+ break;
+ }
+ case LONG: {
+ val = new LongValue(buffer);
+ doPutValue(key, val);
+ break;
+ }
+ case FLOAT: {
+ val = new FloatValue(buffer);
+ doPutValue(key, val);
+ break;
+ }
+ case DOUBLE: {
+ val = new DoubleValue(buffer);
+ doPutValue(key, val);
+ break;
+ }
+ case STRING: {
+ val = new StringValue(buffer);
+ doPutValue(key, val);
+ break;
+ }
+ default: {
+ throw ActiveMQUtilBundle.BUNDLE.invalidType(type);
+ }
+ }
+ }
+ }
+ }
+
+ public synchronized void encode(final ByteBuf buffer) {
+ if (properties == null) {
+ buffer.writeByte(DataConstants.NULL);
+ } else {
+ buffer.writeByte(DataConstants.NOT_NULL);
+
+ buffer.writeInt(properties.size());
+
+ for (Map.Entry<SimpleString, PropertyValue> entry : properties.entrySet()) {
+ SimpleString s = entry.getKey();
+ byte[] data = s.getData();
+ buffer.writeInt(data.length);
+ buffer.writeBytes(data);
+
+ entry.getValue().write(buffer);
+ }
+ }
+ }
+
+ public int getEncodeSize() {
+ if (properties == null) {
+ return DataConstants.SIZE_BYTE;
+ } else {
+ return DataConstants.SIZE_BYTE + DataConstants.SIZE_INT + size;
+ }
+ }
+
+ public void clear() {
+ if (properties != null) {
+ properties.clear();
+ }
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder("TypedProperties[");
+
+ if (properties != null) {
+
+ Iterator<Entry<SimpleString, PropertyValue>> iter = properties.entrySet().iterator();
+
+ while (iter.hasNext()) {
+ Entry<SimpleString, PropertyValue> iterItem = iter.next();
+ sb.append(iterItem.getKey() + "=");
+
+ // it seems weird but it's right!!
+ // The first getValue is from the EntrySet
+ // The second is to convert the PropertyValue into the actual value
+ Object theValue = iterItem.getValue().getValue();
+
+ if (theValue == null) {
+ sb.append("NULL-value");
+ } else if (theValue instanceof byte[]) {
+ sb.append("[" + ByteUtil.maxString(ByteUtil.bytesToHex((byte[]) theValue, 2), 150) + ")");
+
+ if (iterItem.getKey().toString().startsWith("_AMQ_ROUTE_TO")) {
+ sb.append(",bytesAsLongs(");
+ try {
+ ByteBuffer buff = ByteBuffer.wrap((byte[]) theValue);
+ while (buff.hasRemaining()) {
+ long bindingID = buff.getLong();
+ sb.append(bindingID);
+ if (buff.hasRemaining()) {
+ sb.append(",");
+ }
+ }
+ } catch (Throwable e) {
+ sb.append("error-converting-longs=" + e.getMessage());
+ }
+ sb.append("]");
+ }
+ } else {
+ sb.append(theValue.toString());
+ }
+
+ if (iter.hasNext()) {
+ sb.append(",");
+ }
+ }
+ }
+
+ return sb.append("]").toString();
+ }
+
+ // Private ------------------------------------------------------------------------------------
+
+ private void checkCreateProperties() {
+ if (properties == null) {
+ properties = new HashMap<>();
+ }
+ }
+
+ private synchronized void doPutValue(final SimpleString key, final PropertyValue value) {
+ if (key.startsWith(AMQ_PROPNAME)) {
+ internalProperties = true;
+ }
+
+ PropertyValue oldValue = properties.put(key, value);
+ if (oldValue != null) {
+ size += value.encodeSize() - oldValue.encodeSize();
+ } else {
+ size += SimpleString.sizeofString(key) + value.encodeSize();
+ }
+ }
+
+ private synchronized Object doRemoveProperty(final SimpleString key) {
+ if (properties == null) {
+ return null;
+ }
+
+ PropertyValue val = properties.remove(key);
+
+ if (val == null) {
+ return null;
+ } else {
+ size -= SimpleString.sizeofString(key) + val.encodeSize();
+
+ return val.getValue();
+ }
+ }
+
+ private synchronized Object doGetProperty(final Object key) {
+ if (size == 0) {
+ return null;
+ }
+
+ PropertyValue val = properties.get(key);
+
+ if (val == null) {
+ return null;
+ } else {
+ return val.getValue();
+ }
+ }
+
+ // Inner classes ------------------------------------------------------------------------------
+
+ private abstract static class PropertyValue {
+
+ abstract Object getValue();
+
+ abstract void write(ByteBuf buffer);
+
+ abstract int encodeSize();
+
+ @Override
+ public String toString() {
+ return "" + getValue();
+ }
+ }
+
+ private static final class NullValue extends PropertyValue {
+
+ private NullValue() {
+ }
+
+ @Override
+ public Object getValue() {
+ return null;
+ }
+
+ @Override
+ public void write(final ByteBuf buffer) {
+ buffer.writeByte(DataConstants.NULL);
+ }
+
+ @Override
+ public int encodeSize() {
+ return DataConstants.SIZE_BYTE;
+ }
+
+ }
+
+ private static final class BooleanValue extends PropertyValue {
+
+ final boolean val;
+
+ private BooleanValue(final boolean val) {
+ this.val = val;
+ }
+
+ private BooleanValue(final ByteBuf buffer) {
+ val = buffer.readBoolean();
+ }
+
+ @Override
+ public Object getValue() {
+ return val;
+ }
+
+ @Override
+ public void write(final ByteBuf buffer) {
+ buffer.writeByte(DataConstants.BOOLEAN);
+ buffer.writeBoolean(val);
+ }
+
+ @Override
+ public int encodeSize() {
+ return DataConstants.SIZE_BYTE + DataConstants.SIZE_BOOLEAN;
+ }
+
+ }
+
+ private static final class ByteValue extends PropertyValue {
+
+ final byte val;
+
+ private ByteValue(final byte val) {
+ this.val = val;
+ }
+
+ private ByteValue(final ByteBuf buffer) {
+ val = buffer.readByte();
+ }
+
+ @Override
+ public Object getValue() {
+ return val;
+ }
+
+ @Override
+ public void write(final ByteBuf buffer) {
+ buffer.writeByte(DataConstants.BYTE);
+ buffer.writeByte(val);
+ }
+
+ @Override
+ public int encodeSize() {
+ return DataConstants.SIZE_BYTE + DataConstants.SIZE_BYTE;
+ }
+ }
+
+ private static final class BytesValue extends PropertyValue {
+
+ final byte[] val;
+
+ private BytesValue(final byte[] val) {
+ this.val = val;
+ }
+
+ private BytesValue(final ByteBuf buffer) {
+ int len = buffer.readInt();
+ val = new byte[len];
+ buffer.readBytes(val);
+ }
+
+ @Override
+ public Object getValue() {
+ return val;
+ }
+
+ @Override
+ public void write(final ByteBuf buffer) {
+ buffer.writeByte(DataConstants.BYTES);
+ buffer.writeInt(val.length);
+ buffer.writeBytes(val);
+ }
+
+ @Override
+ public int encodeSize() {
+ return DataConstants.SIZE_BYTE + DataConstants.SIZE_INT + val.length;
+ }
+
+ }
+
+ private static final class ShortValue extends PropertyValue {
+
+ final short val;
+
+ private ShortValue(final short val) {
+ this.val = val;
+ }
+
+ private ShortValue(final ByteBuf buffer) {
+ val = buffer.readShort();
+ }
+
+ @Override
+ public Object getValue() {
+ return val;
+ }
+
+ @Override
+ public void write(final ByteBuf buffer) {
+ buffer.writeByte(DataConstants.SHORT);
+ buffer.writeShort(val);
+ }
+
+ @Override
+ public int encodeSize() {
+ return DataConstants.SIZE_BYTE + DataConstants.SIZE_SHORT;
+ }
+ }
+
+ private static final class IntValue extends PropertyValue {
+
+ final int val;
+
+ private IntValue(final int val) {
+ this.val = val;
+ }
+
+ private IntValue(final ByteBuf buffer) {
+ val = buffer.readInt();
+ }
+
+ @Override
+ public Object getValue() {
+ return val;
+ }
+
+ @Override
+ public void write(final ByteBuf buffer) {
+ buffer.writeByte(DataConstants.INT);
+ buffer.writeInt(val);
+ }
+
+ @Override
+ public int encodeSize() {
+ return DataConstants.SIZE_BYTE + DataConstants.SIZE_INT;
+ }
+ }
+
+ private static final class LongValue extends PropertyValue {
+
+ final long val;
+
+ private LongValue(final long val) {
+ this.val = val;
+ }
+
+ private LongValue(final ByteBuf buffer) {
+ val = buffer.readLong();
+ }
+
+ @Override
+ public Object getValue() {
+ return val;
+ }
+
+ @Override
+ public void write(final ByteBuf buffer) {
+ buffer.writeByte(DataConstants.LONG);
+ buffer.writeLong(val);
+ }
+
+ @Override
+ public int encodeSize() {
+ return DataConstants.SIZE_BYTE + DataConstants.SIZE_LONG;
+ }
+ }
+
+ private static final class FloatValue extends PropertyValue {
+
+ final float val;
+
+ private FloatValue(final float val) {
+ this.val = val;
+ }
+
+ private FloatValue(final ByteBuf buffer) {
+ val = Float.intBitsToFloat(buffer.readInt());
+ }
+
+ @Override
+ public Object getValue() {
+ return val;
+ }
+
+ @Override
+ public void write(final ByteBuf buffer) {
+ buffer.writeByte(DataConstants.FLOAT);
+ buffer.writeInt(Float.floatToIntBits(val));
+ }
+
+ @Override
+ public int encodeSize() {
+ return DataConstants.SIZE_BYTE + DataConstants.SIZE_FLOAT;
+ }
+
+ }
+
+ private static final class DoubleValue extends PropertyValue {
+
+ final double val;
+
+ private DoubleValue(final double val) {
+ this.val = val;
+ }
+
+ private DoubleValue(final ByteBuf buffer) {
+ val = Double.longBitsToDouble(buffer.readLong());
+ }
+
+ @Override
+ public Object getValue() {
+ return val;
+ }
+
+ @Override
+ public void write(final ByteBuf buffer) {
+ buffer.writeByte(DataConstants.DOUBLE);
+ buffer.writeLong(Double.doubleToLongBits(val));
+ }
+
+ @Override
+ public int encodeSize() {
+ return DataConstants.SIZE_BYTE + DataConstants.SIZE_DOUBLE;
+ }
+ }
+
+ private static final class CharValue extends PropertyValue {
+
+ final char val;
+
+ private CharValue(final char val) {
+ this.val = val;
+ }
+
+ private CharValue(final ByteBuf buffer) {
+ val = (char) buffer.readShort();
+ }
+
+ @Override
+ public Object getValue() {
+ return val;
+ }
+
+ @Override
+ public void write(final ByteBuf buffer) {
+ buffer.writeByte(DataConstants.CHAR);
+ buffer.writeShort((short) val);
+ }
+
+ @Override
+ public int encodeSize() {
+ return DataConstants.SIZE_BYTE + DataConstants.SIZE_CHAR;
+ }
+ }
+
+ private static final class StringValue extends PropertyValue {
+
+ final SimpleString val;
+
+ private StringValue(final SimpleString val) {
+ this.val = val;
+ }
+
+ private StringValue(final ByteBuf buffer) {
+ val = SimpleString.readSimpleString(buffer);
+ }
+
+ @Override
+ public Object getValue() {
+ return val;
+ }
+
+ @Override
+ public void write(final ByteBuf buffer) {
+ buffer.writeByte(DataConstants.STRING);
+ SimpleString.writeSimpleString(buffer, val);
+ }
+
+ @Override
+ public int encodeSize() {
+ return DataConstants.SIZE_BYTE + SimpleString.sizeofString(val);
+ }
+ }
+
+ public boolean isEmpty() {
+ return properties.isEmpty();
+ }
+
+ public Map<String, Object> getMap() {
+ Map<String, Object> m = new HashMap<>();
+ for (Entry<SimpleString, PropertyValue> entry : properties.entrySet()) {
+ Object val = entry.getValue().getValue();
+ if (val instanceof SimpleString) {
+ m.put(entry.getKey().toString(), ((SimpleString) val).toString());
+ } else {
+ m.put(entry.getKey().toString(), val);
+ }
+ }
+ return m;
+ }
+
+ /**
+ * Helper for MapMessage#setObjectProperty(String, Object)
+ *
+ * @param key The SimpleString key
+ * @param value The Object value
+ * @param properties The typed properties
+ */
+ public static void setObjectProperty(final SimpleString key, final Object value, final TypedProperties properties) {
+ if (value == null) {
+ properties.putNullValue(key);
+ } else if (value instanceof Boolean) {
+ properties.putBooleanProperty(key, (Boolean) value);
+ } else if (value instanceof Byte) {
+ properties.putByteProperty(key, (Byte) value);
+ } else if (value instanceof Character) {
+ properties.putCharProperty(key, (Character) value);
+ } else if (value instanceof Short) {
+ properties.putShortProperty(key, (Short) value);
+ } else if (value instanceof Integer) {
+ properties.putIntProperty(key, (Integer) value);
+ } else if (value instanceof Long) {
+ properties.putLongProperty(key, (Long) value);
+ } else if (value instanceof Float) {
+ properties.putFloatProperty(key, (Float) value);
+ } else if (value instanceof Double) {
+ properties.putDoubleProperty(key, (Double) value);
+ } else if (value instanceof String) {
+ properties.putSimpleStringProperty(key, new SimpleString((String) value));
+ } else if (value instanceof SimpleString) {
+ properties.putSimpleStringProperty(key, (SimpleString) value);
+ } else if (value instanceof byte[]) {
+ properties.putBytesProperty(key, (byte[]) value);
+ } else {
+ throw new ActiveMQPropertyConversionException(value.getClass() + " is not a valid property type");
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/uri/FluentPropertyBeanIntrospectorWithIgnores.java
----------------------------------------------------------------------
diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/uri/FluentPropertyBeanIntrospectorWithIgnores.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/uri/FluentPropertyBeanIntrospectorWithIgnores.java
index 7df9131..ad56353 100644
--- a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/uri/FluentPropertyBeanIntrospectorWithIgnores.java
+++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/uri/FluentPropertyBeanIntrospectorWithIgnores.java
@@ -23,7 +23,7 @@ import java.lang.reflect.Method;
import java.util.Locale;
import org.apache.activemq.artemis.api.core.Pair;
-import org.apache.activemq.artemis.utils.ConcurrentHashSet;
+import org.apache.activemq.artemis.utils.collections.ConcurrentHashSet;
import org.apache.commons.beanutils.FluentPropertyBeanIntrospector;
import org.apache.commons.beanutils.IntrospectionContext;
import org.jboss.logging.Logger;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/ConcurrentHashSetTest.java
----------------------------------------------------------------------
diff --git a/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/ConcurrentHashSetTest.java b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/ConcurrentHashSetTest.java
index 4055801..8e0c8c8 100644
--- a/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/ConcurrentHashSetTest.java
+++ b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/ConcurrentHashSetTest.java
@@ -18,6 +18,8 @@ package org.apache.activemq.artemis.utils;
import java.util.Iterator;
+import org.apache.activemq.artemis.utils.collections.ConcurrentHashSet;
+import org.apache.activemq.artemis.utils.collections.ConcurrentSet;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TypedPropertiesConversionTest.java
----------------------------------------------------------------------
diff --git a/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TypedPropertiesConversionTest.java b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TypedPropertiesConversionTest.java
index cec3959..5391724 100644
--- a/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TypedPropertiesConversionTest.java
+++ b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TypedPropertiesConversionTest.java
@@ -18,6 +18,7 @@ package org.apache.activemq.artemis.utils;
import org.apache.activemq.artemis.api.core.ActiveMQPropertyConversionException;
import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.utils.collections.TypedProperties;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TypedPropertiesTest.java
----------------------------------------------------------------------
diff --git a/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TypedPropertiesTest.java b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TypedPropertiesTest.java
index cb6c8fe..38144c9 100644
--- a/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TypedPropertiesTest.java
+++ b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TypedPropertiesTest.java
@@ -21,6 +21,7 @@ import java.util.Iterator;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.ActiveMQBuffers;
import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.utils.collections.TypedProperties;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientConsumerImpl.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientConsumerImpl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientConsumerImpl.java
index 82af968..0ff971d 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientConsumerImpl.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientConsumerImpl.java
@@ -40,10 +40,10 @@ import org.apache.activemq.artemis.spi.core.remoting.ConsumerContext;
import org.apache.activemq.artemis.spi.core.remoting.SessionContext;
import org.apache.activemq.artemis.utils.ByteUtil;
import org.apache.activemq.artemis.utils.FutureLatch;
-import org.apache.activemq.artemis.utils.PriorityLinkedList;
-import org.apache.activemq.artemis.utils.PriorityLinkedListImpl;
import org.apache.activemq.artemis.utils.ReusableLatch;
import org.apache.activemq.artemis.utils.TokenBucketLimiter;
+import org.apache.activemq.artemis.utils.collections.PriorityLinkedList;
+import org.apache.activemq.artemis.utils.collections.PriorityLinkedListImpl;
import org.jboss.logging.Logger;
public final class ClientConsumerImpl implements ClientConsumerInternal {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientMessageImpl.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientMessageImpl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientMessageImpl.java
index 252ae86..91fb6ca 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientMessageImpl.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientMessageImpl.java
@@ -31,8 +31,8 @@ import org.apache.activemq.artemis.core.client.ActiveMQClientMessageBundle;
import org.apache.activemq.artemis.core.message.LargeBodyEncoder;
import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.reader.MessageUtil;
-import org.apache.activemq.artemis.utils.TypedProperties;
import org.apache.activemq.artemis.utils.UUID;
+import org.apache.activemq.artemis.utils.collections.TypedProperties;
/**
* A ClientMessageImpl
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientMessageInternal.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientMessageInternal.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientMessageInternal.java
index 4b87878..1a7fe07 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientMessageInternal.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientMessageInternal.java
@@ -17,7 +17,7 @@
package org.apache.activemq.artemis.core.client.impl;
import org.apache.activemq.artemis.api.core.client.ClientMessage;
-import org.apache.activemq.artemis.utils.TypedProperties;
+import org.apache.activemq.artemis.utils.collections.TypedProperties;
public interface ClientMessageInternal extends ClientMessage {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientSessionFactoryImpl.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientSessionFactoryImpl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientSessionFactoryImpl.java
index addbbbd..8f6a5ea 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientSessionFactoryImpl.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientSessionFactoryImpl.java
@@ -62,11 +62,11 @@ import org.apache.activemq.artemis.spi.core.remoting.ConnectorFactory;
import org.apache.activemq.artemis.spi.core.remoting.SessionContext;
import org.apache.activemq.artemis.spi.core.remoting.TopologyResponseHandler;
import org.apache.activemq.artemis.utils.ClassloadingUtil;
-import org.apache.activemq.artemis.utils.ConcurrentHashSet;
import org.apache.activemq.artemis.utils.ConfirmationWindowWarning;
import org.apache.activemq.artemis.utils.ExecutorFactory;
import org.apache.activemq.artemis.utils.OrderedExecutorFactory;
import org.apache.activemq.artemis.utils.UUIDGenerator;
+import org.apache.activemq.artemis.utils.collections.ConcurrentHashSet;
import org.jboss.logging.Logger;
public class ClientSessionFactoryImpl implements ClientSessionFactoryInternal, ClientConnectionLifeCycleListener {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/cluster/DiscoveryGroup.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/cluster/DiscoveryGroup.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/cluster/DiscoveryGroup.java
index 7c40602..282932d 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/cluster/DiscoveryGroup.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/cluster/DiscoveryGroup.java
@@ -35,7 +35,7 @@ import org.apache.activemq.artemis.core.client.ActiveMQClientLogger;
import org.apache.activemq.artemis.core.server.ActiveMQComponent;
import org.apache.activemq.artemis.core.server.management.Notification;
import org.apache.activemq.artemis.core.server.management.NotificationService;
-import org.apache.activemq.artemis.utils.TypedProperties;
+import org.apache.activemq.artemis.utils.collections.TypedProperties;
import org.jboss.logging.Logger;
/**
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessage.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessage.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessage.java
index 215c268..369de7d 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessage.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessage.java
@@ -39,8 +39,8 @@ import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl;
import org.apache.activemq.artemis.reader.MessageUtil;
import org.apache.activemq.artemis.utils.DataConstants;
-import org.apache.activemq.artemis.utils.TypedProperties;
import org.apache.activemq.artemis.utils.UUID;
+import org.apache.activemq.artemis.utils.collections.TypedProperties;
import org.jboss.logging.Logger;
/** Note: you shouldn't change properties using multi-threads. Change your properties before you can send it to multiple
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/server/management/Notification.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/server/management/Notification.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/server/management/Notification.java
index ae1f91d..1bdc52a 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/server/management/Notification.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/server/management/Notification.java
@@ -17,7 +17,7 @@
package org.apache.activemq.artemis.core.server.management;
import org.apache.activemq.artemis.api.core.management.NotificationType;
-import org.apache.activemq.artemis.utils.TypedProperties;
+import org.apache.activemq.artemis.utils.collections.TypedProperties;
/**
* A Notification
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-core-client/src/main/java/org/apache/activemq/artemis/reader/MapMessageUtil.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/reader/MapMessageUtil.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/reader/MapMessageUtil.java
index 8560f5d..52f8be5 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/reader/MapMessageUtil.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/reader/MapMessageUtil.java
@@ -17,7 +17,7 @@
package org.apache.activemq.artemis.reader;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
-import org.apache.activemq.artemis.utils.TypedProperties;
+import org.apache.activemq.artemis.utils.collections.TypedProperties;
public class MapMessageUtil extends MessageUtil {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/LinkedList.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/LinkedList.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/LinkedList.java
deleted file mode 100644
index fd64aaf..0000000
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/LinkedList.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.activemq.artemis.utils;
-
-public interface LinkedList<E> {
-
- void addHead(E e);
-
- void addTail(E e);
-
- E poll();
-
- LinkedListIterator<E> iterator();
-
- void clear();
-
- int size();
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/LinkedListImpl.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/LinkedListImpl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/LinkedListImpl.java
deleted file mode 100644
index f0d2945..0000000
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/LinkedListImpl.java
+++ /dev/null
@@ -1,390 +0,0 @@
-/*
- * 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.activemq.artemis.utils;
-
-import java.lang.reflect.Array;
-import java.util.NoSuchElementException;
-
-/**
- * A linked list implementation which allows multiple iterators to exist at the same time on the queue, and which see any
- * elements added or removed from the queue either directly or via iterators.
- *
- * This class is not thread safe.
- */
-public class LinkedListImpl<E> implements LinkedList<E> {
-
- private static final int INITIAL_ITERATOR_ARRAY_SIZE = 10;
-
- private final Node<E> head = new Node<>(null);
-
- private Node<E> tail = null;
-
- private int size;
-
- // We store in an array rather than a Map for the best performance
- private volatile Iterator[] iters;
-
- private int numIters;
-
- private int nextIndex;
-
- public LinkedListImpl() {
- iters = createIteratorArray(INITIAL_ITERATOR_ARRAY_SIZE);
- }
-
- @Override
- public void addHead(E e) {
- Node<E> node = new Node<>(e);
-
- node.next = head.next;
-
- node.prev = head;
-
- head.next = node;
-
- if (size == 0) {
- tail = node;
- } else {
- // Need to set the previous element on the former head
- node.next.prev = node;
- }
-
- size++;
- }
-
- @Override
- public void addTail(E e) {
- if (size == 0) {
- addHead(e);
- } else {
- Node<E> node = new Node<>(e);
-
- node.prev = tail;
-
- tail.next = node;
-
- tail = node;
-
- size++;
- }
- }
-
- @Override
- public E poll() {
- Node<E> ret = head.next;
-
- if (ret != null) {
- removeAfter(head);
-
- return ret.val;
- } else {
- return null;
- }
- }
-
- @Override
- public void clear() {
- tail = head.next = null;
-
- size = 0;
- }
-
- @Override
- public int size() {
- return size;
- }
-
- @Override
- public LinkedListIterator<E> iterator() {
- return new Iterator();
- }
-
- @Override
- public String toString() {
- StringBuilder str = new StringBuilder("LinkedListImpl [ ");
-
- Node<E> node = head;
-
- while (node != null) {
- str.append(node.toString());
-
- if (node.next != null) {
- str.append(", ");
- }
-
- node = node.next;
- }
-
- return str.toString();
- }
-
- public int numIters() {
- return numIters;
- }
-
- private Iterator[] createIteratorArray(int size) {
- return (Iterator[]) Array.newInstance(Iterator.class, size);
- }
-
- private void removeAfter(Node<E> node) {
- Node<E> toRemove = node.next;
-
- node.next = toRemove.next;
-
- if (toRemove.next != null) {
- toRemove.next.prev = node;
- }
-
- if (toRemove == tail) {
- tail = node;
- }
-
- size--;
-
- if (toRemove.iterCount != 0) {
- LinkedListImpl.this.nudgeIterators(toRemove);
- }
-
- //Help GC - otherwise GC potentially has to traverse a very long list to see if elements are reachable, this can result in OOM
- //https://jira.jboss.org/browse/HORNETQ-469
- toRemove.next = toRemove.prev = null;
- }
-
- private synchronized void nudgeIterators(Node<E> node) {
- for (int i = 0; i < numIters; i++) {
- Iterator iter = iters[i];
- if (iter != null) {
- iter.nudged(node);
- }
- }
- }
-
- private synchronized void addIter(Iterator iter) {
- if (numIters == iters.length) {
- resize(2 * numIters);
- }
-
- iters[nextIndex++] = iter;
-
- numIters++;
- }
-
- private synchronized void resize(int newSize) {
- Iterator[] newIters = createIteratorArray(newSize);
-
- System.arraycopy(iters, 0, newIters, 0, numIters);
-
- iters = newIters;
- }
-
- private synchronized void removeIter(Iterator iter) {
- for (int i = 0; i < numIters; i++) {
- if (iter == iters[i]) {
- iters[i] = null;
-
- if (i != numIters - 1) {
- // Fill in the hole
-
- System.arraycopy(iters, i + 1, iters, i, numIters - i - 1);
- }
-
- numIters--;
-
- if (numIters >= INITIAL_ITERATOR_ARRAY_SIZE && numIters == iters.length / 2) {
- resize(numIters);
- }
-
- nextIndex--;
-
- return;
- }
- }
-
- throw new IllegalStateException("Cannot find iter to remove");
- }
-
- private static final class Node<E> {
-
- Node<E> next;
-
- Node<E> prev;
-
- final E val;
-
- int iterCount;
-
- Node(E e) {
- val = e;
- }
-
- @Override
- public String toString() {
- return "Node, value = " + val;
- }
- }
-
- private class Iterator implements LinkedListIterator<E> {
-
- Node<E> last;
-
- Node<E> current = head.next;
-
- boolean repeat;
-
- Iterator() {
- if (current != null) {
- current.iterCount++;
- }
-
- addIter(this);
- }
-
- @Override
- public void repeat() {
- repeat = true;
- }
-
- @Override
- public boolean hasNext() {
- Node<E> e = getNode();
-
- if (e != null && (e != last || repeat)) {
- return true;
- }
-
- return canAdvance();
- }
-
- @Override
- public E next() {
- Node<E> e = getNode();
-
- if (repeat) {
- repeat = false;
-
- if (e != null) {
- return e.val;
- } else {
- if (canAdvance()) {
- advance();
-
- e = getNode();
-
- return e.val;
- } else {
- throw new NoSuchElementException();
- }
- }
- }
-
- if (e == null || e == last) {
- if (canAdvance()) {
- advance();
-
- e = getNode();
- } else {
- throw new NoSuchElementException();
- }
- }
-
- last = e;
-
- repeat = false;
-
- return e.val;
- }
-
- @Override
- public void remove() {
- if (last == null) {
- throw new NoSuchElementException();
- }
-
- if (current == null) {
- throw new NoSuchElementException();
- }
-
- LinkedListImpl.this.removeAfter(current.prev);
-
- last = null;
- }
-
- @Override
- public void close() {
- removeIter(this);
- }
-
- public void nudged(Node<E> node) {
- if (current == node) {
- if (canAdvance()) {
- advance();
- } else {
- if (current.prev != head) {
- current.iterCount--;
-
- current = current.prev;
-
- current.iterCount++;
- } else {
- current = null;
- }
- }
- }
- }
-
- private Node<E> getNode() {
- if (current == null) {
- current = head.next;
-
- if (current != null) {
- current.iterCount++;
- }
- }
-
- if (current != null) {
- return current;
- } else {
- return null;
- }
- }
-
- private boolean canAdvance() {
- if (current == null) {
- current = head.next;
-
- if (current != null) {
- current.iterCount++;
- }
- }
-
- return current != null && current.next != null;
- }
-
- private void advance() {
- if (current == null || current.next == null) {
- throw new NoSuchElementException();
- }
-
- current.iterCount--;
-
- current = current.next;
-
- current.iterCount++;
- }
-
- }
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/LinkedListIterator.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/LinkedListIterator.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/LinkedListIterator.java
deleted file mode 100644
index 10700e5..0000000
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/LinkedListIterator.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.activemq.artemis.utils;
-
-import java.util.Iterator;
-
-/**
- * A LinkedListIterator
- *
- * This iterator allows the last element to be repeated in the next call to hasNext or next
- */
-public interface LinkedListIterator<E> extends Iterator<E>, AutoCloseable {
-
- void repeat();
-
- @Override
- void close();
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/PriorityLinkedList.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/PriorityLinkedList.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/PriorityLinkedList.java
deleted file mode 100644
index 450f58a..0000000
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/PriorityLinkedList.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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.activemq.artemis.utils;
-
-/**
- * A type of linked list which maintains items according to a priority
- * and allows adding and removing of elements at both ends, and peeking
- */
-public interface PriorityLinkedList<T> {
-
- void addHead(T t, int priority);
-
- void addTail(T t, int priority);
-
- T poll();
-
- void clear();
-
- int size();
-
- LinkedListIterator<T> iterator();
-
- boolean isEmpty();
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/PriorityLinkedListImpl.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/PriorityLinkedListImpl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/PriorityLinkedListImpl.java
deleted file mode 100644
index 427a927..0000000
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/utils/PriorityLinkedListImpl.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * 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.activemq.artemis.utils;
-
-import java.lang.reflect.Array;
-import java.util.NoSuchElementException;
-
-/**
- * A priority linked list implementation
- * <p>
- * It implements this by maintaining an individual LinkedBlockingDeque for each priority level.
- */
-public class PriorityLinkedListImpl<T> implements PriorityLinkedList<T> {
-
- protected LinkedListImpl<T>[] levels;
-
- private int size;
-
- private int lastReset;
-
- private int highestPriority = -1;
-
- private int lastPriority = -1;
-
- public PriorityLinkedListImpl(final int priorities) {
- levels = (LinkedListImpl<T>[]) Array.newInstance(LinkedListImpl.class, priorities);
-
- for (int i = 0; i < priorities; i++) {
- levels[i] = new LinkedListImpl<>();
- }
- }
-
- private void checkHighest(final int priority) {
- if (lastPriority != priority || priority > highestPriority) {
- lastPriority = priority;
- if (lastReset == Integer.MAX_VALUE) {
- lastReset = 0;
- } else {
- lastReset++;
- }
- }
-
- if (priority > highestPriority) {
- highestPriority = priority;
- }
- }
-
- @Override
- public void addHead(final T t, final int priority) {
- checkHighest(priority);
-
- levels[priority].addHead(t);
-
- size++;
- }
-
- @Override
- public void addTail(final T t, final int priority) {
- checkHighest(priority);
-
- levels[priority].addTail(t);
-
- size++;
- }
-
- @Override
- public T poll() {
- T t = null;
-
- // We are just using a simple prioritization algorithm:
- // Highest priority refs always get returned first.
- // This could cause starvation of lower priority refs.
-
- // TODO - A better prioritization algorithm
-
- for (int i = highestPriority; i >= 0; i--) {
- LinkedListImpl<T> ll = levels[i];
-
- if (ll.size() != 0) {
- t = ll.poll();
-
- if (t != null) {
- size--;
-
- if (ll.size() == 0) {
- if (highestPriority == i) {
- highestPriority--;
- }
- }
- }
-
- break;
- }
- }
-
- return t;
- }
-
- @Override
- public void clear() {
- for (LinkedListImpl<T> list : levels) {
- list.clear();
- }
-
- size = 0;
- }
-
- @Override
- public int size() {
- return size;
- }
-
- @Override
- public boolean isEmpty() {
- return size == 0;
- }
-
- @Override
- public LinkedListIterator<T> iterator() {
- return new PriorityLinkedListIterator();
- }
-
- private class PriorityLinkedListIterator implements LinkedListIterator<T> {
-
- private int index;
-
- private final LinkedListIterator<T>[] cachedIters = new LinkedListIterator[levels.length];
-
- private LinkedListIterator<T> lastIter;
-
- private int resetCount = lastReset;
-
- volatile boolean closed = false;
-
- PriorityLinkedListIterator() {
- index = levels.length - 1;
- }
-
- @Override
- protected void finalize() {
- close();
- }
-
- @Override
- public void repeat() {
- if (lastIter == null) {
- throw new NoSuchElementException();
- }
-
- lastIter.repeat();
- }
-
- @Override
- public void close() {
- if (!closed) {
- closed = true;
- lastIter = null;
-
- for (LinkedListIterator<T> iter : cachedIters) {
- if (iter != null) {
- iter.close();
- }
- }
- }
- }
-
- private void checkReset() {
- if (lastReset != resetCount) {
- index = highestPriority;
-
- resetCount = lastReset;
- }
- }
-
- @Override
- public boolean hasNext() {
- checkReset();
-
- while (index >= 0) {
- lastIter = cachedIters[index];
-
- if (lastIter == null) {
- lastIter = cachedIters[index] = levels[index].iterator();
- }
-
- boolean b = lastIter.hasNext();
-
- if (b) {
- return true;
- }
-
- index--;
-
- if (index < 0) {
- index = levels.length - 1;
-
- break;
- }
- }
- return false;
- }
-
- @Override
- public T next() {
- if (lastIter == null) {
- throw new NoSuchElementException();
- }
-
- return lastIter.next();
- }
-
- @Override
- public void remove() {
- if (lastIter == null) {
- throw new NoSuchElementException();
- }
-
- lastIter.remove();
-
- // This next statement would be the equivalent of:
- // if (index == highestPriority && levels[index].size() == 0)
- // However we have to keep checking all the previous levels
- // otherwise we would cache a max that will not exist
- // what would make us eventually having hasNext() returning false
- // as a bug
- // Part of the fix for HORNETQ-705
- for (int i = index; i >= 0 && levels[index].size() == 0; i--) {
- highestPriority = i;
- }
-
- size--;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-core-client/src/test/java/org/apache/activemq/artemis/util/TimeAndCounterIDGeneratorTest.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/test/java/org/apache/activemq/artemis/util/TimeAndCounterIDGeneratorTest.java b/artemis-core-client/src/test/java/org/apache/activemq/artemis/util/TimeAndCounterIDGeneratorTest.java
index c2ec02d..812cafc 100644
--- a/artemis-core-client/src/test/java/org/apache/activemq/artemis/util/TimeAndCounterIDGeneratorTest.java
+++ b/artemis-core-client/src/test/java/org/apache/activemq/artemis/util/TimeAndCounterIDGeneratorTest.java
@@ -19,8 +19,8 @@ package org.apache.activemq.artemis.util;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
-import org.apache.activemq.artemis.utils.ConcurrentHashSet;
import org.apache.activemq.artemis.utils.TimeAndCounterIDGenerator;
+import org.apache.activemq.artemis.utils.collections.ConcurrentHashSet;
import org.junit.Assert;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/file/JDBCSequentialFileFactory.java
----------------------------------------------------------------------
diff --git a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/file/JDBCSequentialFileFactory.java b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/file/JDBCSequentialFileFactory.java
index 48cb638..dfbf1ba 100644
--- a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/file/JDBCSequentialFileFactory.java
+++ b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/file/JDBCSequentialFileFactory.java
@@ -34,7 +34,7 @@ import org.apache.activemq.artemis.core.io.nio.NIOSequentialFileFactory;
import org.apache.activemq.artemis.core.server.ActiveMQComponent;
import org.apache.activemq.artemis.jdbc.store.sql.SQLProvider;
import org.apache.activemq.artemis.journal.ActiveMQJournalLogger;
-import org.apache.activemq.artemis.utils.ConcurrentHashSet;
+import org.apache.activemq.artemis.utils.collections.ConcurrentHashSet;
import org.jboss.logging.Logger;
public class JDBCSequentialFileFactory implements SequentialFileFactory, ActiveMQComponent {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnection.java
----------------------------------------------------------------------
diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnection.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnection.java
index 0c6cf9d..c90e630 100644
--- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnection.java
+++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnection.java
@@ -53,9 +53,9 @@ import org.apache.activemq.artemis.core.client.impl.ClientSessionInternal;
import org.apache.activemq.artemis.core.version.Version;
import org.apache.activemq.artemis.reader.MessageUtil;
import org.apache.activemq.artemis.utils.ActiveMQThreadFactory;
-import org.apache.activemq.artemis.utils.ConcurrentHashSet;
import org.apache.activemq.artemis.utils.UUIDGenerator;
import org.apache.activemq.artemis.utils.VersionLoader;
+import org.apache.activemq.artemis.utils.collections.ConcurrentHashSet;
/**
* ActiveMQ Artemis implementation of a JMS Connection.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQJMSProducer.java
----------------------------------------------------------------------
diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQJMSProducer.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQJMSProducer.java
index 9911302..965eefd 100644
--- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQJMSProducer.java
+++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQJMSProducer.java
@@ -39,7 +39,7 @@ import java.util.Set;
import org.apache.activemq.artemis.api.core.ActiveMQPropertyConversionException;
import org.apache.activemq.artemis.api.core.SimpleString;
-import org.apache.activemq.artemis.utils.TypedProperties;
+import org.apache.activemq.artemis.utils.collections.TypedProperties;
/**
* NOTE: this class forwards {@link #setDisableMessageID(boolean)} and
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQMapMessage.java
----------------------------------------------------------------------
diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQMapMessage.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQMapMessage.java
index a69061e..9749328 100644
--- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQMapMessage.java
+++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQMapMessage.java
@@ -30,7 +30,7 @@ import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.client.ClientMessage;
import org.apache.activemq.artemis.api.core.client.ClientSession;
-import org.apache.activemq.artemis.utils.TypedProperties;
+import org.apache.activemq.artemis.utils.collections.TypedProperties;
import static org.apache.activemq.artemis.reader.MapMessageUtil.readBodyMap;
import static org.apache.activemq.artemis.reader.MapMessageUtil.writeBodyMap;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ThreadAwareContext.java
----------------------------------------------------------------------
diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ThreadAwareContext.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ThreadAwareContext.java
index c74264f..f825408 100644
--- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ThreadAwareContext.java
+++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ThreadAwareContext.java
@@ -19,7 +19,7 @@ package org.apache.activemq.artemis.jms.client;
import javax.jms.IllegalStateException;
import java.util.Set;
-import org.apache.activemq.artemis.utils.ConcurrentHashSet;
+import org.apache.activemq.artemis.utils.collections.ConcurrentHashSet;
/**
* Restricts what can be called on context passed in wrapped CompletionListener.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/server/impl/JMSServerManagerImpl.java
----------------------------------------------------------------------
diff --git a/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/server/impl/JMSServerManagerImpl.java b/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/server/impl/JMSServerManagerImpl.java
index 2fa7108..afa39e3 100644
--- a/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/server/impl/JMSServerManagerImpl.java
+++ b/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/server/impl/JMSServerManagerImpl.java
@@ -42,6 +42,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.activemq.artemis.api.core.ActiveMQAddressDoesNotExistException;
import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.DiscoveryGroupConfiguration;
+import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.TransportConfiguration;
import org.apache.activemq.artemis.api.core.management.AddressControl;
@@ -57,7 +58,6 @@ import org.apache.activemq.artemis.core.security.Role;
import org.apache.activemq.artemis.core.server.ActivateCallback;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
-import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl;
import org.apache.activemq.artemis.core.server.impl.AddressInfo;
import org.apache.activemq.artemis.core.server.management.Notification;
@@ -93,8 +93,8 @@ import org.apache.activemq.artemis.spi.core.naming.BindingRegistry;
import org.apache.activemq.artemis.utils.JsonLoader;
import org.apache.activemq.artemis.utils.SelectorTranslator;
import org.apache.activemq.artemis.utils.TimeAndCounterIDGenerator;
-import org.apache.activemq.artemis.utils.TypedProperties;
import org.apache.activemq.artemis.utils.XMLUtil;
+import org.apache.activemq.artemis.utils.collections.TypedProperties;
import org.jboss.logging.Logger;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/JournalImpl.java
----------------------------------------------------------------------
diff --git a/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/JournalImpl.java b/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/JournalImpl.java
index 1758999..7e8320c 100644
--- a/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/JournalImpl.java
+++ b/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/JournalImpl.java
@@ -55,7 +55,6 @@ import org.apache.activemq.artemis.core.journal.EncodingSupport;
import org.apache.activemq.artemis.core.journal.IOCompletion;
import org.apache.activemq.artemis.core.journal.JournalLoadInformation;
import org.apache.activemq.artemis.core.journal.LoaderCallback;
-import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.journal.PreparedTransactionInfo;
import org.apache.activemq.artemis.core.journal.RecordInfo;
import org.apache.activemq.artemis.core.journal.TestableJournal;
@@ -68,17 +67,18 @@ import org.apache.activemq.artemis.core.journal.impl.dataformat.JournalDeleteRec
import org.apache.activemq.artemis.core.journal.impl.dataformat.JournalDeleteRecordTX;
import org.apache.activemq.artemis.core.journal.impl.dataformat.JournalInternalRecord;
import org.apache.activemq.artemis.core.journal.impl.dataformat.JournalRollbackRecordTX;
+import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.journal.ActiveMQJournalBundle;
import org.apache.activemq.artemis.journal.ActiveMQJournalLogger;
import org.apache.activemq.artemis.utils.ActiveMQThreadFactory;
-import org.apache.activemq.artemis.utils.ConcurrentHashSet;
-import org.apache.activemq.artemis.utils.collections.ConcurrentLongHashMap;
-import org.apache.activemq.artemis.utils.collections.ConcurrentLongHashSet;
import org.apache.activemq.artemis.utils.DataConstants;
import org.apache.activemq.artemis.utils.ExecutorFactory;
import org.apache.activemq.artemis.utils.OrderedExecutorFactory;
import org.apache.activemq.artemis.utils.SimpleFuture;
import org.apache.activemq.artemis.utils.SimpleFutureImpl;
+import org.apache.activemq.artemis.utils.collections.ConcurrentHashSet;
+import org.apache.activemq.artemis.utils.collections.ConcurrentLongHashMap;
+import org.apache.activemq.artemis.utils.collections.ConcurrentLongHashSet;
import org.jboss.logging.Logger;
/**
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSMapMessage.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSMapMessage.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSMapMessage.java
index f72239e..c904944 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSMapMessage.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSMapMessage.java
@@ -28,7 +28,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQPropertyConversionException;
import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
-import org.apache.activemq.artemis.utils.TypedProperties;
+import org.apache.activemq.artemis.utils.collections.TypedProperties;
import static org.apache.activemq.artemis.reader.MapMessageUtil.readBodyMap;
import static org.apache.activemq.artemis.reader.MapMessageUtil.writeBodyMap;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTConnectionManager.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTConnectionManager.java b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTConnectionManager.java
index 9800be5..bd180b6 100644
--- a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTConnectionManager.java
+++ b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTConnectionManager.java
@@ -28,8 +28,8 @@ import org.apache.activemq.artemis.api.core.client.ActiveMQClient;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.ServerSession;
import org.apache.activemq.artemis.core.server.impl.ServerSessionImpl;
-import org.apache.activemq.artemis.utils.ConcurrentHashSet;
import org.apache.activemq.artemis.utils.UUIDGenerator;
+import org.apache.activemq.artemis.utils.collections.ConcurrentHashSet;
/**
* MQTTConnectionMananager is responsible for handle Connect and Disconnect packets and any resulting behaviour of these
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRetainMessageManager.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRetainMessageManager.java b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRetainMessageManager.java
index d0a3c07..a7381ea 100644
--- a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRetainMessageManager.java
+++ b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRetainMessageManager.java
@@ -25,7 +25,7 @@ import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.RoutingContext;
import org.apache.activemq.artemis.core.server.impl.RoutingContextImpl;
import org.apache.activemq.artemis.core.transaction.Transaction;
-import org.apache.activemq.artemis.utils.LinkedListIterator;
+import org.apache.activemq.artemis.utils.collections.LinkedListIterator;
public class MQTTRetainMessageManager {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireConnection.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireConnection.java b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireConnection.java
index 60876b9..c63d266 100644
--- a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireConnection.java
+++ b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireConnection.java
@@ -77,8 +77,8 @@ import org.apache.activemq.artemis.spi.core.protocol.AbstractRemotingConnection;
import org.apache.activemq.artemis.spi.core.protocol.ConnectionEntry;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
import org.apache.activemq.artemis.spi.core.remoting.Connection;
-import org.apache.activemq.artemis.utils.ConcurrentHashSet;
import org.apache.activemq.artemis.utils.UUIDGenerator;
+import org.apache.activemq.artemis.utils.collections.ConcurrentHashSet;
import org.apache.activemq.command.ActiveMQDestination;
import org.apache.activemq.command.ActiveMQMessage;
import org.apache.activemq.command.ActiveMQTempQueue;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireMessageConverter.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireMessageConverter.java b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireMessageConverter.java
index f578ac8..dd7879c 100644
--- a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireMessageConverter.java
+++ b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireMessageConverter.java
@@ -44,8 +44,8 @@ import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.reader.MessageUtil;
import org.apache.activemq.artemis.spi.core.protocol.MessageConverter;
import org.apache.activemq.artemis.utils.DataConstants;
-import org.apache.activemq.artemis.utils.TypedProperties;
import org.apache.activemq.artemis.utils.UUIDGenerator;
+import org.apache.activemq.artemis.utils.collections.TypedProperties;
import org.apache.activemq.command.ActiveMQBytesMessage;
import org.apache.activemq.command.ActiveMQDestination;
import org.apache.activemq.command.ActiveMQMapMessage;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRAConnectionManager.java
----------------------------------------------------------------------
diff --git a/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRAConnectionManager.java b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRAConnectionManager.java
index f895b59..bfdd0c9 100644
--- a/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRAConnectionManager.java
+++ b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRAConnectionManager.java
@@ -22,7 +22,7 @@ import javax.resource.spi.ConnectionRequestInfo;
import javax.resource.spi.ManagedConnection;
import javax.resource.spi.ManagedConnectionFactory;
-import org.apache.activemq.artemis.utils.ConcurrentHashSet;
+import org.apache.activemq.artemis.utils.collections.ConcurrentHashSet;
/**
* The connection manager used in non-managed environments.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/recovery/RecoveryManager.java
----------------------------------------------------------------------
diff --git a/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/recovery/RecoveryManager.java b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/recovery/RecoveryManager.java
index 0e72780..0abde97 100644
--- a/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/recovery/RecoveryManager.java
+++ b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/recovery/RecoveryManager.java
@@ -25,7 +25,7 @@ import org.apache.activemq.artemis.ra.ActiveMQRALogger;
import org.apache.activemq.artemis.service.extensions.xa.recovery.ActiveMQRegistry;
import org.apache.activemq.artemis.service.extensions.xa.recovery.ActiveMQRegistryImpl;
import org.apache.activemq.artemis.service.extensions.xa.recovery.XARecoveryConfig;
-import org.apache.activemq.artemis.utils.ConcurrentHashSet;
+import org.apache.activemq.artemis.utils.collections.ConcurrentHashSet;
public final class RecoveryManager {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/dc26ac96/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
index ad90627..faa25cc 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
@@ -48,6 +48,7 @@ import java.util.stream.Collectors;
import org.apache.activemq.artemis.api.config.ActiveMQDefaultConfiguration;
import org.apache.activemq.artemis.api.core.ActiveMQAddressDoesNotExistException;
import org.apache.activemq.artemis.api.core.ActiveMQException;
+import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.TransportConfiguration;
import org.apache.activemq.artemis.api.core.management.ActiveMQServerControl;
@@ -84,7 +85,6 @@ import org.apache.activemq.artemis.core.server.Consumer;
import org.apache.activemq.artemis.core.server.DivertConfigurationRoutingType;
import org.apache.activemq.artemis.core.server.JournalType;
import org.apache.activemq.artemis.core.server.Queue;
-import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.core.server.ServerConsumer;
import org.apache.activemq.artemis.core.server.ServerSession;
import org.apache.activemq.artemis.core.server.cluster.ClusterConnection;
@@ -107,7 +107,7 @@ import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
import org.apache.activemq.artemis.utils.JsonLoader;
import org.apache.activemq.artemis.utils.ListUtil;
import org.apache.activemq.artemis.utils.SecurityFormatter;
-import org.apache.activemq.artemis.utils.TypedProperties;
+import org.apache.activemq.artemis.utils.collections.TypedProperties;
public class ActiveMQServerControlImpl extends AbstractControl implements ActiveMQServerControl, NotificationEmitter, org.apache.activemq.artemis.core.server.management.NotificationListener {
// Constants -----------------------------------------------------