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 }