/**
* 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.index.service.impl.index.event;
import org.opencastproject.index.service.catalog.adapter.MetadataUtils;
import org.opencastproject.mediapackage.Publication;
import org.opencastproject.metadata.dublincore.DublinCore;
import org.opencastproject.metadata.dublincore.EventCatalogUIAdapter;
import org.opencastproject.metadata.dublincore.MetadataCollection;
import org.opencastproject.metadata.dublincore.MetadataField;
import org.opencastproject.util.DateTimeSupport;
import org.opencastproject.workflow.handler.distribution.EngagePublicationChannel;
import org.opencastproject.workflow.handler.distribution.InternalPublicationChannel;
import com.entwinemedia.fn.Fn;
import org.apache.commons.lang3.StringUtils;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.TimeZone;
public final class EventUtils {
private static final int CREATED_BY_UI_ORDER = 14;
public static final Map<String, String> PUBLICATION_CHANNELS = new HashMap<String, String>();
static {
PUBLICATION_CHANNELS.put(EngagePublicationChannel.CHANNEL_ID, "EVENTS.EVENTS.DETAILS.GENERAL.ENGAGE");
PUBLICATION_CHANNELS.put("youtube", "EVENTS.EVENTS.DETAILS.GENERAL.YOUTUBE");
}
private EventUtils() {
}
/**
* Loads the metadata for the given event
*
* @param event
* the source {@link Event}
* @return a {@link MetadataCollection} instance with all the event metadata
*/
@SuppressWarnings("unchecked")
public static MetadataCollection getEventMetadata(Event event, EventCatalogUIAdapter eventCatalogUIAdapter)
throws Exception {
MetadataCollection metadata = eventCatalogUIAdapter.getRawFields();
MetadataField<?> title = metadata.getOutputFields().get(DublinCore.PROPERTY_TITLE.getLocalName());
metadata.removeField(title);
MetadataField<String> newTitle = MetadataUtils.copyMetadataField(title);
newTitle.setValue(event.getTitle());
metadata.addField(newTitle);
MetadataField<?> subject = metadata.getOutputFields().get(DublinCore.PROPERTY_SUBJECT.getLocalName());
metadata.removeField(subject);
MetadataField<String> newSubject = MetadataUtils.copyMetadataField(subject);
newSubject.setValue(event.getSubject());
metadata.addField(newSubject);
MetadataField<?> description = metadata.getOutputFields().get(DublinCore.PROPERTY_DESCRIPTION.getLocalName());
metadata.removeField(description);
MetadataField<String> newDescription = MetadataUtils.copyMetadataField(description);
newDescription.setValue(event.getDescription());
metadata.addField(newDescription);
MetadataField<?> language = metadata.getOutputFields().get(DublinCore.PROPERTY_LANGUAGE.getLocalName());
metadata.removeField(language);
MetadataField<String> newLanguage = MetadataUtils.copyMetadataField(language);
newLanguage.setValue(event.getLanguage());
metadata.addField(newLanguage);
MetadataField<?> rightsHolder = metadata.getOutputFields().get(DublinCore.PROPERTY_RIGHTS_HOLDER.getLocalName());
metadata.removeField(rightsHolder);
MetadataField<String> newRightsHolder = MetadataUtils.copyMetadataField(rightsHolder);
newRightsHolder.setValue(event.getRights());
metadata.addField(newRightsHolder);
MetadataField<?> license = metadata.getOutputFields().get(DublinCore.PROPERTY_LICENSE.getLocalName());
metadata.removeField(license);
MetadataField<String> newLicense = MetadataUtils.copyMetadataField(license);
newLicense.setValue(event.getLicense());
metadata.addField(newLicense);
MetadataField<?> series = metadata.getOutputFields().get(DublinCore.PROPERTY_IS_PART_OF.getLocalName());
metadata.removeField(series);
MetadataField<String> newSeries = MetadataUtils.copyMetadataField(series);
newSeries.setValue(event.getSeriesId());
metadata.addField(newSeries);
MetadataField<?> presenters = metadata.getOutputFields().get(DublinCore.PROPERTY_CREATOR.getLocalName());
metadata.removeField(presenters);
MetadataField<String> newPresenters = MetadataUtils.copyMetadataField(presenters);
newPresenters.setValue(StringUtils.join(event.getPresenters(), ", "));
metadata.addField(newPresenters);
MetadataField<?> contributors = metadata.getOutputFields().get(DublinCore.PROPERTY_CONTRIBUTOR.getLocalName());
metadata.removeField(contributors);
MetadataField<String> newContributors = MetadataUtils.copyMetadataField(contributors);
newContributors.setValue(StringUtils.join(event.getContributors(), ", "));
metadata.addField(newContributors);
String recordingStartDate = event.getRecordingStartDate();
if (StringUtils.isNotBlank(recordingStartDate)) {
Date startDateTime = new Date(DateTimeSupport.fromUTC(recordingStartDate));
MetadataField<?> startDate = metadata.getOutputFields().get("startDate");
metadata.removeField(startDate);
MetadataField<String> newStartDate = MetadataUtils.copyMetadataField(startDate);
SimpleDateFormat sdf = new SimpleDateFormat(startDate.getPattern().get());
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
newStartDate.setValue(sdf.format(startDateTime));
metadata.addField(newStartDate);
MetadataField<?> startTime = metadata.getOutputFields().get("startTime");
metadata.removeField(startTime);
MetadataField<String> newStartTime = MetadataUtils.copyMetadataField(startTime);
sdf = new SimpleDateFormat(startTime.getPattern().get());
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
newStartTime.setValue(sdf.format(startDateTime));
metadata.addField(newStartTime);
}
if (event.getDuration() != null) {
MetadataField<?> duration = metadata.getOutputFields().get("duration");
metadata.removeField(duration);
MetadataField<String> newDuration = MetadataUtils.copyMetadataField(duration);
newDuration.setValue(event.getDuration().toString());
metadata.addField(newDuration);
}
MetadataField<?> agent = metadata.getOutputFields().get("location");
metadata.removeField(agent);
MetadataField<String> newAgent = MetadataUtils.copyMetadataField(agent);
newAgent.setValue(event.getLocation());
metadata.addField(newAgent);
MetadataField<?> source = metadata.getOutputFields().get(DublinCore.PROPERTY_SOURCE.getLocalName());
metadata.removeField(source);
MetadataField<String> newSource = MetadataUtils.copyMetadataField(source);
newSource.setValue(event.getSource());
metadata.addField(newSource);
String createdDate = event.getCreated();
if (StringUtils.isNotBlank(createdDate)) {
MetadataField<?> created = metadata.getOutputFields().get(DublinCore.PROPERTY_CREATED.getLocalName());
metadata.removeField(created);
MetadataField<Date> newCreated = MetadataUtils.copyMetadataField(created);
newCreated.setValue(new Date(DateTimeSupport.fromUTC(createdDate)));
metadata.addField(newCreated);
}
MetadataField<?> uid = metadata.getOutputFields().get(DublinCore.PROPERTY_IDENTIFIER.getLocalName());
metadata.removeField(uid);
MetadataField<String> newUID = MetadataUtils.copyMetadataField(uid);
newUID.setValue(event.getIdentifier());
metadata.addField(newUID);
return metadata;
}
/**
* A filter to remove all internal channel publications.
*/
public static final Fn<Publication, Boolean> internalChannelFilter = new Fn<Publication, Boolean>() {
@Override
public Boolean apply(Publication a) {
if (InternalPublicationChannel.CHANNEL_ID.equals(a.getChannel()))
return false;
return true;
}
};
}