Package org.aspectj.ajdt.internal.core.builder

Source Code of org.aspectj.ajdt.internal.core.builder.IncrementalStateManager

/* *******************************************************************
* Copyright (c) 2005 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:
* Andy Clement          initial implementation
* ******************************************************************/
package org.aspectj.ajdt.internal.core.builder;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Collection;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.aspectj.ajdt.internal.compiler.CompilationResultDestinationManager;
import org.aspectj.weaver.CompressingDataOutputStream;

/**
* Central point for all things incremental... - keeps track of the state recorded for each different config file - allows limited
* interaction with these states
*
* - records dependency/change info for particular classpaths > this will become what JDT keeps in its 'State' object when its
* finished
*/
public class IncrementalStateManager {

  // FIXME asc needs an API through Ajde for trashing its contents
  // FIXME asc needs some memory mgmt (softrefs?) to recover memory
  // SECRETAPI will consume more memory, so turn on at your own risk ;) Set to 'true' when memory usage is understood
  public static boolean recordIncrementalStates = false;
  public static boolean debugIncrementalStates = false;
  private static Hashtable incrementalStates = new Hashtable();

  public static void recordSuccessfulBuild(String buildConfig, AjState state) {
    if (!recordIncrementalStates) {
      return;
    }
    incrementalStates.put(buildConfig, state);
    // persist();
  }

  /**
   * Store states on disk
   */
  public static void persist() {
    // check serialization works
    Set entries = incrementalStates.entrySet();
    for (Iterator iterator = entries.iterator(); iterator.hasNext();) {
      Map.Entry entry = (Map.Entry) iterator.next();
      System.out.println("Name " + entry.getKey());
      File f = new File("n:/temp/foo.ajstate");
      try {
        AjState state = (AjState) entry.getValue();
        CompressingDataOutputStream dos = new CompressingDataOutputStream(new FileOutputStream(f));
        state.write(dos);
        dos.close();
      } catch (FileNotFoundException e) {
        throw new RuntimeException(e);
      } catch (IOException e) {
        throw new RuntimeException(e);
      }
    }
  }

  public static boolean removeIncrementalStateInformationFor(String buildConfig) {
    return incrementalStates.remove(buildConfig) != null;
  }

  public static void clearIncrementalStates() {
    for (Iterator iter = incrementalStates.values().iterator(); iter.hasNext();) {
      AjState element = (AjState) iter.next();
      element.wipeAllKnowledge();
    }
    incrementalStates.clear();
    // AsmManager.getDefault().createNewStructureModel(); // forget what you know...
  }

  public static Set getConfigFilesKnown() {
    return incrementalStates.keySet();
  }

  public static AjState retrieveStateFor(String configFile) {
    return (AjState) incrementalStates.get(configFile);
  }

  // now, managing changes to entries on a classpath

  public static AjState findStateManagingOutputLocation(File location) {
    Collection allStates = incrementalStates.values();
    if (debugIncrementalStates) {
      System.err.println("> findStateManagingOutputLocation(" + location + ") has " + allStates.size()
          + " states to look through");
    }
    for (Iterator iter = allStates.iterator(); iter.hasNext();) {
      AjState element = (AjState) iter.next();
      AjBuildConfig ajbc = element.getBuildConfig();
      if (ajbc == null) {
        // FIXME asc why can it ever be null?
        if (debugIncrementalStates) {
          System.err.println("  No build configuration for state " + element);
        }
        continue;
      }
      File outputDir = ajbc.getOutputDir();
      if (outputDir != null && outputDir.equals(location)) {
        if (debugIncrementalStates) {
          System.err.println("< findStateManagingOutputLocation(" + location + ") returning " + element);
        }
        return element;
      }
      CompilationResultDestinationManager outputManager = ajbc.getCompilationResultDestinationManager();
      if (outputManager != null) {
        List outputDirs = outputManager.getAllOutputLocations();
        for (Iterator iterator = outputDirs.iterator(); iterator.hasNext();) {
          File dir = (File) iterator.next();
          if (dir.equals(location)) {
            if (debugIncrementalStates) {
              System.err.println("< findStateManagingOutputLocation(" + location + ") returning " + element);
            }
            return element;
          }
        }
      }
      if (outputDir == null && outputManager == null) {
        // FIXME why can it ever be null? due to using outjar?
        if (debugIncrementalStates) {
          System.err.println("  output directory and output location manager for " + ajbc + " are null");
        }
        continue;
      }

    }
    if (debugIncrementalStates) {
      System.err.println("< findStateManagingOutputLocation(" + location + ") returning null");
    }
    return null;
  }

  // FIXME asc needs a persistence mechanism for storing/loading all state info
  // FIXME asc needs to understand two config files might point at the same output dir... what to do about this?
}
TOP

Related Classes of org.aspectj.ajdt.internal.core.builder.IncrementalStateManager

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.