/*******************************************************************************
 * 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.tests.xdb;

import java.io.*;

import java.util.*;

import javax.xml.parsers.*;

import org.w3c.dom.*;

import org.eclipse.persistence.tools.schemaframework.*;

/**
 * A simple business object containing an XML Document
 */
public class Employee_XML implements Serializable {
    public int id;
    public String firstName;
    public String lastName;
    public String gender;
    public Employee_XML manager;
    public Vector managedEmployees;
    public Document resume;
    public String payroll_xml;

    public Employee_XML() {
    }

    public static Document documentFromString(String xmlString) {
        try {
            ByteArrayInputStream stream = new ByteArrayInputStream(xmlString.getBytes());
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(stream);
            return doc;
        } catch (Exception ex) {
            System.out.println("Unable to create document due to: " + ex.getMessage());
            ex.printStackTrace();
        }
        return null;
    }

    public static Employee_XML example0() {
        try {
            Employee_XML emp = new Employee_XML();
            emp.firstName = "Bob";
            emp.lastName = "Jones";
            emp.gender = "Male";
            String resume = resume0();
            emp.resume = documentFromString(resume);
            emp.managedEmployees = new Vector();
            emp.payroll_xml = "<payroll><salary>100000</salary><pay-period>bi-monthly</pay-period></payroll>";
            return emp;
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    public static Employee_XML example1() {
        try {
            Employee_XML emp = new Employee_XML();
            emp.firstName = "Frank";
            emp.lastName = "Cotton";
            emp.gender = "Male";
            String resume = resume1();
            emp.resume = documentFromString(resume);
            emp.payroll_xml = "<payroll><salary>10000</salary><pay-period>weekly</pay-period></payroll>";
            return emp;
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    public static String resume0() {
        String resume = "<resume>\n";
        resume += "  <first-name>Bob</first-name>\n";
        resume += "   <last-name>Jones</last-name>\n";
        resume += "   <age>45</age>\n";
        resume += "   <education>\n";
        resume += "     <degree>BCS</degree>\n";
        resume += "     <degree>MBA</degree>\n";
        resume += "   </education>\n";
        resume += "</resume>";
        return resume;
    }

    public static String resume1() {
        String resume = "<resume>\n";
        resume += "  <first-name>Frank</first-name>\n";
        resume += "   <last-name>Cotton</last-name>\n";
        resume += "   <age>27</age>\n";
        resume += "   <education>\n";
        resume += "     <degree>BCS</degree>\n";
        resume += "   </education>\n";
        resume += "</resume>";
        return resume;
    }

    public static TableDefinition tableDefinition() {
        TableDefinition definition = new TableDefinition();

        definition.setName("EMPLOYEE_XML");

        definition.addIdentityField("ID", java.lang.Integer.class);
        definition.addField("FIRST_NAME", String.class);
        definition.addField("LAST_NAME", String.class);
        definition.addField("GENDER", String.class);
        definition.addField("RESUME_XML", Document.class);
        definition.addField("PAYROLL_XML", Document.class);
        definition.addField("MANAGER_ID", java.lang.Integer.class);

        return definition;
    }
}
