/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE file at the root of the source * tree and available online at * * https://github.com/keeps/roda */ package org.roda.core.common; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.commons.io.IOUtils; import org.apache.commons.net.util.Base64; import org.roda.core.RodaCoreFactory; import org.roda.core.data.common.RodaConstants; import org.roda.core.data.exceptions.AuthorizationDeniedException; import org.roda.core.data.exceptions.GenericException; import org.roda.core.data.exceptions.NotFoundException; import org.roda.core.data.exceptions.RequestNotValidException; import org.roda.core.data.v2.index.filter.Filter; import org.roda.core.data.v2.index.filter.OneOfManyFilterParameter; import org.roda.core.data.v2.index.sublist.Sublist; import org.roda.core.data.v2.ip.AIP; import org.roda.core.data.v2.ip.IndexedAIP; import org.roda.core.data.v2.ip.metadata.DescriptiveMetadata; import org.roda.core.data.v2.user.User; import org.roda.core.index.IndexService; import org.roda.core.index.utils.IterableIndexResult; import org.roda.core.model.ModelService; import org.roda.core.storage.Binary; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; public class ClassificationPlanUtils { private ClassificationPlanUtils() { // do nothing } public static ConsumesOutputStream retrieveClassificationPlan(User user, String filename) throws RequestNotValidException, NotFoundException, GenericException, AuthorizationDeniedException { try { JsonFactory factory = new JsonFactory(); ObjectMapper mapper = new ObjectMapper(factory); ObjectNode root = mapper.createObjectNode(); ArrayNode array = mapper.createArrayNode(); List<String> descriptionsLevels = RodaUtils .copyList(RodaCoreFactory.getRodaConfiguration().getList(RodaConstants.LEVELS_CLASSIFICATION_PLAN)); Filter allButRepresentationsFilter = new Filter( new OneOfManyFilterParameter(RodaConstants.AIP_LEVEL, descriptionsLevels)); IndexService index = RodaCoreFactory.getIndexService(); boolean justActive = true; IterableIndexResult<IndexedAIP> res = index.findAll(IndexedAIP.class, allButRepresentationsFilter, null, Sublist.ALL, user, justActive, new ArrayList<>()); Iterator<IndexedAIP> it = res.iterator(); while (it.hasNext()) { array.add(aipToJSON(it.next())); } root.set("dos", array); return new ConsumesOutputStream() { @Override public void consumeOutputStream(OutputStream out) throws IOException { try { mapper.writeValue(out, root); } catch (IOException e) { throw e; } finally { IOUtils.closeQuietly(out); } } @Override public String getFileName() { return filename; } @Override public String getMediaType() { return RodaConstants.MEDIA_TYPE_APPLICATION_JSON; } }; } catch (IOException e) { throw new GenericException(e); } } public static ObjectNode aipToJSON(IndexedAIP indexedAIP) throws IOException, RequestNotValidException, NotFoundException, GenericException, AuthorizationDeniedException { JsonFactory factory = new JsonFactory(); ObjectMapper mapper = new ObjectMapper(factory); ModelService model = RodaCoreFactory.getModelService(); ObjectNode node = mapper.createObjectNode(); if (indexedAIP.getTitle() != null) { node = node.put("title", indexedAIP.getTitle()); } if (indexedAIP.getId() != null) { node = node.put("id", indexedAIP.getId()); } if (indexedAIP.getParentID() != null) { node = node.put("parentId", indexedAIP.getParentID()); } if (indexedAIP.getLevel() != null) { node = node.put("descriptionlevel", indexedAIP.getLevel()); } AIP modelAIP = model.retrieveAIP(indexedAIP.getId()); if (modelAIP.getType() != null) { node = node.put("type", modelAIP.getType()); } if (modelAIP != null) { List<DescriptiveMetadata> descriptiveMetadata = modelAIP.getDescriptiveMetadata(); if (descriptiveMetadata != null && !descriptiveMetadata.isEmpty()) { ArrayNode metadata = mapper.createArrayNode(); for (DescriptiveMetadata dm : descriptiveMetadata) { ObjectNode dmNode = mapper.createObjectNode(); if (dm.getId() != null) { dmNode = dmNode.put("id", dm.getId()); } if (dm.getType() != null) { dmNode = dmNode.put("metadataType", dm.getType()); } if (dm.getVersion() != null) { dmNode = dmNode.put("metadataVersion", dm.getVersion()); } Binary b = model.retrieveDescriptiveMetadataBinary(modelAIP.getId(), dm.getId()); InputStream is = b.getContent().createInputStream(); dmNode = dmNode.put("content", new String(Base64.encodeBase64(IOUtils.toByteArray(is)))); IOUtils.closeQuietly(is); dmNode = dmNode.put("contentEncoding", "Base64"); metadata = metadata.add(dmNode); } node.set("metadata", metadata); } } return node; } }