package com.psddev.cms.tool.page; import com.psddev.cms.tool.PageServlet; import com.psddev.cms.tool.ToolPageContext; import com.psddev.dari.db.Query; import com.psddev.dari.db.State; import com.psddev.dari.util.CompactMap; import com.psddev.dari.util.ObjectUtils; import com.psddev.dari.util.RoutingFilter; import com.psddev.dari.util.StorageItem; import javax.servlet.ServletException; import java.io.IOException; import java.util.Map; import java.util.Optional; import java.util.TreeMap; import java.util.UUID; import java.util.stream.Collectors; /** * Displays core image metadata that has been extracted via * <a href="http://www.drewnoakes.com/code/exif/">Metadata Extractor</a>. */ @RoutingFilter.Path(application = "cms", value = ContentMetadata.PATH) public class ContentMetadata extends PageServlet { public static final String PATH = "/contentMetadata"; @Override protected String getPermissionId() { return null; } @Override @SuppressWarnings("unchecked") protected void doService(ToolPageContext page) throws IOException, ServletException { Map<String, Object> metadata; if (page.isFormPost()) { metadata = Optional.ofNullable((Map<String, Object>) ObjectUtils.fromJson(page.param(String.class, "metadata"))) .orElseThrow(() -> new IllegalArgumentException("No metadata found!")); } else { UUID id = page.param(UUID.class, "id"); Object object = Optional.ofNullable(Query.fromAll().where("_id = ?", id).first()) .orElseThrow(() -> new IllegalArgumentException(String.format("No Object found for id [%s]!", id))); String fieldName = page.param(String.class, "fieldName"); StorageItem file = (StorageItem) Optional.ofNullable(State.getInstance(object).get(fieldName)) .orElseThrow(() -> new IllegalArgumentException(String.format("No file found for fieldName [%s]!", fieldName))); metadata = file.getMetadata(); } metadata = new TreeMap<>(metadata.entrySet().stream() .filter(entry -> !entry.getKey().startsWith("cms.")) .collect(Collectors.toMap(entry -> { String key = entry.getKey(); return key.substring(0, 1).toUpperCase() + key.substring(1); }, Map.Entry::getValue))); // Disable remove button. page.writeStart("style", "type", "text/css"); { page.writeCss(".removeButton", "display", "none !important"); } page.writeEnd(); page.writeStart("div", "class", "widget"); { page.writeStart("h1").writeHtml(page.localize(ContentMetadata.class, "title")).writeEnd(); page.writeStart("div", "class", "repeatableForm"); { page.writeStart("ul"); { for (Map.Entry<String, Object> entry : metadata.entrySet()) { writeEntry(page, entry); } } page.writeEnd(); } page.writeEnd(); } page.writeEnd(); } /* * Recursively writes metadata. */ @SuppressWarnings("unchecked") private void writeEntry(ToolPageContext page, Map.Entry<String, Object> entry) throws IOException { String key = entry.getKey(); Object value = entry.getValue(); if (value instanceof CompactMap) { CompactMap valueMap = (CompactMap) value; if (!valueMap.isEmpty()) { page.writeStart("li", "data-type", key); { page.writeStart("div", "class", "objectInputs"); { page.writeStart("div", "class", "repeatableForm"); { page.writeStart("ul"); { for (Object subEntry : valueMap.entrySet()) { writeEntry(page, (Map.Entry) subEntry); } } page.writeEnd(); } page.writeEnd(); } page.writeEnd(); } page.writeEnd(); return; } } else { key += ": " + value; } page.writeStart("li", "data-type", key).writeEnd(); // Disable pointer events. page.writeStart("style", "type", "text/css"); { String labelSelector = "li[data-type=\"" + key + "\"] .repeatableLabel"; page.writeCss(labelSelector, "pointer-events", "none"); page.writeCss(labelSelector + ":after", "content", "none !important"); } page.writeEnd(); } }