예제 #1
0
  private void recordType(
      DataSchema schema, Map<String, NamedDataSchema> foundTypes, List<NamedDataSchema> typeOrder) {
    if (schema instanceof NamedDataSchema) {
      NamedDataSchema namedDataSchema = (NamedDataSchema) schema;

      if (!foundTypes.containsKey(namedDataSchema.getFullName())) {
        foundTypes.put(namedDataSchema.getFullName(), namedDataSchema);

        if (schema instanceof RecordDataSchema) // recurse into record, record any contained types.
        {
          RecordDataSchema recordDataSchema = (RecordDataSchema) schema;
          for (RecordDataSchema.Field field : recordDataSchema.getFields()) {
            recordType(field.getType(), foundTypes, typeOrder);
          }
        }

        typeOrder.add(namedDataSchema);
      }
    } else if (schema instanceof ArrayDataSchema) {
      ArrayDataSchema arraySchema = (ArrayDataSchema) schema;
      recordType(arraySchema.getItems(), foundTypes, typeOrder);
    } else if (schema instanceof MapDataSchema) {
      MapDataSchema mapSchema = (MapDataSchema) schema;
      recordType(mapSchema.getValues(), foundTypes, typeOrder);
    } else if (schema instanceof UnionDataSchema) {
      UnionDataSchema unionSchema = (UnionDataSchema) schema;
      for (DataSchema type : unionSchema.getTypes()) {
        recordType(type, foundTypes, typeOrder);
      }
    }
  }
 @Override
 public void index(int index) {
   DataSchema newSchema = null;
   if (_currentSchema != null && _currentSchema.getType() == DataSchema.Type.ARRAY) {
     ArrayDataSchema arraySchema = (ArrayDataSchema) _currentSchema;
     newSchema = arraySchema.getItems();
   }
   _pendingSchema = newSchema;
   super.index(index);
 }
