package com.sap.research.fiware.ngsi10.simple.subscriptionmanagement; import java.net.URI; import java.net.URISyntaxException; import java.util.Calendar; import java.util.Date; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.Duration; import noNamespace.NotifyCondition; import noNamespace.NotifyConditionList; import noNamespace.NotifyConditionType; import noNamespace.SubscribeContextRequest; import org.apache.xmlbeans.GDuration; import org.apache.xmlbeans.XmlOptions; import com.sap.research.fiware.ngsi10.simple.exceptions.BadRequestException; import com.sap.research.fiware.ngsi10.simple.exceptions.NotFoundException; /** * Creates a subscription from a request. Only the first notify condition is considered. * * */ public class SubscriptionBuilder { /** * builds the subscription * @return the subscription * @throws NotFoundException thrown if the desired entity or context attributes are not present */ public static Subscription build(SubscribeContextRequest subscribeContextRequest) throws NotFoundException, BadRequestException { NotifyCondition notifyCondition = readNotifyCondition(subscribeContextRequest); Subscription subscription = getSubscriptionForNotifyCondition(notifyCondition); setAttributes(subscription, subscribeContextRequest); return subscription; } private static void setAttributes(Subscription subscription, SubscribeContextRequest subscribeContextRequest) throws BadRequestException { subscription.setAttributes(subscribeContextRequest.getAttributeList().getAttributeArray()); subscription.setEntityIDs(subscribeContextRequest.getEntityIdList().getEntityIdArray()); subscription.setReference(buildReference(subscribeContextRequest)); subscription.setDurationInMillis(readDuration(subscribeContextRequest)); } private static URI buildReference(SubscribeContextRequest subscribeContextRequest) throws BadRequestException { try { String reference = subscribeContextRequest.getReference().xmlText(); reference = trimFragmentStuff(reference); return new URI(reference); } catch (URISyntaxException e) { throw new BadRequestException(e.getMessage()); } } private static String trimFragmentStuff(String xmlBeansFragment) { return xmlBeansFragment.replace("<xml-fragment>", "").replace("</xml-fragment>","").trim(); } private static Subscription getSubscriptionForNotifyCondition(NotifyCondition notifyCondition) { if(notifyCondition == null) { return new NoEventSubscription(); } int notifyConditionInt = notifyCondition.getType().intValue(); switch(notifyConditionInt) { case(NotifyConditionType.INT_ONCHANGE): ValueChangeSubscription valueChangeSubscription = new ValueChangeSubscription(); String[] attributesFromNotifyCondition = notifyCondition.getCondValueList().getCondValueArray();; valueChangeSubscription.setAttributesFromNotifyCondition(attributesFromNotifyCondition); return valueChangeSubscription; case(NotifyConditionType.INT_ONTIMEINTERVAL): TimerSubscription timerSubscription = new TimerSubscription(); timerSubscription.setIntervalInMillis(readInterval(notifyCondition)); return timerSubscription; } return null; //should not happen if the given input is valid } private static Long readDuration(SubscribeContextRequest subscribeContextRequest) { //uuuah. GDuration duration = subscribeContextRequest.getDuration(); if(duration == null) return null; String durationString = duration.toString(); return getMillisFromDurationString(durationString); } private static long readInterval(NotifyCondition notifyCondition) { String intervalString = notifyCondition.getCondValueList().getCondValueArray(0); return getMillisFromDurationString(intervalString); } private static long getMillisFromDurationString(String durationString) { try { Duration d = DatatypeFactory.newInstance().newDuration(durationString); return d.getTimeInMillis(Calendar.getInstance()); } catch (DatatypeConfigurationException e) { throw new RuntimeException(e); } } private static NotifyCondition readNotifyCondition(SubscribeContextRequest subscribeContextRequest) { NotifyCondition notifyCondition = null; NotifyConditionList notifyConditions = subscribeContextRequest.getNotifyConditions(); if(notifyConditions != null) { notifyCondition = notifyConditions.getNotifyConditionArray(0); } return notifyCondition; } }