Merge branch 'next' into edit-wot-trust
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Wed, 15 Dec 2010 07:27:42 +0000 (08:27 +0100)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Wed, 15 Dec 2010 07:27:42 +0000 (08:27 +0100)
1  2 
pom.xml
src/main/java/net/pterodactylus/sone/core/Core.java
src/main/java/net/pterodactylus/sone/main/SonePlugin.java

diff --combined pom.xml
+++ b/pom.xml
@@@ -2,12 -2,12 +2,12 @@@
        <modelVersion>4.0.0</modelVersion>
        <groupId>net.pterodactylus</groupId>
        <artifactId>sone</artifactId>
-       <version>0.3.2</version>
+       <version>0.3.4</version>
        <dependencies>
                <dependency>
                        <groupId>net.pterodactylus</groupId>
                        <artifactId>utils</artifactId>
 -                      <version>0.7.3</version>
 +                      <version>0.7.4</version>
                </dependency>
                <dependency>
                        <groupId>junit</groupId>
@@@ -40,8 -40,6 +40,8 @@@ import net.pterodactylus.sone.freenet.w
  import net.pterodactylus.sone.freenet.wot.IdentityListener;
  import net.pterodactylus.sone.freenet.wot.IdentityManager;
  import net.pterodactylus.sone.freenet.wot.OwnIdentity;
 +import net.pterodactylus.sone.freenet.wot.Trust;
 +import net.pterodactylus.sone.freenet.wot.WebOfTrustException;
  import net.pterodactylus.sone.main.SonePlugin;
  import net.pterodactylus.util.config.Configuration;
  import net.pterodactylus.util.config.ConfigurationException;
@@@ -146,9 -144,6 +146,9 @@@ public class Core implements IdentityLi
        /** All known replies. */
        private Set<String> knownReplies = new HashSet<String>();
  
 +      /** Trusted identities, sorted by own identities. */
 +      private Map<OwnIdentity, Set<Identity>> trustedIdentities = Collections.synchronizedMap(new HashMap<OwnIdentity, Set<Identity>>());
 +
        /**
         * Creates a new core.
         *
        }
  
        /**
 +       * Returns whether the target Sone is trusted by the origin Sone.
 +       *
 +       * @param origin
 +       *            The origin Sone
 +       * @param target
 +       *            The target Sone
 +       * @return {@code true} if the target Sone is trusted by the origin Sone
 +       */
 +      public boolean isSoneTrusted(Sone origin, Sone target) {
 +              return trustedIdentities.containsKey(origin) && trustedIdentities.get(origin.getIdentity()).contains(target);
 +      }
 +
 +      /**
         * Returns the post with the given ID.
         *
         * @param postId
         */
        public void lockSone(Sone sone) {
                synchronized (lockedSones) {
-                       lockedSones.add(sone);
+                       if (lockedSones.add(sone)) {
+                               coreListenerManager.fireSoneLocked(sone);
+                       }
                }
        }
  
         */
        public void unlockSone(Sone sone) {
                synchronized (lockedSones) {
-                       lockedSones.remove(sone);
+                       if (lockedSones.remove(sone)) {
+                               coreListenerManager.fireSoneUnlocked(sone);
+                       }
                }
        }
  
         * @return The created Sone
         */
        public Sone createSone(OwnIdentity ownIdentity) {
 -              identityManager.addContext(ownIdentity, "Sone");
 +              try {
 +                      ownIdentity.addContext("Sone");
 +              } catch (WebOfTrustException wote1) {
 +                      logger.log(Level.SEVERE, "Could not add “Sone” context to own identity: " + ownIdentity, wote1);
 +                      return null;
 +              }
                Sone sone = addLocalSone(ownIdentity);
                return sone;
        }
        }
  
        /**
 +       * Retrieves the trust relationship from the origin to the target.
 +       *
 +       * @param origin
 +       *            The origin of the trust tree
 +       * @param target
 +       *            The target of the trust
 +       * @return The trust relationship
 +       */
 +      public Trust getTrust(Sone origin, Sone target) {
 +              if (!isLocalSone(origin)) {
 +                      logger.log(Level.WARNING, "Tried to get trust from remote Sone: %s", origin);
 +                      return null;
 +              }
 +              try {
 +                      return target.getIdentity().getTrust((OwnIdentity) origin.getIdentity());
 +              } catch (WebOfTrustException wote1) {
 +                      logger.log(Level.WARNING, "Could not get trust for Sone: " + target, wote1);
 +                      return null;
 +              }
 +      }
 +
 +      /**
         * Updates the stores Sone with the given Sone.
         *
         * @param sone
                        localSones.remove(sone.getId());
                        soneInserters.remove(sone).stop();
                }
 -              identityManager.removeContext((OwnIdentity) sone.getIdentity(), "Sone");
 -              identityManager.removeProperty((OwnIdentity) sone.getIdentity(), "Sone.LatestEdition");
 +              try {
 +                      ((OwnIdentity) sone.getIdentity()).removeContext("Sone");
 +                      ((OwnIdentity) sone.getIdentity()).removeProperty("Sone.LatestEdition");
 +              } catch (WebOfTrustException wote1) {
 +                      logger.log(Level.WARNING, "Could not remove context and properties from Sone: " + sone, wote1);
 +              }
                try {
                        configuration.getLongValue("Sone/" + sone.getId() + "/Time").setValue(null);
                } catch (ConfigurationException ce1) {
         * @param sone
         *            The Sone to save
         */
