1 /*
   2  * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /*
  25  * @test
  26  * @bug 6380016
  27  * @summary Test that the constraints guaranteed by the Filer and maintained
  28  * @author  Joseph D. Darcy
  29  * @build TestNames
  30  * @compile -processor TestNames -proc:only TestNames.java
  31  */
  32 
  33 import java.util.Set;
  34 import javax.annotation.processing.*;
  35 import javax.lang.model.SourceVersion;
  36 import static javax.lang.model.SourceVersion.*;
  37 import javax.lang.model.element.*;
  38 import javax.lang.model.util.*;
  39 import static javax.lang.model.util.ElementFilter.*;
  40 import static javax.tools.Diagnostic.Kind.*;
  41 import static javax.tools.StandardLocation.*;
  42 
  43 import java.io.*;
  44 
  45 /**
  46  * Basic tests of semantics of javax.lang.model.element.Name
  47  */
  48 @SupportedAnnotationTypes("*")
  49 public class TestNames extends AbstractProcessor {
  50     private int round = 0;
  51     private Filer filer;
  52     private Elements eltUtils;
  53 
  54     String stringStringName = "java.lang.String";
  55     Name stringName = null;
  56 
  57     public boolean process(Set<? extends TypeElement> annotations,
  58                            RoundEnvironment roundEnv) {
  59         round++;
  60         if (!roundEnv.processingOver()) {
  61             boolean failed = false;
  62 
  63             switch(round) {
  64             case 1:
  65 
  66             TypeElement stringMirror = eltUtils.getTypeElement(stringStringName);
  67             stringName = stringMirror.getQualifiedName();
  68             Name stringPseudoName = Pseudonym.getName(stringName.toString());
  69 
  70 
  71             if (stringName.equals(stringPseudoName))
  72                 failed = true;
  73             if (!stringName.contentEquals(stringStringName))
  74                 failed = true;
  75             if (!stringName.contentEquals(stringPseudoName))
  76                 failed = true;
  77 
  78 
  79             try {
  80                 // Force another round with a new context
  81                 PrintWriter pw = new PrintWriter(filer.createSourceFile("Foo").openWriter());
  82                 pw.println("public class Foo {}");
  83                 pw.close();
  84             } catch (IOException ioe) {
  85                 throw new RuntimeException();
  86             }
  87             break;
  88 
  89             case 2:
  90                 Name stringStringAsName = eltUtils.getName(stringStringName);
  91                 TypeElement stringMirror2 = eltUtils.getTypeElement(stringStringName);
  92                 Name stringName2 = stringMirror2.getQualifiedName();
  93 
  94                 if (stringStringAsName != stringName ||
  95                     stringName != stringName2)
  96                     failed = true;
  97                 break;
  98 
  99             default:
 100                 throw new RuntimeException("Unexpected round " + round);
 101             }
 102 
 103             if (failed)
 104                 throw new RuntimeException("Invalid name equality checks.");
 105         }
 106         return true;
 107     }
 108 
 109     public SourceVersion getSupportedSourceVersion() {
 110         return SourceVersion.latest();
 111     }
 112 
 113     public void init(ProcessingEnvironment processingEnv) {
 114         super.init(processingEnv);
 115         filer    = processingEnv.getFiler();
 116         eltUtils = processingEnv.getElementUtils();
 117     }
 118 
 119     private static class Pseudonym implements Name {
 120         private String name;
 121 
 122         private Pseudonym(String name) {
 123             this.name = name;
 124         }
 125 
 126         public static Pseudonym getName(String name) {
 127             return new Pseudonym(name);
 128         }
 129 
 130         public boolean contentEquals(CharSequence cs) {
 131             return name.contentEquals(cs);
 132         }
 133 
 134         public char charAt(int index) {
 135             return name.charAt(index);
 136         }
 137 
 138         public int length() {
 139             return name.length();
 140         }
 141 
 142         public CharSequence subSequence(int start, int end) {
 143             return name.subSequence(start, end);
 144         }
 145 
 146         public String toString() {
 147             return name;
 148         }
 149     }
 150 }