/**
 * Copyright (C) 2008 Google Inc.
 *
 * 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 com.google.inject;

import java.io.File;
import java.io.IOException;
import java.util.Set;
import static com.google.common.base.Preconditions.checkNotNull;

/**
 * <strong>Unsupported.</strong> Currently compile-time Guice code still
 * requires runtime access to the reflection APIs and is not suited for use.
 *
 * <p>Performs "compile-time" code generation in order to avoid runtime
 * reflection. This is motivated to support Guice on environments where Java
 * reflection is expensive or unavailable.
 *
 * @author jessewilson@google.com (Jesse Wilson)
 */
/* public */ class CompileTimeGuice {

  private final String name;
  private final Set<? extends Module> modules;

  /**
   * Builds a new compile-time guice instance. The instance must be provided
   * the exact same {@code name} and {@code modules} at both compile-time and
   * at runtime, otherwise behaviour is undefined.
   *
   * @param name a unique, valid Java identifier such as "FooApplication".
   * @param modules the modules used to build the injector.
   */
  public CompileTimeGuice(String name, Set<? extends Module> modules) {
    this.name = checkNotNull(name, "name");
    this.modules = checkNotNull(modules, "modules");
  }

  /**
   * "Compile-time" step that generates <code>.java</code> source directories
   * to support runtime reflection. This step must be executed whenever the
   * modules or their dependendent classes have changed.
   */
  void generateCode(File generatedSourceDirectory) throws IOException {
    CodeGenReflectionFactory reflectionFactory = new CodeGenReflectionFactory(name);

    new InjectorBuilder()
        .stage(Stage.TOOL)
        .addModules(modules)
        .usingReflectionFactory(reflectionFactory)
        .build();

    reflectionFactory.writeToFile(generatedSourceDirectory);
  }

  /**
   * Runtime step that uses the generated <code>.java</code> to create an
   * injector.
   */
  Injector createInjector() {
    Reflection.Factory reflectionFactory
        = new CodeGenReflectionFactory(name).getRuntimeReflectionFactory();

    return new InjectorBuilder()
        .stage(Stage.TOOL)
        .addModules(modules)
        .usingReflectionFactory(reflectionFactory)
        .build();
  }
}