Skip to content

Commit

Permalink
MID-3957 cleanup, async web process api used for dashboard and progre…
Browse files Browse the repository at this point in the history
…ss reporter
  • Loading branch information
1azyman committed Nov 20, 2017
1 parent dfcb4bf commit 4cd5956
Show file tree
Hide file tree
Showing 10 changed files with 387 additions and 504 deletions.
Expand Up @@ -82,7 +82,6 @@
import com.evolveum.midpoint.web.component.menu.MenuItem;
import com.evolveum.midpoint.web.component.menu.top.LocalePanel;
import com.evolveum.midpoint.web.component.message.FeedbackAlerts;
import com.evolveum.midpoint.web.component.progress.ProgressReporterManager;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.admin.PageAdmin;
import com.evolveum.midpoint.web.page.admin.PageAdminFocus;
Expand Down Expand Up @@ -2105,10 +2104,6 @@ protected String determineDataLanguage() {
}
}

public ProgressReporterManager getProgressReporterManager() {
return MidPointApplication.get().getProgressReporterManager();
}

public AsyncWebProcessManager getAsyncWebProcessManager() {
return MidPointApplication.get().getAsyncWebProcessManager();
}
Expand Down
Expand Up @@ -16,164 +16,24 @@

package com.evolveum.midpoint.web.application;

import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.security.MidPointApplication;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.ss.formula.functions.T;
import org.apache.wicket.ISessionListener;
import org.apache.wicket.Session;
import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
import org.apache.wicket.request.Request;
import org.apache.wicket.request.cycle.RequestCycle;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;

import javax.annotation.PreDestroy;
import javax.servlet.http.HttpSession;
import java.util.*;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
* Created by Viliam Repan (lazyman).
*/
public class AsyncWebProcessManager implements ISessionListener {
public interface AsyncWebProcessManager {

private static final Trace LOGGER = TraceManager.getTrace(AsyncWebProcessManager.class);
<T> AsyncWebProcess<T> createProcess(T data);

@Autowired
private MidPointApplication application;
<T> AsyncWebProcess<T> createProcess();

private ExecutorService executor = Executors.newCachedThreadPool();
AsyncWebProcess getProcess(@NotNull String processId);

private Map<Key, AsyncWebProcess> processes = new Hashtable<>();
boolean removeProcess(@NotNull String processId);

@PreDestroy
public void destroy() {
executor.shutdownNow();
}
void submit(@NotNull String processId, Runnable runnable);

@Override
public void onCreated(Session session) {
// we don't care about created sessions
}

@Override
public void onUnbound(String sessionId) {
Set<Key> keys = new HashSet();
keys.addAll(processes.keySet());

for (Key key : keys) {
if (!key.sessionId.equals(sessionId)) {
continue;
}

removeProcess(key);
}
}

public <T> AsyncWebProcess<T> createProcess(T data) {
Key key = createProcessIdentifier(UUID.randomUUID().toString());

AsyncWebProcess process = new AsyncWebProcess(key.processId, application);
process.setData(data);
processes.put(key, process);

return process;
}

public <T> AsyncWebProcess<T> createProcess() {
return createProcess(null);
}

public AsyncWebProcess getProcess(@NotNull String processId) {
Key key = createProcessIdentifier(processId);
return processes.get(key);
}

public void removeProcess(@NotNull String processId) {
Key key = createProcessIdentifier(processId);

removeProcess(key);
}

public void submit(@NotNull String processId, Runnable runnable) {
AsyncWebProcess process = getProcess(processId);

if (process == null) {
throw new IllegalStateException("Process with id '" + processId + "' doesn't exist");
}

Future future = executor.submit(runnable);
process.setFuture(future);
}

public void submit(@NotNull String processId, Callable callable) {
AsyncWebProcess process = getProcess(processId);

if (process == null) {
throw new IllegalStateException("Process with id '" + processId + "' doesn't exist");
}

Future future = executor.submit(callable);
process.setFuture(future);
}

private void removeProcess(Key key) {
AsyncWebProcess process = processes.get(key);
if (process == null) {
return;
}

if (process.getFuture() != null) {
process.getFuture().cancel(true);
}

processes.remove(key);
}

private Key createProcessIdentifier(String processId) {
RequestCycle rc = RequestCycle.get();
Request req = rc.getRequest();

HttpSession session = ((ServletWebRequest) req).getContainerRequest().getSession();
return new Key(session.getId(), processId);
}

private static class Key {

String sessionId;
String processId;

public Key(String sessionId, String processId) {
this.sessionId = sessionId;
this.processId = processId;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

Key key = (Key) o;

if (sessionId != null ? !sessionId.equals(key.sessionId) : key.sessionId != null) return false;
return processId != null ? processId.equals(key.processId) : key.processId == null;
}

@Override
public int hashCode() {
int result = sessionId != null ? sessionId.hashCode() : 0;
result = 31 * result + (processId != null ? processId.hashCode() : 0);
return result;
}

@Override
public String toString() {
return StringUtils.join(new Object[]{sessionId, processId}, "/");
}
}
void submit(@NotNull String processId, @NotNull Callable callable);
}

0 comments on commit 4cd5956

Please sign in to comment.