package org.nextprot.api.core.dao; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nextprot.api.commons.exception.NextProtException; import org.nextprot.api.core.domain.Overview.EntityNameClass; import java.io.Serializable; import java.util.ArrayList; import java.util.Comparator; import java.util.List; public class EntityName implements Serializable { private static final Log LOGGER = LogFactory.getLog(EntityName.class); private static final long serialVersionUID = 3L; private Boolean isMain; private EntityNameClass clazz; private String type; private String qualifier; private String id; private String category; private String name; private String parentId; //TODO Is this the same as saying parentName??? Is this really needed for isoforms???? private String mainEntityName; private List<EntityName> recommendedEntityNames = new ArrayList<>(); private List<EntityName> synonyms = new ArrayList<>(); public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public Boolean isMain() { return isMain; } public void setMain(Boolean isMain) { this.isMain = isMain; } public EntityNameClass getClazz() { return clazz; } public void setClazz(EntityNameClass clazz) { this.clazz = clazz; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getQualifier() { return qualifier; } public void setQualifier(String qualifier) { this.qualifier = qualifier; } public String getId() { return id; } public void setId(String synonymId) { this.id = synonymId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getParentId() { return parentId; } public void setParentId(String parentId) { this.parentId = parentId; } public List<EntityName> getOtherRecommendedEntityNames() { return recommendedEntityNames; } public void addOtherRecommendedEntityName(EntityName recommendedName) { this.recommendedEntityNames.add(recommendedName); } public List<EntityName> getSynonyms() { return synonyms; } public void addSynonym(EntityName synonym) { this.synonyms.add(synonym); } public void addAllSynonyms(List<EntityName> synonyms) { this.synonyms.addAll(synonyms); } // defined for EntityNameClass.PROTEIN_NAMES, EntityNameClass.FUNCTIONAL_REGION_NAMES and EntityNameClass.CLEAVED_REGION_NAMES private enum QualifierValue { FULL, SHORT, EC, ALLERGEN, CD_ANTIGEN, INN } public String getComposedName(){ String qualifier="", type=getType(); if(getQualifier()!=null){ qualifier=getQualifier(); // return qualifier+type.substring(0, 1).toUpperCase() + type.substring(1); return qualifier+" "+type; } return getType(); } @Deprecated //Fix javascript client and remove this method public String getValue() { return name; } @Deprecated //Fix javascript client and remove this method public void setValue(String value) { this.name = value; } //TODO Is this the same as saying parentName??? Is this really needed for isoforms???? public void setMainEntityName(String mainEntityName) { this.mainEntityName = mainEntityName; } //TODO Is this the same as saying parentName??? Is this really needed for isoforms???? public String getMainEntityName() { return this.mainEntityName; } public static String toString(List<EntityName> entityNameList) { StringBuilder sb = new StringBuilder(); if (entityNameList != null) { for (EntityName entityName : entityNameList) { sb.append(entityName.getName()); sb.append(", "); } if (sb.length() > 0) { sb.delete(sb.length() - 2, sb.length()); } } return sb.toString(); } public static Comparator<EntityName> newDefaultComparator() { return new EntityName.ByCategoryComparator() .thenComparing(new EntityName.ByQualifierValueComparator()) .thenComparing(EntityName::getName); } public static class ByQualifierValueComparator implements Comparator<EntityName> { @Override public int compare(EntityName en1, EntityName en2) { if (en1.qualifier != null && en2.qualifier != null) { try { QualifierValue qv1 = EntityName.QualifierValue.valueOf(en1.qualifier.replaceAll("\\s+","_").toUpperCase()); QualifierValue qv2 = EntityName.QualifierValue.valueOf(en2.qualifier.replaceAll("\\s+","_").toUpperCase()); return qv1.ordinal() - qv2.ordinal(); } catch (IllegalArgumentException e) { throw new NextProtException("Failed to compare enum values " + en1.qualifier + " vs "+ en2.qualifier + ": " + e.getMessage()); } } return 0; } } public static class ByCategoryComparator implements Comparator<EntityName> { @Override public int compare(EntityName en1, EntityName en2) { // 1. ORFs come last if("orf".equalsIgnoreCase(en1.getCategory())) { return 1; } if("orf".equalsIgnoreCase(en2.getCategory())) { return -1; } return 0; } } }