diff options
Diffstat (limited to 'jsquery')
-rw-r--r-- | jsquery/src/main/java/com/google/gwt/dev/javac/StandardGeneratorContext.java | 834 |
1 files changed, 0 insertions, 834 deletions
diff --git a/jsquery/src/main/java/com/google/gwt/dev/javac/StandardGeneratorContext.java b/jsquery/src/main/java/com/google/gwt/dev/javac/StandardGeneratorContext.java deleted file mode 100644 index 8ea2f1e6..00000000 --- a/jsquery/src/main/java/com/google/gwt/dev/javac/StandardGeneratorContext.java +++ /dev/null @@ -1,834 +0,0 @@ -/* - * Copyright 2007 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.gwt.dev.javac; - -import com.google.gwt.core.ext.Generator; -import com.google.gwt.core.ext.GeneratorContext; -import com.google.gwt.core.ext.GeneratorContextExt; -import com.google.gwt.core.ext.GeneratorExt; -import com.google.gwt.core.ext.GeneratorExtWrapper; -import com.google.gwt.core.ext.PropertyOracle; -import com.google.gwt.core.ext.TreeLogger; -import com.google.gwt.core.ext.UnableToCompleteException; -import com.google.gwt.core.ext.linker.Artifact; -import com.google.gwt.core.ext.linker.ArtifactSet; -import com.google.gwt.core.ext.linker.GeneratedResource; -import com.google.gwt.core.ext.linker.impl.StandardGeneratedResource; -import com.google.gwt.core.ext.typeinfo.JClassType; -import com.google.gwt.core.ext.typeinfo.TypeOracle; -import com.google.gwt.dev.cfg.ModuleDef; -import com.google.gwt.dev.javac.rebind.CachedRebindResult; -import com.google.gwt.dev.javac.rebind.RebindResult; -import com.google.gwt.dev.javac.rebind.RebindRuleResolver; -import com.google.gwt.dev.javac.rebind.RebindStatus; -import com.google.gwt.dev.resource.ResourceOracle; -import com.google.gwt.dev.util.DiskCache; -import com.google.gwt.dev.util.Util; -import com.google.gwt.dev.util.collect.HashSet; -import com.google.gwt.dev.util.collect.IdentityHashMap; -import com.google.gwt.dev.util.log.speedtracer.CompilerEventType; -import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger; -import com.google.gwt.dev.util.log.speedtracer.SpeedTracerLogger.Event; -import com.google.gwt.util.tools.Utility; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.SortedSet; - -/** - * Manages generators and generated units during a single compilation. - */ -public class StandardGeneratorContext implements GeneratorContextExt { - - /** - * Extras added to {@link GeneratedUnit}. - */ - private static interface Generated extends GeneratedUnit { - void abort(); - - void commit(TreeLogger logger); - - /** - * Returns the strong hash of the source. - */ - String getStrongHash(); - - String getTypeName(); - } - - /** - * This generated unit acts as a normal generated unit as well as a buffer - * into which generators can write their source. A controller should ensure - * that source isn't requested until the generator has finished writing it. - * This version is backed by {@link StandardGeneratorContext#diskCache}. - */ - private static class GeneratedUnitImpl implements Generated { - - /** - * A token to retrieve this object's bytes from the disk cache. - */ - protected long sourceToken = -1; - - private long creationTime; - - private String strongHash; // cache so that refreshes work correctly - - private StringWriter sw; - - private final String typeName; - - public GeneratedUnitImpl(StringWriter sw, String typeName) { - this.typeName = typeName; - this.sw = sw; - } - - public void abort() { - sw = null; - } - - /** - * Finalizes the source and adds this generated unit to the host. - */ - public void commit(TreeLogger logger) { - String source = sw.toString(); - System.out.println(">>>>> \n" + source); - strongHash = Util.computeStrongName(Util.getBytes(source)); - sourceToken = diskCache.writeString(source); - sw = null; - creationTime = System.currentTimeMillis(); - } - - public long creationTime() { - return creationTime; - } - - public String getSource() { - if (sw != null) { - throw new IllegalStateException("source not committed"); - } - return diskCache.readString(sourceToken); - } - - public long getSourceToken() { - if (sw != null) { - throw new IllegalStateException("source not committed"); - } - return sourceToken; - } - - public String getStrongHash() { - return strongHash; - } - - public String getTypeName() { - return typeName; - } - - public String optionalFileLocation() { - return null; - } - } - - /** - * This generated unit acts as a normal generated unit as well as a buffer - * into which generators can write their source. A controller should ensure - * that source isn't requested until the generator has finished writing it. - * This version is backed by an explicit generated file. - */ - private static class GeneratedUnitWithFile extends GeneratedUnitImpl { - private final File file; - - public GeneratedUnitWithFile(File file, StringWriter pw, String typeName) { - super(pw, typeName); - this.file = file; - } - - @Override - public void commit(TreeLogger logger) { - super.commit(logger); - FileOutputStream fos = null; - try { - fos = new FileOutputStream(file); - diskCache.transferToStream(sourceToken, fos); - } catch (IOException e) { - logger.log(TreeLogger.WARN, "Error writing out generated unit at '" - + file.getAbsolutePath() + "': " + e); - } finally { - Utility.close(fos); - } - } - - @Override - public String optionalFileLocation() { - return file.exists() ? file.getAbsolutePath() : null; - } - } - - /** - * Manages a resource that is in the process of being created by a generator. - */ - private static class PendingResource extends OutputStream { - - private ByteArrayOutputStream baos = new ByteArrayOutputStream(); - private final String partialPath; - - public PendingResource(String partialPath) { - this.partialPath = partialPath; - } - - public void abort() { - baos = null; - } - - public String getPartialPath() { - return partialPath; - } - - public byte[] takeBytes() { - byte[] result = baos.toByteArray(); - baos = null; - return result; - } - - @Override - public void write(byte[] b) throws IOException { - if (baos == null) { - throw new IOException("stream closed"); - } - baos.write(b); - } - - @Override - public void write(byte[] b, int off, int len) throws IOException { - if (baos == null) { - throw new IOException("stream closed"); - } - baos.write(b, off, len); - } - - @Override - public void write(int b) throws IOException { - if (baos == null) { - throw new IOException("stream closed"); - } - baos.write(b); - } - } - - private static DiskCache diskCache = DiskCache.INSTANCE; - - private static final Map<String, CompilerEventType> eventsByGeneratorType = - new HashMap<String, CompilerEventType>(); - static { - eventsByGeneratorType.put( - "com.google.gwt.resources.rebind.context.InlineClientBundleGenerator", - CompilerEventType.GENERATOR_CLIENT_BUNDLE); - eventsByGeneratorType.put("com.google.gwt.i18n.rebind.LocalizableGenerator", - CompilerEventType.GENERATOR_I18N); - eventsByGeneratorType.put("com.google.gwt.i18n.rebind.LocaleInfoGenerator", - CompilerEventType.GENERATOR_I18N); - eventsByGeneratorType.put("com.google.gwt.i18n.rebind.CurrencyListGenerator", - CompilerEventType.GENERATOR_I18N); - eventsByGeneratorType.put("com.google.gwt.i18n.rebind.CustomDateTimeFormatGenerator", - CompilerEventType.GENERATOR_I18N); - eventsByGeneratorType.put("com.google.gwt.user.rebind.rpc.ServiceInterfaceProxyGenerator", - CompilerEventType.GENERATOR_RPC); - eventsByGeneratorType.put("com.google.gwt.rpc.rebind.RpcServiceGenerator", - CompilerEventType.GENERATOR_RPC); // deRPC - eventsByGeneratorType.put("com.google.gwt.uibinder.rebind.UiBinderGenerator", - CompilerEventType.GENERATOR_UIBINDER); - eventsByGeneratorType.put("com.google.gwt.inject.rebind.GinjectorGenerator", - CompilerEventType.GENERATOR_GIN); - } - - private final ArtifactSet allGeneratedArtifacts; - - private final Map<String, GeneratedUnit> committedGeneratedCups = - new HashMap<String, GeneratedUnit>(); - - private CompilationState compilationState; - - private Class<? extends Generator> currentGenerator; - - private final File genDir; - - private final Map<Class<? extends Generator>, Generator> generators = - new IdentityHashMap<Class<? extends Generator>, Generator>(); - - private final ModuleDef module; - - private ArtifactSet newlyGeneratedArtifacts = new ArtifactSet(); - - private final Set<String> newlyGeneratedTypeNames = new HashSet<String>(); - - private final Map<String, PendingResource> pendingResources = - new HashMap<String, PendingResource>(); - - private transient PropertyOracle propOracle; - - private RebindRuleResolver rebindRuleResolver; - - private final Map<PrintWriter, Generated> uncommittedGeneratedCupsByPrintWriter = - new IdentityHashMap<PrintWriter, Generated>(); - - private CachedRebindResult cachedRebindResult = null; - - private boolean generatorResultCachingEnabled = false; - - private List<String> cachedTypeNamesToReuse = null; - - private boolean isProdMode; - - /** - * Normally, the compiler host would be aware of the same types that are - * available in the supplied type oracle although it isn't strictly required. - */ - public StandardGeneratorContext(CompilationState compilationState, ModuleDef module, File genDir, - ArtifactSet allGeneratedArtifacts, boolean isProdMode) { - this.compilationState = compilationState; - this.module = module; - this.genDir = genDir; - this.allGeneratedArtifacts = allGeneratedArtifacts; - this.isProdMode = isProdMode; - } - - /** - * Adds a generated unit to the context if not already present, but will not - * overwrite an existing unit. - */ - public void addGeneratedUnit(GeneratedUnit gu) { - if (!committedGeneratedCups.containsKey(gu.getTypeName())) { - committedGeneratedCups.put(gu.getTypeName(), gu); - } - } - - /** - * Adds generated units to the context, but will not overwrite any existing - * units that might already be present. - */ - public void addGeneratedUnits(Collection<GeneratedUnit> generatedUnits) { - for (GeneratedUnit gu : generatedUnits) { - addGeneratedUnit(gu); - } - } - - /** - * Adds all available cached generated units to the context. Existing units - * for a given type will not be overwritten. - */ - public void addGeneratedUnitsFromCache() { - if (cachedRebindResult != null && cachedRebindResult.getGeneratedUnits() != null) { - addGeneratedUnits(cachedRebindResult.getGeneratedUnits()); - } - } - - /** - * Adds cached generated units to the context that have been marked for reuse. - * Existing units for a given type will not be overwritten. - */ - public void addGeneratedUnitsMarkedForReuseFromCache() { - if (cachedTypeNamesToReuse != null && cachedRebindResult != null) { - for (String typeName : cachedTypeNamesToReuse) { - GeneratedUnit gu = cachedRebindResult.getGeneratedUnit(typeName); - if (gu != null) { - addGeneratedUnit(gu); - } - } - } - } - - /** - * Checks whether a rebind rule is available for a given sourceTypeName. - */ - public boolean checkRebindRuleAvailable(String sourceTypeName) { - if (rebindRuleResolver != null) { - return rebindRuleResolver.checkRebindRuleResolvable(sourceTypeName); - } else { - return false; - } - } - - /** - * Frees memory used up by compilation state. - */ - public void clear() { - compilationState = null; - generators.clear(); - } - - /** - * Commits a pending generated type. - */ - public final void commit(TreeLogger logger, PrintWriter pw) { - Generated gcup = uncommittedGeneratedCupsByPrintWriter.get(pw); - if (gcup != null) { - gcup.commit(logger); - uncommittedGeneratedCupsByPrintWriter.remove(pw); - committedGeneratedCups.put(gcup.getTypeName(), gcup); - } else { - logger.log(TreeLogger.WARN, "Generator attempted to commit an unknown PrintWriter", null); - } - } - - /** - * Adds an Artifact to the context's ArtifactSets. This will replace a - * pre-existing entry in allGeneratedArtifacts, but will not overwrite an - * entry in the newlyGeneratedArtifacts (since it is assumed by convention - * that only new entries will ever be inserted here for a given generator - * run). - */ - public void commitArtifact(TreeLogger logger, Artifact<?> artifact) { - allGeneratedArtifacts.replace(artifact); - newlyGeneratedArtifacts.add(artifact); - } - - /** - * Commits all available cached Artifacts to the context. - */ - public void commitArtifactsFromCache(TreeLogger logger) { - if (cachedRebindResult != null && cachedRebindResult.getArtifacts() != null) { - for (Artifact<?> art : cachedRebindResult.getArtifacts()) { - commitArtifact(logger, art); - } - } - } - - public GeneratedResource commitResource(TreeLogger logger, OutputStream os) - throws UnableToCompleteException { - - PendingResource pendingResource = null; - String partialPath = null; - if (os instanceof PendingResource) { - pendingResource = (PendingResource) os; - partialPath = pendingResource.getPartialPath(); - // Make sure it's ours by looking it up in the map. - if (pendingResource != pendingResources.get(partialPath)) { - pendingResource = null; - } - } - if (pendingResource == null) { - logger.log(TreeLogger.WARN, "Generator attempted to commit an unknown OutputStream", null); - throw new UnableToCompleteException(); - } - - // Add the GeneratedResource to the ArtifactSet - GeneratedResource toReturn = - new StandardGeneratedResource(currentGenerator, partialPath, pendingResource.takeBytes()); - commitArtifact(logger, toReturn); - pendingResources.remove(pendingResource.getPartialPath()); - return toReturn; - } - - /** - * Call this whenever generators are known to not be running to clear out - * uncommitted compilation units and to force committed compilation units to - * be parsed and added to the type oracle. - * - * @return any newly generated artifacts since the last call - */ - public final ArtifactSet finish(TreeLogger logger) { - abortUncommittedResources(logger); - - try { - TreeLogger branch; - if (!committedGeneratedCups.isEmpty()) { - // Assimilate the new types into the type oracle. - // - String msg = "Assimilating generated source"; - branch = logger.branch(TreeLogger.DEBUG, msg, null); - - TreeLogger subBranch = null; - if (branch.isLoggable(TreeLogger.DEBUG)) { - subBranch = branch.branch(TreeLogger.DEBUG, "Generated source files...", null); - } - - for (GeneratedUnit gcup : committedGeneratedCups.values()) { - String qualifiedTypeName = gcup.getTypeName(); - if (subBranch != null) { - subBranch.log(TreeLogger.DEBUG, qualifiedTypeName, null); - } - } - - compilationState.addGeneratedCompilationUnits(logger, committedGeneratedCups.values()); - } - return newlyGeneratedArtifacts; - } finally { - - // Remind the user if there uncommitted cups. - if (!uncommittedGeneratedCupsByPrintWriter.isEmpty()) { - String msg = - "For the following type(s), generated source was never committed (did you forget to call commit()?)"; - logger = logger.branch(TreeLogger.WARN, msg, null); - - for (Generated unit : uncommittedGeneratedCupsByPrintWriter.values()) { - logger.log(TreeLogger.WARN, unit.getTypeName(), null); - } - } - - uncommittedGeneratedCupsByPrintWriter.clear(); - committedGeneratedCups.clear(); - newlyGeneratedTypeNames.clear(); - newlyGeneratedArtifacts = new ArtifactSet(); - cachedRebindResult = null; - cachedTypeNamesToReuse = null; - } - } - - public Set<String> getActiveLinkerNames() { - return module.getActiveLinkerNames(); - } - - /** - * Gets newly committed artifacts. - */ - public ArtifactSet getArtifacts() { - return new ArtifactSet(newlyGeneratedArtifacts); - } - - /** - * Gets the previously cached rebind result for the current generator. - */ - public CachedRebindResult getCachedGeneratorResult() { - return cachedRebindResult; - } - - public GeneratorContext getCanonicalContext() { - return this; - } - - public CompilationState getCompilationState() { - return compilationState; - } - - /** - * Gets all committed Java units. - */ - public Map<String, GeneratedUnit> getGeneratedUnitMap() { - return committedGeneratedCups; - } - - public final PropertyOracle getPropertyOracle() { - return propOracle; - } - - public ResourceOracle getResourcesOracle() { - return module.getResourcesOracle(); - } - - public final TypeOracle getTypeOracle() { - return compilationState.getTypeOracle(); - } - - public boolean isGeneratorResultCachingEnabled() { - return generatorResultCachingEnabled; - } - - public boolean isProdMode() { - return isProdMode; - } - - /** - * Adds a type name to the list of types to be reused from cache, if - * available. - * - * @param typeName The fully qualified name of a type. - * - * @return true, if the type is available in the cache and was successfully - * added to the list for reuse, false otherwise. - */ - public boolean reuseTypeFromCacheIfAvailable(String typeName) { - if (!isGeneratorResultCachingEnabled() || cachedRebindResult == null - || !cachedRebindResult.isTypeCached(typeName)) { - return false; - } - - if (cachedTypeNamesToReuse == null) { - cachedTypeNamesToReuse = new ArrayList<String>(); - } - cachedTypeNamesToReuse.add(typeName); - return true; - } - - /** - * This method is maintained for backwards compatibility. - * {@link #runGeneratorIncrementally} should be used instead. - */ - public String runGenerator(TreeLogger logger, Class<? extends Generator> generatorClass, - String typeName) throws UnableToCompleteException { - - RebindResult result = runGeneratorIncrementally(logger, generatorClass, typeName); - - return result.getReturnedTypeName(); - } - - /** - * Runs a generator incrementally, with support for managing the returned - * {@link RebindResult} object, which can contain status and cached results. - * This is a replacement for the {@link #runGenerator} method. - * <p> - * If the passed in generatorClass is an instance of {@link GeneratorExt}, - * it's {@link GeneratorExt#generateIncrementally} method will be called. - * <p> - * Otherwise, for backwards compatibility, the generatorClass will be wrapped - * in a {@link GeneratorExt} instance, and it's {@link Generator#generate} - * method will be called. - * - * @param logger - * @param generatorClass - * @param typeName - * @return a RebindResult - * @throws UnableToCompleteException - */ - public RebindResult runGeneratorIncrementally(TreeLogger logger, - Class<? extends Generator> generatorClass, String typeName) throws UnableToCompleteException { - String msg = "Invoking generator " + generatorClass.getName(); - logger = logger.branch(TreeLogger.DEBUG, msg, null); - - Generator generator = generators.get(generatorClass); - if (generator == null) { - try { - generator = generatorClass.newInstance(); - generators.put(generatorClass, generator); - } catch (Throwable e) { - logger.log(TreeLogger.ERROR, "Unexpected error trying to instantiate Generator '" - + generatorClass.getName() + "'", e); - throw new UnableToCompleteException(); - } - } - - setCurrentGenerator(generatorClass); - - // Avoid call to System.currentTimeMillis() if not logging DEBUG level - boolean loggable = logger.isLoggable(TreeLogger.DEBUG); - long before = loggable ? System.currentTimeMillis() : 0L; - String generatorClassName = generator.getClass().getName(); - CompilerEventType type = eventsByGeneratorType.get(generatorClassName); - - if (type == null) { - type = CompilerEventType.GENERATOR_OTHER; - } - - Event generatorEvent = - SpeedTracerLogger.start(type, "class", generatorClassName, "type", typeName); - - try { - GeneratorExt generatorExt; - if (generator instanceof GeneratorExt) { - generatorExt = (GeneratorExt) generator; - } else { - generatorExt = GeneratorExtWrapper.newInstance(generator); - } - - RebindResult result; - result = generatorExt.generateIncrementally(logger, this, typeName); - - if (loggable) { - if (result.getResultStatus() == RebindStatus.USE_EXISTING) { - msg = "Generator did not return a new class, type will be used as is"; - } else { - msg = "Generator returned class '" + result.getReturnedTypeName() + "'"; - } - long after = System.currentTimeMillis(); - msg += "; in " + (after - before) + " ms"; - logger.log(TreeLogger.DEBUG, msg, null); - } - return result; - } catch (AssertionError e) { - // Catch and log the assertion as a convenience to the developer - logger.log(TreeLogger.ERROR, "Generator '" + generatorClass.getName() - + "' failed an assertion while rebinding '" + typeName + "'", e); - throw new UnableToCompleteException(); - } catch (RuntimeException e) { - logger.log(TreeLogger.ERROR, "Generator '" + generatorClass.getName() - + "' threw an exception while rebinding '" + typeName + "'", e); - throw new UnableToCompleteException(); - } finally { - generatorEvent.end(); - } - } - - /** - * Set previously cached rebind result for currently active generator. - */ - public void setCachedGeneratorResult(CachedRebindResult cachedRebindResult) { - this.cachedRebindResult = cachedRebindResult; - } - - public void setCurrentGenerator(Class<? extends Generator> currentGenerator) { - this.currentGenerator = currentGenerator; - } - - public void setGeneratorResultCachingEnabled(boolean enabled) { - this.generatorResultCachingEnabled = enabled; - } - - /** - * Sets the current transient property oracle to answer current property - * questions. - */ - public void setPropertyOracle(PropertyOracle propOracle) { - this.propOracle = propOracle; - } - - public void setRebindRuleResolver(RebindRuleResolver resolver) { - this.rebindRuleResolver = resolver; - } - - public final PrintWriter tryCreate(TreeLogger logger, String packageName, String simpleTypeName) { - String typeName; - if (packageName.length() == 0) { - typeName = simpleTypeName; - } else { - typeName = packageName + '.' + simpleTypeName; - } - // Is type already known to the host? - JClassType existingType = getTypeOracle().findType(packageName, simpleTypeName); - if (existingType != null) { - if (logger.isLoggable(TreeLogger.DEBUG)) { - logger.log(TreeLogger.DEBUG, "Type '" + typeName - + "' already exists and will not be re-created ", null); - } - return null; - } - - // Type recently generated? - if (newlyGeneratedTypeNames.contains(typeName)) { - return null; - } - - // The type isn't there, so we can let the caller create it. Remember that - // it is pending so another attempt to create the same type will fail. - Generated gcup; - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw, true) { - /** - * Overridden to force unix-style line endings for consistent behavior - * across platforms. - */ - @Override - public void println() { - super.print('\n'); - super.flush(); - } - }; - if (this.genDir == null) { - gcup = new GeneratedUnitImpl(sw, typeName); - } else { - File dir = new File(genDir, packageName.replace('.', File.separatorChar)); - // No need to check mkdirs result because an IOException will occur anyway - dir.mkdirs(); - File srcFile = new File(dir, simpleTypeName + ".java"); - if (srcFile.exists()) { - srcFile.delete(); - } - gcup = new GeneratedUnitWithFile(srcFile, sw, typeName); - } - uncommittedGeneratedCupsByPrintWriter.put(pw, gcup); - newlyGeneratedTypeNames.add(typeName); - return pw; - } - - public OutputStream tryCreateResource(TreeLogger logger, String partialPath) - throws UnableToCompleteException { - - logger = - logger.branch(TreeLogger.DEBUG, "Preparing pending output resource '" + partialPath + "'", - null); - - // Disallow null or empty names. - if (partialPath == null || partialPath.trim().equals("")) { - logger.log(TreeLogger.ERROR, "The resource name must be a non-empty string", null); - throw new UnableToCompleteException(); - } - - // Disallow absolute paths. - if (new File(partialPath).isAbsolute()) { - logger - .log( - TreeLogger.ERROR, - "Resource paths are intended to be relative to the compiled output directory and cannot be absolute", - null); - throw new UnableToCompleteException(); - } - - // Disallow backslashes (to promote consistency in calling code). - if (partialPath.indexOf('\\') >= 0) { - logger.log(TreeLogger.ERROR, - "Resource paths must contain forward slashes (not backslashes) to denote subdirectories", - null); - throw new UnableToCompleteException(); - } - - // Check for public path collision. - if (module.findPublicFile(partialPath) != null) { - logger.log(TreeLogger.WARN, "Cannot create resource '" + partialPath - + "' because it already exists on the public path", null); - return null; - } - - // See if the file is already committed. - SortedSet<GeneratedResource> resources = allGeneratedArtifacts.find(GeneratedResource.class); - for (GeneratedResource resource : resources) { - if (partialPath.equals(resource.getPartialPath())) { - return null; - } - } - - // See if the file is pending. - if (pendingResources.containsKey(partialPath)) { - // It is already pending. - logger.log(TreeLogger.WARN, "The file '" + partialPath + "' is already a pending resource", - null); - return null; - } - PendingResource pendingResource = new PendingResource(partialPath); - pendingResources.put(partialPath, pendingResource); - return pendingResource; - } - - private void abortUncommittedResources(TreeLogger logger) { - if (pendingResources.isEmpty()) { - // Nothing to do. - return; - } - - // Warn the user about uncommitted resources. - logger = - logger - .branch( - TreeLogger.WARN, - "The following resources will not be created because they were never committed (did you forget to call commit()?)", - null); - - for (Entry<String, PendingResource> entry : pendingResources.entrySet()) { - logger.log(TreeLogger.WARN, entry.getKey()); - entry.getValue().abort(); - } - pendingResources.clear(); - } -} |