예제 #3
0
  public <ArrayTemplate extends AbstractArrayTemplate<E>, E> void testArray(
      Class<ArrayTemplate> templateClass, ArrayDataSchema schema, List<E> input, List<E> adds)
      throws InstantiationException, IllegalAccessException {
    // out.println("Testing " + templateClass.getName() + " " + schema.toString());

    // constructors and addAll
    ArrayTemplate array1 = templateClass.newInstance();
    array1.addAll(input);
    assertEquals(input, array1);

    /*
    Constructor[] constructors = templateClass.getConstructors();
    for (Constructor c : constructors)
    {
      out.println(c);
    }
    */
    try {
      int size = input.size();

      // constructor(int capacity)
      Constructor<ArrayTemplate> capacityConstructor = templateClass.getConstructor(int.class);
      ArrayTemplate array = capacityConstructor.newInstance(input.size());
      assertEquals(array, Collections.emptyList());
      array.addAll(input);
      assertEquals(input, array);
      array.clear();
      assertEquals(size, input.size());

      // constructor(Collection<E>)
      Constructor<ArrayTemplate> collectionConstructor =
          templateClass.getConstructor(Collection.class);
      array = collectionConstructor.newInstance(input);
      assertEquals(input, array);
      array.clear();
      assertEquals(size, input.size());

      // constructor(DataList)
      Constructor<ArrayTemplate> dataListConstructor = templateClass.getConstructor(DataList.class);
      array = dataListConstructor.newInstance(array1.data());
      assertEquals(array1, array);
      assertEquals(input, array);
      array.clear();
      assertEquals(array1, array);
    } catch (Exception e) {
      assertSame(e, null);
    }

    // test wrapping
    array1.clear();
    array1.addAll(input);
    DataList dataList2 = new DataList();
    ArrayTemplate array2 =
        DataTemplateUtil.wrap(dataList2, schema, templateClass); // with schema arg
    for (E e : input) {
      if (e instanceof DataTemplate) {
        dataList2.add(((DataTemplate<?>) e).data());
      } else if (e instanceof Enum) {
        dataList2.add(e.toString());
      } else {
        dataList2.add(e);
      }
    }
    assertEquals(array1, array2);
    ArrayTemplate array2a = DataTemplateUtil.wrap(dataList2, templateClass); // without schema arg
    assertEquals(array1, array2a);
    assertSame(array2.data(), array2a.data());

    // schema()
    ArrayDataSchema schema1 = array1.schema();
    assertTrue(schema1 != null);
    assertEquals(schema1.getType(), DataSchema.Type.ARRAY);
    assertEquals(schema1, schema);

    // add(E element), get(int index)
    ArrayTemplate array3 = templateClass.newInstance();
    for (int i = 0; i < adds.size(); ++i) {
      E value = adds.get(i);
      assertTrue(array3.add(value));
      assertEquals(array3.get(i), value);
      assertSame(array3.get(i), value);
      assertTrue(array3.toString().contains(value.toString()));
    }
    assertEquals(array3, adds);

    // add(int index, E element), get(int index)
    ArrayTemplate array4 = templateClass.newInstance();
    for (int i = 0; i < adds.size(); ++i) {
      E value = adds.get(adds.size() - i - 1);
      array4.add(0, value);
      assertEquals(array4.get(0), value);
      assertSame(array4.get(0), value);
    }
    assertEquals(array4, adds);

    // clear(), isEmpty(), size()
    assertEquals(array4.size(), adds.size());
    assertFalse(array4.isEmpty());
    array4.clear();
    assertTrue(array4.isEmpty());
    assertEquals(array4.size(), 0);

    // equals()
    array4.clear();
    array4.addAll(input);
    assertTrue(array4.equals(array4));
    assertTrue(array4.equals(input));
    assertFalse(array4.equals(null));
    assertFalse(array4.equals(adds));
    for (int i = 0; i <= input.size(); ++i) {
      List<E> subList = input.subList(0, i);
      ArrayTemplate a = templateClass.newInstance();
      a.addAll(subList);
      if (i == input.size()) {
        assertTrue(array4.equals(subList));
        assertTrue(array4.equals(a));
      } else {
        assertFalse(array4.equals(subList));
        assertFalse(array4.equals(a));
      }
    }

    // hashcode()
    ArrayTemplate array5 = templateClass.newInstance();
    array5.addAll(input);
    assertEquals(array5.hashCode(), array5.data().hashCode());
    array5.addAll(adds);
    assertEquals(array5.hashCode(), array5.data().hashCode());
    array5.clear();
    int lastHash = 0;
    for (int i = 0; i < input.size(); ++i) {
      array5.add(input.get(i));
      int newHash = array5.hashCode();
      if (i > 0) {
        assertFalse(newHash == lastHash);
      }
      lastHash = newHash;
    }

    // indexOf(Object o), lastIndexOf(Object o)
    ArrayTemplate array6 = templateClass.newInstance();
    array6.addAll(adds);
    for (E e : adds) {
      assertEquals(array6.indexOf(e), adds.indexOf(e));
      assertEquals(array6.lastIndexOf(e), adds.lastIndexOf(e));
    }

    // remove(int index), subList(int fromIndex, int toIndex)
    ArrayTemplate array7 = templateClass.newInstance();
    array7.addAll(input);
    ArrayTemplate array8 = templateClass.newInstance();
    array8.addAll(input);
    for (int i = 0; i < input.size(); ++i) {
      array7.remove(0);
      assertEquals(array7, input.subList(i + 1, input.size()));
      assertEquals(array7, array8.subList(i + 1, input.size()));
    }

    // removeRange(int fromIndex, int toIndex), subList(int fromIndex, int toIndex)
    for (int from = 0; from < input.size(); ++from) {
      for (int to = from + 1; to <= input.size(); ++to) {
        ArrayTemplate arrayRemove = templateClass.newInstance();
        arrayRemove.addAll(input);
        InternalList<E> reference = new InternalList<E>(input);
        arrayRemove.removeRange(from, to);
        reference.removeRange(from, to);
        assertEquals(reference, arrayRemove);
      }
    }

    // set(int index, E element)
    ArrayTemplate array9 = templateClass.newInstance();
    array9.addAll(input);
    InternalList<E> reference9 = new InternalList<E>(input);
    for (int i = 0; i < input.size() / 2; ++i) {
      int k = input.size() - i - 1;
      E lo = array9.get(i);
      E hi = array9.get(k);
      E hiPrev = array9.set(k, lo);
      E loPrev = array9.set(i, hi);
      E refHiPrev = reference9.set(k, lo);
      E refLoPrev = reference9.set(i, hi);
      assertEquals(hiPrev, refHiPrev);
      assertEquals(loPrev, refLoPrev);
      assertEquals(array9.get(i), reference9.get(i));
      assertEquals(array9.get(k), reference9.get(k));
    }

    // clone
    Exception exc = null;
    ArrayTemplate array10 = templateClass.newInstance();
    array10.addAll(input);
    try {
      exc = null;
      @SuppressWarnings("unchecked")
      ArrayTemplate array10Clone = (ArrayTemplate) array10.clone();
      assertEquals(array10Clone, array10);
      assertTrue(array10Clone != array10);
      array10Clone.remove(0);
      assertEquals(array10Clone.size(), array10.size() - 1);
      assertFalse(array10Clone.equals(array10));
      assertTrue(array10.containsAll(array10Clone));
      array10.remove(0);
      assertEquals(array10Clone, array10);
    } catch (CloneNotSupportedException e) {
      exc = e;
    }
    assert (exc == null);

    // contains
    for (int i = 0; i < input.size(); ++i) {
      ArrayTemplate array = templateClass.newInstance();
      E v = input.get(i);
      array.add(v);
      for (int k = 0; k < input.size(); ++k) {
        if (k == i) assertTrue(array.contains(v));
        else assertFalse(array.contains(input.get(k)));
      }
    }

    // containsAll
    ArrayTemplate arrayContainsAll = templateClass.newInstance();
    arrayContainsAll.addAll(input);
    arrayContainsAll.addAll(adds);
    InternalList<E> referenceContainsAll = new InternalList<E>(input);
    referenceContainsAll.addAll(adds);
    for (int from = 0; from < arrayContainsAll.size(); ++from) {
      for (int to = from + 1; to <= arrayContainsAll.size(); ++to) {
        boolean testResult = arrayContainsAll.containsAll(referenceContainsAll.subList(from, to));
        boolean referenceResult =
            referenceContainsAll.containsAll(referenceContainsAll.subList(from, to));
        assertEquals(testResult, referenceResult);
        assertTrue(testResult);
        assertTrue(referenceResult);
      }
      boolean testResult2 =
          arrayContainsAll.subList(from, arrayContainsAll.size()).containsAll(referenceContainsAll);
      boolean referenceResult2 =
          referenceContainsAll
              .subList(from, arrayContainsAll.size())
              .containsAll(referenceContainsAll);
      // out.println("from " + from + " test " + testResult2 + " ref " + referenceResult2);
      assertEquals(testResult2, referenceResult2);
    }

    // removeAll
    InternalList<E> referenceListRemoveAll = new InternalList<E>(input);
    referenceListRemoveAll.addAll(adds);
    for (int from = 0; from < referenceListRemoveAll.size(); ++from) {
      for (int to = from + 1; to <= referenceListRemoveAll.size(); ++to) {
        ArrayTemplate arrayRemoveAll = templateClass.newInstance();
        arrayRemoveAll.addAll(referenceListRemoveAll);
        InternalList<E> referenceRemoveAll = new InternalList<E>(referenceListRemoveAll);

        boolean testResult = arrayRemoveAll.removeAll(referenceListRemoveAll.subList(from, to));
        boolean referenceResult =
            referenceRemoveAll.removeAll(referenceListRemoveAll.subList(from, to));
        // out.println("from " + from + " to " + to + " test " + testResult + " " + arrayRemoveAll +
        // " ref " + referenceResult + " " + referenceRemoveAll);
        assertEquals(arrayRemoveAll, referenceRemoveAll);
        assertEquals(testResult, referenceResult);
        assertTrue(testResult);
        assertTrue(referenceResult);
      }
    }

    // retainAll
    InternalList<E> referenceListRetainAll = new InternalList<E>(input);
    referenceListRetainAll.addAll(adds);
    for (int from = 0; from < referenceListRetainAll.size(); ++from) {
      for (int to = from + 1; to <= referenceListRetainAll.size(); ++to) {
        ArrayTemplate arrayRetainAll = templateClass.newInstance();
        arrayRetainAll.addAll(referenceListRetainAll);
        InternalList<E> referenceRetainAll = new InternalList<E>(referenceListRetainAll);

        boolean testResult = arrayRetainAll.removeAll(referenceListRetainAll.subList(from, to));
        boolean referenceResult =
            referenceRetainAll.removeAll(referenceListRetainAll.subList(from, to));
        // out.println("from " + from + " to " + to + " test " + testResult + " " + arrayRetainAll +
        // " ref " + referenceResult + " " + referenceRetainAll);
        assertEquals(arrayRetainAll, referenceRetainAll);
        assertEquals(testResult, referenceResult);
        assertTrue(testResult);
        assertTrue(referenceResult);
      }
    }

    // Iterator
    ArrayTemplate arrayIt = templateClass.newInstance();
    arrayIt.addAll(input);
    arrayIt.addAll(adds);
    for (Iterator<E> it = arrayIt.iterator(); it.hasNext(); ) {
      it.next();
      it.remove();
    }
    assertTrue(arrayIt.isEmpty());

    // ListIterator hasNext, hasPrevious, next, previous
    ArrayTemplate arrayListIt = templateClass.newInstance();
    arrayListIt.addAll(input);
    arrayListIt.addAll(adds);
    for (int i = 0; i <= arrayListIt.size(); ++i) {
      ListIterator<E> it = arrayListIt.listIterator(i);
      if (i > 0) {
        int save = it.nextIndex();
        assertTrue(it.hasPrevious());
        assertEquals(it.previous(), arrayListIt.get(i - 1));
        it.next();
        assertEquals(it.nextIndex(), save);
      } else {
        assertFalse(it.hasPrevious());
      }
      if (i < arrayListIt.size()) {
        int save = it.previousIndex();
        assertTrue(it.hasNext());
        assertEquals(it.next(), arrayListIt.get(i));
        it.previous();
        assertEquals(it.previousIndex(), save);
      } else {
        assertFalse(it.hasNext());
      }
      assertEquals(it.nextIndex(), i);
      assertEquals(it.previousIndex(), i - 1);
    }

    // ListIterator remove
    for (ListIterator<E> it = arrayListIt.listIterator(); it.hasNext(); ) {
      it.next();
      it.remove();
    }
    assertTrue(arrayListIt.isEmpty());

    // ListIterator add
    arrayListIt.clear();
    {
      ListIterator<E> it = arrayListIt.listIterator();
      for (E e : adds) {
        it.add(e);
      }
    }
    assertEquals(arrayListIt, adds);

    // ListIterator set
    for (int i = 0; i < adds.size(); ++i) {
      ListIterator<E> it = arrayListIt.listIterator(i);
      it.next();
      E value = adds.get(adds.size() - i - 1);
      it.set(value);
    }
    for (int i = 0; i < adds.size(); ++i) {
      E value = adds.get(adds.size() - i - 1);
      assertEquals(arrayListIt.get(i), value);
    }
  }
