001: /********************************************************************************
002: * CruiseControl, a Continuous Integration Toolkit
003: * Copyright (c) 2001, ThoughtWorks, Inc.
004: * 200 E. Randolph, 25th Floor
005: * Chicago, IL 60601 USA
006: * All rights reserved.
007: *
008: * Redistribution and use in source and binary forms, with or without
009: * modification, are permitted provided that the following conditions
010: * are met:
011: *
012: * + Redistributions of source code must retain the above copyright
013: * notice, this list of conditions and the following disclaimer.
014: *
015: * + Redistributions in binary form must reproduce the above
016: * copyright notice, this list of conditions and the following
017: * disclaimer in the documentation and/or other materials provided
018: * with the distribution.
019: *
020: * + Neither the name of ThoughtWorks, Inc., CruiseControl, nor the
021: * names of its contributors may be used to endorse or promote
022: * products derived from this software without specific prior
023: * written permission.
024: *
025: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
026: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
027: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
028: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
029: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
030: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
031: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
032: * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
033: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
034: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
035: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
036: ********************************************************************************/package net.sourceforge.cruisecontrol.bootstrappers;
037:
038: import net.sourceforge.cruisecontrol.Bootstrapper;
039: import net.sourceforge.cruisecontrol.CruiseControlException;
040: import net.sourceforge.cruisecontrol.builders.AntBuilder;
041: import net.sourceforge.cruisecontrol.builders.Property;
042: import net.sourceforge.cruisecontrol.sourcecontrols.accurev.AccurevCommand;
043: import net.sourceforge.cruisecontrol.sourcecontrols.accurev.AccurevCommandline;
044: import net.sourceforge.cruisecontrol.sourcecontrols.accurev.Runner;
045:
046: /**
047: * Simply runs "accurev update" to update the current workspace. Automatic keep and synctime are
048: * provided as options.
049: *
050: * @author <a href="mailto:jason_chown@scee.net">Jason Chown</a>
051: * @author <a href="mailto:Nicola_Orru@scee.net">Nicola Orru'</a>
052: */
053: public class AccurevBootstrapper implements Bootstrapper {
054: private boolean verbose;
055: private boolean keep;
056: private boolean synctime;
057: private String workspace;
058: private Runner runner;
059: private AntBuilder delegate = new AntBuilder();
060:
061: /**
062: * Enables/disables verbose logging
063: *
064: * @param verbose
065: * if true, verbose logging is enabled
066: */
067: public void setVerbose(boolean verbose) {
068: this .verbose = verbose;
069: }
070:
071: /**
072: * Enables/disables automatic keep
073: *
074: * @param keep
075: * if true, "accurev keep -m" is run on the selected workspace, to keep al modified files
076: */
077: public void setKeep(boolean keep) {
078: this .keep = keep;
079: }
080:
081: /**
082: * Enables/disables automatic synctime
083: *
084: * @param synctime
085: * if true, "accurev synctime" is run on the selected workspace, synchronizing the
086: * server's time with the client's
087: */
088: public void setSynctime(boolean synctime) {
089: this .synctime = synctime;
090: }
091:
092: /**
093: * Selects a workspace
094: *
095: * @param workspace
096: * the path of the workspace to work in, in the local filesystem
097: */
098: public void setWorkspace(String workspace) {
099: this .workspace = workspace;
100: }
101:
102: private void runAccurev(AccurevCommandline cmd)
103: throws CruiseControlException {
104: if (runner != null) {
105: cmd.setRunner(runner);
106: }
107: cmd.setWorkspaceLocalPath(workspace);
108: cmd.setVerbose(verbose);
109: cmd.run();
110: cmd.assertSuccess();
111: }
112:
113: /**
114: * Runs the bootstrapper: updates the selected workspace. If required, it runs synctime and keep
115: * before updating.
116: */
117: public void bootstrap() throws CruiseControlException {
118: if (synctime) {
119: runAccurev(AccurevCommand.SYNCTIME.create());
120: }
121: if (keep) {
122: AccurevCommandline cmdKeep = AccurevCommand.KEEP.create();
123: cmdKeep.selectModified();
124: cmdKeep.setComment("CruiseControl automatic keep");
125: runAccurev(cmdKeep);
126: }
127: runAccurev(AccurevCommand.UPDATE.create());
128: }
129:
130: public void setRunner(Runner runner) {
131: this .runner = runner;
132: }
133:
134: public void validate() throws CruiseControlException {
135: delegate.validate();
136: }
137:
138: /**
139: * @see net.sourceforge.cruisecontrol.builders.AntBuilder#setSaveLogDir(String)
140: */
141: public void setSaveLogDir(String dir) {
142: delegate.setSaveLogDir(dir);
143: }
144:
145: /**
146: * @see net.sourceforge.cruisecontrol.builders.AntBuilder#setAntWorkingDir(String)
147: */
148: public void setAntWorkingDir(String dir) {
149: delegate.setAntWorkingDir(dir);
150: }
151:
152: /**
153: * @see net.sourceforge.cruisecontrol.builders.AntBuilder#setAntScript(String)
154: */
155: public void setAntScript(String antScript) {
156: delegate.setAntScript(antScript);
157: }
158:
159: /**
160: * @see net.sourceforge.cruisecontrol.builders.AntBuilder#setAntHome(String)
161: */
162: public void setAntHome(String antHome) {
163: delegate.setAntHome(antHome);
164: }
165:
166: /**
167: * @see net.sourceforge.cruisecontrol.builders.AntBuilder#setTempFile(String)
168: */
169: public void setTempFile(String tempFileName) {
170: delegate.setTempFile(tempFileName);
171: }
172:
173: /**
174: * @see net.sourceforge.cruisecontrol.builders.AntBuilder#setTarget(String)
175: */
176: public void setTarget(String target) {
177: delegate.setTarget(target);
178: }
179:
180: /**
181: * @see net.sourceforge.cruisecontrol.builders.AntBuilder#setBuildFile(String)
182: */
183: public void setBuildFile(String buildFile) {
184: delegate.setBuildFile(buildFile);
185: }
186:
187: /**
188: * @see net.sourceforge.cruisecontrol.builders.AntBuilder#setUseLogger(boolean)
189: */
190: public void setUseLogger(boolean useLogger) {
191: delegate.setUseLogger(useLogger);
192: }
193:
194: /**
195: * @see net.sourceforge.cruisecontrol.builders.AntBuilder#createJVMArg()
196: */
197: public Object createJVMArg() {
198: return delegate.createJVMArg();
199: }
200:
201: /**
202: * @see net.sourceforge.cruisecontrol.builders.AntBuilder#createProperty()
203: */
204: public Property createProperty() {
205: return delegate.createProperty();
206: }
207:
208: /**
209: * @see net.sourceforge.cruisecontrol.builders.AntBuilder#setUseDebug(boolean)
210: */
211: public void setUseDebug(boolean debug) {
212: delegate.setUseDebug(debug);
213: }
214:
215: /**
216: * @see net.sourceforge.cruisecontrol.builders.AntBuilder#setUseQuiet(boolean)
217: */
218: public void setUseQuiet(boolean quiet) {
219: delegate.setUseQuiet(quiet);
220: }
221:
222: /**
223: * @see net.sourceforge.cruisecontrol.builders.AntBuilder#getLoggerClassName()
224: */
225: public String getLoggerClassName() {
226: return delegate.getLoggerClassName();
227: }
228:
229: /**
230: * @see net.sourceforge.cruisecontrol.builders.AntBuilder#setLoggerClassName(String)
231: */
232: public void setLoggerClassName(String string) {
233: delegate.setLoggerClassName(string);
234: }
235:
236: /**
237: * @see net.sourceforge.cruisecontrol.builders.AntBuilder#setTimeout(long)
238: */
239: public void setTimeout(long timeout) {
240: delegate.setTimeout(timeout);
241: }
242: }
|