/** * Licensed to The Apereo Foundation under one or more contributor license * agreements. See the NOTICE file distributed with this work for additional * information regarding copyright ownership. * * * The Apereo Foundation licenses this file to you under the Educational * Community 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://opensource.org/licenses/ecl2.txt * * 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.opencastproject.search.api; import org.opencastproject.mediapackage.MediaPackage; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.SortedSet; import java.util.TreeSet; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlID; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; /** * This class models an item in the search result. It represents a 'video' or 'series' object. It does not, however, * represent the complete solr document. Authorization information, for instance, is not serialized. */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "result", namespace = "http://search.opencastproject.org") @XmlRootElement(name = "result", namespace = "http://search.opencastproject.org") public class SearchResultItemImpl implements SearchResultItem { /** Serial version id **/ private static final long serialVersionUID = 1L; /** Media identificator. **/ @XmlID @XmlAttribute(name = "id") private String id = ""; @XmlAttribute(name = "org") private String organization; /** The media package */ @XmlElement(name = "mediapackage", namespace = "http://mediapackage.opencastproject.org") private MediaPackage mediaPackage = null; /** Dublin core field 'dc:extent' */ @XmlElement private long dcExtent = -1; /** Dublin core field 'dc:title' */ @XmlElement private String dcTitle = null; /** Dublin core field 'dc:subject' */ @XmlElement private String dcSubject = null; /** Dublin core field 'dc:creator' */ @XmlElement private String dcCreator = null; /** Dublin core field 'cd:publisher' */ @XmlElement private String dcPublisher = null; /** Dublin core field 'dc:contributor' */ @XmlElement private String dcContributor = null; /** Dublin core field 'dc:abstract' */ @XmlElement private String dcAbstract = null; /** Dublin core field 'dc:description' */ @XmlElement private String dcDescription = null; /** Dublin core field 'dc:created' */ @XmlElement private Date dcCreated = null; /** Dublin core field 'dc:availablefrom' */ @XmlElement private Date dcAvailableFrom = null; /** Dublin core field 'dc:availableto' */ @XmlElement private Date dcAvailableTo = null; /** Dublin core field 'dc:language' */ @XmlElement private String dcLanguage = null; /** Dublin core field 'dc:rightsholder' */ @XmlElement private String dcRightsHolder = null; /** Dublin core field 'dc:spacial' */ @XmlElement private String dcSpatial = null; /** Dublin core field 'dc:temporal' */ @XmlElement private String dcTemporal = null; /** Dublin core field 'dc:isPartOf' */ @XmlElement private String dcIsPartOf = null; /** Dublin core field 'dc:replaces' */ @XmlElement private String dcReplaces = null; /** Dublin core field 'dc:type' */ @XmlElement private String dcType = null; /** Dublin core field 'dc:accessrights' */ @XmlElement private String dcAccessRights = null; /** Dublin core field 'dc:license' */ @XmlElement private String dcLicense = null; /** Field oc_mediapackage */ private String ocMediapackage; /** Search result item type */ @XmlElement private SearchResultItemType mediaType = null; /** Media keyword list */ @XmlElementWrapper(name = "keywords") private List<String> keywords = new ArrayList<String>(); /** The cover url. **/ @XmlElement private String cover = null; /** Media date of last modification in milliseconds **/ @XmlElement private Date modified = null; /** Result ranking score **/ @XmlElement private double score = -1; /** Media segment list **/ @XmlElementWrapper(name = "segments") @XmlElement(name = "segment") private SortedSet<MediaSegmentImpl> mediaSegments = null; /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getId() */ public String getId() { return id; } /** * @param id * the id to set */ public void setId(String id) { this.id = id; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getOrganization() */ @Override public String getOrganization() { return organization; } /** * @param organization * the organization to set */ public void setOrganization(String organization) { this.organization = organization; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getDcExtent() */ public long getDcExtent() { return dcExtent; } /** * @param dcExtent * the dcExtent to set */ public void setDcExtent(long dcExtent) { this.dcExtent = dcExtent; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getDcTitle() */ public String getDcTitle() { return dcTitle; } /** * @param dcTitle * the dcTitle to set */ public void setDcTitle(String dcTitle) { this.dcTitle = dcTitle; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getDcSubject() */ public String getDcSubject() { return dcSubject; } /** * @param dcSubject * the dcSubject to set */ public void setDcSubject(String dcSubject) { this.dcSubject = dcSubject; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getDcCreator() */ public String getDcCreator() { return dcCreator; } /** * @param dcCreator * the dcCreator to set */ public void setDcCreator(String dcCreator) { this.dcCreator = dcCreator; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getDcPublisher() */ public String getDcPublisher() { return dcPublisher; } /** * @param dcPublisher * the dcPublisher to set */ public void setDcPublisher(String dcPublisher) { this.dcPublisher = dcPublisher; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getDcContributor() */ public String getDcContributor() { return dcContributor; } /** * @param dcContributor * the dcContributor to set */ public void setDcContributor(String dcContributor) { this.dcContributor = dcContributor; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getDcAbstract() */ public String getDcAbstract() { return dcAbstract; } /** * @param dcAbstract * the dcAbtract to set */ public void setDcAbstract(String dcAbstract) { this.dcAbstract = dcAbstract; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getDcDescription() */ public String getDcDescription() { return dcDescription; } /** * @param dcDescription * the dcDescription to set */ public void setDcDescription(String dcDescription) { this.dcDescription = dcDescription; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getDcCreated() */ public Date getDcCreated() { return dcCreated; } /** * @param dcCreated * the dcCreated to set */ public void setDcCreated(Date dcCreated) { this.dcCreated = dcCreated; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getDcAvailableFrom() */ public Date getDcAvailableFrom() { return dcAvailableFrom; } /** * @param dcAvailableFrom * the dcAvailableFrom to set */ public void setDcAvailableFrom(Date dcAvailableFrom) { this.dcAvailableFrom = dcAvailableFrom; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getDcAvailableTo() */ public Date getDcAvailableTo() { return dcAvailableTo; } /** * @param dcAvailableTo * the dcAvailableTo to set */ public void setDcAvailableTo(Date dcAvailableTo) { this.dcAvailableTo = dcAvailableTo; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getDcLanguage() */ public String getDcLanguage() { return dcLanguage; } /** * @param dcLanguage * the dcLanguage to set */ public void setDcLanguage(String dcLanguage) { this.dcLanguage = dcLanguage; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getDcRightsHolder() */ public String getDcRightsHolder() { return dcRightsHolder; } /** * @param dcRightsHolder * the dcRightsHolder to set */ public void setDcRightsHolder(String dcRightsHolder) { this.dcRightsHolder = dcRightsHolder; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getDcSpatial() */ public String getDcSpatial() { return dcSpatial; } /** * @param dcSpatial * the dcSpatial to set */ public void setDcSpatial(String dcSpatial) { this.dcSpatial = dcSpatial; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getDcTemporal() */ public String getDcTemporal() { return dcTemporal; } /** * @param dcTemporal * the dcTemporal to set */ public void setDcTemporal(String dcTemporal) { this.dcTemporal = dcTemporal; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getDcIsPartOf() */ public String getDcIsPartOf() { return dcIsPartOf; } /** * @param dcIsPartOf * the dcIsPartOf to set */ public void setDcIsPartOf(String dcIsPartOf) { this.dcIsPartOf = dcIsPartOf; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getDcReplaces() */ public String getDcReplaces() { return dcReplaces; } /** * @param dcReplaces * the dcReplaces to set */ public void setDcReplaces(String dcReplaces) { this.dcReplaces = dcReplaces; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getDcType() */ public String getDcType() { return dcType; } /** * @param dcType * the dcType to set */ public void setDcType(String dcType) { this.dcType = dcType; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getDcAccessRights() */ public String getDcAccessRights() { return dcAccessRights; } /** * @param dcAccessRights * the dcAccessRights to set */ public void setDcAccessRights(String dcAccessRights) { this.dcAccessRights = dcAccessRights; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getDcLicense() */ public String getDcLicense() { return dcLicense; } /** * @param dcLicense * the dcLicense to set */ public void setDcLicense(String dcLicense) { this.dcLicense = dcLicense; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getType() */ public SearchResultItemType getType() { return mediaType; } @Override public String getOcMediapackage() { return ocMediapackage; } public void setOcMediapackage(String mediapackage) { this.ocMediapackage = mediapackage; } /** * @param mediaType * the mediaType to set */ public void setMediaType(SearchResultItemType mediaType) { this.mediaType = mediaType; } /** * Sets the media package that is associated with the search result item. * * @param mediaPackage * the media package */ public void setMediaPackage(MediaPackage mediaPackage) { this.mediaPackage = mediaPackage; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getMediaPackage() */ public MediaPackage getMediaPackage() { return mediaPackage; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getKeywords() */ public String[] getKeywords() { return keywords.toArray(new String[keywords.size()]); } /** * Add a keyword to this search item. * * @param keyword * the keyword */ public void addKeyword(String keyword) { if (keywords == null) keywords = new ArrayList<String>(); keywords.add(keyword); } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getCover() */ public String getCover() { return cover; } /** * @param cover * the cover to set */ public void setCover(String cover) { this.cover = cover; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getModified() */ public Date getModified() { return modified; } /** * @param modified * the modified to set */ public void setModified(Date modified) { this.modified = modified; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getScore() */ public double getScore() { return score; } /** * @param score * the score to set */ public void setScore(double score) { this.score = score; } /** * {@inheritDoc} * * @see org.opencastproject.search.api.SearchResultItem#getSegments() */ public MediaSegment[] getSegments() { return mediaSegments != null ? mediaSegments.toArray(new MediaSegment[mediaSegments.size()]) : new MediaSegmentImpl[0]; } /** * Adds a segment to the list of media segments. The list is backed by a sorted set, so there is no need to add the * segments in order, although it is certainly more performant. * * @param segment * the segment to add */ public void addSegment(MediaSegment segment) { if (mediaSegments == null) mediaSegments = new TreeSet<MediaSegmentImpl>(); mediaSegments.add((MediaSegmentImpl) segment); // TODO: assuming this } /** * Build a result item from an anonymously implemented interface to ensure you don't miss any fields. */ public static SearchResultItemImpl fill(SearchResultItem from) { SearchResultItemImpl item = new SearchResultItemImpl(); item.setId(from.getId()); item.setOrganization(from.getOrganization()); item.setMediaPackage(from.getMediaPackage()); item.setDcExtent(from.getDcExtent()); item.setDcTitle(from.getDcTitle()); item.setDcSubject(from.getDcSubject()); item.setDcDescription(from.getDcDescription()); item.setDcCreator(from.getDcCreator()); item.setDcPublisher(from.getDcPublisher()); item.setDcContributor(from.getDcContributor()); item.setDcAbstract(from.getDcAbstract()); item.setDcCreated(from.getDcCreated()); item.setDcAvailableFrom(from.getDcAvailableFrom()); item.setDcAvailableTo(from.getDcAvailableTo()); item.setDcLanguage(from.getDcLanguage()); item.setDcRightsHolder(from.getDcRightsHolder()); item.setDcSpatial(from.getDcSpatial()); item.setDcTemporal(from.getDcTemporal()); item.setDcIsPartOf(from.getDcIsPartOf()); item.setDcReplaces(from.getDcReplaces()); item.setDcType(from.getDcType()); item.setDcAccessRights(from.getDcAccessRights()); item.setDcLicense(from.getDcLicense()); item.setOcMediapackage(from.getOcMediapackage()); item.setMediaType(from.getType()); for (String k : from.getKeywords()) item.addKeyword(k); item.setCover(from.getCover()); item.setModified(from.getModified()); item.setScore(from.getScore()); for (MediaSegment s : from.getSegments()) item.addSegment(s); return item; } }