1 /*
   2  * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
   3  * @LastModified: Oct 2017
   4  */
   5 /*
   6  * Licensed to the Apache Software Foundation (ASF) under one or more
   7  * contributor license agreements.  See the NOTICE file distributed with
   8  * this work for additional information regarding copyright ownership.
   9  * The ASF licenses this file to You under the Apache License, Version 2.0
  10  * (the "License"); you may not use this file except in compliance with
  11  * the License.  You may obtain a copy of the License at
  12  *
  13  *      http://www.apache.org/licenses/LICENSE-2.0
  14  *
  15  * Unless required by applicable law or agreed to in writing, software
  16  * distributed under the License is distributed on an "AS IS" BASIS,
  17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18  * See the License for the specific language governing permissions and
  19  * limitations under the License.
  20  */
  21 
  22 package com.sun.org.apache.xerces.internal.impl.xs.util;
  23 
  24 import com.sun.org.apache.xerces.internal.xs.datatypes.ObjectList;
  25 import java.lang.reflect.Array;
  26 import java.util.AbstractList;
  27 
  28 /**
  29  * Contains a list of Objects.
  30  *
  31  * @xerces.internal
  32  *
  33  */
  34 @SuppressWarnings("unchecked") // method <T>toArray(T[])
  35 public final class ObjectListImpl extends AbstractList<Object> implements ObjectList {
  36 
  37     /**
  38      * An immutable empty list.
  39      */
  40     public static final ObjectListImpl EMPTY_LIST = new ObjectListImpl(new Object[0], 0);
  41 
  42     // The array to hold all data
  43     private final Object[] fArray;
  44 
  45     // Number of elements in this list
  46     private final int fLength;
  47 
  48     public ObjectListImpl(Object[] array, int length) {
  49         fArray = array;
  50         fLength = length;
  51     }
  52 
  53     public int getLength() {
  54         return fLength;
  55     }
  56 
  57     public boolean contains(Object item) {
  58         if (item == null) {
  59             for (int i = 0; i < fLength; i++) {
  60                 if (fArray[i] == null)
  61                     return true;
  62             }
  63         }
  64         else {
  65             for (int i = 0; i < fLength; i++) {
  66                 if (item.equals(fArray[i]))
  67                     return true;
  68             }
  69         }
  70         return false;
  71     }
  72 
  73     public Object item(int index) {
  74         if (index < 0 || index >= fLength) {
  75             return null;
  76         }
  77         return fArray[index];
  78     }
  79 
  80     /*
  81      * List methods
  82      */
  83     public Object get(int index) {
  84         if (index >= 0 && index < fLength) {
  85             return fArray[index];
  86         }
  87         throw new IndexOutOfBoundsException("Index: " + index);
  88     }
  89 
  90     public int size() {
  91         return getLength();
  92     }
  93 
  94     public Object[] toArray() {
  95         Object[] a = new Object[fLength];
  96         toArray0(a);
  97         return a;
  98     }
  99 
 100     public Object[] toArray(Object[] a) {
 101         if (a.length < fLength) {
 102             Class<?> arrayClass = a.getClass();
 103             Class<?> componentType = arrayClass.getComponentType();
 104             a = (Object[]) Array.newInstance(componentType, fLength);
 105         }
 106         toArray0(a);
 107         if (a.length > fLength) {
 108             a[fLength] = null;
 109         }
 110         return a;
 111     }
 112 
 113     private void toArray0(Object[] a) {
 114         if (fLength > 0) {
 115             System.arraycopy(fArray, 0, a, 0, fLength);
 116         }
 117     }
 118 }