<%@ jet package="cruise.ui.jsf.templates.impl" 
imports="java.util.* cruise.model.abstractObjects.BackingObject cruise.umple.compiler.* cruise.ui.jsf.* "
class="BckBean" skeleton="../skeleton/IGenerator.skeleton" %>
<%  BackingObject bckObject = (BackingObject) argument; 
    String voName= bckObject.getClassName()+"VO";
    String preffix=JSFProvider.properties.getProperty(cruise.model.Constants.PACKAGE_PREFIX);
    String suffix=JSFProvider.properties.getProperty(cruise.model.Constants.BCK_OBJECT_SUFFIX);
    String className=bckObject.getClassName()+suffix;
    List<AssociationVariable> mergeList= new ArrayList<AssociationVariable>();
	mergeList.addAll( bckObject.getConstructorOneAsociations());
	mergeList.addAll(bckObject.getZeroOrOneAsociations());
	List<AssociationVariable> multipleZeroManyToOptionalAssociations=bckObject.getZeroManyToOptionalAssociations();
	List<AssociationVariable> multipleNManyToOptionalAssociations=bckObject.getNManyToOptionalAssociations();
	List<AssociationVariable> multipleManyToOneAsociations =bckObject.getManyToOneAssociations();
	List<AssociationVariable> mandatoryToSingletonAssociations=bckObject.getMandatoryToSingletonAssociations();
	List<AssociationVariable> optionalToSingletonAssociations=bckObject.getOptionalToSingletonAssociations();
	
%>
/**
 * 
 */
package <%=preffix + "." + bckObject.getPackageName()%>;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import java.util.List;
import java.util.Set;
import java.util.ResourceBundle;
import java.util.ArrayList;
import java.util.Calendar;
import <%=preffix%>.control.BeanLinker;
import <%=preffix%>.utils.PageFlowUtils;
import dao.keys.<%=bckObject.getPackageName()%>.*;
import <%=bckObject.getPackageName()%>.<%=bckObject.getClassName()%>;
 <% for (Iterator<String> i = bckObject.getImports().iterator(); i.hasNext(); ) { %>
import <%=i.next().toString()%>;
 <% } 
 
 
 %>

public class  <%=className%> implements java.io.Serializable {

	private static final long serialVersionUID = 1L;
    java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");
	private ResourceBundle resourceBundle =  ResourceBundle.getBundle("bundles.<%=(bckObject.getPackageName()!=null?(bckObject.getPackageName()+"."):"" )+bckObject.getClassName()%>" );

	private <%=bckObject.getClassName()%> a<%=voName%>;

 <% for (AttributeVariable attVar: bckObject.getAttVariables()) { %>
	<%=bckObject.getFragmentProvider().getDeclarationFragment(attVar)%>
 <% } %>
  <% for (AttributeVariable attVar: bckObject.getKeysAttributes()) { %>
	<%=bckObject.getFragmentProvider().getDeclarationFragment(attVar)%>
 <% } %>


  <%@ include file="includes/OneAssociations.javapart" %>
  <%@ include file="includes/ZeroManyToOptionalAssociations.javapart" %>
  <%@ include file="includes/NManyToOptionalAssociations.javapart" %>
  <%@ include file="includes/ManyToOneAssociations.javapart" %>
  <%@ include file="includes/OneSingletonAssociations.javapart" %>

