Author: dam...@jb... Date: 2005-11-29 13:41:40 -0500 (Tue, 29 Nov 2005) New Revision: 1666 Added: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/AddDirectoryOperation.java qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/AddFileOperation.java qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ModifyDirectoryOperation.java qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ModifyFileOperation.java qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/NodeContentMediator.java qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/PathsStack.java qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ResourceOperation.java Removed: qa/forge/portal-extensions/binaries/maven-repo-addons/jdom/ qa/forge/portal-extensions/binaries/maven-repo-addons/tmate/jars/javasvn-cli.jar qa/forge/portal-extensions/binaries/maven-repo-addons/tmate/jars/javasvn-javahl.jar qa/forge/portal-extensions/binaries/maven-repo-addons/tmate/jars/jsch.jar qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/AddDirectoryOperation.java qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/AddFileOperation.java qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ModifyDirectoryOperation.java qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ModifyFileOperation.java qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/NodeContentMediator.java qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/PathsStack.java qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ResourceOperation.java Modified: qa/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/DownloadCountersDescriptor.java qa/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/DownloadCountersWatcher.java qa/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/PollTools.java qa/forge/portal-extensions/forge-kosmos/maven.xml qa/forge/portal-extensions/forge-service/src/java/org/jboss/forge/service/ForgeService.java qa/forge/portal-extensions/primates/src/java/org/jbosslabs/portlets/primates/Primate.java qa/forge/portal-extensions/shotoku/project.xml qa/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/ContentManager.java qa/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/tools/Tools.java qa/forge/portal-extensions/shotoku/shotoku-svn/maven.xml qa/forge/portal-extensions/shotoku/shotoku-svn/project.xml qa/forge/portal-extensions/shotoku/shotoku-svn/src/app/META-INF/application.xml qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/AbstractSvnResource.java qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/NodeContent.java qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnContentManager.java qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnTools.java qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/service/SvnServiceImpl.java qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/test/CommitTest.java Log: MERGED: -r 1648:1665 of trunk portal-extensions into qa for 1.0.7 release. This is the third and hopefully final part of the split merge. Deleted: qa/forge/portal-extensions/binaries/maven-repo-addons/tmate/jars/javasvn-cli.jar =================================================================== (Binary files differ) Deleted: qa/forge/portal-extensions/binaries/maven-repo-addons/tmate/jars/javasvn-javahl.jar =================================================================== (Binary files differ) Deleted: qa/forge/portal-extensions/binaries/maven-repo-addons/tmate/jars/jsch.jar =================================================================== (Binary files differ) Modified: qa/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/DownloadCountersDescriptor.java =================================================================== --- qa/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/DownloadCountersDescriptor.java 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/DownloadCountersDescriptor.java 2005-11-29 18:41:40 UTC (rev 1666) @@ -25,6 +25,7 @@ import java.io.File; import java.io.InputStream; +import java.util.HashSet; import java.util.Hashtable; import java.util.LinkedList; import java.util.List; @@ -156,7 +157,8 @@ try { membersDir = contentManager.getDirectory(portalName+File.separator+ProjectsHelper.MEMBERS_DIR); } catch (ResourceDoesNotExist e) { - // TODO + e.printStackTrace(); + System.out.println ("[DOWNLOADCOUNTERSDESCRIPTOR] Members directory not exists."); return null; } @@ -171,8 +173,7 @@ try { counter = projectDir.getNode(ProjectsHelper.DOWNLOADCOUNTER_DESC); } catch (ResourceDoesNotExist e) { - // TODO - return null; + break; } String projectId = projectDir.getName(); nodes.put(projectId,counter); @@ -194,6 +195,14 @@ */ private void synchronizeCounters (Map<String,org.jboss.shotoku.Node> counters) { + // Checking if tracked projects still have their counter.xml descriptors. + // If not deleting all tracked links for them. + Set<String> projects = getTrackedProjects(); + if (!counters.keySet().containsAll(projects)) { + projects.removeAll(counters.keySet()); + removeLinksForProjects (projects); + } + // Iterating through projects nodes containing download counter descriptors. for (String projectId:counters.keySet()){ try { @@ -266,6 +275,25 @@ } } + private synchronized void removeLinksForProjects (Set<String> projects) { + Set<String> countersLinks = downloadCounters.keySet(); + List<String> linksForRemoval = new LinkedList<String>(); + for (String link: countersLinks) { + if (projects.contains(downloadCounters.get(link).getProjectId())){ + linksForRemoval.add(new String(link)); + } + } + downloadCounters.keySet().removeAll(linksForRemoval); + } + + private synchronized Set<String> getTrackedProjects () { + Set<String> projects = new HashSet<String>(); + for (String link:downloadCounters.keySet()) { + projects.add(downloadCounters.get(link).getProjectId()); + } + return projects; + } + /** * This method returns a List<String> of links which * are now tracked for project given by <projectId> parameter. @@ -277,7 +305,7 @@ private synchronized List<String> getProjectLinks (String projectId) { List<String> links = new LinkedList<String>(); for (String link:downloadCounters.keySet()) { - if (link.indexOf(File.separator+projectId+File.separator)!=-1) { + if (downloadCounters.get(link).getProjectId().equals(projectId)) { links.add(new String(link)); } } @@ -383,7 +411,7 @@ */ public synchronized boolean checkForProjectCounters(String projectId) { for (String link:downloadCounters.keySet()) { - if (link.indexOf(File.separator+projectId+File.separator)!=-1) { + if (downloadCounters.get(link).getProjectId().equals(projectId)) { return true; } } Modified: qa/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/DownloadCountersWatcher.java =================================================================== --- qa/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/DownloadCountersWatcher.java 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/DownloadCountersWatcher.java 2005-11-29 18:41:40 UTC (rev 1666) @@ -24,6 +24,7 @@ package org.jboss.forge.common.projects; import java.util.Collection; +import java.util.Set; import org.jboss.forge.common.service.NodeWatcher; import org.jboss.forge.common.service.ResourceWatcher; @@ -41,8 +42,12 @@ ContentManager contentManager; ResourceWatcher rw; - + /** + * This Collection contains names of projects which contain counter.xml descriptors. + */ + Set<String> counterDescriptors; + /** * Simple constructor saving ContentManager given in parameter * <code>conentManager</code> * @param contentManager @@ -71,11 +76,10 @@ rw.watchResource(DownloadCounterTools.getMainXmlPath(portalName)); // Getting the project ids names where are project download counter descriptors. - Collection<String> projects = descriptor.getDownloadDescriptors(portalName).keySet(); - + counterDescriptors = descriptor.getDownloadDescriptors(portalName).keySet(); // Adding found project download counter descriptors to the ResourceWatcher to watch // for their changes. - for (String id:projects) { + for (String id:counterDescriptors) { rw.watchResource(DownloadCounterTools.getProjectXmlPath(portalName,id)); } return descriptor; @@ -86,7 +90,8 @@ * If the object is changed the method returns new object if not returns null. */ public Object nodeUpdate(String portalName, Object currentValue) { - if (currentValue==null || rw.checkResources()) { + if (currentValue==null || rw.checkResources() + || !checkForNewResources((DownloadCountersDescriptor)currentValue,portalName)) { return getDescriptor(portalName); } else if (((DownloadCountersDescriptor)currentValue).hasChanged()){ DownloadCountersDescriptor descriptor = @@ -97,6 +102,9 @@ return null; } + private boolean checkForNewResources (DownloadCountersDescriptor desc, String portalName) { + return counterDescriptors.containsAll(desc.getDownloadDescriptors(portalName).keySet()); + } } Modified: qa/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/PollTools.java =================================================================== --- qa/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/PollTools.java 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/PollTools.java 2005-11-29 18:41:40 UTC (rev 1666) @@ -25,10 +25,7 @@ import java.io.File; import java.util.List; -import java.util.Map; -import javax.portlet.PortletURL; - import org.jboss.forge.common.ForgeHelper; import org.jboss.portal.common.context.Context; import org.jboss.portal.common.context.DelegateContext; Modified: qa/forge/portal-extensions/forge-kosmos/maven.xml =================================================================== --- qa/forge/portal-extensions/forge-kosmos/maven.xml 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/forge-kosmos/maven.xml 2005-11-29 18:41:40 UTC (rev 1666) @@ -47,7 +47,7 @@ <!-- Deploying new packages --> <ant:copy todir="../${forge.ear.dir}/target/${forge.ear.name}" overwrite="true"> <ant:fileset dir="target"> - <ant:filename name="**/*" /> + <ant:filename name="kosmos**/*" /> </ant:fileset> </ant:copy> </goal> Modified: qa/forge/portal-extensions/forge-service/src/java/org/jboss/forge/service/ForgeService.java =================================================================== --- qa/forge/portal-extensions/forge-service/src/java/org/jboss/forge/service/ForgeService.java 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/forge-service/src/java/org/jboss/forge/service/ForgeService.java 2005-11-29 18:41:40 UTC (rev 1666) @@ -74,19 +74,13 @@ * @see org.jboss.forge.common.service.ForgeManagement#addNodeWatcher(java.lang.String, java.lang.String, org.jboss.forge.common.service.NodeWatcher) */ public Object addNodeWatcher(String portalName, String key, NodeWatcher nw) { - Object initialValue = null; - try { - // Calculating the initial value & putting it into the cache. + // Calculating the initial value & putting it into the cache. + Object initialValue = nw.init(portalName); + putToCache(portalName, key, initialValue); - initialValue = nw.init(portalName); - putToCache(portalName, key, initialValue); + // Registering a new node watcher. + nodeWatchers.put(new CacheKey(portalName, key), nw); - // Registering a new node watcher. - nodeWatchers.put(new CacheKey(portalName, key), nw); - } catch (Throwable t) { - t.printStackTrace(); - } - return initialValue; } Modified: qa/forge/portal-extensions/primates/src/java/org/jbosslabs/portlets/primates/Primate.java =================================================================== --- qa/forge/portal-extensions/primates/src/java/org/jbosslabs/portlets/primates/Primate.java 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/primates/src/java/org/jbosslabs/portlets/primates/Primate.java 2005-11-29 18:41:40 UTC (rev 1666) @@ -107,8 +107,10 @@ projectCtx.put(PROJECT_ELEMENT,project); } } - if (mugshot!=null) { + if (mugshot!=null && !mugshot.equals("")) { context.put(MUGSHOT_ELEMENT,PrimatesTools.getImgCmPath(portalName) + File.separator + mugshot); + } else { + context.put(MUGSHOT_ELEMENT,""); } context.put(COUNTRY_ELEMENT,country); context.put(STATUS_ELEMENT,status); Modified: qa/forge/portal-extensions/shotoku/project.xml =================================================================== --- qa/forge/portal-extensions/shotoku/project.xml 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/shotoku/project.xml 2005-11-29 18:41:40 UTC (rev 1666) @@ -73,14 +73,6 @@ </properties> </dependency> <dependency> - <groupId>commons-logging</groupId> - <artifactId>commons-logging</artifactId> - <version>1.0.4</version> - <properties> - <ejb.manifest.classpath>true</ejb.manifest.classpath> - </properties> - </dependency> - <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.1</version> Modified: qa/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/ContentManager.java =================================================================== --- qa/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/ContentManager.java 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/ContentManager.java 2005-11-29 18:41:40 UTC (rev 1666) @@ -23,6 +23,7 @@ import java.lang.reflect.Constructor; import java.lang.reflect.Method; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -104,6 +105,19 @@ } /** + * Saves the given resources at one time. Recommended if you have multiple + * resources to save. + * + * @param resources + * Resources to save. + * @param logMessage + * Log message to save with. + * @throws RepositoryException + */ + public abstract void save(Collection<AbstractResource> resources, + String logMessage) throws RepositoryException; + + /** * Gets a velocity engine, initialized with default properties, as defined * in velocity.properties in shotoku-base jar. Additionaly, the shotoku * resource loader will be set to read templates from this content manager @@ -178,7 +192,7 @@ return ve; } - protected ContentManager(String id, String prefix) { + protected ContentManager(String id, String prefix) throws RepositoryException { this.id = id; this.prefix = prefix; } Modified: qa/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/tools/Tools.java =================================================================== --- qa/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/tools/Tools.java 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/tools/Tools.java 2005-11-29 18:41:40 UTC (rev 1666) @@ -94,6 +94,20 @@ } /** + * Concatenates two parts of a path into 1: returns a string + * <code>path1/path2</code>. + * + * @param path1 + * First path to concatenate. + * @param path2 + * Second path to concatenate. + * @return + */ + public static String concatenatePaths(String path1, String path2) { + return path1 + "/" + path2; + } + + /** * Concatenates two parts of a property name: returns a string * <code>property1.property2</code>. * Modified: qa/forge/portal-extensions/shotoku/shotoku-svn/maven.xml =================================================================== --- qa/forge/portal-extensions/shotoku/shotoku-svn/maven.xml 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/shotoku/shotoku-svn/maven.xml 2005-11-29 18:41:40 UTC (rev 1666) @@ -15,8 +15,8 @@ <goal name="deploy"> <!-- Constructing the ear. --> <ant:copy overwrite="true" - tofile="target/${shotoku.ear.dir}/shotoku-svn-service.ejb3" - file="target/shotoku-svn-service-1.0.jar" /> + tofile="target/${shotoku.ear.dir}/shotoku-svn.ejb3" + file="target/shotoku-svn-1.0.jar" /> <ant:copy todir="target/${shotoku.ear.dir}" overwrite="true" file="${maven.repo.local}/shotoku/jars/shotoku-base.jar" /> @@ -28,20 +28,14 @@ file="${maven.repo.local}/commons-lang/jars/commons-lang-2.1.jar" /> <ant:copy todir="target/${shotoku.ear.dir}" overwrite="true" - file="${maven.repo.local}/commons-logging/jars/commons-logging-1.0.4.jar" /> + file="${maven.repo.local}/commons-collections/jars/commons-collections-3.1.jar" /> <ant:copy todir="target/${shotoku.ear.dir}" overwrite="true" - file="${maven.repo.local}/commons-collections/jars/commons-collections-3.1.jar" /> + file="${maven.repo.local}/tmate/jars/javasvn.jar" /> <ant:copy todir="target/${shotoku.ear.dir}" overwrite="true"> - <ant:fileset dir="${maven.repo.local}/tmate/jars"> - <ant:filename name="*.jar" /> - </ant:fileset> - </ant:copy> - <ant:copy - todir="target/${shotoku.ear.dir}" overwrite="true"> <ant:fileset dir="${maven.repo.local}/velocity/jars"> - <ant:filename name="velocity*-1.4*.jar" /> + <ant:filename name="velocity*-1.4.jar" /> </ant:fileset> </ant:copy> <ant:copy todir="target/${shotoku.ear.dir}"> Modified: qa/forge/portal-extensions/shotoku/shotoku-svn/project.xml =================================================================== --- qa/forge/portal-extensions/shotoku/shotoku-svn/project.xml 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/shotoku/shotoku-svn/project.xml 2005-11-29 18:41:40 UTC (rev 1666) @@ -7,8 +7,8 @@ <project> <pomVersion>3</pomVersion> <extend>../project.xml</extend> - <id>shotoku-svn-service</id> - <name> Shotokusvn ejb3 service</name> + <id>shotoku-svn</id> + <name>Shotoku svn</name> <currentVersion>1.0</currentVersion> <organization> <name>Adam Warski</name> @@ -28,16 +28,6 @@ </dependency> <dependency> - <groupId>tmate</groupId> - <artifactId>jsch</artifactId> - <version>1.0</version> - <jar>jsch.jar</jar> - <properties> - <ejb.manifest.classpath>true</ejb.manifest.classpath> - </properties> - </dependency> - - <dependency> <groupId>shotoku</groupId> <artifactId>shotoku-base</artifactId> <jar>shotoku-base.jar</jar> @@ -62,16 +52,7 @@ <ejb.manifest.classpath>true</ejb.manifest.classpath> </properties> </dependency> - <dependency> - <groupId>velocity</groupId> - <artifactId>velocity</artifactId> - <version>1.4-dev</version> - <properties> - <ejb.manifest.classpath>true</ejb.manifest.classpath> - </properties> - </dependency> - <dependency> <groupId>jboss</groupId> <artifactId>jboss-ejb3</artifactId> Modified: qa/forge/portal-extensions/shotoku/shotoku-svn/src/app/META-INF/application.xml =================================================================== --- qa/forge/portal-extensions/shotoku/shotoku-svn/src/app/META-INF/application.xml 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/shotoku/shotoku-svn/src/app/META-INF/application.xml 2005-11-29 18:41:40 UTC (rev 1666) @@ -1,6 +1,6 @@ <application> <display-name>Shotoku service</display-name> <module> - <ejb>shotoku-svn-service.ejb3</ejb> + <ejb>shotoku-svn.ejb3</ejb> </module> </application> Modified: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/AbstractSvnResource.java =================================================================== --- qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/AbstractSvnResource.java 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/AbstractSvnResource.java 2005-11-29 18:41:40 UTC (rev 1666) @@ -22,12 +22,14 @@ package org.jboss.shotoku.svn; import java.io.File; +import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.jboss.shotoku.AbstractResource; import org.jboss.shotoku.Directory; import org.jboss.shotoku.exceptions.RepositoryException; +import org.jboss.shotoku.svn.operations.ResourceOperation; /** * @author Adam Warski (ad...@as...) @@ -176,4 +178,13 @@ return new SvnDirectory(id, parentPath, parentFile, svnCm); } + + // TODO + public void addOperations(Collection<ResourceOperation> ops) { + + } + + public void addNodeContent(Map<String, NodeContent> contents) { + + } } Modified: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/NodeContent.java =================================================================== --- qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/NodeContent.java 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/NodeContent.java 2005-11-29 18:41:40 UTC (rev 1666) @@ -151,4 +151,10 @@ return 0; } + + /* NOT USED */ + + public void delete() { + + } } Modified: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnContentManager.java =================================================================== --- qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnContentManager.java 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnContentManager.java 2005-11-29 18:41:40 UTC (rev 1666) @@ -22,14 +22,35 @@ package org.jboss.shotoku.svn; import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.apache.commons.configuration.Configuration; +import org.jboss.shotoku.AbstractResource; import org.jboss.shotoku.ContentManager; import org.jboss.shotoku.Directory; import org.jboss.shotoku.Node; import org.jboss.shotoku.exceptions.RepositoryException; import org.jboss.shotoku.exceptions.ResourceDoesNotExist; +import org.jboss.shotoku.svn.operations.NodeContentMediator; +import org.jboss.shotoku.svn.operations.PathsStack; +import org.jboss.shotoku.svn.operations.ResourceOperation; import org.jboss.shotoku.tools.Tools; +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.SVNURL; +import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager; +import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory; +import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl; +import org.tmatesoft.svn.core.io.ISVNEditor; +import org.tmatesoft.svn.core.io.SVNRepository; +import org.tmatesoft.svn.core.io.SVNRepositoryFactory; +import org.tmatesoft.svn.core.wc.SVNWCUtil; /** * An implementation of the content manager based on subversion. @@ -40,21 +61,49 @@ /** * <code>service</code> - service interface binding. */ - private static SvnService service = SvnTools.getService(); + private static SvnService service; public static void setup(String id, Configuration conf) { service.registerRepository(id, conf); } + static { + service = SvnTools.getService(); + + // Configuring the repositories. + // for DAV (over http and https) + DAVRepositoryFactory.setup(); + + // for SVN (over svn and svn+ssh) + SVNRepositoryFactoryImpl.setup(); + } + /* * */ private int prefixLength; - public SvnContentManager(String id, String prefix, Configuration conf) { + private SVNRepository repository; + + public SvnContentManager(String id, String prefix, Configuration conf) + throws RepositoryException { super(id, prefix); prefixLength = prefix.length(); + + // Creating a new repository. + try { + repository = SVNRepositoryFactory.create(SVNURL.parseURIEncoded( + conf.getString(SvnTools.PROPERTY_URL))); + } catch (SVNException e) { + throw new RepositoryException(e); + } + + ISVNAuthenticationManager authManager = + SVNWCUtil.createDefaultAuthenticationManager( + conf.getString(SvnTools.PROPERTY_USERNAME), + conf.getString(SvnTools.PROPERTY_PASSWORD)); + repository.setAuthenticationManager(authManager); } /** @@ -168,4 +217,44 @@ return new SvnDirectory(id, getPrefixedPath(path), file, this); } + + @Override + public void save(Collection<AbstractResource> resources, + String logMessage) throws RepositoryException { + // Collection all operations to perform - duplicates are automatically + // removed as we use a Set. Alse, collecting NodeContent objects which + // will be used while executing operations, so we can initialize a + // NodeContentMediator. + Set<ResourceOperation> ops = new HashSet<ResourceOperation>(); + Map<String, NodeContent> contents = new HashMap<String, NodeContent>(); + for (AbstractResource resource : resources) { + AbstractSvnResource svnResource = (AbstractSvnResource) resource; + svnResource.addOperations(ops); + svnResource.addNodeContent(contents); + } + + // Sorting all operations. + List<ResourceOperation> opsList = + new ArrayList<ResourceOperation>(ops); + Collections.sort(opsList); + + try { + // We create a NodeContentMediator, later a PathStack, which will + // be supplied to all operations while executing. + ISVNEditor editor = repository.getCommitEditor(logMessage, + new NodeContentMediator(contents)); + + PathsStack stack = new PathsStack(editor); + + // Now that we have the good operation order, we can execute them. + for (ResourceOperation op : opsList) { + op.execute(stack); + } + + // Finally, closing the stack. + stack.close(); + } catch (SVNException e) { + throw new RepositoryException(e); + } + } } Modified: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnTools.java =================================================================== --- qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnTools.java 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnTools.java 2005-11-29 18:41:40 UTC (rev 1666) @@ -31,6 +31,11 @@ * @author Damon Sicore (da...@si...) */ public class SvnTools { + public static final String PROPERTY_USERNAME = "username"; + public static final String PROPERTY_URL = "url"; + public static final String PROPERTY_PASSWORD = "password"; + public static final String PROPERTY_LOCALPATH = "localpath"; + private static SvnService instance; public static SvnService getService() { Copied: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations (from rev 1665, trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations) Deleted: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/AddDirectoryOperation.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/AddDirectoryOperation.java 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/AddDirectoryOperation.java 2005-11-29 18:41:40 UTC (rev 1666) @@ -1,24 +0,0 @@ -package org.jboss.shotoku.svn.operations; - -import org.jboss.shotoku.tools.Tools; -import org.tmatesoft.svn.core.SVNException; -import org.tmatesoft.svn.core.io.ISVNEditor; - -public class AddDirectoryOperation extends ResourceOperation { - private String parentPath; - - public AddDirectoryOperation(String parentPath, String newName) { - super(Tools.concatenatePaths(parentPath, newName), - OpCode.ADD_DIRECTORY); - - this.parentPath = parentPath; - } - - public void execute(PathsStack stack) throws SVNException { - stack.accomodate(parentPath, true); - - ISVNEditor editor = stack.getEditor(); - editor.addDir(path, null, -1); - stack.addPath(path, false); - } -} Copied: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/AddDirectoryOperation.java (from rev 1665, trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/AddDirectoryOperation.java) Deleted: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/AddFileOperation.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/AddFileOperation.java 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/AddFileOperation.java 2005-11-29 18:41:40 UTC (rev 1666) @@ -1,24 +0,0 @@ -package org.jboss.shotoku.svn.operations; - -import org.jboss.shotoku.tools.Tools; -import org.tmatesoft.svn.core.SVNException; -import org.tmatesoft.svn.core.io.ISVNEditor; - -public class AddFileOperation extends ResourceOperation { - private String parentPath; - - public AddFileOperation(String parentPath, String newName) { - super(Tools.concatenatePaths(parentPath, newName), - OpCode.ADD_FILE); - - this.parentPath = parentPath; - } - - public void execute(PathsStack stack) throws SVNException { - stack.accomodate(parentPath, true); - - ISVNEditor editor = stack.getEditor(); - editor.addFile(path, null, -1); - stack.addPath(path, true); - } -} Copied: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/AddFileOperation.java (from rev 1665, trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/AddFileOperation.java) Deleted: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ModifyDirectoryOperation.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ModifyDirectoryOperation.java 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ModifyDirectoryOperation.java 2005-11-29 18:41:40 UTC (rev 1666) @@ -1,26 +0,0 @@ -package org.jboss.shotoku.svn.operations; - -import java.util.Map; - -import org.tmatesoft.svn.core.SVNException; -import org.tmatesoft.svn.core.io.ISVNEditor; - -public class ModifyDirectoryOperation extends ResourceOperation { - private Map<String, String> properties; - - public ModifyDirectoryOperation(String path, - Map<String, String> properties) { - super(path, OpCode.MODIFY_DIRECTORY); - - this.properties = properties; - } - - public void execute(PathsStack stack) throws SVNException { - stack.accomodate(path, true); - - ISVNEditor editor = stack.getEditor(); - - for (String key : properties.keySet()) - editor.changeDirProperty(key, properties.get(key)); - } -} \ No newline at end of file Copied: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ModifyDirectoryOperation.java (from rev 1665, trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ModifyDirectoryOperation.java) Deleted: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ModifyFileOperation.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ModifyFileOperation.java 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ModifyFileOperation.java 2005-11-29 18:41:40 UTC (rev 1666) @@ -1,46 +0,0 @@ -package org.jboss.shotoku.svn.operations; - -import java.util.Map; - -import org.tmatesoft.svn.core.SVNException; -import org.tmatesoft.svn.core.io.ISVNEditor; -import org.tmatesoft.svn.core.io.diff.SVNDiffWindow; -import org.tmatesoft.svn.core.io.diff.SVNDiffWindowBuilder; - -public class ModifyFileOperation extends ResourceOperation { - private int contentLength; - private Map<String, String> properties; - - public ModifyFileOperation(String path, int contentLength, - Map<String, String> properties) { - super(path, OpCode.MODIFY_FILE); - - this.contentLength = contentLength; - this.properties = properties; - } - - public void execute(PathsStack stack) throws SVNException { - stack.accomodate(path, false); - - ISVNEditor editor = stack.getEditor(); - if (!stack.isFileOpened()) { - editor.openFile(path, -1); - stack.addPath(path, true); - } - - for (String key : properties.keySet()) - editor.changeFileProperty(path, key, properties.get(key)); - - if (contentLength != -1) { - // While creating the ISVNEditor, it was supplied with a - // WorkspaceMediator which reads data from already created - // NodeContent objects. So no need to write anything (in fact, - // we shouldn't, as the ostream is null). - editor.applyTextDelta(path, null); - SVNDiffWindow diffWindow = SVNDiffWindowBuilder - .createReplacementDiffWindow(contentLength); - editor.textDeltaChunk(path, diffWindow); - editor.textDeltaEnd(path); - } - } -} Copied: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ModifyFileOperation.java (from rev 1665, trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ModifyFileOperation.java) Deleted: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/NodeContentMediator.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/NodeContentMediator.java 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/NodeContentMediator.java 2005-11-29 18:41:40 UTC (rev 1666) @@ -1,86 +0,0 @@ -package org.jboss.shotoku.svn.operations; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Map; - -import org.jboss.shotoku.svn.NodeContent; -import org.tmatesoft.svn.core.SVNException; -import org.tmatesoft.svn.core.io.ISVNWorkspaceMediator; - -public class NodeContentMediator implements - ISVNWorkspaceMediator { - - public NodeContentMediator(Map<String, NodeContent> contents) { - - } - - public String getWorkspaceProperty(String arg0, String arg1) throws SVNException { - // TODO Auto-generated method stub - return null; - } - - public void setWorkspaceProperty(String arg0, String arg1, String arg2) throws SVNException { - // TODO Auto-generated method stub - - } - - public OutputStream createTemporaryLocation(String arg0, Object arg1) throws IOException { - // TODO Auto-generated method stub - return null; - } - - public InputStream getTemporaryLocation(Object arg0) throws IOException { - // TODO Auto-generated method stub - return null; - } - - public long getLength(Object arg0) throws IOException { - // TODO Auto-generated method stub - return 0; - } - - public void deleteTemporaryLocation(Object arg0) { - // TODO Auto-generated method stub - - } - /*private Map<Object, String> idsBindings; - private Map<String, NodeContent> contents; - - public String getWorkspaceProperty(String path, String name) - throws SVNException { - return null; - } - - public void setWorkspaceProperty(String path, String name, String value) - throws SVNException { - } - - public NodeContentMediator(Map<String, NodeContent> contents) { - this.contents = contents; - idsBindings = new HashMap<Object, String>(); - } - - public OutputStream createTemporaryLocation(String path, Object id) - throws IOException { - idsBindings.put(id, path); - return null; - } - - private NodeContent getNodeContent(Object id) { - return contents.get(idsBindings.get(id)); - } - - public InputStream getTemporaryLocation(Object id) throws IOException { - return getNodeContent(id).asInputStream(); - } - - public long getLength(Object id) throws IOException { - return getNodeContent(id).getLength(); - } - - public void deleteTemporaryLocation(Object id) { - getNodeContent(id).free(); - }*/ -} Copied: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/NodeContentMediator.java (from rev 1665, trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/NodeContentMediator.java) Deleted: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/PathsStack.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/PathsStack.java 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/PathsStack.java 2005-11-29 18:41:40 UTC (rev 1666) @@ -1,85 +0,0 @@ -package org.jboss.shotoku.svn.operations; - -import java.util.Stack; - -import org.jboss.shotoku.tools.Tools; -import org.tmatesoft.svn.core.SVNException; -import org.tmatesoft.svn.core.io.ISVNEditor; - -public class PathsStack { - private Stack<String> pathsStack; - private boolean fileOnTop; - private ISVNEditor editor; - - public PathsStack(ISVNEditor editor) throws SVNException { - pathsStack = new Stack<String>(); - fileOnTop = false; - this.editor = editor; - - editor.openRoot(-1); - } - - /** - * Accomodates the paths opened in editor to the given new path. This - * should be used only to open existing directories. - * @param newPath - * @param openLast - * @throws SVNException - */ - public void accomodate(String newPath, boolean openLast) - throws SVNException { - // If there's a file opened, always closing it. - if (fileOnTop) { - // Checking if we don't want to have the same file opened. - if (newPath.equals(pathsStack.peek())) - return; - - editor.closeFile(pathsStack.pop(), null); - fileOnTop = false; - } - - // Poping and closing all opened directories which - // don't fit into the new path. - while (!newPath.startsWith(pathsStack.peek())) { - pathsStack.pop(); - editor.closeDir(); - } - - // Opening directories from the new path and putting their paths on the - // stack. - String currentPath = pathsStack.peek(); - String[] parts = newPath.substring(currentPath.length()).split("[/]"); - for (int i=0; i < (openLast ? parts.length : parts.length - 1); i++) { - currentPath += Tools.concatenatePaths(parts[i], ""); - editor.openDir(currentPath, -1); - pathsStack.push(currentPath); - } - } - - public void addPath(String path, boolean file) { - pathsStack.push(file ? path : Tools.concatenatePaths(path, "")); - fileOnTop = file; - } - - public boolean isFileOpened() { - return fileOnTop; - } - - public ISVNEditor getEditor() { - return editor; - } - - public void close() throws SVNException { - if (isFileOpened()) { - editor.closeFile(pathsStack.pop(), null); - } - - while (!pathsStack.empty()) { - editor.closeDir(); - pathsStack.pop(); - } - - editor.closeDir(); - editor.closeEdit(); - } -} Copied: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/PathsStack.java (from rev 1665, trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/PathsStack.java) Deleted: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ResourceOperation.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ResourceOperation.java 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ResourceOperation.java 2005-11-29 18:41:40 UTC (rev 1666) @@ -1,53 +0,0 @@ -package org.jboss.shotoku.svn.operations; - -import org.tmatesoft.svn.core.SVNException; - -/** - * An base class for operations on the repository. - * @author adamw - */ -public abstract class ResourceOperation implements Comparable<ResourceOperation> { - protected enum OpCode { - ADD_DIRECTORY, - ADD_FILE, - MODIFY_FILE, - MODIFY_DIRECTORY; - } - - protected String path; - protected OpCode opCode; - - public ResourceOperation(String path, OpCode opCode) { - this.path = path; - this.opCode = opCode; - } - - public int compareTo(ResourceOperation ro) { - int pathsCompare = path.compareTo(ro.path); - if (pathsCompare == 0) - return opCode.compareTo(ro.opCode); - - return pathsCompare; - } - - @Override - public boolean equals(Object obj) { - ResourceOperation ro = (ResourceOperation) obj; - return path.equals(ro.path) && opCode.equals(ro.opCode); - } - - @Override - public int hashCode() { - return path.hashCode() + opCode.hashCode(); - } - - /** - * Executes the specific acitons represented by this object. - * - * @param stack - * Paths stack which represents the currently open paths, and is - * an access point to a ISVNEditor instance. - * @throws SVNException - */ - public abstract void execute(PathsStack stack) throws SVNException; -} Copied: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ResourceOperation.java (from rev 1665, trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/operations/ResourceOperation.java) Modified: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/service/SvnServiceImpl.java =================================================================== --- qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/service/SvnServiceImpl.java 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/service/SvnServiceImpl.java 2005-11-29 18:41:40 UTC (rev 1666) @@ -37,6 +37,7 @@ import org.jboss.shotoku.svn.RevisionInfo; import org.jboss.shotoku.svn.SvnOperationFailed; import org.jboss.shotoku.svn.SvnService; +import org.jboss.shotoku.svn.SvnTools; import org.jboss.shotoku.svn.service.operations.AddDelayedOperation; import org.jboss.shotoku.svn.service.operations.CommitDelayedOperation; import org.jboss.shotoku.svn.service.operations.DeleteDelayedOperation; @@ -146,10 +147,10 @@ public void registerRepository(String id, Configuration conf) { if (repositories.get(id) == null) { SvnRepository repo = new SvnRepository( - conf.getString("username"), - conf.getString("password"), - conf.getString("url"), - conf.getString("localpath")); + conf.getString(SvnTools.PROPERTY_USERNAME), + conf.getString(SvnTools.PROPERTY_PASSWORD), + conf.getString(SvnTools.PROPERTY_URL), + conf.getString(SvnTools.PROPERTY_LOCALPATH)); repositories.put(id, repo); Modified: qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/test/CommitTest.java =================================================================== --- qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/test/CommitTest.java 2005-11-29 18:40:15 UTC (rev 1665) +++ qa/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/test/CommitTest.java 2005-11-29 18:41:40 UTC (rev 1666) @@ -10,7 +10,6 @@ import org.tmatesoft.svn.core.SVNCommitInfo; import org.tmatesoft.svn.core.SVNException; -import org.tmatesoft.svn.core.SVNNodeKind; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager; import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory; @@ -19,8 +18,6 @@ import org.tmatesoft.svn.core.io.ISVNWorkspaceMediator; import org.tmatesoft.svn.core.io.SVNRepository; import org.tmatesoft.svn.core.io.SVNRepositoryFactory; -import org.tmatesoft.svn.core.wc.ISVNOptions; -import org.tmatesoft.svn.core.wc.SVNClientManager; import org.tmatesoft.svn.core.wc.SVNWCUtil; public class CommitTest { @@ -34,9 +31,8 @@ ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager( "jbf...@jb...", "rO@B5oPfff"); repository.setAuthenticationManager(authManager); - - SVNNodeKind nodeKind = null; - nodeKind = repository.checkPath("", -1); + + repository.checkPath("", -1); long latestRevision = -1; latestRevision = repository.getLatestRevision(); @@ -45,8 +41,6 @@ System.out.println(""); ISVNEditor editor = repository.getCommitEditor("zzz", new WorkspaceMediator()); - - SVNCommitInfo commitInfo = null; editor.openRoot(-1); editor.addDir("/test2", null, -1); |