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 General
007: * Public License Version 2 only ("GPL") or the Common Development and Distribution
008: * License("CDDL") (collectively, the "License"). You may not use this file except in
009: * compliance with the License. You can obtain a copy of the License at
010: * http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
011: * License for the specific language governing permissions and limitations under the
012: * License. When distributing the software, include this License Header Notice in
013: * each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP. Sun
014: * designates this particular file as subject to the "Classpath" exception as
015: * provided by Sun in the GPL Version 2 section of the License file that
016: * accompanied this code. If applicable, add the following below the License Header,
017: * with the fields enclosed by brackets [] replaced by your own identifying
018: * information: "Portions Copyrighted [year] [name of copyright owner]"
019: *
020: * Contributor(s):
021: *
022: * The Original Software is NetBeans. The Initial Developer of the Original Software
023: * is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
024: * Rights Reserved.
025: *
026: * If you wish your version of this file to be governed by only the CDDL or only the
027: * GPL Version 2, indicate your decision by adding "[Contributor] elects to include
028: * this software in this distribution under the [CDDL or GPL Version 2] license." If
029: * you do not indicate a single choice of license, a recipient has the option to
030: * distribute your version of this file under either the CDDL, the GPL Version 2 or
031: * to extend the choice of license to its licensees as provided above. However, if
032: * you add GPL Version 2 code and therefore, elected the GPL Version 2 license, then
033: * the option applies only if the new code is made subject to such option by the
034: * copyright holder.
035: */
036:
037: package org.netbeans.installer.downloader.queue;
038:
039: import static org.netbeans.installer.downloader.DownloadConfig.DISPATCHER_POOL;
040: import static org.netbeans.installer.downloader.DownloadConfig.DISPATCHER_QUANTUM;
041: import org.netbeans.installer.downloader.DownloadManager;
042: import org.netbeans.installer.downloader.Pumping;
043: import static org.netbeans.installer.downloader.Pumping.State;
044: import org.netbeans.installer.downloader.dispatcher.ProcessDispatcher;
045: import org.netbeans.installer.downloader.impl.Pump;
046: import org.netbeans.installer.downloader.dispatcher.impl.RoundRobinDispatcher;
047: import org.netbeans.installer.downloader.impl.PumpingImpl;
048:
049: import java.io.File;
050: import java.net.URL;
051: import java.util.LinkedHashMap;
052: import java.util.Map;
053:
054: /**
055: *
056: * @author Danila_Dugurov
057: */
058: public class DispatchedQueue extends QueueBase {
059:
060: /////////////////////////////////////////////////////////////////////////////////
061: // Instance
062: private final ProcessDispatcher dispatcher = new RoundRobinDispatcher(
063: DISPATCHER_QUANTUM, DISPATCHER_POOL);
064:
065: private final Map<String, Pump> pId2p = new LinkedHashMap<String, Pump>();
066:
067: public DispatchedQueue(File stateFile) {
068: super (stateFile);
069: }
070:
071: public synchronized void reset() {
072: final boolean wasActive = dispatcher.isActive();
073: terminate();
074: for (String id : id2Pumping.keySet().toArray(new String[0])) {
075: delete(id);
076: }
077: fire("queueReset");
078: if (wasActive)
079: invoke();
080: }
081:
082: public synchronized Pumping add(URL url) {
083: return add(url, DownloadManager.instance.defaultFolder());
084: }
085:
086: public synchronized Pumping add(URL url, File folder) {
087: final PumpingImpl newOne = new PumpingImpl(url, folder, this );
088: final String id = newOne.getId();
089: id2Pumping.put(id, newOne);
090: if (dispatcher.isActive()) {
091: final Pump pump = new Pump(newOne);
092: pId2p.put(id, pump);
093: dispatcher.schedule(pump);
094: }
095: fire("pumpingAdd", id);
096: return newOne;
097: }
098:
099: public synchronized Pumping delete(String id) {
100: final PumpingImpl oldOne = id2Pumping.remove(id);
101: if (oldOne == null)
102: return null;
103: dispatcher.terminate(pId2p.get(id));
104: fire("pumpingDelete", id);
105: pId2p.remove(id);
106: if (oldOne.state() != State.FINISHED)
107: oldOne.reset();
108: return oldOne;
109: }
110:
111: public synchronized void delete(URL url) {
112: for (Pumping pumping : toArray()) {
113: if (pumping.declaredURL() == url) {
114: delete(pumping.getId());
115: }
116: }
117: }
118:
119: public synchronized void invoke() {
120: if (dispatcher.isActive())
121: return;
122: fire("pumpsInvoke");
123: for (Pumping pumping : toArray()) {
124: if (pumping.state() != State.FINISHED) {
125: final Pump newOne = new Pump(pumping);
126: pId2p.put(pumping.getId(), newOne);
127: dispatcher.schedule(newOne);
128: }
129: }
130: dispatcher.start();
131: }
132:
133: public synchronized void terminate() {
134: if (!dispatcher.isActive())
135: return;
136: dispatcher.stop();
137: dump();
138: fire("pumpsTerminate");
139: }
140:
141: public synchronized boolean isActive() {
142: return dispatcher.isActive();
143: }
144: }
|