1 /*** 2 * Copyright (C) 2008 Jeremy Thomerson (jthomerson@users.sourceforge.net) 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package net.sf.vcaperture.tool; 18 19 import java.util.Collection; 20 import java.util.Collections; 21 22 import net.sf.vcaperture.model.AbstractRepository; 23 import net.sf.vcaperture.services.IRepositoryService; 24 import net.sf.vcaperture.util.ContextUtil; 25 import net.sf.vcaperture.util.RepositoryUtil; 26 import net.sf.vcaperture.util.spring.ApplicationContextFactory; 27 28 import org.apache.commons.lang.StringUtils; 29 import org.apache.commons.lang.time.DurationFormatUtils; 30 import org.apache.log4j.Logger; 31 32 /*** 33 * The default implementation or <tt>IRepositoryTool</tt>. 34 * 35 * @author Jeremy Thomerson (jthomerson@users.sourceforge.net) 36 */ 37 public class DefaultRepositoryTool implements IRepositoryTool { 38 39 private static final Logger LOGGER = Logger.getLogger(DefaultRepositoryTool.class); 40 41 private IRepositoryService mRepositoryService; 42 private Collection<IRepositoryToolListener> mRemoteListeners = Collections.emptyList(); 43 private Collection<IRepositoryToolListener> mLocalListeners = Collections.emptyList(); 44 45 /*** 46 * @see net.sf.vcaperture.tool.IRepositoryTool#runTool() 47 */ 48 public final void runTool() { 49 long start = System.currentTimeMillis(); 50 boolean complete = false; 51 while (!complete) { 52 Collection<AbstractRepository> repos = mRepositoryService.getRepositories(); 53 boolean remoteComplete = runBatch(mRemoteListeners, repos, "remote"); 54 boolean localComplete = runBatch(mLocalListeners, RepositoryUtil.createProcessedRepos(repos), "local"); 55 complete = remoteComplete && localComplete; 56 } 57 String duration = DurationFormatUtils.formatDurationHMS(System.currentTimeMillis() - start); 58 LOGGER.info("Completed runTool() in " + duration); 59 } 60 61 private boolean runBatch(Collection<IRepositoryToolListener> listeners, Collection<AbstractRepository> repos, String name) { 62 LOGGER.info("Starting " + name + " repository tool batch."); 63 boolean allComplete = true; 64 long start = System.currentTimeMillis(); 65 for (AbstractRepository repo : repos) { 66 long repoStart = System.currentTimeMillis(); 67 LOGGER.info("Starting to process repo: " + repo.getName()); 68 boolean repoComplete = processRepository(repo, listeners); 69 if (!repoComplete) { 70 allComplete = false; 71 } 72 String duration = DurationFormatUtils.formatDurationHMS(System.currentTimeMillis() - repoStart); 73 LOGGER.info("Completed processing repo: " + repo.getName() + " in " + duration); 74 } 75 String duration = DurationFormatUtils.formatDurationHMS(System.currentTimeMillis() - start); 76 LOGGER.info(StringUtils.capitalize(name) + " repository tool batch completed in " + duration); 77 return allComplete; 78 } 79 80 protected boolean processRepository(AbstractRepository repo, Collection<IRepositoryToolListener> listeners) { 81 boolean allComplete = true; 82 for (IRepositoryToolListener listener : listeners) { 83 try { 84 listener.repoStart(mRepositoryService, repo); 85 boolean repoComplete = listener.processRepository(mRepositoryService, repo); 86 listener.repoEnd(mRepositoryService, repo); 87 if (!repoComplete) { 88 allComplete = false; 89 } 90 } catch (ToolException te) { 91 String name = listener.getClass().getSimpleName(); 92 LOGGER.error("Error running listener " + name + " on repo " + repo.getName() + ": " + te.getMessage(), te); 93 } 94 } 95 return allComplete; 96 } 97 98 public IRepositoryService getRepositoryService() { 99 return mRepositoryService; 100 } 101 102 public void setRepositoryService(IRepositoryService repositoryService) { 103 mRepositoryService = repositoryService; 104 } 105 106 /*** 107 * @see net.sf.vcaperture.tool.IRepositoryTool#getRemoteListeners() 108 */ 109 public Collection<IRepositoryToolListener> getRemoteListeners() { 110 return mRemoteListeners; 111 } 112 113 /*** 114 * @see net.sf.vcaperture.tool.IRepositoryTool#setRemoteListeners(java.util.Collection) 115 */ 116 public void setRemoteListeners(Collection<IRepositoryToolListener> listeners) { 117 mRemoteListeners = listeners; 118 } 119 120 /*** 121 * @see net.sf.vcaperture.tool.IRepositoryTool#getLocalListeners() 122 */ 123 public Collection<IRepositoryToolListener> getLocalListeners() { 124 return mLocalListeners; 125 } 126 127 /*** 128 * @see net.sf.vcaperture.tool.IRepositoryTool#setLocalListeners(java.util.Collection) 129 */ 130 public void setLocalListeners(Collection<IRepositoryToolListener> listeners) { 131 mLocalListeners = listeners; 132 } 133 134 public static void main(String[] args) { 135 ContextUtil.loadContext(ContextUtil.TOOL); 136 IRepositoryTool tool = ApplicationContextFactory.getFactory().getContext().getBean(IRepositoryTool.class); 137 tool.runTool(); 138 } 139 }