/*
* (C) Copyright 2006-2014 Nuxeo SA (http://nuxeo.com/) and others.
*
* 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.
*
* Contributors:
* Nuxeo - initial API and implementation
*
*/
package org.nuxeo.connect.client.we;
import java.util.Arrays;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuxeo.connect.connector.ConnectServerError;
import org.nuxeo.connect.data.DownloadablePackage;
import org.nuxeo.connect.data.DownloadingPackage;
import org.nuxeo.connect.downloads.ConnectDownloadManager;
import org.nuxeo.connect.packages.PackageManager;
import org.nuxeo.connect.update.PackageState;
import org.nuxeo.ecm.webengine.model.WebObject;
import org.nuxeo.ecm.webengine.model.impl.DefaultObject;
import org.nuxeo.runtime.api.Framework;
/**
* Provides REST binding for {@link org.nuxeo.connect.update.Package} download management.
*
* @author <a href="mailto:td@nuxeo.com">Thierry Delprat</a>
*/
@WebObject(type = "downloadHandler")
public class DownloadHandler extends DefaultObject {
protected static final Log log = LogFactory.getLog(DownloadHandler.class);
@GET
@Produces("text/plain")
@Path(value = "progress/{pkgId}")
public String getDownloadProgress(@PathParam("pkgId") String pkgId) {
DownloadingPackage pkg = getDownloadingPackage(pkgId);
if (pkg == null) {
return null;
}
return pkg.getDownloadProgress() + "";
}
@GET
@Produces("application/json")
@Path(value = "progressAsJSON")
public String getDownloadsProgress() {
ConnectDownloadManager cdm = Framework.getLocalService(ConnectDownloadManager.class);
List<DownloadingPackage> pkgs = cdm.listDownloadingPackages();
StringBuffer sb = new StringBuffer();
sb.append("[");
for (int i = 0; i < pkgs.size(); i++) {
if (i > 0) {
sb.append(",");
}
sb.append("{ \"pkgid\" : ");
sb.append("\"" + pkgs.get(i).getId() + "\",");
sb.append(" \"progress\" : ");
sb.append(pkgs.get(i).getDownloadProgress() + "}");
}
sb.append("]");
return sb.toString();
}
@GET
@Produces("text/html")
@Path(value = "progressPage/{pkgId}")
public Object getDownloadProgressPage(@PathParam("pkgId") String pkgId, @QueryParam("source") String source,
@QueryParam("install") Boolean install, @QueryParam("depCheck") Boolean depCheck,
@QueryParam("type") String pkgType, @QueryParam("onlyRemote") Boolean onlyRemote,
@QueryParam("filterOnPlatform") Boolean filterOnPlatform) {
DownloadablePackage pkg = getDownloadingPackage(pkgId);
boolean downloadOver = false;
// flag to start install after download
if (install == null) {
install = false;
}
if (depCheck == null) {
depCheck = true;
}
if (pkg == null) {
PackageManager pm = Framework.getLocalService(PackageManager.class);
pkg = pm.getPackage(pkgId);
if (pkg.getPackageState() != PackageState.DOWNLOADING) {
downloadOver = true;
}
}
return getView("downloadStarted").arg("pkg", pkg).arg("source", source).arg("over", downloadOver).arg(
"install", install).arg("depCheck", depCheck).arg("filterOnPlatform", filterOnPlatform.toString()).arg(
"type", pkgType.toString()).arg("onlyRemote", onlyRemote.toString());
}
protected DownloadingPackage getDownloadingPackage(String pkgId) {
ConnectDownloadManager cdm = Framework.getLocalService(ConnectDownloadManager.class);
List<DownloadingPackage> pkgs = cdm.listDownloadingPackages();
for (DownloadingPackage pkg : pkgs) {
if (pkg.getId().equals(pkgId)) {
return pkg;
}
}
return null;
}
@GET
@Produces("text/html")
@Path(value = "start/{pkgId}")
public Object startDownload(@PathParam("pkgId") String pkgId, @QueryParam("source") String source,
@QueryParam("install") Boolean install, @QueryParam("depCheck") Boolean depCheck,
@QueryParam("type") String pkgType, @QueryParam("onlyRemote") Boolean onlyRemote,
@QueryParam("filterOnPlatform") Boolean filterOnPlatform) {
PackageManager pm = Framework.getLocalService(PackageManager.class);
// flag to start install after download
if (install == null) {
install = false;
}
if (depCheck == null) {
depCheck = true;
}
if (!RequestHelper.isInternalLink(getContext())) {
DownloadablePackage pkg = pm.getPackage(pkgId);
return getView("confirmDownload").arg("pkg", pkg).arg("source", source);
}
try {
pm.download(pkgId);
} catch (ConnectServerError e) {
return getView("downloadError").arg("e", e);
}
return getView("downloadStarted").arg("pkg", getDownloadingPackage(pkgId)).arg("source", source).arg("over",
false).arg("install", install).arg("depCheck", depCheck).arg("filterOnPlatform",
filterOnPlatform.toString()).arg("type", pkgType.toString()).arg("onlyRemote", onlyRemote.toString());
}
@GET
@Produces("application/json")
@Path(value = "startDownloads")
public String startDownloads(@QueryParam("pkgList") String pkgList) {
if (RequestHelper.isInternalLink(getContext())) {
if (pkgList != null) {
String[] pkgs = pkgList.split("/");
PackageManager pm = Framework.getLocalService(PackageManager.class);
try {
log.info("Starting download for packages " + Arrays.toString(pkgs));
pm.download(Arrays.asList(pkgs));
} catch (ConnectServerError e) {
log.error(e, e);
}
// here we generate a fake progress report so that if some
// download are very fast, they will still be visible on the
// client side
StringBuffer sb = new StringBuffer();
sb.append("[");
for (int i = 0; i < pkgs.length; i++) {
if (i > 0) {
sb.append(",");
}
sb.append("{ \"pkgid\" : ");
sb.append("\"" + pkgs[i] + "\",");
sb.append(" \"progress\" : 0}");
}
sb.append("]");
return sb.toString();
}
}
return "[]";
}
/**
* @since 5.6
*/
@GET
@Path(value = "cancel/{pkgId}")
public Object cancelDownload(@PathParam("pkgId") String pkgId, @QueryParam("source") String source) {
PackageManager pm = Framework.getLocalService(PackageManager.class);
pm.cancelDownload(pkgId);
return redirect(getPrevious().getPath() + "/packages/" + source);
}
}