content: /**
   * Copyright (c) 2016-present, RxJava Contributors.
   *
   * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in
   * compliance with the License. You may obtain a copy of the License at
   *
   * http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software distributed under the License is
   * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See
   * the License for the specific language governing permissions and limitations under the License.
   */
  
  package io.reactivex.interop;
  
  import static org.junit.Assert.fail;
  
  import java.io.*;
  import java.net.URL;
  
  import org.junit.Test;
  
  import io.reactivex.observable.Maybe;
  
  /**
   * Checks the source code of Maybe and finds unnecessary since 2.0 annotations in the
   * method's javadocs.
   */
  public class MaybeNo2Dot0Since {
  
      /**
       * Given a base reactive type name, try to find its source in the current runtime
       * path and return a file to it or null if not found.
       * @param baseClassName the class name such as {@code Maybe}
       * @return the File pointing to the source
       * @param project the project directory of the base class
       * @throws Exception on error
       */
      public static File findSource(String baseClassName, String project) throws Exception {
          URL u = MaybeNo2Dot0Since.class.getResource(MaybeNo2Dot0Since.class.getSimpleName() + ".class");
  
          String path = new File(u.toURI()).toString().replace('\\', '/');
  
  //        System.out.println(path);
  
          int i = path.indexOf("/RxJava");
          if (i < 0) {
              System.out.println("Can't find the base RxJava directory");
              return null;
          }
  
          // find end of any potential postfix to /RxJava
          int j = path.indexOf("/", i + 6);
  
          String p = path.substring(0, j + 1) + project + "/src/main/java/io/reactivex/" + project + "/" + baseClassName + ".java";
  
          File f = new File(p);
  
          if (!f.canRead()) {
              System.out.println("Can't read " + p);
              return null;
          }
  
          return f;
      }
  
      @Test
      public void noSince20InMaybe() throws Exception {
  
          File f = findSource(Maybe.class.getSimpleName(), "observable");
  
          String line;
  
          StringBuilder b = new StringBuilder();
  
          boolean classDefPassed = false;
  
          BufferedReader in = new BufferedReader(new FileReader(f));
          try {
              int ln = 1;
              while (true) {
                  line = in.readLine();
  
                  if (line == null) {
                      break;
                  }
  
                  if (line.startsWith("public abstract class Maybe<")) {
                      classDefPassed = true;
                  }
  
                  if (classDefPassed) {
                      if (line.contains("@since") && line.contains("2.0") && !line.contains("2.0.")) {
                          b.append("java.lang.RuntimeException: @since 2.0 found").append("\r\n")
                          .append(" at io.reactivex.Maybe (Maybe.java:").append(ln).append(")\r\n\r\n");
                          ;
                      }
                  }
  
                  ln++;
              }
          } finally {
              in.close();
          }
  
          if (b.length() != 0) {
              System.out.println(b);
  
              fail(b.toString());
          }
      }
  }
  