/*
* $HeadURL$
* $Id$
*
* Copyright (c) 2006-2010 by Public Library of Science
* http://plos.org
* http://ambraproject.org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.ambraproject.views;
import org.ambraproject.util.TextUtils;
import org.apache.commons.lang.StringUtils;
import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.List;
/**
* Value object that holds the result of a single search item
*/
public class SearchHit implements Serializable {
private static final long serialVersionUID = 2450207404766168639L;
private static final int TITLE_LENGTH = 120;
private final float hitScore;
private final String uri;
private final String title;
private final Date date;
private final String creator;
private String firstSecondLastCreator;
private final List<String> listOfCreators;
private final String issn;
private final String journalTitle;
private final String articleTypeForDisplay;
private String abstractText;
private String strikingImage;
private Boolean hasAssets = Boolean.FALSE;
private List<String> expressionOfConcern;
private String retraction;
private Collection<String> subjects;
private Collection<String> subjectsPolyhierarchy;
/**
* Create a search hit with the values set
*
* @param hitScore Hit score
* @param uri Article ID
* @param title Article title
* @param creators Creators
* @param date Article date
* @param issn eIssn of the journal
* @param journalTitle Journal title
* @param articleTypeForDisplay Article type
* @param strikingImage
* @param hasAssets
*/
public SearchHit(Float hitScore, String uri, String title,
List<String> creators, Date date, String issn,
String journalTitle, String articleTypeForDisplay, String abstractText,
Collection<String> subjects, Collection<String> subjectsPolyhierarchy, String strikingImage,
boolean hasAssets, List<String> expressionOfConcern, String retraction) {
if (hitScore == null) {
this.hitScore = 0f;
} else {
this.hitScore = hitScore;
}
this.uri = uri;
this.title = title;
this.creator = StringUtils.join(creators, ", ");
this.listOfCreators = creators;
this.date = date;
this.issn = issn;
this.journalTitle = journalTitle;
this.articleTypeForDisplay = articleTypeForDisplay;
this.abstractText = abstractText;
this.subjects = subjects;
this.subjectsPolyhierarchy = subjectsPolyhierarchy;
this.strikingImage = strikingImage;
this.hasAssets = hasAssets;
this.expressionOfConcern = expressionOfConcern;
this.retraction = retraction;
//Make a list of first, second, third creators
if(creators != null) {
this.firstSecondLastCreator = TextUtils.makeAuthorString(creators.toArray(new String[creators.size()]));
}
}
/**
* @return the hit object's uri
*/
public String getUri() {
return uri;
}
/**
* Getter for property 'hitScore'.
*
* @return Value for property 'hitScore'.
*/
public float getHitScore() {
return hitScore;
}
/**
* Getter for property 'creator'.
*
* @return Value for property 'creator'.
*/
public String getCreator() {
return creator;
}
/**
* Getter for property 'date'.
*
* @return Value for property 'date'.
*/
public Date getDate() {
return date;
}
/**
* Getter for property 'title'.
*
* @return Value for property 'title'.
*/
public String getTitle() {
return title;
}
/**
* Return truncated article title
*
* @return truncated article title
*/
public String getTruncatedTitle() {
return TextUtils.truncateTextCloseOpenTag(this.title, TITLE_LENGTH);
}
/**
* Get the issn for the Journal to which this SearchHit belongs.
*
* @return The issn for the Journal to which this SearchHit belongs.
*/
public String getIssn() {
return issn;
}
/**
* Get the Dublin Core Title for the Journal to which this SearchHit belongs.
*
* @return Dublin Core Title for the Journal to which this SearchHit belongs.
*/
public String getJournalTitle() {
return journalTitle;
}
/**
* Get the type of the Article as a String ready for display.
*
* @return Type of the Article as a String ready for display
*/
public String getArticleTypeForDisplay() {
return articleTypeForDisplay;
}
/**
* Get the abstract
*
* @return abstract text
*/
public String getAbstract() {
return abstractText;
}
/**
* Get the subjects
*
* @return a collection of subjects
*/
public Collection<String> getSubjects() {
return subjects;
}
/**
* Get the subjects Polyhierarchy
*
* @return
*/
public Collection<String> getSubjectsPolyhierarchy() {
return subjectsPolyhierarchy;
}
/**
* Get the creators in a list
*
* @return
*/
public Collection<String> getListOfCreators() {
return this.listOfCreators;
}
public String getFirstSecondLastCreator() {
return firstSecondLastCreator;
}
public String getStrikingImage() {
return strikingImage;
}
public Boolean getHasAssets() {
return hasAssets;
}
public List<String> getExpressionOfConcern() {
return expressionOfConcern;
}
public String getRetraction() {
return retraction;
}
public static Builder builder() {
return new Builder();
}
public static class Builder {
private Builder() {
super();
}
private Float hitScore;
private String uri;
private String title;
private String highlight;
private Date date;
private List<String> listOfCreators;
private Collection<String> subjects;
private Collection<String> subjectsPolyhierarchy;
private String issn;
private String journalTitle;
private String articleTypeForDisplay;
private String abstractText;
private String strikingImage;
private Boolean hasAssets = Boolean.FALSE;
private List<String> expressionOfConcern;
private String retraction;
public Builder setHasAssets(Boolean hasAssets) {
this.hasAssets = hasAssets;
return this;
}
public Builder setHitScore(Float hitScore) {
this.hitScore = hitScore;
return this;
}
public Builder setUri(String uri) {
this.uri = uri;
return this;
}
public Builder setTitle(String title) {
this.title = title;
return this;
}
public Builder setHighlight(String highlight) {
this.highlight = highlight;
return this;
}
public Builder setDate(Date date) {
this.date = date;
return this;
}
public Builder setListOfCreators(List<String> listOfCreators) {
this.listOfCreators = listOfCreators;
return this;
}
public Builder setSubjects(Collection<String> subjects) {
this.subjects = subjects;
return this;
}
public Builder setSubjectsPolyhierarchy(Collection<String> subjectsPolyhierarchy) {
this.subjectsPolyhierarchy = subjectsPolyhierarchy;
return this;
}
public Builder setIssn(String issn) {
this.issn = issn;
return this;
}
public Builder setJournalTitle(String journalTitle) {
this.journalTitle = journalTitle;
return this;
}
public Builder setArticleTypeForDisplay(String articleTypeForDisplay) {
this.articleTypeForDisplay = articleTypeForDisplay;
return this;
}
public Builder setAbstractText(String abstractText) {
this.abstractText = abstractText;
return this;
}
public Builder setExpressionOfConcern(List<String> expressionOfConcern) {
this.expressionOfConcern = expressionOfConcern;
return this;
}
public Builder setRetraction(String retraction) {
this.retraction = retraction;
return this;
}
public Builder setStrikingImage(String strikingImage) {
this.strikingImage = strikingImage;
return this;
}
public SearchHit build() {
return new SearchHit(
hitScore,
uri,
title,
listOfCreators,
date,
issn,
journalTitle,
articleTypeForDisplay,
abstractText,
subjects,
subjectsPolyhierarchy,
strikingImage,
hasAssets,
expressionOfConcern,
retraction
);
}
}
@Override
public String toString() {
return "SearchHit{" +
"hitScore=" + hitScore +
", uri='" + uri + '\'' +
", title='" + title + '\'' +
", date=" + date +
", creator='" + creator + '\'' +
", listOfCreators=" + listOfCreators +
", issn='" + issn + '\'' +
", journalTitle='" + journalTitle + '\'' +
", articleTypeForDisplay='" + articleTypeForDisplay + '\'' +
", abstractText='" + abstractText + '\'' +
", strikingImage='" + strikingImage + '\'' +
", hasAssets=" + hasAssets +
", subjects=" + subjects +
", subjectsPolyhierarchy=" + subjectsPolyhierarchy +
", expressionOfConcern=" + expressionOfConcern +
", retraction=" + retraction +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SearchHit searchHit = (SearchHit) o;
return uri.equals(searchHit.uri);
}
@Override
public int hashCode() {
return uri.hashCode();
}
}