United StatesChange Country, Oracle Worldwide Web Sites Communities I am a... I want to...
Bug ID: 5048535 apt should revise discovery policy to query already loaded factories
5048535 : apt should revise discovery policy to query already loaded factories

Details
Type:
Bug
Submit Date:
2004-05-17
Status:
Resolved
Updated Date:
2004-06-25
Project Name:
JDK
Resolved Date:
2004-06-25
Component:
tools
OS:
generic
Sub-Component:
apt
CPU:
generic
Priority:
P3
Resolution:
Fixed
Affected Versions:
5.0
Fixed Versions:
5.0

Related Reports
Relates:
Relates:
Relates:
Relates:

Sub Tasks

Description
apt might query a factory on one round but not that next.  This complicates efforts to implement a callback or listener mechanism.

                                    

Comments
CONVERTED DATA

BugTraq+ Release Management Values

COMMIT TO FIX:
tiger-rc

FIXED IN:
tiger-rc

INTEGRATED IN:
tiger-b58
tiger-rc


                                     
2004-07-21
SUGGESTED FIX

src/share/classes/com/sun/mirror/apt>sccs sccsdiff -r1.7 -r1.8 AnnotationProcessorFactory.java 

------- AnnotationProcessorFactory.java -------
68,69c68,69
<      * Returns an annotation processor for a set of annotation types.
<      * The set will be empty if the factory supports
---
>      * Returns an annotation processor for a set of annotation
>      * types. The set will be empty if the factory supports
71c71,78
<      * no annotations.
---
>      * no annotations.  Note that the set of annotation types may be
>      * empty for other reasons, such as giving the factory an
>      * opportunity to register a listener.  An
>      * <tt>AnnotationProcessorFactory</tt> must gracefully handle an
>      * empty set of annotations; an appropriate response to an empty
>      * set will often be returning {@link
>      * com.sun.mirror.AnnotationProcessors#NO_OP
>      * AnnotationProcessors.NO_OP}.
src/share/classes/com/sun/mirror/apt>sccs sccsdiff -r1.1 -r1.2 AnnotationProcessors.java      

------- AnnotationProcessors.java -------
71c71
<     public final static AnnotationProcessor NoOpAnnotationProcessor = new NoOpAP();
---
>     public final static AnnotationProcessor NO_OP = new NoOpAP();
src/share/classes/com/sun/mirror/util>sccs sccsdiff -r1.2 -r1.3 DeclarationVisitors.java 

------- DeclarationVisitors.java -------
24c24
<     public static final DeclarationVisitor NoOpDeclVisitor = new SimpleDeclarationVisitor();
---
>     public static final DeclarationVisitor NO_OP = new SimpleDeclarationVisitor();


kalimantan:/local/ws/jdk/1.5/Apt-work/src/share/classes/com/sun/tools/apt/main>sccs sccsdiff -r1.12 -r1.13 Main.java       

