View Javadoc

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 }