package com.constellio.model.services.records.extractions; import com.constellio.model.entities.records.Content; import com.constellio.model.entities.records.ParsedContent; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.entities.schemas.MetadataSchema; import com.constellio.model.entities.schemas.MetadataValueType; import com.google.common.cache.LoadingCache; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.xml.bind.annotation.XmlRootElement; import java.util.Collection; import java.util.Collections; import java.util.List; /** * @author Majid */ @XmlRootElement public class MetadataToText implements ExtractorSupplier<String> { public static boolean LOG_CONTENT_MISSING = true; private static final Logger LOGGER = LoggerFactory.getLogger(MetadataToText.class); private LoadingCache<String, ParsedContent> cachedParsedContentProvider; private Metadata inputMetadata; private String metadataCode; public MetadataToText(String metadataCode) { this.metadataCode = metadataCode; } public MetadataToText() { } public String getMetadataCode() { return metadataCode; } public void setMetadataCode(String metadataCode) { this.metadataCode = metadataCode; } @Override public void init(LoadingCache<String, ParsedContent> cachedParsedContentProvider, MetadataSchema schema) { this.cachedParsedContentProvider = cachedParsedContentProvider; this.inputMetadata = schema.get(metadataCode); } @Override public Collection<String> getFeeds(Record record) { List<String> res = Collections.emptyList(); if (inputMetadata.isMultivalue()) { res = record.getList(inputMetadata); } else { Object value = record.get(inputMetadata); if (value != null) { if (inputMetadata.getType().equals(MetadataValueType.CONTENT)) { Content content = (Content) value; try { ParsedContent parsedContent = cachedParsedContentProvider.get(content.getCurrentVersion().getHash()); res = Collections.singletonList(parsedContent.getParsedContent()); } catch (Exception e) { if (LOG_CONTENT_MISSING) { LOGGER.error("No content " + content.getCurrentVersion().getHash()); } } } else if (inputMetadata.getType().isStringOrText()) { res = Collections.singletonList((String) value); } } } return res; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (obj == this) { return true; } if (obj.getClass() != getClass()) { return false; } MetadataToText rhs = (MetadataToText) obj; return new EqualsBuilder() .append(metadataCode, rhs.metadataCode) .isEquals(); } @Override public String toString() { return ToStringBuilder.reflectionToString(this); } }