/*
* Copyright 2013 Pavel Stastny <pavel.stastny at gmail.com>.
*
* 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.
*/
package org.aplikator.server.processes.impl.thread;
import java.io.File;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import org.aplikator.client.shared.descriptor.ProcessDTO;
import org.aplikator.server.processes.CannotCallStopException;
import org.aplikator.server.processes.ProcessPropeties;
import org.aplikator.server.processes.ProcessState;
import org.aplikator.server.processes.ProcessType;
/**
* @author Pavel Stastny <pavel.stastny at gmail.com>
*/
public abstract class AbstractProcessThread implements org.aplikator.server.processes.Process {
protected ExecutorService execService = Executors.newSingleThreadExecutor();
protected Future<?> submited;
protected String ident;
protected String appname;
protected Date startedDate;
protected Date stoppedDate;
protected ProcessPropeties processProperties = new ProcessPropeties();
public AbstractProcessThread(String ident, String appname) {
this.ident = ident;
this.appname = appname;
}
@Override
public String getIdentifier() {
return this.ident;
}
@Override
public void startMe() {
this.startedDate = new Date();
new _Thread(this.execService, getWork()).start();
}
@Override
public void stopMe() throws CannotCallStopException {
if (this.submited != null) {
this.stoppedDate = new Date();
this.submited.cancel(true);
} else {
throw new CannotCallStopException("still not running");
}
}
@Override
public boolean isLiveProcess() {
return ((!this.submited.isCancelled()) && (!this.submited.isDone()));
}
@Override
public void redirectOutputStream(File f) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void redirectErrorStream(File f) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public ProcessType getType() {
return ProcessType.THREAD;
}
@Override
public ProcessState getProcessState() {
if (submited != null) {
if (submited.isCancelled())
return ProcessState.KILLED;
if (submited.isDone())
return ProcessState.FINISHED;
return ProcessState.RUNNING;
} else {
return ProcessState.FAILED;
}
}
@Override
public String getApplicationName() {
return this.appname;
}
@Override
public void updateProcessIntrnalState(Object value) {
}
protected abstract Runnable getWork();
@Override
public ProcessPropeties getProcessProperties() {
return this.processProperties;
}
@Override
public ProcessDTO toProcessDTO() {
ProcessDTO pdto = new ProcessDTO();
if (this.startedDate != null)
pdto.setStartedDate(FORMAT.format(this.startedDate));
if (this.stoppedDate != null)
pdto.setStoppedDate(FORMAT.format(this.stoppedDate));
pdto.setIdentifier(this.getIdentifier());
pdto.setProcessType(this.getType().name());
pdto.setLiveProcess(this.isLiveProcess());
pdto.setProcessState(getProcessState().name());
pdto.setProcessProperties(getProcessProperties().toMap());
return pdto;
}
@Override
public Date getStartedDate() {
return this.startedDate;
}
@Override
public Date getStoppedDate() {
return this.stoppedDate;
}
class _Thread extends Thread {
private ExecutorService execService = null;
private Runnable work;
public _Thread(ExecutorService execService, Runnable work) {
this.execService = execService;
this.work = work;
}
@Override
public void run() {
AbstractProcessThread.this.submited = execService.submit(this.work);
execService.shutdown();
}
}
}