package org.ow2.choreos.ee.reconfiguration; import it.cnr.isti.labse.glimpse.xml.complexEventException.ComplexEventException; import it.cnr.isti.labse.glimpse.xml.complexEventResponse.ComplexEventResponse; import it.cnr.isti.labsedc.glimpse.consumer.GlimpseAbstractConsumer; import java.util.Properties; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.ObjectMessage; import org.apache.log4j.Logger; import org.ow2.choreos.chors.datamodel.Choreography; import org.ow2.choreos.nodes.datamodel.CloudNode; import org.ow2.choreos.services.datamodel.DeployableService; import org.ow2.choreos.services.datamodel.ServiceInstance; class ChorGlimpseConsumer extends GlimpseAbstractConsumer { Logger logger = Logger.getLogger("reconfLogger"); private ComplexEventExceptionHandler complexEventExceptionHandler; private ComplexEventResponseHandler complexEventResponseHandler; private Choreography chor; public ChorGlimpseConsumer(Properties settings, String plainTextRule, Choreography chor) { super(settings, plainTextRule); this.chor = chor; complexEventExceptionHandler = new ComplexEventExceptionHandler(); complexEventResponseHandler = new ComplexEventResponseHandler(); } @Override public void messageReceived(Message arg0) throws JMSException { try { ObjectMessage responseFromMonitoring = (ObjectMessage) arg0; if (responseFromMonitoring.getObject() instanceof ComplexEventException) { complexEventExceptionHandler.handle(responseFromMonitoring); } else { ComplexEventResponse respObject = (ComplexEventResponse) responseFromMonitoring.getObject(); if (isQoSComplexEvent(respObject) && isServiceKnown(respObject) && isCloudNodeKnown(respObject)) { String serviceId = findService(respObject.getResponseValue()); if (serviceId == null) return; respObject.setResponseValue(serviceId); // resets // serviceName to // serviceId complexEventResponseHandler.handle(respObject); } } } catch (ClassCastException asd) { logger.error("Error while casting message received. It is not a ObjectMessage instance"); } } private String findService(String instanceId) { for (DeployableService s : chor.getDeployableServices()) { for (ServiceInstance i : s.getInstances()) { if (i.getInstanceId().equals(instanceId)) return s.getUUID(); } } return null; } private boolean isServiceKnown(ComplexEventResponse respObject) { logger.debug("isServiceKnown() : Searching for: " + respObject.getResponseValue()); if (respObject.getResponseValue().equals("all")) { logger.debug("isServiceKnown() : Searching for: " + respObject.getResponseValue()); logger.debug("isServiceKnown() : Applicable for service scope!"); return true; } for (DeployableService service : chor.getDeployableServices()) { logger.debug("isServiceKnown() : Found service = " + service + " for chor = " + chor.getId()); if (service.getSpec().getName().equals(respObject.getResponseValue())) { logger.debug("isServiceKnown() : Macthed: " + service + " = " + respObject.getResponseValue()); return true; } } logger.debug("isServiceKnown() : Nothing matches"); return false; } private boolean isCloudNodeKnown(ComplexEventResponse respObject) { logger.debug("isCloudNodeKnown() : Searching for: " + respObject.getResponseKey()); for (DeployableService service : chor.getDeployableServices()) { for (CloudNode node : service.getSelectedNodes()) { logger.debug("isCloudNodeKnown() : Found node = " + node + " for service = " + service); if (node.getIp().equals(respObject.getResponseKey())) { logger.debug("isCloudNodeKnown() : Matched: " + node + " = " + respObject.getResponseKey()); return true; } } } logger.debug("isCloudNodeKnown() : Nothing matches"); return false; } private boolean isQoSComplexEvent(ComplexEventResponse respObject) { boolean result = false; String ruleName = respObject.getRuleName(); logger.debug("isQoSComplexEvent() : Rule name = " + ruleName); if (ruleName.equals("LowCpuUser")) result = true; else if (ruleName.startsWith("HighResponseTime")) { result = true; respObject.setRuleName("HighResponseTime"); } logger.debug("isQoSComplexEvent() : return value = " + result); return result; } }