package org.eclipse.persistence.testing.oxm.mappings.containeraccessor;

import java.util.ArrayList;

import org.eclipse.persistence.sessions.Project;
import org.eclipse.persistence.internal.queries.ContainerPolicy;
import org.eclipse.persistence.oxm.XMLDescriptor;
import org.eclipse.persistence.oxm.mappings.*;

public class EmployeeProject extends Project {
	public EmployeeProject(boolean methodAccess) {
		addEmployeeDescriptor(methodAccess);
		addAddressDescriptor();
		addPhoneNumberDescriptor();
	}
	
	public void addEmployeeDescriptor(boolean methodAccess) {
		XMLDescriptor descriptor = new XMLDescriptor();
		descriptor.setJavaClass(Employee.class);
		descriptor.setDefaultRootElement("employee");
		
		XMLDirectMapping idMapping = new XMLDirectMapping();
		idMapping.setAttributeName("id");
		idMapping.setXPath("@id");
		descriptor.addMapping(idMapping);
		
		XMLDirectMapping firstNameMapping = new XMLDirectMapping();
		firstNameMapping.setAttributeName("firstName");
		firstNameMapping.setXPath("first-name/text()");
		descriptor.addMapping(firstNameMapping);
		
		XMLDirectMapping lastNameMapping = new XMLDirectMapping();
		lastNameMapping.setAttributeName("lastName");
		lastNameMapping.setXPath("last-name/text()");
		descriptor.addMapping(lastNameMapping);
		
		XMLCompositeObjectMapping addressMapping = new XMLCompositeObjectMapping();
		addressMapping.setAttributeName("address");
		addressMapping.setReferenceClass(Address.class);
		addressMapping.setXPath("address");
		addressMapping.setContainerAttributeName("owningEmployee");
		if(methodAccess) {
			addressMapping.setContainerGetMethodName("getOwningEmployee");
			addressMapping.setContainerSetMethodName("setOwningEmployee");
		}
		descriptor.addMapping(addressMapping);
		
		XMLCompositeCollectionMapping phoneMapping = new XMLCompositeCollectionMapping();
		phoneMapping.setAttributeName("phoneNumbers");
		phoneMapping.setReferenceClass(PhoneNumber.class);
		phoneMapping.setXPath("phone-numbers/number");
		phoneMapping.setContainerPolicy(ContainerPolicy.buildPolicyFor(ArrayList.class));
		phoneMapping.setContainerAttributeName("owningEmployee");
		if(methodAccess) {
			phoneMapping.setContainerGetMethodName("getOwningEmployee");
			phoneMapping.setContainerSetMethodName("setOwningEmployee");
		}
		descriptor.addMapping(phoneMapping);
		this.addDescriptor(descriptor);
	}
	
	public void addAddressDescriptor() {
		XMLDescriptor descriptor = new XMLDescriptor();
		descriptor.setJavaClass(Address.class);
		
		XMLDirectMapping streetMapping = new XMLDirectMapping();
		streetMapping.setAttributeName("street");
		streetMapping.setXPath("street/text()");
		descriptor.addMapping(streetMapping);
		
		XMLDirectMapping cityMapping = new XMLDirectMapping();
		cityMapping.setAttributeName("city");
		cityMapping.setXPath("city/text()");
		descriptor.addMapping(cityMapping);
		
		XMLDirectMapping stateMapping = new XMLDirectMapping();
		stateMapping.setAttributeName("state");
		stateMapping.setXPath("state/text()");
		descriptor.addMapping(stateMapping);
		
		XMLDirectMapping countryMapping = new XMLDirectMapping();
		countryMapping.setAttributeName("country");
		countryMapping.setXPath("country/text()");
		descriptor.addMapping(countryMapping);
		
		this.addDescriptor(descriptor);
	}
	
	public void addPhoneNumberDescriptor() {
		XMLDescriptor descriptor = new XMLDescriptor();
		descriptor.setJavaClass(PhoneNumber.class);
		
		XMLDirectMapping numberMapping = new XMLDirectMapping();
		numberMapping.setAttributeName("number");
		numberMapping.setXPath("text()");
		descriptor.addMapping(numberMapping);
		
		this.addDescriptor(descriptor);
	}
}