Merge branch 'partial-rewrite' into next
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sat, 29 Jun 2013 11:11:47 +0000 (13:11 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sat, 29 Jun 2013 14:05:39 +0000 (16:05 +0200)
1  2 
pom.xml
src/main/java/net/pterodactylus/sone/fcp/FcpInterface.java
src/main/java/net/pterodactylus/sone/fcp/LockSoneCommand.java
src/main/java/net/pterodactylus/sone/fcp/UnlockSoneCommand.java
src/main/resources/i18n/sone.fr.properties
src/test/java/net/pterodactylus/sone/fcp/LockSoneCommandTest.java
src/test/java/net/pterodactylus/sone/fcp/UnlockSoneCommandTest.java

diff --combined pom.xml
+++ b/pom.xml
                <dependency>
                        <groupId>junit</groupId>
                        <artifactId>junit</artifactId>
 -                      <version>3.8.2</version>
 +                      <version>4.11</version>
 +                      <scope>test</scope>
 +              </dependency>
 +              <dependency>
 +                      <groupId>org.mockito</groupId>
 +                      <artifactId>mockito-all</artifactId>
 +                      <version>1.9.5</version>
                        <scope>test</scope>
                </dependency>
                <dependency>
                        <artifactId>utils.json</artifactId>
                        <version>0.1</version>
                </dependency>
+               <dependency>
+                       <groupId>com.google.inject</groupId>
+                       <artifactId>guice</artifactId>
+                       <version>3.0</version>
+               </dependency>
+               <dependency>
+                       <groupId>com.google.guava</groupId>
+                       <artifactId>guava</artifactId>
+                       <version>14.0-rc1</version>
+               </dependency>
+               <dependency>
+                       <groupId>commons-lang</groupId>
+                       <artifactId>commons-lang</artifactId>
+                       <version>2.6</version>
+               </dependency>
        </dependencies>
        <repositories>
                <repository>
@@@ -53,6 -62,7 +68,7 @@@
                        <plugin>
                                <groupId>org.apache.maven.plugins</groupId>
                                <artifactId>maven-compiler-plugin</artifactId>
+                               <version>2.0.2</version>
                                <configuration>
                                        <source>1.6</source>
                                        <target>1.6</target>
@@@ -61,6 -71,7 +77,7 @@@
                        <plugin>
                                <groupId>org.apache.maven.plugins</groupId>
                                <artifactId>maven-jar-plugin</artifactId>
+                               <version>2.2</version>
                                <configuration>
                                        <archive>
                                                <manifestEntries>
                                        </execution>
                                </executions>
                        </plugin>
-               </plugins>
-       </build>
-       <reporting>
-               <plugins>
                        <plugin>
                                <groupId>org.apache.maven.plugins</groupId>
                                <artifactId>maven-javadoc-plugin</artifactId>
+                               <version>2.7</version>
                                <configuration>
-                                       <links>
-                                               <link>http://download.oracle.com/javase/6/docs/api/</link>
-                                               <link>http://java.pterodactylus.net/utils/apidocs/</link>
-                                               <link>http://java.pterodactylus.net/utils.json/apidocs/</link>
-                                       </links>
+                                       <detectLinks>true</detectLinks>
+                                       <detectJavaApiLink>true</detectJavaApiLink>
+                                       <show>private</show>
+                                       <footer>© 2010–2013 David ‘Bombe’ Roden</footer>
                                </configuration>
                        </plugin>
                </plugins>
-       </reporting>
+       </build>
  </project>
@@@ -1,5 -1,5 +1,5 @@@
  /*
-  * Sone - FcpInterface.java - Copyright © 2011–2012 David Roden
+  * Sone - FcpInterface.java - Copyright © 2011–2013 David Roden
   *
   * This program is free software: you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
@@@ -17,6 -17,8 +17,8 @@@
  
  package net.pterodactylus.sone.fcp;
  
+ import static com.google.common.base.Preconditions.checkNotNull;
  import java.util.Collections;
  import java.util.HashMap;
  import java.util.Map;
@@@ -28,7 -30,9 +30,9 @@@ import net.pterodactylus.sone.freenet.f
  import net.pterodactylus.sone.freenet.fcp.Command.ErrorResponse;
  import net.pterodactylus.sone.freenet.fcp.Command.Response;
  import net.pterodactylus.util.logging.Logging;
- import net.pterodactylus.util.validation.Validation;
+ import com.google.inject.Inject;
  import freenet.pluginmanager.FredPluginFCP;
  import freenet.pluginmanager.PluginNotFoundException;
  import freenet.pluginmanager.PluginReplySender;
@@@ -79,6 -83,7 +83,7 @@@ public class FcpInterface 
         * @param core
         *            The core
         */
+       @Inject
        public FcpInterface(Core core) {
                commands.put("Version", new VersionCommand(core));
                commands.put("GetLocalSones", new GetLocalSonesCommand(core));
@@@ -87,8 -92,6 +92,8 @@@
                commands.put("GetPost", new GetPostCommand(core));
                commands.put("GetPosts", new GetPostsCommand(core));
                commands.put("GetPostFeed", new GetPostFeedCommand(core));
 +              commands.put("LockSone", new LockSoneCommand(core));
 +              commands.put("UnlockSone", new UnlockSoneCommand(core));
                commands.put("LikePost", new LikePostCommand(core));
                commands.put("LikeReply", new LikeReplyCommand(core));
                commands.put("CreatePost", new CreatePostCommand(core));
         *            The action level for which full FCP access is required
         */
        public void setFullAccessRequired(FullAccessRequired fullAccessRequired) {
-               Validation.begin().isNotNull("FullAccessRequired", fullAccessRequired).check();
-               this.fullAccessRequired = fullAccessRequired;
+               this.fullAccessRequired = checkNotNull(fullAccessRequired, "fullAccessRequired must not be null");
        }
  
        //
index 2a0c81a,0000000..5cad8ca
mode 100644,000000..100644
--- /dev/null
@@@ -1,58 -1,0 +1,60 @@@
-               Sone sone = getSone(parameters, "Sone", true, true);
-               getCore().lockSone(sone);
-               return new Response("SoneLocked", new SimpleFieldSetBuilder().put("Sone", sone.getId()).get());
 +/*
 + * Sone - LockSoneCommand.java - Copyright © 2013 David Roden
 + *
 + * This program is free software: you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
 + * the Free Software Foundation, either version 3 of the License, or
 + * (at your option) any later version.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU General Public License for more details.
 + *
 + * You should have received a copy of the GNU General Public License
 + * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 + */
 +
 +package net.pterodactylus.sone.fcp;
 +
 +import net.pterodactylus.sone.core.Core;
 +import net.pterodactylus.sone.data.Sone;
 +import net.pterodactylus.sone.freenet.SimpleFieldSetBuilder;
 +import net.pterodactylus.sone.freenet.fcp.FcpException;
 +
 +import freenet.support.SimpleFieldSet;
 +import freenet.support.api.Bucket;
 +
++import com.google.common.base.Optional;
++
 +/**
 + * Implements the “LockSone” FCP command. If a valid local Sone was given as
 + * parameter “Sone,” this command will always lock the Sone and reply with
 + * “SoneLocked.”
 + *
 + * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
 + */
 +public class LockSoneCommand extends AbstractSoneCommand {
 +
 +      /**
 +       * Creates a new “LockSone” FCP command.
 +       *
 +       * @param core
 +       *              The core to operate on
 +       */
 +      public LockSoneCommand(Core core) {
 +              super(core, true);
 +      }
 +
 +      //
 +      // COMMAND METHODS
 +      //
 +
 +      @Override
 +      public Response execute(SimpleFieldSet parameters, Bucket data, AccessType accessType) throws FcpException {
++              Optional<Sone> sone = getSone(parameters, "Sone", true, true);
++              getCore().lockSone(sone.get());
++              return new Response("SoneLocked", new SimpleFieldSetBuilder().put("Sone", sone.get().getId()).get());
 +      }
 +
 +}
index a187576,0000000..7ecfada
mode 100644,000000..100644
--- /dev/null
@@@ -1,58 -1,0 +1,60 @@@
-               Sone sone = getSone(parameters, "Sone", true, true);
-               getCore().unlockSone(sone);
-               return new Response("SoneUnlocked", new SimpleFieldSetBuilder().put("Sone", sone.getId()).get());
 +/*
 + * Sone - LockSoneCommand.java - Copyright © 2013 David Roden
 + *
 + * This program is free software: you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
 + * the Free Software Foundation, either version 3 of the License, or
 + * (at your option) any later version.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU General Public License for more details.
 + *
 + * You should have received a copy of the GNU General Public License
 + * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 + */
 +
 +package net.pterodactylus.sone.fcp;
 +
 +import net.pterodactylus.sone.core.Core;
 +import net.pterodactylus.sone.data.Sone;
 +import net.pterodactylus.sone.freenet.SimpleFieldSetBuilder;
 +import net.pterodactylus.sone.freenet.fcp.FcpException;
 +
 +import freenet.support.SimpleFieldSet;
 +import freenet.support.api.Bucket;
 +
++import com.google.common.base.Optional;
++
 +/**
 + * Implements the “UnlockSone” FCP command. If a valid local Sone was given as
 + * parameter “Sone,” this command will always unlock the Sone and reply with
 + * “SoneUnlocked.”
 + *
 + * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
 + */
 +public class UnlockSoneCommand extends AbstractSoneCommand {
 +
 +      /**
 +       * Creates a new “LockSone” FCP command.
 +       *
 +       * @param core
 +       *              The core to operate on
 +       */
 +      public UnlockSoneCommand(Core core) {
 +              super(core, true);
 +      }
 +
 +      //
 +      // COMMAND METHODS
 +      //
 +
 +      @Override
 +      public Response execute(SimpleFieldSet parameters, Bucket data, AccessType accessType) throws FcpException {
++              Optional<Sone> sone = getSone(parameters, "Sone", true, true);
++              getCore().unlockSone(sone.get());
++              return new Response("SoneUnlocked", new SimpleFieldSetBuilder().put("Sone", sone.get().getId()).get());
 +      }
 +
 +}
@@@ -4,9 -4,9 +4,9 @@@ Navigation.Menu.Sone.Item.Login.Name=Co
  Navigation.Menu.Sone.Item.Login.Tooltip=Se connecter à son Sone
  Navigation.Menu.Sone.Item.Index.Name=Votre Sone
  Navigation.Menu.Sone.Item.Index.Tooltip=Afficher votre Sone
 -Navigation.Menu.Sone.Item.New.Name=Nouveaux messages ety réponses
 +Navigation.Menu.Sone.Item.New.Name=Nouveaux messages et réponses
  Navigation.Menu.Sone.Item.New.Tooltip=Voir les nouveaux messages et réponses
 -Navigation.Menu.Sone.Item.CreateSone.Name=Créer Sone
 +Navigation.Menu.Sone.Item.CreateSone.Name=Créer un Sone
  Navigation.Menu.Sone.Item.CreateSone.Tooltip=Créer un nouveau Sone
  Navigation.Menu.Sone.Item.KnownSones.Name=Sones connus
  Navigation.Menu.Sone.Item.KnownSones.Tooltip=Montre tous les Sones connus
@@@ -117,6 -117,8 +117,8 @@@ Page.KnownSones.Filter.Followed=Montre
  Page.KnownSones.Filter.NotFollowed=Cacher les Sones suivis
  Page.KnownSones.Filter.New=Montrer seulement les nouveaux Sones
  Page.KnownSones.Filter.NotNew=Cacher les nouveaux Sones
+ Page.KnownSones.Filter.Own=Show only local Sones
+ Page.KnownSones.Filter.NotOwn=Show only remote Sones
  Page.KnownSones.Button.Apply=Appliquer
  Page.KnownSones.Button.FollowAllSones=Suivre tous les Sones de cette page
  Page.KnownSones.Button.UnfollowAllSones=Ne plus suivre tous les Sones de cette page
@@@ -450,3 -452,4 +452,4 @@@ Notification.ImageInsertFailed.Text=Le
  Notification.Mention.ShortText=Vous avez été mentionné.
  Notification.Mention.Text=Vous avez été mentionné dans les messages suivants:
  Notification.SoneInsert.Duration={0,number} {0,choice,0#seconds|1#second|1<seconds}
+ # 120-121
index 3789d08,0000000..ae1993a
mode 100644,000000..100644
--- /dev/null
@@@ -1,85 -1,0 +1,87 @@@
-               when(core.getSone(eq("LocalSone"), anyBoolean())).thenReturn(localSone);
 +/*
 + * Sone - LockSoneCommandTest.java - Copyright © 2013 David Roden
 + *
 + * This program is free software: you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
 + * the Free Software Foundation, either version 3 of the License, or
 + * (at your option) any later version.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU General Public License for more details.
 + *
 + * You should have received a copy of the GNU General Public License
 + * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 + */
 +
 +package net.pterodactylus.sone.fcp;
 +
 +import static org.hamcrest.CoreMatchers.is;
 +import static org.hamcrest.CoreMatchers.notNullValue;
 +import static org.hamcrest.MatcherAssert.assertThat;
 +import static org.mockito.Matchers.anyBoolean;
 +import static org.mockito.Matchers.eq;
 +import static org.mockito.Mockito.mock;
 +import static org.mockito.Mockito.verify;
 +import static org.mockito.Mockito.when;
 +
 +import net.pterodactylus.sone.core.Core;
 +import net.pterodactylus.sone.data.Sone;
 +import net.pterodactylus.sone.freenet.SimpleFieldSetBuilder;
 +import net.pterodactylus.sone.freenet.fcp.Command.Response;
 +import net.pterodactylus.sone.freenet.fcp.FcpException;
 +
 +import freenet.support.SimpleFieldSet;
 +
++import com.google.common.base.Optional;
 +import org.junit.Test;
 +
 +/**
 + * Tests for {@link UnlockSoneCommand}.
 + *
 + * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
 + */
 +public class LockSoneCommandTest {
 +
 +      @Test
 +      public void testLockingALocalSone() throws FcpException {
 +              Sone localSone = mock(Sone.class);
 +              when(localSone.getId()).thenReturn("LocalSone");
++              when(localSone.isLocal()).thenReturn(true);
 +              Core core = mock(Core.class);
-               when(core.getSone(eq("RemoteSone"), anyBoolean())).thenReturn(removeSone);
++              when(core.getSone(eq("LocalSone"))).thenReturn(Optional.of(localSone));
 +              when(core.getLocalSone(eq("LocalSone"), anyBoolean())).thenReturn(localSone);
 +              SimpleFieldSet fields = new SimpleFieldSetBuilder().put("Sone", "LocalSone").get();
 +
 +              LockSoneCommand lockSoneCommand = new LockSoneCommand(core);
 +              Response response = lockSoneCommand.execute(fields, null, null);
 +
 +              verify(core).lockSone(eq(localSone));
 +              assertThat(response, notNullValue());
 +              assertThat(response.getReplyParameters(), notNullValue());
 +              assertThat(response.getReplyParameters().get("Message"), is("SoneLocked"));
 +              assertThat(response.getReplyParameters().get("Sone"), is("LocalSone"));
 +      }
 +
 +      @Test(expected = FcpException.class)
 +      public void testLockingARemoteSone() throws FcpException {
 +              Sone removeSone = mock(Sone.class);
 +              Core core = mock(Core.class);
++              when(core.getSone(eq("RemoteSone"))).thenReturn(Optional.of(removeSone));
 +              SimpleFieldSet fields = new SimpleFieldSetBuilder().put("Sone", "RemoteSone").get();
 +
 +              LockSoneCommand lockSoneCommand = new LockSoneCommand(core);
 +              lockSoneCommand.execute(fields, null, null);
 +      }
 +
 +      @Test(expected = FcpException.class)
 +      public void testMissingSone() throws FcpException {
 +              Core core = mock(Core.class);
 +              SimpleFieldSet fields = new SimpleFieldSetBuilder().get();
 +
 +              LockSoneCommand lockSoneCommand = new LockSoneCommand(core);
 +              lockSoneCommand.execute(fields, null, null);
 +      }
 +
 +}
index 05fc73c,0000000..b966b19
mode 100644,000000..100644
--- /dev/null
@@@ -1,85 -1,0 +1,87 @@@
-               when(core.getSone(eq("LocalSone"), anyBoolean())).thenReturn(localSone);
 +/*
 + * Sone - LockSoneCommandTest.java - Copyright © 2013 David Roden
 + *
 + * This program is free software: you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
 + * the Free Software Foundation, either version 3 of the License, or
 + * (at your option) any later version.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU General Public License for more details.
 + *
 + * You should have received a copy of the GNU General Public License
 + * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 + */
 +
 +package net.pterodactylus.sone.fcp;
 +
 +import static org.hamcrest.CoreMatchers.is;
 +import static org.hamcrest.CoreMatchers.notNullValue;
 +import static org.hamcrest.MatcherAssert.assertThat;
 +import static org.mockito.Matchers.anyBoolean;
 +import static org.mockito.Matchers.eq;
 +import static org.mockito.Mockito.mock;
 +import static org.mockito.Mockito.verify;
 +import static org.mockito.Mockito.when;
 +
 +import net.pterodactylus.sone.core.Core;
 +import net.pterodactylus.sone.data.Sone;
 +import net.pterodactylus.sone.freenet.SimpleFieldSetBuilder;
 +import net.pterodactylus.sone.freenet.fcp.Command.Response;
 +import net.pterodactylus.sone.freenet.fcp.FcpException;
 +
 +import freenet.support.SimpleFieldSet;
 +
++import com.google.common.base.Optional;
 +import org.junit.Test;
 +
 +/**
 + * Tests for {@link LockSoneCommand}.
 + *
 + * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
 + */
 +public class UnlockSoneCommandTest {
 +
 +      @Test
 +      public void testUnlockingALocalSone() throws FcpException {
 +              Sone localSone = mock(Sone.class);
 +              when(localSone.getId()).thenReturn("LocalSone");
++              when(localSone.isLocal()).thenReturn(true);
 +              Core core = mock(Core.class);
-               when(core.getSone(eq("RemoteSone"), anyBoolean())).thenReturn(removeSone);
++              when(core.getSone(eq("LocalSone"))).thenReturn(Optional.of(localSone));
 +              when(core.getLocalSone(eq("LocalSone"), anyBoolean())).thenReturn(localSone);
 +              SimpleFieldSet fields = new SimpleFieldSetBuilder().put("Sone", "LocalSone").get();
 +
 +              UnlockSoneCommand unlockSoneCommand = new UnlockSoneCommand(core);
 +              Response response = unlockSoneCommand.execute(fields, null, null);
 +
 +              verify(core).unlockSone(eq(localSone));
 +              assertThat(response, notNullValue());
 +              assertThat(response.getReplyParameters(), notNullValue());
 +              assertThat(response.getReplyParameters().get("Message"), is("SoneUnlocked"));
 +              assertThat(response.getReplyParameters().get("Sone"), is("LocalSone"));
 +      }
 +
 +      @Test(expected = FcpException.class)
 +      public void testUnlockingARemoteSone() throws FcpException {
 +              Sone removeSone = mock(Sone.class);
 +              Core core = mock(Core.class);
++              when(core.getSone(eq("RemoteSone"))).thenReturn(Optional.of(removeSone));
 +              SimpleFieldSet fields = new SimpleFieldSetBuilder().put("Sone", "RemoteSone").get();
 +
 +              UnlockSoneCommand unlockSoneCommand = new UnlockSoneCommand(core);
 +              unlockSoneCommand.execute(fields, null, null);
 +      }
 +
 +      @Test(expected = FcpException.class)
 +      public void testMissingSone() throws FcpException {
 +              Core core = mock(Core.class);
 +              SimpleFieldSet fields = new SimpleFieldSetBuilder().get();
 +
 +              UnlockSoneCommand unlockSoneCommand = new UnlockSoneCommand(core);
 +              unlockSoneCommand.execute(fields, null, null);
 +      }
 +
 +}