 	public <%=bckObject.getClassName()%> get<%=voName%>(){
	return a<%=voName%>;
	}
	public void set<%=voName%>(<%=bckObject.getClassName() + " a"+voName%> ){
	this.a<%=voName%>=a<%=voName%>;
	}
<% for (AttributeVariable attVar: bckObject.getAttVariables()) { %> 
<%=bckObject.getFragmentProvider().getGetFragment(attVar)%>
<%=bckObject.getFragmentProvider().getSetFragment(attVar)%>
<% } %>
<% for (AttributeVariable attVar: bckObject.getKeysAttributes()) { %> 
<%=bckObject.getFragmentProvider().getGetFragment(attVar)%>
<%=bckObject.getFragmentProvider().getSetFragment(attVar)%>
<% } %>
	public String cancel() {
	  <% for (AttributeVariable attVar: bckObject.getAttVariables()) { 
	  Object obj= attVar.getValue();
	  if (obj!=null &&  !"Date".equals(attVar.getType()) ){
	  %>
	  <%=bckObject.getFragmentProvider().getAsignationFragment(attVar, obj.toString()) %>  
		<% }else if ("Date".equals(attVar.getType()) ){ %>
		<%=bckObject.getFragmentProvider().getAsignationFragment(attVar, "getInitial"+attVar.getUpperCaseName()+"()") %>
		<% }else{ %>
		<%=bckObject.getFragmentProvider().getAsignationFragment(attVar, "null") %> 
		<% }
	   } %>
	  <% for (AttributeVariable attVar: bckObject.getKeysAttributes()) { 
	  Object obj= attVar.getValue();
	  if (obj!=null &&  !"Date".equals(attVar.getType()) ){
	  %>
	  <%=bckObject.getFragmentProvider().getAsignationFragment(attVar, obj.toString()) %>  
		<% }else if ("Date".equals(attVar.getType()) ){ %>
		<%=bckObject.getFragmentProvider().getAsignationFragment(attVar, "getInitial"+attVar.getUpperCaseName()+"()") %>
		<% }else{ %>
		<%=bckObject.getFragmentProvider().getAsignationFragment(attVar, "null") %> 
		<% }
	   } %>
	   <% for (AssociationVariable assocVar: mergeList) { %>
	   removeSelected<%=assocVar.getUpperCaseName()%>();
	   <% } %>
	    <% for (AssociationVariable assocVar: multipleZeroManyToOptionalAssociations) { %>
		removeSelected<%=assocVar.getUpperCaseName()%>List();
		<% } %>
		<% for (AssociationVariable assocVar: multipleNManyToOptionalAssociations) { %>
		removeSelected<%=assocVar.getUpperCaseName()%>List();
		<% } %>
		<% for (AssociationVariable assocVar: optionalToSingletonAssociations) { %>
		removeSelected<%=assocVar.getUpperCaseName()%>();
		<% } %>		
		removeEdited<%=voName%>();
		return "";
	}

