001    /*
002     * Copyright 2005-2006 Sun Microsystems, Inc.  All Rights Reserved.
003     * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004     *
005     * This code is free software; you can redistribute it and/or modify it
006     * under the terms of the GNU General Public License version 2 only, as
007     * published by the Free Software Foundation.  Sun designates this
008     * particular file as subject to the "Classpath" exception as provided
009     * by Sun in the LICENSE file that accompanied this code.
010     *
011     * This code is distributed in the hope that it will be useful, but WITHOUT
012     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013     * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
014     * version 2 for more details (a copy is included in the LICENSE file that
015     * accompanied this code).
016     *
017     * You should have received a copy of the GNU General Public License version
018     * 2 along with this work; if not, write to the Free Software Foundation,
019     * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020     *
021     * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022     * CA 95054 USA or visit www.sun.com if you need additional information or
023     * have any questions.
024     */
025    
026    package javax.annotation.processing;
027    
028    import java.util.Map;
029    import java.util.List;
030    import java.util.Locale;
031    import javax.lang.model.SourceVersion;
032    import javax.lang.model.util.Elements;
033    import javax.lang.model.util.Types;
034    import java.io.File;
035    
036    /**
037     * An annotation processing tool framework will {@linkplain
038     * Processor#init provide an annotation processor with an object
039     * implementing this interface} so the processor can use facilities
040     * provided by the framework to write new files, report error
041     * messages, and find other utilities.
042     *
043     * <p>Third parties may wish to provide value-add wrappers around the
044     * facility objects from this interface, for example a {@code Filer}
045     * extension that allows multiple processors to coordinate writing out
046     * a single source file.  To enable this, for processors running in a
047     * context where their side effects via the API could be visible to
048     * each other, the tool infrastructure must provide corresponding
049     * facility objects that are {@code .equals}, {@code Filer}s that are
050     * {@code .equals}, and so on.  In addition, the tool invocation must
051     * be able to be configured such that from the perspective of the
052     * running annotation processors, at least the chosen subset of helper
053     * classes are viewed as being loaded by the same class loader.
054     * (Since the facility objects manage shared state, the implementation
055     * of a wrapper class must know whether or not the same base facility
056     * object has been wrapped before.)
057     *
058     * @author Joseph D. Darcy
059     * @author Scott Seligman
060     * @author Peter von der Ah&eacute;
061     * @since 1.6
062     */
063    public interface ProcessingEnvironment {
064        /**
065         * Returns the processor-specific options passed to the annotation
066         * processing tool.  Options are returned in the form of a map from
067         * option name to option value.  For an option with no value, the
068         * corresponding value in the map is {@code null}.
069         *
070         * <p>See documentation of the particular tool infrastructure
071         * being used for details on how to pass in processor-specific
072         * options.  For example, a command-line implementation may
073         * distinguish processor-specific options by prefixing them with a
074         * known string like {@code "-A"}; other tool implementations may
075         * follow different conventions or provide alternative mechanisms.
076         * A given implementation may also provide implementation-specific
077         * ways of finding options passed to the tool in addition to the
078         * processor-specific options.
079         *
080         * @return the processor-specific options passed to the tool
081         */
082        Map<String,String> getOptions();
083    
084        /**
085         * Returns the messager used to report errors, warnings, and other
086         * notices.
087         *
088         * @return the messager
089         */
090        Messager getMessager();
091    
092        /**
093         * Returns the filer used to create new source, class, or auxiliary
094         * files.
095         *
096         * @return the filer
097         */
098        Filer getFiler();
099    
100        /**
101         * Returns an implementation of some utility methods for
102         * operating on elements
103         *
104         * @return element utilities
105         */
106        Elements getElementUtils();
107    
108        /**
109         * Returns an implementation of some utility methods for
110         * operating on types.
111         *
112         * @return type utilities
113         */
114        Types getTypeUtils();
115    
116        /**
117         * Returns the source version that any generated {@linkplain
118         * Filer#createSourceFile source} and {@linkplain
119         * Filer#createClassFile class} files should conform to.
120         *
121         * @return the source version to which generated source and class
122         *         files should conform to
123         * @see Processor#getSupportedSourceVersion
124         */
125        SourceVersion getSourceVersion();
126    
127        /**
128         * Returns the current locale or {@code null} if no locale is in
129         * effect.  The locale can be be used to provide localized
130         * {@linkplain Messager messages}.
131         *
132         * @return the current locale or {@code null} if no locale is in
133         * effect
134         */
135        Locale getLocale();
136    }