------- Main.java -------
38a39
> import com.sun.mirror.apt.AnnotationProcessorFactory;
52a54,56
>       // Preserve parameter names from class files if the class was
>       // compiled with debug enabled
>       "-XDsave-parameter-names"
556c560
<     /** List of top level names of generated source files.
---
>     /** List of top level names of generated source files from most recent apt round.
560c564
<     /** List of names of generated class files.
---
>     /** List of names of generated class files from most recent apt round.
563a568,590
>     /**
>      * List of all the generated source file names across all apt rounds.
>      */
>     java.util.Set<String> aggregateGenSourceFileNames = new java.util.LinkedHashSet<String>();
> 
>     /**
>      * List of all the generated class file names across all apt rounds.
>      */
>     java.util.Set<String> aggregateGenClassFileNames  = new java.util.LinkedHashSet<String>();
> 
>     /**
>      * List of all the generated file names across all apt rounds.
>      */
>     java.util.Set<java.io.File> aggregateGenFiles = new java.util.LinkedHashSet<java.io.File>();
> 
>     /**
>      * Set of all factories that have provided a processor on some apt round.
>      */
>     java.util.Set<Class<? extends AnnotationProcessorFactory> > productiveFactories  = 
>       new java.util.LinkedHashSet<Class<? extends AnnotationProcessorFactory> >();
> 
> 
> 
637,639c664
<           : (Source.JDK1_5);
<       options.put("-source", source.name );
< 
---
>           : Source.DEFAULT;
643,645c668
<           : Target.JDK1_5;
<       options.put("-target", target.name );
< 
---
>           : Target.DEFAULT;
651,653c674,690
<       if (Character.isDigit(target.toString().charAt(0)) &&
<           target.compareTo(source.requiredTarget()) < 0)
<           warning("warn.source.target.conflict", source, source.requiredTarget());
---
>       if (Character.isDigit(target.name.charAt(0)) &&
>           target.compareTo(source.requiredTarget()) < 0) {
>             if (targetString != null) {
>                 if (sourceString == null) {
>                     warning("warn.target.default.source.conflict",
>                             targetString,
>                             source.requiredTarget().name);
>                 } else {
>                     warning("warn.source.target.conflict",
>                             sourceString,
>                             source.requiredTarget().name);
>                 }
>                 return null;
>           } else {
>                 options.put("-target", source.requiredTarget().name);
>           }
>       }
661,668d697
<       /*
<        * Lists of all the generated source and class files
<        * (respectively), across different runs of annotation
<        * processors by apt.
<        */
<       java.util.Set<String> aggregateGenSourceFileNames = new java.util.LinkedHashSet<String>();
<       java.util.Set<String> aggregateGenClassFileNames  = new java.util.LinkedHashSet<String>();
< 
731c760
<       boolean firstRun = true;
---
>       boolean firstRound = true;
738,739c767,768
<        * If any of the prior apt runs generated any new source
<        * files, the n'th apt run (and any javac invocation) has the
---
>        * If any of the prior apt rounds generated any new source
>        * files, the n'th apt round (and any javac invocation) has the
743,744c772,773
<        * If any of the prior apt runs generated any new class files,
<        * the n'th apt run (and any javac invocation) has the class
---
>        * If any of the prior apt rounds generated any new class files,
>        * the n'th apt round (and any javac invocation) has the class
842c871
<           int run = 0; // For -XPrintAptRounds
---
>           int round = 0; // For -XPrintAptRounds
844c873
<               run++;
---
>               round++;
853c882
<               if (genSourceFileNames.size() > 0 && !firstRun) {
---
>               if (genSourceFileNames.size() > 0 && !firstRound) {
873c902
<                   out.println("apt Run : " + run);
---
>                   out.println("apt Round : " + round);
879c908
<               firstRun = false;
---
>               firstRound = false;
901,902c930
<               aggregateGenSourceFileNames.size() + 
<               2; // source and target
---
>               aggregateGenSourceFileNames.size();
958,961d985
<           newArgs[j++] = "-XD-source=" + options.get("-source");
< 
<           newArgs[j++] = "-XD-target=" + options.get("-target");
< 
995c1019,1021
<                                                      aptCL);
---
>                                                      aptCL, 
>                                                      productiveFactories,
>                                                      aggregateGenFiles);
src/share/classes/com/sun/tools/apt/main>sccs sccsdiff -r1.7 -r1.8 JavaCompiler.java 