-       public void saveSone(Sone sone) {
+       public synchronized void saveSone(Sone sone) {
                if (!isLocalSone(sone)) {
                        logger.log(Level.FINE, "Tried to save non-local Sone: %s", sone);
                        return;
                }
  
                logger.log(Level.INFO, "Saving Sone: %s", sone);
 -              identityManager.setProperty((OwnIdentity) sone.getIdentity(), "Sone.LatestEdition", String.valueOf(sone.getLatestEdition()));
                try {
 +                      ((OwnIdentity) sone.getIdentity()).setProperty("Sone.LatestEdition", String.valueOf(sone.getLatestEdition()));
 +
                        /* save Sone into configuration. */
                        String sonePrefix = "Sone/" + sone.getId();
                        configuration.getLongValue(sonePrefix + "/Time").setValue(sone.getTime());
                        }
                        configuration.getStringValue(sonePrefix + "/Friends/" + friendCounter + "/ID").setValue(null);
  
+                       configuration.save();
                        logger.log(Level.INFO, "Sone %s saved.", sone);
                } catch (ConfigurationException ce1) {
                        logger.log(Level.WARNING, "Could not save Sone: " + sone, ce1);
 +              } catch (WebOfTrustException wote1) {
 +                      logger.log(Level.WARNING, "Could not set WoT property for Sone: " + sone, wote1);
                }
        }
  
        /**
         * Saves the current options.
         */
