Browse Source

Add a factory for creating aliases

Also statically import precondition methods randomly.

Depends-On: I49ec46315f1366d27c12d1b4cc2ac92cd479d46d
Change-Id: I2285d5b886d49841c3e5e6645da14a1c880e6745
Reviewed-on: http://gerrit.dmdirc.com/3535
Automatic-Compile: DMDirc Build Manager
Reviewed-by: Greg Holmes <greg@dmdirc.com>
pull/1/head
Chris Smith 10 years ago
parent
commit
13c09d7b10

+ 64
- 0
src/com/dmdirc/commandparser/aliases/AliasFactory.java View File

@@ -0,0 +1,64 @@
1
+/*
2
+ * Copyright (c) 2006-2014 DMDirc Developers
3
+ *
4
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ * of this software and associated documentation files (the "Software"), to deal
6
+ * in the Software without restriction, including without limitation the rights
7
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ * copies of the Software, and to permit persons to whom the Software is
9
+ * furnished to do so, subject to the following conditions:
10
+ *
11
+ * The above copyright notice and this permission notice shall be included in
12
+ * all copies or substantial portions of the Software.
13
+ *
14
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ * SOFTWARE.
21
+ */
22
+
23
+package com.dmdirc.commandparser.aliases;
24
+
25
+import com.dmdirc.commandparser.CommandType;
26
+
27
+import com.google.common.base.Strings;
28
+
29
+import javax.inject.Inject;
30
+import javax.inject.Singleton;
31
+
32
+import static com.google.common.base.Preconditions.checkArgument;
33
+import static com.google.common.base.Preconditions.checkNotNull;
34
+
35
+/**
36
+ * Handles the creation of new aliases.
37
+ */
38
+@Singleton
39
+public class AliasFactory {
40
+
41
+    @Inject
42
+    public AliasFactory() {
43
+    }
44
+
45
+    /**
46
+     * Creates a new alias.
47
+     *
48
+     * @param name         The name of the alias to be created.
49
+     * @param minArguments The minimum number of arguments the alias requires.
50
+     * @param substitution The command to substitute when the alias is executed.
51
+     *
52
+     * @return A new alias with the given attributes.
53
+     */
54
+    public Alias createAlias(final String name, final int minArguments, final String substitution) {
55
+        checkNotNull(name);
56
+        checkArgument(!Strings.isNullOrEmpty(name));
57
+        checkArgument(minArguments >= 0);
58
+        checkNotNull(substitution);
59
+
60
+        // TODO: Infer command type from the substituted command
61
+        return new Alias(CommandType.TYPE_GLOBAL, name, minArguments, substitution);
62
+    }
63
+
64
+}

+ 22
- 27
src/com/dmdirc/commandparser/aliases/CoreAliasDialogModel.java View File

@@ -22,13 +22,11 @@
22 22
 
23 23
 package com.dmdirc.commandparser.aliases;
24 24
 
25
-import com.dmdirc.commandparser.CommandType;
26 25
 import com.dmdirc.interfaces.ui.AliasDialogModel;
27 26
 import com.dmdirc.interfaces.ui.AliasDialogModelListener;
28 27
 import com.dmdirc.util.collections.ListenerList;
29 28
 
30 29
 import com.google.common.base.Optional;
31
-import com.google.common.base.Preconditions;
32 30
 
33 31
 import java.util.Collection;
34 32
 import java.util.Collections;
@@ -37,19 +35,24 @@ import java.util.concurrent.ConcurrentSkipListMap;
37 35
 
38 36
 import javax.inject.Inject;
39 37
 
38
+import static com.google.common.base.Preconditions.checkArgument;
39
+import static com.google.common.base.Preconditions.checkNotNull;
40
+
40 41
 /**
41 42
  * Model representing a list of aliases in a dialog.
42 43
  */
