You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by dk...@apache.org on 2018/07/03 16:44:49 UTC

[sling-org-apache-sling-file-optimization] 02/08: Adding a new model and restore operation to support the needs from Sling CMS

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-file-optimization.git

commit 92100d1a845791fa4412b2bded11987d09b5f938
Author: Dan Klco <dk...@apache.org>
AuthorDate: Thu May 31 08:00:50 2018 -0400

    Adding a new model and restore operation to support the needs from Sling
    CMS
---
 .../sling/fileoptim/FileOptimizerService.java      | 14 +++-
 .../fileoptim/impl/FileOptimizerServiceImpl.java   | 19 ++++++
 ...erOperation.java => OptimizeFileOperation.java} |  6 +-
 ...peration.java => RestoreOriginalOperation.java} | 24 +++++--
 .../sling/fileoptim/models/OptimizeResource.java   | 76 ++++++++++++++++++++++
 .../sling/fileoptim/models/OptimizedFile.java      |  9 +++
 6 files changed, 137 insertions(+), 11 deletions(-)

diff --git a/src/main/java/org/apache/sling/fileoptim/FileOptimizerService.java b/src/main/java/org/apache/sling/fileoptim/FileOptimizerService.java
index 6d88fbc..c63b43a 100644
--- a/src/main/java/org/apache/sling/fileoptim/FileOptimizerService.java
+++ b/src/main/java/org/apache/sling/fileoptim/FileOptimizerService.java
@@ -40,6 +40,16 @@ public interface FileOptimizerService {
 	boolean canOptimize(Resource fileResource);
 
 	/**
+	 * Returns true if the specified resource has already been optimized by the
+	 * FileOptimizer.
+	 * 
+	 * @param fileResource
+	 *            the resource to check
+	 * @return true if optimized by the file optimizer, false otherwise
+	 */
+	boolean isOptimized(Resource fileResource);
+
+	/**
 	 * Optimizes a file resource.
 	 * 
 	 * @param fileResource
@@ -50,7 +60,7 @@ public interface FileOptimizerService {
 	 * @return the results of the optimization
 	 * @throws PersistenceException
 	 *             an exception occurs saving the optimized resource
-	 * @throws IOException 
+	 * @throws IOException
 	 *             an exception occurs reading the original resource
 	 */
 	OptimizationResult optimizeFile(Resource fileResource, boolean autoCommit) throws PersistenceException, IOException;
@@ -66,7 +76,7 @@ public interface FileOptimizerService {
 	 * @return the results of the optimization
 	 * @throws PersistenceException
 	 *             an exception occurs saving the optimized resources
-	 * @throws IOException 
+	 * @throws IOException
 	 *             an exception occurs reading the original resources
 	 */
 	Map<String, OptimizationResult> optimizeFiles(Collection<Resource> fileResources, boolean autoCommit)
diff --git a/src/main/java/org/apache/sling/fileoptim/impl/FileOptimizerServiceImpl.java b/src/main/java/org/apache/sling/fileoptim/impl/FileOptimizerServiceImpl.java
index 1483e4e..a1a7807 100644
--- a/src/main/java/org/apache/sling/fileoptim/impl/FileOptimizerServiceImpl.java
+++ b/src/main/java/org/apache/sling/fileoptim/impl/FileOptimizerServiceImpl.java
@@ -32,6 +32,7 @@ import java.util.Set;
 
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.ObjectUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.sling.api.resource.ModifiableValueMap;
@@ -132,6 +133,24 @@ public class FileOptimizerServiceImpl implements FileOptimizerService, ServiceLi
 	}
 
 	@Override
+	public boolean isOptimized(Resource fileResource) {
+
+		if (!fileResource.getName().equals(JcrConstants.JCR_CONTENT)) {
+			fileResource = fileResource.getChild(JcrConstants.JCR_CONTENT);
+		}
+
+		OptimizedFile of = fileResource.adaptTo(OptimizedFile.class);
+		try {
+			String calculatedHash = calculateHash(IOUtils.toByteArray(of.getContent()));
+			log.debug("Comparing stored {} and calculated {} hashes", of.getHash(), calculatedHash);
+			return ObjectUtils.equals(of.getHash(), calculatedHash);
+		} catch (IOException e) {
+			log.error("Exception checking if file optimized, assuming false", e);
+			return false;
+		}
+	}
+
+	@Override
 	public OptimizationResult optimizeFile(Resource fileResource, boolean autoCommit) throws IOException {
 
 		if (!fileResource.getName().equals(JcrConstants.JCR_CONTENT)) {
diff --git a/src/main/java/org/apache/sling/fileoptim/impl/FileOptimizerOperation.java b/src/main/java/org/apache/sling/fileoptim/impl/OptimizeFileOperation.java
similarity index 94%
copy from src/main/java/org/apache/sling/fileoptim/impl/FileOptimizerOperation.java
copy to src/main/java/org/apache/sling/fileoptim/impl/OptimizeFileOperation.java
index 5b47fb4..89539a4 100644
--- a/src/main/java/org/apache/sling/fileoptim/impl/FileOptimizerOperation.java
+++ b/src/main/java/org/apache/sling/fileoptim/impl/OptimizeFileOperation.java
@@ -40,10 +40,10 @@ import org.slf4j.LoggerFactory;
  * The File Optimization operation will optimize a file
  */
 @Component(immediate = true, service = { PostOperation.class }, property = PostOperation.PROP_OPERATION_NAME
-		+ "=fileoptim")
-public class FileOptimizerOperation implements PostOperation {
+		+ "=fileoptim:optimize")
+public class OptimizeFileOperation implements PostOperation {
 
-	private static final Logger log = LoggerFactory.getLogger(FileOptimizerOperation.class);
+	private static final Logger log = LoggerFactory.getLogger(OptimizeFileOperation.class);
 
 	@Reference
 	private FileOptimizerService fileOptimizer;
diff --git a/src/main/java/org/apache/sling/fileoptim/impl/FileOptimizerOperation.java b/src/main/java/org/apache/sling/fileoptim/impl/RestoreOriginalOperation.java
similarity index 78%
rename from src/main/java/org/apache/sling/fileoptim/impl/FileOptimizerOperation.java
rename to src/main/java/org/apache/sling/fileoptim/impl/RestoreOriginalOperation.java
index 5b47fb4..638f821 100644
--- a/src/main/java/org/apache/sling/fileoptim/impl/FileOptimizerOperation.java
+++ b/src/main/java/org/apache/sling/fileoptim/impl/RestoreOriginalOperation.java
@@ -17,6 +17,7 @@
 package org.apache.sling.fileoptim.impl;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -24,9 +25,12 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.jackrabbit.JcrConstants;
 import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.resource.ModifiableValueMap;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.fileoptim.FileOptimizerService;
+import org.apache.sling.fileoptim.models.OptimizedFile;
 import org.apache.sling.servlets.post.Modification;
 import org.apache.sling.servlets.post.PostOperation;
 import org.apache.sling.servlets.post.PostResponse;
@@ -37,13 +41,13 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * The File Optimization operation will optimize a file
+ * The File Optimization operation restore the original file
  */
 @Component(immediate = true, service = { PostOperation.class }, property = PostOperation.PROP_OPERATION_NAME
-		+ "=fileoptim")
-public class FileOptimizerOperation implements PostOperation {
+		+ "=fileoptim:restore")
+public class RestoreOriginalOperation implements PostOperation {
 
-	private static final Logger log = LoggerFactory.getLogger(FileOptimizerOperation.class);
+	private static final Logger log = LoggerFactory.getLogger(RestoreOriginalOperation.class);
 
 	@Reference
 	private FileOptimizerService fileOptimizer;
@@ -51,8 +55,16 @@ public class FileOptimizerOperation implements PostOperation {
 	protected void doRun(SlingHttpServletRequest request, PostResponse response, List<Modification> changes)
 			throws IOException {
 		Resource resource = request.getResource();
-		if (fileOptimizer.canOptimize(resource)) {
-			fileOptimizer.optimizeFile(resource, true);
+		if (fileOptimizer.isOptimized(resource)) {
+			ModifiableValueMap mvm = resource.getChild(JcrConstants.JCR_CONTENT).adaptTo(ModifiableValueMap.class);
+			mvm.put(JcrConstants.JCR_DATA, mvm.get(OptimizedFile.PN_ORIGINAL, InputStream.class));
+			mvm.remove(OptimizedFile.PN_ORIGINAL);
+			mvm.remove(OptimizedFile.PN_ALGORITHM);
+			mvm.remove(OptimizedFile.PN_HASH);
+			mvm.remove(OptimizedFile.PN_SAVINGS);
+			
+			resource.getResourceResolver().commit();
+			
 			changes.add(Modification.onModified(resource.getPath()));
 		}
 	}
diff --git a/src/main/java/org/apache/sling/fileoptim/models/OptimizeResource.java b/src/main/java/org/apache/sling/fileoptim/models/OptimizeResource.java
new file mode 100644
index 0000000..2960d1a
--- /dev/null
+++ b/src/main/java/org/apache/sling/fileoptim/models/OptimizeResource.java
@@ -0,0 +1,76 @@
+/*
+ * 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.fileoptim.models;
+
+import java.io.IOException;
+
+import javax.annotation.PostConstruct;
+
+import org.apache.sling.api.resource.PersistenceException;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.fileoptim.FileOptimizerService;
+import org.apache.sling.fileoptim.OptimizationResult;
+import org.apache.sling.models.annotations.Model;
+import org.apache.sling.models.annotations.injectorspecific.OSGiService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Sling model for executing the optimizer, will not commit the result
+ */
+@Model(adaptables = Resource.class)
+public class OptimizeResource {
+
+	private static final Logger log = LoggerFactory.getLogger(OptimizeResource.class);
+
+	private boolean canOptimize;
+
+	@OSGiService
+	private FileOptimizerService fileOptimizer;
+
+	private OptimizationResult result;
+
+	private Resource resource;
+
+	public OptimizeResource(Resource resource) {
+		this.resource = resource;
+	}
+
+	@PostConstruct
+	public void init() throws PersistenceException, IOException {
+		log.debug("initializing with resource {}", resource);
+		if (fileOptimizer.canOptimize(resource)) {
+			this.canOptimize = true;
+			this.result = fileOptimizer.optimizeFile(resource, false);
+		} else {
+			this.canOptimize = false;
+			this.result = null;
+		}
+	}
+
+	public boolean isOptimized() {
+		return fileOptimizer.isOptimized(resource);
+	}
+
+	public OptimizationResult getResult() {
+		return result;
+	}
+
+	public boolean isCanOptimize() {
+		return canOptimize;
+	}
+}
diff --git a/src/main/java/org/apache/sling/fileoptim/models/OptimizedFile.java b/src/main/java/org/apache/sling/fileoptim/models/OptimizedFile.java
index e531a56..12a0e66 100644
--- a/src/main/java/org/apache/sling/fileoptim/models/OptimizedFile.java
+++ b/src/main/java/org/apache/sling/fileoptim/models/OptimizedFile.java
@@ -40,6 +40,10 @@ public interface OptimizedFile {
 	public static final String PN_ORIGINAL = PREFIX + "original";
 	public static final String PN_SAVINGS = PREFIX + "savings";
 
+	@Named(PN_ALGORITHM)
+	@Inject
+	String getAlgorithm();
+
 	@Named(JcrConstants.JCR_DATA)
 	@Inject
 	@Required
@@ -57,4 +61,9 @@ public interface OptimizedFile {
 	@Named(PN_ORIGINAL)
 	@Inject
 	InputStream getOriginal();
+
+	@Named(PN_SAVINGS)
+	@Inject
+	double getSavings();
+
 }