package io.cattle.platform.iaas.api.change.impl;
import io.cattle.platform.api.pubsub.subscribe.ApiPubSubEventPostProcessor;
import io.cattle.platform.core.constants.CommonStatesConstants;
import io.cattle.platform.eventing.model.EventVO;
import io.cattle.platform.iaas.event.IaasEvents;
import io.cattle.platform.object.meta.ObjectMetaDataManager;
import io.cattle.platform.object.util.DataAccessor;
import io.github.ibuildthecloud.gdapi.context.ApiContext;
import io.github.ibuildthecloud.gdapi.exception.ClientVisibleException;
import io.github.ibuildthecloud.gdapi.json.JsonMapper;
import io.github.ibuildthecloud.gdapi.model.ListOptions;
import io.github.ibuildthecloud.gdapi.model.Resource;
import io.github.ibuildthecloud.gdapi.request.ApiRequest;
import io.github.ibuildthecloud.gdapi.request.resource.ResourceManager;
import io.github.ibuildthecloud.gdapi.request.resource.ResourceManagerLocator;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
public class ResourceChangeEventProcessor implements ApiPubSubEventPostProcessor {
ResourceManagerLocator locator;
JsonMapper jsonMapper;
@Override
public boolean processEvent(EventVO<Object> event) {
if (event.getName() == null || !event.getName().startsWith(IaasEvents.RESOURCE_CHANGE)) {
return true;
}
String type = event.getResourceType();
String id = event.getResourceId();
if (type == null || id == null) {
return false;
}
ResourceManager rm = locator.getResourceManagerByType(type);
if (rm == null) {
return false;
}
try {
ApiRequest request = ApiContext.getContext().getApiRequest();
Object obj = rm.getById(type, id, new ListOptions(request));
if (obj == null) {
return false;
}
request.setResponseObject(obj);
Resource resource = rm.convertResponse(obj, request);
if (resource == null) {
return false;
}
Object removed = resource.getFields().get(ObjectMetaDataManager.REMOVED_FIELD);
String state = DataAccessor.fromMap(resource.getFields()).withKey(ObjectMetaDataManager.STATE_FIELD).as(String.class);
if (removed != null && !CommonStatesConstants.REMOVED.equals(state)) {
return false;
}
Map<String, Object> data = new HashMap<String, Object>();
@SuppressWarnings("unchecked")
Map<String, Object> resourceData = jsonMapper.convertValue(resource, Map.class);;
if (request.getOptions().get("_actionLinks") != null) {
data.put("actionLinks", resourceData.remove("actions"));
}
data.put("resource", resourceData);
event.setResourceType(resource.getType());
event.setData(data);
} catch (ClientVisibleException e) {
}
return true;
}
public ResourceManagerLocator getLocator() {
return locator;
}
@Inject
public void setLocator(ResourceManagerLocator locator) {
this.locator = locator;
}
public JsonMapper getJsonMapper() {
return jsonMapper;
}
@Inject
public void setJsonMapper(JsonMapper jsonMapper) {
this.jsonMapper = jsonMapper;
}
}