/*
* #%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.workflow.bulk.removal.impl.servlets;
import com.adobe.acs.commons.workflow.bulk.removal.WorkflowInstanceRemover;
import com.adobe.acs.commons.workflow.bulk.removal.WorkflowRemovalForceQuitException;
import org.apache.commons.lang.StringUtils;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.sling.SlingServlet;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.commons.json.JSONArray;
import org.apache.sling.commons.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.ServletException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.regex.Pattern;
/**
* ACS AEM Commons - Workflow Instance Remover - Remove Servlet
*/
@SuppressWarnings("serial")
@SlingServlet(
methods = { "POST" },
resourceTypes = { "acs-commons/components/utilities/workflow-remover" },
selectors = { "remove" },
extensions = { "json" }
)
public class RemoveServlet extends SlingAllMethodsServlet {
private static final Logger log = LoggerFactory.getLogger(RemoveServlet.class);
private static final String PARAM_BATCH_SIZE = "batchSize";
private static final String PARAM_WORKFLOW_STATUSES = "statuses";
private static final String PARAM_WORKFLOW_MODELS = "models";
private static final String PARAM_WORKFLOW_PAYLOADS = "payloads";
private static final String PARAM_OLDER_THAN = "olderThan";
private static final String PARAM_MAX_DURATION = "maxDuration";
private static final int MS_IN_SECOND = 1000;
private static final int DEFAULT_BATCH_SIZE = 1000;
private static final int DEFAULT_MAX_DURATION = 0;
@Reference
private WorkflowInstanceRemover workflowInstanceRemover;
@Override
public final void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response)
throws ServletException, IOException {
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
List<String> statuses = new ArrayList<String>();
List<String> models = new ArrayList<String>();
List<Pattern> payloads = new ArrayList<Pattern>();
Calendar olderThan = null;
try {
JSONObject params = new JSONObject(request.getParameter("params"));
JSONArray jsonArray = params.optJSONArray(PARAM_WORKFLOW_STATUSES);
for (int i = 0; i < jsonArray.length(); i++) {
statuses.add(jsonArray.getString(i));
}
jsonArray = params.optJSONArray(PARAM_WORKFLOW_MODELS);
for (int i = 0; i < jsonArray.length(); i++) {
models.add(jsonArray.getString(i));
}
jsonArray = params.optJSONArray(PARAM_WORKFLOW_PAYLOADS);
for (int i = 0; i < jsonArray.length(); i++) {
final JSONObject tmp = jsonArray.getJSONObject(i);
final String pattern = tmp.optString("pattern");
if (StringUtils.isNotBlank(pattern)) {
payloads.add(Pattern.compile(pattern));
}
}
final Long ts = params.optLong(PARAM_OLDER_THAN);
if (ts != null && ts > 0) {
olderThan = Calendar.getInstance();
olderThan.setTimeInMillis(ts * MS_IN_SECOND);
}
int batchSize = params.optInt(PARAM_BATCH_SIZE);
if (batchSize < 1) {
batchSize = DEFAULT_BATCH_SIZE;
}
int maxDuration = params.optInt(PARAM_MAX_DURATION);
if (maxDuration < 1) {
maxDuration = DEFAULT_MAX_DURATION;
}
workflowInstanceRemover.removeWorkflowInstances(request.getResourceResolver(),
models,
statuses,
payloads,
olderThan,
batchSize,
maxDuration);
} catch (WorkflowRemovalForceQuitException e) {
response.setStatus(599);
response.getWriter().write("Workflow removal force quit");
} catch (Exception e) {
log.error("An error occurred while attempting to remove workflow instances.", e);
response.setStatus(SlingHttpServletResponse.SC_INTERNAL_SERVER_ERROR);
if (response.getWriter() != null) {
response.getWriter().write(e.getMessage());
}
}
}
}