package io.cattle.platform.extension.dynamic.impl;
import io.cattle.platform.core.constants.ExternalHandlerConstants;
import io.cattle.platform.engine.handler.ProcessLogic;
import io.cattle.platform.eventing.EventService;
import io.cattle.platform.extension.dynamic.DynamicExtensionHandler;
import io.cattle.platform.extension.dynamic.dao.ExternalHandlerDao;
import io.cattle.platform.extension.dynamic.data.ExternalHandlerData;
import io.cattle.platform.object.ObjectManager;
import io.cattle.platform.object.meta.ObjectMetaDataManager;
import io.cattle.platform.object.process.ObjectProcessManager;
import io.cattle.platform.object.util.DataAccessor;
import io.cattle.platform.process.common.handler.EventBasedProcessHandler;
import io.cattle.platform.util.type.PriorityUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.inject.Inject;
public class ExternalDynamicExtensionHandlerImpl implements DynamicExtensionHandler {
private static final Pattern PROCESS_PATTERN = Pattern.compile("process\\.(.*)\\.(handler|post\\.listener|pre\\.listener)s");
private static final String[] PREFIX = new String[] { "pre.", "post." };
ExternalHandlerDao externalHandlerDao;
EventService eventService;
ObjectManager objectManager;
ObjectProcessManager objectProcessManager;
ObjectMetaDataManager objectMetaDataManager;
@SuppressWarnings("unchecked")
@Override
public <T> List<T> getExtensionList(String key, Class<T> type) {
if (type != null && !ProcessLogic.class.isAssignableFrom(type)) {
return Collections.emptyList();
}
Matcher m = PROCESS_PATTERN.matcher(key);
if (!m.matches()) {
return Collections.emptyList();
}
String eventName = m.group(1);
String phase = m.group(2);
for (String i : PREFIX) {
if (phase.startsWith(i)) {
eventName = i + eventName;
break;
}
}
List<? extends ExternalHandlerData> externalHandlers = externalHandlerDao.getExternalHandlerData(eventName);
if (externalHandlers.size() == 0) {
return Collections.emptyList();
}
List<Object> result = new ArrayList<Object>(externalHandlers.size());
for (ExternalHandlerData handler : externalHandlers) {
result.add(toEventHandler(eventName, handler));
}
return (List<T>) result;
}
protected Object toEventHandler(String eventName, ExternalHandlerData handler) {
if (handler.getEventName() != null) {
eventName = handler.getEventName();
}
Integer retries = DataAccessor.fieldInteger(handler, ExternalHandlerConstants.FIELD_RETRIES);
Long timeout = DataAccessor.fieldLong(handler, ExternalHandlerConstants.FIELD_TIMEOUT);
String priorityName = DataAccessor.fieldString(handler, ExternalHandlerConstants.FIELD_PRIORITY_NAME);
Integer priority = handler.getPriority();
String handlerName = handler.getName();
if (priority == null) {
priority = PriorityUtils.getPriorityFromString(priorityName);
}
EventBasedProcessHandler processHandler = new EventBasedProcessHandler(eventService, objectManager, objectProcessManager, objectMetaDataManager);
processHandler.setEventName(String.format("%s;handler=%s", eventName, handlerName));
processHandler.setName(handlerName);
processHandler.setPriority(priority);
processHandler.setRetry(retries);
processHandler.setTimeoutMillis(timeout);
processHandler.setOnError(handler.getOnError());
return processHandler;
}
public ExternalHandlerDao getExternalHandlerDao() {
return externalHandlerDao;
}
@Inject
public void setExternalHandlerDao(ExternalHandlerDao externalHandlerDao) {
this.externalHandlerDao = externalHandlerDao;
}
public EventService getEventService() {
return eventService;
}
@Inject
public void setEventService(EventService eventService) {
this.eventService = eventService;
}
public ObjectManager getObjectManager() {
return objectManager;
}
@Inject
public void setObjectManager(ObjectManager objectManager) {
this.objectManager = objectManager;
}
public ObjectProcessManager getObjectProcessManager() {
return objectProcessManager;
}
@Inject
public void setObjectProcessManager(ObjectProcessManager objectProcessManager) {
this.objectProcessManager = objectProcessManager;
}
public ObjectMetaDataManager getObjectMetaDataManager() {
return objectMetaDataManager;
}
@Inject
public void setObjectMetaDataManager(ObjectMetaDataManager objectMetaDataManager) {
this.objectMetaDataManager = objectMetaDataManager;
}
}