001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package org.netbeans.modules.tasklist.impl;
043:
044: import java.util.ArrayList;
045: import java.util.List;
046: import java.util.WeakHashMap;
047: import java.util.concurrent.locks.ReadWriteLock;
048: import java.util.concurrent.locks.ReentrantReadWriteLock;
049: import org.netbeans.spi.tasklist.FileTaskScanner;
050: import org.netbeans.spi.tasklist.Task;
051: import org.openide.filesystems.FileObject;
052:
053: /**
054: *
055: * @author S. Aubrecht
056: */
057: class TaskCache {
058:
059: //TODO use URLs instead of FileObjects
060: private WeakHashMap<FileObject, ScanResult> cache = new WeakHashMap<FileObject, ScanResult>();
061:
062: private final ReadWriteLock lock = new ReentrantReadWriteLock();
063:
064: /** Creates a new instance of TaskCache */
065: TaskCache() {
066: }
067:
068: public boolean isUpToDate(FileObject resource,
069: FileTaskScanner scanner) {
070: boolean retValue = false;
071: lock.readLock().lock();
072: ScanResult scanRes = cache.get(resource);
073: if (null != scanRes) {
074: retValue = scanRes.isUpToDate(resource, scanner);
075: }
076: lock.readLock().unlock();
077: return retValue;
078: }
079:
080: /**
081: * The given file was just scanned for tasks of the given type.
082: *
083: * @param tasks Tasks found in the file, may be null.
084: */
085: public void scanned(FileObject resource, FileTaskScanner scanner,
086: List<? extends Task> tasks) {
087: lock.writeLock().lock();
088:
089: ScanResult scanRes = cache.get(resource);
090: if (null == scanRes) {
091: scanRes = new ScanResult();
092: cache.put(resource, scanRes);
093: }
094: scanRes.put(scanner, tasks);
095:
096: lock.writeLock().unlock();
097: }
098:
099: public void getTasks(FileObject resource, FileTaskScanner scanner,
100: List<Task> tasks) {
101: lock.readLock().lock();
102: ScanResult scanRes = cache.get(resource);
103: if (null != scanRes) {
104: scanRes.get(scanner, tasks);
105: }
106: lock.readLock().unlock();
107: }
108:
109: /**
110: * All files must be rescanned for the given task type
111: */
112: public void clear(FileTaskScanner scanner) {
113: lock.writeLock().lock();
114:
115: ArrayList<FileObject> toRemove = null;
116: for (FileObject rc : cache.keySet()) {
117: ScanResult scanRes = cache.get(rc);
118: scanRes.remove(scanner);
119: if (scanRes.isEmpty()) {
120: if (null == toRemove) {
121: toRemove = new ArrayList<FileObject>();
122: }
123: toRemove.add(rc);
124: }
125: }
126: if (null != toRemove) {
127: for (FileObject rc : toRemove) {
128: cache.remove(rc);
129: }
130: }
131: lock.writeLock().unlock();
132: }
133:
134: public void clear(FileTaskScanner scanner, FileObject[] resources) {
135: lock.writeLock().lock();
136:
137: for (FileObject rc : resources) {
138: ScanResult scanRes = cache.get(rc);
139: if (null != scanRes) {
140: scanRes.remove(scanner);
141: if (scanRes.isEmpty()) {
142: cache.remove(rc);
143: }
144: }
145: }
146: lock.writeLock().unlock();
147: }
148:
149: public void clear(FileObject resource) {
150: lock.writeLock().lock();
151: ScanResult scanRes = cache.get(resource);
152: if (null != scanRes) {
153: cache.remove(resource);
154: }
155: lock.writeLock().unlock();
156: }
157: }
|