package models; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.persistence.DiscriminatorColumn; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.Table; import play.db.ebean.Model; import uk.bl.Const; import com.avaje.ebean.ExpressionList; import com.avaje.ebean.Page; import com.fasterxml.jackson.annotation.JsonIgnore; /** * This class allows archivist to manage open flags. */ @Entity @DiscriminatorValue("flags") public class Flag extends Taxonomy { /** * file id */ private static final long serialVersionUID = -2257699575463702989L; @JsonIgnore @ManyToMany @JoinTable(name = "flag_target", joinColumns = { @JoinColumn(name = "flag_id", referencedColumnName="id") }, inverseJoinColumns = { @JoinColumn(name = "target_id", referencedColumnName="id") }) public List<Target> targets; @JsonIgnore @ManyToMany @JoinTable(name = "flag_instance", joinColumns = { @JoinColumn(name = "flag_id", referencedColumnName="id") }, inverseJoinColumns = { @JoinColumn(name = "instance_id", referencedColumnName="id") }) public List<Instance> instances; public static final Model.Finder<Long, Flag> find = new Model.Finder<Long, Flag>(Long.class, Flag.class); public static Flag findByName(String name) { return find.where() .eq("name", name) .findUnique(); } /** * Retrieve an object by Id (id). * @param nid * @return object */ public static Flag findById(Long id) { Flag res = find.where().eq(Const.ID, id).findUnique(); return res; } /** * Retrieve a permission refusal by URL. * @param url * @return permission refusal name */ public static Flag findByUrl(String url) { Flag res = new Flag(); if (url != null && url.length() > 0 && !url.equals(Const.NONE)) { res = find.where().eq(Const.URL, url).findUnique(); } else { res.name = Const.NONE; } return res; } /** * This method filters flags by name and returns a list * of filtered Flag objects. * @param name * @return */ public static List<Flag> filterByFlagName(String name) { List<Flag> res = new ArrayList<Flag>(); ExpressionList<Flag> ll = find.where().icontains(Const.NAME, name); res = ll.findList(); return res; } /** * Retrieve all flags. */ public static List<Flag> findAllFlags() { return find.all(); } /** * This method retrieves selected flags from target object. * @param targetUrl * @return */ public static List<Flag> convertUrlsToFlagObjects(String urls) { List<Flag> res = new ArrayList<Flag>(); if (urls != null && urls.length() > 0 && !urls.toLowerCase().contains(Const.NONE)) { String[] parts = urls.split(Const.COMMA + " "); for (String part: parts) { // Logger.debug("part: " + part); Flag flag = findByName(part); if (flag != null && flag.name != null && flag.name.length() > 0) { // Logger.debug("flag name: " + flag.name); res.add(flag); } } } return res; } public static Map<String,String> options() { LinkedHashMap<String,String> options = new LinkedHashMap<String,String>(); for(Flag t: Flag.findAllFlags()) { options.put(t.id.toString(), t.name); } return options; } @Override public String toString() { return "Flag(" + name + ")" + ", id:" + id; } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((id == null) ? 0 : id.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; Flag other = (Flag) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } /** * Return a page of User * * @param page Flag to display * @param pageSize Number of Flags per page * @param sortBy User property used for sorting * @param order Sort order (either or asc or desc) * @param filter Filter applied on the name column */ public static Page<Flag> pager(int page, int pageSize, String sortBy, String order, String filter) { return find.where().icontains("name", filter) .orderBy(sortBy + " " + order) .findPagingList(pageSize) .setFetchAhead(false) .getPage(page); } }