/*
 * 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
<<<<<<< Updated upstream
 *
 *     https://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
=======
 * 
 *     https://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 
>>>>>>> Stashed changes
 * limitations under the License.
 */

package org.apache.jdo.tck.pc.fieldtypes;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
import java.util.LinkedList;
import java.util.Locale;

public class LinkedListCollections {
  public int identifier;
  public LinkedList<Object> LinkedListOfObject0;
  public LinkedList<Object> LinkedListOfObject1;
  public LinkedList<Object> LinkedListOfObject2;
  public LinkedList<SimpleClass> LinkedListOfSimpleClass3;
  public LinkedList<SimpleClass> LinkedListOfSimpleClass4;
  public LinkedList<SimpleClass> LinkedListOfSimpleClass5;
  public LinkedList<SimpleInterface> LinkedListOfSimpleInterface6;
  public LinkedList<SimpleInterface> LinkedListOfSimpleInterface7;
  public LinkedList<SimpleInterface> LinkedListOfSimpleInterface8;
  public LinkedList<String> LinkedListOfString9;
  public LinkedList<String> LinkedListOfString10;
  public LinkedList<String> LinkedListOfString11;
  public LinkedList<Date> LinkedListOfDate12;
  public LinkedList<Date> LinkedListOfDate13;
  public LinkedList<Date> LinkedListOfDate14;
  public LinkedList<Locale> LinkedListOfLocale15;
  public LinkedList<Locale> LinkedListOfLocale16;
  public LinkedList<Locale> LinkedListOfLocale17;
  public LinkedList<BigDecimal> LinkedListOfBigDecimal18;
  public LinkedList<BigDecimal> LinkedListOfBigDecimal19;
  public LinkedList<BigDecimal> LinkedListOfBigDecimal20;
  public LinkedList<BigInteger> LinkedListOfBigInteger21;
  public LinkedList<BigInteger> LinkedListOfBigInteger22;
  public LinkedList<BigInteger> LinkedListOfBigInteger23;
  public LinkedList<Byte> LinkedListOfByte24;
  public LinkedList<Byte> LinkedListOfByte25;
  public LinkedList<Byte> LinkedListOfByte26;
  public LinkedList<Double> LinkedListOfDouble27;
  public LinkedList<Double> LinkedListOfDouble28;
  public LinkedList<Double> LinkedListOfDouble29;
  public LinkedList<Float> LinkedListOfFloat30;
  public LinkedList<Float> LinkedListOfFloat31;
  public LinkedList<Float> LinkedListOfFloat32;
  public LinkedList<Integer> LinkedListOfInteger33;
  public LinkedList<Integer> LinkedListOfInteger34;
  public LinkedList<Integer> LinkedListOfInteger35;
  public LinkedList<Long> LinkedListOfLong36;
  public LinkedList<Long> LinkedListOfLong37;
  public LinkedList<Long> LinkedListOfLong38;
  public LinkedList<Short> LinkedListOfShort39;
  public LinkedList<Short> LinkedListOfShort40;
  public LinkedList<Short> LinkedListOfShort41;
  public LinkedList<SimpleClass> LinkedListOfSimpleClass42;