-       public void saveConfiguration() {
+       public synchronized void saveConfiguration() {
                /* store the options first. */
                try {
                        configuration.getIntValue("Option/InsertionDelay").setValue(options.getIntegerOption("InsertionDelay").getReal());
        public void ownIdentityAdded(OwnIdentity ownIdentity) {
                logger.log(Level.FINEST, "Adding OwnIdentity: " + ownIdentity);
                if (ownIdentity.hasContext("Sone")) {
 +                      trustedIdentities.put(ownIdentity, Collections.synchronizedSet(new HashSet<Identity>()));
                        addLocalSone(ownIdentity);
                }
        }
        @Override
        public void ownIdentityRemoved(OwnIdentity ownIdentity) {
                logger.log(Level.FINEST, "Removing OwnIdentity: " + ownIdentity);
 +              trustedIdentities.remove(ownIdentity);
        }
  
        /**
         * {@inheritDoc}
         */
        @Override
 -      public void identityAdded(Identity identity) {
 +      public void identityAdded(OwnIdentity ownIdentity, Identity identity) {
                logger.log(Level.FINEST, "Adding Identity: " + identity);
 +              trustedIdentities.get(ownIdentity).add(identity);
                addRemoteSone(identity);
        }
  
         * {@inheritDoc}
         */
        @Override
 -      public void identityUpdated(final Identity identity) {
 +      public void identityUpdated(OwnIdentity ownIdentity, final Identity identity) {
                new Thread(new Runnable() {
  
                        @Override
         * {@inheritDoc}
         */
        @Override
 -      public void identityRemoved(Identity identity) {
 -              /* TODO */
 +      public void identityRemoved(OwnIdentity ownIdentity, Identity identity) {
 +              trustedIdentities.get(ownIdentity).remove(identity);
        }
  
  }
@@@ -25,8 -25,8 +25,8 @@@ import java.util.logging.Logger
  import net.pterodactylus.sone.core.Core;
  import net.pterodactylus.sone.core.FreenetInterface;
  import net.pterodactylus.sone.freenet.PluginStoreConfigurationBackend;
 +import net.pterodactylus.sone.freenet.plugin.PluginConnector;
  import net.pterodactylus.sone.freenet.wot.IdentityManager;
 -import net.pterodactylus.sone.freenet.wot.PluginConnector;
  import net.pterodactylus.sone.freenet.wot.WebOfTrustConnector;
  import net.pterodactylus.sone.web.WebInterface;
  import net.pterodactylus.util.config.Configuration;
@@@ -44,7 -44,6 +44,6 @@@ import freenet.pluginmanager.FredPlugin
  import freenet.pluginmanager.FredPluginThreadless;
  import freenet.pluginmanager.FredPluginVersioned;
  import freenet.pluginmanager.PluginRespirator;
- import freenet.pluginmanager.PluginStore;
  
  /**
   * This class interfaces with Freenet. It is the class that is loaded by the
@@@ -79,7 -78,7 +78,7 @@@ public class SonePlugin implements Fred
        }
  
        /** The version. */
-       public static final Version VERSION = new Version(0, 3, 2);
+       public static final Version VERSION = new Version(0, 3, 4);
  
        /** The logger. */
        private static final Logger logger = Logging.getLogger(SonePlugin.class);
@@@ -96,9 -95,6 +95,6 @@@
        /** The l10n helper. */
        private PluginL10n l10n;
  
-       /** The plugin store. */
-       private PluginStore pluginStore;
        /** The identity manager. */
        private IdentityManager identityManager;
  
                /* create a configuration. */
                Configuration oldConfiguration;
                Configuration newConfiguration = null;
+               boolean firstStart = !new File("sone.properties").exists();
+               boolean newConfig = false;
                try {
                        oldConfiguration = new Configuration(new MapConfigurationBackend(new File("sone.properties"), false));
                        newConfiguration = oldConfiguration;
                } catch (ConfigurationException ce1) {
+                       newConfig = true;
                        logger.log(Level.INFO, "Could not load configuration file, trying plugin store…", ce1);
                        try {
                                newConfiguration = new Configuration(new MapConfigurationBackend(new File("sone.properties"), true));
                                core.setConfiguration(newConfiguration);
                        }
                        webInterface.start();
+                       webInterface.setFirstStart(firstStart);
+                       webInterface.setNewConfig(newConfig);
                        identityManager.start();
                        startupFailed = false;
                } finally {
  
                        /* stop the identity manager. */
                        identityManager.stop();
-                       /* TODO wait for core to stop? */
-                       try {
-                               pluginRespirator.putStore(pluginStore);
-                       } catch (DatabaseDisabledException dde1) {
-                               logger.log(Level.WARNING, "Could not store plugin store, database is disabled.", dde1);
-                       }
+               } catch (Throwable t1) {
+                       logger.log(Level.SEVERE, "Error while shutting down!", t1);
                } finally {
                        /* shutdown logger. */
                        Logging.shutdown();