001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041: package org.netbeans.lib.cvsclient.command.watch;
042:
043: import java.io.*;
044:
045: import org.netbeans.lib.cvsclient.*;
046: import org.netbeans.lib.cvsclient.command.*;
047: import org.netbeans.lib.cvsclient.connection.*;
048: import org.netbeans.lib.cvsclient.event.*;
049: import org.netbeans.lib.cvsclient.request.*;
050: import org.netbeans.lib.cvsclient.util.*;
051:
052: /**
053: * @author Thomas Singer
054: */
055: public class WatchCommand extends BasicCommand {
056: private WatchMode watchMode;
057:
058: private Watch watch;
059:
060: /**
061: * Construct a new WatchCommand.
062: */
063: public WatchCommand() {
064: resetCVSCommand();
065: }
066:
067: /**
068: * Executes this command.
069: *
070: * @param client the client services object that provides any necessary
071: * services to this command, including the ability to actually
072: * process all the requests
073: * @param eventManager the EventManager used for sending events
074: *
075: * @throws IllegalStateException if the commands options aren't set correctly
076: * @throws AuthenticationException if the connection could not be established
077: * @throws CommandException if some other thing gone wrong
078: */
079: public void execute(ClientServices client, EventManager eventManager)
080: throws CommandException, AuthenticationException {
081: checkState();
082:
083: client.ensureConnection();
084:
085: try {
086: super .execute(client, eventManager);
087:
088: if (getWatchMode().isWatchOptionAllowed()) {
089: String[] arguments = getWatchNotNull().getArguments();
090: for (int i = 0; i < arguments.length; i++) {
091: addRequest(new ArgumentRequest("-a")); // NOI18N
092: addRequest(new ArgumentRequest(arguments[i]));
093: }
094: }
095:
096: addRequestForWorkingDirectory(client);
097: addArgumentRequests();
098: addRequest(getWatchMode().getCommand());
099:
100: client.processRequests(requests);
101: } catch (CommandException ex) {
102: throw ex;
103: } catch (Exception ex) {
104: throw new CommandException(ex, ex.getLocalizedMessage());
105: } finally {
106: requests.clear();
107: }
108: }
109:
110: /**
111: * If a builder was set-up, it's outputDone() method is called.
112: * This method is called, when the server responses with "ok" or "error"
113: * (== when the command finishes).
114: */
115: public void commandTerminated(TerminationEvent e) {
116: if (builder != null) {
117: builder.outputDone();
118: }
119: }
120:
121: /**
122: * Uses the specified argument to set the appropriate properties.
123: * To be mainly used for automatic settings (like parsing the .cvsrc file)
124: *
125: * @return whether the option (switch) was recognized and set
126: */
127: public boolean setCVSCommand(char opt, String optArg) {
128: if (opt == 'R') {
129: setRecursive(true);
130: } else if (opt == 'l') {
131: setRecursive(false);
132: } else {
133: return false;
134: }
135: return true;
136: }
137:
138: /**
139: * String returned by this method defines which options are available for
140: * this command.
141: */
142: public String getOptString() {
143: return "Rl"; //NOI18N
144: }
145:
146: /**
147: * Resets all switches in this command.
148: * After calling this method, the command behaves like newly created.
149: */
150: public void resetCVSCommand() {
151: setRecursive(true);
152: setWatch(null);
153: }
154:
155: /**
156: * Returns how this command would look like when typed on the command line.
157: */
158: public String getCVSCommand() {
159: StringBuffer cvsCommand = new StringBuffer("watch "); //NOI18N
160: cvsCommand.append(getCVSArguments());
161: appendFileArguments(cvsCommand);
162: return cvsCommand.toString();
163: }
164:
165: /**
166: * Returns the arguments of the command in the command-line style.
167: * Similar to getCVSCommand() however without the files and command's name
168: */
169: public String getCVSArguments() {
170: checkState();
171:
172: StringBuffer cvsArguments = new StringBuffer();
173: cvsArguments.append(getWatchMode().toString());
174: cvsArguments.append(' ');
175:
176: if (!isRecursive()) {
177: cvsArguments.append("-l "); //NOI18N
178: }
179:
180: if (getWatchMode().isWatchOptionAllowed()) {
181: cvsArguments.append("-a ");
182: cvsArguments.append(getWatchNotNull().toString());
183: }
184: return cvsArguments.toString();
185: }
186:
187: /**
188: * Returns the WatchMode.
189: */
190: public WatchMode getWatchMode() {
191: return watchMode;
192: }
193:
194: /**
195: * Sets the WatchMode.
196: */
197: public void setWatchMode(WatchMode watchMode) {
198: this .watchMode = watchMode;
199: }
200:
201: /**
202: * Returns the watch.
203: */
204: public Watch getWatch() {
205: return watch;
206: }
207:
208: private Watch getWatchNotNull() {
209: if (watch == null) {
210: return Watch.ALL;
211: }
212: return watch;
213: }
214:
215: /**
216: * Sets the watch.
217: * If the WatchMode ADD or REMOVE is used, null is the same as Watch.ALL.
218: * If the WatchMode ON or OFF is used, this option isn't used at all.
219: */
220: public void setWatch(Watch watch) {
221: this .watch = watch;
222: }
223:
224: private void checkState() {
225: if (getWatchMode() == null) {
226: throw new IllegalStateException("Watch mode expected!");
227: }
228: }
229: }
|