/*
* #%L
* ACS AEM Commons Bundle
* %%
* Copyright (C) 2015 Adobe
* %%
* Licensed 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.
* #L%
*/
package com.adobe.acs.commons.analysis.jcrchecksum.impl.options;
import aQute.bnd.annotation.ProviderType;
import org.apache.commons.lang.StringUtils;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.request.RequestParameter;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
@ProviderType
public class RequestChecksumGeneratorOptions extends AbstractChecksumGeneratorOptions {
private static final Logger log = LoggerFactory.getLogger(RequestChecksumGeneratorOptions.class);
public RequestChecksumGeneratorOptions(SlingHttpServletRequest request) throws IOException {
this.addIncludedNodeTypes(request.getParameterValues(NODES_TYPES));
this.addExcludedNodeTypes(request.getParameterValues(NODE_TYPE_EXCLUDES));
this.addExcludedProperties(request.getParameterValues(PROPERTY_EXCLUDES));
this.addSortedProperties(request.getParameterValues(SORTED_PROPERTIES));
}
public static Set<String> getPaths(SlingHttpServletRequest request) throws IOException {
Set<String> paths = new HashSet<String>();
// Add Paths
if (request.getParameterValues(PATHS) != null) {
String[] pathArr = request.getParameterValues(PATHS);
for (String path : pathArr) {
if (path.length() > 0) {
paths.add(path);
}
}
}
paths.addAll(getPathsFromQuery(request.getResourceResolver(),
request.getParameter(QUERY_TYPE),
request.getParameter(QUERY)));
RequestParameter data = request.getRequestParameter(DATA);
if (data != null && data.getInputStream() != null) {
paths.addAll(getPathsFromInputstream(data.getInputStream(), request.getCharacterEncoding()));
}
return paths;
}
private static Set<String> getPathsFromQuery(ResourceResolver resourceResolver, String language, String query) {
if (StringUtils.isBlank(query)) {
return Collections.EMPTY_SET;
}
Set<String> paths = new HashSet<String>();
language = StringUtils.defaultIfEmpty(language, "xpath");
Iterator<Resource> resources = resourceResolver.findResources(query, language);
while (resources.hasNext()) {
paths.add(resources.next().getPath());
}
return paths;
}
private static Set<String> getPathsFromInputstream(InputStream is, String encoding) throws IOException {
if (is == null) {
return Collections.EMPTY_SET;
}
Set<String> paths = new HashSet<String>();
encoding = (encoding != null) ? encoding : Charset.defaultCharset().name();
BufferedReader br = new BufferedReader(new InputStreamReader(is, encoding));
try {
String path;
while ((path = br.readLine()) != null) {
paths.add(path);
}
} finally {
if (br != null) {
br.close();
}
}
return paths;
}
private static List<String> asList(String[] arr) {
if (arr == null) {
return Collections.EMPTY_LIST;
} else {
return Arrays.asList(arr);
}
}
}