Only allow a single trust update for any given identity pair.
[Sone.git] / src / main / java / net / pterodactylus / sone / core / TrustUpdater.java
index a86b353..be6f39c 100644 (file)
@@ -78,7 +78,15 @@ public class TrustUpdater extends AbstractService {
         *            The identity receiving the trust
         */
        public void getTrust(OwnIdentity truster, Identity trustee) {
-               updateJobs.add(new GetTrustJob(truster, trustee));
+               GetTrustJob getTrustJob = new GetTrustJob(truster, trustee);
+               if (!updateJobs.contains(getTrustJob)) {
+                       logger.log(Level.FINER, "Adding Trust Update Job: " + getTrustJob);
+                       try {
+                               updateJobs.put(getTrustJob);
+                       } catch (InterruptedException ie1) {
+                               /* the queue is unbounded so it should never block. */
+                       }
+               }
        }
 
        /**
@@ -97,7 +105,16 @@ public class TrustUpdater extends AbstractService {
         *            The comment of the trust relation
         */
        public void setTrust(OwnIdentity truster, Identity trustee, Integer score, String comment) {
-               updateJobs.add(new SetTrustJob(truster, trustee, score, comment));
+               SetTrustJob setTrustJob = new SetTrustJob(truster, trustee, score, comment);
+               if (updateJobs.contains(setTrustJob)) {
+                       updateJobs.remove(setTrustJob);
+               }
+               logger.log(Level.FINER, "Adding Trust Update Job: " + setTrustJob);
+               try {
+                       updateJobs.put(setTrustJob);
+               } catch (InterruptedException e) {
+                       /* the queue is unbounded so it should never block. */
+               }
        }
 
        //
@@ -173,6 +190,38 @@ public class TrustUpdater extends AbstractService {
                        /* does nothing. */
                }
 
+               //
+               // OBJECT METHODS
+               //
+
+               /**
+                * {@inheritDoc}
+                */
+               @Override
+               public boolean equals(Object object) {
+                       if ((object == null) || !object.getClass().equals(getClass())) {
+                               return false;
+                       }
+                       TrustUpdateJob updateJob = (TrustUpdateJob) object;
+                       return ((truster == null) ? (updateJob.truster == null) : updateJob.truster.equals(truster)) && ((trustee == null) ? (updateJob.trustee == null) : updateJob.trustee.equals(trustee));
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               @Override
+               public int hashCode() {
+                       return ((truster == null) ? 0 : truster.hashCode()) ^ ((trustee == null) ? 0 : trustee.hashCode());
+               }
+
+               /**
+                * {@inheritDoc}
+                */
+               @Override
+               public String toString() {
+                       return String.format("%s[truster=%s,trustee=%s]", getClass().getSimpleName(), (truster == null) ? null : truster.getId(), (trustee == null) ? null : trustee.getId());
+               }
+
        }
 
        /**