/*
* #%L
* ACS AEM Commons Bundle
* %%
* Copyright (C) 2016 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.synthetic.impl.cq;
import com.adobe.acs.commons.workflow.synthetic.impl.SyntheticWorkflowData;
import com.adobe.acs.commons.workflow.synthetic.impl.SyntheticWorkflowRunnerImpl;
import com.adobe.acs.commons.workflow.synthetic.impl.cq.exceptions.SyntheticCompleteWorkflowException;
import com.adobe.acs.commons.workflow.synthetic.impl.cq.exceptions.SyntheticRestartWorkflowException;
import com.adobe.acs.commons.workflow.synthetic.impl.cq.exceptions.SyntheticTerminateWorkflowException;
import com.day.cq.workflow.WorkflowException;
import com.day.cq.workflow.WorkflowService;
import com.day.cq.workflow.WorkflowSession;
import com.day.cq.workflow.collection.util.ResultSet;
import com.day.cq.workflow.exec.HistoryItem;
import com.day.cq.workflow.exec.Route;
import com.day.cq.workflow.exec.WorkItem;
import com.day.cq.workflow.exec.Workflow;
import com.day.cq.workflow.exec.WorkflowData;
import com.day.cq.workflow.exec.filter.WorkItemFilter;
import com.day.cq.workflow.model.WorkflowModel;
import com.day.cq.workflow.model.WorkflowModelFilter;
import org.apache.jackrabbit.api.JackrabbitSession;
import org.apache.jackrabbit.api.security.user.UserManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.version.VersionException;
import java.security.AccessControlException;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.List;
import java.util.Map;
public class SyntheticWorkflowSession implements WorkflowSession {
private static final Logger log = LoggerFactory.getLogger(SyntheticWorkflowSession.class);
private static final String UNSUPPORTED_OPERATION_MESSAGE = "Operation not supported by Synthetic Workflow";
private final Session session;
private final SyntheticWorkflowRunnerImpl workflowService;
private final List<Route> routes;
private final List<Route> backRoutes;
public SyntheticWorkflowSession(SyntheticWorkflowRunnerImpl workflowService, Session session) {
this.workflowService = workflowService;
this.session = session;
this.routes = new ArrayList<Route>();
this.routes.add(new SyntheticRoute(false));
this.backRoutes = new ArrayList<Route>();
this.backRoutes.add(new SyntheticRoute(true));
}
@Override
public final WorkflowService getWorkflowService() {
return this.workflowService;
}
@Override
public final Session getSession() {
return this.session;
}
@Override
public org.apache.jackrabbit.api.security.user.Authorizable getUser() {
if (this.session != null && this.session instanceof JackrabbitSession) {
try {
UserManager userManager = ((JackrabbitSession) this.session).getUserManager();
return userManager.getAuthorizable(this.session.getUserID());
} catch (RepositoryException e) {
log.error("Could not obtain a Jackrabbit UserManager", e);
}
}
return null;
}
@Override
public final void terminateWorkflow(final Workflow workflow) throws WorkflowException {
if (workflow instanceof SyntheticWorkflow) {
throw new SyntheticTerminateWorkflowException("Synthetic workflow [ " + workflow.getId() + " ] terminated");
} else {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
}
@Override
public final void complete(final WorkItem workItem, final Route route) throws WorkflowException {
if (workItem instanceof SyntheticWorkItem) {
throw new SyntheticCompleteWorkflowException("Synthetic workflow [ "
+ workItem.getWorkflow().getId() + " : " + workItem.getId() + " ] completed");
} else {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
}
@Override
public final void restartWorkflow(final Workflow workflow) throws WorkflowException {
if (workflow instanceof SyntheticWorkflow) {
throw new SyntheticRestartWorkflowException("Synthetic workflow [ " + workflow.getId() + " ] restarted");
} else {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
}
@Override
public final boolean isSuperuser() {
return true;
}
@Override
public final boolean evaluate(final WorkflowData workflowData, final String s) {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final void deployModel(final WorkflowModel workflowModel) throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final WorkflowModel createNewModel(final String s) throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final WorkflowModel createNewModel(final String s, final String s2) throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final void deleteModel(final String s) throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final WorkflowModel[] getModels() throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final WorkflowModel[] getModels(final WorkflowModelFilter workflowModelFilter) throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final ResultSet<WorkflowModel> getModels(final long l, final long l2) throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final ResultSet<WorkflowModel> getModels(final long l, final long l2,
final WorkflowModelFilter workflowModelFilter)
throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final WorkflowModel getModel(final String modelId) throws WorkflowException {
final WorkflowSession workflowSession =
this.workflowService.getAEMWorkflowService().getWorkflowSession(this.session);
return workflowSession.getModel(modelId);
}
@Override
public final WorkflowModel getModel(final String s, final String s2) throws WorkflowException, VersionException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final Workflow startWorkflow(final WorkflowModel workflowModel, final WorkflowData workflowData)
throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Deprecated
@Override
public final Workflow startWorkflow(final WorkflowModel workflowModel, final WorkflowData workflowData,
final Dictionary<String, String> stringStringDictionary)
throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final Workflow startWorkflow(final WorkflowModel workflowModel, final WorkflowData workflowData,
final Map<String, Object> stringObjectMap) throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final void resumeWorkflow(final Workflow workflow) throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final void suspendWorkflow(final Workflow workflow) throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final WorkItem[] getActiveWorkItems() throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final ResultSet<WorkItem> getActiveWorkItems(final long l, final long l2) throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final ResultSet<WorkItem> getActiveWorkItems(final long l, final long l2,
final WorkItemFilter workItemFilter)
throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final WorkItem[] getAllWorkItems() throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final ResultSet<WorkItem> getAllWorkItems(final long l, final long l2) throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final WorkItem getWorkItem(final String s) throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final Workflow[] getWorkflows(final String[] strings) throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final ResultSet<Workflow> getWorkflows(final String[] strings, final long l, final long l2)
throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final Workflow[] getAllWorkflows() throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final Workflow getWorkflow(final String s) throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final List<Route> getRoutes(final WorkItem workItem) throws WorkflowException {
log.debug("Synthetic Workflow does not support routes; Defaults to a single Synthetic Route");
return this.routes;
}
@Override
public final List<Route> getRoutes(final WorkItem workItem, final boolean b) throws WorkflowException {
log.debug("Synthetic Workflow does not support routes; Defaults to a single Synthetic Route");
return this.routes;
}
@Override
public final List<Route> getBackRoutes(final WorkItem workItem) throws WorkflowException {
log.debug("Synthetic Workflow does not support back routes; Defaults to a single Synthetic Route");
return this.backRoutes;
}
@Override
public final List<Route> getBackRoutes(final WorkItem workItem, final boolean b) throws WorkflowException {
log.debug("Synthetic Workflow does not back support routes; Defaults to a single Synthetic Route");
return this.backRoutes;
}
@Override
public final WorkflowData newWorkflowData(final String payloadType, final Object payload) {
return new SyntheticWorkflowData(payloadType, payload);
}
@Override
public List<org.apache.jackrabbit.api.security.user.Authorizable> getDelegatees(WorkItem item) throws WorkflowException {
return new ArrayList<org.apache.jackrabbit.api.security.user.Authorizable>();
}
@Override
public void delegateWorkItem(WorkItem item, org.apache.jackrabbit.api.security.user.Authorizable participant) throws WorkflowException, AccessControlException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final List<HistoryItem> getHistory(final Workflow workflow) throws WorkflowException {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
@Override
public final void updateWorkflowData(final Workflow workflow, final WorkflowData workflowData) {
if (workflow instanceof SyntheticWorkflow) {
final SyntheticWorkflow syntheticWorkflow = (SyntheticWorkflow) workflow;
syntheticWorkflow.setWorkflowData(workflowData);
} else {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
}
@Override
public final void logout() {
throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE);
}
}