  public static final String[] fieldSpecs = {
    "public LinkedList LinkedListOfObject0",
    "embedded-element=true public LinkedList LinkedListOfObject1",
    "embedded-element=false public LinkedList LinkedListOfObject2",
    "public LinkedList LinkedListOfSimpleClass3",
    "embedded-element=true public LinkedList LinkedListOfSimpleClass4",
    "embedded-element=false public LinkedList LinkedListOfSimpleClass5",
    "public LinkedList LinkedListOfSimpleInterface6",
    "embedded-element=true public LinkedList LinkedListOfSimpleInterface7",
    "embedded-element=false public LinkedList LinkedListOfSimpleInterface8",
    "public LinkedList LinkedListOfString9",
    "embedded-element=true public LinkedList LinkedListOfString10",
    "embedded-element=false public LinkedList LinkedListOfString11",
    "public LinkedList LinkedListOfDate12",
    "embedded-element=true public LinkedList LinkedListOfDate13",
    "embedded-element=false public LinkedList LinkedListOfDate14",
    "public LinkedList LinkedListOfLocale15",
    "embedded-element=true public LinkedList LinkedListOfLocale16",
    "embedded-element=false public LinkedList LinkedListOfLocale17",
    "public LinkedList LinkedListOfBigDecimal18",
    "embedded-element=true public LinkedList LinkedListOfBigDecimal19",
    "embedded-element=false public LinkedList LinkedListOfBigDecimal20",
    "public LinkedList LinkedListOfBigInteger21",
    "embedded-element=true public LinkedList LinkedListOfBigInteger22",
    "embedded-element=false public LinkedList LinkedListOfBigInteger23",
    "public LinkedList LinkedListOfByte24",
    "embedded-element=true public LinkedList LinkedListOfByte25",
    "embedded-element=false public LinkedList LinkedListOfByte26",
    "public LinkedList LinkedListOfDouble27",
    "embedded-element=true public LinkedList LinkedListOfDouble28",
    "embedded-element=false public LinkedList LinkedListOfDouble29",
    "public LinkedList LinkedListOfFloat30",
    "embedded-element=true public LinkedList LinkedListOfFloat31",
    "embedded-element=false public LinkedList LinkedListOfFloat32",
    "public LinkedList LinkedListOfInteger33",
    "embedded-element=true public LinkedList LinkedListOfInteger34",
    "embedded-element=false public LinkedList LinkedListOfInteger35",
    "public LinkedList LinkedListOfLong36",
    "embedded-element=true public LinkedList LinkedListOfLong37",
    "embedded-element=false public LinkedList LinkedListOfLong38",
    "public LinkedList LinkedListOfShort39",
    "embedded-element=true public LinkedList LinkedListOfShort40",
    "embedded-element=false public LinkedList LinkedListOfShort41",
    "serialized=true public LinkedList LinkedListOfSimpleClass42"
  };

  public int getLength() {
    return fieldSpecs.length;
  }

  public LinkedList<?> get(int index) {
    switch (index) {
      case (0):
        return LinkedListOfObject0;
      case (1):
        return LinkedListOfObject1;
      case (2):
        return LinkedListOfObject2;
      case (3):
        return LinkedListOfSimpleClass3;
      case (4):
        return LinkedListOfSimpleClass4;
      case (5):
        return LinkedListOfSimpleClass5;
      case (6):
        return LinkedListOfSimpleInterface6;
      case (7):
        return LinkedListOfSimpleInterface7;
      case (8):
        return LinkedListOfSimpleInterface8;
      case (9):
        return LinkedListOfString9;
      case (10):
        return LinkedListOfString10;
      case (11):
        return LinkedListOfString11;
      case (12):
        return LinkedListOfDate12;
      case (13):
        return LinkedListOfDate13;
      case (14):
        return LinkedListOfDate14;
      case (15):
        return LinkedListOfLocale15;
      case (16):
        return LinkedListOfLocale16;
      case (17):
        return LinkedListOfLocale17;
      case (18):
        return LinkedListOfBigDecimal18;
      case (19):
        return LinkedListOfBigDecimal19;
      case (20):
        return LinkedListOfBigDecimal20;
      case (21):
        return LinkedListOfBigInteger21;
      case (22):
        return LinkedListOfBigInteger22;
      case (23):
        return LinkedListOfBigInteger23;
      case (24):
        return LinkedListOfByte24;
      case (25):
        return LinkedListOfByte25;
      case (26):
        return LinkedListOfByte26;
      case (27):
        return LinkedListOfDouble27;
      case (28):
        return LinkedListOfDouble28;
      case (29):
        return LinkedListOfDouble29;
      case (30):
        return LinkedListOfFloat30;
      case (31):
        return LinkedListOfFloat31;
      case (32):
        return LinkedListOfFloat32;
      case (33):
        return LinkedListOfInteger33;
      case (34):
        return LinkedListOfInteger34;
      case (35):
        return LinkedListOfInteger35;
      case (36):
        return LinkedListOfLong36;
      case (37):
        return LinkedListOfLong37;
      case (38):
        return LinkedListOfLong38;
      case (39):
        return LinkedListOfShort39;
      case (40):
        return LinkedListOfShort40;
      case (41):
        return LinkedListOfShort41;
      case (42):
        return LinkedListOfSimpleClass42;
      default:
        throw new IndexOutOfBoundsException();
    }
  }

