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 -----------------------------------------------------