Created
February 20, 2011 22:25
-
-
Save xcoulon/836374 to your computer and use it in GitHub Desktop.
JaxrsElementPostChangeListener
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class JaxrsElementPostReconcileListener implements IElementChangedListener { | |
private final IJavaProject javaProject; | |
public JaxrsElementPostReconcileListener(IJavaProject javaProject) { | |
this.javaProject = javaProject; | |
} | |
@Override | |
public void elementChanged(ElementChangedEvent event) { | |
try { | |
IJavaElementDelta delta = event.getDelta(); | |
visit(delta, null, new NullProgressMonitor()); | |
} catch (InvalidModelElementException e) { | |
Logger.error("Error while applying element change(s)", e); | |
} catch (CoreException e) { | |
Logger.error("Error while applying element change(s)", e); | |
} | |
} | |
public void visit(final IJavaElementDelta delta, final IProblem[] problems, final IProgressMonitor progressMonitor) | |
throws CoreException, InvalidModelElementException { | |
IJavaElement element = delta.getElement(); | |
IProblem[] elementProblems = problems; | |
/* | |
switch (element.getElementType()) { | |
case IJavaElement.COMPILATION_UNIT: | |
if (!((ICompilationUnit) element).isWorkingCopy()) { | |
return; | |
} | |
if ((delta.getFlags() & IJavaElementDelta.F_AST_AFFECTED) != 0) { | |
elementProblems = delta.getCompilationUnitAST().getProblems(); | |
} | |
break; | |
case IJavaElement.TYPE: | |
if (delta.getKind() == IJavaElementDelta.CHANGED | |
&& (delta.getFlags() & IJavaElementDelta.F_SUPER_TYPES) != 0) { | |
logDelta(delta, problems); | |
Metamodel metamodel = Metamodel.get(element.getResource().getProject()); | |
metamodel.applyDelta((IType) element, delta.getKind(), progressMonitor); | |
} | |
break; | |
case IJavaElement.METHOD: | |
if (delta.getKind() == IJavaElementDelta.ADDED | |
|| delta.getKind() == IJavaElementDelta.REMOVED | |
|| (delta.getKind() == IJavaElementDelta.CHANGED && (delta.getFlags() & IJavaElementDelta.F_CONTENT) != 0)) { | |
logDelta(delta, problems); | |
Metamodel metamodel = Metamodel.get(element.getResource().getProject()); | |
metamodel.applyDelta((IMethod) element, delta.getKind(), progressMonitor); | |
} | |
break; | |
case IJavaElement.ANNOTATION: | |
logDelta(delta, problems); | |
IAnnotation annotation = (IAnnotation) element; | |
IMethod method = (IMethod) annotation.getAncestor(IJavaElement.METHOD); | |
Metamodel metamodel = Metamodel.get(element.getResource().getProject()); | |
if (method != null) { | |
metamodel.applyDelta(method, delta.getKind(), progressMonitor); | |
break; | |
} | |
IType type = (IType) annotation.getAncestor(IJavaElement.TYPE); | |
if (type != null) { | |
logDelta(delta, problems); | |
metamodel.applyDelta(type, delta.getKind(), progressMonitor); | |
} | |
break; | |
} | |
for (IJavaElementDelta d : delta.getAffectedChildren()) { | |
visit(d, elementProblems, progressMonitor); | |
} | |
for (IJavaElementDelta d : delta.getAnnotationDeltas()) { | |
visit(d, elementProblems, progressMonitor); | |
} | |
*/ | |
} | |
/** | |
* @param delta | |
* @param element | |
* @param unit | |
* @throws CoreException | |
*/ | |
public static void logDelta(IJavaElementDelta delta, IProblem[] problems) throws CoreException { | |
StringBuilder sb = new StringBuilder(); | |
IJavaElement element = delta.getElement(); | |
sb.append("POST_RECONCILE : Java "); | |
for (Field field : IJavaElement.class.getDeclaredFields()) { | |
String name = field.getName(); | |
int value; | |
try { | |
value = field.getInt(delta); | |
if (element.getElementType() == value) { | |
sb.append(name.toLowerCase()).append(" "); | |
} | |
} catch (IllegalArgumentException e) { | |
} catch (IllegalAccessException e) { | |
} | |
} | |
switch (delta.getKind()) { | |
case IJavaElementDelta.ADDED: | |
sb.append("Added: "); | |
break; | |
case IJavaElementDelta.CHANGED: | |
sb.append("Changed: "); | |
break; | |
case IJavaElementDelta.REMOVED: | |
sb.append("Removed: "); | |
break; | |
} | |
sb.append(element.getElementName()).append(" ["); | |
switch (element.getElementType()) { | |
case IJavaElement.COMPILATION_UNIT: | |
if (((ICompilationUnit) element).isWorkingCopy()) { | |
sb.append("*Working Copy* | "); | |
} | |
break; | |
case IJavaElement.ANNOTATION: | |
case IJavaElement.TYPE: | |
case IJavaElement.METHOD: | |
// ((ISourceReference)element).getSource(); | |
if (element.exists()) { | |
ISourceRange sourceRange = ((ISourceReference) element).getSourceRange(); | |
sb.append("range=").append(sourceRange.getOffset()).append("-") | |
.append(sourceRange.getOffset() + sourceRange.getLength()); | |
if (problems != null) { | |
int n = 0; | |
for (IProblem problem : problems) { | |
if (problem.isError() && problem.getSourceStart() >= sourceRange.getOffset() | |
&& problem.getSourceEnd() <= (sourceRange.getOffset() + sourceRange.getLength())) { | |
n++; | |
} | |
} | |
if (n > 0) { | |
sb.append(" | ").append(n).append(" problem(s)"); | |
} | |
} | |
} | |
} | |
sb.append("] "); | |
int flags = delta.getFlags(); | |
sb.append("[flags="); | |
if (flags == 0) { | |
sb.append("none"); | |
} | |
for (Field field : IJavaElementDelta.class.getDeclaredFields()) { | |
String name = field.getName(); | |
if (name.startsWith("F_")) { | |
int value; | |
try { | |
value = field.getInt(delta); | |
if ((flags & value) != 0) { | |
sb.append(name.substring(2)).append("+"); | |
} | |
} catch (IllegalArgumentException e) { | |
} catch (IllegalAccessException e) { | |
} | |
} | |
} | |
sb.append("]"); | |
Logger.info(sb.toString().replace("+]", "]")); | |
} | |
/** | |
* @return the deltaStack public Stack<IJavaElementDelta> getDeltaStack() { | |
* return deltaStack; } | |
* | |
* public void clearDeltaStack() { this.deltaStack.clear(); } | |
*/ | |
/** | |
* @return the project | |
*/ | |
public IJavaProject getJavaProject() { | |
return javaProject; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*IResourceChangeListener listener = (IResourceChangeListener) project.getSessionProperty(RESOURCE_CHANGE_LISTENER_NAME); | |
if(listener != null) { | |
ResourcesPlugin.getWorkspace().removeResourceChangeListener(listener); | |
project.setSessionProperty(RESOURCE_CHANGE_LISTENER_NAME, null); | |
}*/ | |
/* | |
JaxrsElementChangeListener jaxrsElementPostChangeListener = (JaxrsElementChangeListener) project.getSessionProperty(JAXRS_POST_CHANGE_LISTENER_NAME); | |
if(jaxrsElementPostChangeListener != null) { | |
JavaCore.removeElementChangedListener(jaxrsElementPostChangeListener); | |
project.setSessionProperty(JAXRS_POST_CHANGE_LISTENER_NAME, null); | |
} | |
JaxrsElementChangeListener jaxrsElementPostReconcileListener = (JaxrsElementChangeListener) project.getSessionProperty(JAXRS_POST_RECONCILE_LISTENER_NAME); | |
if(jaxrsElementPostReconcileListener != null) { | |
JavaCore.removeElementChangedListener(jaxrsElementPostReconcileListener); | |
project.setSessionProperty(JAXRS_POST_RECONCILE_LISTENER_NAME, null); | |
} | |
*/ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class ResourceChangeListener implements IResourceChangeListener, IResourceDeltaVisitor { | |
private final IJavaProject javaProject; | |
public ResourceChangeListener(IJavaProject javaProject) { | |
this.javaProject = javaProject; | |
} | |
@Override | |
public void resourceChanged(IResourceChangeEvent event) { | |
try { | |
event.getDelta().accept(this); | |
} catch (CoreException e) { | |
Logger.error("Failed to visit delta", e); | |
} finally { | |
} | |
} | |
@Override | |
public boolean visit(IResourceDelta delta) throws CoreException { | |
IResource resource = delta.getResource(); | |
if (resource.getType() == IResource.FILE | |
&& javaProject.getPath().isPrefixOf(resource.getFullPath()) | |
&& resource.getFullPath().getFileExtension().equals("java")) { | |
Metamodel metamodel = Metamodel.get(resource.getProject()); | |
if (metamodel == null) { | |
Logger.warn("No Metamodel found for project " + resource.getProject().getName()); | |
return false; | |
} | |
logDelta(delta); | |
metamodel.applyDelta(delta, new NullProgressMonitor()); | |
} | |
return true; | |
} | |
/** | |
* @param delta | |
* @param element | |
* @param unit | |
* @throws CoreException | |
*/ | |
public static void logDelta(IResourceDelta delta) throws CoreException { | |
StringBuilder sb = new StringBuilder(); | |
sb.append("Resource "); | |
switch (delta.getKind()) { | |
case IResourceDelta.ADDED: | |
sb.append("added: "); | |
break; | |
case IResourceDelta.CHANGED: | |
sb.append("changed: "); | |
break; | |
case IResourceDelta.REMOVED: | |
sb.append("removed: "); | |
break; | |
} | |
sb.append(delta.getResource().getName()); | |
if (delta.getResource().exists()) { | |
IMarkerDelta[] markerDeltas = delta.getMarkerDeltas(); | |
/* | |
* ISourceRange sourceRange = ((ISourceReference) | |
* element).getSourceRange(); | |
* sb.append("range=").append(sourceRange.getOffset()).append("-") | |
* .append(sourceRange.getOffset() + sourceRange.getLength()); | |
*/ | |
int added = 0; | |
int removed = 0; | |
for (IMarkerDelta markerDelta : markerDeltas) { | |
int severity = markerDelta.getAttribute(IMarker.SEVERITY, 0); | |
// int lineNumber = marker.getAttribute(IMarker.LINE_NUMBER, | |
// 0); | |
if (markerDelta.getKind() == IResourceDelta.ADDED && severity == IMarker.SEVERITY_ERROR) { | |
added++; | |
} else if (markerDelta.getKind() == IResourceDelta.REMOVED && severity == IMarker.SEVERITY_ERROR) { | |
removed++; | |
} | |
} | |
sb.append("+").append(added).append("/-").append(removed).append(" problem(s)"); | |
} | |
int flags = delta.getFlags(); | |
sb.append("[flags="); | |
if (flags == 0) { | |
sb.append("none"); | |
} | |
for (Field field : IResourceDelta.class.getDeclaredFields()) { | |
String name = field.getName(); | |
int value; | |
try { | |
value = field.getInt(delta); | |
if ((flags & value) != 0) { | |
sb.append(name).append("+"); | |
} | |
} catch (IllegalArgumentException e) { | |
} catch (IllegalAccessException e) { | |
} | |
} | |
sb.append("]"); | |
Logger.info(sb.toString().replace("+]", "]")); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class JaxrsElementPostChangeListener implements IElementChangedListener { | |
private final IJavaProject javaProject; | |
// private Stack<IJavaElementDelta> deltaStack = new | |
// Stack<IJavaElementDelta>(); | |
public JaxrsElementPostChangeListener(IJavaProject javaProject) { | |
this.javaProject = javaProject; | |
} | |
@Override | |
public void elementChanged(ElementChangedEvent event) { | |
try { | |
IJavaElementDelta delta = event.getDelta(); | |
visit(delta, new NullProgressMonitor()); | |
} catch (InvalidModelElementException e) { | |
Logger.error("Error while applying element change(s)", e); | |
} catch (CoreException e) { | |
Logger.error("Error while applying element change(s)", e); | |
} | |
} | |
public void visit(IJavaElementDelta delta, IProgressMonitor progressMonitor) throws CoreException, | |
InvalidModelElementException { | |
IJavaElement element = delta.getElement(); | |
logDelta(delta); | |
if (element.getElementType() == IJavaElement.COMPILATION_UNIT) { | |
if(((ICompilationUnit)element).isWorkingCopy()) { | |
return; | |
} | |
} | |
if (delta.getKind() == IJavaElementDelta.ADDED) { | |
logDelta(delta); | |
Metamodel metamodel = Metamodel.get(element.getResource().getProject()); | |
metamodel.addElements(element, progressMonitor); | |
} else if (delta.getKind() == IJavaElementDelta.REMOVED) { | |
logDelta(delta); | |
Metamodel metamodel = Metamodel.get(element.getResource().getProject()); | |
metamodel.remove(element.getResource(), progressMonitor); | |
} | |
for (IJavaElementDelta d : delta.getAnnotationDeltas()) { | |
visit(d, progressMonitor); | |
} | |
for (IJavaElementDelta d : delta.getAffectedChildren()) { | |
visit(d, progressMonitor); | |
} | |
} | |
/** | |
* @param delta | |
* @param element | |
* @param unit | |
*/ | |
public static void logDelta(IJavaElementDelta delta) { | |
StringBuilder sb = new StringBuilder(); | |
IJavaElement element = delta.getElement(); | |
sb.append("POST_CHANGE : Java Resource "); | |
switch (delta.getKind()) { | |
case IJavaElementDelta.ADDED: | |
sb.append("Added: "); | |
break; | |
case IJavaElementDelta.CHANGED: | |
sb.append("Changed: "); | |
break; | |
case IJavaElementDelta.REMOVED: | |
sb.append("Removed: "); | |
break; | |
} | |
sb.append(element.getElementName()); | |
for (Field field : IJavaElement.class.getDeclaredFields()) { | |
String name = field.getName(); | |
int value; | |
try { | |
value = field.getInt(delta); | |
if (element.getElementType() == value) { | |
sb.append(" [").append(name); | |
} | |
} catch (IllegalArgumentException e) { | |
} catch (IllegalAccessException e) { | |
} | |
} | |
ICompilationUnit compilationUnit = null; | |
switch (element.getElementType()) { | |
case IJavaElement.COMPILATION_UNIT: | |
compilationUnit = (ICompilationUnit) element; | |
break; | |
case IJavaElement.TYPE: | |
compilationUnit = ((IType) element).getCompilationUnit(); | |
break; | |
case IJavaElement.METHOD: | |
compilationUnit = ((IMethod) element).getCompilationUnit(); | |
break; | |
case IJavaElement.ANNOTATION: | |
// compilationUnit = ((IAnnotation)element).getCompilationUnit(); | |
break; | |
} | |
if (compilationUnit != null) { | |
if (compilationUnit.isWorkingCopy()) { | |
sb.append(" |*Working Copy*"); | |
} | |
} | |
sb.append("] "); | |
int flags = delta.getFlags(); | |
sb.append("[flags = "); | |
if (flags == 0) { | |
sb.append(" none"); | |
} | |
for (Field field : IJavaElementDelta.class.getDeclaredFields()) { | |
String name = field.getName(); | |
if (name.startsWith("F_")) { | |
int value; | |
try { | |
value = field.getInt(delta); | |
if ((flags & value) != 0) { | |
sb.append(name.substring(2)).append("+"); | |
} | |
} catch (IllegalArgumentException e) { | |
} catch (IllegalAccessException e) { | |
} | |
} | |
} | |
sb.append("]"); | |
Logger.info(sb.toString().replace("+]", "]")); | |
} | |
/** | |
* @return the deltaStack public Stack<IJavaElementDelta> getDeltaStack() { | |
* return deltaStack; } | |
* | |
* public void clearDeltaStack() { this.deltaStack.clear(); } | |
*/ | |
/** | |
* @return the project | |
*/ | |
public IJavaProject getJavaProject() { | |
return javaProject; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment