%line | %branch | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
nl.toolforge.karma.core.vc.cvsimpl.CVSResponseAdapter |
|
|
1 | /* |
|
2 | Karma core - Core of the Karma application |
|
3 | Copyright (C) 2004 Toolforge <www.toolforge.nl> |
|
4 | ||
5 | This library is free software; you can redistribute it and/or |
|
6 | modify it under the terms of the GNU Lesser General Public |
|
7 | License as published by the Free Software Foundation; either |
|
8 | version 2.1 of the License, or (at your option) any later version. |
|
9 | ||
10 | This library is distributed in the hope that it will be useful, |
|
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
13 | Lesser General Public License for more details. |
|
14 | ||
15 | You should have received a copy of the GNU Lesser General Public |
|
16 | License along with this library; if not, write to the Free Software |
|
17 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
18 | */ |
|
19 | package nl.toolforge.karma.core.vc.cvsimpl; |
|
20 | ||
21 | import nl.toolforge.karma.core.cmd.CommandResponse; |
|
22 | import nl.toolforge.karma.core.vc.VersionControlException; |
|
23 | import org.apache.commons.logging.Log; |
|
24 | import org.apache.commons.logging.LogFactory; |
|
25 | import org.netbeans.lib.cvsclient.command.FileInfoContainer; |
|
26 | import org.netbeans.lib.cvsclient.command.log.LogInformation; |
|
27 | import org.netbeans.lib.cvsclient.event.CVSListener; |
|
28 | import org.netbeans.lib.cvsclient.event.FileAddedEvent; |
|
29 | import org.netbeans.lib.cvsclient.event.FileInfoEvent; |
|
30 | import org.netbeans.lib.cvsclient.event.FileRemovedEvent; |
|
31 | import org.netbeans.lib.cvsclient.event.FileUpdatedEvent; |
|
32 | import org.netbeans.lib.cvsclient.event.MessageEvent; |
|
33 | import org.netbeans.lib.cvsclient.event.ModuleExpansionEvent; |
|
34 | import org.netbeans.lib.cvsclient.event.TerminationEvent; |
|
35 | ||
36 | import java.util.ArrayList; |
|
37 | import java.util.Iterator; |
|
38 | import java.util.List; |
|
39 | import java.util.Map; |
|
40 | import java.util.StringTokenizer; |
|
41 | ||
42 | /** |
|
43 | * Adapts a response from CVS to Karma specific messages. This class listens to CVS responses as per the Netbeans API. |
|
44 | * Success messages are sent to the <code>CommandResponse</code> instance (which can optionally be registered with this |
|
45 | * instance). Errors are thrown as CVSRuntimeExceptions |
|
46 | * |
|
47 | * @author D.A. Smedes |
|
48 | * @version $Id: CVSResponseAdapter.java,v 1.3 2004/11/16 22:31:57 asmedes Exp $ |
|
49 | */ |
|
50 | public final class CVSResponseAdapter implements CVSListener { |
|
51 | ||
52 | 1246 | private FileInfoContainer logInformation = null; |
53 | 1246 | private CommandResponse response = null; |
54 | ||
55 | 228 | private static Log logger = LogFactory.getLog(CVSResponseAdapter.class); |
56 | 1246 | private Map arguments = null; |
57 | ||
58 | 1608 | public CVSResponseAdapter() {} |
59 | ||
60 | /** |
|
61 | * This class can use a <code>CommandResponseListener</code> to send cvs events to. For example, user interfaces can |
|
62 | * register a listener to receive events from underlying code, thus creating interactivity. |
|
63 | * |
|
64 | * @param response |
|
65 | */ |
|
66 | 442 | public CVSResponseAdapter(CommandResponse response) { |
67 | 442 | this.response = response; |
68 | 442 | } |
69 | ||
70 | public void setArguments(Map arguments) { |
|
71 | 1289 | this.arguments = arguments; |
72 | 1289 | } |
73 | ||
74 | public Object[] getArguments(String args) { |
|
75 | ||
76 | 206 | if (arguments == null) { |
77 | 130 | return null; |
78 | } |
|
79 | ||
80 | 76 | List argList = new ArrayList(); |
81 | 76 | StringTokenizer tokenizer = new StringTokenizer(args, ","); |
82 | 228 | while (tokenizer.hasMoreTokens()) { |
83 | 152 | argList.add(((String) tokenizer.nextElement()).trim()); |
84 | } |
|
85 | ||
86 | // First pass ... count actual available parameters; is there a value for each requested key ? |
|
87 | // |
|
88 | ||
89 | 76 | int j = 0; |
90 | 76 | for (Iterator i = argList.iterator(); i.hasNext();) { |
91 | 152 | String value = (String) arguments.get((String) i.next()); |
92 | 152 | j = (value == null ? j : (j += 1)); |
93 | } |
|
94 | ||
95 | // Second pass ... assign values |
|
96 | // |
|
97 | ||
98 | 76 | Object[] argArray = new Object[j]; |
99 | 76 | j = 0; // Reset |
100 | 76 | for (Iterator i = argList.iterator(); i.hasNext();) { |
101 | 152 | String value = (String) arguments.get((String) i.next()); |
102 | 152 | if (value != null) { |
103 | 152 | argArray[j] = value; |
104 | 152 | j++; |
105 | } |
|
106 | } |
|
107 | ||
108 | 76 | arguments = null; // Reset this session ... |
109 | ||
110 | 76 | return argArray; |
111 | } |
|
112 | ||
113 | /** |
|
114 | * <p>Copied from the Netbeans API documentation : Called when a file is removed. |
|
115 | * |
|
116 | * @param event The event from CVS. |
|
117 | */ |
|
118 | 0 | public void fileRemoved(FileRemovedEvent event) {} |
119 | ||
120 | /** |
|
121 | * <p>Copied from the Netbeans API documentation : Fire a module expansion event. This is called when the servers has |
|
122 | * responded to an expand-modules request. |
|
123 | * <p/> |
|
124 | * <p>Copied from the Netbeans API documentation : This event is really intended only for the use in the Checkout command. During a checkout command, the client |
|
125 | * must ask the server to expand modules to determine whether there are aliases defined for a particular module. The |
|
126 | * client must then use the expansion to determine if a local directory exists and if so, send appropriate Modified |
|
127 | * requests etc. |
|
128 | * |
|
129 | * @param event The event from CVS. |
|
130 | */ |
|
131 | 520 | public void moduleExpanded(ModuleExpansionEvent event) {} |
132 | ||
133 | /** |
|
134 | * <p>Copied from the Netbeans API documentation : Called when a file has been added. |
|
135 | * |
|
136 | * @param event The event from CVS. |
|
137 | */ |
|
138 | 925 | public void fileAdded(FileAddedEvent event) {} |
139 | ||
140 | /** |
|
141 | * <p>Copied from the Netbeans API documentation : Called when file information has been received. |
|
142 | * <p/> |
|
143 | * <p>This method constructs the <code>LogInformation</code> object that contains the log for a specific file as |
|
144 | * a result of the <code>cvs log</code> command. |
|
145 | * |
|
146 | * @param event The event from CVS. |
|
147 | */ |
|
148 | public void fileInfoGenerated(FileInfoEvent event) { |
|
149 | 2355 | logInformation = event.getInfoContainer(); |
150 | 2355 | } |
151 | ||
152 | /** |
|
153 | * Gets the log that is the result of the <code>cvs log</code> command. |
|
154 | * |
|
155 | * @return A <code>LogInformation</code> that can be queried by classes for all information on a (set of) file(s). |
|
156 | */ |
|
157 | public LogInformation getLogInformation() { |
|
158 | 26 | return (LogInformation) logInformation; |
159 | } |
|
160 | ||
161 | /** |
|
162 | * <p>Copied from the Netbeans API documentation : Called when server responses with "ok" or "error", (when the command finishes) |
|
163 | * |
|
164 | * @param event The event from CVS. |
|
165 | */ |
|
166 | 2996 | public void commandTerminated(TerminationEvent event) { } |
167 | ||
168 | /** |
|
169 | * <p>Copied from the Netbeans API documentation : Called when a file has been updated. |
|
170 | * |
|
171 | * @param event The event from CVS. |
|
172 | */ |
|
173 | 0 | public void fileUpdated(FileUpdatedEvent event) { } |
174 | ||
175 | /** |
|
176 | * <p>Copied from the Netbeans API documentation : Called when the server wants to send a message to be displayed to |
|
177 | * the user. This method is called whenever |
|
178 | * |
|
179 | * @param event The event from CVS. |
|
180 | */ |
|
181 | public void messageSent(MessageEvent event) { |
|
182 | ||
183 | // Get the message from CVS and parse it into something usefull. |
|
184 | // |
|
185 | 23716 | String message = event.getMessage(); |
186 | ||
187 | 22736 | // if (message.length() > 0) { |
188 | // System.out.println(message); |
|
189 | // } |
|
190 | ||
191 | 1080 | if (message.startsWith("Checking in")) { |
192 | ||
193 | // TODO Localize message |
|
194 | // |
|
195 | 4 | if (response != null) { |
196 | //response.addMessage(new SuccessMessage("File has been added to the CVS repository.")); |
|
197 | 22636 | } else { |
198 | 0 | logger.debug("'SuccessMessage' not routed to CommandResponseHandler : " + event.getMessage()); |
199 | } |
|
200 | ||
201 | 976 | } else if (message.startsWith("cvs server: cannot find module")) { |
202 | ||
203 | 5 | throw new CVSRuntimeException(VersionControlException.MODULE_NOT_IN_REPOSITORY, getArguments("MODULE, REPOSITORY")); |
204 | ||
205 | 971 | } else if (message.startsWith("cvs add:") && message.indexOf("already exists") >= 0) { |
206 | 21811 | |
207 | 0 | throw new CVSRuntimeException(CVSException.FILE_EXISTS_IN_REPOSITORY, getArguments("FILE, MODULE, REPOSITORY")); |
208 | 175 | |
209 | 971 | } else if (message.startsWith("cvs") && message.indexOf("no such tag") >= 0) { |
210 | 21636 | |
211 | 1 | throw new CVSRuntimeException(CVSException.VERSION_NOT_FOUND, getArguments("MODULE, VERSION")); |
212 | ||
213 | 970 | } else if (message.indexOf("contains characters other than digits") >= 0) { |
214 | 21636 | |
215 | 0 | throw new CVSRuntimeException(CVSException.INVALID_SYMBOLIC_NAME, getArguments("MODULE, SYMBOLIC_NAME")); |
216 | 25 | |
217 | 970 | } else if (message.indexOf("permission denied") >= 0) { |
218 | 21611 | |
219 | // todo does this work ?? |
|
220 | // should be tested properly ... |
|
221 | ||
222 | 21611 | throw new CVSRuntimeException(CVSException.SECURITY_VIOLATION); |
223 | ||
224 | } |
|
225 | 974 | } |
226 | ||
227 | } |
This report is generated by jcoverage, Maven and Maven JCoverage Plugin. |