1/*
2 * Copyright 2007 the original author or authors.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.mockftpserver.core.command;
17
18import java.util.Arrays;
19
20import org.mockftpserver.core.util.Assert;
21
22/**
23 * Represents a command received from an FTP client, containing a command name and parameters.
24 * Objects of this class are immutable.
25 *
26 * @version $Revision$ - $Date$
27 *
28 * @author Chris Mair
29 */
30public final class Command {
31
32    private String name;
33    private String[] parameters;
34
35    /**
36     * Construct a new immutable instance with the specified command name and parameters
37     * @param name - the command name; may not be null
38     * @param parameters - the command parameters; may be empty; may not benull
39     */
40    public Command(String name, String[] parameters) {
41        Assert.notNull(name, "name");
42        Assert.notNull(parameters, "parameters");
43        this.name = name;
44        this.parameters = copy(parameters);
45    }
46
47    /**
48     * @return the name
49     */
50    public String getName() {
51        return name;
52    }
53
54    /**
55     * @return the parameters
56     */
57    public String[] getParameters() {
58        return copy(parameters);
59    }
60
61    /**
62     * Get the String value of the parameter at the specified index
63     * @param index - the index
64     * @return the parameter value as a String
65     * @throws AssertFailedException if the parameter index is invalid or the value is not a valid String
66     */
67    public String getRequiredString(int index) {
68        assertValidIndex(index);
69        return parameters[index];
70    }
71
72    /**
73     * Get the String value of the parameter at the specified index; return null if no parameter exists for the index
74     * @param index - the index
75     * @return the parameter value as a String, or null if this Command does not have a parameter for that index
76     */
77    public String getOptionalString(int index) {
78        return (parameters.length > index) ? parameters[index] : null;
79    }
80
81    /**
82     * @see java.lang.Object#equals(java.lang.Object)
83     */
84    public boolean equals(Object obj) {
85        if (this == obj) {
86            return true;
87        }
88        if (obj == null || !(obj instanceof Command)) {
89            return false;
90        }
91        return this.hashCode() == obj.hashCode();
92    }
93
94    /**
95     * @see java.lang.Object#hashCode()
96     */
97    public int hashCode() {
98        String str = name + Arrays.asList(parameters);
99        return str.hashCode();
100    }
101
102    /**
103     * Return the String representation of this object
104     * @see java.lang.Object#toString()
105     */
106    public String toString() {
107        return "Command[" + name + ": " + Arrays.asList(parameters) + "]";
108    }
109
110    /**
111     * Return the name, normalized to a common format - convert to upper case.
112     * @return the name converted to upper case
113     */
114    public static String normalizeName(String name) {
115        return name.toUpperCase();
116    }
117
118    /**
119     * Construct a shallow copy of the specified array
120     * @param array - the array to copy
121     * @return a new array with the same contents
122     */
123    private static String[] copy(String[] array) {
124        String[] newArray = new String[array.length];
125        System.arraycopy(array, 0, newArray, 0, array.length);
126        return newArray;
127    }
128
129    /**
130     * Assert that the index is valid
131     * @param index - the index
132     * @throws AssertFailedException if the parameter index is invalid
133     */
134    private void assertValidIndex(int index) {
135        Assert.isTrue(index >= 0 && index < parameters.length, "The parameter index " + index + " is not valid for " + this);
136    }
137
138}
139