org.eclipse.ajdt.internal.ui.editor.CompilationUnitAnnotationModelWrapper.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ajdt.internal.ui.editor.CompilationUnitAnnotationModelWrapper.java

Source

/*******************************************************************************
 * Copyright (c) 2005, 2006 IBM Corporation and others. All rights reserved. This
 * program and the accompanying materials are made available under the terms of
 * the Eclipse Public License v1.0 which accompanies this distribution, and is
 * available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: Sian January - initial version
 ******************************************************************************/
package org.eclipse.ajdt.internal.ui.editor;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.aspectj.org.eclipse.jdt.internal.compiler.IProblemFactory;
import org.aspectj.org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.aspectj.org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory;
import org.eclipse.ajdt.core.javaelements.AJCompilationUnitInfo;
import org.eclipse.ajdt.core.parserbridge.AJCompilationUnitStructureRequestor;
import org.eclipse.ajdt.core.parserbridge.AJSourceElementParser;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.jdt.core.IBuffer;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IProblemRequestor;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.compiler.IProblem;
import org.eclipse.jdt.internal.compiler.problem.DefaultProblem;
import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities;
import org.eclipse.jdt.internal.core.CompilationUnit;
import org.eclipse.jdt.internal.core.JavaModelManager;
import org.eclipse.jdt.internal.core.JavaProject;
import org.eclipse.jdt.internal.ui.text.java.IProblemRequestorExtension;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.source.Annotation;
import org.eclipse.jface.text.source.AnnotationModelEvent;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.jface.text.source.IAnnotationModelListener;
import org.eclipse.jface.text.source.IAnnotationModelListenerExtension;

/**
 * Wrapper for a CompilationUnitAnnotationModel. Only used for non-.aj files
 * (i.e. usually .java files)
 * Uses AspectJ's eager parser to report errors and ignores errors from the JDT.
 */
