/*******************************************************************************
* Copyright (c) 2012-2014 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package com.codenvy.cli.command.builtin;
import jline.console.ConsoleReader;
import com.codenvy.cli.command.builtin.model.UserProjectReference;
import com.codenvy.cli.command.builtin.util.metadata.CodenvyMetadata;
import com.codenvy.cli.command.builtin.util.zip.ZipUtils;
import com.codenvy.client.Response;
import com.codenvy.client.model.ProjectReference;
import org.fusesource.jansi.Ansi;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import static com.codenvy.cli.command.builtin.Constants.CODENVY_FOLDERNAME;
import static org.fusesource.jansi.Ansi.Color.RED;
/**
* @author Florent Benoit
*/
public abstract class AbsPushPullCommand extends AbsCommand {
protected void pull(UserProjectReference project, File dest) throws IOException {
ProjectReference projectToPull = project.getInnerReference();
Response<ZipInputStream> response = project.getCodenvy().project().exportResources(projectToPull, null).response();
long length = 0;
Map<String, List<Object>> headers = response.getHeaders();
if (headers != null) {
List<Object> contentLength = headers.get("Content-Length");
if (contentLength != null && contentLength.size() == 1) {
length = Long.parseLong(contentLength.get(0).toString());
}
}
String outLength = "";
if (length > 0) {
String fullLength = "";
if (length < 1024) {
fullLength = String.valueOf(length);
} else if (length > 1024) {
fullLength = String.valueOf(length / 1024).concat(" KB");
} else if (length > 1048576) {
fullLength = String.valueOf(length / 1048576).concat(" MB");
}
outLength = " / ".concat(fullLength);
}
try (ZipInputStream zipInputStream = response.getValue()) {
byte[] buf = new byte[1024];
ZipEntry zipEntry = zipInputStream.getNextEntry();
int total = 0;
while (zipEntry != null) {
File entryFile = new File(dest, zipEntry.getName());
// Create directory
if (zipEntry.isDirectory()) {
// create parent directories (with mkdirs)
if (!entryFile.exists() && !entryFile.mkdirs()) {
throw new IllegalStateException("Can not create directory " + entryFile + ", Check the write access.");
}
zipEntry = zipInputStream.getNextEntry();
continue;
}
// If it's a file, we must extract the file
// Ensure that the directory exists.
if (!entryFile.getParentFile().exists() && !entryFile.getParentFile().mkdirs()) {
throw new IllegalStateException("Unable to create directory" + entryFile.getParentFile());
}
int n;
try (FileOutputStream fileoutputstream = new FileOutputStream(entryFile)) {
while ((n = zipInputStream.read(buf, 0, 1024)) > -1) {
fileoutputstream.write(buf, 0, n);
}
}
// get Compressed size (as this is what is downloaded)
total += zipEntry.getCompressedSize();
//
String prettyTotal = "";
if (total < 1024) {
prettyTotal = String.valueOf(total);
} else if (total > 1024) {
prettyTotal = String.valueOf(total / 1024).concat(" KB");
} else if (total > 1048576) {
prettyTotal = String.valueOf(total / 1048576).concat(" MB");
}
new ConsoleReader().resetPromptLine("Pulling...", prettyTotal.concat(outLength), 0);
zipInputStream.closeEntry();
zipEntry = zipInputStream.getNextEntry();
}
}
System.out.println("done ! ");
}
protected void override(UserProjectReference project, File dest) throws IOException {
ProjectReference projectToPull = project.getInnerReference();
// Now compare resources (if overriding)
List<File> list = new ArrayList<>();
ZipUtils.getAllFiles(dest, list);
int size = list.size();
int count = 0;
for (File f : list) {
count++;
String progress = String.valueOf((100 * count) / size).concat(" %");
new ConsoleReader().resetPromptLine("Pruning local files...", progress, 0);
if (f.isDirectory()) {
continue;
}
// Compute local path
int i = f.getAbsolutePath().indexOf(project.name());
String localPath = f.getAbsolutePath().substring(i + project.name().length() + 1);
if (localPath.startsWith(Constants.CODENVY_FOLDERNAME)) {
continue;
}
// check file exists on the remote side
if (!project.getCodenvy().project().hasFile(projectToPull, localPath).execute().booleanValue()) {
if (!f.delete()) {
System.out.println("Unable to remove local file " + f);
}
}
}
if (!list.isEmpty()) {
System.out.println("done ! ");
}
}
protected String getProjectFromDirectory(File directory) {
// directory doesn't exists
if (!directory.exists()) {
Ansi buffer = Ansi.ansi();
buffer.fg(RED);
buffer.a("The specified path '").a(directory.getAbsolutePath()).a("' doesn't exists.");
buffer.reset();
System.out.println(buffer.toString());
return null;
}
// path is not a directory
if (!directory.isDirectory()) {
Ansi buffer = Ansi.ansi();
buffer.fg(RED);
buffer.a("The specified path '").a(directory.getAbsolutePath()).a("' is not a directory.");
buffer.reset();
System.out.println(buffer.toString());
return null;
}
// codenvy folder
File codenvyFolder = new File(directory, CODENVY_FOLDERNAME);
if (!codenvyFolder.exists() || !codenvyFolder.isDirectory()) {
Ansi buffer = Ansi.ansi();
buffer.fg(RED);
buffer.a("The specified directory '").a(directory.getAbsolutePath()).a("' is not a codenvy project directory (created with clone-local command).");
buffer.reset();
System.out.println(buffer.toString());
return null;
}
try {
CodenvyMetadata codenvyMetadata = new CodenvyMetadata(directory);
return codenvyMetadata.getProjectId();
} catch (Exception e) {
Ansi buffer = Ansi.ansi();
buffer.fg(RED);
buffer.a("The specified directory '").a(directory.getAbsolutePath()).a(
"' has not been pulled by the CLI. Unable to manage it.");
buffer.reset();
System.out.println(buffer.toString());
}
return null;
}
}