/** * */ package net.conselldemallorca.helium.core.model.hibernate; import java.io.Serializable; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.OrderBy; import javax.persistence.Table; import javax.persistence.TableGenerator; import javax.persistence.Transient; import javax.persistence.UniqueConstraint; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; import org.hibernate.annotations.ForeignKey; import org.hibernate.annotations.Index; import org.springmodules.validation.bean.conf.loader.annotation.handler.MaxLength; import org.springmodules.validation.bean.conf.loader.annotation.handler.NotBlank; import org.springmodules.validation.bean.conf.loader.annotation.handler.NotNull; import net.conselldemallorca.helium.core.common.ExpedientCamps; /** * Objecte de domini que representa un camp de la definició de procés. * * @author Limit Tecnologies <limit@limit.es> */ @Entity @Table( name="hel_camp", uniqueConstraints={@UniqueConstraint(columnNames={"codi", "definicio_proces_id"})}) @org.hibernate.annotations.Table( appliesTo = "hel_camp", indexes = { @Index(name = "hel_camp_defproc_i", columnNames = {"definicio_proces_id"}), @Index(name = "hel_camp_agrup_i", columnNames = {"camp_agrupacio_id"}), @Index(name = "hel_camp_domini_i", columnNames = {"domini_id"}), @Index(name = "hel_camp_enum_i", columnNames = {"enumeracio_id"})}) public class Camp implements Serializable, GenericEntity<Long> { public enum TipusCamp { STRING, INTEGER, FLOAT, BOOLEAN, TEXTAREA, DATE, PRICE, TERMINI, SELECCIO, SUGGEST, REGISTRE, ACCIO } private Long id; @NotBlank @MaxLength(64) private String codi; @NotNull private TipusCamp tipus; @NotBlank @MaxLength(255) private String etiqueta; @MaxLength(255) private String observacions; @MaxLength(255) private String dominiId; @MaxLength(255) private String dominiParams; @MaxLength(64) private String dominiCampText; @MaxLength(64) private String dominiCampValor; @MaxLength(255) private String consultaParams; @MaxLength(64) private String consultaCampText; @MaxLength(64) private String consultaCampValor; private boolean dominiCacheText; private boolean dominiIntern; @MaxLength(255) private String jbpmAction; private boolean multiple; private boolean ocult; private boolean isIgnored; private Consulta consulta; private Domini domini; private Enumeracio enumeracio; @NotNull private DefinicioProces definicioProces; private CampAgrupacio agrupacio; private Set<CampTasca> campsTasca = new HashSet<CampTasca>(); private Set<Document> documentDates = new HashSet<Document>(); private List<Validacio> validacions = new ArrayList<Validacio>(); private Set<CampRegistre> registrePares = new HashSet<CampRegistre>(); private List<CampRegistre> registreMembres = new ArrayList<CampRegistre>(); private Integer ordre; public Camp() {} public Camp(DefinicioProces definicioProces, String codi, TipusCamp tipus, String etiqueta) { this.definicioProces = definicioProces; this.codi = codi; this.tipus = tipus; this.etiqueta = etiqueta; } @Id @GeneratedValue(strategy = GenerationType.TABLE, generator="gen_camp") @TableGenerator(name="gen_camp", table="hel_idgen", pkColumnName="taula", valueColumnName="valor") @Column(name="id") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name="codi", length=64, nullable=false) public String getCodi() { return codi; } public void setCodi(String codi) { this.codi = codi; } @Column(name="tipus", length=255, nullable=false) public TipusCamp getTipus() { return tipus; } public void setTipus(TipusCamp tipus) { this.tipus = tipus; } @Column(name="etiqueta", length=255, nullable=false) public String getEtiqueta() { return etiqueta; } public void setEtiqueta(String etiqueta) { this.etiqueta = etiqueta; } @Column(name="observacions", length=255) public String getObservacions() { return observacions; } public void setObservacions(String observacions) { this.observacions = observacions; } @Column(name="domini_paramid", length=255) public String getDominiId() { return dominiId; } public void setDominiId(String dominiId) { this.dominiId = dominiId; } @Column(name="domini_params", length=255) public String getDominiParams() { return dominiParams; } public void setDominiParams(String dominiParams) { this.dominiParams = dominiParams; } @Column(name="domini_camp_text", length=64) public String getDominiCampText() { return dominiCampText; } public void setDominiCampText(String dominiCampText) { this.dominiCampText = dominiCampText; } @Column(name="domini_camp_valor", length=64) public String getDominiCampValor() { return dominiCampValor; } public void setDominiCampValor(String dominiCampValor) { this.dominiCampValor = dominiCampValor; } @Column(name="domini_cache_text") public boolean isDominiCacheText() { return dominiCacheText; } public void setDominiCacheText(boolean dominiCacheText) { this.dominiCacheText = dominiCacheText; } @Column(name="jbpm_action", length=255) public String getJbpmAction() { return jbpmAction; } public void setJbpmAction(String jbpmAction) { this.jbpmAction = jbpmAction; } @Column(name="multiple") public boolean isMultiple() { return multiple; } public void setMultiple(boolean multiple) { this.multiple = multiple; } @Column(name="ocult") public boolean isOcult() { return ocult; } public void setOcult(boolean ocult) { this.ocult = ocult; } @Column(name="ignored") public boolean isIgnored() { return isIgnored; } public void setIgnored(boolean isIgnored) { this.isIgnored = isIgnored; } @ManyToOne(optional=false) @JoinColumn(name="definicio_proces_id") @ForeignKey(name="hel_defproc_camp_fk") public DefinicioProces getDefinicioProces() { return definicioProces; } public void setDefinicioProces(DefinicioProces definicioProces) { this.definicioProces = definicioProces; } @ManyToOne(optional=true) @JoinColumn(name="camp_agrupacio_id") @ForeignKey(name="hel_campagrup_camp_fk") public CampAgrupacio getAgrupacio() { return agrupacio; } public void setAgrupacio(CampAgrupacio agrupacio) { this.agrupacio = agrupacio; } @ManyToOne(optional=true) @JoinColumn(name="domini_id") @ForeignKey(name="hel_domini_camp_fk") public Domini getDomini() { return domini; } public void setDomini(Domini domini) { this.domini = domini; } public void removeDomini(Domini domini) { setDomini(null); setDominiId(null); setDominiParams(null); setDominiCampText(null); setDominiCampValor(null); setDominiCacheText(false); setDominiIntern(false); } @ManyToOne(optional=true) @JoinColumn(name="enumeracio_id") @ForeignKey(name="hel_enumeracio_camp_fk") public Enumeracio getEnumeracio() { return enumeracio; } public void setEnumeracio(Enumeracio enumeracio) { this.enumeracio = enumeracio; } @OneToMany(mappedBy="camp", cascade={CascadeType.ALL}) public Set<CampTasca> getCampsTasca() { return this.campsTasca; } public void setCampsTasca(Set<CampTasca> campsTasca) { this.campsTasca = campsTasca; } public void addCampTasca(CampTasca campTasca) { getCampsTasca().add(campTasca); } public void removeCampTasca(CampTasca campTasca) { getCampsTasca().remove(campTasca); } @OneToMany(mappedBy="campData") public Set<Document> getDocumentDates() { return documentDates; } public void setDocumentDates(Set<Document> documentDates) { this.documentDates = documentDates; } public void addDocumentData(Document documentData) { getDocumentDates().add(documentData); } public void removeDocumentData(Document documentData) { getDocumentDates().remove(documentData); } @OneToMany(mappedBy="camp", cascade={CascadeType.ALL}) @OrderBy("ordre asc") public List<Validacio> getValidacions() { return this.validacions; } public void setValidacions(List<Validacio> validacions) { this.validacions = validacions; } public void addValidacio(Validacio validacio) { getValidacions().add(validacio); } public void removeValidacio(Validacio validacio) { getValidacions().remove(validacio); } @OneToMany(mappedBy="membre", cascade={CascadeType.ALL}) public Set<CampRegistre> getRegistrePares() { return this.registrePares; } public void setRegistrePares(Set<CampRegistre> registrePares) { this.registrePares = registrePares; } public void addRegistrePare(CampRegistre registrePare) { getRegistrePares().add(registrePare); } public void removeRegistrePare(CampRegistre registrePare) { getRegistrePares().remove(registrePare); } @OneToMany(mappedBy="registre", cascade={CascadeType.ALL}, fetch=FetchType.EAGER) @OrderBy("ordre asc") @Fetch(value = FetchMode.SUBSELECT) public List<CampRegistre> getRegistreMembres() { return this.registreMembres; } public void setRegistreMembres(List<CampRegistre> registreMembres) { this.registreMembres = registreMembres; } public void addRegistreMembre(CampRegistre registreMembre) { getRegistreMembres().add(registreMembre); } public void removeRegistreMembre(CampRegistre registreMembre) { getRegistreMembres().remove(registreMembre); } @Column(name="ordre") public Integer getOrdre() { return ordre; } public void setOrdre(Integer ordre) { this.ordre = ordre; } @Transient public String getCodiEtiqueta() { if (codi.startsWith(ExpedientCamps.EXPEDIENT_PREFIX)) return etiqueta; else return codi + "/" + etiqueta; } @Transient public String getCodiPerInforme() { if (codi.startsWith(ExpedientCamps.EXPEDIENT_PREFIX)) return codi.replace('$', '%'); else { try { return definicioProces.getJbpmKey() + "/" + codi; } catch (Exception ex) { return null; } } } @SuppressWarnings("rawtypes") @Transient public Class getJavaClass() { if (TipusCamp.STRING.equals(tipus)) { return String.class; } else if (TipusCamp.INTEGER.equals(tipus)) { return Long.class; } else if (TipusCamp.FLOAT.equals(tipus)) { return Double.class; } else if (TipusCamp.BOOLEAN.equals(tipus)) { return Boolean.class; } else if (TipusCamp.TEXTAREA.equals(tipus)) { return String.class; } else if (TipusCamp.DATE.equals(tipus)) { return Date.class; } else if (TipusCamp.PRICE.equals(tipus)) { return BigDecimal.class; } else if (TipusCamp.TERMINI.equals(tipus)) { return String.class; } else if (TipusCamp.REGISTRE.equals(tipus)) { return Object[].class; } else { return String.class; } } public static String getComText( TipusCamp tipus, Object valor, String valorDomini) { if (valor == null) return null; try { String text = null; if (tipus.equals(TipusCamp.INTEGER)) { text = new DecimalFormat("#").format((Long)valor); } else if (tipus.equals(TipusCamp.FLOAT)) { text = new DecimalFormat("#.##########").format((Double)valor); } else if (tipus.equals(TipusCamp.PRICE)) { text = new DecimalFormat("#,##0.00").format((BigDecimal)valor); } else if (tipus.equals(TipusCamp.DATE)) { text = new SimpleDateFormat("dd/MM/yyyy").format((Date)valor); } else if (tipus.equals(TipusCamp.BOOLEAN)) { text = (((Boolean)valor).booleanValue()) ? "Si" : "No"; } else if (tipus.equals(TipusCamp.SELECCIO)) { text = valorDomini; } else if (tipus.equals(TipusCamp.SUGGEST)) { text = valorDomini; } else if (tipus.equals(TipusCamp.TERMINI)) { if (valor instanceof Termini) { text = ((Termini)valor).toString(); } else { String termtxt = (String)valor; String[] parts = termtxt.split("/"); Termini t = new Termini(); t.setAnys((parts.length >= 0) ? new Integer(parts[0]).intValue() : 0); t.setMesos((parts.length >= 1) ? new Integer(parts[1]).intValue() : 0); t.setDies((parts.length >= 2) ? new Integer(parts[2]).intValue() : 0); text = t.toString(); } } else { text = valor.toString(); } return text; } catch (Exception ex) { return valor.toString(); } } public static Object getComObject( TipusCamp tipus, String text) { if (text == null) return null; try { Object obj = null; if (tipus.equals(TipusCamp.INTEGER)) { obj = new Long(text); } else if (tipus.equals(TipusCamp.FLOAT)) { obj = new Double(text); } else if (tipus.equals(TipusCamp.PRICE)) { obj = new BigDecimal(text); } else if (tipus.equals(TipusCamp.DATE)) { obj = new SimpleDateFormat("dd/MM/yyyy").parse(text); } else if (tipus.equals(TipusCamp.BOOLEAN)) { obj = new Boolean("S".equals(text)); } else if (tipus.equals(TipusCamp.SELECCIO)) { obj = text; } else if (tipus.equals(TipusCamp.SUGGEST)) { obj = text; } else if (tipus.equals(TipusCamp.TERMINI)) { String[] parts = text.split("/"); Termini termini = new Termini(); if (parts.length == 3) { termini.setAnys(new Integer(parts[0])); termini.setMesos(new Integer(parts[1])); termini.setDies(new Integer(parts[2])); } obj = termini; } else { obj = text; } return obj; } catch (Exception ex) { return text; } } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((codi == null) ? 0 : codi.hashCode()); result = prime * result + ((definicioProces == null) ? 0 : definicioProces.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Camp other = (Camp) obj; if (codi == null) { if (other.codi != null) return false; } else if (!codi.equals(other.codi)) return false; if (definicioProces == null) { if (other.definicioProces != null) return false; } else if (!definicioProces.equals(other.definicioProces)) return false; return true; } @Column(name="consulta_params", length=255) public String getConsultaParams() { return consultaParams; } public void setConsultaParams(String consultaParams) { this.consultaParams = consultaParams; } @Column(name="consulta_camp_text", length=64) public String getConsultaCampText() { return consultaCampText; } public void setConsultaCampText(String consultaCampText) { this.consultaCampText = consultaCampText; } @Column(name="consulta_camp_valor", length=64) public String getConsultaCampValor() { return consultaCampValor; } public void setConsultaCampValor(String consultaCampValor) { this.consultaCampValor = consultaCampValor; } @Column(name="domini_intern") public boolean isDominiIntern() { return dominiIntern; } public void setDominiIntern(boolean dominiIntern) { this.dominiIntern = dominiIntern; } @ManyToOne(optional=true) @JoinColumn(name="consulta_id") @ForeignKey(name="hel_consulta_camp_fk") public Consulta getConsulta() { return consulta; } public void setConsulta(Consulta consulta) { this.consulta = consulta; } private static final long serialVersionUID = 1L; }