| /* |
| * Copyright 2013 Dart project authors. |
| * |
| * Licensed under the Eclipse Public License v1.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.eclipse.org/legal/epl-v10.html |
| * |
| * 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.dart.engine.source; |
| |
| import com.google.dart.engine.context.AnalysisContext; |
| |
| import java.util.HashMap; |
| |
| /** |
| * Instances of class {@code ContentCache} hold content used to override the default content of a |
| * {@link Source}. |
| * |
| * @coverage dart.engine.source |
| */ |
| public class ContentCache { |
| /** |
| * A table mapping sources to the contents of those sources. This is used to override the default |
| * contents of a source. |
| */ |
| private HashMap<Source, String> contentMap = new HashMap<Source, String>(); |
| |
| /** |
| * A table mapping sources to the modification stamps of those sources. This is used when the |
| * default contents of a source has been overridden. |
| */ |
| private HashMap<Source, Long> stampMap = new HashMap<Source, Long>(); |
| |
| /** |
| * Initialize a newly created cache to be empty. |
| */ |
| public ContentCache() { |
| super(); |
| } |
| |
| /** |
| * Return the contents of the given source, or {@code null} if this cache does not override the |
| * contents of the source. |
| * <p> |
| * <b>Note:</b> This method is not intended to be used except by |
| * {@link AnalysisContext#getContents(Source, Source.ContentReceiver))}. |
| * |
| * @param source the source whose content is to be returned |
| * @return the contents of the given source |
| */ |
| public String getContents(Source source) { |
| return contentMap.get(source); |
| } |
| |
| /** |
| * Return the modification stamp of the given source, or {@code null} if this cache does not |
| * override the contents of the source. |
| * <p> |
| * <b>Note:</b> This method is not intended to be used except by |
| * {@link AnalysisContext#getModificationStamp(Source)}. |
| * |
| * @param source the source whose modification stamp is to be returned |
| * @return the modification stamp of the given source |
| */ |
| public Long getModificationStamp(Source source) { |
| return stampMap.get(source); |
| } |
| |
| /** |
| * Set the contents of the given source to the given contents. This has the effect of overriding |
| * the default contents of the source. If the contents are {@code null} the override is removed so |
| * that the default contents will be returned. |
| * |
| * @param source the source whose contents are being overridden |
| * @param contents the new contents of the source |
| * @return the original cached contents or {@code null} if none |
| */ |
| public String setContents(Source source, String contents) { |
| if (contents == null) { |
| stampMap.remove(source); |
| return contentMap.remove(source); |
| } else { |
| Long newStamp = Long.valueOf(System.currentTimeMillis()); |
| Long oldStamp = stampMap.put(source, newStamp); |
| // Occasionally, if this method is called in rapid succession, the timestamps are equal. |
| // Guard against this by artificially incrementing the new timestamp |
| if (newStamp.equals(oldStamp)) { |
| stampMap.put(source, newStamp + 1); |
| } |
| return contentMap.put(source, contents); |
| } |
| } |
| } |