+ public IdentityManager getIdentityManager() {
+ return identityManager;
+ }
+
+ /**
+ * Returns the status of the given Sone.
+ *
+ * @param sone
+ * The Sone to get the status for
+ * @return The status of the Sone
+ */
+ public SoneStatus getSoneStatus(Sone sone) {
+ synchronized (soneStatuses) {
+ return soneStatuses.get(sone);
+ }
+ }
+
+ /**
+ * Sets the status of the given Sone.
+ *
+ * @param sone
+ * The Sone to set the status of
+ * @param soneStatus
+ * The status to set
+ */
+ public void setSoneStatus(Sone sone, SoneStatus soneStatus) {
+ synchronized (soneStatuses) {
+ soneStatuses.put(sone, soneStatus);
+ }
+ }
+
+ /**
+ * Returns all Sones, remote and local.
+ *
+ * @return All Sones
+ */
+ public Set<Sone> getSones() {
+ Set<Sone> allSones = new HashSet<Sone>();
+ allSones.addAll(getLocalSones());
+ allSones.addAll(getRemoteSones());
+ return allSones;
+ }
+
+ /**
+ * Returns the Sone with the given ID, regardless whether it’s local or
+ * remote.
+ *
+ * @param id
+ * The ID of the Sone to get
+ * @return The Sone with the given ID, or {@code null} if there is no such
+ * Sone
+ */
+ public Sone getSone(String id) {
+ return getSone(id, true);
+ }
+
+ /**
+ * Returns the Sone with the given ID, regardless whether it’s local or
+ * remote.
+ *
+ * @param id
+ * The ID of the Sone to get
+ * @param create
+ * {@code true} to create a new Sone if none exists,
+ * {@code false} to return {@code null} if a Sone with the given
+ * ID does not exist
+ * @return The Sone with the given ID, or {@code null} if there is no such
+ * Sone
+ */
+ public Sone getSone(String id, boolean create) {
+ if (isLocalSone(id)) {
+ return getLocalSone(id);
+ }
+ return getRemoteSone(id, create);
+ }
+
+ /**
+ * Checks whether the core knows a Sone with the given ID.
+ *
+ * @param id
+ * The ID of the Sone
+ * @return {@code true} if there is a Sone with the given ID, {@code false}
+ * otherwise
+ */
+ public boolean hasSone(String id) {
+ return isLocalSone(id) || isRemoteSone(id);
+ }
+
+ /**
+ * Returns whether the given Sone is a local Sone.
+ *
+ * @param sone
+ * The Sone to check for its locality
+ * @return {@code true} if the given Sone is local, {@code false} otherwise
+ */
+ public boolean isLocalSone(Sone sone) {
+ synchronized (localSones) {
+ return localSones.containsKey(sone.getId());
+ }
+ }
+
+ /**
+ * Returns whether the given ID is the ID of a local Sone.
+ *
+ * @param id
+ * The Sone ID to check for its locality
+ * @return {@code true} if the given ID is a local Sone, {@code false}
+ * otherwise
+ */
+ public boolean isLocalSone(String id) {
+ synchronized (localSones) {
+ return localSones.containsKey(id);
+ }
+ }
+
+ /**
+ * Returns all local Sones.
+ *
+ * @return All local Sones
+ */
+ public Set<Sone> getLocalSones() {
+ synchronized (localSones) {
+ return new HashSet<Sone>(localSones.values());
+ }
+ }
+
+ /**
+ * Returns the local Sone with the given ID.
+ *
+ * @param id
+ * The ID of the Sone to get
+ * @return The Sone with the given ID
+ */
+ public Sone getLocalSone(String id) {
+ return getLocalSone(id, true);
+ }
+
+ /**
+ * Returns the local Sone with the given ID, optionally creating a new Sone.
+ *
+ * @param id
+ * The ID of the Sone
+ * @param create
+ * {@code true} to create a new Sone if none exists,
+ * {@code false} to return null if none exists
+ * @return The Sone with the given ID, or {@code null}
+ */
+ public Sone getLocalSone(String id, boolean create) {
+ synchronized (localSones) {
+ Sone sone = localSones.get(id);
+ if ((sone == null) && create) {
+ sone = new Sone(id);
+ localSones.put(id, sone);
+ }
+ return sone;
+ }
+ }
+
+ /**
+ * Returns all remote Sones.
+ *
+ * @return All remote Sones
+ */
+ public Set<Sone> getRemoteSones() {
+ synchronized (remoteSones) {
+ return new HashSet<Sone>(remoteSones.values());
+ }
+ }
+
+ /**
+ * Returns the remote Sone with the given ID.
+ *
+ * @param id
+ * The ID of the remote Sone to get
+ * @return The Sone with the given ID
+ */
+ public Sone getRemoteSone(String id) {
+ return getRemoteSone(id, true);
+ }
+
+ /**
+ * Returns the remote Sone with the given ID.
+ *
+ * @param id
+ * The ID of the remote Sone to get
+ * @param create
+ * {@code true} to always create a Sone, {@code false} to return
+ * {@code null} if no Sone with the given ID exists
+ * @return The Sone with the given ID
+ */
+ public Sone getRemoteSone(String id, boolean create) {
+ synchronized (remoteSones) {
+ Sone sone = remoteSones.get(id);
+ if ((sone == null) && create) {
+ sone = new Sone(id);
+ remoteSones.put(id, sone);
+ }
+ return sone;
+ }
+ }
+
+ /**
+ * Returns whether the given Sone is a remote Sone.
+ *
+ * @param sone
+ * The Sone to check
+ * @return {@code true} if the given Sone is a remote Sone, {@code false}
+ * otherwise
+ */
+ public boolean isRemoteSone(Sone sone) {
+ synchronized (remoteSones) {
+ return remoteSones.containsKey(sone.getId());
+ }
+ }
+
+ /**
+ * Returns whether the Sone with the given ID is a remote Sone.
+ *
+ * @param id
+ * The ID of the Sone to check
+ * @return {@code true} if the Sone with the given ID is a remote Sone,
+ * {@code false} otherwise
+ */
+ public boolean isRemoteSone(String id) {
+ synchronized (remoteSones) {
+ return remoteSones.containsKey(id);
+ }
+ }
+
+ /**
+ * Returns whether the given Sone is a new Sone. After this check, the Sone
+ * is marked as known, i.e. a second call with the same parameters will
+ * always yield {@code false}.
+ *
+ * @param sone
+ * The sone to check for
+ * @return {@code true} if the given Sone is new, false otherwise
+ */
+ public boolean isNewSone(Sone sone) {
+ synchronized (newSones) {
+ boolean isNew = !knownSones.contains(sone.getId()) && newSones.remove(sone.getId());
+ knownSones.add(sone.getId());
+ if (isNew) {
+ coreListenerManager.fireMarkSoneKnown(sone);
+ }
+ return isNew;
+ }
+ }
+
+ /**
+ * Returns whether the given Sone has been modified.
+ *
+ * @param sone
+ * The Sone to check for modifications
+ * @return {@code true} if a modification has been detected in the Sone,
+ * {@code false} otherwise
+ */
+ public boolean isModifiedSone(Sone sone) {
+ return (soneInserters.containsKey(sone)) ? soneInserters.get(sone).isModified() : false;