	public String createOrEdit() {
		 try{
			if (!isEditing()) {
			<% for (AssociationVariable assocVar: bckObject.getConstructorOneAsociations()) { %>
			 <%=assocVar.getType()%> a<%=assocVar.getUpperCaseName()%>=get<%=assocVar.getUpperCaseName()%>();
			 <% } %>
			<% for (AssociationVariable assocVar: mandatoryToSingletonAssociations) { %>
			 <%=assocVar.getType()%> a<%=assocVar.getUpperCaseName()%>=<%=assocVar.getType()%>.getInstance();
			 <% } %>			 
		<% for (AssociationVariable assocVar: multipleNManyToOptionalAssociations) { %>
			 	<%=assocVar.getType()%>[] all<%=assocVar.getUpperCaseName()%>s=null;
			 	if (getSelected<%=assocVar.getUpperCaseName()%>List() !=null){
			 		all<%=assocVar.getUpperCaseName()%>s =getSelected<%=assocVar.getUpperCaseName()%>List().toArray(new <%=assocVar.getType()%>[getSelected<%=assocVar.getUpperCaseName()%>List().size()]);
			 	}else{
			 		all<%=assocVar.getUpperCaseName()%>s = new <%=assocVar.getType()%>[0];
			 	}
	 	<% } %>		 
			 <%=bckObject.getClassName()%> <%=bckObject.getClassName().toLowerCase()%>=null; 
			
			  <% for (AttributeVariable attVar: bckObject.getAttVariables()) { %>
				<%=bckObject.getFragmentProvider().getPreConstructorFragment(attVar) %>  <% } %>
			  <% for (AttributeVariable attVar: bckObject.getKeysAttributes()) { %>
				<%=bckObject.getFragmentProvider().getPreConstructorFragment(attVar) %>  <% } %>
			 	<%
					Iterator<AttributeVariable> keyIter=bckObject.getKeysAttributes().iterator();
					String signature="";
					while (keyIter.hasNext()){
					AttributeVariable att=keyIter.next();
					signature=signature+" a"+ att.getUpperCaseName();
					if(keyIter.hasNext())
						signature=signature+", ";
					}
				%>
				<%=bckObject.getClassName()%>Key <%=bckObject.getClassName().toLowerCase()%>Key= new <%=bckObject.getClassName()%>Key(<%=signature%>); 
					if(PageFlowUtils.getDAOFactory().get<%=bckObject.getClassName()%>DAO().findById(<%=bckObject.getClassName().toLowerCase()%>Key)!=null)
						throw new RuntimeException("An entity with the same key field(s) exists!");
					<%=bckObject.getClassName().toLowerCase()%> = new <%=bckObject.getClassName()%>(<%=bckObject.getConstructorSignature()%>);
				<% for (AssociationVariable assocVar: bckObject.getZeroOrOneAsociations()) { %>
			 	<%=bckObject.getClassName().toLowerCase()%>.set<%=assocVar.getUpperCaseName()%>(this.getSelected<%=assocVar.getUpperCaseName()%>());
			 	<% } %>
				<% for (AssociationVariable assocVar: optionalToSingletonAssociations) { %>
			 	<%=bckObject.getClassName().toLowerCase()%>.set<%=assocVar.getUpperCaseName()%>(this.getSelected<%=assocVar.getUpperCaseName()%>());
			 	<% } %>			 	
			 			<% for (AssociationVariable assocVar: multipleZeroManyToOptionalAssociations) { %>
			 	if (getSelected<%=assocVar.getUpperCaseName()%>List() !=null)
				for ( <%=assocVar.getType()%> obj : getSelected<%=assocVar.getUpperCaseName()%>List()){
			 		<%=bckObject.getClassName().toLowerCase()%>.add<%=assocVar.getUpperCaseName()%>(obj);
			 	}
			 	<% } %>	
					PageFlowUtils.getDAOFactory().get<%=bckObject.getClassName()%>DAO().save(<%=bckObject.getClassName().toLowerCase()%>, <%=bckObject.getClassName().toLowerCase()%>Key);
				
			} else {
				if(!validate())
					return "";
				<% for (AttributeVariable attVar: bckObject.getAttVariables()) { %>
				<%=bckObject.getFragmentProvider().getCopyFragment(attVar,"this.getEdited"+voName+"()") %><% } %>
				<% for (AttributeVariable attVar: bckObject.getKeysAttributes()) { %>
				<%=bckObject.getFragmentProvider().getCopyFragment(attVar,"this.getEdited"+voName+"()") %><% } %>
	
				<% for (AssociationVariable assocVar: mergeList) { %>
			 	this.getEdited<%=voName%>().set<%=assocVar.getUpperCaseName()%>(this.getSelected<%=assocVar.getUpperCaseName()%>());
			 	<% } %>
				<% for (AssociationVariable assocVar: optionalToSingletonAssociations) { %>
			 	this.getEdited<%=voName%>().set<%=assocVar.getUpperCaseName()%>(this.getSelected<%=assocVar.getUpperCaseName()%>());
			 	<% } %>	
				<% for (AssociationVariable assocVar: multipleZeroManyToOptionalAssociations) { %>
				if (getSelected<%=assocVar.getUpperCaseName()%>List() !=null)
				for ( <%=assocVar.getType()%> obj : getSelected<%=assocVar.getUpperCaseName()%>List()){
			 		if(this.getEdited<%=voName%>().indexOf<%=assocVar.getUpperCaseName()%>(obj)<0)
			 			this.getEdited<%=voName%>().add<%=assocVar.getUpperCaseName()%>(obj);
			 	}
			 	if (this.getEdited<%=voName%>().get<%=assocVar.getUpperCaseName()%>s()!=null){
				 	ArrayList<<%=assocVar.getType()%>> toRemove =new ArrayList<<%=assocVar.getType()%>>();
				 	for ( <%=assocVar.getType()%> obj : this.getEdited<%=voName%>().get<%=assocVar.getUpperCaseName()%>s()){
				 		if(getSelected<%=assocVar.getUpperCaseName()%>List()!=null && !getSelected<%=assocVar.getUpperCaseName()%>List().contains(obj))
				 			toRemove.add(obj);
				 			
				 			
				 	}
				 	for ( <%=assocVar.getType()%> obj : toRemove){
				 		this.getEdited<%=voName%>().remove<%=assocVar.getUpperCaseName()%>(obj);
				 	}
			 	}
			 	<% } %>	
			 	<% for (AssociationVariable assocVar: multipleNManyToOptionalAssociations) { %>
				if (getSelected<%=assocVar.getUpperCaseName()%>List() !=null)
				for ( <%=assocVar.getType()%> obj : getSelected<%=assocVar.getUpperCaseName()%>List()){
			 		if(this.getEdited<%=voName%>().indexOf<%=assocVar.getUpperCaseName()%>(obj)<0)
			 			this.getEdited<%=voName%>().add<%=assocVar.getUpperCaseName()%>(obj);
			 	}
			 	if (this.getEdited<%=voName%>().get<%=assocVar.getUpperCaseName()%>s()!=null){
				 	ArrayList<<%=assocVar.getType()%>> toRemove =new ArrayList<<%=assocVar.getType()%>>();
				 	for ( <%=assocVar.getType()%> obj : this.getEdited<%=voName%>().get<%=assocVar.getUpperCaseName()%>s()){
				 		if(getSelected<%=assocVar.getUpperCaseName()%>List()!=null && !getSelected<%=assocVar.getUpperCaseName()%>List().contains(obj))
				 			toRemove.add(obj);
				 			
				 			
				 	}
				 	for ( <%=assocVar.getType()%> obj : toRemove){
				 		this.getEdited<%=voName%>().remove<%=assocVar.getUpperCaseName()%>(obj);
				 	}
			 	}
			 	<% } %>	
				
			}
		}catch(RuntimeException e){
			   	FacesMessage fm = new FacesMessage(e.getMessage());
            	fm.setSeverity(FacesMessage.SEVERITY_ERROR);
              	FacesContext.getCurrentInstance().addMessage(e.getMessage(), fm);
              	return "";
			
			}
		cancel();
		return "";
	}

