blob: 5e07d2eea7d01dd259e0bbd80fcb4e190bcea4b8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
package org.apache.karaf.features.internal.download.impl;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.nio.file.Files;
import java.util.concurrent.ScheduledExecutorService;
import org.apache.karaf.util.StreamUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SimpleDownloadTask extends AbstractRetryableDownloadTask {
private static final String BLUEPRINT_PREFIX = "blueprint:";
private static final String SPRING_PREFIX = "spring:";
/**
* Logger.
*/
private static final Logger LOG = LoggerFactory.getLogger(AbstractDownloadTask.class);
private File basePath;
public SimpleDownloadTask(ScheduledExecutorService executorService, String url, File basePath) {
super(executorService, url);
this.basePath = basePath;
}
@Override
protected File download(Exception previousExceptionNotUsed) throws Exception {
LOG.trace("Downloading [" + url + "]");
if (url.startsWith(BLUEPRINT_PREFIX) || url.startsWith(SPRING_PREFIX)) {
return downloadBlueprintOrSpring();
}
try {
basePath.mkdirs();
if (!basePath.isDirectory()) {
throw new IOException("Unable to create directory " + basePath.toString());
}
URL urlObj = new URL(url);
File file = new File(basePath, getFileName(urlObj));
if (file.exists()) {
return file;
}
File dir = new File(System.getProperty("karaf.data"), "tmp");
dir.mkdirs();
if (!dir.isDirectory()) {
throw new IOException("Unable to create directory " + dir.toString());
}
File tmpFile = Files.createTempFile(dir.toPath(), "download-", null).toFile();
urlObj = new URL(DownloadManagerHelper.stripStartLevel(urlObj.toString()));
try (InputStream is = urlObj.openStream();
OutputStream os = new FileOutputStream(tmpFile)) {
StreamUtils.copy(is, os);
}
if (file.exists() && !file.delete()) {
throw new IOException("Unable to delete file: " + file.toString());
}
// check: this will move the file to CHILD_HOME root directory...
if (!tmpFile.renameTo(file)) {
throw new IOException("Unable to rename file " + tmpFile.toString() + " to " + file.toString());
}
return file;
} catch (Exception ignore) {
throw new IOException("Could not download [" + this.url + "]", ignore);
}
}
// we only want the filename itself, not the whole path
private String getFileName(URL urlObj) {
String url = urlObj.getFile();
// ENTESB-1394: we do not want all these decorators from wrap: protocol
// or any inlined maven repos
url = DownloadManagerHelper.stripUrl(url);
url = DownloadManagerHelper.removeInlinedMavenRepositoryUrl(url);
int unixPos = url.lastIndexOf('/');
int windowsPos = url.lastIndexOf('\\');
url = url.substring(Math.max(unixPos, windowsPos) + 1);
url = Integer.toHexString(urlObj.toString().hashCode()) + "-" + url;
return url;
}
protected File downloadBlueprintOrSpring() throws Exception {
// when downloading an embedded blueprint or spring xml file, then it must be as a temporary file
File dir = new File(System.getProperty("karaf.data"), "tmp");
dir.mkdirs();
File tmpFile = Files.createTempFile(dir.toPath(), "download-", null).toFile();
try (InputStream is = new URL(url).openStream();
OutputStream os = new FileOutputStream(tmpFile))
{
StreamUtils.copy(is, os);
}
return tmpFile;
}
@Override
protected Retry isRetryable(IOException e) {
// TODO: check http errors, etc.
return super.isRetryable(e);
}
}