/*
 * 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.instancecallbacks;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.jdo.Extent;
import javax.jdo.InstanceCallbacks;
import javax.jdo.PersistenceManager;

public class InstanceCallbackNonPersistFdsClass implements InstanceCallbacks {
  public int i; // non-managed
  public char c; // non-managed
  public double d; // transactional
  public short s; // transactional
  public Set<String> children; // non-managed
  public Date loadTime; // non-managed

  private int keyValue; // persistent--used as key field in application identity
  public float floatValue; // persistent
  public int intValue; // persistent  --primary key field

  private static int nextKeyValue = 1;

  public static int savedIntValue;
  public static float savedFloatValue;

  public static Date savedLoadTime;
  public static final String member1 = "one";
  public static final String member2 = "two";
  public static final String member3 = "three";

  public static boolean preClearCalled = false;
  public static boolean preStoreCalled = false;
  public static boolean preDeleteCalled = false;
  public static boolean postloadCalled = false;
  public static boolean postloadCalledMultipleTimes = false;

  // used in CallingJdoPostload test
  public static final int beforeGetObjectById = 1;
  public static final int afterGetObjectById = 2;
  public static int savedApplicationStep;
  public static int applicationStep; // values are 0, beforeGetObjectById and afterGetObjectById

  // used in ModificationOfNontransactionalNonpersistentFields test
  public static List<Exception> exceptions = new ArrayList<>();
  public static List<String> callbackCalled = new ArrayList<>();
  public static List<String> attributeOpCausingExceptions = new ArrayList<>();

  public static void initializeStaticsForTest() {
    savedIntValue = 0;
    savedFloatValue = 0.0f;
    savedLoadTime = null;
    preClearCalled = false;
    preStoreCalled = false;
    preDeleteCalled = false;
    postloadCalled = false;
    postloadCalledMultipleTimes = false;
    savedApplicationStep = 0;
    applicationStep = 0;

    exceptions = new ArrayList<>();
    callbackCalled = new ArrayList<>();
    attributeOpCausingExceptions = new ArrayList<>();
  }

  public static void removeAllInstances(PersistenceManager pm) {
    Extent<InstanceCallbackNonPersistFdsClass> e =
        pm.getExtent(InstanceCallbackNonPersistFdsClass.class, true);
    for (InstanceCallbackNonPersistFdsClass instanceCallbackNonPersistFdsClass : e) {
      pm.deletePersistent(instanceCallbackNonPersistFdsClass);
    }
  }

  public InstanceCallbackNonPersistFdsClass() {}

  public InstanceCallbackNonPersistFdsClass(float floatValue, int intValue) {
    keyValue = nextKeyValue++;
    this.floatValue = floatValue;
    this.intValue = intValue;
  }

  public void setNonPersist(int i, char c, double d, short s) {
    this.i = i;
    this.c = c;
    this.d = d;
    this.s = s;
  }

  public void setNonManaged(int i, char c) {
    this.i = i;
    this.c = c;
  }

  public int calcIntValue() {
    return i * c;
  }

  public float calcFloatValue() {
    return (float) (d * s);
  }

  public void incrementIntValue() {
    intValue++;
  }

  public void jdoPreStore() {
    preStoreCalled = true;
    intValue = calcIntValue();
    floatValue = calcFloatValue();

    try {
      i = -30;
    } catch (Exception e) {
      callbackCalled.add("jdoPreStore ");
      exceptions.add(e);
      attributeOpCausingExceptions.add("i = -30;");
    }
    try {
      c = '\u0000';
    } catch (Exception e) {
      callbackCalled.add("jdoPreStore ");
      exceptions.add(e);
      attributeOpCausingExceptions.add("c = '\u0000';");
    }
    try {
      d = 362.5;
    } catch (Exception e) {
      callbackCalled.add("jdoPreStore ");
      exceptions.add(e);
      attributeOpCausingExceptions.add("d = 362.5;");
    }
    try {
      s = 0;
    } catch (Exception e) {
      callbackCalled.add("jdoPreStore ");
      exceptions.add(e);
      attributeOpCausingExceptions.add("s = 0;");
    }
    try {
      loadTime = null;
    } catch (Exception e) {
      callbackCalled.add("jdoPreStore ");
      exceptions.add(e);
      attributeOpCausingExceptions.add("loadTime = null;");
    }
    try {
      children = null;
    } catch (Exception e) {
      callbackCalled.add("jdoPreStore ");
      exceptions.add(e);
      attributeOpCausingExceptions.add("children = null;");
    }
  }

  public void jdoPreDelete() {
    preDeleteCalled = true;
    try {
      i = 0;
    } catch (Exception e) {
      callbackCalled.add("jdoPreDelete ");
      exceptions.add(e);
      attributeOpCausingExceptions.add("i = 0;");
    }
    try {
      c = 'x';
    } catch (Exception e) {
      callbackCalled.add("jdoPreDelete ");
      exceptions.add(e);
      attributeOpCausingExceptions.add("c = 'x';");
    }
    try {
      d = 0.0;
    } catch (Exception e) {
      callbackCalled.add("jdoPreDelete ");
      exceptions.add(e);
      attributeOpCausingExceptions.add("d = 0.0;");
    }
    try {
      s = -5;
    } catch (Exception e) {
      callbackCalled.add("jdoPreDelete ");
      exceptions.add(e);
      attributeOpCausingExceptions.add("s = -5;");
    }
    try {
      loadTime = null;
    } catch (Exception e) {
      callbackCalled.add("jdoPreDelete ");
      exceptions.add(e);
      attributeOpCausingExceptions.add("loadTime = null;");
    }
    try {
      children = null;
    } catch (Exception e) {
      callbackCalled.add("jdoPreDelete ");
      exceptions.add(e);
      attributeOpCausingExceptions.add("children = null;");
    }
  }

  public void jdoPostLoad() {
    postloadCalled = true;
    savedApplicationStep = applicationStep;
    i = -10;
    c = '2';
    d = 30.0;
    s = 40;
    savedIntValue = intValue;
    savedFloatValue = floatValue;
    loadTime = new Date();
    savedLoadTime = loadTime;
    children = new HashSet<>();
    children.add(member1);
    children.add(member2);
    children.add(member3);
  }

  public void jdoPreClear() {
    preClearCalled = true;
    try {
      i = 1;
    } catch (Exception e) {
      callbackCalled.add("jdoPreClear ");
      exceptions.add(e);
      attributeOpCausingExceptions.add("i = 1;");
    }
    try {
      c = '2';
    } catch (Exception e) {
      callbackCalled.add("jdoPreClear ");
      exceptions.add(e);
      attributeOpCausingExceptions.add("c = '2';");
    }
    try {
      d = 3.0;
    } catch (Exception e) {
      callbackCalled.add("jdoPreClear ");
      exceptions.add(e);
      attributeOpCausingExceptions.add("d = 3.0;");
    }
    try {
      s = 4;
    } catch (Exception e) {
      callbackCalled.add("jdoPreClear ");
      exceptions.add(e);
      attributeOpCausingExceptions.add("s = 4;");
    }
    try {
      loadTime = null;
    } catch (Exception e) {
      callbackCalled.add("jdoPreClear ");
      exceptions.add(e);
      attributeOpCausingExceptions.add("loadTime = null;");
    }
    try {
      children = null;
    } catch (Exception e) {
      callbackCalled.add("jdoPreClear ");
      exceptions.add(e);
      attributeOpCausingExceptions.add("children = null;");
    }
  }

  public static class KeyClass implements Serializable {

    private static final long serialVersionUID = 1L;

    public int keyValue;

    public KeyClass() {}

    public KeyClass(String s) {
      try {
        keyValue = Integer.parseInt(s);
      } catch (NumberFormatException e) {
        keyValue = 0;
      }
    }

    public boolean equals(Object obj) {
      if (obj == null || !this.getClass().equals(obj.getClass())) return false;
      else return keyValue == ((KeyClass) obj).keyValue;
    }

    public int hashCode() {
      return keyValue;
    }

    public String toString() {
      return Integer.toString(keyValue);
    }
  }
}
