/* * Copyright 2010 Research Studios Austria Forschungsgesellschaft mBH * * This file is part of easyrec. * * easyrec is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * easyrec is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with easyrec. If not, see <http://www.gnu.org/licenses/>. */ package org.easyrec.model.core; import java.io.Serializable; import java.util.Date; /** * This class is a VO (valueobject/dataholder) for a SAT recommender database <code>ItemAssoc</code>. * All typed attributes use a different set of integer ids for each type. * <p/> * <p><b>Company: </b> * SAT, Research Studios Austria</p> * <p/> * <p><b>Copyright: </b> * (c) 2007</p> * <p/> * <p><b>last modified:</b><br/> * $Author: dmann $<br/> * $Date: 2011-12-20 15:22:22 +0100 (Di, 20 Dez 2011) $<br/> * $Revision: 18685 $</p> * * @author Roman Cerny */ public class ItemAssocVO<I extends Comparable<I>, T extends Comparable<T>> implements Cloneable, Serializable, Comparable<ItemAssocVO<I,T>> { ///////////////////////////////////////////////////////////////////////// // constants private static final long serialVersionUID = -3231266117118582233L; // HINT: add a possibility to import item associations from a .CSV file with a given date (Mantis Issue: #582) /** * the number of columns a .CSV file must contain (tenantId, itemFromId, itemFromTypeId, assocTypeId, assocValue, itemToId, itemToTypeId, sourceTypeId, sourceInfo, viewTypeId, active) * Note: the attributes id and changeDate are left out, since they are automatically generated by the database */ public static final int CSV_NUMBER_OF_COLUMNS = 11; //////////////////////////////////////////////////////////////////////// // members private Integer id; private I tenant; private ItemVO<I,T> itemFrom; private T assocType; private Double assocValue; private ItemVO<I,T> itemTo; private T sourceType; private String sourceInfo; private T viewType; private Boolean active; private Date changeDate; // ////////////////////////////////////////////////////////////////////// // methods public ItemAssocVO(I tenant, ItemVO<I,T> itemFrom, T assocType, Double assocValue, ItemVO<I,T> itemTo, T sourceType, String sourceInfo, T viewType, Boolean active) { this(null, tenant, itemFrom, assocType, assocValue, itemTo, sourceType, sourceInfo, viewType, active, null); } public ItemAssocVO(Integer id, I tenant, ItemVO<I,T> itemFrom, T assocType, Double assocValue, ItemVO<I,T> itemTo, T sourceType, String sourceInfo, T viewType, Boolean active) { this(id, tenant, itemFrom, assocType, assocValue, itemTo, sourceType, sourceInfo, viewType, active, null); } public ItemAssocVO(I tenant, ItemVO<I,T> itemFrom, T assocType, Double assocValue, ItemVO<I,T> itemTo, T sourceType, String sourceInfo, T viewType, Boolean active, Date changeDate) { this(null, tenant, itemFrom, assocType, assocValue, itemTo, sourceType, sourceInfo, viewType, active, changeDate); } public ItemAssocVO(Integer id, I tenant, ItemVO<I,T> itemFrom, T assocType, Double assocValue, ItemVO<I,T> itemTo, T sourceType, String sourceInfo, T viewType, Boolean active, Date changeDate) { setId(id); setTenant(tenant); setItemFrom(itemFrom); setAssocType(assocType); setAssocValue(assocValue); setItemTo(itemTo); setSourceType(sourceType); setSourceInfo(sourceInfo); setViewType(viewType); setActive(active); setChangeDate(changeDate); } public Integer getId() { return id; } public I getTenant() { return tenant; } public ItemVO<I,T> getItemFrom() { return itemFrom; } public T getAssocType() { return assocType; } public Double getAssocValue() { return assocValue; } public ItemVO<I,T> getItemTo() { return itemTo; } public T getSourceType() { return sourceType; } public String getSourceInfo() { return sourceInfo; } public T getViewType() { return viewType; } public Boolean isActive() { return active; } public Date getChangeDate() { return changeDate; } public void setId(Integer id) { this.id = id; } public void setTenant(I tenant) { this.tenant = tenant; } public void setItemFrom(ItemVO<I,T> itemFrom) { this.itemFrom = itemFrom; } public void setAssocType(T assocType) { this.assocType = assocType; } public void setAssocValue(Double assocValue) { this.assocValue = assocValue; } public void setItemTo(ItemVO<I,T> itemTo) { this.itemTo = itemTo; } public void setSourceType(T sourceType) { this.sourceType = sourceType; } public void setSourceInfo(String sourceInfo) { this.sourceInfo = sourceInfo; } public void setViewType(T viewType) { this.viewType = viewType; } public void setActive(Boolean active) { this.active = active; } public void setChangeDate(Date changeDate) { this.changeDate = changeDate; } @Override public String toString() { StringBuilder s = new StringBuilder(getClass().getSimpleName()); s.append('@'); s.append(Integer.toHexString(hashCode())); s.append("[id="); s.append(id); s.append(", tenant="); s.append(tenant); s.append(", itemFrom="); s.append(itemFrom); s.append(", assocType="); s.append(assocType); s.append(", assocValue="); s.append(assocValue); s.append(", itemTo="); s.append(itemTo); s.append(", sourceType="); s.append(sourceType); s.append(", sourceInfo='"); s.append(sourceInfo); s.append("', viewType="); s.append(viewType); s.append(", active="); s.append(active); s.append(", changeDate="); s.append(changeDate); s.append("]"); return s.toString(); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((active == null) ? 0 : active.hashCode()); result = prime * result + ((assocType == null) ? 0 : assocType.hashCode()); result = prime * result + ((assocValue == null) ? 0 : assocValue.hashCode()); result = prime * result + ((changeDate == null) ? 0 : changeDate.hashCode()); result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((itemFrom == null) ? 0 : itemFrom.hashCode()); result = prime * result + ((itemTo == null) ? 0 : itemTo.hashCode()); result = prime * result + ((sourceInfo == null) ? 0 : sourceInfo.hashCode()); result = prime * result + ((sourceType == null) ? 0 : sourceType.hashCode()); result = prime * result + ((tenant == null) ? 0 : tenant.hashCode()); result = prime * result + ((viewType == null) ? 0 : viewType.hashCode()); return result; } @SuppressWarnings("unchecked") @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final ItemAssocVO<I,T> other = (ItemAssocVO<I,T>) obj; if (active == null) { if (other.active != null) return false; } else if (!active.equals(other.active)) return false; if (assocType == null) { if (other.assocType != null) return false; } else if (!assocType.equals(other.assocType)) return false; if (assocValue == null) { if (other.assocValue != null) return false; } else if (!assocValue.equals(other.assocValue)) return false; if (changeDate == null) { if (other.changeDate != null) return false; } else if (!changeDate.equals(other.changeDate)) return false; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; if (itemFrom == null) { if (other.itemFrom != null) return false; } else if (!itemFrom.equals(other.itemFrom)) return false; if (itemTo == null) { if (other.itemTo != null) return false; } else if (!itemTo.equals(other.itemTo)) return false; if (sourceInfo == null) { if (other.sourceInfo != null) return false; } else if (!sourceInfo.equals(other.sourceInfo)) return false; if (sourceType == null) { if (other.sourceType != null) return false; } else if (!sourceType.equals(other.sourceType)) return false; if (tenant == null) { if (other.tenant != null) return false; } else if (!tenant.equals(other.tenant)) return false; if (viewType == null) { if (other.viewType != null) return false; } else if (!viewType.equals(other.viewType)) return false; return true; } public int compareTo(ItemAssocVO<I,T> that) { final int BEFORE = -1; final int EQUAL = 0; final int AFTER = 1; if (this == that) return EQUAL; if (this.assocValue < that.assocValue) return BEFORE; if (this.assocValue > that.assocValue) return AFTER; int comp = this.tenant.compareTo(that.tenant); if (comp != EQUAL) return comp; comp = this.itemFrom.compareTo(that.itemFrom); if (comp != EQUAL) return comp; comp = this.assocType.compareTo(that.assocType); if (comp != EQUAL) return comp; comp = this.itemTo.compareTo(that.itemTo); if (comp != EQUAL) return comp; comp = this.sourceType.compareTo(that.sourceType); if (comp != EQUAL) return comp; comp = this.viewType.compareTo(that.viewType); if (comp != EQUAL) return comp; if (!this.active && that.active) return AFTER; if (this.active && !that.active) return BEFORE; comp = this.changeDate.compareTo(that.changeDate); if (comp != EQUAL) return comp; //the following fields should be comparable even when null without NullPointerException if (this.id == null && that.id != null) return AFTER; if (this.id != null && that.id == null) return BEFORE; if (this.id != null && that.id != null) { if (this.id < that.id) return BEFORE; if (this.id > that.id) return AFTER; } if (this.sourceInfo == null && that.sourceInfo != null) return AFTER; if (this.sourceInfo != null && that.sourceInfo == null) return BEFORE; if (this.sourceInfo != null && that.sourceInfo != null) { comp = this.sourceInfo.compareTo(that.sourceInfo); if (comp != EQUAL) return comp; } assert this.equals(that) : "compareTo inconsistent with equals!"; return EQUAL; } @SuppressWarnings("unchecked") @Override public ItemAssocVO<I,T> clone() throws CloneNotSupportedException { ItemAssocVO<I,T> clonedIAssocVO = (ItemAssocVO<I,T>) super.clone(); clonedIAssocVO.setItemFrom(clonedIAssocVO.getItemFrom().clone()); clonedIAssocVO.setItemTo(clonedIAssocVO.getItemTo().clone()); return clonedIAssocVO; } }