/*
 * Copyright (c) 1998, 2021 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 v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.models.mapping;

import java.util.Vector;

import org.eclipse.persistence.descriptors.RelationalDescriptor;
import org.eclipse.persistence.internal.identitymaps.FullIdentityMap;

import org.eclipse.persistence.mappings.DirectCollectionMapping;
import org.eclipse.persistence.mappings.DirectToFieldMapping;
import org.eclipse.persistence.mappings.ManyToManyMapping;
import org.eclipse.persistence.mappings.OneToManyMapping;
import org.eclipse.persistence.mappings.OneToOneMapping;
import org.eclipse.persistence.mappings.TransformationMapping;
import org.eclipse.persistence.mappings.converters.ObjectTypeConverter;
import org.eclipse.persistence.mappings.converters.SerializedObjectConverter;
import org.eclipse.persistence.mappings.converters.TypeConversionConverter;

import org.eclipse.persistence.sessions.Project;


public class MappingProject extends Project {
    public MappingProject() {
        setName("ComplexMappingSystem");

        buildAddressDescriptor();
        buildCompanyCardDescriptor();
        buildComputerDescriptor();
        buildCubicleDescriptor();
        buildEmergencyExitDescriptor();
        buildEmployeeDescriptor();
        buildHardwareDescriptor();
        buildMonitorDescriptor();
        buildPhoneDescriptor();
        buildShipmentDescriptor();
        buildSecureSystemDescriptor();
        buildIdentificationDescriptor();
        buildPeripheralDescriptor();
    }

    protected void buildAddressDescriptor() {
        RelationalDescriptor descriptor = new RelationalDescriptor();

        // SECTION: DESCRIPTOR
        descriptor.setJavaClass(Address.class);
        Vector vector = new Vector();
        vector.addElement("MAP_ADD");
        descriptor.setTableNames(vector);
        descriptor.addPrimaryKeyFieldName("MAP_ADD.A_ID");

        // SECTION: PROPERTIES
        descriptor.setSequenceNumberName("SEQ_ID");
        descriptor.setSequenceNumberFieldName("A_ID");

        // SECTION: COPY POLICY
        descriptor.createCopyPolicy("constructor");

        descriptor.useWeakIdentityMap();

        // SECTION: INSTANTIATION POLICY
        descriptor.createInstantiationPolicy("constructor");

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping = new DirectToFieldMapping();
        directtofieldmapping.setAttributeName("id");
        directtofieldmapping.setIsReadOnly(false);
        directtofieldmapping.setFieldName("MAP_ADD.A_ID");
        descriptor.addMapping(directtofieldmapping);

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping1 = new DirectToFieldMapping();
        directtofieldmapping1.setAttributeName("location");
        directtofieldmapping1.setIsReadOnly(false);
        directtofieldmapping1.setFieldName("MAP_ADD.LOCATION");
        descriptor.addMapping(directtofieldmapping1);

        // SECTION: ONETOONEMAPPING
        OneToOneMapping onetoonemapping = new OneToOneMapping();
        onetoonemapping.setAttributeName("employee");
        onetoonemapping.setIsReadOnly(false);
        onetoonemapping.setUsesIndirection(false);
        onetoonemapping.setReferenceClass(Employee.class);
        onetoonemapping.setIsPrivateOwned(false);
        onetoonemapping.addTargetForeignKeyFieldName("MAP_EMP.A_ID", "MAP_ADD.A_ID");
        descriptor.addMapping(onetoonemapping);

        // SECTION: TRANSFORMATIONMAPPING
        TransformationMapping transformationmapping = new TransformationMapping();
        transformationmapping.setAttributeName("province");
        transformationmapping.setIsReadOnly(false);
        transformationmapping.setUsesIndirection(false);
        transformationmapping.setAttributeTransformation("getProvinceFromRow");
        transformationmapping.addFieldTransformation("MAP_ADD.PROVINCE", "getProvinceFromObject");
        descriptor.addMapping(transformationmapping);
        addDescriptor(descriptor);
    }

    protected void buildCompanyCardDescriptor() {
        RelationalDescriptor descriptor = new RelationalDescriptor();

        // SECTION: DESCRIPTOR
        descriptor.setJavaClass(CompanyCard.class);
        Vector vector = new Vector();
        vector.addElement("MAP_CARD");
        descriptor.setTableNames(vector);
        descriptor.addPrimaryKeyFieldName("MAP_CARD.COM_ID");

        // SECTION: PROPERTIES
        descriptor.setIdentityMapClass(FullIdentityMap.class);
        descriptor.setExistenceChecking("Check cache");
        descriptor.setIdentityMapSize(100);

        // SECTION: COPY POLICY
        descriptor.createCopyPolicy("constructor");

        // SECTION: INSTANTIATION POLICY
        descriptor.createInstantiationPolicy("constructor");

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping1 = new DirectToFieldMapping();
        directtofieldmapping1.setAttributeName("number");
        directtofieldmapping1.setIsReadOnly(false);
        directtofieldmapping1.setFieldName("MAP_CARD.CARDNUMBER");
        descriptor.addMapping(directtofieldmapping1);

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping2 = new DirectToFieldMapping();
        directtofieldmapping2.setAttributeName("limit");
        directtofieldmapping2.setIsReadOnly(false);
        directtofieldmapping2.setFieldName("MAP_CARD.AMOUNT_LIMIT");
        descriptor.addMapping(directtofieldmapping2);

        // SECTION: ONETOONEMAPPING
        OneToOneMapping oneToOneMapping = new OneToOneMapping();
        oneToOneMapping.setReferenceClass(Address.class);
        oneToOneMapping.setAttributeName("owner");
        oneToOneMapping.setIsReadOnly(false);
        oneToOneMapping.addForeignKeyFieldName("MAP_CARD.COM_ID", "MAP_ADD.A_ID");
        oneToOneMapping.dontUseIndirection();
        descriptor.addMapping(oneToOneMapping);

        addDescriptor(descriptor);
    }

    protected void buildComputerDescriptor() {
        RelationalDescriptor descriptor = new RelationalDescriptor();

        // SECTION: DESCRIPTOR
        descriptor.setJavaClass(Computer.class);
        descriptor.getInheritancePolicy().setParentClass(Hardware.class);
        Vector vector = new Vector();
        vector.addElement("MAP_COM");
        descriptor.setTableNames(vector);
        descriptor.addPrimaryKeyFieldName("MAP_COM.ID");

        // SECTION: PROPERTIES
        descriptor.getInheritancePolicy().setShouldReadSubclasses(false);

        // SECTION: COPY POLICY
        descriptor.createCopyPolicy("constructor");

        // SECTION: INSTANTIATION POLICY
        descriptor.createInstantiationPolicy("static method");
        descriptor.getInstantiationPolicy().setMethodName("createNew");

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping = new DirectToFieldMapping();
        directtofieldmapping.setAttributeName("description");
        directtofieldmapping.setIsReadOnly(false);
        directtofieldmapping.setFieldName("MAP_COM.DESCRIP");
        descriptor.addMapping(directtofieldmapping);

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping1 = new DirectToFieldMapping();
        directtofieldmapping1.setAttributeName("id");
        directtofieldmapping1.setIsReadOnly(false);
        directtofieldmapping1.setFieldName("MAP_COM.ID");
        descriptor.addMapping(directtofieldmapping1);

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping2 = new DirectToFieldMapping();
        directtofieldmapping2.setAttributeName("serialNumber");
        directtofieldmapping2.setIsReadOnly(false);
        directtofieldmapping2.setGetMethodName("getSerialNumber");
        directtofieldmapping2.setSetMethodName("setSerialNumber");
        directtofieldmapping2.setFieldName("MAP_COM.SERL_NO");
        descriptor.addMapping(directtofieldmapping2);

        // SECTION: OBJECTTYPEMAPPING
        DirectToFieldMapping objecttypemapping = new DirectToFieldMapping();
        ObjectTypeConverter objecttypeconverter = new ObjectTypeConverter();
        objecttypemapping.setAttributeName("isMacintosh");
        objecttypemapping.setIsReadOnly(false);
        objecttypemapping.setFieldName("MAP_COM.IS_MAC");
        objecttypeconverter.addConversionValue("No", Boolean.valueOf(false));
        objecttypeconverter.addConversionValue("Yes", Boolean.valueOf(true));
        objecttypemapping.setNullValue(Boolean.valueOf(false));
        objecttypemapping.setConverter(objecttypeconverter);
        descriptor.addMapping(objecttypemapping);

        // SECTION: ONETOONEMAPPING
        OneToOneMapping onetoonemapping = new OneToOneMapping();
        onetoonemapping.setAttributeName("monitor");
        onetoonemapping.setIsReadOnly(false);
        onetoonemapping.setUsesIndirection(false);
        onetoonemapping.setGetMethodName("getMonitor");
        onetoonemapping.setSetMethodName("setMonitor");
        onetoonemapping.setReferenceClass(Monitor.class);
        onetoonemapping.setIsPrivateOwned(true);
        onetoonemapping.addForeignKeyFieldName("MAP_COM.MON_SER", "MAP_MON.SERL_NO");
        descriptor.addMapping(onetoonemapping);
        addDescriptor(descriptor);
    }

    protected void buildCubicleDescriptor() {
        RelationalDescriptor descriptor = new RelationalDescriptor();

        // SECTION: DESCRIPTOR
        descriptor.setJavaClass(Cubicle.class);
        Vector vector = new Vector();
        vector.addElement("MAP_CUB");
        descriptor.setTableNames(vector);
        descriptor.addPrimaryKeyFieldName("MAP_CUB.C_ID");

        // SECTION: PROPERTIES
        descriptor.setSequenceNumberName("SEQ_ID");
        descriptor.setSequenceNumberFieldName("C_ID");

        // SECTION: COPY POLICY
        descriptor.createCopyPolicy("constructor");

        // SECTION: INSTANTIATION POLICY
        descriptor.createInstantiationPolicy("constructor");

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping typeConversionMapping = new DirectToFieldMapping();
        TypeConversionConverter typeConversionConverter = new TypeConversionConverter();
        typeConversionMapping.setAttributeName("id");
        typeConversionMapping.setIsReadOnly(false);
        typeConversionMapping.setFieldName("MAP_CUB.C_ID");
        typeConversionConverter.setObjectClass(java.math.BigDecimal.class);
        typeConversionConverter.setDataClass(String.class);
        typeConversionMapping.setConverter(typeConversionConverter);
        descriptor.addMapping(typeConversionMapping);

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping1 = new DirectToFieldMapping();
        directtofieldmapping1.setAttributeName("location");
        directtofieldmapping1.setIsReadOnly(false);
        directtofieldmapping1.setFieldName("MAP_CUB.LOCATION");
        descriptor.addMapping(directtofieldmapping1);

        // SECTION: MANYTOMANYMAPPING
        ManyToManyMapping manytomanymapping = new ManyToManyMapping();
        manytomanymapping.setAttributeName("emergencyExits");
        manytomanymapping.setIsReadOnly(false);
        manytomanymapping.setUsesIndirection(false);
        manytomanymapping.setReferenceClass(EmergencyExit.class);
        manytomanymapping.setIsPrivateOwned(false);
        manytomanymapping.setRelationTableName("CUBICLE_EMERGENCYEXIT");
        manytomanymapping.addSourceRelationKeyFieldName("CUBICLE_EMERGENCYEXIT.CUBICLE_LOCATION", "MAP_CUB.LOCATION");
        manytomanymapping.addTargetRelationKeyFieldName("CUBICLE_EMERGENCYEXIT.EXIT_ID", "MAP_EMERGENCYEXIT.EXIT_ID");
        descriptor.addMapping(manytomanymapping);

        addDescriptor(descriptor);
    }

    protected void buildEmergencyExitDescriptor() {
        RelationalDescriptor descriptor = new RelationalDescriptor();

        // SECTION: DESCRIPTOR
        descriptor.setJavaClass(EmergencyExit.class);
        Vector vector = new Vector();
        vector.addElement("MAP_EMERGENCYEXIT");
        descriptor.setTableNames(vector);
        descriptor.addPrimaryKeyFieldName("MAP_EMERGENCYEXIT.EXIT_ID");

        // SECTION: PROPERTIES
        descriptor.setSequenceNumberName("SEQ_ID");
        descriptor.setSequenceNumberFieldName("EXIT_ID");

        // SECTION: COPY POLICY
        descriptor.createCopyPolicy("constructor");

        // SECTION: INSTANTIATION POLICY
        descriptor.createInstantiationPolicy("constructor");

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping = new DirectToFieldMapping();
        directtofieldmapping.setAttributeName("id");
        directtofieldmapping.setIsReadOnly(false);
        directtofieldmapping.setFieldName("MAP_EMERGENCYEXIT.EXIT_ID");
        descriptor.addMapping(directtofieldmapping);

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping1 = new DirectToFieldMapping();
        directtofieldmapping1.setAttributeName("location");
        directtofieldmapping1.setIsReadOnly(false);
        directtofieldmapping1.setFieldName("MAP_EMERGENCYEXIT.LOCATION");
        descriptor.addMapping(directtofieldmapping1);

        addDescriptor(descriptor);
    }

    protected void buildEmployeeDescriptor() {
        RelationalDescriptor descriptor = new RelationalDescriptor();

        // SECTION: DESCRIPTOR
        descriptor.setJavaClass(Employee.class);
        Vector vector = new Vector();
        vector.addElement("MAP_EMP");
        descriptor.setTableNames(vector);
        descriptor.addPrimaryKeyFieldName("MAP_EMP.FNAME");
        descriptor.addPrimaryKeyFieldName("MAP_EMP.LNAME");
        descriptor.addPrimaryKeyFieldName("MAP_EMP.SEX");

        // SECTION: COPY POLICY
        descriptor.createCopyPolicy("constructor");

        descriptor.useSoftIdentityMap();

        // SECTION: INSTANTIATION POLICY
        descriptor.createInstantiationPolicy("constructor");

        // SECTION: DIRECTCOLLECTIONMAPPING
        DirectCollectionMapping directcollectionmapping = new DirectCollectionMapping();
        directcollectionmapping.setAttributeName("policies");
        directcollectionmapping.setIsReadOnly(false);
        directcollectionmapping.setUsesIndirection(true);
        directcollectionmapping.setIsPrivateOwned(false);
        directcollectionmapping.setDirectFieldName("MAP_POL.POLICY");
        directcollectionmapping.setReferenceTableName("MAP_POL");
        directcollectionmapping.addReferenceKeyFieldName("MAP_POL.LNAME", "MAP_EMP.LNAME");
        directcollectionmapping.addReferenceKeyFieldName("MAP_POL.FNAME", "MAP_EMP.FNAME");
        descriptor.addMapping(directcollectionmapping);

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping = new DirectToFieldMapping();
        directtofieldmapping.setAttributeName("firstName");
        directtofieldmapping.setIsReadOnly(false);
        directtofieldmapping.setFieldName("MAP_EMP.FNAME");
        descriptor.addMapping(directtofieldmapping);

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping1 = new DirectToFieldMapping();
        directtofieldmapping1.setAttributeName("lastName");
        directtofieldmapping1.setIsReadOnly(false);
        directtofieldmapping1.setFieldName("MAP_EMP.LNAME");
        descriptor.addMapping(directtofieldmapping1);

        // SECTION: ONETOONEMAPPING
        OneToOneMapping onetoonemapping1 = new OneToOneMapping();
        onetoonemapping1.setAttributeName("cubicle");
        onetoonemapping1.setIsReadOnly(false);
        onetoonemapping1.setUsesIndirection(false);
        onetoonemapping1.setReferenceClass(Cubicle.class);
        onetoonemapping1.setIsPrivateOwned(true);
        onetoonemapping1.addForeignKeyFieldName("MAP_EMP.C_ID", "MAP_CUB.C_ID");
        descriptor.addMapping(onetoonemapping1);

        // SECTION: MANYTOMANYMAPPING
        ManyToManyMapping manytomanymapping = new ManyToManyMapping();
        manytomanymapping.setAttributeName("phoneNumbers");
        manytomanymapping.setIsReadOnly(false);
        manytomanymapping.setUsesIndirection(true);
        manytomanymapping.setReferenceClass(Phone.class);
        manytomanymapping.setIsPrivateOwned(true);
        manytomanymapping.setRelationTableName("MAP_EMPH");
        manytomanymapping.addSourceRelationKeyFieldName("MAP_EMPH.LNAME", "MAP_EMP.LNAME");
        manytomanymapping.addSourceRelationKeyFieldName("MAP_EMPH.FNAME", "MAP_EMP.FNAME");
        manytomanymapping.addTargetRelationKeyFieldName("MAP_EMPH.P_ID", "MAP_PHO.P_ID");
        descriptor.addMapping(manytomanymapping);

        // SECTION: MANYTOMANYMAPPING
        ManyToManyMapping manytomanymapping1 = new ManyToManyMapping();
        manytomanymapping1.setAttributeName("shipments");
        manytomanymapping1.setIsReadOnly(false);
        manytomanymapping1.setUsesIndirection(false);
        manytomanymapping1.setReferenceClass(Shipment.class);
        manytomanymapping1.setIsPrivateOwned(false);
        manytomanymapping1.setRelationTableName("MAP_EMSP");
        manytomanymapping1.addSourceRelationKeyFieldName("MAP_EMSP.EMP_LNAME", "MAP_EMP.LNAME");
        manytomanymapping1.addSourceRelationKeyFieldName("MAP_EMSP.EMP_FNAME", "MAP_EMP.FNAME");
        manytomanymapping1.addTargetRelationKeyFieldName("MAP_EMSP.SP_TSMIL", "MAP_SHIP.SP_TSMIL");
        manytomanymapping1.addTargetRelationKeyFieldName("MAP_EMSP.SP_TS", "MAP_SHIP.SP_TS");
        descriptor.addMapping(manytomanymapping1);

        // SECTION: OBJECTTYPEMAPPING
        DirectToFieldMapping objecttypemapping = new DirectToFieldMapping();
        ObjectTypeConverter objecttypeconverter = new ObjectTypeConverter();
        objecttypemapping.setAttributeName("sex");
        objecttypemapping.setIsReadOnly(false);
        objecttypemapping.setFieldName("MAP_EMP.SEX");
        objecttypeconverter.setDefaultAttributeValue("female");
        objecttypeconverter.addConversionValue("F", "female");
        objecttypeconverter.addConversionValue("M", "male");
        objecttypemapping.setConverter(objecttypeconverter);
        descriptor.addMapping(objecttypemapping);

        // SECTION: ONETOMANYMAPPING
        OneToManyMapping onetomanymapping = new OneToManyMapping();
        onetomanymapping.setAttributeName("managedEmployees");
        onetomanymapping.setIsReadOnly(false);
        onetomanymapping.setUsesIndirection(false);
        onetomanymapping.setGetMethodName("getManagedEmployeesForTOPLink");
        onetomanymapping.setSetMethodName("setManagedEmployeesFromTOPLink");
        onetomanymapping.setReferenceClass(Employee.class);
        onetomanymapping.setIsPrivateOwned(false);
        onetomanymapping.addTargetForeignKeyFieldName("MAP_EMP.M_LNAME", "MAP_EMP.LNAME");
        onetomanymapping.addTargetForeignKeyFieldName("MAP_EMP.M_FNAME", "MAP_EMP.FNAME");
        descriptor.addMapping(onetomanymapping);

        // SECTION: ONETOONEMAPPING
        OneToOneMapping onetoonemapping = new OneToOneMapping();
        onetoonemapping.setAttributeName("computer");
        onetoonemapping.setIsReadOnly(false);
        onetoonemapping.setUsesIndirection(false);
        onetoonemapping.setGetMethodName("getComputer");
        onetoonemapping.setSetMethodName("setComputer");
        onetoonemapping.setReferenceClass(Hardware.class);
        onetoonemapping.setIsPrivateOwned(true);
        onetoonemapping.addTargetForeignKeyFieldName("MAP_HRW.EMP_FNAME", "MAP_EMP.FNAME");
        onetoonemapping.addTargetForeignKeyFieldName("MAP_HRW.EMP_LNAME", "MAP_EMP.LNAME");
        descriptor.addMapping(onetoonemapping);

        // SECTION: ONETOONEMAPPING
        OneToOneMapping onetoonemapping2 = new OneToOneMapping();
        onetoonemapping2.setAttributeName("manager");
        onetoonemapping2.setIsReadOnly(false);
        onetoonemapping2.setUsesIndirection(false);
        onetoonemapping2.setGetMethodName("getManager");
        onetoonemapping2.setSetMethodName("setManager");
        onetoonemapping2.setReferenceClass(Employee.class);
        onetoonemapping2.setIsPrivateOwned(false);
        onetoonemapping2.addForeignKeyFieldName("MAP_EMP.M_FNAME", "MAP_EMP.FNAME");
        onetoonemapping2.addForeignKeyFieldName("MAP_EMP.M_LNAME", "MAP_EMP.LNAME");
        descriptor.addMapping(onetoonemapping2);

        // SECTION: SERIALIZEDMAPPING
        DirectToFieldMapping serializedmapping = new DirectToFieldMapping();
        SerializedObjectConverter serializedconverter = new SerializedObjectConverter();
        serializedmapping.setAttributeName("jobDescription");
        serializedmapping.setIsReadOnly(false);
        serializedmapping.setGetMethodName("getJobDescription");
        serializedmapping.setSetMethodName("setJobDescription");
        serializedmapping.setFieldName("MAP_EMP.JDESC");
        serializedmapping.setConverter(serializedconverter);
        descriptor.addMapping(serializedmapping);

        // SECTION: TRANSFORMATIONMAPPING
        TransformationMapping transformationmapping = new TransformationMapping();
        transformationmapping.setAttributeName("dateAndTimeOfBirth");
        transformationmapping.setIsReadOnly(false);
        transformationmapping.setUsesIndirection(false);
        transformationmapping.setAttributeTransformation("setDateAndTime");
        transformationmapping.addFieldTransformation("MAP_EMP.BDAY", "getDate");
        transformationmapping.addFieldTransformation("MAP_EMP.BTIME", "getTime");
        descriptor.addMapping(transformationmapping);

        // SECTION: TRANSFORMATIONMAPPING
        TransformationMapping transformationmapping1 = new TransformationMapping();
        transformationmapping1.setAttributeName("designation");
        transformationmapping1.setIsReadOnly(false);
        transformationmapping1.setUsesIndirection(true);
        transformationmapping1.setGetMethodName("getDesignation");
        transformationmapping1.setSetMethodName("setDesignation");
        transformationmapping1.setAttributeTransformation("getRankFromRow");
        transformationmapping1.addFieldTransformation("MAP_EMP.ERANK", "getRankFromObject");
        descriptor.addMapping(transformationmapping1);

        // SECTION: TYPECONVERSIONMAPPING
        DirectToFieldMapping typeconversionmapping = new DirectToFieldMapping();
        TypeConversionConverter typeconversionconverter = new TypeConversionConverter();
        typeconversionmapping.setAttributeName("joiningDate");
        typeconversionmapping.setIsReadOnly(false);
        typeconversionmapping.setFieldName("MAP_EMP.JDAY");
        typeconversionconverter.setObjectClass(java.util.Date.class);
        typeconversionconverter.setDataClass(java.sql.Date.class);
        typeconversionmapping.setConverter(typeconversionconverter);
        descriptor.addMapping(typeconversionmapping);

        addDescriptor(descriptor);
    }

    protected void buildIdentificationDescriptor(){
        RelationalDescriptor descriptor = new RelationalDescriptor();

        // SECTION: DESCRIPTOR
        descriptor.setJavaClass(Identification.class);
        Vector vector = new Vector();
        vector.addElement("MAP_IDENTIFICATION");
        descriptor.setTableNames(vector);
        descriptor.addPrimaryKeyFieldName("MAP_IDENTIFICATION.ID");

        // SECTION: PROPERTIES
        descriptor.setSequenceNumberName("SEQ_ID");
        descriptor.setSequenceNumberFieldName("ID");

        // SECTION: COPY POLICY
        descriptor.createCopyPolicy("constructor");

        // SECTION: INSTANTIATION POLICY
        descriptor.createInstantiationPolicy("constructor");

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping = new DirectToFieldMapping();
        directtofieldmapping.setAttributeName("id");
        directtofieldmapping.setIsReadOnly(false);
        directtofieldmapping.setFieldName("MAP_IDENTIFICATION.ID");
        descriptor.addMapping(directtofieldmapping);

        addDescriptor(descriptor);
    }

    protected void buildHardwareDescriptor() {
        RelationalDescriptor descriptor = new RelationalDescriptor();

        // SECTION: DESCRIPTOR
        descriptor.setJavaClass(Hardware.class);
        Vector vector = new Vector();
        vector.addElement("MAP_HRW");
        descriptor.setTableNames(vector);
        descriptor.addPrimaryKeyFieldName("MAP_HRW.ID");

        // SECTION: PROPERTIES
        descriptor.setSequenceNumberName("SEQ");
        descriptor.setSequenceNumberFieldName("ID");
        descriptor.getInheritancePolicy().setShouldReadSubclasses(true);
        descriptor.getInheritancePolicy().setClassIndicatorFieldName("TYPE");
        descriptor.getInheritancePolicy().setShouldUseClassNameAsIndicator(false);
        descriptor.getInheritancePolicy().addClassIndicator(Computer.class, "C");
        descriptor.getInheritancePolicy().addClassIndicator(Monitor.class, "M");

        // SECTION: COPY POLICY
        descriptor.createCopyPolicy("constructor");

        // SECTION: INSTANTIATION POLICY
        descriptor.createInstantiationPolicy("constructor");

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping = new DirectToFieldMapping();
        directtofieldmapping.setAttributeName("distibuted");
        directtofieldmapping.setIsReadOnly(false);
        directtofieldmapping.setFieldName("MAP_HRW.DIST");
        descriptor.addMapping(directtofieldmapping);

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping1 = new DirectToFieldMapping();
        directtofieldmapping1.setAttributeName("id");
        directtofieldmapping1.setIsReadOnly(false);
        directtofieldmapping1.setFieldName("MAP_HRW.ID");
        descriptor.addMapping(directtofieldmapping1);

        // SECTION: ONETOONEMAPPING
        OneToOneMapping onetoonemapping = new OneToOneMapping();
        onetoonemapping.setAttributeName("employee");
        onetoonemapping.setIsReadOnly(false);
        onetoonemapping.setUsesIndirection(false);
        onetoonemapping.setReferenceClass(Employee.class);
        onetoonemapping.setIsPrivateOwned(false);
        onetoonemapping.addForeignKeyFieldName("MAP_HRW.EMP_FNAME", "MAP_EMP.FNAME");
        onetoonemapping.addForeignKeyFieldName("MAP_HRW.EMP_LNAME", "MAP_EMP.LNAME");
        descriptor.addMapping(onetoonemapping);

        addDescriptor(descriptor);
    }

    protected void buildMonitorDescriptor() {
        RelationalDescriptor descriptor = new RelationalDescriptor();

        // SECTION: DESCRIPTOR
        descriptor.setJavaClass(Monitor.class);
        descriptor.getInheritancePolicy().setParentClass(Hardware.class);
        Vector vector = new Vector();
        vector.addElement("MAP_MON");
        descriptor.setTableNames(vector);
        descriptor.addPrimaryKeyFieldName("MAP_MON.ID");

        // SECTION: PROPERTIES
        descriptor.getInheritancePolicy().setShouldReadSubclasses(false);

        // SECTION: COPY POLICY
        descriptor.createCopyPolicy("constructor");

        // SECTION: INSTANTIATION POLICY
        descriptor.createInstantiationPolicy("constructor");

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping = new DirectToFieldMapping();
        directtofieldmapping.setAttributeName("brand");
        directtofieldmapping.setIsReadOnly(false);
        directtofieldmapping.setGetMethodName("getBrand");
        directtofieldmapping.setSetMethodName("setBrand");
        directtofieldmapping.setFieldName("MAP_MON.BRAND");
        descriptor.addMapping(directtofieldmapping);

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping1 = new DirectToFieldMapping();
        directtofieldmapping1.setAttributeName("serialNumber");
        directtofieldmapping1.setIsReadOnly(false);
        directtofieldmapping1.setGetMethodName("getSerialNumber");
        directtofieldmapping1.setSetMethodName("setSerialNumber");
        directtofieldmapping1.setFieldName("MAP_MON.SERL_NO");
        descriptor.addMapping(directtofieldmapping1);

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping2 = new DirectToFieldMapping();
        directtofieldmapping2.setAttributeName("size");
        directtofieldmapping2.setIsReadOnly(false);
        directtofieldmapping2.setGetMethodName("getSize");
        directtofieldmapping2.setSetMethodName("setSize");
        directtofieldmapping2.setFieldName("MAP_MON.MSIZE");
        descriptor.addMapping(directtofieldmapping2);

        // SECTION: ONETOONEMAPPING
        OneToOneMapping onetoonemapping = new OneToOneMapping();
        onetoonemapping.setAttributeName("computer");
        onetoonemapping.setIsReadOnly(false);
        onetoonemapping.setUsesIndirection(false);
        onetoonemapping.setGetMethodName("getComputer");
        onetoonemapping.setSetMethodName("setComputer");
        onetoonemapping.setReferenceClass(Computer.class);
        onetoonemapping.setIsPrivateOwned(false);
        onetoonemapping.addForeignKeyFieldName("MAP_MON.COM_SER", "MAP_COM.SERL_NO");
        descriptor.addMapping(onetoonemapping);

        addDescriptor(descriptor);
    }

    protected void buildPhoneDescriptor() {
        RelationalDescriptor descriptor = new RelationalDescriptor();

        // SECTION: DESCRIPTOR
        descriptor.setJavaClass(Phone.class);
        Vector vector = new Vector();
        vector.addElement("MAP_PHO");
        descriptor.setTableNames(vector);
        descriptor.addPrimaryKeyFieldName("MAP_PHO.P_ID");

        // SECTION: PROPERTIES
        descriptor.setSequenceNumberName("SEQ_ID");
        descriptor.setSequenceNumberFieldName("P_ID");

        // SECTION: COPY POLICY
        descriptor.createCopyPolicy("constructor");

        descriptor.useHardCacheWeakIdentityMap();

        // SECTION: INSTANTIATION POLICY
        descriptor.createInstantiationPolicy("constructor");

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping = new DirectToFieldMapping();
        directtofieldmapping.setAttributeName("areaCode");
        directtofieldmapping.setIsReadOnly(false);
        directtofieldmapping.setFieldName("MAP_PHO.AREACODE");
        descriptor.addMapping(directtofieldmapping);

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping1 = new DirectToFieldMapping();
        directtofieldmapping1.setAttributeName("id");
        directtofieldmapping1.setIsReadOnly(false);
        directtofieldmapping1.setFieldName("MAP_PHO.P_ID");
        descriptor.addMapping(directtofieldmapping1);

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping2 = new DirectToFieldMapping();
        directtofieldmapping2.setAttributeName("number");
        directtofieldmapping2.setIsReadOnly(false);
        directtofieldmapping2.setFieldName("MAP_PHO.PNUMBER");
        descriptor.addMapping(directtofieldmapping2);
        addDescriptor(descriptor);
    }

    protected void buildSecureSystemDescriptor(){
        RelationalDescriptor descriptor = new RelationalDescriptor();

        // SECTION: DESCRIPTOR
        descriptor.setJavaClass(SecureSystem.class);
        Vector vector = new Vector();
        vector.addElement("MAP_SECURE");
        descriptor.setTableNames(vector);
        descriptor.addPrimaryKeyFieldName("MAP_SECURE.MANUFACTURER");
        descriptor.addPrimaryKeyFieldName("MAP_SECURE.IDENTIFICATION_ID");

        // SECTION: PROPERTIES
        // SECTION: COPY POLICY
        descriptor.createCopyPolicy("constructor");

        // SECTION: INSTANTIATION POLICY
        descriptor.createInstantiationPolicy("constructor");

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping = new DirectToFieldMapping();
        directtofieldmapping.setAttributeName("manufacturer");
        directtofieldmapping.setIsReadOnly(false);
        directtofieldmapping.setFieldName("MAP_SECURE.MANUFACTURER");
        descriptor.addMapping(directtofieldmapping);

        // SECTION: ONETOONEMAPPING
        OneToOneMapping onetoonemapping1 = new OneToOneMapping();
        onetoonemapping1.setAttributeName("id");
        onetoonemapping1.setIsReadOnly(false);
        onetoonemapping1.setUsesIndirection(false);
        onetoonemapping1.setReferenceClass(Identification.class);
        onetoonemapping1.setIsPrivateOwned(false);
        onetoonemapping1.addForeignKeyFieldName("MAP_SECURE.IDENTIFICATION_ID", "MAP_IDENTIFICATION.ID");
        descriptor.addMapping(onetoonemapping1);

        addDescriptor(descriptor);
    }

    protected void buildShipmentDescriptor() {
        RelationalDescriptor descriptor = new RelationalDescriptor();

        // SECTION: DESCRIPTOR
        descriptor.setJavaClass(Shipment.class);
        Vector vector = new Vector();
        vector.addElement("MAP_SHIP");
        descriptor.setTableNames(vector);
        descriptor.addPrimaryKeyFieldName("MAP_SHIP.SP_TS");
        descriptor.addPrimaryKeyFieldName("MAP_SHIP.SP_TSMIL");

        // SECTION: EVENT MANAGER
        descriptor.getEventManager().setPreInsertSelector("prepareForInsert");

        // SECTION: PROPERTIES
        // SECTION: COPY POLICY
        descriptor.createCopyPolicy("constructor");

        // SECTION: INSTANTIATION POLICY
        descriptor.createInstantiationPolicy("constructor");

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping = new DirectToFieldMapping();
        directtofieldmapping.setAttributeName("creationTimestamp");
        directtofieldmapping.setIsReadOnly(false);
        directtofieldmapping.setFieldName("MAP_SHIP.SP_TS");
        descriptor.addMapping(directtofieldmapping);

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping1 = new DirectToFieldMapping();
        directtofieldmapping1.setAttributeName("creationTimestampMillis");
        directtofieldmapping1.setIsReadOnly(false);
        directtofieldmapping1.setFieldName("MAP_SHIP.SP_TSMIL");
        descriptor.addMapping(directtofieldmapping1);

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping2 = new DirectToFieldMapping();
        directtofieldmapping2.setAttributeName("quantityShipped");
        directtofieldmapping2.setIsReadOnly(false);
        directtofieldmapping2.setFieldName("MAP_SHIP.QUANTITY");
        descriptor.addMapping(directtofieldmapping2);

        // SECTION: DIRECTTOFIELDMAPPING
        DirectToFieldMapping directtofieldmapping3 = new DirectToFieldMapping();
        directtofieldmapping3.setAttributeName("shipMode");
        directtofieldmapping3.setIsReadOnly(false);
        directtofieldmapping3.setFieldName("MAP_SHIP.SHP_MODE");
        descriptor.addMapping(directtofieldmapping3);

        // SECTION: MANYTOMANYMAPPING
        ManyToManyMapping manytomanymapping = new ManyToManyMapping();
        manytomanymapping.setAttributeName("employees");
        manytomanymapping.setIsReadOnly(true);
        manytomanymapping.setUsesIndirection(false);
        manytomanymapping.setReferenceClass(Employee.class);
        manytomanymapping.setIsPrivateOwned(false);
        manytomanymapping.setRelationTableName("MAP_EMSP");
        manytomanymapping.addSourceRelationKeyFieldName("MAP_EMSP.SP_TSMIL", "MAP_SHIP.SP_TSMIL");
        manytomanymapping.addSourceRelationKeyFieldName("MAP_EMSP.SP_TS", "MAP_SHIP.SP_TS");
        manytomanymapping.addTargetRelationKeyFieldName("MAP_EMSP.EMP_LNAME", "MAP_EMP.LNAME");
        manytomanymapping.addTargetRelationKeyFieldName("MAP_EMSP.EMP_FNAME", "MAP_EMP.FNAME");
        descriptor.addMapping(manytomanymapping);
        addDescriptor(descriptor);
    }

    public void buildPeripheralDescriptor() {
        RelationalDescriptor descriptor = new RelationalDescriptor();
        descriptor.setJavaClass(Peripheral.class);
        descriptor.addTableName("MAP_PERIPHERAL");
        descriptor.addPrimaryKeyFieldName("MAP_PERIPHERAL.ID");

        // ClassDescriptor Properties.
        descriptor.setAlias("Peripheral");
        descriptor.setAmendmentClass(Peripheral.class);
        descriptor.setAmendmentMethodName("addToDescriptor");

        // Query Manager.
        descriptor.getQueryManager().checkCacheForDoesExist();

        // Mappings.
        DirectToFieldMapping validMapping = new DirectToFieldMapping();
        validMapping.setAttributeName("valid");
        validMapping.setFieldName("MAP_PERIPHERAL.VALID");
        ObjectTypeConverter validMappingConverter = new ObjectTypeConverter();
        validMappingConverter.addConversionValue(Character.valueOf('N'), Boolean.valueOf("false"));
        validMappingConverter.addConversionValue(Character.valueOf('Y'), Boolean.valueOf("true"));
        validMapping.setConverter(validMappingConverter);
        descriptor.addMapping(validMapping);

        DirectToFieldMapping idMapping = new DirectToFieldMapping();
        idMapping.setAttributeName("id");
        idMapping.setFieldName("MAP_PERIPHERAL.ID");
        descriptor.addMapping(idMapping);

        DirectToFieldMapping nameMapping = new DirectToFieldMapping();
        nameMapping.setAttributeName("name");
        nameMapping.setFieldName("MAP_PERIPHERAL.NAME");
        descriptor.addMapping(nameMapping);

        descriptor.applyAmendmentMethod();

        addDescriptor(descriptor);
    }
}
