/** * 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.catalog.adapter; import org.opencastproject.index.service.exception.ListProviderException; import org.opencastproject.index.service.resources.list.api.ListProvidersService; import org.opencastproject.index.service.resources.list.query.ResourceListQueryImpl; import org.opencastproject.metadata.dublincore.DCMIPeriod; import org.opencastproject.metadata.dublincore.EncodingSchemeUtils; import org.opencastproject.metadata.dublincore.MetadataField; import com.entwinemedia.fn.data.Opt; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Map; public class DublinCoreMetadataCollection extends AbstractMetadataCollection { private static final Logger logger = LoggerFactory.getLogger(DublinCoreMetadataCollection.class); private Opt<Map<String, String>> getCollection(MetadataField<?> metadataField, ListProvidersService listProvidersService) { try { if (listProvidersService != null && metadataField.getListprovider().isSome()) { Map<String, String> collection = listProvidersService.getList(metadataField.getListprovider().get(), new ResourceListQueryImpl(), null, true); if (collection != null) { return Opt.some(collection); } } return Opt.<Map<String, String>> none(); } catch (ListProviderException e) { logger.warn("Unable to set collection on metadata because {}", ExceptionUtils.getStackTrace(e)); return Opt.<Map<String, String>> none(); } } public void addField(MetadataField<?> metadataField, String value, ListProvidersService listProvidersService) { switch (metadataField.getType()) { case BOOLEAN: MetadataField<Boolean> booleanField = MetadataField.createBooleanMetadata(metadataField.getInputID(), Opt.some(metadataField.getOutputID()), metadataField.getLabel(), metadataField.isReadOnly(), metadataField.isRequired(), metadataField.getOrder(), metadataField.getNamespace()); if (StringUtils.isNotBlank(value)) { booleanField.setValue(Boolean.parseBoolean(value)); } addField(booleanField); break; case DATE: MetadataField<Date> dateField = MetadataField.createDateMetadata(metadataField.getInputID(), Opt.some(metadataField.getOutputID()), metadataField.getLabel(), metadataField.isReadOnly(), metadataField.isRequired(), metadataField.getPattern().get(), metadataField.getOrder(), metadataField.getNamespace()); if (StringUtils.isNotBlank(value)) { dateField.setValue(EncodingSchemeUtils.decodeDate(value)); } addField(dateField); break; case DURATION: MetadataField<String> durationField = MetadataField.createDurationMetadataField(metadataField.getInputID(), Opt.some(metadataField.getOutputID()), metadataField.getLabel(), metadataField.isReadOnly(), metadataField.isRequired(), getCollection(metadataField, listProvidersService), metadataField.getCollectionID(), metadataField.getOrder(), metadataField.getNamespace()); DCMIPeriod period = EncodingSchemeUtils.decodePeriod(value); Long longValue = -1L; // Check to see if it is from the front end String[] durationParts = value.split(":"); if (durationParts.length == 3) { Integer hours = Integer.parseInt(durationParts[0]); Integer minutes = Integer.parseInt(durationParts[1]); Integer seconds = Integer.parseInt(durationParts[2]); longValue = ((hours.longValue() * 60 + minutes.longValue()) * 60 + seconds.longValue()) * 1000; } else if (period != null && period.hasStart() && period.hasEnd()) { longValue = period.getEnd().getTime() - period.getStart().getTime(); } else { try { longValue = Long.parseLong(value); } catch (NumberFormatException e) { logger.debug("Unable to parse duration '{}' value as either a period or millisecond duration.", value); longValue = -1L; } } if (longValue > 0) { durationField.setValue(longValue.toString()); } addField(durationField); break; case ITERABLE_TEXT: // Add an iterable text style field MetadataField<Iterable<String>> iterableTextField = MetadataField.createIterableStringMetadataField( metadataField.getInputID(), Opt.some(metadataField.getOutputID()), metadataField.getLabel(), metadataField.isReadOnly(), metadataField.isRequired(), getCollection(metadataField, listProvidersService), metadataField.getCollectionID(), metadataField.getOrder(), metadataField.getNamespace()); if (StringUtils.isNotBlank(value)) { List<String> valueList = Arrays.asList(StringUtils.split(value, ",")); iterableTextField.setValue(valueList); } addField(iterableTextField); break; case MIXED_TEXT: // Add an iterable text style field MetadataField<Iterable<String>> mixedIterableTextField = MetadataField.createMixedIterableStringMetadataField( metadataField.getInputID(), Opt.some(metadataField.getOutputID()), metadataField.getLabel(), metadataField.isReadOnly(), metadataField.isRequired(), getCollection(metadataField, listProvidersService), metadataField.getCollectionID(), metadataField.getOrder(), metadataField.getNamespace()); if (StringUtils.isNotBlank(value)) { List<String> valueList = Arrays.asList(StringUtils.split(value, ",")); mixedIterableTextField.setValue(valueList); } addField(mixedIterableTextField); break; case LONG: MetadataField<Long> longField = MetadataField.createLongMetadataField(metadataField.getInputID(), Opt.some(metadataField.getOutputID()), metadataField.getLabel(), metadataField.isReadOnly(), metadataField.isRequired(), getCollection(metadataField, listProvidersService), metadataField.getCollectionID(), metadataField.getOrder(), metadataField.getNamespace()); if (StringUtils.isNotBlank(value)) { longField.setValue(Long.parseLong(value)); } addField(longField); break; case TEXT: MetadataField<String> textField = MetadataField.createTextMetadataField(metadataField.getInputID(), Opt.some(metadataField.getOutputID()), metadataField.getLabel(), metadataField.isReadOnly(), metadataField.isRequired(), getCollection(metadataField, listProvidersService), metadataField.getCollectionID(), metadataField.getOrder(), metadataField.getNamespace()); if (StringUtils.isNotBlank(value)) { textField.setValue(value); } addField(textField); break; case TEXT_LONG: MetadataField<String> textLongField = MetadataField.createTextLongMetadataField(metadataField.getInputID(), Opt.some(metadataField.getOutputID()), metadataField.getLabel(), metadataField.isReadOnly(), metadataField.isRequired(), getCollection(metadataField, listProvidersService), metadataField.getCollectionID(), metadataField.getOrder(), metadataField.getNamespace()); if (StringUtils.isNotBlank(value)) { textLongField.setValue(value); } addField(textLongField); break; case START_DATE: if (metadataField.getPattern().isNone() || StringUtils.isBlank(metadataField.getPattern().get())) { throw new IllegalArgumentException("For temporal metadata field " + metadataField.getInputID() + " of type " + metadataField.getType() + " there needs to be a pattern."); } MetadataField<String> startDate = MetadataField.createTemporalStartDateMetadata(metadataField.getInputID(), Opt.some(metadataField.getOutputID()), metadataField.getLabel(), metadataField.isReadOnly(), metadataField.isRequired(), metadataField.getPattern().get(), metadataField.getOrder(), metadataField.getNamespace()); if (StringUtils.isNotBlank(value)) { startDate.setValue(value); } addField(startDate); break; case START_TIME: if (metadataField.getPattern().isNone() || StringUtils.isBlank(metadataField.getPattern().get())) { throw new IllegalArgumentException("For temporal metadata field " + metadataField.getInputID() + " of type " + metadataField.getType() + " there needs to be a pattern."); } MetadataField<String> startTime = MetadataField.createTemporalStartTimeMetadata(metadataField.getInputID(), Opt.some(metadataField.getOutputID()), metadataField.getLabel(), metadataField.isReadOnly(), metadataField.isRequired(), metadataField.getPattern().get(), metadataField.getOrder(), metadataField.getNamespace()); if (StringUtils.isNotBlank(value)) { startTime.setValue(value); } addField(startTime); break; default: throw new IllegalArgumentException("Unknown metadata type! " + metadataField.getType()); } } }