예제 #4
0
 private void checkArray(ArrayDataSchema older, ArrayDataSchema newer) {
   _path.addLast(DataSchemaConstants.ITEMS_KEY);
   check(older.getItems(), newer.getItems());
   _path.removeLast();
 }
예제 #5
0
  /**
   * Build a method argument from a request parameter that is an array
   *
   * @param context {@link ResourceContext}
   * @param param {@link Parameter}
   * @return argument value in the correct type
   */
  private static Object buildArrayArgument(
      final ResourceContext context, final Parameter<?> param) {
    final Object convertedValue;
    if (DataTemplate.class.isAssignableFrom(param.getItemType())) {
      final DataList itemsList = (DataList) context.getStructuredParameter(param.getName());
      convertedValue = Array.newInstance(param.getItemType(), itemsList.size());
      int j = 0;
      for (Object paramData : itemsList) {
        final DataTemplate<?> itemsElem =
            DataTemplateUtil.wrap(paramData, param.getItemType().asSubclass(DataTemplate.class));

        ValidateDataAgainstSchema.validate(
            itemsElem.data(),
            itemsElem.schema(),
            new ValidationOptions(
                RequiredMode.CAN_BE_ABSENT_IF_HAS_DEFAULT, CoercionMode.STRING_TO_PRIMITIVE));

        Array.set(convertedValue, j++, itemsElem);
      }
    } else {
      final List<String> itemStringValues = context.getParameterValues(param.getName());
      ArrayDataSchema parameterSchema = null;
      if (param.getDataSchema() instanceof ArrayDataSchema) {
        parameterSchema = (ArrayDataSchema) param.getDataSchema();
      } else {
        throw new RoutingException(
            "An array schema is expected.", HttpStatus.S_400_BAD_REQUEST.getCode());
      }

      convertedValue = Array.newInstance(param.getItemType(), itemStringValues.size());
      int j = 0;
      for (String itemStringValue : itemStringValues) {
        if (itemStringValue == null) {
          throw new RoutingException(
              "Parameter '" + param.getName() + "' cannot contain null values",
              HttpStatus.S_400_BAD_REQUEST.getCode());
        }
        try {
          Array.set(
              convertedValue,
              j++,
              ArgumentUtils.convertSimpleValue(
                  itemStringValue, parameterSchema.getItems(), param.getItemType()));
        } catch (NumberFormatException e) {
          Class<?> targetClass =
              DataSchemaUtil.dataSchemaTypeToPrimitiveDataSchemaClass(
                  parameterSchema.getItems().getDereferencedType());
          // thrown from Integer.valueOf or Long.valueOf
          throw new RoutingException(
              String.format(
                  "Array parameter '%s' value '%s' must be of type '%s'",
                  param.getName(), itemStringValue, targetClass.getName()),
              HttpStatus.S_400_BAD_REQUEST.getCode());
        } catch (IllegalArgumentException e) {
          // thrown from Enum.valueOf
          throw new RoutingException(
              String.format(
                  "Array parameter '%s' value '%s' is invalid", param.getName(), itemStringValue),
              HttpStatus.S_400_BAD_REQUEST.getCode());
        } catch (TemplateRuntimeException e) {
          // thrown from DataTemplateUtil.coerceOutput
          throw new RoutingException(
              String.format(
                  "Array parameter '%s' value '%s' is invalid. Reason: %s",
                  param.getName(), itemStringValue, e.getMessage()),
              HttpStatus.S_400_BAD_REQUEST.getCode());
        }
      }
    }

    return convertedValue;
  }