001 package org.jboss.dna.connector.svn; 002 003 import java.util.Collection; 004 import org.jboss.dna.graph.connector.RepositorySourceException; 005 import org.jboss.dna.graph.request.InvalidWorkspaceException; 006 import org.tmatesoft.svn.core.SVNDirEntry; 007 import org.tmatesoft.svn.core.SVNException; 008 import org.tmatesoft.svn.core.SVNNodeKind; 009 import org.tmatesoft.svn.core.SVNURL; 010 import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager; 011 import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory; 012 import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory; 013 import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl; 014 import org.tmatesoft.svn.core.io.SVNRepository; 015 import org.tmatesoft.svn.core.io.SVNRepositoryFactory; 016 import org.tmatesoft.svn.core.wc.SVNWCUtil; 017 018 /** 019 * @author Serge Pagop 020 */ 021 public class SVNRepositoryUtil { 022 023 /** 024 * @param url 025 * @param sourceName 026 * @return SVNURL 027 */ 028 public static SVNURL createSVNURL( String url, 029 String sourceName ) { 030 031 SVNURL theUrl; 032 try { 033 theUrl = SVNURL.parseURIDecoded(url); 034 } catch (SVNException e) { 035 // protocol not supported by this connector 036 throw new RepositorySourceException(sourceName, 037 "Protocol is not supported by this connector or there is problem in the svn url"); 038 } 039 return theUrl; 040 } 041 042 public static void setNewSVNRepositoryLocation( SVNRepository oldRespository, 043 String url, 044 boolean forceReconnect, 045 String sourceName ) { 046 try { 047 oldRespository.setLocation(createSVNURL(url, sourceName), forceReconnect); 048 } catch (SVNException e) { 049 throw new RepositorySourceException(sourceName, "the old url and a new one has got different protocols"); 050 } 051 } 052 053 /** 054 * @param repository 055 * @param path 056 * @param revisionNumber 057 * @param sourceName 058 * @return SVNNodeKind 059 */ 060 public static SVNNodeKind checkThePath( SVNRepository repository, 061 String path, 062 long revisionNumber, 063 String sourceName ) { 064 SVNNodeKind kind; 065 try { 066 kind = repository.checkPath(path, revisionNumber); 067 068 } catch (SVNException e) { 069 throw new RepositorySourceException(sourceName, e.getMessage()); 070 } 071 return kind; 072 } 073 074 /** 075 * Create a {@link SVNRepository} from a http protocol. 076 * 077 * @param url - the url of the repository. 078 * @param username - username credential. 079 * @param password - password credential 080 * @return {@link SVNRepository}. 081 */ 082 public static SVNRepository createRepository( String url, 083 String username, 084 String password ) { 085 // for DAV (over http and https) 086 DAVRepositoryFactory.setup(); 087 // For File 088 FSRepositoryFactory.setup(); 089 // for SVN (over svn and svn+ssh) 090 SVNRepositoryFactoryImpl.setup(); 091 092 // The factory knows how to create a DAVRepository 093 SVNRepository repository; 094 try { 095 repository = SVNRepositoryFactory.create(SVNURL.parseURIDecoded(url)); 096 097 ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(username, password); 098 repository.setAuthenticationManager(authManager); 099 } catch (SVNException e) { 100 throw new InvalidWorkspaceException(SVNRepositoryConnectorI18n.workspaceDoesNotExist.text(e.getMessage())); 101 } 102 return repository; 103 } 104 105 /** 106 * Util to get the last segment from a path. 107 * 108 * @param repository 109 * @return last segment. 110 */ 111 public static String getRepositoryWorspaceName( SVNRepository repository ) { 112 String[] segments = repository.getLocation().getPath().split("/"); 113 return segments[segments.length - 1]; 114 } 115 116 private SVNRepositoryUtil() { 117 // prvent construction 118 } 119 120 /** 121 * Check if the repository path exist. 122 * 123 * @param repos 124 * @return true if repository exist and false otherwise. 125 */ 126 public static boolean exist( SVNRepository repos ) { 127 try { 128 SVNNodeKind kind = repos.checkPath("", -1); 129 if (kind == SVNNodeKind.NONE) { 130 return false; 131 } 132 return true; 133 134 } catch (SVNException e) { 135 return false; 136 } 137 } 138 139 /** 140 * Check if repository path is a directory. 141 * 142 * @param repos 143 * @param path 144 * @return true if repository path is a directory and false otherwise. 145 */ 146 public static boolean isDirectory( SVNRepository repos, 147 String path ) { 148 try { 149 SVNNodeKind kind = repos.checkPath(path, -1); 150 if (kind == SVNNodeKind.DIR) { 151 return true; 152 } 153 } catch (SVNException e) { 154 return false; 155 } 156 return false; 157 } 158 159 /** 160 * @param repos 161 * @param path 162 * @return a collect of entry from directory path. 163 */ 164 @SuppressWarnings( "unchecked" ) 165 public static Collection<SVNDirEntry> getDir( SVNRepository repos, 166 String path ) { 167 Collection<SVNDirEntry> entries = null; 168 try { 169 return repos.getDir(path, -1, null, (Collection<SVNDirEntry>)null); 170 } catch (SVNException e) { 171 return entries; 172 } 173 } 174 175 /** 176 * Check if the path is a file. 177 * 178 * @param repos 179 * @param path 180 * @return true if the path is a file and false otherwise. 181 */ 182 public static boolean isFile( SVNRepository repos, 183 String path ) { 184 try { 185 SVNNodeKind kind = repos.checkPath(path, -1); 186 if (kind == SVNNodeKind.FILE) { 187 return true; 188 } 189 } catch (SVNException e) { 190 return false; 191 } 192 return false; 193 } 194 195 public static boolean exists( SVNRepository repository, 196 String path ) { 197 try { 198 if (repository.checkPath(path, -1) == SVNNodeKind.NONE) { 199 return false; 200 } else if (repository.checkPath(path, -1) == SVNNodeKind.UNKNOWN) { 201 return false; 202 } 203 } catch (SVNException e) { 204 return false; 205 } 206 return true; 207 } 208 }