diff options
Diffstat (limited to 'netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPaneModel.java')
-rw-r--r-- | netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPaneModel.java | 386 |
1 files changed, 386 insertions, 0 deletions
diff --git a/netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPaneModel.java b/netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPaneModel.java new file mode 100644 index 0000000..79b132b --- /dev/null +++ b/netx/net/sourceforge/jnlp/util/logging/ConsoleOutputPaneModel.java @@ -0,0 +1,386 @@ +package net.sourceforge.jnlp.util.logging; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Observable; +import java.util.Random; +import java.util.regex.Pattern; +import net.sourceforge.jnlp.util.logging.OutputController.Level; +import net.sourceforge.jnlp.util.logging.headers.Header; +import net.sourceforge.jnlp.util.logging.headers.JavaMessage; +import net.sourceforge.jnlp.util.logging.headers.MessageWithHeader; +import net.sourceforge.jnlp.util.logging.headers.ObservableMessagesProvider; +import net.sourceforge.jnlp.util.logging.headers.PluginHeader; +import net.sourceforge.jnlp.util.logging.headers.PluginMessage; + +public class ConsoleOutputPaneModel { + + ConsoleOutputPaneModel(ObservableMessagesProvider dataProvider) { + this.dataProvider = dataProvider; + } + + boolean shouldUpdate() { + for (int i = lastUpdateIndex; i < dataProvider.getData().size(); i++) { + if (!filtered(dataProvider.getData().get(i))) { + return true; + } + } + return false; + } + + private abstract class CatchedMessageWithHeaderComparator implements Comparator<MessageWithHeader> { + + @Override + public int compare(MessageWithHeader o1, MessageWithHeader o2) { + try { + final int order = revertSort ? 1 : -1; + return order * body(o1, o2); + } catch (NullPointerException npe) { + //caused by corrupted c messages + return 0; + } + } + + abstract int body(MessageWithHeader o1, MessageWithHeader o2); + } + + //testign data provider + static class TestMessagesProvider extends Observable implements ObservableMessagesProvider { + + List<MessageWithHeader> data = new ArrayList<MessageWithHeader>(); + List<MessageWithHeader> origData = new ArrayList<MessageWithHeader>(); + + public List<MessageWithHeader> getData() { + return data; + } + + @Override + public Observable getObservable() { + return this; + } + + public TestMessagesProvider() { + createData(); + new Thread(new Runnable() { + @Override + public void run() { + while (true) { + try { + Thread.sleep(new Random().nextInt(2000)); + data.add(origData.get(new Random().nextInt(origData.size()))); + TestMessagesProvider.this.setChanged(); + TestMessagesProvider.this.notifyObservers(); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + }).start(); + } + + void createData() { + String[] plugin = { + "plugindebug 1384850630162925 [jvanek][ITW-C-PLUGIN][MESSAGE_DEBUG][Tue Nov 19 09:43:50 CET 2013][/home/jvanek/Desktop/icedtea-web/plugin/icedteanp/IcedTeaNPPlugin.cc:1204] ITNPP Thread# 140513434003264, gthread 0x7fcbd531f8c0: PIPE: plugin read: plugin PluginProxyInfo reference 1 http://www.walter-fendt.de:80", + "preinit_plugindebug 1384850630162920 [jvanek][ITW-C-PLUGIN][MESSAGE_DEBUG][Tue Nov 19 09:43:50 CET 2013][/home/jvanek/Desktop/icedtea-web/plugin/icedteanp/IcedTeaNPPlugin.cc:1204] ITNPP Thread# 140513434003264, gthread 0x7fcbd531f8c0: PIPE: plugin read: plugin PluginProxyInfo reference 1 http://www.walter-fendt.de:80", + "plugindebugX 1384850630162954 [jvanek][ITW-Cplugindebug 1384850630163008 [jvanek][ITW-C-PLUGIN][MESSAGE_DEBUG][Tue Nov 19 09:43:50 CET 2013][/home/jvanek/Desktop/icedtea-web/plugin/icedteanp/IcedTeaNPPlugin.cc:1124] ITNPP Thread# 140513434003264, gthread 0x7fcbd531f8c0: parts[0]=plugin, parts[1]=PluginProxyInfo, reference, parts[3]=1, parts[4]=http://www.walter-fendt.de:80 -- decoded_url=http://www.walter-fendt.de:80", + "preinit_pluginerror 1384850630163294 [jvanek][ITW-C-PLUGIN][MESSAGE_ERROR][Tue Nov 19 09:43:50 CET 2013][/home/jvanek/Desktop/icedtea-web/plugin/icedteanp/IcedTeaNPPlugin.cc:1134] ITNPP Thread# 140513434003264, gthread 0x7fcbd531f8c0: Proxy info: plugin PluginProxyInfo reference 1 DIRECT", + "pluginerror 1384850630163291 [jvanek][ITW-C-PLUGIN][MESSAGE_ERROR][Tue Nov 19 09:43:50 CET 2013][/home/jvanek/Desktop/icedtea-web/plugin/icedteanp/IcedTeaNPPlugin.cc:1134] ITNPP Thread# 140513434003264, gthread 0x7fcbd531f8c0: Proxy info: plugin PluginProxyInfo reference 1 DIRECT" + }; + for (String string : plugin) { + origData.add(new PluginMessage(string)); + } + origData.add(new JavaMessage(new Header(Level.ERROR_ALL, Thread.currentThread().getStackTrace(), Thread.currentThread(), false), "message 1")); + origData.add(new JavaMessage(new Header(Level.ERROR_DEBUG, Thread.currentThread().getStackTrace(), Thread.currentThread(), false), "message 3")); + origData.add(new JavaMessage(new Header(Level.WARNING_ALL, Thread.currentThread().getStackTrace(), Thread.currentThread(), false), "message 2")); + origData.add(new JavaMessage(new Header(Level.WARNING_DEBUG, Thread.currentThread().getStackTrace(), Thread.currentThread(), false), "message 4")); + origData.add(new JavaMessage(new Header(Level.MESSAGE_DEBUG, Thread.currentThread().getStackTrace(), Thread.currentThread(), false), "message 9")); + origData.add(new JavaMessage(new Header(Level.MESSAGE_ALL, Thread.currentThread().getStackTrace(), Thread.currentThread(), false), "message 0 - multilined \n" + + "since beggining\n" + + " later\n" + + "again from beggingin\n" + + " even later")); + data.addAll(origData); + } + } + static final Pattern defaultPattern = Pattern.compile("(m?)(.*\n*)*"); + ObservableMessagesProvider dataProvider; + Pattern lastValidPattern = defaultPattern; + Pattern usedPattern = lastValidPattern; + int lastUpdateIndex; //to add just what was added newly + int statisticsShown; + private static final String HTMLCOLOR_DIMRED = "FF6666"; + private static final String HTMLCOLOR_MIDGRAY = "666666"; + private static final String HTMLCOLOR_SPARKRED = "FF0000"; + private static final String HTMLCOLOR_LIGHTGRAY = "AAAAAA"; + private static final String HTMLCOLOR_GREENYELLOW = "AAAA00"; + private static final String HTMLCOLOR_PINKYREAD = "FF0055"; + private static final String HTMLCOLOR_BLACK = "000000"; + + String importList() { + return importList(lastUpdateIndex); + } + + String importList(int start) { + return importList(highLight, start); + } + + String importList(boolean mark, int start) { + int added = start; + StringBuilder sb = new StringBuilder(); + if (mark) { + sb.append("<div style='"); + if (!wordWrap) { + sb.append("white-space:nowrap;"); + } + sb.append("font-family:\"Monospaced\"'>"); + } + + List<MessageWithHeader> sortedList; + if (start == 0) { + sortedList = preSort(dataProvider.getData()); + } else { + sortedList = preSort(Collections.synchronizedList(dataProvider.getData().subList(start, dataProvider.getData().size()))); + } + lastUpdateIndex = dataProvider.getData().size(); + + for (MessageWithHeader messageWithHeader : sortedList) { + if (filtered(messageWithHeader)) { + continue; + } + + + if (mark) { + sb.append("<div style='color:#"); + if (messageWithHeader.getHeader().isC && messageWithHeader.getHeader() instanceof PluginHeader) { + if (!((PluginHeader) (messageWithHeader.getHeader())).preinit) { + if (messageWithHeader.getHeader().level.isError()) { + sb.append(HTMLCOLOR_DIMRED); + } else { + sb.append(HTMLCOLOR_MIDGRAY); + } + } else { + if (messageWithHeader.getHeader().level.isError()) { + sb.append(HTMLCOLOR_SPARKRED); + } else { + sb.append(HTMLCOLOR_LIGHTGRAY); + } + } + } else { + if (messageWithHeader.getHeader().level.isWarning()) { + sb.append(HTMLCOLOR_GREENYELLOW); + } else if (messageWithHeader.getHeader().level.isError()) { + sb.append(HTMLCOLOR_PINKYREAD); + } else { + sb.append(HTMLCOLOR_BLACK); + } + } + sb.append("'>"); + //sb.append("<![CDATA["); + } + if (messageWithHeader instanceof PluginMessage && ((PluginMessage) (messageWithHeader)).wasError) { + sb.append("{corrupted}"); + } + String line = (createLine(messageWithHeader)); + if (mark) { + line = line.replaceAll("\n", "<br>\n"); + line = line.replaceAll(" ", " ");//small trick, html is reducting row of sapces to single space. This handles it and stimm allow line wrap + line = line.replaceAll("\t", " "); + } + sb.append(line); + if (mark) { + //sb.append("]]>"); + sb.append("</div>"); + } + //always wrap, looks better, works smoother + sb.append("\n"); + added++; + + } + if (mark) { + sb.append("</div>"); + } + statisticsShown = added; + return sb.toString(); + + } + + String createLine(MessageWithHeader m) { + StringBuilder sb = new StringBuilder(); + if (showHeaders) { + sb.append(m.getHeader().toString(showUser, + showOrigin, + showLevel, + showDate, + showCode, + showThread1, + showThread2)); + } + if (showMessage && showHeaders) { + sb.append(": "); + } + if (showMessage) { + sb.append(m.getMessage().toString()); + } + return sb.toString(); + } + + List<MessageWithHeader> preSort(List<MessageWithHeader> data) { + List<MessageWithHeader> sortedData; + if (sortBy == 0) { + if (revertSort) { + sortedData = Collections.synchronizedList(new ArrayList<MessageWithHeader>(data)); + Collections.reverse(sortedData); + } else { + sortedData = data; + } + } else { + sortedData = Collections.synchronizedList(new ArrayList<MessageWithHeader>(data)); + switch (sortBy) { + case 1: + Collections.sort(sortedData, new CatchedMessageWithHeaderComparator() { + @Override + public int body(MessageWithHeader o1, MessageWithHeader o2) { + return o1.getHeader().user.compareTo(o2.getHeader().user); + + } + }); + break; + case 2: + Collections.sort(sortedData, new CatchedMessageWithHeaderComparator() { + @Override + public int body(MessageWithHeader o1, MessageWithHeader o2) { + return o1.getHeader().getOrigin().compareTo(o2.getHeader().getOrigin()); + } + }); + break; + case 3: + Collections.sort(sortedData, new CatchedMessageWithHeaderComparator() { + @Override + public int body(MessageWithHeader o1, MessageWithHeader o2) { + return o1.getHeader().level.toString().compareTo(o2.getHeader().level.toString()); + } + }); + break; + case 4: + Collections.sort(sortedData, new CatchedMessageWithHeaderComparator() { + @Override + public int body(MessageWithHeader o1, MessageWithHeader o2) { + return o1.getHeader().date.compareTo(o2.getHeader().date); + } + }); + break; + case 5: + Collections.sort(sortedData, new CatchedMessageWithHeaderComparator() { + @Override + public int body(MessageWithHeader o1, MessageWithHeader o2) { + return o1.getHeader().caller.compareTo(o2.getHeader().caller); + } + }); + break; + case 6: + Collections.sort(sortedData, new CatchedMessageWithHeaderComparator() { + @Override + public int body(MessageWithHeader o1, MessageWithHeader o2) { + return o1.getHeader().thread1.compareTo(o2.getHeader().thread1); + } + }); + break; + case 7: + Collections.sort(sortedData, new CatchedMessageWithHeaderComparator() { + @Override + public int body(MessageWithHeader o1, MessageWithHeader o2) { + return o1.getMessage().compareTo(o2.getMessage()); + } + }); + break; + case 8: + Collections.sort(sortedData, new CatchedMessageWithHeaderComparator() { + @Override + public int body(MessageWithHeader o1, MessageWithHeader o2) { + return o1.getHeader().thread2.compareTo(o2.getHeader().thread2); + } + }); + break; + } + + } + return sortedData; + } + + boolean filtered(MessageWithHeader m) { + if (!showOut && m.getHeader().level.isOutput() && !m.getHeader().level.isWarning()) { + return true; + } + if (!showErr && m.getHeader().level.isError() && !m.getHeader().level.isWarning()) { + return true; + } + if (!showDebug && m.getHeader().level.isDebug()) { + return true; + } + if (!showInfo && m.getHeader().level.isInfo()) { + return true; + } + if (!showJava && !m.getHeader().isC) { + return true; + } + if (!showPlugin && m.getHeader().isC) { + return true; + } + if (m.getHeader() instanceof PluginHeader) { + PluginHeader mm = (PluginHeader) m.getHeader(); + if (!showPreInit && mm.preinit) { + return true; + } + if (!showPostInit && !mm.preinit) { + return true; + } + if (!showIncomplete && m instanceof PluginMessage && ((PluginMessage) (m)).wasError) { + return true; + } + if (!showComplete && m instanceof PluginMessage && !((PluginMessage) (m)).wasError) { + return true; + } + } + if (regExLabel) { + String s = createLine(m); + if (matchPattern && !usedPattern.matcher(s).matches()) { + return true; + } + if (!matchPattern && usedPattern.matcher(s).matches()) { + return true; + } + } + return false; + } + + String createStatisticHint() { + return statisticsShown + "/" + dataProvider.getData().size(); + } + boolean highLight; + boolean matchPattern; + boolean regExLabel; + boolean revertSort; + boolean showCode; + boolean showComplete; + boolean showDate; + boolean showDebug; + boolean showErr; + boolean showHeaders; + boolean showIncomplete; + boolean showInfo; + boolean showJava; + boolean showLevel; + boolean showMessage; + boolean showOrigin; + boolean showOut; + boolean showPlugin; + boolean showPostInit; + boolean showPreInit; + boolean showThread1; + boolean showThread2; + boolean showUser; + int sortBy; + boolean wordWrap; +} |