001 /* 002 * file UcmHelper.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.UcmHelper 010 * 011 * (C) Copyright IBM Corporation 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.cc; 017 018 import javax.wvcm.WvcmException; 019 import javax.wvcm.PropertyRequestItem.PropertyRequest; 020 import javax.wvcm.WvcmException.ReasonCode; 021 022 import com.ibm.rational.wvcm.stp.StpLocation; 023 import com.ibm.rational.wvcm.stp.StpLocation.Namespace; 024 import com.ibm.rational.wvcm.stp.StpProvider.Domain; 025 import com.ibm.rational.wvcm.stp.cc.CcProject; 026 import com.ibm.rational.wvcm.stp.cc.CcProjectFolder; 027 import com.ibm.rational.wvcm.stp.cc.CcProvider; 028 import com.ibm.rational.wvcm.stp.cc.CcResource; 029 import com.ibm.rational.wvcm.stp.cc.CcStream; 030 import com.ibm.rational.wvcm.stp.cc.CcVob; 031 032 public class UcmHelper { 033 034 private final CcProvider m_provider; 035 private CcStream m_devStream; 036 private CcStream m_intStream; 037 private CcProject m_project; 038 private CcProjectFolder m_rootFolder; 039 private final String m_pvobTag; 040 private final String m_loginName; 041 private CcDemoBase m_demo; 042 private CcVob m_pvob; 043 044 public UcmHelper(CcDemoBase demo) throws Exception { 045 m_demo = demo; 046 m_provider = demo.getClearCaseProvider(); 047 m_loginName = demo.props().getLoginName(); 048 m_pvobTag = demo.props().getDemoUcmProjectVob(); 049 050 // Verify project VOB exists. 051 getUcmProjectVob(); 052 } 053 054 public CcStream getUcmDevelopmentStream() throws Exception { 055 if (m_devStream == null) { 056 057 // Construct location object for development stream. 058 StpLocation streamLoc = m_provider.userFriendlySelector( 059 Domain.CLEAR_CASE, 060 Namespace.STREAM, 061 m_loginName + ".dev.stream", 062 m_pvobTag); 063 064 // Use provider's factory method to construct CC stream proxy. 065 // Note: This call does not contact the server. We don't know 066 // at this point whether the stream exists or not. 067 m_devStream = m_provider.ccStream(streamLoc); 068 069 if ( ! resourceExists(m_devStream)) { 070 // The development stream doesn't exist yet. Create it. 071 CcStream intStream = getUcmIntegrationStream(); 072 m_devStream.setParentStream(intStream); 073 trace("Creating UCM demo development stream: " + m_devStream); 074 m_devStream = m_devStream.doCreateCcStream(null); 075 } 076 } 077 return m_devStream; 078 } 079 080 public CcStream getUcmIntegrationStream() throws Exception { 081 if (m_intStream == null) { 082 083 // Construct location object for integration stream. 084 StpLocation streamLoc = m_provider.userFriendlySelector( 085 Domain.CLEAR_CASE, 086 Namespace.STREAM, 087 m_loginName + ".int.stream", 088 m_pvobTag); 089 090 // Use provider's factory method to construct CC stream proxy. 091 // Note: This call does not contact the server. We don't know 092 // at this point whether the stream exists or not. 093 m_intStream = m_provider.ccStream(streamLoc); 094 095 if ( ! resourceExists(m_intStream)) { 096 // The integration stream doesn't exist yet. Create it. 097 CcProject project = getUcmProject(); 098 m_intStream.setParentProject(project); 099 m_intStream.setIsIntegrationStream(true); 100 trace("Creating UCM demo integration stream: " + m_intStream); 101 m_intStream = m_intStream.doCreateCcStream(null); 102 } 103 } 104 return m_intStream; 105 } 106 107 public CcProject getUcmProject() throws Exception { 108 if (m_project == null) { 109 110 // Construct location object for UCM project. 111 StpLocation projectLoc = m_provider.userFriendlySelector( 112 Domain.CLEAR_CASE, 113 Namespace.PROJECT, 114 m_loginName + ".project", 115 m_pvobTag); 116 117 // Use provider's factory method to construct project proxy. 118 // Note: This call does not contact the server. We don't know 119 // at this point whether the project exists or not. 120 m_project = m_provider.ccProject(projectLoc); 121 122 if ( ! resourceExists(m_project)) { 123 // The project doesn't exist yet. Create it. 124 CcProjectFolder folder = getUcmRootFolder(); 125 m_project.setProjectFolder(folder); 126 trace("Creating UCM demo project: " + m_project); 127 m_project = m_project.doCreateCcProject(null); 128 } 129 } 130 return m_project; 131 } 132 133 public CcProjectFolder getUcmRootFolder() throws Exception { 134 if (m_rootFolder == null) { 135 136 // Construct location object for the root project folder. 137 StpLocation folderLoc = m_provider.userFriendlySelector( 138 Domain.CLEAR_CASE, 139 Namespace.FOLDER, 140 "RootFolder", 141 m_pvobTag); 142 143 m_rootFolder = m_provider.ccProjectFolder(folderLoc); 144 145 if ( ! resourceExists(m_rootFolder)) { 146 throw new IllegalStateException("Missing root project folder: " + m_rootFolder); 147 } 148 } 149 return m_rootFolder; 150 } 151 152 public CcVob getUcmProjectVob() throws Exception { 153 if (m_pvob == null) { 154 155 // Construct location object for the root project folder. 156 StpLocation pvobLoc = m_provider.userFriendlySelector( 157 Domain.CLEAR_CASE, 158 Namespace.VOB, 159 null, 160 m_pvobTag); 161 162 m_pvob = m_provider.ccVob(pvobLoc); 163 PropertyRequest wantedProps = new PropertyRequest(CcVob.IS_PROJECT_VOB); 164 m_pvob = (CcVob) m_pvob.doReadProperties(wantedProps); 165 if ( ! m_pvob.getIsProjectVob()) { 166 throw new IllegalStateException("Not a UCM project VOB: " + m_pvob); 167 } 168 } 169 return m_pvob; 170 } 171 172 private boolean resourceExists(CcResource res) throws Exception { 173 try { 174 res = (CcResource) res.doReadProperties(null); 175 return true; 176 } catch (WvcmException ex) { 177 if (ex.getReasonCode() == ReasonCode.NOT_FOUND) { 178 return false; 179 } else { 180 throw ex; 181 } 182 } 183 } 184 185 private void trace(String msg) { 186 m_demo.trace(msg); 187 } 188 }