	public String delete() {
		PageFlowUtils.getDAOFactory().get<%=bckObject.getClassName()%>DAO().deleteTree(getEdited<%=voName%>());
		this.removeEdited<%=voName%>();
		cancel();
		return "";
	}

	public String prepareForEdit() {
	<% for (AttributeVariable attVar: bckObject.getAttVariables()) { %>
	<%=bckObject.getFragmentProvider().getReverseCopyFragment(attVar,"this.getEdited"+voName+"()") %><% } %>
	<% for (AttributeVariable attVar: bckObject.getKeysAttributes()) { %>
	<%=bckObject.getFragmentProvider().getReverseCopyFragment(attVar,"this.getEdited"+voName+"()") %><% } %>
	   <% for (AssociationVariable assocVar: mergeList) { %>
	  this.setSelected<%=assocVar.getUpperCaseName()%>(this.getEdited<%=voName%>().get<%=assocVar.getUpperCaseName()%>());
	   <% } %>
	  <% for (AssociationVariable assocVar: multipleZeroManyToOptionalAssociations) { %>
	  this.setSelected<%=assocVar.getUpperCaseName()%>List(new ArrayList(this.getEdited<%=voName%>().get<%=assocVar.getUpperCaseName()%>s()));
	   <% } %>
	   <% for (AssociationVariable assocVar: multipleNManyToOptionalAssociations) { %>
	  this.setSelected<%=assocVar.getUpperCaseName()%>List(new ArrayList(this.getEdited<%=voName%>().get<%=assocVar.getUpperCaseName()%>s()));
	   <% } %>
	<% for (AssociationVariable assocVar: optionalToSingletonAssociations) { %>
	  this.setSelected<%=assocVar.getUpperCaseName()%>(this.getEdited<%=voName%>().get<%=assocVar.getUpperCaseName()%>());
	   <% } %>
	return "";
	}

