Skip to content

Instantly share code, notes, and snippets.

@xcoulon
Created February 20, 2011 22:25
Show Gist options
  • Save xcoulon/836374 to your computer and use it in GitHub Desktop.
Save xcoulon/836374 to your computer and use it in GitHub Desktop.
JaxrsElementPostChangeListener
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;
}
}
/*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);
}
*/
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("+]", "]"));
}
}
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