package models;
import java.sql.Timestamp;
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.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Version;
import org.apache.commons.lang3.StringUtils;
import play.Logger;
import play.db.ebean.Model;
import uk.bl.api.Utils;
import uk.bl.exception.ActException;
import uk.bl.scope.Scope;
import com.avaje.ebean.Ebean;
import com.avaje.ebean.Expr;
import com.avaje.ebean.Expression;
import com.fasterxml.jackson.annotation.JsonIgnore;
@Entity
@Table(name = "field_url")
public class FieldUrl extends Model {
/**
*
*/
private static final long serialVersionUID = 2076421295020360166L;
@Id
public Long id;
@Column(columnDefinition="text")
public String url;
public Date createdAt;
@Version
public Timestamp updatedAt;
@JsonIgnore
@ManyToOne(cascade = CascadeType.REFRESH)
public Target target;
public Long position;
@Column(columnDefinition = "text")
public String domain;
public static Model.Finder<Long, FieldUrl> find = new Finder<Long, FieldUrl>(Long.class, FieldUrl.class);
public FieldUrl(String url) throws ActException {
super();
this.url = url.trim();
this.domain = Scope.getDomainFromUrl(this.url);
}
public static FieldUrl findByUrl(String url) {
return find.where().eq("url", url).findUnique();
}
public static List<FieldUrl> findByContains(String url) {
return find.where().endsWith("url", url).findList();
}
public static FieldUrl hasDuplicate(String url) throws ActException {
url = Utils.INSTANCE.getPath(url);
String urlSlash = url.endsWith("/") ? StringUtils.stripEnd(url, "/") : StringUtils.appendIfMissing(url, "/");
Logger.debug("url: " + url);
Logger.debug("urlNoSlash: " + urlSlash);
List<FieldUrl> fieldUrls = find.where().add(Expr.or(
Expr.iendsWith("url", url),
Expr.iendsWith("url", urlSlash))).findList();
// filter this list
for (FieldUrl fieldUrl : fieldUrls) {
Logger.info("Comparing with "+fieldUrl.url);
String dbUrl = Utils.INSTANCE.getPath(fieldUrl.url);
String dbUrlSlash = dbUrl.endsWith("/") ? StringUtils.stripEnd(dbUrl, "/") : StringUtils.appendIfMissing(dbUrl, "/");
Logger.debug("url: " + url);
Logger.debug("urlSlash: " + urlSlash);
Logger.debug("dbUrl: " + dbUrl);
Logger.debug("dbUrlSlash: " + dbUrlSlash);
if (url.equalsIgnoreCase(dbUrl) || url.equalsIgnoreCase(dbUrlSlash) ||
urlSlash.equalsIgnoreCase(dbUrl) || urlSlash.equalsIgnoreCase(dbUrlSlash)) {
return fieldUrl;
}
}
return null;
}
public static List<FieldUrl> findHigherLevelUrls(String domain, String url) {
Logger.debug("Parameters: " + domain + " - " + url.length());
String query = "find fieldUrl fetch target fetch target.licenses where url like :domain and LENGTH(url) < :length";
List<FieldUrl> fieldUrls = Ebean.createQuery(FieldUrl.class, query)
.setParameter("domain", "%" + domain + "%")
.setParameter("length", url.length()).where().or(Expr.isNotNull("target.licenses"), Expr.isNotNull("target.qaIssue")).findList();
return fieldUrls;
}
@Override
public void save() {
// need to save to get the ID
this.createdAt = new Date();
super.save();
}
@Override
public String toString() {
return this.url;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((url == null) ? 0 : url.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
FieldUrl other = (FieldUrl) obj;
if (url == null) {
if (other.url != null)
return false;
} else if (!url.equals(other.url))
return false;
return true;
}
}