Adding a new model and restore operation to support the needs from Sling
CMS
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 @@
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 @@
* @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 @@
* @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 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 @@
}
@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%
rename from src/main/java/org/apache/sling/fileoptim/impl/FileOptimizerOperation.java
rename 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 @@
* 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%
copy from src/main/java/org/apache/sling/fileoptim/impl/FileOptimizerOperation.java
copy 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.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.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 @@
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 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 @@
@Named(PN_ORIGINAL)
@Inject
InputStream getOriginal();
+
+ @Named(PN_SAVINGS)
+ @Inject
+ double getSavings();
+
}