public class CompilationUnitAnnotationModelWrapper
        implements IAnnotationModel, IProblemRequestor, IProblemRequestorExtension {

    protected static class GlobalAnnotationModelListener
            implements IAnnotationModelListener, IAnnotationModelListenerExtension {

        private ListenerList fListenerList;

        public GlobalAnnotationModelListener() {
            fListenerList = new ListenerList();
        }

        /**
         * @see IAnnotationModelListener#modelChanged(IAnnotationModel)
         */
        public void modelChanged(IAnnotationModel model) {
            Object[] listeners = fListenerList.getListeners();
            for (int i = 0; i < listeners.length; i++) {
                ((IAnnotationModelListener) listeners[i]).modelChanged(model);
            }
        }

        /**
         * @see IAnnotationModelListenerExtension#modelChanged(AnnotationModelEvent)
         */
        public void modelChanged(AnnotationModelEvent event) {
            Object[] listeners = fListenerList.getListeners();
            for (int i = 0; i < listeners.length; i++) {
                Object curr = listeners[i];
                if (curr instanceof IAnnotationModelListenerExtension) {
                    ((IAnnotationModelListenerExtension) curr).modelChanged(event);
                }
            }
        }

        public void addListener(IAnnotationModelListener listener) {
            fListenerList.add(listener);
        }

        public void removeListener(IAnnotationModelListener listener) {
            fListenerList.remove(listener);
        }
    }

    private IAnnotationModel delegate;
    private final ICompilationUnit unit;

    public CompilationUnitAnnotationModelWrapper(final ICompilationUnit unit) {
        this.unit = unit;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.text.source.IAnnotationModel#addAnnotationModelListener(org.eclipse.jface.text.source.IAnnotationModelListener)
     */
    public void addAnnotationModelListener(IAnnotationModelListener listener) {
        if (delegate != null) {
            delegate.addAnnotationModelListener(listener);
        }

    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.text.source.IAnnotationModel#removeAnnotationModelListener(org.eclipse.jface.text.source.IAnnotationModelListener)
     */
    public void removeAnnotationModelListener(IAnnotationModelListener listener) {
        if (delegate != null) {
            delegate.removeAnnotationModelListener(listener);
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.text.source.IAnnotationModel#connect(org.eclipse.jface.text.IDocument)
     */
    public void connect(IDocument document) {
        if (delegate != null) {
            delegate.connect(document);
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.text.source.IAnnotationModel#disconnect(org.eclipse.jface.text.IDocument)
     */
    public void disconnect(IDocument document) {
        if (delegate != null) {
            delegate.disconnect(document);
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.text.source.IAnnotationModel#addAnnotation(org.eclipse.jface.text.source.Annotation, org.eclipse.jface.text.Position)
     */
    public void addAnnotation(Annotation annotation, Position position) {
        if (delegate != null) {
            delegate.addAnnotation(annotation, position);
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.text.source.IAnnotationModel#removeAnnotation(org.eclipse.jface.text.source.Annotation)
     */
    public void removeAnnotation(Annotation annotation) {
        if (delegate != null) {
            delegate.removeAnnotation(annotation);
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.text.source.IAnnotationModel#getAnnotationIterator()
     */
    public Iterator getAnnotationIterator() {
        if (delegate != null) {
            return delegate.getAnnotationIterator();
        } else {
            return null;
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.text.source.IAnnotationModel#getPosition(org.eclipse.jface.text.source.Annotation)
     */
    public Position getPosition(Annotation annotation) {
        if (delegate != null) {
            return delegate.getPosition(annotation);
        } else {
            return null;
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.jdt.core.IProblemRequestor#acceptProblem(org.eclipse.jdt.core.compiler.IProblem)
     */
    public void acceptProblem(IProblem problem) {
        // bug 155225: use delegate for Task problems, ignore everything else
        if ((delegate != null) && (problem.getID() == IProblem.Task)) {
            ((IProblemRequestor) delegate).acceptProblem(problem);
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.jdt.core.IProblemRequestor#beginReporting()
     */
    public void beginReporting() {
        if (delegate != null) {
            ((IProblemRequestor) delegate).beginReporting();

            IJavaProject project = unit.getJavaProject();

            AJCompilationUnitStructureRequestor requestor = new AJCompilationUnitStructureRequestor(unit,
                    new AJCompilationUnitInfo(), new HashMap());
            JavaModelManager.PerWorkingCopyInfo perWorkingCopyInfo = ((CompilationUnit) unit)
                    .getPerWorkingCopyInfo();
            boolean computeProblems = JavaProject.hasJavaNature(project.getProject()) && perWorkingCopyInfo != null
                    && perWorkingCopyInfo.isActive();
            IProblemFactory problemFactory = new DefaultProblemFactory();
            Map options = project.getOptions(true);
            IBuffer buffer;
            try {
                buffer = unit.getBuffer();

                final char[] contents = buffer == null ? null : buffer.getCharacters();

                AJSourceElementParser parser = new AJSourceElementParser(requestor, problemFactory,
                        new CompilerOptions(options), true/*report local declarations*/, false);
                parser.reportOnlyOneSyntaxError = !computeProblems;

                parser.scanner.source = contents;
                requestor.setParser(parser);

                CompilationUnitDeclaration unitDec = parser.parseCompilationUnit(
                        new org.aspectj.org.eclipse.jdt.internal.compiler.env.ICompilationUnit() {
                            public char[] getContents() {
                                return contents;
                            }

                            public char[] getMainTypeName() {
                                return ((CompilationUnit) unit).getMainTypeName();
                            }

                            public char[][] getPackageName() {
                                return ((CompilationUnit) unit).getPackageName();
                            }

                            public char[] getFileName() {
                                return ((CompilationUnit) unit).getFileName();
                            }

                            public boolean ignoreOptionalProblems() {
                                return false;
                            }
                        }, true /*full parse to find local elements*/);
                org.aspectj.org.eclipse.jdt.core.compiler.IProblem[] problems = unitDec.compilationResult.problems;
                if (problems != null) {
                    for (int i = 0; i < problems.length; i++) {
                        org.aspectj.org.eclipse.jdt.core.compiler.IProblem problem = problems[i];
                        if (problem == null)
                            continue;
                        ((IProblemRequestor) delegate)
                                .acceptProblem(
                                        new DefaultProblem(problem.getOriginatingFileName(), problem.getMessage(),
                                                problem.getID(), problem.getArguments(),
                                                problem.isError() ? ProblemSeverities.Error
                                                        : ProblemSeverities.Warning,
                                                problem.getSourceStart(), problem.getSourceEnd(),
                                                problem.getSourceLineNumber(), 0)); // unknown column
                    }
                }
            } catch (JavaModelException e) {
            }
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.jdt.core.IProblemRequestor#endReporting()
     */
    public void endReporting() {
        if (delegate != null) {
            ((IProblemRequestor) delegate).endReporting();
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.jdt.core.IProblemRequestor#isActive()
     */
    public boolean isActive() {
        if (delegate != null) {
            return ((IProblemRequestor) delegate).isActive();
        } else {
            return false;
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.jdt.internal.ui.text.java.IProblemRequestorExtension#setProgressMonitor(org.eclipse.core.runtime.IProgressMonitor)
     */
    public void setProgressMonitor(IProgressMonitor monitor) {
        if (delegate != null) {
            ((IProblemRequestorExtension) delegate).setProgressMonitor(monitor);
        }

    }

    /* (non-Javadoc)
     * @see org.eclipse.jdt.internal.ui.text.java.IProblemRequestorExtension#setIsActive(boolean)
     */
    public void setIsActive(boolean isActive) {
        if (delegate != null) {
            ((IProblemRequestorExtension) delegate).setIsActive(isActive);
        }

    }

    /* (non-Javadoc)
     * @see org.eclipse.jdt.internal.ui.text.java.IProblemRequestorExtension#beginReportingSequence()
     */
    public void beginReportingSequence() {
        if (delegate != null) {
            ((IProblemRequestorExtension) delegate).beginReportingSequence();
        }

    }

    /* (non-Javadoc)
     * @see org.eclipse.jdt.internal.ui.text.java.IProblemRequestorExtension#endReportingSequence()
     */
    public void endReportingSequence() {
        if (delegate != null) {
            ((IProblemRequestorExtension) delegate).endReportingSequence();
        }
    }

    /**
     * @param annotationModel
     */
    public void setDelegate(IAnnotationModel annotationModel) {
        delegate = annotationModel;
    }

    public void setIsHandlingTemporaryProblems(boolean enable) {
        if (delegate != null) {
            ((IProblemRequestorExtension) delegate).setIsHandlingTemporaryProblems(enable);
        }
    }

}