package de.rwth.idsg.bikeman.ixsi.dispatcher; import de.rwth.idsg.bikeman.ixsi.CommunicationContext; import de.rwth.idsg.bikeman.ixsi.ErrorFactory; import de.rwth.idsg.bikeman.ixsi.IxsiProcessingException; import de.rwth.idsg.bikeman.ixsi.processor.api.SubscriptionRequestMessageProcessor; import de.rwth.idsg.bikeman.ixsi.processor.api.SubscriptionRequestProcessor; import de.rwth.idsg.bikeman.ixsi.repository.SystemValidator; import de.rwth.idsg.ixsi.jaxb.RequestMessageGroup; import de.rwth.idsg.ixsi.jaxb.ResponseMessageGroup; import de.rwth.idsg.ixsi.jaxb.SubscriptionRequestGroup; import de.rwth.idsg.ixsi.jaxb.SubscriptionResponseGroup; import lombok.extern.slf4j.Slf4j; import org.joda.time.Period; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import xjc.schema.ixsi.HeartBeatResponseType; import xjc.schema.ixsi.SubscriptionRequestType; import xjc.schema.ixsi.SubscriptionResponseType; /** * @author Sevket Goekay <goekay@dbis.rwth-aachen.de> * @since 24.09.2014 */ @Slf4j @Component public class SubscriptionRequestTypeDispatcher implements Dispatcher { @Autowired private ProcessorProvider processorProvider; @Autowired private SystemValidator systemValidator; @Override public void handle(CommunicationContext context) { log.trace("Entered handle..."); SubscriptionRequestType request = context.getIncomingIxsi().getSubscriptionRequest(); SubscriptionResponseType response = handle(request); context.getOutgoingIxsi().setSubscriptionResponse(response); } private SubscriptionResponseType handle(SubscriptionRequestType request) { // Process the request // long startTime = System.currentTimeMillis(); SubscriptionResponseType response = delegate(request); long stopTime = System.currentTimeMillis(); int duration = (int) (stopTime - startTime); Period calcTime = Period.millis(duration); response.setCalcTime(calcTime); response.setTransaction(request.getTransaction()); return response; } private SubscriptionResponseType delegate(SubscriptionRequestType request) { if (request.isSetHeartBeat()) { return buildHeartbeat(); } else if (request.isSetSubscriptionRequestGroup()) { return buildResponse(request); } else if (request.isSetRequestMessageGroup()) { return buildResponseMessage(request); } else { throw new IxsiProcessingException("Incoming message must be from " + "SubscriptionAdministrationRequestGroup, SubscriptionRequestGroup or RequestMessageGroup"); } } // ------------------------------------------------------------------------- // Choice content // ------------------------------------------------------------------------- private SubscriptionResponseType buildHeartbeat() { log.trace("Entered buildHeartbeat..."); return new SubscriptionResponseType() .withHeartBeat(new HeartBeatResponseType()); } @SuppressWarnings("unchecked") private SubscriptionResponseType buildResponse(SubscriptionRequestType request) { log.trace("Entered buildResponse..."); SubscriptionRequestGroup req = request.getSubscriptionRequestGroup(); SubscriptionRequestProcessor p = processorProvider.find(req); // System validation // SubscriptionResponseGroup res; String systemID = request.getSystemID(); if (systemValidator.validate(systemID)) { res = p.process(req, systemID); } else { res = p.buildError(ErrorFactory.Sys.idUknown()); } return new SubscriptionResponseType() .withSubscriptionResponseGroup(res); } @SuppressWarnings("unchecked") private SubscriptionResponseType buildResponseMessage(SubscriptionRequestType request) { log.trace("Entered buildResponseMessage..."); RequestMessageGroup req = request.getRequestMessageGroup(); SubscriptionRequestMessageProcessor p = processorProvider.find(req); // System validation // ResponseMessageGroup res; String systemID = request.getSystemID(); if (systemValidator.validate(systemID)) { res = p.process(req, systemID); } else { res = p.buildError(ErrorFactory.Sys.idUknown()); } return new SubscriptionResponseType() .withResponseMessageGroup(res); } }