43 44
 public class CoreAliasDialogModel implements AliasDialogModel {
44 45
 
45 46
     private final AliasManager aliasManager;
47
+    private final AliasFactory factory;
46 48
     private final ListenerList listeners;
47 49
     private final Map<String, Alias> aliases;
48 50
     private Optional<Alias> selectedAlias;
49 51
 
50 52
     @Inject
51
-    public CoreAliasDialogModel(final AliasManager aliasManager) {
53
+    public CoreAliasDialogModel(final AliasManager aliasManager, final AliasFactory factory) {
52 54
         this.aliasManager = aliasManager;
55
+        this.factory = factory;
53 56
         listeners = new ListenerList();
54 57
         aliases = new ConcurrentSkipListMap<>();
55 58
         for (Alias alias : aliasManager.getAliases()) {
@@ -65,42 +68,34 @@ public class CoreAliasDialogModel implements AliasDialogModel {
65 68
 
66 69
     @Override
67 70
     public Optional<Alias> getAlias(final String name) {
68
-        Preconditions.checkNotNull(name, "Name cannot be null");
71
+        checkNotNull(name, "Name cannot be null");
69 72
         return Optional.fromNullable(aliases.get(name));
70 73
     }
71 74
 
72 75
     @Override
73
-    public void addAlias(final String name,
74
-            final int minArguments,
75
-            final String substitution) {
76
-        Preconditions.checkNotNull(name, "Name cannot be null");
77
-        Preconditions.checkArgument(!aliases.containsKey(name), "Name cannot already exist");
78
-        Preconditions.checkNotNull(substitution, "Substitution cannot be null");
79
-        Preconditions.checkArgument(minArguments >= 0, "Minimum arguments must be 0 or higher");
80
-        final Alias alias = new Alias(CommandType.TYPE_GLOBAL, name, minArguments, substitution);
76
+    public void addAlias(final String name, final int minArguments, final String substitution) {
77
+        checkNotNull(name, "Name cannot be null");
78
+        checkArgument(!aliases.containsKey(name), "Name cannot already exist");
79
+        final Alias alias = factory.createAlias(name, minArguments, substitution);
81 80
         aliases.put(name, alias);
82 81
         listeners.getCallable(AliasDialogModelListener.class).aliasAdded(alias);
83 82
     }
84 83
 
85 84
     @Override
86
-    public void editAlias(final String name,
87
-            final int minArguments,
88
-            final String substitution) {
89
-        Preconditions.checkNotNull(name, "Name cannot be null");
90
-        Preconditions.checkNotNull(substitution, "Substitution cannot be null");
91
-        Preconditions.checkArgument(minArguments >= 0, "Minimum arguments must be 0 or higher");
92
-        Preconditions.checkArgument(aliases.containsKey(name), "Name must already exist");
93
-        final Alias alias = new Alias(CommandType.TYPE_GLOBAL, name, minArguments, substitution);
85
+    public void editAlias(final String name, final int minArguments, final String substitution) {
86
+        checkNotNull(name, "Name cannot be null");
87
+        checkArgument(aliases.containsKey(name), "Name must already exist");
88
+        final Alias alias = factory.createAlias(name, minArguments, substitution);
94 89
         aliases.put(name, alias);
95 90
         listeners.getCallable(AliasDialogModelListener.class).aliasEdited(name);
96 91
     }
97 92
 
98 93
     @Override
99 94
     public void renameAlias(final String oldName, final String newName) {
100
-        Preconditions.checkNotNull(oldName, "Oldname cannot be null");
101
-        Preconditions.checkNotNull(newName, "Newname cannot be null");
102
-        Preconditions.checkArgument(aliases.containsKey(oldName), "Old name must exist");
103
-        Preconditions.checkArgument(!aliases.containsKey(newName), "New name must not exist");
95
+        checkNotNull(oldName, "Oldname cannot be null");
96
+        checkNotNull(newName, "Newname cannot be null");
97
+        checkArgument(aliases.containsKey(oldName), "Old name must exist");
98
+        checkArgument(!aliases.containsKey(newName), "New name must not exist");
104 99
         final Alias alias = aliases.get(oldName);
105 100
         aliases.remove(oldName);
106 101
         aliases.put(newName, new Alias(alias.getType(), newName, alias.getMinArguments(),
@@ -110,7 +105,7 @@ public class CoreAliasDialogModel implements AliasDialogModel {
110 105
 
111 106
     @Override
112 107
     public void removeAlias(final String name) {
113
-        Preconditions.checkNotNull(name, "Name cannot be null");
108
+        checkNotNull(name, "Name cannot be null");
114 109
         if (!aliases.containsKey(name)) {
115 110
             return;
116 111
         }
@@ -144,13 +139,13 @@ public class CoreAliasDialogModel implements AliasDialogModel {
144 139
 
145 140
     @Override
146 141
     public void addListener(final AliasDialogModelListener listener) {
147
-        Preconditions.checkNotNull(listener, "Listener must not be null");
142
+        checkNotNull(listener, "Listener must not be null");
148 143
         listeners.add(AliasDialogModelListener.class, listener);
149 144
     }
150 145
 
151 146
     @Override
152 147
     public void removeListener(final AliasDialogModelListener listener) {
153
-        Preconditions.checkNotNull(listener, "Listener must not be null");
148
+        checkNotNull(listener, "Listener must not be null");
154 149
         listeners.remove(AliasDialogModelListener.class, listener);
155 150
     }
156 151
 

+ 7
- 7
src/com/dmdirc/commandparser/aliases/YamlAliasStore.java View File

@@ -24,7 +24,6 @@ package com.dmdirc.commandparser.aliases;
24 24
 
25 25
 import com.dmdirc.commandline.CommandLineOptionsModule.Directory;
26 26
 import com.dmdirc.commandline.CommandLineOptionsModule.DirectoryType;
27
-import com.dmdirc.commandparser.CommandType;
28 27
 
29 28
 import java.io.File;
30 29
 import java.io.FileInputStream;
@@ -73,10 +72,15 @@ public class YamlAliasStore implements AliasStore {
73 72
 
74 73
     /** The directory to find the aliases file in. */
75 74
     private final String directory;
75
+    /** The factory to use to create aliases. */
76
+    private final AliasFactory factory;
76 77
 
77 78
     @Inject
78
-    public YamlAliasStore(@Directory(DirectoryType.BASE) final String directory) {
79
+    public YamlAliasStore(
80
+            @Directory(DirectoryType.BASE) final String directory,
81
+            final AliasFactory factory) {
79 82
         this.directory = directory;
83
+        this.factory = factory;
80 84
     }
81 85
 
82 86
     @Override
@@ -126,14 +130,10 @@ public class YamlAliasStore implements AliasStore {
126 130
         for (Object alias : objects) {
127 131
             try {
128 132
                 final Map<Object, Object> map = asMap(alias);
129
-
130
-                // TODO: Infer command type from the substituted command
131
-                final CommandType commandType = CommandType.TYPE_GLOBAL;
132 133
                 final String name = requiredString(map, "name");
133 134
                 final int minArguments = Integer.parseInt(requiredString(map, "min_arguments"));
134 135
                 final String substitution = requiredString(map, "substitution");
135
-
136
-                res.add(new Alias(commandType, name, minArguments, substitution));
136
+                res.add(factory.createAlias(name, minArguments, substitution));
137 137
             } catch (IllegalArgumentException ex) {
138 138
                 LOG.info("Unable to read alias", ex);
139 139
             }

+ 36
- 15
test/com/dmdirc/commandparser/aliases/CoreAliasDialogModelTest.java View File

@@ -34,10 +34,14 @@ import org.junit.Before;
34 34
 import org.junit.Test;
35 35
 import org.junit.runner.RunWith;
36 36
 import org.mockito.Mock;
37
+import org.mockito.invocation.InvocationOnMock;
37 38
 import org.mockito.runners.MockitoJUnitRunner;
39
+import org.mockito.stubbing.Answer;
38 40
 
39 41
 import static org.junit.Assert.assertEquals;
40 42
 import static org.junit.Assert.assertFalse;
43
+import static org.mockito.Matchers.anyInt;
44
+import static org.mockito.Matchers.anyString;
41 45
 import static org.mockito.Mockito.never;
42 46
 import static org.mockito.Mockito.verify;
43 47
 import static org.mockito.Mockito.when;
@@ -46,6 +50,7 @@ import static org.mockito.Mockito.when;
46 50
 public class CoreAliasDialogModelTest {
47 51
 
48 52
     @Mock private AliasManager aliasModel;
53
+    @Mock private AliasFactory aliasFactory;
49 54
     @Mock private AliasDialogModelListener listener;
50 55
     private final Alias alias1 = new Alias(CommandType.TYPE_GLOBAL, "alias1", 0, "");
51 56
     private final Alias alias2Edited = new Alias(CommandType.TYPE_GLOBAL, "alias1", 1, "");
@@ -57,12 +62,28 @@ public class CoreAliasDialogModelTest {
57 62
         aliases = new HashSet<>();
58 63
     }
59 64
 
65
+    @Before
66
+    public void setUpFactory() {
67
+        when(aliasFactory.createAlias(anyString(), anyInt(), anyString())).thenAnswer(
68
+                new Answer<Alias>() {
69
+                    @Override
70
+                    public Alias answer(final InvocationOnMock invocation) throws Throwable {
71
+                        return new Alias(
72
+                                CommandType.TYPE_GLOBAL,
73
+                                (String) invocation.getArguments()[0],
74
+                                (Integer) invocation.getArguments()[1],
75
+                                (String) invocation.getArguments()[2]
76
+                        );
77
+                    }
78
+                });
79
+    }
80
+
60 81
     @Test
61 82
     public void testgetAliases() {
62 83
         aliases.add(alias1);
63 84
         aliases.add(alias2);
64 85
         when(aliasModel.getAliases()).thenReturn(aliases);
65
-        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel);
86
+        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel, aliasFactory);
66 87
         assertEquals(model.getAliases().size(), 2);
67 88
     }
68 89
 
@@ -71,7 +92,7 @@ public class CoreAliasDialogModelTest {
71 92
         aliases.add(alias1);
72 93
         aliases.add(alias2);
73 94
         when(aliasModel.getAliases()).thenReturn(aliases);
74
-        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel);
95
+        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel, aliasFactory);
75 96
         assertEquals(model.getAlias("alias1").get(), alias1);
76 97
     }
77 98
 
@@ -80,14 +101,14 @@ public class CoreAliasDialogModelTest {
80 101
         aliases.add(alias1);
81 102
         aliases.add(alias2);
82 103
         when(aliasModel.getAliases()).thenReturn(aliases);
83
-        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel);
104
+        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel, aliasFactory);
84 105
         assertFalse(model.getAlias("alias3").isPresent());
85 106
     }
86 107
 
87 108
     @Test
88 109
     public void testAddAlias() {
89 110
         when(aliasModel.getAliases()).thenReturn(aliases);
90
-        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel);
111
+        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel, aliasFactory);
91 112
         assertEquals(model.getAliases().size(), 0);
92 113
         model.addAlias(alias1.getName(), alias1.getMinArguments(), alias1.getSubstitution());
93 114
         assertEquals(model.getAliases().size(), 1);
@@ -96,7 +117,7 @@ public class CoreAliasDialogModelTest {
96 117
     @Test
97 118
     public void testAddAliasListener() {
98 119
         when(aliasModel.getAliases()).thenReturn(aliases);
99
-        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel);
120
+        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel, aliasFactory);
100 121
         model.addListener(listener);
101 122
         model.addAlias(alias1.getName(), alias1.getMinArguments(), alias1.getSubstitution());
102 123
         verify(listener).aliasAdded(alias1);
@@ -106,7 +127,7 @@ public class CoreAliasDialogModelTest {
106 127
     public void testEditAlias() {
107 128
         aliases.add(alias1);
108 129
         when(aliasModel.getAliases()).thenReturn(aliases);
109
-        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel);
130
+        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel, aliasFactory);
110 131
         assertEquals(model.getAliases().size(), 1);
111 132
         assertEquals(model.getAlias("alias1").get().getMinArguments(), 0);
112 133
         model.editAlias("alias1", alias2Edited.getMinArguments(), alias2Edited.getSubstitution());
@@ -117,7 +138,7 @@ public class CoreAliasDialogModelTest {
117 138
     public void testEditAliasListener() {
118 139
         aliases.add(alias1);
119 140
         when(aliasModel.getAliases()).thenReturn(aliases);
120
-        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel);
141
+        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel, aliasFactory);
121 142
         model.addListener(listener);
122 143
         model.editAlias("alias1", alias2Edited.getMinArguments(), alias2Edited.getSubstitution());
123 144
         verify(listener).aliasEdited("alias1");
@@ -127,7 +148,7 @@ public class CoreAliasDialogModelTest {
127 148
     public void testRenameAlias() {
128 149
         aliases.add(alias1);
129 150
         when(aliasModel.getAliases()).thenReturn(aliases);
130
-        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel);
151
+        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel, aliasFactory);
131 152
         assertEquals(model.getAliases().size(), 1);
132 153
         assertEquals(model.getAlias("alias1").get(), alias1);
133 154
         model.renameAlias("alias1", "alias2");
@@ -138,7 +159,7 @@ public class CoreAliasDialogModelTest {
138 159
     public void testRenameAliasListener() {
139 160
         aliases.add(alias1);
140 161
         when(aliasModel.getAliases()).thenReturn(aliases);
141
-        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel);
162
+        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel, aliasFactory);
142 163
         model.addListener(listener);
143 164
         assertEquals(model.getAliases().size(), 1);
144 165
         assertEquals(model.getAlias("alias1").get(), alias1);
@@ -151,7 +172,7 @@ public class CoreAliasDialogModelTest {
151 172
         aliases.add(alias1);
152 173
         aliases.add(alias2);
153 174
         when(aliasModel.getAliases()).thenReturn(aliases);
154
-        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel);
175
+        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel, aliasFactory);
155 176
         assertEquals(model.getAliases().size(), 2);
156 177
         model.removeAlias("alias1");
157 178
         assertEquals(model.getAliases().size(), 1);
@@ -163,7 +184,7 @@ public class CoreAliasDialogModelTest {
163 184
         aliases.add(alias1);
164 185
         aliases.add(alias2);
165 186
         when(aliasModel.getAliases()).thenReturn(aliases);
166
-        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel);
187
+        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel, aliasFactory);
167 188
         model.addListener(listener);
168 189
         model.removeAlias("alias1");
169 190
         verify(listener).aliasRemoved(alias1);
@@ -174,7 +195,7 @@ public class CoreAliasDialogModelTest {
174 195
         aliases.add(alias1);
175 196
         aliases.add(alias2);
176 197
         when(aliasModel.getAliases()).thenReturn(aliases);
177
-        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel);
198
+        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel, aliasFactory);
178 199
         assertEquals(model.getAliases().size(), 2);
179 200
         assertFalse(model.getSelectedAlias().isPresent());
180 201
     }
@@ -184,7 +205,7 @@ public class CoreAliasDialogModelTest {
184 205
         aliases.add(alias1);
185 206
         aliases.add(alias2);
186 207
         when(aliasModel.getAliases()).thenReturn(aliases);
187
-        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel);
208
+        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel, aliasFactory);
188 209
         assertEquals(model.getAliases().size(), 2);
189 210
         assertFalse(model.getSelectedAlias().isPresent());
190 211
         model.setSelectedAlias(Optional.fromNullable(alias2));
@@ -196,7 +217,7 @@ public class CoreAliasDialogModelTest {
196 217
         aliases.add(alias1);
197 218
         aliases.add(alias2);
198 219
         when(aliasModel.getAliases()).thenReturn(aliases);
199
-        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel);
220
+        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel, aliasFactory);
200 221
         assertEquals(model.getAliases().size(), 2);
201 222
         assertFalse(model.getSelectedAlias().isPresent());
202 223
         model.setSelectedAlias(Optional.fromNullable(alias2));
@@ -208,7 +229,7 @@ public class CoreAliasDialogModelTest {
208 229
     @Test
209 230
     public void testRemoveListener() {
210 231
         when(aliasModel.getAliases()).thenReturn(aliases);
211
-        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel);
232
+        final CoreAliasDialogModel model = new CoreAliasDialogModel(aliasModel, aliasFactory);
212 233
         model.addListener(listener);
213 234
         model.addAlias(alias1.getName(), alias1.getMinArguments(), alias1.getSubstitution());
214 235
         model.removeListener(listener);

Loading…
Cancel
Save