001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.geronimo.system.plugin;
018
019 import java.io.Serializable;
020 import java.util.List;
021 import java.util.ArrayList;
022 import java.util.Collections;
023
024 import org.apache.geronimo.kernel.repository.Artifact;
025 import org.apache.geronimo.kernel.repository.MissingDependencyException;
026
027 /**
028 * Provides the results of a configuration download operation. This is updated
029 * along the way for callers who want to monitor the ongoing progress.
030 *
031 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
032 */
033 public class DownloadResults implements Serializable, DownloadPoller {
034 private List<Artifact> removedConfigIDs = new ArrayList<Artifact>();
035 private List<Artifact> restartedConfigIDs = new ArrayList<Artifact>();
036 private List<Artifact> installedConfigIDs = new ArrayList<Artifact>();
037 private List<Artifact> dependenciesPresent = new ArrayList<Artifact>();
038 private List<Artifact> dependenciesInstalled = new ArrayList<Artifact>();
039 private List<MissingDependencyException> skippedPlugins = new ArrayList<MissingDependencyException>();
040 private String currentFile;
041 private String currentMessage;
042 private int currentFileProgress = -1;
043 private Exception failure;
044 private boolean finished;
045 private long totalDownloadBytes = 0;
046
047 public synchronized DownloadResults duplicate() {
048 DownloadResults other = new DownloadResults();
049 other.removedConfigIDs.addAll(removedConfigIDs);
050 other.restartedConfigIDs.addAll(restartedConfigIDs);
051 other.installedConfigIDs.addAll(installedConfigIDs);
052 other.dependenciesPresent.addAll(dependenciesPresent);
053 other.dependenciesInstalled.addAll(dependenciesInstalled);
054 other.skippedPlugins.addAll(skippedPlugins);
055 other.currentFile = currentFile;
056 other.currentMessage = currentMessage;
057 other.currentFileProgress = currentFileProgress;
058 other.failure = failure;
059 other.finished = finished;
060 other.totalDownloadBytes = totalDownloadBytes;
061 return other;
062 }
063
064 public synchronized void addInstalledConfigID(Artifact dep) {
065 installedConfigIDs.add(dep);
066 }
067
068 public synchronized void addRemovedConfigID(Artifact obsolete) {
069 removedConfigIDs.add(obsolete);
070 }
071
072 public synchronized void addRestartedConfigID(Artifact target) {
073 restartedConfigIDs.add(target);
074 }
075
076 public void addSkippedConfigID(MissingDependencyException e) {
077 skippedPlugins.add(e);
078 }
079
080 public synchronized void addDependencyPresent(Artifact dep) {
081 dependenciesPresent.add(dep);
082 }
083
084 public synchronized void addDependencyInstalled(Artifact dep) {
085 dependenciesInstalled.add(dep);
086 }
087
088 public synchronized void setCurrentFile(String currentFile) {
089 this.currentFile = currentFile;
090 }
091
092 public synchronized void setCurrentMessage(String currentMessage) {
093 this.currentMessage = currentMessage;
094 }
095
096 public synchronized void setCurrentFilePercent(int currentFileProgress) {
097 this.currentFileProgress = currentFileProgress;
098 }
099
100 public synchronized void setFailure(Exception failure) {
101 this.failure = failure;
102 }
103
104 public synchronized void setFinished() {
105 finished = true;
106 }
107
108 public synchronized void addDownloadBytes(long bytes) {
109 totalDownloadBytes += bytes;
110 }
111
112 public boolean isFinished() {
113 return finished;
114 }
115
116 public boolean isFailed() {
117 return failure != null;
118 }
119
120 /**
121 * The total number of bytes in the archives downloaded from remote
122 * repositories.
123 */
124 public long getTotalDownloadBytes() {
125 return totalDownloadBytes;
126 }
127
128 /**
129 * If the operation failed, the Exception that caused the failure.
130 */
131 public Exception getFailure() {
132 return failure;
133 }
134
135 /**
136 * Gets the list of the originally requested Config IDs that were
137 * successfully installed. Ordinarily this is not necessary, but
138 * it may be important in case of failure midway through, or if the
139 * request passed previously downloaded configurations on the command
140 * line and the caller doesn't know what the Config IDs are.
141 */
142 public List<Artifact> getInstalledConfigIDs() {
143 return Collections.unmodifiableList(installedConfigIDs);
144 }
145
146 public List<Artifact> getRemovedConfigIDs() {
147 return Collections.unmodifiableList(removedConfigIDs);
148 }
149
150 public List<Artifact> getRestartedConfigIDs() {
151 return Collections.unmodifiableList(restartedConfigIDs);
152 }
153
154 public List<MissingDependencyException> getSkippedPlugins() {
155 return Collections.unmodifiableList(skippedPlugins);
156 }
157
158 /**
159 * Gets the dependencies that we've needed but they're already present in
160 * the local server so no installation was necessary.
161 */
162 public List<Artifact> getDependenciesPresent() {
163 return Collections.unmodifiableList(dependenciesPresent);
164 }
165
166 /**
167 * Gets the dependencies that we've successfully downloaded and installed
168 * into the local server environment.
169 */
170 public List<Artifact> getDependenciesInstalled() {
171 return Collections.unmodifiableList(dependenciesInstalled);
172 }
173
174 /**
175 * Gets the name of the file that is currently being operated on.
176 */
177 public String getCurrentFile() {
178 return currentFile;
179 }
180
181 /**
182 * Gets a description of the work currently being done.
183 */
184 public String getCurrentMessage() {
185 return currentMessage;
186 }
187
188 /**
189 * Gets the progress on the current file expressed as a percentage. This
190 * value may be -1 in which case the progress cannot be calculated (e.g. a
191 * download where the server doesn't supply the file size up front).
192 */
193 public int getCurrentFilePercent() {
194 return currentFileProgress;
195 }
196 }