package eu.jucy.gui.logviewer;
import helpers.GH;
import java.io.File;
import java.io.IOException;
import logger.LoggerFactory;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.handlers.HandlerUtil;
import eu.jucy.gui.ApplicationWorkbenchWindowAdvisor;
import eu.jucy.gui.Lang;
import eu.jucy.gui.itemhandler.DownloadableHandlers.RemoveDownloadableFromQueueHandler;
import uc.database.DBLogger;
import uc.database.IDatabase;
import uihelpers.SUIJob;
public abstract class LogViewerHandlers extends AbstractHandler {
private static final Logger logger = LoggerFactory.make(Level.DEBUG);
public Object execute(ExecutionEvent event) throws ExecutionException {
IStructuredSelection selection = (IStructuredSelection) HandlerUtil.getCurrentSelectionChecked(event);
if (!selection.isEmpty()) {
boolean update = run((DBLogger)selection.getFirstElement(),event);
IEditorPart part = HandlerUtil.getActiveEditor(event);
if (part instanceof LogViewerEditor && update) {
logger.debug("Running update");
((LogViewerEditor)part).update(true,false);
logger.debug("Running update done");
}
}
return null;
}
public abstract boolean run(DBLogger entity,ExecutionEvent event);
public static class DeleteDBLogger extends LogViewerHandlers {
public static final String COMMAND_ID = RemoveDownloadableFromQueueHandler.COMMAND_ID;
@Override
public boolean run(final DBLogger entity,ExecutionEvent event) {
logger.debug("Delete called");
final LogViewerEditor part =(LogViewerEditor)HandlerUtil.getActiveEditor(event);
part.setFilter(entity);
new Job(Lang.DeleteLog) {
@Override
protected IStatus run(IProgressMonitor monitor) {
logger.debug("running delete");
entity.deleteEntity(monitor);
logger.debug("deleted");
new SUIJob() {
@Override
public void run() {
logger.debug("update start");
part.removeFilter(entity);
part.update(true,true);
logger.debug("update done");
}
}.schedule();
return Status.OK_STATUS;
}
}.schedule();
return false;
}
}
public static class ExportLog extends LogViewerHandlers {
public static final String COMMAND_ID = "eu.jucy.gui.logviewer.exportlogs";
@Override
public boolean run(final DBLogger entity,ExecutionEvent event) {
FileDialog fd = new FileDialog(HandlerUtil.getActiveShell(event),SWT.SAVE);
fd.setText("Save");
fd.setFilterExtensions(new String[]{"*.txt","*.log"});
fd.setFileName(GH.replaceInvalidFilename(entity.getName())+".txt");
String file = fd.open();
if (file != null) {
final File f = new File(file);
Job job = new Job(f.getName()) {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
int count = entity.countLogEntrys();
monitor.beginTask(f.getName(), count);
if (f.createNewFile()) {
writeTo(f,entity,monitor);
}
} catch (final IOException ioe) {
new SUIJob() {
@Override
public void run() {
MessageDialog.openWarning(getWindow().getShell(),
"Warn", ioe.toString());
}
}.schedule();
}
monitor.done();
return Status.OK_STATUS;
}
};
job.setUser(true);
job.schedule();
}
return false;
}
}
public static class ExportAllLogs extends AbstractHandler {
public static final String COMMAND_ID = "eu.jucy.gui.logviewer.exportalllogs";
public Object execute(ExecutionEvent event) throws ExecutionException {
String name = "";
try {
name = event.getCommand().getName();
} catch (NotDefinedException e) {
throw new ExecutionException(e.toString(),e);
}
DirectoryDialog dd = new DirectoryDialog(HandlerUtil.getActiveShell(event));
dd.setMessage("Save where?");
String dir = dd.open();
if (dir != null) {
final File fdir = new File(dir);
if (!fdir.isDirectory() && !fdir.mkdirs()) {
logger.warn("Could not create Dir: "+fdir);
}
final IDatabase db = ApplicationWorkbenchWindowAdvisor.get().getDatabase();
Job job = new Job(name) {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
int count = db.countLogentrys(null);
monitor.beginTask("Save Logs", count);
for (DBLogger entity: db.getLogentitys()) {
File f = new File(fdir,GH.replaceInvalidFilename(entity.getName())+".txt");
if (f.createNewFile()) {
writeTo(f,entity,monitor);
}
if (monitor.isCanceled()) {
break;
}
}
} catch (final IOException ioe) {
new SUIJob() {
@Override
public void run() {
MessageDialog.openWarning(getWindow().getShell(),
"Warn", ioe.toString());
}
}.schedule();
}
monitor.done();
return Status.OK_STATUS;
}
};
job.setUser(true);
job.schedule();
}
return null;
}
}
private static void writeTo(File f, DBLogger entity,IProgressMonitor monitor) throws IOException {
entity.writeToFile(f, monitor);
// // int count = entity.countLogEntrys();
// SimpleDateFormat sdf = new SimpleDateFormat(PI.get(PI.logTimeStamps));
// monitor.subTask(f.getName());
// PrintStream ps = null;
//// long readingFromDB= 0,writingToFile= 0;
// List<Long> days = entity.getDays();
// try {
// ps = new PrintStream(f);
// for (Long day:days) {
// List<ILogEntry> logs = entity.loadLogEntrys(day, day+TimeUnit.DAYS.toMillis(1));
// for (ILogEntry log:logs) {
// ps.println(sdf.format(new Date(log.getDate())) +log.getMessage());
// }
// if (monitor.isCanceled()) {
// break;
// }
// monitor.worked(logs.size());
// }
//// int current = count;
//// do {
//// int toLoad = Math.min(current, 1000);
//// current -= toLoad;
//// // long countA = System.currentTimeMillis();
//// List<ILogEntry> logs = entity.loadLogEntrys(toLoad, current);
//// // long countB = System.currentTimeMillis();
//// Collections.reverse(logs);
//// for (ILogEntry log:logs) {
//// ps.println(sdf.format(new Date(log.getDate())) +log.getMessage());
//// }
//// // long countC = System.currentTimeMillis();
//// if (monitor.isCanceled()) {
//// break;
//// }
//// // readingFromDB+= countB-countA;
//// // writingToFile += countC-countB;
//// monitor.worked(toLoad);
//// } while (current > 0);
// } finally {
// GH.close(ps);
// }
// // logger.info("reading: "+readingFromDB +" writing: "+writingToFile);
}
}