package com.sap.research.fiware.ngsi10.simple; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.Properties; import java.util.logging.Logger; import noNamespace.ContextAttribute; import noNamespace.ContextRegistration; import noNamespace.ContextRegistrationAttribute; import noNamespace.ContextRegistrationAttributeList; import noNamespace.ContextRegistrationList; import noNamespace.EntityId; import noNamespace.EntityIdList; import noNamespace.RegisterContextRequest; import noNamespace.RegisterContextRequestDocument; import noNamespace.RegisterContextResponseDocument; import noNamespace.StatusCode; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.xmlbeans.XmlException; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PropertiesLoaderUtils; import com.sap.research.fiware.ngsi10.simple.exceptions.BadRequestException; import com.sap.research.fiware.ngsi10.simple.exceptions.ServerConnectionException; /** * Registers the NGSI server as context at the broker * * * */ public class RegisterContextClient { private static final Logger LOG = Logger.getLogger(RegisterContextClient.class.getName()); private RegisterContextRequestDocument requestDoc; private HttpPost post; EntityId id; private String ngsiServerPublicURL; private URI brokerURL; private ContextAttribute attribute; /** * @param attribute * @param subscription * the subscription that triggered the context notification */ public void registerContext(EntityId id, ContextAttribute attribute) throws ServerConnectionException { this.id = id; this.attribute = attribute; try { LOG.info("Trying to reach broker for context registration"); registerContextWithoutErrorHandling(); LOG.info("Successfully registered context at broker"); } catch (Exception e) { throw new ServerConnectionException(e); } } /** * sends the notification * @param id * * @throws ServerConnectionException * the endpoint is unreachable or sent an unappropriate response * @throws IOException * @throws ClientProtocolException * @throws BadRequestException * @throws XmlException * @throws URISyntaxException */ public void registerContextWithoutErrorHandling() throws ClientProtocolException, IOException, BadRequestException, XmlException, URISyntaxException { readProperties(); prepareNGSIRequest(); prepareHTTPResponse(); createResponseBody(); sendQuery(); } private void readProperties() throws FileNotFoundException, IOException, URISyntaxException { Properties properties = new Properties(); properties.load(this.getClass().getClassLoader() .getResourceAsStream("placeholder.properties")); ngsiServerPublicURL = properties.getProperty("ngsiServerPublicURL"); brokerURL = new URI(properties.getProperty("brokerURL")); } private void prepareNGSIRequest() { requestDoc = RegisterContextRequestDocument.Factory.newInstance(); RegisterContextRequest request = requestDoc.addNewRegisterContextRequest(); ContextRegistrationList list = request.addNewContextRegistrationList(); ContextRegistration registration = list.addNewContextRegistration(); EntityIdList entityIDList = registration.addNewEntityIdList(); EntityId entityID = entityIDList.addNewEntityId(); entityID.setId(id.getId()); entityID.setType(id.getType()); ContextRegistrationAttributeList attributeList = registration.addNewContextRegistrationAttributeList(); ContextRegistrationAttribute attributeElement = attributeList.addNewContextRegistrationAttribute(); attributeElement.setIsDomain(false); attributeElement.setName(attribute.getName()); registration.setProvidingApplication(ngsiServerPublicURL); } private void sendQuery() throws IOException, ClientProtocolException, XmlException, BadRequestException { HttpClient httpclient = new DefaultHttpClient(); HttpResponse httpresponse = httpclient.execute(post); InputStream input = httpresponse.getEntity().getContent(); RegisterContextResponseDocument responseDocument = RegisterContextResponseDocument.Factory.parse(input); if (!responseDocument.validate()) throw new BadRequestException("Context registration response is not valid"); StatusCode errorCode = responseDocument.getRegisterContextResponse().getErrorCode(); if(errorCode!=null && errorCode.getCode()!=200) { throw new BadRequestException("Context registration response returned error code: " + errorCode.getCode()); } } private void createResponseBody() throws UnsupportedEncodingException { StringEntity entity = new StringEntity(requestDoc.xmlText()); post.setEntity(entity); } private void prepareHTTPResponse() { post = new HttpPost(); post.addHeader("Content-Type", "application/xml"); post.setURI(brokerURL); } }