1 package org.apache.maven.continuum.web.action;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.ArrayList;
23 import java.util.Collection;
24 import java.util.Collections;
25 import java.util.Comparator;
26 import java.util.List;
27 import java.util.Map;
28
29 import org.apache.continuum.buildmanager.BuildManagerException;
30 import org.apache.continuum.buildmanager.BuildsManager;
31 import org.apache.maven.continuum.ContinuumException;
32 import org.apache.maven.continuum.configuration.ConfigurationService;
33 import org.apache.maven.continuum.model.project.BuildResult;
34 import org.apache.maven.continuum.model.project.Project;
35 import org.apache.maven.continuum.project.ContinuumProjectState;
36 import org.apache.maven.continuum.web.exception.AuthorizationRequiredException;
37 import org.apache.maven.continuum.web.model.GroupSummary;
38 import org.apache.maven.continuum.web.model.ProjectSummary;
39 import org.slf4j.Logger;
40 import org.slf4j.LoggerFactory;
41
42
43
44
45
46
47
48
49 public class SummaryAction
50 extends ContinuumActionSupport
51 {
52 private static final Logger logger = LoggerFactory.getLogger( SummaryAction.class );
53
54 private int projectGroupId;
55
56 private String projectGroupName;
57
58 private List<ProjectSummary> summary;
59
60 private GroupSummary groupSummary = new GroupSummary();
61
62
63
64
65 private BuildsManager parallelBuildsManager;
66
67 public String execute()
68 throws ContinuumException
69 {
70 try
71 {
72 checkViewProjectGroupAuthorization( getProjectGroupName() );
73 }
74 catch ( AuthorizationRequiredException authzE )
75 {
76 addActionError( authzE.getMessage() );
77 return REQUIRES_AUTHORIZATION;
78 }
79
80 Collection<Project> projectsInGroup;
81
82
83 projectsInGroup = getContinuum().getProjectsInGroup( projectGroupId );
84
85 Map<Integer, BuildResult> buildResults = getContinuum().getLatestBuildResults( projectGroupId );
86
87 Map<Integer, BuildResult> buildResultsInSuccess = getContinuum().getBuildResultsInSuccess( projectGroupId );
88
89 summary = new ArrayList<ProjectSummary>();
90
91 groupSummary.setNumErrors( 0 );
92 groupSummary.setNumFailures( 0 );
93 groupSummary.setNumSuccesses( 0 );
94 groupSummary.setNumProjects( 0 );
95
96 for ( Project project : projectsInGroup )
97 {
98 groupSummary.setNumProjects( groupSummary.getNumProjects() + 1 );
99
100 ProjectSummary model = new ProjectSummary();
101
102 model.setId( project.getId() );
103
104 model.setName( project.getName() );
105
106 model.setVersion( project.getVersion() );
107
108 model.setProjectGroupId( project.getProjectGroup().getId() );
109
110 model.setProjectGroupName( project.getProjectGroup().getName() );
111
112 model.setProjectType( project.getExecutorId() );
113
114 try
115 {
116 if ( parallelBuildsManager.isInAnyBuildQueue( project.getId() ) || parallelBuildsManager.isInPrepareBuildQueue( project.getId() ) )
117 {
118 model.setInBuildingQueue( true );
119 }
120 else if ( parallelBuildsManager.isInAnyCheckoutQueue( project.getId() ) )
121 {
122 model.setInCheckoutQueue( true );
123 }
124 else
125 {
126 model.setInBuildingQueue( false );
127 model.setInCheckoutQueue( false );
128 }
129 }
130 catch ( BuildManagerException e )
131 {
132 throw new ContinuumException( e.getMessage(), e );
133 }
134
135 model.setState( project.getState() );
136
137 model.setBuildNumber( project.getBuildNumber() );
138
139 if ( buildResultsInSuccess != null )
140 {
141 BuildResult buildInSuccess = buildResultsInSuccess.get( project.getId() );
142
143 if ( buildInSuccess != null )
144 {
145 model.setBuildInSuccessId( buildInSuccess.getId() );
146 }
147 }
148
149 if ( buildResults != null )
150 {
151 BuildResult latestBuild = buildResults.get( project.getId() );
152
153 if ( latestBuild != null )
154 {
155 model.setLatestBuildId( latestBuild.getId() );
156 populateGroupSummary( latestBuild );
157 model.setLastBuildDateTime( latestBuild.getEndTime() );
158 model.setLastBuildDuration( latestBuild.getDurationTime() );
159 }
160
161 ConfigurationService configuration = getContinuum().getConfiguration();
162
163 if ( configuration.isDistributedBuildEnabled() &&
164 project.getState() == ContinuumProjectState.BUILDING )
165 {
166 model.setLatestBuildId( 0 );
167 }
168 }
169
170 summary.add( model );
171 }
172
173 Comparator<ProjectSummary> projectComparator = new Comparator<ProjectSummary>()
174 {
175 public int compare( ProjectSummary ps1, ProjectSummary ps2 )
176 {
177 return ps1.getName().compareTo( ps2.getName() );
178 }
179 };
180
181 Collections.sort( summary, projectComparator );
182
183 return SUCCESS;
184 }
185
186 private void populateGroupSummary( BuildResult latestBuild )
187 {
188 switch ( latestBuild.getState() )
189 {
190 case ContinuumProjectState.ERROR:
191 groupSummary.setNumErrors( groupSummary.getNumErrors() + 1 );
192 break;
193 case ContinuumProjectState.OK:
194 groupSummary.setNumSuccesses( groupSummary.getNumSuccesses() + 1 );
195 break;
196 case ContinuumProjectState.FAILED:
197 groupSummary.setNumFailures( groupSummary.getNumFailures() + 1 );
198 break;
199 default:
200 if ( latestBuild.getState() == 5 || latestBuild.getState() > 10 )
201 {
202 logger.warn(
203 "unknown buildState value " + latestBuild.getState() + " with build " + latestBuild.getId() );
204 }
205 }
206 }
207
208 public List<ProjectSummary> getProjects()
209 {
210 return summary;
211 }
212
213 public int getProjectGroupId()
214 {
215 return projectGroupId;
216 }
217
218 public void setProjectGroupId( int projectGroupId )
219 {
220 this.projectGroupId = projectGroupId;
221 }
222
223 public String getProjectGroupName()
224 {
225 return projectGroupName;
226 }
227
228 public void setProjectGroupName( String projectGroupName )
229 {
230 this.projectGroupName = projectGroupName;
231 }
232
233 public GroupSummary getGroupSummary()
234 {
235 return groupSummary;
236 }
237
238 public void setGroupSummary( GroupSummary groupSummary )
239 {
240 this.groupSummary = groupSummary;
241 }
242
243
244 public void setParallelBuildsManager( BuildsManager parallelBuildsManager )
245 {
246 this.parallelBuildsManager = parallelBuildsManager;
247 }
248 }