<%@ jet	package="org.eclipse.jpt.jpa.ui.internal.wizards.entity" 
	imports="org.eclipse.jpt.jpa.ui.internal.wizards.entity.data.model.* java.util.* " 
	class="IdClassTemplate" 
%>
<% CreateEntityTemplateModel model = (CreateEntityTemplateModel) argument; 
if (model.getJavaPackageName()!=null && model.getJavaPackageName()!="") { %>package <%=model.getJavaPackageName()%>;<%}%>

<% Collection<String> imports = model.getImports(true);
for (String anImport : imports) { %>
import <%=anImport%>;
<% } %>

/**
 * ID class for entity: <%=model.getClassName()%>
 *
 */ 
public class <%=model.getIdClassName()%> 
<% List<String> interfaces = model.getInterfaces(); 
	if (interfaces.size()>0) {%> implements <% }
	for (int i=0; i<interfaces.size(); i++) {
		String INTERFACE = (String) interfaces.get(i);
		if (i>0) { %>, <%}%><%=INTERFACE%><%}%> {   
   
	<% List<EntityRow> fields = model.getEntityFields();
	List<String> pkFields = model.getPKFields(); 
	for (int i=0; i<fields.size(); i++) {
		EntityRow entity = (EntityRow) fields.get(i);
		if (!pkFields.contains(entity.getName())) {
			continue;
		}
	%>         
	private <%=entity.getType()%> <%=entity.getName()%>;<%}%>
	private static final long serialVersionUID = 1L;

	public <%=model.getIdClassName()%>() {}

	<%
	fields = model.getEntityFields();
	if (fields != null) for (int i=0; i<fields.size(); i++) {
		EntityRow field = (EntityRow) fields.get(i);
		String TYPE = field.getType();
		String NAME = field.getName();
		if (!pkFields.contains(NAME)) {
			continue;
		} 		
		String METHOD = NAME.substring(0,1).toUpperCase() + NAME.substring(1);        
	%>

	public <%=TYPE%> get<%=METHOD%>() {
		return this.<%=NAME%>;
	}

	public void set<%=METHOD%>(<%=TYPE%> <%=NAME%>) {
		this.<%=NAME%> = <%=NAME%>;
	}
	<%}%>
   
	/*
	 * @see java.lang.Object#equals(Object)
	 */	
	public boolean equals(Object o) {
		if (o == this) {
			return true;
		}
		if (!(o instanceof <%=model.getIdClassName()%>)) {
			return false;
		}
		<%=model.getIdClassName()%> other = (<%=model.getIdClassName()%>) o;
		return true
<% if (fields != null) for (int i=0; i<fields.size(); i++) {
	EntityRow field = (EntityRow) fields.get(i); 
	String NAME = field.getName();
	if (!pkFields.contains(NAME)) {
       	continue;
    }%>
<% 	String TYPE = field.getType(); 
	String GET_METHOD = "get" + NAME.substring(0,1).toUpperCase() + NAME.substring(1); %>
<%	if (TYPE.equals("boolean") || TYPE.equals("byte") || TYPE.equals("char") || TYPE.equals("short") || TYPE.equals("int") || TYPE.equals("long")) { %>
			&& <%=GET_METHOD%>() == other.<%=GET_METHOD%>()
<% 	} else if (TYPE.equals("double")) { %>
			&& (Double.doubleToLongBits(<%=GET_METHOD%>()) == Double.doubleToLongBits(other.<%=GET_METHOD%>()))
<% 	} else if (TYPE.equals("float")) { %>
			&& (Float.floatToIntBits(<%=GET_METHOD%>()) == Float.floatToIntBits(other.<%=GET_METHOD%>()))
<% 	} else { %>
			&& (<%=GET_METHOD%>() == null ? other.<%=GET_METHOD%>() == null : <%=GET_METHOD%>().equals(other.<%=GET_METHOD%>()))
<% 	} %>
<% } %>;
	}
	
	/*	 
	 * @see java.lang.Object#hashCode()
	 */	
	public int hashCode() {
		final int prime = 31;
		int result = 1;
<% if (fields != null) for (int i=0; i<fields.size(); i++) { 
	EntityRow field = (EntityRow) fields.get(i);
	String NAME = field.getName();
	if (!pkFields.contains(NAME)) {
       	continue;
    }%>
<% 	String TYPE = field.getType(); 
	String GET_METHOD = "get" + NAME.substring(0,1).toUpperCase() + NAME.substring(1); %>
<%	if (TYPE.equals("boolean")) { %>
		result = prime * result + (<%=GET_METHOD%>() ? 1 : 0);
<% 	} else if (TYPE.equals("int")) { %>
		result = prime * result + <%=GET_METHOD%>();
<% 	} else if (TYPE.equals("byte") || TYPE.equals("char") || TYPE.equals("short")) { %>
		result = prime * result + ((int) <%=GET_METHOD%>());
<% 	} else if (TYPE.equals("long")) { %>
		result = prime * result + ((int) (<%=GET_METHOD%>() ^ (<%=GET_METHOD%>() >>> 32)));
<% 	} else if (TYPE.equals("double")) { %>
		result = prime * result + ((int) (Double.doubleToLongBits(<%=GET_METHOD%>() ) ^ (Double.doubleToLongBits(<%=GET_METHOD%>()) >>> 32)));
<% 	} else if (TYPE.equals("float")) { %>
		result = prime * result + Float.floatToIntBits(<%=GET_METHOD%>());
<% 	} else { %>
		result = prime * result + (<%=GET_METHOD%>() == null ? 0 : <%=GET_METHOD%>().hashCode());
<% 	} %>
<% } %>
		return result;
	}
   
   
}