  @SuppressWarnings("unchecked")
  public boolean set(int index, @SuppressWarnings("rawtypes") LinkedList value) {
    if (fieldSpecs[index].indexOf("final") != -1) return false;
    switch (index) {
      case (0):
        LinkedListOfObject0 = value;
        break;
      case (1):
        LinkedListOfObject1 = value;
        break;
      case (2):
        LinkedListOfObject2 = value;
        break;
      case (3):
        LinkedListOfSimpleClass3 = value;
        break;
      case (4):
        LinkedListOfSimpleClass4 = value;
        break;
      case (5):
        LinkedListOfSimpleClass5 = value;
        break;
      case (6):
        LinkedListOfSimpleInterface6 = value;
        break;
      case (7):
        LinkedListOfSimpleInterface7 = value;
        break;
      case (8):
        LinkedListOfSimpleInterface8 = value;
        break;
      case (9):
        LinkedListOfString9 = value;
        break;
      case (10):
        LinkedListOfString10 = value;
        break;
      case (11):
        LinkedListOfString11 = value;
        break;
      case (12):
        LinkedListOfDate12 = value;
        break;
      case (13):
        LinkedListOfDate13 = value;
        break;
      case (14):
        LinkedListOfDate14 = value;
        break;
      case (15):
        LinkedListOfLocale15 = value;
        break;
      case (16):
        LinkedListOfLocale16 = value;
        break;
      case (17):
        LinkedListOfLocale17 = value;
        break;
      case (18):
        LinkedListOfBigDecimal18 = value;
        break;
      case (19):
        LinkedListOfBigDecimal19 = value;
        break;
      case (20):
        LinkedListOfBigDecimal20 = value;
        break;
      case (21):
        LinkedListOfBigInteger21 = value;
        break;
      case (22):
        LinkedListOfBigInteger22 = value;
        break;
      case (23):
        LinkedListOfBigInteger23 = value;
        break;
      case (24):
        LinkedListOfByte24 = value;
        break;
      case (25):
        LinkedListOfByte25 = value;
        break;
      case (26):
        LinkedListOfByte26 = value;
        break;
      case (27):
        LinkedListOfDouble27 = value;
        break;
      case (28):
        LinkedListOfDouble28 = value;
        break;
      case (29):
        LinkedListOfDouble29 = value;
        break;
      case (30):
        LinkedListOfFloat30 = value;
        break;
      case (31):
        LinkedListOfFloat31 = value;
        break;
      case (32):
        LinkedListOfFloat32 = value;
        break;
      case (33):
        LinkedListOfInteger33 = value;
        break;
      case (34):
        LinkedListOfInteger34 = value;
        break;
      case (35):
        LinkedListOfInteger35 = value;
        break;
      case (36):
        LinkedListOfLong36 = value;
        break;
      case (37):
        LinkedListOfLong37 = value;
        break;
      case (38):
        LinkedListOfLong38 = value;
        break;
      case (39):
        LinkedListOfShort39 = value;
        break;
      case (40):
        LinkedListOfShort40 = value;
        break;
      case (41):
        LinkedListOfShort41 = value;
        break;
      case (42):
        LinkedListOfSimpleClass42 = value;
        break;
      default:
        throw new IndexOutOfBoundsException();
    }
    return true;
  }

  public static class Oid implements Serializable {

    private static final long serialVersionUID = 1L;

    public int identifier;

    public Oid() {}

    public Oid(String s) {
      identifier = Integer.parseInt(justTheId(s));
    }

    public String toString() {
      return this.getClass().getName() + ": " + identifier;
    }

    public int hashCode() {
      return identifier;
    }

    public boolean equals(Object other) {
      if (other != null && (other instanceof Oid)) {
        Oid k = (Oid) other;
        return k.identifier == this.identifier;
      }
      return false;
    }

    protected static String justTheId(String str) {
      return str.substring(str.indexOf(':') + 1);
    }
  }
}
