@SuppressWarnings("deprecation")
  private void parseJDBCStore(
      XMLExtendedStreamReader reader, ModelNode cache, List<ModelNode> operations)
      throws XMLStreamException {
    // ModelNode for the store add operation
    ModelNode storeAddress = cache.get(ModelDescriptionConstants.OP_ADDR).clone();
    // we can't determine the full address until we know which tables are present
    ModelNode store = Util.getEmptyOperation(ModelDescriptionConstants.ADD, null);

    for (int i = 0; i < reader.getAttributeCount(); i++) {
      String value = reader.getAttributeValue(i);
      Attribute attribute = Attribute.forName(reader.getAttributeLocalName(i));
      switch (attribute) {
        case DATASOURCE:
          {
            CommonAttributes.DATA_SOURCE.parseAndSetParameter(value, store, reader);
            break;
          }
        default:
          {
            this.parseStoreAttribute(reader, i, attribute, value, store);
          }
      }
    }

    if (!store.hasDefined(ModelKeys.DATASOURCE)) {
      throw ParseUtils.missingRequired(reader, EnumSet.of(Attribute.DATASOURCE));
    }

    while (reader.hasNext() && (reader.nextTag() != XMLStreamConstants.END_ELEMENT)) {
      Element element = Element.forName(reader.getLocalName());
      switch (element) {
        case ENTRY_TABLE:
          {
            this.parseJDBCStoreTable(
                reader, store.get(ModelKeys.STRING_KEYED_TABLE).setEmptyObject());
            break;
          }
        case BUCKET_TABLE:
          {
            this.parseJDBCStoreTable(
                reader, store.get(ModelKeys.BINARY_KEYED_TABLE).setEmptyObject());
            break;
          }
        default:
          {
            this.parseStoreProperty(reader, store);
          }
      }
    }
    // we determine the store address by the presence / absence of tables
    boolean isStringTableDefined = store.get(ModelKeys.STRING_KEYED_TABLE).isDefined();
    boolean isBinaryTableDefined = store.get(ModelKeys.BINARY_KEYED_TABLE).isDefined();

    // if no tables are defined, we default to mixed store
    if (isStringTableDefined && !isBinaryTableDefined) {
      storeAddress.add(ModelKeys.STRING_KEYED_JDBC_STORE, ModelKeys.STRING_KEYED_JDBC_STORE_NAME);
      storeAddress.protect();
    } else if (!isStringTableDefined && isBinaryTableDefined) {
      storeAddress.add(ModelKeys.BINARY_KEYED_JDBC_STORE, ModelKeys.BINARY_KEYED_JDBC_STORE_NAME);
      storeAddress.protect();
    } else {
      storeAddress.add(ModelKeys.MIXED_KEYED_JDBC_STORE, ModelKeys.MIXED_KEYED_JDBC_STORE_NAME);
      storeAddress.protect();
    }
    // set the address
    store.get(OP_ADDR).set(storeAddress);
    operations.add(store);
  }