package restx.shell;
import org.apache.ivy.Ivy;
import org.apache.ivy.plugins.repository.TransferEvent;
import org.apache.ivy.plugins.repository.TransferListener;
import org.apache.ivy.util.DefaultMessageLogger;
import org.apache.ivy.util.Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.text.ParseException;
/**
* User: xavierhanin
* Date: 7/28/13
* Time: 9:24 PM
*/
public class ShellIvy {
private static final Logger logger = LoggerFactory.getLogger(ShellIvy.class);
public static Ivy loadIvy(final RestxShell shell) {
Ivy ivy = new Ivy();
File settingsFile = shell.installLocation().resolve("ivysettings.xml").toFile();
try {
if (settingsFile.exists()) {
logger.info("loading ivy settings from " + settingsFile.getAbsolutePath());
ivy.configure(settingsFile);
} else {
URL settingsURL = ShellIvy.class.getResource("ivysettings.xml");
logger.info("loading ivy settings from " + settingsURL);
ivy.configure(settingsURL);
}
ivy.getEventManager().addTransferListener(new TransferListener() {
public void transferProgress(TransferEvent evt) {
switch (evt.getEventType()) {
case TransferEvent.TRANSFER_STARTED:
try {
shell.println("downloading " + evt.getResource().getName());
} catch (IOException e) {
throw new RuntimeException(e);
}
break;
case TransferEvent.TRANSFER_PROGRESS:
try {
shell.updateProgress(evt.getResource().getName(), evt.getLength(), evt.getTotalLength());
} catch (IOException e) {
throw new RuntimeException(e);
}
break;
case TransferEvent.TRANSFER_COMPLETED:
try {
shell.updateProgress(evt.getResource().getName(), evt.getTotalLength(), evt.getTotalLength());
shell.endProgress(evt.getName());
} catch (IOException e) {
throw new RuntimeException(e);
}
break;
default:
break;
}
}
});
ivy.getLoggerEngine().pushLogger(new DefaultMessageLogger(Message.MSG_DEBUG) {
@Override
public void log(String msg, int level) {
try {
if (level <= Message.MSG_ERR) {
logger.error(msg);
shell.printIn(msg, RestxShell.AnsiCodes.ANSI_RED);
shell.println("");
} else if (level <= Message.MSG_WARN) {
logger.warn(msg);
shell.printIn(msg, RestxShell.AnsiCodes.ANSI_YELLOW);
shell.println("");
} else if (level <= Message.MSG_INFO) {
logger.info(msg);
shell.println(msg);
} else {
logger.debug(msg);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public void doProgress() {
// DO NOTHING, progress is reported thanks to TransferEvent handling
}
@Override
public void doEndProgress(String msg) {
// DO NOTHING, progress is reported thanks to TransferEvent handling
}
});
return ivy;
} catch (ParseException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}