View Javadoc

1   package org.itracker.web.ptos;
2   
3   import java.util.Collections;
4   import java.util.Date;
5   import java.util.Map;
6   import java.util.Set;
7   
8   import org.apache.commons.lang.builder.ToStringBuilder;
9   import org.itracker.model.PermissionType;
10  import org.itracker.model.Project;
11  import org.itracker.model.Status;
12  import org.itracker.services.ProjectService;
13  import org.itracker.services.util.UserUtilities;
14  import org.itracker.web.util.ServletContextUtils;
15  
16  public class ProjectPTO {
17  
18  	private final Project project;
19  	
20  	private Long totalOpenIssues = null;
21  	private Long totalResolvedIssues = null;
22  	private Date lastUpdatedIssueDate = null;
23  	private Boolean canCreate = null;
24  	
25  	private final ProjectService projectService;
26  	private final Map<Integer, Set<PermissionType>> permissions;
27  	
28  	public ProjectPTO(Project project, Map<Integer, Set<PermissionType>> permissions) {
29  		this(project, ServletContextUtils.getItrackerServices().getProjectService(), permissions);
30  		
31  	}
32  	public ProjectPTO(Project project, ProjectService projectService, final Map<Integer, Set<PermissionType>> permissions) {
33  		if (null == project) {
34  			throw new IllegalArgumentException("Project must not be null");
35  		}
36  		this.project = project;
37  		this.projectService = projectService;
38  		this.permissions = Collections.unmodifiableMap(permissions);
39  	}
40  	public Project getProject() {
41  		return project;
42  	}
43  
44  	public Long getTotalNumberIssues() {
45  		return getTotalOpenIssues() + getTotalResolvedIssues();
46  	}
47  	public void setTotalNumberIssues(Long totalNumberIssues) {
48  		setTotalOpenIssues(totalNumberIssues);
49  		setTotalResolvedIssues(0l);
50  	}
51  	
52  	public void setTotalOpenIssues(Long totalOpenIssues) {
53  		this.totalOpenIssues = totalOpenIssues;
54  	}
55  	public Long getTotalOpenIssues() {
56  		if (null == totalOpenIssues) {
57  			setupNumberOfOpenIssues(this, projectService);
58  		}
59  		return totalOpenIssues;
60  	}
61  	public void setTotalResolvedIssues(Long totalResolvedIssues) {
62  		this.totalResolvedIssues = totalResolvedIssues;
63  	}
64  	public Long getTotalResolvedIssues() {
65  		if (null == totalResolvedIssues) {
66  			setupNumberOfResolvedIssues(this, projectService);
67  		}
68  		return totalResolvedIssues;
69  	}
70  	
71  	/**
72  	 * @return
73  	 * @see org.itracker.model.AbstractEntity#getCreateDate()
74  	 */
75  	public Date getCreateDate() {
76  		return project.getCreateDate();
77  	}
78  	/**
79  	 * @return
80  	 * @see org.itracker.model.Project#getDescription()
81  	 */
82  	public String getDescription() {
83  		return project.getDescription();
84  	}
85  	/**
86  	 * @return
87  	 * @see org.itracker.model.AbstractEntity#getId()
88  	 */
89  	public Integer getId() {
90  		return project.getId();
91  	}
92  	/**
93  	 * @return
94  	 * @see org.itracker.model.AbstractEntity#getLastModifiedDate()
95  	 */
96  	public Date getLastModifiedDate() {
97  		return project.getLastModifiedDate();
98  	}
99  	/**
100 	 * @return
101 	 * @see org.itracker.model.Project#getName()
102 	 */
103 	public String getName() {
104 		return project.getName();
105 	}
106 	/**
107 	 * @return
108 	 * @see org.itracker.model.Project#getStatus()
109 	 */
110 	public Status getStatus() {
111 		return project.getStatus();
112 	}
113 	
114 	public Boolean getActive() {
115 		return getStatus() == Status.ACTIVE;
116 	}
117 	public Boolean isActive() {
118 		return getActive();
119 	}
120 	public Boolean getViewable() {
121 		return getProject().getStatus() == Status.VIEWABLE;
122 	}
123 	public Boolean isViewable() {
124 		return getViewable();
125 	}
126 	public Boolean getCanCreate() {
127 		if (null == this.canCreate) {
128 			setupCanCreate(this, permissions);
129 		}
130 		return this.canCreate;
131 	}
132 	public Boolean isCanCreate() {
133 		return getCanCreate();
134 	}
135 	public void setCanCreate(Boolean canCreate) {
136 		this.canCreate = canCreate;
137 	}
138 	
139 	
140 	public void setLastUpdatedIssueDate(Date lastUpdatedIssueDate) {
141 		if (null == lastUpdatedIssueDate) {
142 			setupLastIssueUpdateDate(this, projectService);
143 		}
144 		this.lastUpdatedIssueDate = lastUpdatedIssueDate;
145 	}
146 	public Date getLastUpdatedIssueDate() {
147 		return lastUpdatedIssueDate;
148 	}
149 	@Override
150 	public String toString() {
151 		return new ToStringBuilder(this).append("project", getProject()).toString();
152 	}
153 
154 	//TODO: Code Cleanup: this method is not used and I don't like the name (what does setup stand for?)
155 	//TODO: Decide if this code is really needed and document for what
156 	@SuppressWarnings("unused")
157 	private static final void setupNumberOfIssues(ProjectPTO pto,
158 			ProjectService service) {
159 		pto.setTotalNumberIssues(service.getTotalNumberIssuesByProject(pto
160 				.getId()));
161 	}
162 
163 	private static final void setupNumberOfOpenIssues(ProjectPTO pto,
164 			ProjectService service) {
165 		pto.setTotalOpenIssues(service.getTotalNumberOpenIssuesByProject(pto
166 				.getId()));
167 	}
168 
169 	private static final void setupNumberOfResolvedIssues(ProjectPTO pto,
170 			ProjectService service) {
171 		pto.setTotalResolvedIssues(service
172 				.getTotalNumberResolvedIssuesByProject(pto.getId()));
173 	}
174 
175 	private static final void setupCanCreate(ProjectPTO pto,
176 			final Map<Integer, Set<PermissionType>> permissions) {
177 		pto.setCanCreate(UserUtilities.hasPermission(permissions, pto.getId(),
178 				UserUtilities.PERMISSION_CREATE));
179 	}
180 
181 	private static final void setupLastIssueUpdateDate(ProjectPTO pto,
182 			ProjectService service) {
183 		pto.setLastUpdatedIssueDate(service
184 				.getLatestIssueUpdatedDateByProjectId(pto.getId()));
185 	}
186 }