diff --git a/eu.neclab.iotplatform.iotbroker.builder/pom.xml b/eu.neclab.iotplatform.iotbroker.builder/pom.xml
index cfde1fa0..1ae66dc4 100644
--- a/eu.neclab.iotplatform.iotbroker.builder/pom.xml
+++ b/eu.neclab.iotplatform.iotbroker.builder/pom.xml
@@ -71,6 +71,7 @@
../eu.neclab.iotplatform.iotbroker.embeddediotagent.couchdb
../eu.neclab.iotplatform.iotbroker.embeddediotagent.indexer
../eu.neclab.iotplatform.iotbroker.embeddediotagent.storage
+ ../eu.neclab.iotplatform.iotbroker.embeddediotagent.registry
../eu.neclab.iotplatform.knowledgebase
diff --git a/eu.neclab.iotplatform.iotbroker.embeddediotagent.registry/META-INF/spring/embeddediotagentregistry-context.xml b/eu.neclab.iotplatform.iotbroker.embeddediotagent.registry/META-INF/spring/embeddediotagentregistry-context.xml
new file mode 100644
index 00000000..a9c30283
--- /dev/null
+++ b/eu.neclab.iotplatform.iotbroker.embeddediotagent.registry/META-INF/spring/embeddediotagentregistry-context.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/eu.neclab.iotplatform.iotbroker.embeddediotagent.registry/META-INF/spring/embeddediotagentregistry-osgi.xml b/eu.neclab.iotplatform.iotbroker.embeddediotagent.registry/META-INF/spring/embeddediotagentregistry-osgi.xml
new file mode 100644
index 00000000..e1a06bc9
--- /dev/null
+++ b/eu.neclab.iotplatform.iotbroker.embeddediotagent.registry/META-INF/spring/embeddediotagentregistry-osgi.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/eu.neclab.iotplatform.iotbroker.embeddediotagent.registry/pom.xml b/eu.neclab.iotplatform.iotbroker.embeddediotagent.registry/pom.xml
new file mode 100644
index 00000000..d5f5c116
--- /dev/null
+++ b/eu.neclab.iotplatform.iotbroker.embeddediotagent.registry/pom.xml
@@ -0,0 +1,142 @@
+
+ 4.0.0
+
+ IoTbrokerParent
+ eu.neclab.iotplatform
+ 6.1-SNAPSHOT
+ ../IoTbrokerParent
+
+
+ iotbroker.embeddediotagent.registry
+ bundle
+
+
+
+
+ EclipseLink Repo
+ http://download.eclipse.org/rt/eclipselink/maven.repo
+
+
+
+
+
+
+ src/main/resources
+
+
+ .
+
+ META-INF/**
+
+
+
+
+
+ org.apache.felix
+ maven-bundle-plugin
+ true
+
+ META-INF
+
+ eu.neclab.iotplatform.couchdb.*
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.3.4
+
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.3.2
+
+
+
+
+ org.json
+ json
+ 20140107
+
+
+
+ com.google.code.gson
+ gson
+ 2.2.2
+
+
+
+ eu.neclab.iotplatform
+ iotbroker.commons
+
+
+
+ eu.neclab.iotplatform
+ ngsi.api
+
+
+
+ eu.neclab.iotplatform
+ iotbroker.client
+
+
+
+ eu.neclab.iotplatform
+ iotbroker.storage
+
+
+
+
+
+
+
+
+
+
+ javax.xml.bind
+ jaxb-api
+ 2.2.11
+
+
+
+
+
+
diff --git a/eu.neclab.iotplatform.iotbroker.embeddediotagent.registry/src/main/java/eu/neclab/iotplatform/iotbroker/embeddediotagent/registry/EmbeddedAgentIdentifierFactory.java b/eu.neclab.iotplatform.iotbroker.embeddediotagent.registry/src/main/java/eu/neclab/iotplatform/iotbroker/embeddediotagent/registry/EmbeddedAgentIdentifierFactory.java
new file mode 100644
index 00000000..0b8508b4
--- /dev/null
+++ b/eu.neclab.iotplatform.iotbroker.embeddediotagent.registry/src/main/java/eu/neclab/iotplatform/iotbroker/embeddediotagent/registry/EmbeddedAgentIdentifierFactory.java
@@ -0,0 +1,53 @@
+package eu.neclab.iotplatform.iotbroker.embeddediotagent.registry;
+
+import eu.neclab.iotplatform.ngsi.api.datamodel.ContextMetadata;
+import eu.neclab.iotplatform.ngsi.api.datamodel.MetadataTypes;
+
+public class EmbeddedAgentIdentifierFactory {
+
+ public static ContextMetadata getEmbeddedAgentIdentifier(String identifier) {
+ return new ContextMetadata(
+ MetadataTypes.EmbeddedAgentIdentifier.getName(), null,
+ identifier);
+ }
+
+ public static boolean compare(ContextMetadata embeddedAgentIdentifier,
+ ContextMetadata contextMetadata) {
+
+ if (embeddedAgentIdentifier == null) {
+ if (contextMetadata == null) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ if (contextMetadata == null) {
+ return false;
+ }
+
+// System.out.println(MetadataTypes.EmbeddedAgentIdentifier.getName());
+
+ if (contextMetadata.getName().toLowerCase().equals(
+ MetadataTypes.EmbeddedAgentIdentifier.getName().toLowerCase())) {
+
+ if (contextMetadata.getValue() instanceof String) {
+
+ if (((String) embeddedAgentIdentifier.getValue())
+ .equals((String) contextMetadata.getValue())) {
+ return true;
+
+ } else {
+ return false;
+ }
+
+ } else {
+ return false;
+ }
+
+ } else {
+ return false;
+ }
+ }
+
+}
diff --git a/eu.neclab.iotplatform.iotbroker.embeddediotagent.registry/src/main/java/eu/neclab/iotplatform/iotbroker/embeddediotagent/registry/LockableRegisterContextRequest.java b/eu.neclab.iotplatform.iotbroker.embeddediotagent.registry/src/main/java/eu/neclab/iotplatform/iotbroker/embeddediotagent/registry/LockableRegisterContextRequest.java
new file mode 100644
index 00000000..3d526fbf
--- /dev/null
+++ b/eu.neclab.iotplatform.iotbroker.embeddediotagent.registry/src/main/java/eu/neclab/iotplatform/iotbroker/embeddediotagent/registry/LockableRegisterContextRequest.java
@@ -0,0 +1,73 @@
+package eu.neclab.iotplatform.iotbroker.embeddediotagent.registry;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.locks.ReentrantLock;
+
+import eu.neclab.iotplatform.ngsi.api.datamodel.ContextMetadata;
+import eu.neclab.iotplatform.ngsi.api.datamodel.ContextRegistration;
+import eu.neclab.iotplatform.ngsi.api.datamodel.ContextRegistrationAttribute;
+import eu.neclab.iotplatform.ngsi.api.datamodel.EntityId;
+import eu.neclab.iotplatform.ngsi.api.datamodel.RegisterContextRequest;
+
+public class LockableRegisterContextRequest {
+ private ReentrantLock lock = new ReentrantLock();
+
+ private RegisterContextRequest registerContextRequest = new RegisterContextRequest();
+
+ public RegisterContextRequest getRegisterContextRequest() {
+ return registerContextRequest;
+ }
+
+ public void setRegisterContextRequest(
+ RegisterContextRequest registerContextRequest) {
+ this.registerContextRequest = registerContextRequest;
+ }
+
+ LockableRegisterContextRequest(ContextMetadata embeddedAgentIdentifier) {
+ super();
+ List contextRegistrationList = new ArrayList();
+ ContextRegistration contextRegistration = new ContextRegistration();
+ contextRegistrationList.add(contextRegistration);
+
+ List contextMetadataList = new ArrayList();
+ contextRegistration.setListContextMetadata(contextMetadataList);
+
+ if (embeddedAgentIdentifier != null) {
+ contextMetadataList.add(embeddedAgentIdentifier);
+ }
+
+ List entityIdList = new ArrayList();
+ contextRegistration.setListEntityId(entityIdList);
+
+ List contextRegistrationAttributeList = new ArrayList();
+ contextRegistration
+ .setListContextRegistrationAttribute(contextRegistrationAttributeList);
+
+ registerContextRequest
+ .setContextRegistrationList(contextRegistrationList);
+ }
+
+ public ContextRegistration getContextRegistration() {
+ return registerContextRequest.getContextRegistrationList().iterator()
+ .next();
+ }
+
+ public void setContextRegistration(ContextRegistration contextRegistration) {
+ List contextRegistrationList = new ArrayList();
+ contextRegistrationList.add(contextRegistration);
+ registerContextRequest
+ .setContextRegistrationList(contextRegistrationList);
+ }
+
+ public void lock() {
+ lock.lock();
+ }
+
+ public void unlock() {
+ lock.unlock();
+ }
+
+}
diff --git a/eu.neclab.iotplatform.iotbroker.embeddediotagent.registry/src/main/java/eu/neclab/iotplatform/iotbroker/embeddediotagent/registry/Registry.java b/eu.neclab.iotplatform.iotbroker.embeddediotagent.registry/src/main/java/eu/neclab/iotplatform/iotbroker/embeddediotagent/registry/Registry.java
new file mode 100644
index 00000000..f5486533
--- /dev/null
+++ b/eu.neclab.iotplatform.iotbroker.embeddediotagent.registry/src/main/java/eu/neclab/iotplatform/iotbroker/embeddediotagent/registry/Registry.java
@@ -0,0 +1,1008 @@
+package eu.neclab.iotplatform.iotbroker.embeddediotagent.registry;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.log4j.Logger;
+import org.springframework.beans.factory.annotation.Value;
+
+import eu.neclab.iotplatform.iotbroker.commons.interfaces.EmbeddedAgentIndexerInterface;
+import eu.neclab.iotplatform.iotbroker.commons.interfaces.EmbeddedAgentRegistryInterface;
+import eu.neclab.iotplatform.iotbroker.commons.interfaces.PermanentRegistryInterface;
+import eu.neclab.iotplatform.iotbroker.embeddediotagent.registry.comparator.ContextRegistrationAttributeComparator;
+import eu.neclab.iotplatform.iotbroker.embeddediotagent.registry.comparator.ContextRegistrationComparator;
+import eu.neclab.iotplatform.ngsi.api.datamodel.Circle;
+import eu.neclab.iotplatform.ngsi.api.datamodel.ContextAttribute;
+import eu.neclab.iotplatform.ngsi.api.datamodel.ContextElement;
+import eu.neclab.iotplatform.ngsi.api.datamodel.ContextMetadata;
+import eu.neclab.iotplatform.ngsi.api.datamodel.ContextRegistration;
+import eu.neclab.iotplatform.ngsi.api.datamodel.ContextRegistrationAttribute;
+import eu.neclab.iotplatform.ngsi.api.datamodel.ContextRegistrationResponse;
+import eu.neclab.iotplatform.ngsi.api.datamodel.DiscoverContextAvailabilityResponse;
+import eu.neclab.iotplatform.ngsi.api.datamodel.EntityId;
+import eu.neclab.iotplatform.ngsi.api.datamodel.MetadataTypes;
+import eu.neclab.iotplatform.ngsi.api.datamodel.RegisterContextRequest;
+import eu.neclab.iotplatform.ngsi.api.datamodel.RegisterContextResponse;
+import eu.neclab.iotplatform.ngsi.api.ngsi9.Ngsi9Interface;
+
+public class Registry implements EmbeddedAgentRegistryInterface {
+
+ /** The logger. */
+ private static Logger logger = Logger.getLogger(Registry.class);
+
+ @Value("${agentgeoscope_latitude}")
+ private String agentgeoscope_latitude = null;
+ @Value("${agentgeoscope_longitude}")
+ private String agentgeoscope_longitude = null;
+ @Value("${agentgeoscope_radius}")
+ private String agentgeoscope_radius = null;
+
+ @Value("${registrations_folder}")
+ private String registrations_folder = null;
+
+ @Value("${embeddedAgentId:agent1}")
+ private String embeddedAgentId = null;
+
+ private Map registrationById = new HashMap();
+ private boolean registrationByIdInitialized = false;
+
+ // private final String dirConfig = System.getProperty("dir.config");
+ // private final String path = new
+ // String("iotbrokerconfig/storageCouchDB/");
+ private final String genericRegistrationIdFile = new String(
+ "genericRegistrationId.dat");
+
+ private ContextMetadata embeddedAgentIdentifier = null;
+
+ // private final String registrationsFile = new String("registrations.dat");
+
+ private EmbeddedAgentIndexerInterface indexer;
+
+ private Ngsi9Interface ngsi9Client;
+
+ private PermanentRegistryInterface permanentRegistry;
+
+ public PermanentRegistryInterface getPermanentRegistry() {
+ return permanentRegistry;
+ }
+
+ public void setPermanentRegistry(
+ PermanentRegistryInterface permanentRegistry) {
+ this.permanentRegistry = permanentRegistry;
+ }
+
+ public EmbeddedAgentIndexerInterface getIndexer() {
+ return indexer;
+ }
+
+ public void setIndexer(EmbeddedAgentIndexerInterface indexer) {
+ this.indexer = indexer;
+ }
+
+ public Ngsi9Interface getNgsi9Client() {
+ return ngsi9Client;
+ }
+
+ public void setNgsi9Client(Ngsi9Interface ngsi9Client) {
+ this.ngsi9Client = ngsi9Client;
+ }
+
+ private LockableRegisterContextRequest getLockableRegisterContextRequestAndLock(
+ String id) {
+
+ if (!registrationByIdInitialized) {
+ initializeRegistrationById();
+ }
+
+ LockableRegisterContextRequest lockableRegisterContextRequest;
+ synchronized (registrationById) {
+ if (registrationById.containsKey(id)) {
+ lockableRegisterContextRequest = registrationById.get(id);
+ lockableRegisterContextRequest.lock();
+ } else {
+ lockableRegisterContextRequest = new LockableRegisterContextRequest(
+ getEmbeddedAgentIdentifier());
+ registrationById.put(id, lockableRegisterContextRequest);
+ lockableRegisterContextRequest.lock();
+ }
+ }
+ return lockableRegisterContextRequest;
+ }
+
+ private synchronized void initializeRegistrationById() {
+
+ if (!registrationByIdInitialized) {
+
+ for (Entry entry : permanentRegistry
+ .getAllRegistrations().entrySet()) {
+
+ ContextRegistration contextRegistration = entry.getValue()
+ .getContextRegistrationList().iterator().next();
+
+ for (EntityId entityId : contextRegistration.getListEntityId()) {
+
+ LockableRegisterContextRequest lockableRegisterContextRequest = new LockableRegisterContextRequest(
+ getEmbeddedAgentIdentifier());
+ lockableRegisterContextRequest
+ .setContextRegistration(contextRegistration);
+ lockableRegisterContextRequest.getRegisterContextRequest()
+ .setRegistrationId(
+ entry.getValue().getRegistrationId());
+
+ registrationById.put(indexer.generateId(entityId),
+ lockableRegisterContextRequest);
+ }
+
+ }
+
+ registrationByIdInitialized = true;
+
+ }
+
+ }
+
+ private ContextMetadata getEmbeddedAgentIdentifier() {
+ if (embeddedAgentIdentifier == null) {
+ embeddedAgentIdentifier = EmbeddedAgentIdentifierFactory
+ .getEmbeddedAgentIdentifier(embeddedAgentId);
+ }
+ return embeddedAgentIdentifier;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see eu.neclab.iotplatform.iotbroker.embeddediotagent.registry.
+ * EmbeddedAgentRegistryInterface#makeGenericRegistration()
+ */
+ @Override
+ public void makeGenericRegistration() {
+
+ // Try to get the previous registrationId if any
+ String registrationId = getGenericRegistrationId();
+ if (registrationId != null) {
+
+ logger.info("Trying to refresh generic ResisterContext with id: "
+ + registrationId);
+ // Try to refresh the registration
+ registrationId = refreshRegistration(registrationId);
+ }
+
+ if (registrationId == null) {
+
+ logger.info("Trying to make a generic ResisterContext");
+
+ RegisterContextResponse response = ngsi9Client
+ .registerContext(createGenericRegistration());
+
+ if (response.getErrorCode() == null
+ || response.getErrorCode().getCode() == 200) {
+
+ logger.info("Generic ResisterContext done: "
+ + response.getRegistrationId());
+
+ storeRegistrationIdOnFile(response.getRegistrationId());
+ } else {
+ logger.info("Impossible to make a generic ResisterContext");
+
+ }
+ } else {
+ storeRegistrationIdOnFile(registrationId);
+ }
+
+ }
+
+ private RegisterContextRequest createGenericRegistration() {
+ RegisterContextRequest registerContextRequest = new RegisterContextRequest();
+
+ List contextRegistrationList = new ArrayList();
+ ContextRegistration contextRegistration = new ContextRegistration();
+ contextRegistrationList.add(contextRegistration);
+
+ List contextMetadataList = new ArrayList();
+ contextRegistration.setListContextMetadata(contextMetadataList);
+
+ List entityIdList = new ArrayList();
+ EntityId entityId = new EntityId(".*", null, true);
+ entityIdList.add(entityId);
+ contextRegistration.setListEntityId(entityIdList);
+
+ List contextRegistrationAttributeList = new ArrayList();
+ contextRegistration
+ .setListContextRegistrationAttribute(contextRegistrationAttributeList);
+
+ if (agentgeoscope_latitude != null && !agentgeoscope_latitude.isEmpty()
+ && agentgeoscope_longitude != null
+ && !agentgeoscope_longitude.isEmpty()
+ && agentgeoscope_radius != null
+ && !agentgeoscope_radius.isEmpty()) {
+ logger.info("agentgeoscope_latitude " + agentgeoscope_latitude
+ + " agentgeoscope_longitude " + agentgeoscope_longitude
+ + " agentgeoscope_radius " + agentgeoscope_radius);
+
+ ContextMetadata contextMetadata = new ContextMetadata();
+ contextMetadata.setName(MetadataTypes.SimpleGeolocation.getName());
+ contextMetadata.setType(MetadataTypes.SimpleGeolocation.getType());
+ contextMetadata.setValue(new Circle(Float
+ .parseFloat(agentgeoscope_latitude), Float
+ .parseFloat(agentgeoscope_longitude), Float
+ .parseFloat(agentgeoscope_radius)));
+ contextMetadataList.add(contextMetadata);
+
+ }
+
+ registerContextRequest
+ .setContextRegistrationList(contextRegistrationList);
+ return registerContextRequest;
+ }
+
+ private String refreshRegistration(String registrationId) {
+ // Create Generic registration
+ RegisterContextRequest registerContextRequest = createGenericRegistration();
+
+ registerContextRequest.setRegistrationId(registrationId);
+
+ RegisterContextResponse response = ngsi9Client
+ .registerContext(registerContextRequest);
+
+ if (response == null) {
+ logger.info("Remote Confman not reachable");
+ return null;
+ } else if (response.getErrorCode() == null
+ || response.getErrorCode().getCode() == 200) {
+ logger.info("ResisterContext refreshed with id: "
+ + response.getRegistrationId());
+
+ return response.getRegistrationId();
+ } else {
+ logger.info("ResisterContext not found in Confman: "
+ + response.getRegistrationId());
+
+ return null;
+ }
+
+ }
+
+ private void storeRegistrationIdOnFile(String registrationId) {
+ PrintWriter writer = null;
+ try {
+ // File file = new File(dirConfig + "/" + path + "/"
+ // + genericRegistrationIdFile);
+ File file = new File(registrations_folder + "/"
+ + genericRegistrationIdFile);
+ if (!file.exists()) {
+ file.createNewFile();
+ } else {
+ file.delete();
+ file.createNewFile();
+ }
+ // writer = new PrintWriter(dirConfig + "/" + path + "/"
+ // + genericRegistrationIdFile, "UTF-8");
+ writer = new PrintWriter(registrations_folder + "/"
+ + genericRegistrationIdFile, "UTF-8");
+ writer.println(registrationId);
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (UnsupportedEncodingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } finally {
+ if (writer != null) {
+ writer.close();
+ }
+ }
+
+ }
+
+ private String getGenericRegistrationId() {
+
+ String registrationId = null;
+
+ // File file = new File(dirConfig + "/" + path + "/"
+ // + genericRegistrationIdFile);
+ File file = new File(registrations_folder + "/"
+ + genericRegistrationIdFile);
+
+ if (!file.exists()) {
+ return null;
+ } else {
+ BufferedReader reader = null;
+ try {
+ reader = new BufferedReader(new FileReader(file));
+ String line = null;
+ while ((line = reader.readLine()) != null) {
+ registrationId = line;
+ }
+ reader.close();
+ } catch (IOException x) {
+ System.err.format("IOException: %s%n", x);
+ } finally {
+ if (reader != null) {
+ try {
+ reader.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ return registrationId;
+
+ }
+
+ public void checkRegistration(List contextElementList) {
+
+ if (logger.isDebugEnabled()){
+ logger.debug("CheckingRegistration for contextElementList: "+contextElementList);
+ }
+
+ if (contextElementList != null && !contextElementList.isEmpty()) {
+ if (contextElementList.size() == 1) {
+ checkRegistration(contextElementList.get(0));
+ } else {
+ List compactedContextElement = compactContextElement(contextElementList);
+
+ for (ContextElement contextElement : compactedContextElement) {
+ checkRegistration(contextElement);
+ }
+ }
+ }
+
+ }
+
+ private List compactContextElement(
+ List contextElementList) {
+
+ Map contextElementById = new HashMap();
+
+ for (ContextElement contextElement : contextElementList) {
+ if (!contextElementById.containsKey(contextElement.getEntityId())) {
+ contextElementById.put(contextElement.getEntityId(),
+ contextElement);
+ } else {
+ ContextElement compactedContextElement = contextElementById
+ .get(contextElement.getEntityId());
+ compactedContextElement.getContextAttributeList().addAll(
+ contextElement.getContextAttributeList());
+
+ if (contextElement.getAttributeDomainName() != null) {
+ compactedContextElement
+ .setAttributeDomainName(contextElement
+ .getAttributeDomainName());
+ }
+
+ if (contextElement.getDomainMetadata() != null
+ && !contextElement.getDomainMetadata().isEmpty()) {
+
+ if (compactedContextElement.getDomainMetadata() != null
+ && !compactedContextElement.getDomainMetadata()
+ .isEmpty()) {
+
+ compactedContextElement
+ .setDomainMetadata(compactContextMetadata(
+ contextElement.getDomainMetadata(),
+ compactedContextElement
+ .getDomainMetadata()));
+
+ } else {
+ compactedContextElement
+ .setDomainMetadata(contextElement
+ .getDomainMetadata());
+ }
+ }
+
+ }
+ }
+
+ return new ArrayList(contextElementById.values());
+
+ }
+
+ private List compactContextMetadata(
+ List contextMetadataList1,
+ List contextMetadataList2) {
+
+ Map contextElementByHash = new HashMap();
+
+ for (ContextMetadata contextMetadata : contextMetadataList1) {
+
+ if (!contextElementByHash.containsKey(contextMetadata)) {
+ contextElementByHash.put(contextMetadata.getName(),
+ contextMetadata);
+ }
+ }
+
+ for (ContextMetadata contextMetadata : contextMetadataList2) {
+
+ if (!contextElementByHash.containsKey(contextMetadata)) {
+ contextElementByHash.put(contextMetadata.getName(),
+ contextMetadata);
+ }
+ }
+
+ return new ArrayList(contextElementByHash.values());
+
+ }
+
+ private boolean checkContextElementVsRegistrations(
+ ContextElement contextElement, RegisterContextRequest registration) {
+
+ ContextRegistration contextRegistration1 = new ContextRegistration();
+ contextRegistration1
+ .setListContextMetadata(new ArrayList(
+ contextElement.getDomainMetadata()));
+ contextRegistration1.getListContextMetadata().add(
+ EmbeddedAgentIdentifierFactory
+ .getEmbeddedAgentIdentifier(embeddedAgentId));
+ contextRegistration1.setListEntityId(new ArrayList());
+ contextRegistration1.getListEntityId()
+ .add(contextElement.getEntityId());
+
+ ContextRegistrationComparator comparator = new ContextRegistrationComparator();
+
+ ContextRegistration contextRegistration2 = new ContextRegistration();
+ contextRegistration2.setListContextMetadata(registration
+ .getContextRegistrationList().iterator().next()
+ .getListContextMetadata());
+ contextRegistration2.setListEntityId(registration
+ .getContextRegistrationList().iterator().next()
+ .getListEntityId());
+
+ int comparison = comparator.compare(contextRegistration1,
+ contextRegistration2);
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("CheckingRegistration "+ (comparison==0) +" for ContextElement: "
+ + contextElement + " versus Registration" + registration);
+ }
+
+ return comparison == 0;
+
+ }
+
+ public void checkRegistration(ContextElement contextElement) {
+ // List contextRegistrationAttributeList =
+ // generateContextRegistrationAttributeList(contextElement
+ // .getContextAttributeList());
+
+ String id = indexer.generateId(contextElement.getEntityId());
+
+ boolean newRegistration = true;
+
+ LockableRegisterContextRequest lockableRegisterContextRequest = getLockableRegisterContextRequestAndLock(id);
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("CheckingRegistration for: " + contextElement);
+ }
+
+ if (!checkContextElementVsRegistrations(contextElement,
+ lockableRegisterContextRequest.getRegisterContextRequest())) {
+
+ if (lockableRegisterContextRequest.getContextRegistration()
+ .getListEntityId().isEmpty()) {
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("This needs a new registration ContextElement: " + contextElement);
+ }
+
+ List entityIdList = new ArrayList();
+ EntityId entityId = contextElement.getEntityId();
+ entityIdList.add(entityId);
+
+ lockableRegisterContextRequest
+ .getContextRegistration()
+ .getListContextMetadata()
+ .addAll(new ArrayList(contextElement
+ .getDomainMetadata()));
+ lockableRegisterContextRequest.getContextRegistration()
+ .setListEntityId(entityIdList);
+ // lockableRegisterContextRequest
+ // .getContextRegistration()
+ // .setListContextRegistrationAttribute(
+ // generateContextRegistrationAttributeList(contextElement
+ // .getContextAttributeList()));
+
+ } else {
+
+ newRegistration = false;
+
+ if (contextElement.getDomainMetadata() != null
+ && !contextElement.getDomainMetadata().isEmpty()) {
+
+ if (lockableRegisterContextRequest.getContextRegistration()
+ .getListContextMetadata() != null
+ && !lockableRegisterContextRequest
+ .getContextRegistration()
+ .getListContextMetadata().isEmpty()) {
+
+ lockableRegisterContextRequest
+ .getContextRegistration()
+ .setListContextMetadata(
+ compactContextMetadata(
+ lockableRegisterContextRequest
+ .getContextRegistration()
+ .getListContextMetadata(),
+ contextElement
+ .getDomainMetadata()));
+
+ } else {
+ lockableRegisterContextRequest.getContextRegistration()
+ .setListContextMetadata(
+ new ArrayList(
+ contextElement
+ .getDomainMetadata()));
+ }
+ }
+ }
+
+ RegisterContextResponse registerContextResponse = ngsi9Client
+ .registerContext(lockableRegisterContextRequest
+ .getRegisterContextRequest());
+
+ lockableRegisterContextRequest.getRegisterContextRequest()
+ .setRegistrationId(
+ registerContextResponse.getRegistrationId());
+
+ if (!newRegistration) {
+ permanentRegistry.deleteRegistration(id);
+ }
+ permanentRegistry.storeRegistration(id,
+ lockableRegisterContextRequest.getRegisterContextRequest());
+
+ }
+
+ lockableRegisterContextRequest.unlock();
+
+ }
+
+ // public RegisterContextResponse registerContext(
+ // RegisterContextRequest request, URI uri) {
+ //
+ // /*
+ // * This is implemented analogously to queryContext. See the comments
+ // * there for clarification.
+ // */
+ //
+ // RegisterContextResponse output = new RegisterContextResponse();
+ //
+ // try {
+ //
+ // // get address of local host
+ // // InetAddress thisIp = InetAddress.getLocalHost();
+ //
+ // // initialize http connection
+ // URL url = new URL(uri.toString());
+ // HttpConnectionClient connection = new HttpConnectionClient();
+ //
+ // String resource;
+ // if (url.toString().matches(".*/")) {
+ // resource = "registerContext";
+ // } else {
+ // resource = "/registerContext";
+ // }
+ //
+ // String respObj = connection.initializeConnection(url, resource,
+ // "POST", request, "application/xml", "");
+ //
+ // if (respObj != null) {
+ //
+ // output = (RegisterContextResponse) xmlFactory
+ // .convertStringToXml(respObj,
+ // SubscribeContextResponse.class);
+ //
+ // return output;
+ //
+ // }
+ //
+ // } catch (MalformedURLException e) {
+ // e.printStackTrace();
+ // } catch (IOException e) {
+ // e.printStackTrace();
+ // }
+ //
+ // return output;
+ //
+ // }
+
+ //
+ // private void queueContextRegistration(
+ // String id,
+ // List
+ // actualContextRegistrationAttributeList,
+ // List
+ // receivedContextRegistrationAttributeList) {
+ // LockableRegisterContextRequest lockableRegisterContextRequest =
+ // getLockableRegisterContextRequestAndLock(id);
+ //
+ //
+ //
+ // }
+
+ private List calculateNewContextRegistrationAttributes(
+ String id,
+ List actualContextRegistrationAttributeList,
+ List receivedContextRegistrationAttributeList) {
+
+ /*
+ * This list will contain the new ContextRegistrationAttributeList seen
+ */
+ List newContextRegistrationAttributeList = new ArrayList();
+
+ /*
+ * If there is not a previous registration just create an empty array
+ */
+ List o1List = actualContextRegistrationAttributeList;
+ List o2List = receivedContextRegistrationAttributeList;
+
+ /*
+ * Sort the lists
+ */
+ ContextRegistrationAttributeComparator contextRegistrationAttributeComparator = new ContextRegistrationAttributeComparator();
+ Collections.sort(o1List, contextRegistrationAttributeComparator);
+ Collections.sort(o2List, contextRegistrationAttributeComparator);
+
+ /*
+ * Create the iterator
+ */
+ Iterator contextRegistrationIterator1 = o1List
+ .iterator();
+ Iterator contextRegistrationIterator2 = o2List
+ .iterator();
+
+ if (!contextRegistrationIterator1.hasNext()) {
+ /*
+ * Add all
+ */
+ newContextRegistrationAttributeList = contextRegistrationAttributeSet(
+ contextRegistrationIterator2,
+ contextRegistrationAttributeComparator);
+ } else {
+
+ ContextRegistrationAttribute contextRegistrationAttribute1 = contextRegistrationIterator1
+ .next();
+ ContextRegistrationAttribute contextRegistrationAttribute2 = contextRegistrationIterator2
+ .next();
+
+ int comp = contextRegistrationAttributeComparator.compare(
+ contextRegistrationAttribute1,
+ contextRegistrationAttribute2);
+
+ while (contextRegistrationIterator2.hasNext()) {
+ if (comp == 0) {
+ if (contextRegistrationIterator1.hasNext()) {
+ contextRegistrationAttribute1 = contextRegistrationIterator1
+ .next();
+ } else {
+ newContextRegistrationAttributeList
+ .addAll(contextRegistrationAttributeSet(
+ contextRegistrationIterator2,
+ contextRegistrationAttributeComparator));
+ break;
+ }
+ contextRegistrationAttribute2 = nextDifferentContextRegistrationAttribute(
+ contextRegistrationAttribute2,
+ contextRegistrationIterator1,
+ contextRegistrationAttributeComparator);
+ if (contextRegistrationAttribute2 == null) {
+ break;
+ }
+ comp = contextRegistrationAttributeComparator.compare(
+ contextRegistrationAttribute1,
+ contextRegistrationAttribute2);
+ } else if (comp < 0) {
+ if (contextRegistrationIterator1.hasNext()) {
+ contextRegistrationAttribute1 = contextRegistrationIterator1
+ .next();
+ } else {
+ newContextRegistrationAttributeList
+ .addAll(contextRegistrationAttributeSet(
+ contextRegistrationIterator2,
+ contextRegistrationAttributeComparator));
+ break;
+ }
+ comp = contextRegistrationAttributeComparator.compare(
+ contextRegistrationAttribute1,
+ contextRegistrationAttribute2);
+ } else {
+ newContextRegistrationAttributeList
+ .add(contextRegistrationAttribute2);
+
+ contextRegistrationAttribute2 = nextDifferentContextRegistrationAttribute(
+ contextRegistrationAttribute2,
+ contextRegistrationIterator1,
+ contextRegistrationAttributeComparator);
+
+ if (contextRegistrationAttribute2 == null) {
+ break;
+ }
+ comp = contextRegistrationAttributeComparator.compare(
+ contextRegistrationAttribute1,
+ contextRegistrationAttribute2);
+ }
+
+ }
+ }
+ return newContextRegistrationAttributeList;
+
+ }
+
+ // private List