	public boolean isEditing(){
		return this.getEdited<%=voName%>() != null;
	}
	
	public void removeEdited<%=voName%>() {
		PageFlowUtils.getPageFlow().remove("edited<%=voName%>");

	}

	@SuppressWarnings("unchecked")
	public void setEdited<%=voName%>(<%=bckObject.getClassName()%> edited<%=voName%>) {
		PageFlowUtils.getPageFlow().put("edited<%=voName%>", edited<%=voName%>);
	}

	public <%=bckObject.getClassName()%> getEdited<%=voName%>() {
		return (<%=bckObject.getClassName()%>) PageFlowUtils.getPageFlow().get("edited<%=voName%>");

	}

	public List<<%=bckObject.getClassName()%>> getEdited<%=voName%>List() {
		if ( PageFlowUtils.peekBeanLinker().getLinkerCollection() instanceof List<?> )
			return (List<<%=bckObject.getClassName()%>>) PageFlowUtils.peekBeanLinker()
				.getLinkerCollection();
		return null;
	}


	public List<? extends <%=bckObject.getDAOTable()%>> get<%=bckObject.getClassName()%>s() {
 <% for (AssociationVariable assocVar: mergeList) { 
 		if(assocVar.getRelatedAssociation().getMaxBound() > 1 || assocVar.getRelatedAssociation().getMaxBound() == -1){	%>
		if (isFrom<%=assocVar.getUpperCaseName()%>()) {
			return linked<%=assocVar.getUpperCaseName()%>().get<%=assocVar.getRelatedAssociation().getUpperCaseName()%>s();
		}
		<% } %>
	<% } %>
		return PageFlowUtils.getDAOFactory().get<%=bckObject.getClassName()%>DAO().findAll(<%=bckObject.hasParent()?(bckObject.getClassName()+".class"):""%>);
	}

	public String bind() {
		PageFlowUtils.peekBeanLinker().setLinker(getSelected<%=voName%>());
		return "";
	}

	public String bindCollection() {
		if(PageFlowUtils.peekBeanLinker().getLinkerCollection()==null)
			PageFlowUtils.peekBeanLinker().setLinkerCollection(new ArrayList<<%=bckObject.getClassName()%>>());
		if(!PageFlowUtils.peekBeanLinker().getLinkerCollection().contains(getSelected<%=voName%>()))
			PageFlowUtils.peekBeanLinker().getLinkerCollection().add(getSelected<%=voName%>());
		return "";
	}
		
	public String removeFromLinker() {
		getEdited<%=voName%>List().remove(getEdited<%=voName%>List().indexOf(getSelected<%=voName%>()));
		return "";
	}
	
	public String removeLinker() {
		PageFlowUtils.peekBeanLinker().setLinker(null);
		return "";
	}
	
	
	public boolean isSingleSelection(){
		return PageFlowUtils.peekBeanLinker().isSingleSelection();
	}
	
	public <%=bckObject.getClassName()%> getSelected<%=voName%>() {
		if(PageFlowUtils.peekBeanLinker().getLinker() instanceof <%=bckObject.getClassName()%>)
			return (<%=bckObject.getClassName()%>) PageFlowUtils.peekBeanLinker().getLinker();
		return null;
	}
	
	public void  setSelected<%=voName%>(<%=bckObject.getClassName()%> selected<%=voName%>) {
		PageFlowUtils.peekBeanLinker().setLinker(selected<%=voName%>);
	}
<%=(new Validation()).generate(bckObject)%>	
		
}
