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.util.Commandline;
041: import net.sourceforge.cruisecontrol.util.Util;
042: import net.sourceforge.cruisecontrol.util.ValidationHelper;
043:
044: import org.apache.log4j.Logger;
045:
046: /**
047: * This class allows you to start up ClearCase dynamic views and mount VOBs before you initiate your build. If your view
048: * has been stopped, a VOB unmounted or your machine rebooted, the likelihood is that your build will fail when using
049: * dynamic views. The class therefore allows you to specify a viewpath, from which it works out the view tag and starts
050: * it, optionally you can specify voblist, a comma separated list of VOBs to mount. The reason a viewpath is used rather
051: * than just the view path is that you can reuse a CruiseControl property which defines the source of your build. You
052: * should always specify the viewpath via the root location, i.e. M:\... on Windows or /view/... on Unix Usage:
053: * <clearcaseviewstrapper viewpath="M:\dynamic_view\some_vob\src" voblist="\SourceVOB,\ReleaseVOB"/%gt;
054: *
055: * @author <a href="mailto:kevin.lee@buildmeister.com">Kevin Lee</a>
056: */
057: public class ClearCaseViewstrapper implements Bootstrapper {
058:
059: private static final Logger LOG = Logger
060: .getLogger(ClearCaseViewstrapper.class);
061:
062: private String viewpath;
063: private String voblist;
064:
065: /**
066: * set the path to the view to be started
067: *
068: * @param path
069: * path to view to be started
070: */
071: public void setViewpath(String path) {
072: viewpath = path;
073: }
074:
075: /**
076: * set the list of VOBs to mount, the list is comma separated
077: *
078: * @param list
079: * comma separated list of VOBs to mount
080: */
081: public void setVoblist(String list) {
082: voblist = list;
083: }
084:
085: /*
086: * start the specified view and VOBs.
087: */
088: public void bootstrap() throws CruiseControlException {
089: buildStartViewCommand().executeAndWait(LOG);
090:
091: // have we got some VOBs to mount
092: if (voblist != null) {
093: String[] vobs = getVobsFromList(voblist);
094: for (int i = 0; i < vobs.length; i++) {
095: buildMountVOBCommand(vobs[i]).executeAndWait(LOG);
096: }
097: }
098: }
099:
100: private String[] getVobsFromList(String voblist) {
101: return voblist.split(",");
102: }
103:
104: /*
105: * check whether the appropriate attributes have been set
106: */
107: public void validate() throws CruiseControlException {
108: ValidationHelper.assertIsSet(viewpath, "viewpath", this
109: .getClass());
110: }
111:
112: /*
113: * build a command line for starting the view
114: */
115: protected Commandline buildStartViewCommand() {
116: Commandline commandLine = new Commandline();
117: commandLine.setExecutable("cleartool");
118:
119: commandLine.createArguments("startview", getViewName());
120:
121: return commandLine;
122: }
123:
124: /*
125: * build a command line for starting a VOB
126: */
127: protected Commandline buildMountVOBCommand(String vob) {
128: Commandline commandLine = new Commandline();
129: commandLine.setExecutable("cleartool");
130:
131: commandLine.createArguments("mount", vob);
132:
133: return commandLine;
134: }
135:
136: /*
137: * work out the view tag from the viewpath
138: */
139: private String getViewName() {
140: String viewname;
141: if (isWindows()) {
142: viewname = getWindowsViewname(viewpath);
143: } else {
144: viewname = getUnixViewname(viewpath);
145: }
146: return viewname;
147: }
148:
149: // second part after /view, i.e. /view/viewname
150: private String getUnixViewname(String viewpath) {
151: String[] details = viewpath.split("/", 4);
152: return details.length < 3 ? null : details[2];
153: }
154:
155: // first part after M: drive, i.e. M:\viewname
156: private String getWindowsViewname(String viewpath) {
157: String[] details = viewpath.split("\\\\", 3);
158: return details.length < 2 ? null : details[1];
159: }
160:
161: protected boolean isWindows() {
162: return Util.isWindows();
163: }
164: }
|