1 package com.proalpha.pds.checks;
4 import java.text.MessageFormat;
5 import java.text.SimpleDateFormat;
6 import java.util.Calendar;
10 import java.util.TreeSet;
12 import javax.xml.bind.JAXBContext;
13 import javax.xml.bind.JAXBException;
14 import javax.xml.bind.Unmarshaller;
16 import org.eclipse.core.resources.IProject;
17 import org.eclipse.core.resources.IWorkspaceRoot;
18 import org.eclipse.core.resources.ResourcesPlugin;
19 import org.eclipse.core.runtime.CoreException;
20 import org.eclipse.core.runtime.IPath;
21 import org.eclipse.core.runtime.Path;
22 import org.eclipse.core.runtime.QualifiedName;
23 import org.eclipse.jface.action.Action;
24 import org.eclipse.jface.action.IToolBarManager;
25 import org.eclipse.jface.dialogs.MessageDialog;
26 import org.eclipse.jface.resource.ImageDescriptor;
27 import org.eclipse.jface.viewers.StructuredSelection;
28 import org.eclipse.jface.viewers.TreeViewer;
29 import org.eclipse.swt.SWT;
30 import org.eclipse.swt.events.SelectionEvent;
31 import org.eclipse.swt.events.SelectionListener;
32 import org.eclipse.swt.graphics.Cursor;
33 import org.eclipse.swt.layout.GridData;
34 import org.eclipse.swt.layout.GridLayout;
35 import org.eclipse.swt.layout.RowLayout;
36 import org.eclipse.swt.widgets.Button;
37 import org.eclipse.swt.widgets.Combo;
38 import org.eclipse.swt.widgets.Composite;
39 import org.eclipse.swt.widgets.Display;
40 import org.eclipse.swt.widgets.Group;
41 import org.eclipse.swt.widgets.Label;
42 import org.eclipse.ui.PlatformUI;
43 import org.eclipse.ui.forms.widgets.Form;
44 import org.eclipse.ui.forms.widgets.FormToolkit;
45 import org.eclipse.ui.part.ViewPart;
47 import com.proalpha.pds.jaxb.DsDSConsistencyChecks;
48 import com.proalpha.pds.jaxb.DsDSConsistencyChecks.TtDSCheck;
49 import com.proalpha.pds.jaxb.DsDSConsistencyChecks.TtDSCheck.TtDSSubCheck;
50 import com.proalpha.pds.jaxb.DsDSConsistencyChecks.TtDSCheck.TtDSSubCheck.TtDSLogEntryRepos;
51 import com.proalpha.pds.jaxb.DsDSConsistencyChecks.TtDSCheck.TtDSSubCheck.TtDSLogEntrySrc;
52 import com.proalpha.pds.paconnector.PaProject;
65 private static final String LOCAL =
"Local";
66 public static final String ID =
"com.proalpha.pds.checks.CheckTreeView";
67 private static final String CHECK_ALL =
"<ALL>";
70 private String currentTeam = CHECK_ALL;
71 private String currentModule = CHECK_ALL;
74 private String location;
75 private Combo projectViewer;
76 private Combo teamViewer;
77 private Combo moduleViewer;
78 private TreeViewer viewer;
80 private Button serverButton;
81 private Button localButton;
83 public String getCurrentTeam() {
87 public String getCurrentModule() {
99 setImageDescriptor(ImageDescriptor.createFromURL(getClass().getResource(
"/images/collapse_all.png")));
100 setToolTipText(
"Collapse all");
105 viewer.collapseAll();
117 setImageDescriptor(ImageDescriptor.createFromURL(getClass().getResource(
"/images/expand_all.gif")));
118 setToolTipText(
"Expand all");
132 FormToolkit toolkit =
new FormToolkit(parent.getDisplay());
133 form = toolkit.createForm(parent);
134 form.getBody().setLayout(
new GridLayout(4,
false));
136 toolkit.decorateFormHeading(form);
138 Label lblProject =
new Label(form.getBody(), SWT.NONE);
139 GridData gridData =
new GridData(SWT.RIGHT, SWT.CENTER,
false,
false, 1, 1);
140 gridData.widthHint = 50;
141 lblProject.setLayoutData(gridData);
142 toolkit.adapt(lblProject,
true,
true);
143 lblProject.setText(
"Project");
145 projectViewer =
new Combo(form.getBody(), SWT.DROP_DOWN | SWT.READ_ONLY);
146 GridData gridDataCombo =
new GridData(SWT.FILL, SWT.CENTER,
true,
false, 2, 1);
147 gridDataCombo.widthHint = 200;
148 projectViewer.setLayoutData(gridDataCombo);
149 projectViewer.setItems(getCurrentProjectList());
150 projectViewer.addSelectionListener(projectSelectedListener());
152 toolkit.adapt(projectViewer);
153 toolkit.paintBordersFor(projectViewer);
155 Group group =
new Group(form.getBody(), SWT.NONE);
156 group.setText(
"Location");
157 group.setLayout(
new RowLayout(SWT.VERTICAL));
158 group.setLayoutData(
new GridData(SWT.LEFT, -7,
false,
false, 1, 2));
159 toolkit.adapt(group);
160 toolkit.paintBordersFor(group);
162 serverButton =
new Button(group, SWT.RADIO);
163 serverButton.setText(
"Server");
164 serverButton.setImage(
165 ImageDescriptor.createFromURL(getClass().getResource(
"/images/server_earth.png")).createImage());
166 serverButton.addSelectionListener(locationSelectedListener());
167 serverButton.setEnabled(
false);
168 toolkit.adapt(serverButton,
true,
true);
170 localButton =
new Button(group, SWT.RADIO);
171 localButton.setText(LOCAL);
173 .setImage(ImageDescriptor.createFromURL(getClass().getResource(
"/images/text_tree.png")).createImage());
174 localButton.addSelectionListener(locationSelectedListener());
175 localButton.setEnabled(
false);
176 localButton.setSelection(
true);
177 toolkit.adapt(localButton,
true,
true);
179 Label lblModule =
new Label(form.getBody(), SWT.NONE);
180 GridData gridData3 =
new GridData(SWT.RIGHT, SWT.CENTER,
false,
false, 1, 1);
181 gridData3.widthHint = 50;
182 lblModule.setLayoutData(gridData3);
183 toolkit.adapt(lblModule,
true,
true);
184 lblModule.setText(
"Module");
186 teamViewer =
new Combo(form.getBody(), SWT.DROP_DOWN | SWT.READ_ONLY);
187 teamViewer.setVisibleItemCount(12);
188 teamViewer.setLayoutData(
new GridData(GridData.FILL, GridData.CENTER,
true,
false, 1, 1));
189 teamViewer.addSelectionListener(teamSelectedListener());
191 toolkit.adapt(teamViewer);
192 toolkit.paintBordersFor(teamViewer);
194 moduleViewer =
new Combo(form.getBody(), SWT.DROP_DOWN | SWT.READ_ONLY);
195 moduleViewer.setVisibleItemCount(12);
196 moduleViewer.setLayoutData(
new GridData(GridData.FILL, GridData.CENTER,
false,
false, 1, 1));
197 moduleViewer.addSelectionListener(moduleSelectedListener());
199 toolkit.adapt(moduleViewer);
200 toolkit.paintBordersFor(moduleViewer);
203 form.setText(
"select an installed project to show the results of the consistency checks");
206 viewer =
new TreeViewer(form.getBody(), SWT.NONE);
208 viewer.setContentProvider(
new CheckTreeViewContentProvider());
209 viewer.setLabelProvider(
new CheckTreeViewLabelProvider(filter));
210 viewer.addFilter(filter);
211 viewer.getTree().setLayoutData(
new GridData(SWT.FILL, SWT.FILL,
false,
true, 4, 1));
213 getSite().setSelectionProvider(viewer);
215 IToolBarManager toolBarManager = getViewSite().getActionBars().getToolBarManager();
220 private SelectionListener projectSelectedListener() {
221 return new SelectionListener() {
222 public void widgetSelected(SelectionEvent selectedItem) {
223 if (selectedItem !=
null) {
224 String selectedProjectName = ((Combo) selectedItem.getSource()).getText();
225 if (!selectedProjectName.isEmpty()) {
226 localButton.setEnabled(
true);
227 serverButton.setEnabled(
true);
229 checksXmlFile(selectedProjectName);
234 public void widgetDefaultSelected(SelectionEvent selectedItem) {
240 private SelectionListener locationSelectedListener() {
241 return new SelectionListener() {
242 public void widgetSelected(SelectionEvent selectedItem) {
244 if (selectedItem !=
null && selectedItem.widget instanceof Button
245 && ((Button) selectedItem.widget).getSelection() && projectViewer.getSelectionIndex() != -1) {
246 location = ((Button) selectedItem.widget).getText();
247 String selectedProjectName = projectViewer.getText();
248 checksXmlFile(selectedProjectName);
253 public void widgetDefaultSelected(SelectionEvent selectedItem) {
259 private SelectionListener teamSelectedListener() {
260 return new SelectionListener() {
262 public void widgetSelected(SelectionEvent selectedItem) {
263 if (selectedItem !=
null) {
264 currentTeam = ((Combo) selectedItem.getSource()).getText();
265 currentModule = CHECK_ALL;
266 filter.setSearchFilter(currentTeam, currentModule);
267 viewer.setSelection(StructuredSelection.EMPTY);
268 moduleViewer.setItems(getModules());
269 moduleViewer.select(moduleViewer.indexOf(CHECK_ALL));
276 public void widgetDefaultSelected(SelectionEvent selectedItem) {
282 private SelectionListener moduleSelectedListener() {
283 return new SelectionListener() {
285 public void widgetSelected(SelectionEvent selectedItem) {
286 if (selectedItem !=
null) {
287 currentModule = ((Combo) selectedItem.getSource()).getText();
288 filter.setSearchFilter(currentTeam, currentModule);
289 viewer.setSelection(StructuredSelection.EMPTY);
296 public void widgetDefaultSelected(SelectionEvent selectedItem) {
302 public void checksXmlFile(String selectedProjectName) {
304 if (selectedProjectName !=
null) {
305 xmlFile = getXMLFile(selectedProjectName);
309 MessageDialog.openWarning(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
310 "Consistency checks not available",
311 "The selected project is not open. Consistency checks are only accessible "
312 +
"if the selected project is available.");
316 public String[] getCurrentProjectList() {
318 IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
320 IProject[] projects = workspaceRoot.getProjects();
321 String[] projectNames =
new String[projects.length];
322 for (
int i = 0; i < projects.length; i++) {
323 IProject project = projects[i];
324 projectNames[i] = project.getName();
330 public String[] getModules() {
331 Set<String> modules =
new TreeSet<>();
332 modules.add(CHECK_ALL);
333 List<TtDSCheck> filteredList = currentChecks.
getTtDSCheck();
334 for (TtDSCheck check : filteredList) {
335 List<TtDSSubCheck> filteredCheck = check.getTtDSSubCheck();
336 for (DsDSConsistencyChecks.TtDSCheck.TtDSSubCheck filteredSubCheck : filteredCheck) {
337 List<TtDSLogEntrySrc> filteredSrcEntries = filteredSubCheck.getTtDSLogEntrySrc();
338 if (!filteredSrcEntries.isEmpty()) {
339 for (TtDSLogEntrySrc filteredSrcEntry : filteredSrcEntries) {
340 if (filteredSrcEntry.getModule() !=
null && !filteredSrcEntry.getModule().isEmpty()
341 && filter.select(
null,
null, filteredSrcEntry)) {
342 modules.add(filteredSrcEntry.getModule());
346 List<TtDSLogEntryRepos> filteredRepoEntries = filteredSubCheck.getTtDSLogEntryRepos();
347 if (!filteredRepoEntries.isEmpty()) {
348 for (TtDSLogEntryRepos filteredRepoEntry : filteredRepoEntries) {
349 if (filteredRepoEntry.getModule() !=
null && !filteredRepoEntry.getModule().isEmpty()
350 && filter.select(
null,
null, filteredRepoEntry)) {
351 modules.add(filteredRepoEntry.getModule());
357 return modules.stream().toArray(String[]::
new);
360 private void displayCheckDate() {
361 if (xmlFile !=
null && xmlFile.exists() && projectViewer.getSelectionIndex() != -1) {
362 Date date =
new Date();
363 date.setTime(xmlFile.lastModified());
364 Calendar calendar = Calendar.getInstance();
365 calendar.setTime(date);
366 SimpleDateFormat dateFormat =
new SimpleDateFormat(
"dd.MM.yyyy HH:mm:ss");
367 String heading = MessageFormat.format(
"{0} ({1})", location, dateFormat.format(calendar.getTime()));
368 form.setText(heading);
373 private void refreshChecks() {
375 if ((xmlFile !=
null) && (xmlFile.exists())) {
377 Unmarshaller unmarshaller =
null;
379 JAXBContext context = JAXBContext.newInstance(DsDSConsistencyChecks.class);
380 unmarshaller = context.createUnmarshaller();
381 if (unmarshaller !=
null) {
382 this.currentChecks = (DsDSConsistencyChecks) unmarshaller.unmarshal(xmlFile);
384 }
catch (JAXBException e) {
385 throw new IllegalStateException(e);
388 currentTeam = CHECK_ALL;
389 currentModule = CHECK_ALL;
390 filter.setSearchFilter(currentTeam, currentModule);
391 teamViewer.setItems(filter.getTeams());
392 moduleViewer.setItems(getModules());
393 teamViewer.select(teamViewer.indexOf(CHECK_ALL));
394 moduleViewer.select(moduleViewer.indexOf(CHECK_ALL));
396 currentChecks =
null;
397 teamViewer.removeAll();
398 moduleViewer.removeAll();
403 private void refreshTree() {
404 if (currentChecks !=
null) {
405 List<TtDSCheck> filteredList = currentChecks.
getTtDSCheck();
406 viewer.setInput(filteredList);
408 viewer.setInput(
null);
410 Object[] expandedElements =
null;
411 expandedElements = viewer.getExpandedElements();
412 if (expandedElements !=
null)
413 viewer.setExpandedElements(expandedElements);
419 public void showBusy(
boolean busy) {
420 Cursor systemCursor = busy ? Display.getCurrent().getSystemCursor(SWT.CURSOR_WAIT)
421 : Display.getCurrent().getSystemCursor(SWT.CURSOR_ARROW);
422 viewer.getTree().setCursor(systemCursor);
425 public String getSelectedProject() {
426 return projectViewer.getText();
429 public void setSelectedProject(PaProject paProject) {
431 projectViewer.select(projectViewer.indexOf(paProject.getName()));
432 checksXmlFile(paProject.getName());
436 }
catch (InterruptedException e) {
438 Thread.currentThread().interrupt();
441 viewer.refresh(
true);
444 private File getXMLFile(String selectedProjectName) {
445 IPath pathToXMLFile =
null;
446 String fileName =
"ConsistencyCheck.xml";
447 Path localLocation =
null;
448 Path serverLocation =
null;
450 IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
451 localLocation =
new Path(root
452 .getPersistentProperty(
new QualifiedName(selectedProjectName,
"ConsistencyChecksLocationLocal")));
453 serverLocation =
new Path(root
454 .getPersistentProperty(
new QualifiedName(selectedProjectName,
"ConsistencyChecksLocationServer")));
455 }
catch (CoreException e1) {
456 e1.printStackTrace();
458 if (location.equals(LOCAL)) {
459 pathToXMLFile = localLocation;
461 pathToXMLFile = serverLocation;
463 File resultFile =
null;
464 if (pathToXMLFile !=
null) {
465 resultFile = pathToXMLFile.append(fileName).toFile();
467 resultFile =
new File(
"");
473 public void setFocus() {
void createPartControl(Composite parent)
List< DsDSConsistencyChecks.TtDSCheck > getTtDSCheck()