/*******************************************************************************
 * 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.inheritance;

import java.io.*;
import java.util.Enumeration;
import org.eclipse.persistence.descriptors.*;
import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.mappings.*;
import org.eclipse.persistence.tools.schemaframework.*;
import org.eclipse.persistence.testing.models.inheritance.PC;

public class Computer implements Serializable {
    public int id;
    public int memory;
    public int processorSpeed;
    public String processorMake;
    public String manufacturer;

    public static void addToDescriptor(ClassDescriptor descriptor) {
        // In order for this domain model to work with all of our tests, it must be set
        // up so that the transformation mapping below is not added twice.
        // As a result, we check for the mapping before adding it.
        // The reason this mapping is not added in the project is that some Mapping Workbench
        // tests rely on the ammendment method.
        Enumeration mappings = descriptor.getMappings().elements();
        while (mappings.hasMoreElements()) {
            DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
            if (mapping.isTransformationMapping()) {
                Object ctype = ((TransformationMapping)mapping).getFieldNameToMethodNames().get("CTYPE");
                if (ctype != null) {
                    return;
                }
                ;
            }
        }

        TransformationMapping typeMapping = new TransformationMapping();
        typeMapping.addFieldTransformation("CTYPE", "getComputerType");
        descriptor.addMapping(typeMapping);

    }

    public static Mac example1() {
        Mac mac = new Mac();
        mac.processorSpeed = 166;
        mac.memory = 64;
        mac.processorMake = "Motorolla 6046";
        mac.manufacturer = "Apple";

        return mac;
    }

    public static IBMPC example2() {
        IBMPC pc = new IBMPC();
        pc.processorSpeed = 133;
        pc.memory = 32;
        pc.processorMake = "Intel Pentium";
        pc.manufacturer = "Dell";
        pc.isClone = "true";
        return pc;
    }

    public static IBMPC example3() {
        IBMPC pc = new IBMPC();
        pc.processorSpeed = 450;
        pc.memory = 128;
        pc.processorMake = "Intel Pentium II";
        pc.manufacturer = "Compact";
        pc.isClone = "true";

        return pc;
    }

    public static IBMPC example3a() {
        IBMPC pc = new IBMPC();
        pc.processorSpeed = 450;
        pc.memory = 128;
        pc.processorMake = "Intel Pentium II";
        pc.manufacturer = "IBM";
        pc.isClone = "false";

        return pc;
    }

    public static PC example4() {
        PC pc = new PC();
        pc.processorSpeed = 33;
        pc.memory = 8;
        pc.processorMake = "Motorolla 3000";
        pc.manufacturer = "Apple";

        return pc;
    }

    public static Mainframe example5() {
        Mainframe mainframe = new Mainframe();
        mainframe.processorSpeed = 5000;
        mainframe.memory = 1600;
        mainframe.processorMake = "R6000";
        mainframe.manufacturer = "IBM";
        mainframe.numberOfProcessors = 12;

        return mainframe;
    }

    public static Class getClassFromRow(Record row) {
        if (row.get("CTYPE").equals("PC")) {
            if (row.get("PCTYPE").equals("IBM")) {
                return org.eclipse.persistence.testing.models.inheritance.IBMPC.class;
            } else if (row.get("PCTYPE").equals("MAC")) {
                return org.eclipse.persistence.testing.models.inheritance.Mac.class;
            } else {
                return PC.class;
            }
        } else if (row.get("CTYPE").equals("MF")) {
            return org.eclipse.persistence.testing.models.inheritance.Mainframe.class;
        } else {
            return org.eclipse.persistence.testing.models.inheritance.Computer.class;
        }
    }

    public String getComputerType() {
        return "COM";
    }

    /**
     * Return the view for Oracle.
     */
    public static ViewDefinition oracleView() {
        ViewDefinition definition = new ViewDefinition();

        definition.setName("AllComputers");
        definition.setSelectClause("Select C.*, M.*" + " from INH_COMP C, INH_MF M" + " where C.id = M.MF_ID (+)");

        return definition;
    }

    /**
     * Return the view for Sybase.
     */
    public static ViewDefinition sybaseView() {
        ViewDefinition definition = new ViewDefinition();

        definition.setName("AllComputers");
        definition.setSelectClause("Select C.*, M.*" + " from INH_COMP C, INH_MF M" + " where C.ID *= M.MF_ID");

        return definition;
    }
    
    /**
     * Return the view for MySQL.  It is supported as of MySQL 5.0.1
     */
    public static ViewDefinition mySQLView() {
        ViewDefinition definition = new ViewDefinition();

        definition.setName("AllComputers");
        definition.setSelectClause("Select C.*, M.*" + " from INH_COMP C left join INH_MF M on C.ID = M.MF_ID");

        return definition;
    }
}
