Home | History | Annotate | Download | only in build
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package util.build;
     18 
     19 import java.io.File;
     20 import java.lang.Iterable;
     21 import java.util.stream.Collectors;
     22 import java.util.Arrays;
     23 import java.util.HashSet;
     24 import java.util.List;
     25 import java.util.Set;
     26 import javax.tools.JavaCompiler;
     27 import javax.tools.JavaFileObject;
     28 import javax.tools.StandardJavaFileManager;
     29 import javax.tools.StandardLocation;
     30 import javax.tools.ToolProvider;
     31 
     32 public class JavacBuildStep extends SourceBuildStep {
     33 
     34     private final String destPath;
     35     private final String classPath;
     36     private final Set<String> sourceFiles = new HashSet<String>();
     37     public JavacBuildStep(String destPath, String classPath) {
     38         super(new File(destPath));
     39         this.destPath = destPath;
     40         this.classPath = classPath;
     41     }
     42 
     43     @Override
     44     public void addSourceFile(String sourceFile)
     45     {
     46         sourceFiles.add(sourceFile);
     47     }
     48 
     49     @Override
     50     boolean build() {
     51         if (super.build())
     52         {
     53             if (sourceFiles.isEmpty())
     54             {
     55                 return true;
     56             }
     57 
     58             File destFile = new File(destPath);
     59             if (!destFile.exists() && !destFile.mkdirs())
     60             {
     61                 System.err.println("failed to create destination dir");
     62                 return false;
     63             }
     64 
     65             Iterable<File> classPathFiles = Arrays.asList(classPath.split(":"))
     66                     .stream()
     67                     .map(File::new)
     68                     .collect(Collectors.toList());
     69 
     70             JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
     71             try (StandardJavaFileManager fileManager = compiler.getStandardFileManager(
     72                     null,     // diagnosticListener: we don't care about the details.
     73                     null,     // locale: use default locale.
     74                     null)) {  // charset: use platform default.
     75                 fileManager.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(
     76                         new File(destPath)));
     77                 fileManager.setLocation(StandardLocation.CLASS_PATH, classPathFiles);
     78 
     79                 Iterable<? extends JavaFileObject> compilationUnits =
     80                         fileManager.getJavaFileObjectsFromStrings(sourceFiles);
     81 
     82                 List<String> options = Arrays.asList("-source", "1.7", "-target", "1.7");
     83 
     84                 return compiler.getTask(
     85                         null,  // out: write errors to System.err.
     86                         fileManager,
     87                         null,  // diagnosticListener: we don't care about the details.
     88                         options,
     89                         null,  // classes: classes for annotation processing = none.
     90                         compilationUnits).call();
     91             } catch (Exception e) {
     92                 e.printStackTrace();
     93                 return false;
     94             }
     95         }
     96         return false;
     97     }
     98 
     99     @Override
    100     public boolean equals(Object obj) {
    101         if (super.equals(obj))
    102         {
    103             JavacBuildStep other = (JavacBuildStep) obj;
    104             return destPath.equals(other.destPath)
    105                 && classPath.equals(other.classPath)
    106                 && sourceFiles.equals(other.sourceFiles);
    107         }
    108         return false;
    109     }
    110 
    111     @Override
    112     public int hashCode() {
    113         return destPath.hashCode() ^ classPath.hashCode() ^ sourceFiles.hashCode();
    114     }
    115 }
    116