Package org.aspectj.ajde.core

Source Code of org.aspectj.ajde.core.AjCompiler

/********************************************************************
* Copyright (c) 2007 Contributors. All rights reserved.
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License v1.0
* which accompanies this distribution and is available at
* http://eclipse.org/legal/epl-v10.html
* Contributors: IBM Corporation - initial API and implementation
*          Helen Hawkins   - initial version (bug 148190)
*******************************************************************/
package org.aspectj.ajde.core;

import java.io.File;

import org.aspectj.ajde.core.internal.AjdeCoreBuildManager;
import org.aspectj.ajdt.internal.core.builder.AjState;
import org.aspectj.ajdt.internal.core.builder.IncrementalStateManager;
import org.aspectj.asm.AsmManager;
import org.aspectj.bridge.IMessage;
import org.aspectj.bridge.Message;
import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;

/**
* The class to be used by tools to drive a build. An AjCompiler is created with a unique id (for example the absolute pathname of a
* project or .lst file) along with implementations of ICompilerConfiguration, IBuildProgressMonitor and IBuildMessageHandler. Tools
* then call build() or buildFresh() on this AjCompiler.
*
* <p>
* An AjCompiler is associated with one id, therefore a new one needs to be created for a new id (project, .lst file etc.). It is
* the responsibility of the tools to manage the lifecycle of the AjCompiler's.
*/
public class AjCompiler {

  private final String compilerId;
  private final ICompilerConfiguration compilerConfig;
  private final IBuildProgressMonitor monitor;
  private final IBuildMessageHandler handler;
  private final AjdeCoreBuildManager buildManager;

  /**
   * Creates a new AjCompiler for the given id, ICompilerConfiguration, IBuildProgressMonitor and IBuildMessageHandler. None of
   * the arguments can be null.
   *
   * @param compilerId - Unique String used to identify this AjCompiler
   * @param compilerConfig - ICompilerConfiguration implementation
   * @param buildProgressMonitor - IBuildProgressMonitor implementation
   * @param buildMessageHandler - IBuildMessageHandler implementation
   */
  public AjCompiler(String compilerId, ICompilerConfiguration compilerConfig, IBuildProgressMonitor buildProgressMonitor,
      IBuildMessageHandler buildMessageHandler) {
    this.compilerConfig = compilerConfig;
    this.monitor = buildProgressMonitor;
    this.handler = buildMessageHandler;
    this.compilerId = compilerId;
    this.buildManager = new AjdeCoreBuildManager(this);
  }

  /**
   * @return the id for this AjCompiler
   */
  public String getId() {
    return compilerId;
  }

  /**
   * @return the ICompilerConfiguration associated with this AjCompiler
   */
  public ICompilerConfiguration getCompilerConfiguration() {
    return compilerConfig;
  }

  /**
   * @return the IBuildProgressMonitor associated with this AjCompiler
   */
  public IBuildProgressMonitor getBuildProgressMonitor() {
    return monitor;
  }

  /**
   * @return the IBuildMessageHandler associated with this AjCompiler
   */
  public IBuildMessageHandler getMessageHandler() {
    return handler;
  }

  /**
   * Perform an incremental build if possible, otherwise it will default to a full build.
   */
  public void build() {
    if (hasValidId()) {
      buildManager.performBuild(false);
    }
  }

  /**
   * Perform a full build.
   */
  public void buildFresh() {
    if (hasValidId()) {
      buildManager.performBuild(true);
    }
  }

  /**
   * Clear the incremental state associated with this AjCompiler from the IncrementalStateManager. This is necessary until AjState
   * is reworked and there's an AjState associated with an AjCompiler rather than requiring a map of them. If the environment is
   * not cleaned up then jar locks may be kept.
   */
  public void clearLastState() {
    IncrementalStateManager.removeIncrementalStateInformationFor(compilerId);
    buildManager.cleanupEnvironment();
  }

  public boolean addDependencies(File file, String[] typeNameDependencies) {
    AjState state = IncrementalStateManager.retrieveStateFor(compilerId);
    return state.recordDependencies(file, typeNameDependencies);
  }

  /**
   * @return true if the underlying version of the compiler is compatible with Java 6, returns false otherwise.
   */
  public boolean isJava6Compatible() {
    return CompilerOptions.versionToJdkLevel(JavaOptions.VERSION_16) != 0;
  }

  /**
   * Ensures that the id associated with this compiler is non-null. If it is null then sends an ABORT message to the
   * messageHandler.
   */
  private boolean hasValidId() {
    if (compilerId == null) {
      Message msg = new Message("compiler didn't have an id associated with it", IMessage.ABORT, null, null);
      handler.handleMessage(msg);
      return false;
    }
    return true;
  }

  /**
   * Set a CustomMungerFactory to the compiler's weaver
   *
   * The type of factory should be org.aspectj.weaver.CustomMungerFactory but due to dependency problem of project ajde.core, it
   * is Object for now.
   *
   * @param factory
   */
  public void setCustomMungerFactory(Object factory) {
    buildManager.setCustomMungerFactory(factory);
  }

  /**
   * @return the CustomMungerFactory from the compiler's weaver
   *
   *         The return type should be org.aspectj.weaver.CustomMungerFactory but due to dependency problem of project ajde.core,
   *         it is Object for now.
   */
  public Object getCustomMungerFactory() {
    return buildManager.getCustomMungerFactory();
  }

  public AsmManager getModel() {
    return buildManager.getStructureModel();
  }

  public AjdeCoreBuildManager getBuildManager() {
    return buildManager;
  }
}
TOP

Related Classes of org.aspectj.ajde.core.AjCompiler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.