/**
* Copyright (C) 2015 Orange
* 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 com.francetelecom.clara.cloud.paas.activation.v1;
import com.francetelecom.clara.cloud.commons.tasks.TaskStatus;
import com.francetelecom.clara.cloud.commons.tasks.TaskStatusEnum;
import com.francetelecom.clara.cloud.coremodel.ActivationContext;
import com.francetelecom.clara.cloud.model.ModelItem;
import com.francetelecom.clara.cloud.paas.activation.ActivationPlugin;
import com.francetelecom.clara.cloud.paas.activation.ActivationStepEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.task.TaskExecutor;
import java.util.HashMap;
import java.util.Map;
public class ActivationPluginMock extends ActivationPlugin<ModelItem> {
private static Logger logger = LoggerFactory.getLogger(ActivationPluginMock.class.getName());
@Autowired
private TaskExecutor taskExecutor;
private ActivationPluginMockUtils utils;
private Map<Long, TaskStatus> taskStatus = new HashMap<Long, TaskStatus>();
@Override
public TaskStatus giveCurrentTaskStatus(TaskStatus status) {
TaskStatus newStatus = null;
TaskStatus currentStatus = taskStatus.get(status.getTaskId());
if (currentStatus != null) {
newStatus = new TaskStatus(currentStatus);
}
String statusTitle = (status != null ? status.getTitle(): "null");
String newStatusStr = (newStatus != null ? newStatus.getTaskStatus().toString() : "(null)");
logger.debug("giveCurrentTaskStatus '"+statusTitle+"' => "+newStatusStr);
return newStatus;
}
@Override
public TaskStatus init(final int entityId, final Class<ModelItem> entityClass) {
logger.debug("init entity "+entityId);
final TaskStatus status;
synchronized (taskStatus) {
status = new TaskStatus(System.currentTimeMillis());
taskStatus.put(status.getTaskId(), status);
status.setTitle("init "+entityId);
status.setStartTime(System.currentTimeMillis());
status.setTaskStatus(TaskStatusEnum.STARTED);
}
final Map<String, String> mdcContext = MDC.getCopyOfContextMap();
this.taskExecutor.execute(new Runnable() {
@Override
public void run() {
try {
// Copy current log context informations to the new thread
if (mdcContext != null) MDC.setContextMap(mdcContext);
Thread.currentThread().setName("myThread#"+entityId);
utils.init(entityId,entityClass);
status.setEndTime(System.currentTimeMillis());
status.setTaskStatus(TaskStatusEnum.FINISHED_OK);
} catch (Throwable e) {
status.setEndTime(System.currentTimeMillis());
status.setTaskStatus(TaskStatusEnum.FINISHED_FAILED);
status.setErrorMessage(e.getMessage());
logger.error(e.getMessage(), e);
} finally {
// Clear all context informations so the thread can be re-used
MDC.clear();
}
}
});
return status;
}
@Override
public TaskStatus activate(final int entityId, final Class<ModelItem> entityClass, ActivationContext context) {
logger.debug("activating entity "+entityId);
final TaskStatus status;
synchronized (taskStatus) {
status = new TaskStatus(System.currentTimeMillis());
taskStatus.put(status.getTaskId(), status);
status.setTitle("activate "+entityId);
status.setStartTime(System.currentTimeMillis());
status.setTaskStatus(TaskStatusEnum.STARTED);
}
final Map<String, String> mdcContext = MDC.getCopyOfContextMap();
this.taskExecutor.execute(new Runnable() {
@Override
public void run() {
try {
// Copy current log context informations to the new thread
if (mdcContext != null) MDC.setContextMap(mdcContext);
utils.activate(entityId,entityClass);
status.setEndTime(System.currentTimeMillis());
status.setTaskStatus(TaskStatusEnum.FINISHED_OK);
} catch (Throwable e) {
status.setEndTime(System.currentTimeMillis());
status.setTaskStatus(TaskStatusEnum.FINISHED_FAILED);
status.setErrorMessage(e.getMessage());
logger.error(e.getMessage(), e);
} finally {
// Clear all context informations so the thread can be re-used
MDC.clear();
}
}
});
return status;
}
@Override
public TaskStatus firststart(final int entityId, final Class<ModelItem> entityClass) {
logger.debug("starting entity "+entityId);
final TaskStatus status;
synchronized (taskStatus) {
status = new TaskStatus(System.currentTimeMillis());
taskStatus.put(status.getTaskId(), status);
status.setTitle("firststart "+entityId);
status.setStartTime(System.currentTimeMillis());
status.setTaskStatus(TaskStatusEnum.STARTED);
}
final Map<String, String> mdcContext = MDC.getCopyOfContextMap();
this.taskExecutor.execute(new Runnable() {
@Override
public void run() {
try {
// Copy current log context informations to the new thread
if (mdcContext != null) MDC.setContextMap(mdcContext);
utils.firststart(entityId,entityClass);
status.setEndTime(System.currentTimeMillis());
status.setTaskStatus(TaskStatusEnum.FINISHED_OK);
} catch (Throwable e) {
status.setEndTime(System.currentTimeMillis());
status.setTaskStatus(TaskStatusEnum.FINISHED_FAILED);
status.setErrorMessage(e.getMessage());
logger.error(e.getMessage(), e);
} finally {
// Clear all context informations so the thread can be re-used
MDC.clear();
}
}
});
return status;
}
@Override
public TaskStatus start(final int entityId, final Class<ModelItem> entityClass) {
logger.debug("starting entity "+entityId);
final TaskStatus status;
synchronized (taskStatus) {
status = new TaskStatus(System.currentTimeMillis());
taskStatus.put(status.getTaskId(), status);
status.setTitle("start "+entityId);
status.setStartTime(System.currentTimeMillis());
status.setTaskStatus(TaskStatusEnum.STARTED);
}
final Map<String, String> mdcContext = MDC.getCopyOfContextMap();
this.taskExecutor.execute(new Runnable() {
@Override
public void run() {
try {
// Copy current log context informations to the new thread
if (mdcContext != null) MDC.setContextMap(mdcContext);
utils.start(entityId,entityClass);
status.setEndTime(System.currentTimeMillis());
status.setTaskStatus(TaskStatusEnum.FINISHED_OK);
} catch (Throwable e) {
status.setEndTime(System.currentTimeMillis());
status.setTaskStatus(TaskStatusEnum.FINISHED_FAILED);
status.setErrorMessage(e.getMessage());
logger.error(e.getMessage(), e);
} finally {
// Clear all context informations so the thread can be re-used
MDC.clear();
}
}
});
return status;
}
@Override
public TaskStatus stop(final int entityId, final Class<ModelItem> entityClass) {
logger.debug("stopping entity "+entityId);
final TaskStatus status;
synchronized (taskStatus) {
status = new TaskStatus(System.currentTimeMillis());
taskStatus.put(status.getTaskId(), status);
status.setTitle("stop "+entityId);
status.setStartTime(System.currentTimeMillis());
status.setTaskStatus(TaskStatusEnum.STARTED);
}
final Map<String, String> mdcContext = MDC.getCopyOfContextMap();
this.taskExecutor.execute(new Runnable() {
@Override
public void run() {
try {
// Copy current log context informations to the new thread
if (mdcContext != null) MDC.setContextMap(mdcContext);
utils.stop(entityId,entityClass);
status.setEndTime(System.currentTimeMillis());
status.setTaskStatus(TaskStatusEnum.FINISHED_OK);
} catch (Throwable e) {
status.setEndTime(System.currentTimeMillis());
status.setTaskStatus(TaskStatusEnum.FINISHED_FAILED);
status.setErrorMessage(e.getMessage());
logger.error(e.getMessage(), e);
} finally {
// Clear all context informations so the thread can be re-used
MDC.clear();
}
}
});
return status;
}
@Override
public TaskStatus delete(final int entityId, final Class<ModelItem> entityClass) {
logger.debug("deleting entity "+entityId);
final TaskStatus status;
synchronized (taskStatus) {
status = new TaskStatus(System.currentTimeMillis());
taskStatus.put(status.getTaskId(), status);
status.setTitle("delete "+entityId);
status.setStartTime(System.currentTimeMillis());
status.setTaskStatus(TaskStatusEnum.STARTED);
}
final Map<String, String> mdcContext = MDC.getCopyOfContextMap();
this.taskExecutor.execute(new Runnable() {
@Override
public void run() {
try {
// Copy current log context informations to the new thread
if (mdcContext != null) MDC.setContextMap(mdcContext);
utils.delete(entityId,entityClass);
status.setEndTime(System.currentTimeMillis());
status.setTaskStatus(TaskStatusEnum.FINISHED_OK);
} catch (Throwable e) {
status.setEndTime(System.currentTimeMillis());
status.setTaskStatus(TaskStatusEnum.FINISHED_FAILED);
status.setErrorMessage(e.getMessage());
logger.error(e.getMessage(), e);
} finally {
// Clear all context informations so the thread can be re-used
MDC.clear();
}
}
});
return status;
}
@Override
public boolean accept(Class<?> entityClass, ActivationStepEnum step) {
return true;
}
public void setUtils(ActivationPluginMockUtils utils) {
this.utils = utils;
}
}