package com.demandware.studio.webdav.clean;
import com.demandware.studio.settings.DWSettingsProvider;
import com.demandware.studio.toolWindow.DWConsoleService;
import com.demandware.studio.webdav.DWServerConnection;
import com.intellij.execution.ui.ConsoleView;
import com.intellij.execution.ui.ConsoleViewContentType;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleServiceManager;
import com.intellij.openapi.progress.PerformInBackgroundOption;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.io.ZipUtil;
import org.apache.http.Consts;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.entity.FileEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.zip.ZipOutputStream;
public class DWCleanTask extends Task.Backgroundable {
private final Module module;
private final Project project;
private final SimpleDateFormat timeFormat = new SimpleDateFormat("hh:mm:ss");
public DWCleanTask(Project project, Module module, String title, boolean canBeCancelled, PerformInBackgroundOption backgroundOption) {
super(project, title, canBeCancelled, backgroundOption);
this.module = module;
this.project = project;
}
@Override
public void run(@NotNull ProgressIndicator indicator) {
VirtualFile sourceRoots[] = ModuleRootManager.getInstance(module).getSourceRoots();
if (sourceRoots.length < 1) {
return;
}
ConsoleView consoleView = ServiceManager.getService(project, DWConsoleService.class).getConsoleView();
DWSettingsProvider settingsProvider = ModuleServiceManager.getService(module, DWSettingsProvider.class);
DWServerConnection serverConnection = ModuleServiceManager.getService(module, DWServerConnection.class);
String version = settingsProvider.getVersion();
File tempDir = Paths.get(FileUtil.getTempDirectory(), module.getName()).toFile();
File versionDir = Paths.get(tempDir.toString(), version).toFile();
File zipFile = Paths.get(tempDir.toString(), version + ".zip").toFile();
FileUtil.createDirectory(versionDir);
indicator.setText("Preparing Archive");
try {
FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream);
for (VirtualFile sourceRoot : sourceRoots) {
File dir = new File(sourceRoot.getPath());
FileUtil.copyDir(dir, Paths.get(versionDir.toString(), dir.getName()).toFile());
}
ZipUtil.addDirToZipRecursively(zipOutputStream, null, versionDir, version, null, null);
zipOutputStream.close();
indicator.setFraction(.166);
} catch (IOException e) {
e.printStackTrace();
}
CloseableHttpClient client = serverConnection.getClient();
HttpClientContext context = serverConnection.getContext();
HttpUriRequest uploadRequest = RequestBuilder.put()
.setUri(serverConnection.getBaseServerPath() + ".zip")
.setEntity(new FileEntity(zipFile))
.build();
HttpUriRequest deleteVersionRequest = RequestBuilder.delete().setUri(serverConnection.getBaseServerPath()).build();
List<BasicNameValuePair> data = new ArrayList<>();
data.add(new BasicNameValuePair("method", "UNZIP"));
HttpUriRequest unzipRequest = RequestBuilder.post()
.setUri(serverConnection.getBaseServerPath() + ".zip")
.setEntity(new UrlEncodedFormEntity(data, Consts.UTF_8))
.build();
HttpUriRequest deleteZipRequest = RequestBuilder.delete().setUri(serverConnection.getBaseServerPath() + ".zip").build();
indicator.setText("Uploading archive...");
try (CloseableHttpResponse response = client.execute(uploadRequest, context)) {
indicator.setFraction(.332);
} catch (IOException e) {
e.printStackTrace();
}
indicator.setText("Removing previous version...");
try (CloseableHttpResponse response = client.execute(deleteVersionRequest, context)){
indicator.setFraction(.498);
} catch (IOException e) {
e.printStackTrace();
}
indicator.setText("Unzipping archive...");
try (CloseableHttpResponse response = client.execute(unzipRequest, context)) {
indicator.setFraction(.664);
} catch (IOException e) {
e.printStackTrace();
}
indicator.setText("Removing temporary files...");
try (CloseableHttpResponse response = client.execute(deleteZipRequest, context)) {
indicator.setFraction(.83);
} catch (IOException e) {
e.printStackTrace();
}
consoleView.print("[" + timeFormat.format(new Date()) + "] " + "Cleaned " + serverConnection.getBaseServerPath() + "\n", ConsoleViewContentType.NORMAL_OUTPUT);
FileUtil.delete(tempDir);
indicator.setFraction(1);
}
}