------- JavaCompiler.java -------
27a28
> import com.sun.mirror.apt.AnnotationProcessorFactory;
69a71
>     java.util.Set<java.io.File> aggregateGenFiles = java.util.Collections.emptySet();
70a73,75
>     public java.util.Set<java.io.File> getAggregateGenFiles() {
>       return aggregateGenFiles;
>     }
75a81,84
>     /** The log to be used for error reporting.
>      */
>     Log log;
> 
147a157
>       log = Log.instance(context);
293c303,304
<       Name prev = bark.useSource(names.fromString(filename));
---
>       Name prev1 = log.useSource(names.fromString(filename));
>       Name prev2 = bark.useSource(names.fromString(filename));
313c324,325
<       bark.useSource(prev);
---
>       bark.useSource(prev2);
>       log.useSource(prev1);
402c414,417
<                                    ClassLoader aptCL) throws Throwable {
---
>                                    ClassLoader aptCL,
>                                    java.util.Set<Class<? extends AnnotationProcessorFactory> > productiveFactories,
>                                    java.util.Set<java.io.File> aggregateGenFiles) 
>       throws Throwable {
407a423,424
>       this.aggregateGenFiles = aggregateGenFiles;
> 
423c440,441
<               apt.main(roots, origOptions, aptCL);
---
>               apt.main(roots, origOptions, aptCL, 
>                        productiveFactories);
504a523
>       log.flush();
src/share/classes/com/sun/tools/apt/comp>sccs sccsdiff -r1.13 -r1.14 Apt.java         

------- Apt.java -------
10d9
< 
19a19
> import java.util.regex.*;
20a21,22
> import java.lang.reflect.InvocationTargetException;
> import java.io.IOException;
31d32
< //import com.sun.mirror.util.*;
34,35d34
< 
< 
39,40d37
< import java.lang.reflect.InvocationTargetException;
< import java.io.IOException;
42,43d38
< import java.util.regex.*;
< 
172c167,168
<                    ClassLoader aptCL) {
---
>                    ClassLoader aptCL,
>                    java.util.Set<Class<? extends AnnotationProcessorFactory> > productiveFactories) {
189a186,188
>       Set<AnnotationTypeDeclaration> emptyATDS = Collections.emptySet();
>       Set<Class<? extends AnnotationProcessorFactory> > currentRoundFactories = 
>           new LinkedHashSet<Class<? extends AnnotationProcessorFactory> >();
253c252
<               } else {
---
>               } else
255d253
<               }
261c259
<           if (!providers.hasNext()) {
---
>           if (!providers.hasNext() && productiveFactories.size() == 0) {
310,311c308,309
<                           // convert annotation names to
<                           // annotation type decls
---
>                           // convert annotation names to annotation
>                           // type decls
315,316c313,314
<                           // empty string, pass in an empty set
<                           // of annotation type declarations.
---
>                           // empty string, pass in an empty set of
>                           // annotation type declarations.
334c332,334
< 
---
>                           
>                           currentRoundFactories.add(apf.getClass());
>                           productiveFactories.add(apf.getClass());
335a336,342
>                       } else if (productiveFactories.contains(apf.getClass())) {
>                           // If a factory provided a processor in a
>                           // previous round but doesn't match any
>                           // annotations this round, call it with an
>                           // empty set of declarations.
>                           currentRoundFactories.add(apf.getClass());
>                           factoryToAnnotation.put(apf, emptyATDS );
348a356,373
>           // If the set difference of productiveFactories and
>           // currentRoundFactories is non-empty, call the remaining
>           // productive factories with an empty set of declarations.
>           {
>               java.util.Set<Class<? extends AnnotationProcessorFactory> > neglectedFactories = 
>                   new LinkedHashSet<Class<? extends AnnotationProcessorFactory>>(productiveFactories);
>               neglectedFactories.removeAll(currentRoundFactories);
>               for(Class<? extends AnnotationProcessorFactory> working : neglectedFactories) {
>                   try {
>                       AnnotationProcessorFactory factory = working.newInstance();
>                       factoryToAnnotation.put(factory, emptyATDS);
>                   } catch (Exception e ) {
>                       bark.warning(Position.NOPOS, "FactoryCantInstantiate", working.getName());
>                   }
> 
>               }
>           }
> 
src/share/classes/com/sun/tools/apt/mirror/apt> sccs sccsdiff -r1.8 -r1.9 AnnotationProcessorEnvironmentImpl.java
------- AnnotationProcessorEnvironmentImpl.java -------
124c124
<                                                         NoOpDeclVisitor));
---
>                                                         NO_OP));
src/share/classes/com/sun/tools/apt/mirror/apt>sccs sccsdiff -r1.4 -r1.5 FilerImpl.java

------- FilerImpl.java -------
34a35
>     private final com.sun.tools.apt.main.JavaCompiler comp;
52a54,56
>     // All created files.
>     private final Set<File> filesCreated;
> 
74a79
>       comp = com.sun.tools.apt.main.JavaCompiler.instance(context);
75a81,82
>       this.filesCreated = comp.getAggregateGenFiles();
> 
98a106
>       PrintWriter pw = getPrintWriter(file, encoding);
100c108
<       return getPrintWriter(file, encoding);
---
>       return pw;
107a116
>       OutputStream os = getOutputStream(CLASS_TREE, pathname);
109c118
<       return getOutputStream(CLASS_TREE, pathname);
---
>       return os;
196,197d204
<     // The newly created files.
<     private final HashSet<File> filesCreated = new HashSet<File>();


###@###.### 2004-06-21
                                     
2004-06-21
EVALUATION

Should be fixed.

###@###.### 2004-05-17
                                     
2004-05-17



Hardware and Software, Engineered to Work Together