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

import java.util.Vector;
import org.eclipse.persistence.sessions.Project;
import org.eclipse.persistence.oxm.XMLDescriptor;
import org.eclipse.persistence.oxm.mappings.XMLDirectMapping;
import org.eclipse.persistence.oxm.mappings.XMLCompositeDirectCollectionMapping;
import org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping;
import org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping;

/**
 *  @version $Header: DocPreservationTestProject.java 02-nov-2006.10:57:11 gyorke Exp $
 *  @author  mmacivor
 *  @since   release specific (what release of product did this appear in)
 */

public class DocPreservationTestProject extends Project
{
	public DocPreservationTestProject() 
	{
		buildEmployeeDescriptor();
		buildAddressDescriptor();
		buildCanadianAddressDescriptor();
		buildUSAddressDescriptor();
		buildPhoneNumberDescriptor();
	}
	
	public void buildEmployeeDescriptor() 
	{
		XMLDescriptor descriptor = new XMLDescriptor();
		descriptor.setDefaultRootElement("employee");
		descriptor.setShouldPreserveDocument(true);
		descriptor.setJavaClass(Employee.class);
				
		descriptor.addDirectMapping("firstName","getFirstName","setFirstName","first-name/text()");

		XMLDirectMapping lname = new XMLDirectMapping();
		lname.setAttributeName("lastName");
		lname.setGetMethodName("getLastName");
		lname.setSetMethodName("setLastName");
		lname.setXPath("last-name/text()");
		descriptor.addMapping(lname);
		
		XMLCompositeObjectMapping addr = new XMLCompositeObjectMapping();
		addr.setAttributeName("address");
		addr.setGetMethodName("getAddress");
		addr.setSetMethodName("setAddress");
		addr.setXPath("address");
		addr.setReferenceClass(Address.class);
		descriptor.addMapping(addr);
		
		XMLCompositeDirectCollectionMapping resp = new XMLCompositeDirectCollectionMapping();
		resp.setAttributeName("responsibilities");
		resp.setGetMethodName("getResponsibilities");
		resp.setSetMethodName("setResponsibilities");
		resp.setXPath("responsibilities/responsibility");
		resp.getContainerPolicy().setContainerClass(Vector.class);
		descriptor.addMapping(resp);
		
		XMLCompositeCollectionMapping phone = new XMLCompositeCollectionMapping();
		phone.setAttributeName("phoneNumbers");
		phone.setGetMethodName("getPhoneNumbers");
		phone.setSetMethodName("setPhoneNumbers");
		phone.setXPath("phones/phone");
		phone.setReferenceClass(PhoneNumber.class);
		phone.getContainerPolicy().setContainerClass(Vector.class);
		descriptor.addMapping(phone);
		
		this.addDescriptor(descriptor);		
	}
	public void buildAddressDescriptor() 
	{
		XMLDescriptor descriptor = new XMLDescriptor();
		descriptor.setShouldPreserveDocument(true);
		descriptor.setJavaClass(Address.class);
		
		descriptor.getInheritancePolicy().setClassIndicatorField(new org.eclipse.persistence.oxm.XMLField("@type"));
		descriptor.getInheritancePolicy().addClassIndicator(Address.class, "address");
		descriptor.getInheritancePolicy().addClassIndicator(CanadianAddress.class, "canadian-address");
		descriptor.getInheritancePolicy().addClassIndicator(USAddress.class, "us-address");
		
		XMLDirectMapping street = new XMLDirectMapping();
		street.setAttributeName("street");
		street.setGetMethodName("getStreet");
		street.setSetMethodName("setStreet");
		street.setXPath("street/text()");
		descriptor.addMapping(street);
		
		XMLDirectMapping city = new XMLDirectMapping();
		city.setAttributeName("city");
		city.setGetMethodName("getCity");
		city.setSetMethodName("setCity");
		city.setXPath("city/text()");
		descriptor.addMapping(city);
		
		this.addDescriptor(descriptor);
	}
	public void buildCanadianAddressDescriptor() 
	{
		XMLDescriptor descriptor = new XMLDescriptor();
		descriptor.setShouldPreserveDocument(true);
		descriptor.setJavaClass(CanadianAddress.class);
		
		descriptor.getInheritancePolicy().setParentClass(Address.class);
		
		XMLDirectMapping province = new XMLDirectMapping();
		province.setAttributeName("province");
		province.setGetMethodName("getProvince");
		province.setSetMethodName("setProvince");
		province.setXPath("province/text()");
		descriptor.addMapping(province);
		
		XMLDirectMapping postalCode = new XMLDirectMapping();
		postalCode.setAttributeName("postalCode");
		postalCode.setGetMethodName("getPostalCode");
		postalCode.setSetMethodName("setPostalCode");
		postalCode.setXPath("postal-code/text()");
		descriptor.addMapping(postalCode);
		
		this.addDescriptor(descriptor);
	}
	public void buildUSAddressDescriptor() 
	{
		XMLDescriptor descriptor = new XMLDescriptor();
		descriptor.setShouldPreserveDocument(true);
		descriptor.setJavaClass(USAddress.class);
		
		descriptor.getInheritancePolicy().setParentClass(Address.class);
		
		XMLDirectMapping state = new XMLDirectMapping();
		state.setAttributeName("state");
		state.setGetMethodName("getState");
		state.setSetMethodName("setState");
		state.setXPath("state/text()");
		descriptor.addMapping(state);
		
		XMLDirectMapping zip = new XMLDirectMapping();
		zip.setAttributeName("zipCode");
		zip.setGetMethodName("getZipCode");
		zip.setSetMethodName("setZipCode");
		zip.setXPath("zip-code/text()");
		descriptor.addMapping(zip);
		
		this.addDescriptor(descriptor);
	}
	public void buildPhoneNumberDescriptor() 
	{
		XMLDescriptor descriptor = new XMLDescriptor();
		descriptor.setShouldPreserveDocument(true);
		descriptor.setJavaClass(PhoneNumber.class);
		
		XMLDirectMapping areaCode = new XMLDirectMapping();
		areaCode.setAttributeName("areaCode");
		areaCode.setGetMethodName("getAreaCode");
		areaCode.setSetMethodName("setAreaCode");
		areaCode.setXPath("area-code/text()");
		descriptor.addMapping(areaCode);

		XMLDirectMapping exchange = new XMLDirectMapping();
		exchange.setAttributeName("exchange");
		exchange.setGetMethodName("getExchange");
		exchange.setSetMethodName("setExchange");
		exchange.setXPath("exchange/text()");
		descriptor.addMapping(exchange);

		XMLDirectMapping number = new XMLDirectMapping();
		number.setAttributeName("number");
		number.setGetMethodName("getNumber");
		number.setSetMethodName("setNumber");
		number.setXPath("number/text()");
		descriptor.addMapping(number);
		
		this.addDescriptor(descriptor);
	}
}
