-
Notifications
You must be signed in to change notification settings - Fork 22
Expand file tree
/
Copy pathStartupHandler.java
More file actions
114 lines (98 loc) · 3.84 KB
/
Copy pathStartupHandler.java
File metadata and controls
114 lines (98 loc) · 3.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/********************************************************************************
* Copyright (c) 2015-2019 TU Darmstadt, Paderborn University
*
* http://www.eclipse.org/legal/epl-2.0. SPDX-License-Identifier: EPL-2.0
********************************************************************************/
package de.cognicrypt.crysl.handler;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.ui.IStartup;
import de.cognicrypt.core.Constants;
import de.cognicrypt.crysl.Activator;
import de.cognicrypt.crysl.builder.CrySLBuilderUtils;
import de.cognicrypt.crysl.builder.CrySLNature;
/**
* At startup, this handler registers a listener that will be informed after a build, whenever resources were changed.
*
* @author Stefan Krueger
* @author Eric Bodden
*/
public class StartupHandler implements IStartup {
private static final AfterBuildListener BUILD_LISTENER = new AfterBuildListener();
private static final ImportListener IMPORT_LISTENER = new ImportListener();
@Override
public void earlyStartup() {
ResourcesPlugin.getWorkspace().addResourceChangeListener(StartupHandler.BUILD_LISTENER, IResourceChangeEvent.POST_BUILD);
ResourcesPlugin.getWorkspace().addResourceChangeListener(StartupHandler.IMPORT_LISTENER, IResourceChangeEvent.POST_CHANGE);
}
private static class AfterBuildListener implements IResourceChangeListener {
@Override
public void resourceChanged(final IResourceChangeEvent event) {
Activator.getDefault().logInfo("ResourcechangeListener has been triggered.");
final List<IResource> changedCrySLElements = new ArrayList<>();
try {
event.getDelta().accept(delta -> {
switch (delta.getKind()) {
case IResourceDelta.ADDED:
case IResourceDelta.CHANGED:
final IResource res = delta.getResource();
if (res != null && res.getFileExtension() != null) {
if (Constants.cryslFileEnding.substring(1).equals(res.getFileExtension())) {
changedCrySLElements.add(res);
}
}
}
return true;
});
}
catch (final CoreException e) {
Activator.getDefault().logError(e);
}
if (!changedCrySLElements.isEmpty()) {
try {
IResource res = changedCrySLElements.get(0);
IProject crySLProject = res.getProject();
if (!crySLProject.hasNature(CrySLNature.NATURE_ID)) {
CrySLBuilderUtils.addCrySLBuilderToProject(crySLProject);
}
}
catch (CoreException e) {
Activator.getDefault().logError(e, "Updating CrySL rules failed.");
}
}
}
}
private static class ImportListener implements IResourceChangeListener {
@Override
public void resourceChanged(IResourceChangeEvent event) {
IResourceDelta delta = event.getDelta();
IResourceDelta[] affectedChildren = delta.getAffectedChildren();
if (affectedChildren.length == 0) {
return;
}
IResource deltaResource = affectedChildren[0].getResource();
if (event.getType() == IResourceChangeEvent.POST_CHANGE && deltaResource instanceof IProject
&& (delta.getKind() == IResourceDelta.ADDED || delta.getKind() == IResourceDelta.CHANGED)) {
IProject project = (IProject) deltaResource;
try {
if(project.isOpen())
{
if (!CrySLBuilderUtils.hasCrySLBuilder(project) && CrySLBuilderUtils.hasCrySLFiles(project)) {
CrySLBuilderUtils.addCrySLBuilderToProject(project);
}
}
}
catch (CoreException e) {
Activator.getDefault().logError(e);
}
}
}
}
}