001 /* 002 * JBoss, Home of Professional Open Source. 003 * Copyright 2008, Red Hat Middleware LLC, and individual contributors 004 * as indicated by the @author tags. See the copyright.txt file in the 005 * distribution for a full listing of individual contributors. 006 * 007 * This is free software; you can redistribute it and/or modify it 008 * under the terms of the GNU Lesser General Public License as 009 * published by the Free Software Foundation; either version 2.1 of 010 * the License, or (at your option) any later version. 011 * 012 * This software is distributed in the hope that it will be useful, 013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 015 * Lesser General Public License for more details. 016 * 017 * You should have received a copy of the GNU Lesser General Public 018 * License along with this software; if not, write to the Free 019 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 020 * 02110-1301 USA, or see the FSF site: http://www.fsf.org. 021 */ 022 package org.jboss.dna.connector.svn; 023 024 import java.util.UUID; 025 import java.util.concurrent.TimeUnit; 026 import javax.transaction.xa.XAResource; 027 import org.jboss.dna.graph.ExecutionContext; 028 import org.jboss.dna.graph.cache.CachePolicy; 029 import org.jboss.dna.graph.connectors.RepositoryConnection; 030 import org.jboss.dna.graph.connectors.RepositorySourceException; 031 import org.jboss.dna.graph.connectors.RepositorySourceListener; 032 import org.jboss.dna.graph.properties.Name; 033 import org.jboss.dna.graph.properties.NameFactory; 034 import org.jboss.dna.graph.requests.Request; 035 import org.tmatesoft.svn.core.SVNException; 036 import org.tmatesoft.svn.core.io.SVNRepository; 037 038 /** 039 * The repository connection to a SVN Repository instance. 040 * 041 * @author Serge Pagop 042 */ 043 public class SVNRepositoryConnection implements RepositoryConnection { 044 045 protected static final RepositorySourceListener NO_OP_LISTENER = new RepositorySourceListener() { 046 047 /** 048 * {@inheritDoc} 049 */ 050 public void notify( String sourceName, 051 Object... events ) { 052 // do nothing 053 } 054 }; 055 056 private Name uuidPropertyName; 057 private final String sourceName; 058 private final String uuidPropertyNameString; 059 private final CachePolicy cachePolicy; 060 private final SVNRepository repository; 061 private RepositorySourceListener listener = NO_OP_LISTENER; 062 063 public SVNRepositoryConnection( String sourceName, 064 CachePolicy cachePolicy, 065 String uuidPropertyName, 066 SVNRepository repository ) { 067 assert (sourceName != null); 068 assert (repository != null); 069 assert (uuidPropertyName != null); 070 this.sourceName = sourceName; 071 this.cachePolicy = cachePolicy; 072 this.uuidPropertyNameString = uuidPropertyName; 073 this.repository = repository; 074 } 075 076 SVNRepository getRepository() { 077 return repository; 078 } 079 080 /** 081 * {@inheritDoc} 082 */ 083 public String getSourceName() { 084 return sourceName; 085 } 086 087 /** 088 * {@inheritDoc} 089 */ 090 public CachePolicy getDefaultCachePolicy() { 091 return cachePolicy; 092 } 093 094 /** 095 * {@inheritDoc} 096 */ 097 public XAResource getXAResource() { 098 return null; 099 } 100 101 /** 102 * {@inheritDoc} 103 */ 104 public boolean ping( long time, 105 TimeUnit unit ) { 106 try { 107 this.repository.getRepositoryRoot(true); 108 } catch (SVNException e) { 109 return false; 110 } 111 return true; 112 } 113 114 /** 115 * {@inheritDoc} 116 */ 117 public void setListener( RepositorySourceListener listener ) { 118 this.listener = listener != null ? listener : NO_OP_LISTENER; 119 } 120 121 /** 122 * {@inheritDoc} 123 * 124 * @see org.jboss.dna.graph.connectors.RepositoryConnection#close() 125 */ 126 public void close() { 127 // do not care about. 128 } 129 130 /** 131 * {@inheritDoc} 132 * 133 * @see org.jboss.dna.graph.connectors.RepositoryConnection#execute(org.jboss.dna.graph.ExecutionContext, 134 * org.jboss.dna.graph.requests.Request) 135 */ 136 public void execute( ExecutionContext context, 137 Request request ) throws RepositorySourceException { 138 // TODO 139 } 140 141 /** 142 * @return listener 143 */ 144 protected RepositorySourceListener getListener() { 145 return this.listener; 146 } 147 148 /** 149 * Utility method to calculate (if required) and obtain the name that should be used to store the UUID values for each node. 150 * This method may be called without regard to synchronization, since it should return the same value if it happens to be 151 * called concurrently while not yet initialized. 152 * 153 * @param context the execution context 154 * @return the name, or null if the UUID should not be stored 155 */ 156 protected Name getUuidPropertyName( ExecutionContext context ) { 157 if (uuidPropertyName == null) { 158 NameFactory nameFactory = context.getValueFactories().getNameFactory(); 159 uuidPropertyName = nameFactory.create(this.uuidPropertyNameString); 160 } 161 return this.uuidPropertyName; 162 } 163 164 protected UUID generateUuid() { 165 return UUID.randomUUID(); 166 } 167 168 }