This is an automated email from the ASF dual-hosted git repository. dklco pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-app-cms.git
commit 2fa5d3dfd0e7d96134b185f8ced1ee855e6e98ba Author: Dan Klco <[email protected]> AuthorDate: Mon Nov 18 22:50:39 2019 -0500 Removing duplicate code from the File Metadata Extractor --- .../core/internal/FileMetadataExtractorImpl.java | 2 - .../internal/listeners/FileMetadataExtractor.java | 155 --------------------- .../listeners/FileMetadataExtractorListener.java | 51 +++---- 3 files changed, 21 insertions(+), 187 deletions(-) diff --git a/core/src/main/java/org/apache/sling/cms/core/internal/FileMetadataExtractorImpl.java b/core/src/main/java/org/apache/sling/cms/core/internal/FileMetadataExtractorImpl.java index fd0623f..5971438 100644 --- a/core/src/main/java/org/apache/sling/cms/core/internal/FileMetadataExtractorImpl.java +++ b/core/src/main/java/org/apache/sling/cms/core/internal/FileMetadataExtractorImpl.java @@ -111,7 +111,6 @@ public class FileMetadataExtractorImpl implements FileMetadataExtractor { log.warn("Content resource is null"); return; } - Map<String, Object> properties = null; Resource metadata = content.getChild(CMSConstants.NN_METADATA); if (metadata != null) { @@ -151,7 +150,6 @@ public class FileMetadataExtractorImpl implements FileMetadataExtractor { putMetadata(properties, name, md); } return properties; - } private void putMetadata(Map<String, Object> properties, String name, Metadata metadata) { diff --git a/core/src/main/java/org/apache/sling/cms/core/internal/listeners/FileMetadataExtractor.java b/core/src/main/java/org/apache/sling/cms/core/internal/listeners/FileMetadataExtractor.java deleted file mode 100644 index d2b94a6..0000000 --- a/core/src/main/java/org/apache/sling/cms/core/internal/listeners/FileMetadataExtractor.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache 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://www.apache.org/licenses/LICENSE-2.0 - * - * 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.apache.sling.cms.core.internal.listeners; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Calendar; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.jackrabbit.JcrConstants; -import org.apache.jackrabbit.util.Text; -import org.apache.sling.api.resource.LoginException; -import org.apache.sling.api.resource.ModifiableValueMap; -import org.apache.sling.api.resource.Resource; -import org.apache.sling.api.resource.ResourceResolver; -import org.apache.sling.api.resource.ResourceResolverFactory; -import org.apache.sling.api.resource.observation.ExternalResourceChangeListener; -import org.apache.sling.api.resource.observation.ResourceChange; -import org.apache.sling.api.resource.observation.ResourceChangeListener; -import org.apache.sling.cms.File; -import org.apache.tika.exception.TikaException; -import org.apache.tika.metadata.Metadata; -import org.apache.tika.metadata.Property; -import org.apache.tika.parser.AutoDetectParser; -import org.apache.tika.parser.ParseContext; -import org.apache.tika.parser.Parser; -import org.apache.tika.sax.BodyContentHandler; -import org.osgi.service.component.annotations.Component; -import org.osgi.service.component.annotations.Reference; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.xml.sax.SAXException; - -/** - * A Resource Change Listener which extracts the metadata from sling:Files when - * they are uploaded. - */ -@Component(service = { FileMetadataExtractor.class, ResourceChangeListener.class, - ExternalResourceChangeListener.class }, property = { ResourceChangeListener.CHANGES + "=ADDED", - ResourceChangeListener.PATHS + "=/content", - ResourceChangeListener.PATHS + "=/static" }, immediate = true) -public class FileMetadataExtractor implements ResourceChangeListener, ExternalResourceChangeListener { - - public static final String NN_METADATA = "metadata"; - public static final String PN_X_PARSED_BY = "X-Parsed-By"; - - @Reference - private ResourceResolverFactory factory; - - private static final Logger log = LoggerFactory.getLogger(FileMetadataExtractor.class); - - public void extractMetadata(File file) throws IOException, SAXException, TikaException { - extractMetadata(file.getResource()); - } - - public void extractMetadata(Resource resource) throws IOException, SAXException, TikaException { - - log.info("Extracting metadata from {}", resource.getPath()); - ResourceResolver resolver = resource.getResourceResolver(); - InputStream is = resource.adaptTo(InputStream.class); - Resource content = resource.getChild(JcrConstants.JCR_CONTENT); - if (content == null) { - log.warn("Content resource is null"); - return; - } - Map<String, Object> properties = new HashMap<>(); - Resource metadata = content.getChild(NN_METADATA); - if (metadata != null) { - properties = metadata.adaptTo(ModifiableValueMap.class); - } else { - properties.put(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED); - } - if (properties != null) { - Parser parser = new AutoDetectParser(); - BodyContentHandler handler = new BodyContentHandler(); - Metadata md = new Metadata(); - ParseContext context = new ParseContext(); - parser.parse(is, handler, md, context); - for (String name : md.names()) { - updateProperty(properties, name, md); - } - if (metadata == null) { - resolver.create(content, NN_METADATA, properties); - } - resolver.commit(); - log.info("Metadata extracted from {}", resource.getPath()); - } else { - log.warn("Failed to update metadata for {}", resource.getPath()); - } - - } - - private void updateProperty(Map<String, Object> properties, String name, Metadata metadata) { - log.trace("Updating property: {}", name); - String filtered = Text.escapeIllegalJcrChars(name); - Property property = Property.get(name); - if (property != null) { - if (metadata.isMultiValued(property)) { - properties.put(filtered, metadata.getValues(property)); - } else if (metadata.getDate(property) != null) { - Calendar cal = Calendar.getInstance(); - cal.setTime(metadata.getDate(property)); - properties.put(filtered, cal); - } else if (metadata.getInt(property) != null) { - properties.put(filtered, metadata.getInt(property)); - } else { - properties.put(filtered, metadata.get(property)); - } - } else { - properties.put(filtered, metadata.get(name)); - } - } - - @Override - public void onChange(List<ResourceChange> changes) { - Map<String, Object> serviceParams = new HashMap<>(); - serviceParams.put(ResourceResolverFactory.SUBSERVICE, "sling-cms-metadata"); - ResourceResolver serviceResolver = null; - try { - serviceResolver = factory.getServiceResourceResolver(serviceParams); - for (ResourceChange rc : changes) { - Resource changed = serviceResolver.getResource(rc.getPath()); - try { - extractMetadata(changed); - } catch (Throwable t) { - log.warn("Failed to extract metadata due to exception", t); - } - } - } catch (LoginException e) { - log.error("Exception getting service user", e); - } finally { - if (serviceResolver != null) { - serviceResolver.close(); - } - } - - } - -} diff --git a/core/src/main/java/org/apache/sling/cms/core/internal/listeners/FileMetadataExtractorListener.java b/core/src/main/java/org/apache/sling/cms/core/internal/listeners/FileMetadataExtractorListener.java index 008c81f..7d78b3b 100644 --- a/core/src/main/java/org/apache/sling/cms/core/internal/listeners/FileMetadataExtractorListener.java +++ b/core/src/main/java/org/apache/sling/cms/core/internal/listeners/FileMetadataExtractorListener.java @@ -16,18 +16,17 @@ */ package org.apache.sling.cms.core.internal.listeners; -import java.io.IOException; -import java.util.HashMap; +import java.util.Collections; import java.util.List; -import java.util.Map; -import java.util.Optional; import org.apache.sling.api.resource.LoginException; +import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ResourceResolverFactory; import org.apache.sling.api.resource.observation.ExternalResourceChangeListener; import org.apache.sling.api.resource.observation.ResourceChange; import org.apache.sling.api.resource.observation.ResourceChangeListener; +import org.apache.sling.cms.CMSConstants; import org.apache.sling.cms.File; import org.apache.sling.cms.FileMetadataExtractor; import org.osgi.service.component.annotations.Component; @@ -45,45 +44,37 @@ import org.slf4j.LoggerFactory; ResourceChangeListener.PATHS + "=/static" }, immediate = true) public class FileMetadataExtractorListener implements ResourceChangeListener, ExternalResourceChangeListener { + private static final Logger log = LoggerFactory.getLogger(FileMetadataExtractorListener.class); + @Reference private FileMetadataExtractor extractor; @Reference private ResourceResolverFactory factory; - private static final Logger log = LoggerFactory.getLogger(FileMetadataExtractorListener.class); + private void handleChange(Resource changed) { + if (CMSConstants.NT_FILE.equals(changed.getResourceType())) { + log.debug("Extracting metadata from changed resource: {}", changed); + try { + extractor.updateMetadata(changed.adaptTo(File.class), true); + } catch (Exception e) { + log.warn("Failed to extract metadata from change: {}", changed, e); + } + } else { + log.trace("Not extracting metadata from changed resource: {}", changed); + } + } @Override public void onChange(List<ResourceChange> changes) { - Map<String, Object> serviceParams = new HashMap<>(); - serviceParams.put(ResourceResolverFactory.SUBSERVICE, "sling-cms-metadata"); - ResourceResolver serviceResolver = null; - try { - serviceResolver = factory.getServiceResourceResolver(serviceParams); + try (ResourceResolver serviceResolver = factory.getServiceResourceResolver( + Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, "sling-cms-metadata"))) { for (ResourceChange rc : changes) { - handleChange(serviceResolver, rc); + Resource changed = serviceResolver.getResource(rc.getPath()); + handleChange(changed); } } catch (LoginException e) { log.error("Exception getting service user", e); - } finally { - if (serviceResolver != null) { - serviceResolver.close(); - } - } - - } - - private void handleChange(ResourceResolver serviceResolver, ResourceChange rc) { - File changed = Optional.ofNullable(serviceResolver.getResource(rc.getPath())).map(r -> r.adaptTo(File.class)) - .orElse(null); - try { - if (changed != null) { - extractor.updateMetadata(changed); - } else { - log.warn("Failed to get File from: {}", rc.getPath()); - } - } catch (IOException t) { - log.warn("Failed to extract metadata due to exception", t); } }
