/*******************************************************************************
 * Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
 * This program and the accompanying materials are made available under the 
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     Oracle - initial API and implementation from Oracle TopLink
 ******************************************************************************/  
package org.eclipse.persistence.testing.models.mapping;

import java.util.*;
import java.sql.Timestamp;
import java.io.*;
import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.descriptors.DescriptorEvent;
import org.eclipse.persistence.tools.schemaframework.*;

public class Shipment implements Serializable, Cloneable {
    public static Timestamp lastCreationTimestamp;
    public Timestamp creationTimestamp;
    public int creationTimestampMillis;
    public String quantityShipped;
    public String shipMode;
    public Vector employees;

    public Shipment() {
        this.employees = new Vector();
    }

    /**
     * NOTE: this should not be needed.  This is only
     * here because there seems to be a VisualAge bug
     * that can't reflectively call superclass methods.
     */
    public Object clone() {
        try {
            return super.clone();
        } catch (CloneNotSupportedException exception) {
        }
        return null;
    }

    public static Shipment example1() {
        Shipment example = new Shipment();

        example.quantityShipped = "1 ton";
        example.shipMode = "Air";

        return example;
    }

    public static Shipment example2() {
        Shipment example = new Shipment();

        example.quantityShipped = "2 ton";
        example.shipMode = "Air";

        return example;
    }

    public static Shipment example3() {
        Shipment example = new Shipment();

        example.quantityShipped = "3 ton";
        example.shipMode = "Ship";

        return example;
    }

    public static Shipment example4() {
        Shipment example = new Shipment();

        example.quantityShipped = "4 ton";
        example.shipMode = "Ship";

        return example;
    }

    public static Shipment example5() {
        Shipment example = new Shipment();

        example.quantityShipped = "6 ton";
        example.shipMode = "Plane";

        return example;
    }

    public static Shipment example6() {
        Shipment example = new Shipment();

        example.quantityShipped = "2 kg";
        example.shipMode = "Pony Express";

        return example;
    }

    public void prepareForInsert(DescriptorEvent event) {
        Session session = event.getSession();
        if (this.creationTimestamp != null) {
            throw new RuntimeException("Insert event fired twice");
        }
        this.creationTimestamp = new Timestamp(System.currentTimeMillis());
        while (this.creationTimestamp.equals(lastCreationTimestamp)) {
            try {
                // Sleep to ensure milliseconds is ok.
                Thread.sleep(1);
                // Symfoware does not support nanos and millis.
                // Need to wait at least a second to prevent unique key
                // constraint violation at next insert
                if (session.getLogin().getPlatform().isSymfoware()) Thread.sleep(1000);
            } catch (InterruptedException exception) {
            }
            this.creationTimestamp = new Timestamp(System.currentTimeMillis());
        }
        lastCreationTimestamp = (Timestamp)this.creationTimestamp.clone();
        if (session.getLogin().getPlatform().isDB2() || session.getLogin().getPlatform().isAccess() || session.getLogin().getPlatform().isSQLServer() || session.getLogin().getPlatform().isOracle() || session.getLogin().getPlatform().isSybase() || session.getLogin().getPlatform().isSQLAnywhere() || session.getLogin().getPlatform().isMySQL() || session.getLogin().getPlatform().isSymfoware()) {
            // Oracle does not support millis, Sybase stores them only within 1-2 millis...
            //MySQL does not support millis as of 5.0
            this.creationTimestampMillis = creationTimestamp.getNanos();
            this.creationTimestamp.setNanos(0);
        }
    }

    public void removeEmployee(Employee employee) {
        employees.removeElement(employee);
    }

    /**
     * Return a platform independant definition of the database table.
     */
    public static TableDefinition tableDefinition() {
        TableDefinition definition = new TableDefinition();

        definition.setName("MAP_SHIP");

        definition.addPrimaryKeyField("SP_TS", Timestamp.class);
        definition.addPrimaryKeyField("SP_TSMIL", Integer.class);
        definition.addField("QUANTITY", String.class, 20);
        definition.addField("SHP_MODE", String.class, 50);

        return definition;
    }

    public String toString() {
        return "Shipment(" + quantityShipped + ")";
    }
}
