001    /*
002     * file Example.java
003     *
004     * Licensed Materials - Property of IBM
005     * Restricted Materials of IBM - you are allowed to copy, modify and 
006     * redistribute this file as part of any program that interfaces with 
007     * IBM Rational CM API.
008     *
009     * com.ibm.rational.stp.client.samples.Example
010     *
011     * (C) Copyright IBM Corporation 2005, 2008.  All Rights Reserved.
012     * Note to U.S. Government Users Restricted Rights:  Use, duplication or 
013     * disclosure restricted by GSA ADP  Schedule Contract with IBM Corp.
014     */
015    
016    package com.ibm.rational.stp.client.samples;
017    
018    import java.io.File;
019    
020    import javax.wvcm.ProviderFactory;
021    import javax.wvcm.Version;
022    import javax.wvcm.WvcmException;
023    import javax.wvcm.PropertyRequestItem.PropertyRequest;
024    import javax.wvcm.ProviderFactory.Callback;
025    
026    import com.ibm.rational.wvcm.stp.StpLocation;
027    import com.ibm.rational.wvcm.stp.StpProvider;
028    import com.ibm.rational.wvcm.stp.StpProvider.Domain;
029    import com.ibm.rational.wvcm.stp.cc.CcDirectory;
030    import com.ibm.rational.wvcm.stp.cc.CcFile;
031    import com.ibm.rational.wvcm.stp.cc.CcProvider;
032    import com.ibm.rational.wvcm.stp.cc.CcVersion;
033    
034    /**
035     * This sample application uses the ClearCase CM API to
036     * put a file under source control.
037     */
038    public class Example {
039    
040        private static boolean tracing = true;
041    
042        /**
043         * CM API Authentication callback. This callback is invoked when the
044         * ClearCase CM API provider logs in to the CM Server.
045         */
046        private static class MyAuthCallback implements Callback {
047    
048            private final String serverUrl;
049            private final String login;
050            private final String password;
051    
052            /**
053             * Construct a new authentication callback with the correct credentials
054             * for the specified CM server.
055             */
056            public MyAuthCallback(String serverUrl, String login, String password) {
057                this.serverUrl = serverUrl;
058                this.login = login;
059                this.password = password;
060            }
061    
062            /* (non-Javadoc)
063             * @see javax.wvcm.ProviderFactory$Callback#getAuthentication(java.lang.String, int)
064             */
065            public Authentication getAuthentication(String realm, int retries) {
066                trace("Logging in to CM Server: " + serverUrl);
067                trace("Login:    " + login);
068                trace("Password: " + password);
069    
070                // Retry count > 0 means authentication failed.
071                // Perhaps password was wrong or login domain was left out?
072                myAssert(retries == 0);
073    
074                return new Authentication() {
075                    public String loginName() {
076                        // On Windows servers, this should return domain and
077                        // username separated by a backslash
078                        return login;
079                    }
080                    public String password() {
081                        return password;
082                    }
083                };
084            }
085        }
086    
087        static void printUsageMsg() {
088            System.out.println("This program expects the following arguments:");
089            System.out.println("1) URL of a ClearCase CM Server");
090            System.out.println("2) CM Server login");
091            System.out.println("   If the CM Server is a Windows system,");
092            System.out.println("   specify both the domain and login");
093            System.out.println("   separated by a backslash: domain\\login.");
094            System.out.println("3) CM Server password");
095            System.out.println("4) Test file to add to source control");
096            System.out.println("   This file must reside in a loaded, source-");
097            System.out.println("   controlled directory in a ClearCase");
098            System.out.println("   web view on the local machine.");
099            System.out.println();
100            System.out.println("For example:");
101            System.out.println();
102            System.out.println("  http://my_cm_server:9080/TeamWeb/services/Team my_domain\\my_login");
103            System.out.println("          my_password  C:/webviews/a/b/c.txt");
104        }
105    
106        /**
107         * Get the ClearCase CM API provider for this example.
108         * Establish authentication callback for logging in to the CM Server.
109         * @return new ClearCase provider
110         * @throws Exception if provider cannot be instantiated
111         */
112        static CcProvider getProvider(
113                String serverUrl, String login, String password) throws Exception
114        {
115            Callback callback = new MyAuthCallback(serverUrl, login, password);
116            StpProvider provider = (StpProvider) 
117                ProviderFactory.createProvider(CcProvider.CC_ONLY_PROVIDER_CLASS, callback);
118            
119            provider.setServerUrl(serverUrl);
120    
121            return provider.ccProvider();
122        }
123    
124        /**
125         * Construct a CcFile proxy for the specified file.
126         */
127        static CcFile buildProxy(File f, CcProvider provider)
128            throws WvcmException
129        {
130            StpLocation fileLoc = provider.filePathLocation(Domain.CLEAR_CASE, f);
131            CcFile file = provider.ccFile(fileLoc);
132    
133            // Resolve the file to the correct resource type -
134            // CcFile, CcDirectory, etc.
135            return (CcFile) file.doResolve();
136        }
137    
138        /**
139         * Print some interesting properties of the specified file.
140         */
141        static void printProps(CcFile file) throws WvcmException {
142    
143            PropertyRequest wantedProps = new PropertyRequest(
144                    CcFile.IS_VERSION_CONTROLLED,
145                    CcFile.IS_CHECKED_OUT,
146                    CcFile.VERSION.nest(
147                            Version.CREATION_DATE,
148                            Version.VERSION_NAME));
149    
150            file = (CcFile) file.doReadProperties(wantedProps);
151    
152            trace("File is version controlled: " + file.getIsVersionControlled());
153            trace("File is checked out: " + file.getIsCheckedOut());
154    
155            CcVersion version = file.getVersion();
156    
157            trace("File's checked in version: " + version.getVersionName());
158            trace("Checked in version created on: " + version.getCreationDate());
159        }
160    
161        /**
162         * Put the specified file under ClearCase source control. The file must
163         * reside in a ClearCase web view in a source-controlled directory,
164         * but must not already be under source control itself.
165         */
166        static void addToSourceControl(CcFile res, CcDirectory parent)
167            throws Exception
168        {
169            PropertyRequest wantedProps = new PropertyRequest(
170                    CcFile.IS_CHECKED_OUT,
171                    CcFile.IS_VERSION_CONTROLLED);
172    
173            trace("Verifying that file is NOT already source controlled...");
174            res = (CcFile) res.doReadProperties(wantedProps);
175            myAssert(res.getIsVersionControlled() == false);
176    
177            trace("Verifying that the parent folder IS source controlled...");
178            parent = (CcDirectory) parent.doReadProperties(wantedProps);
179            myAssert(parent.getIsVersionControlled() == true);
180    
181            if (parent.getIsCheckedOut()) {
182                trace("Parent folder is already checked out");
183            } else {
184                // In order to add the test file to source control,
185                // the parent directory must first be checked out.
186                trace("Checking out parent folder...");
187                parent.doCheckout(null, null);
188            }
189    
190            trace("Adding file to source control...");
191            res.doVersionControl(null);
192    
193            trace("Checking in parent folder...");
194            parent.doCheckin(null, null);
195        }
196    
197        static void myAssert(boolean expr) {
198            if ( ! expr) {
199                throw new AssertionError();
200            }
201        }
202    
203        static void trace(String string) {
204            if (tracing) {
205                System.out.println("##### " + string);
206            }
207        }
208    
209        public static void main(String[] args) {
210    
211            trace("Processing program arguments");
212            if (args.length != 4) {
213                printUsageMsg();
214                return;
215            }
216            String CMServerUrl = args[0];
217            String login = args[1];
218            String password = args[2];
219            File testFile = new File(args[3]);
220    
221            try {
222                trace("Instantiating ClearCase CM API provider");
223                CcProvider provider = getProvider(CMServerUrl, login, password);
224    
225                trace("Constructing proxy for test file");
226                CcFile testRes = buildProxy(testFile, provider);
227    
228                trace("Constructing proxy for test file's parent directory");
229                File parentDir = testFile.getParentFile();
230                CcDirectory parent = (CcDirectory) buildProxy(parentDir, provider);
231    
232                trace("Adding test file to source control: " + testFile);
233                addToSourceControl(testRes, parent);
234    
235                trace("Printing test file's properties");
236                printProps(testRes);
237    
238                trace("Done");
239    
240            } catch (Exception e) {
241                trace("ClearCase CM API example failed.  Printing stack trace.");
242                e.printStackTrace();
243            }
244        }
245    }