annotate src/nabble/view/web/template/NamlEditor.java @ 0:7ecd1a4ef557

add content
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 21 Mar 2019 19:15:52 -0600
parents
children 18cf4872fd7f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2 package nabble.view.web.template;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
4 import fschmidt.util.java.HtmlUtils;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
5 import fschmidt.util.servlet.JtpContext;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
6 import nabble.model.DailyNumber;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
7 import nabble.model.Node;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
8 import nabble.model.Site;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
9 import nabble.model.User;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
10 import nabble.modules.ModuleManager;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
11 import nabble.naml.compiler.CompileException;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
12 import nabble.naml.compiler.Macro;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
13 import nabble.naml.compiler.Meaning;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
14 import nabble.naml.compiler.Source;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
15 import nabble.view.lib.Jtp;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
16 import nabble.view.lib.Permissions;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
17 import nabble.view.lib.Shared;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
18 import org.apache.commons.fileupload.FileItem;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
19 import org.apache.commons.fileupload.FileUploadException;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
20
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
21 import javax.servlet.ServletException;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
22 import javax.servlet.http.HttpServlet;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
23 import javax.servlet.http.HttpServletRequest;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
24 import javax.servlet.http.HttpServletResponse;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
25 import java.io.ByteArrayOutputStream;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
26 import java.io.IOException;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
27 import java.io.InputStream;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
28 import java.io.PrintWriter;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
29 import java.io.StringWriter;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
30 import java.nio.charset.Charset;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
31 import java.nio.charset.CharsetEncoder;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
32 import java.util.HashMap;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
33 import java.util.List;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
34 import java.util.Map;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
35 import java.util.TreeMap;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
36 import java.util.zip.ZipEntry;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
37 import java.util.zip.ZipInputStream;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
38
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
39
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
40 public final class NamlEditor extends HttpServlet {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
41
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
42 protected void service(HttpServletRequest request, HttpServletResponse response)
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
43 throws ServletException, IOException
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
44 {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
45 User user = Jtp.getUser(request, response);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
46 if (user == null) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
47 simpleLoginPage("You must login to edit the NAML code of this application.", request, response);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
48 return;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
49 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
50 boolean isSiteAdmin = Permissions.isInGroup(user, Permissions.ADMINISTRATORS_GROUP);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
51 boolean isSysAdmin = Permissions.isSysAdmin(user);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
52
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
53 if (!isSiteAdmin && !isSysAdmin) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
54 simpleLoginPage("You must login to edit the NAML code of this application.", request, response);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
55 return;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
56 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
57 buildPage(request, response);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
58 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
59
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
60 public static void buildPage(HttpServletRequest request, HttpServletResponse response)
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
61 throws ServletException, IOException
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
62 {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
63 Site site = Jtp.getSite(request);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
64 Map<String,String> tweaks = new TreeMap<String,String>(site.getCustomTweaks());
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
65 Node rootNode = site.getRootNode();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
66 Exception exception = site.getTweakException();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
67
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
68 String macroDef = null;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
69 String selectedFileName = null;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
70 String overridenBody = null;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
71 String meaningId = request.getParameter("id");
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
72 if (meaningId != null) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
73 Meaning meaning = site.getProgram().getMeaning(meaningId);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
74 Macro macro = (Macro) meaning;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
75
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
76 String macroType = macro.getType().toString().toLowerCase();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
77 String macroBody = macro.element.toString();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
78 int posOpen = macroBody.indexOf('<');
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
79 int posClose = macroBody.indexOf('>', posOpen+1);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
80 macroDef = macroBody.substring(posOpen, posClose);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
81 macroDef = macroDef.replaceFirst("<"+macroType, "<override_"+macroType);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
82 int posClosingTag = macroBody.lastIndexOf("</");
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
83 String closingTag = "</override_" + macroType + '>';
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
84 overridenBody = macroDef + macroBody.substring(posClose, posClosingTag) + closingTag;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
85 for( Map.Entry<String,String> entry : tweaks.entrySet() ) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
86 String name = entry.getKey();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
87 String content = entry.getValue();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
88 if (content.contains(macroDef)) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
89 selectedFileName = name;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
90 break;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
91 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
92 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
93 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
94
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
95 String previousUrl = request.getParameter("prev");
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
96
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
97 PrintWriter out = response.getWriter();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
98
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
99 out.print( "\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n <head>\n <META NAME=\"robots\" CONTENT=\"noindex,nofollow\"/>\n <meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n <title>Naml Editor - " );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
100 out.print( (rootNode.getSubject()) );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
101 out.print( "</title>\n " );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
102 Shared.head(request, response, false);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
103 out.print( "\n <style type=\"text/css\">\n div.main-content {\n position:absolute;\n top:5.2em;\n bottom:1.3em;\n right:.8em;\n left:.8em;\n }\n div.big-title {\n margin:.5em 0;\n }\n table.vertical-control {\n border-collapse:collapse;\n width:100%;\n height:100%;\n position:absolute;\n top:0;\n bottom:0;\n }\n table.vertical-control td {\n padding:0;\n vertical-align:top;\n }\n table.vertical-control td.options {\n width:13em;\n padding-top:.2em;\n }\n table.vertical-control td.details {\n padding: .2em;\n }\n ul.vertical-control {\n width:100%;\n list-style-type:none;\n padding:0;\n margin:.5em 0;\n }\n ul.vertical-control li {\n padding: .3em;\n white-space:nowrap;\n cursor: pointer;\n font-weight:normal;\n width:13em;\n overflow: hidden;\n border-top-left-radius:5px;\n border-bottom-left-radius:5px;\n -moz-border-radius-topleft:5px;\n -moz-border-radius-bottomleft:5px;\n }\n ul.vertical-control li.selected {\n cursor: default;\n font-weight:bold;\n }\n #options-ul {\n overflow-x:hidden !important;\n overflow-y:auto !important;\n }\n div.more {\n position:absolute;\n left:0;\n width:13em;\n bottom:0;\n border-top: 1px dotted #ddd;\n }\n img.toolbar-icon {\n vertical-align: -25%;\n }\n div.default {\n position: absolute;\n top: .2em;\n bottom: 0;\n margin-bottom: .2em;\n height: auto;\n overflow: auto;\n }\n div.advanced-option-body {\n padding: 0 1.5em 1.5em;\n }\n\n .CodeMirror-line-numbers {\n font-family: verdana, arial, sans-serif;\n font-size: 11pt;\n width: 2.2em;\n color: #aaa;\n background-color: #eee;\n text-align: right;\n padding-right: .3em;\n line-height: normal;\n }\n\n span.xml-tagname {color: #A0B;}\n span.xml-attribute {color: #281;}\n span.xml-punctuation {color: black;}\n span.xml-attname {color: #00F;}\n span.xml-comment {color: #A70;}\n span.xml-cdata {color: #48A;}\n span.xml-processing {color: #999;}\n span.xml-entity {color: #A22;}\n span.xml-error {color: #F00 !important;}\n span.xml-text {color: black;}\n\n div.status-label {\n float:right;\n font-weight:bold;\n width:6em;\n text-align:center;\n line-height:1.2em;\n margin:-.2em 0 0 .5em;\n padding:.35em;\n }\n div.no-error {\n color: #656565;\n cursor: text;\n }\n div.has-error {\n color: white;\n cursor: pointer;\n background: url('/gradients/v20_EE9999_EE5555') #EE5555 repeat-x;\n }\n #error-message {\n position:absolute;\n display:none;\n z-index:1000;\n padding:0 1em 1em;\n margin-top:.2em;\n top:5em;\n left:10%;\n bottom:10%;\n right:.7em;\n overflow:auto;\n display:none;\n }\n </style>\n\n <script src=\"/util/codemirror/js/codemirror.js\"></script>\n <script src=\"/util/codemirror/js/highlight.js\"></script>\n <script src=\"/util/codemirror/js/stringstream.js\"></script>\n <script src=\"/util/codemirror/js/tokenize.js\"></script>\n <script src=\"/util/codemirror/js/parsexml.js\"></script>\n\n <script type=\"text/javascript\">\n var configFileName = \"" );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
104 out.print( (ModuleManager.CONFIGURATION_TWEAK) );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
105 out.print( "\";\n function setVisible(name, show) {\n if (show) $('#'+name).show();\n else $('#'+name).hide();\n };\n var modified = [];\n function setModified(id) {\n if (modified.indexOf(id) >= 0)\n return;\n modified.push(id);\n if (id == 'removed')\n return;\n var $tab = $('#tab_'+id);\n var html = $tab.html();\n $tab.html(html.replace(/file\\.png/, 'file_modified.png'));\n setVisible('modified-warning',true);\n };\n function resetModified() {\n for (var i = 0; i < modified.length; i++) {\n if (modified[i] == 'removed')\n continue;\n var $tab = $('#tab_'+modified[i]);\n var html = $tab.html();\n $tab.html(html.replace(/file_modified\\.png/, 'file.png'));\n }\n setVisible('modified-warning',false);\n modified = [];\n }\n window.onbeforeunload = function() {\n if (modified.length > 0)\n return 'You have unsaved changes.\\nDo you really want to leave without saving?';\n };\n var fileImg = '<img src=\"/images/file.png\" style=\"vertical-align:-20%\"/> ';\n Array.prototype.remove = function(s){\n for(i=0; i<this.length; i++){\n if (s == this[i])\n this.splice(i, 1);\n }\n }\n var advancedOptions = {\n id: 'advanced_options',\n name: 'Advanced Options',\n content: null\n };\n function isDefaultTab(f) {\n return f == advancedOptions;\n };\n\n var files = [];\n " );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
106
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
107 int i = 0;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
108 for( Map.Entry<String,String> entry : tweaks.entrySet() ) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
109 String name = entry.getKey();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
110 String content = entry.getValue();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
111
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
112 out.print( "\nfiles.push({\nid: " );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
113 out.print( (i++) );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
114 out.print( ",\nname: \"" );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
115 out.print( (HtmlUtils.javascriptStringEncode(name)) );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
116 out.print( "\",\ncontents: \"" );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
117 out.print( (HtmlUtils.javascriptStringEncode(content)) );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
118 out.print( "\"\n});\n" );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
119 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
120 out.print( "\nfunction addFile(file) {\n$('#options-ul').append('<li id=\"tab_'+file.id+'\">'+fileImg+file.name+'</li>');\nclickableTab(file);\n\nvar textareaId = 'textarea_'+file.id;\n$('#details').append('<div id=\"div_'+file.id+'\" style=\"display:none\"><textarea id=\"'+textareaId+'\"></textarea></div>');\nvar $textarea = $('#'+textareaId);\n$textarea.val(file.contents);\n\nfile.editor = CodeMirror.fromTextArea(textareaId, {\n parserfile: \"parsexml.js\",\n stylesheet: \"/util/codemirror/css/xmlcolors.css\",\n path: \"/util/codemirror/js/\",\n lineNumbers: true,\n indentUnit: 4,\n onChange: function() { setModified(file.id); }\n});\n\nvar $wrapping = $textarea.next();\n$wrapping.css({\n position: 'absolute',\n top: '2.5em',\n bottom: 0,\n marginBottom: '.2em',\n height: 'auto'\n});\n$wrapping.attr('id', 'wrapping_'+file.id)\n$wrapping.addClass('no-bg-color');\n\n/* File Toolbar */\nvar toolbar = '<div id=\"toolbar_'+file.id+'\" class=\"shaded-bg-color\" style=\"padding:.2em .4em .3em;text-align:right\">';\ntoolbar += '<div class=\"float-left\" style=\"font-style:italic;padding:.3em\">'+file.name+'</div>';\ntoolbar += '<button class=\"toolbar\" style=\"padding:.1em .3em\" onclick=\"renameFile()\"><img class=\"toolbar-icon\" src=\"/images/edit_sm.png\"/> Rename</button> ';\ntoolbar += '<button class=\"toolbar\" style=\"padding:.1em .3em\" onclick=\"removeFile()\"><img class=\"toolbar-icon\" src=\"/images/remove_sm.png\"/> Remove</button>';\ntoolbar += '</div>';\n$textarea.after(toolbar);\n};\nfunction clickableTab(f) {\nvar $tab = $('#tab_'+f.id);\n$tab.click(function() {\n select(f);\n});\ntabHover($tab);\n};\nfunction tabHover($tab) {\n$tab.hover(function() {\n if (!$(this).hasClass('selected'))\n $(this).addClass('light-bg-color');\n },\n function() {\n $(this).removeClass('light-bg-color');\n }\n);\n};\n\nvar initialized = [];\nfunction showFile(file) {\n$('#div_'+file.id).show();\nif (initialized.indexOf(file.id) == -1) {\n var cc = Nabble.get('toolbar_'+file.id);\n $('#wrapping_'+file.id).css('top', $(cc).outerHeight());\n var frame = window.frames[window.frames.length-1];\n var doc = window.document;\n $(frame.document).click(function() { $(doc).click(); });\n initialized.push(file.id);\n}\n};\n\nvar selected = null;\nfunction select(f) {\nif (selected != f) {\n $('li').removeClass('selected dark-bg-color');\n var $tab = $('#tab_'+f.id);\n $tab.addClass('selected dark-bg-color');\n $('#details').children().hide();\n showFile(f);\n selected = f;\n layout();\n} else if (f == null || files.length == 0)\n setVisible('no-selection',true);\n};\nfunction layout() {\nif (selected) {\n var detailsWidth = $('#details').width();\n if (!isDefaultTab(selected)) {\n var $div = $('#div_'+selected.id);\n var $lineNumbers = $('div.CodeMirror-line-numbers', $div);\n var width = detailsWidth - $lineNumbers.width() - 5;\n $('div.CodeMirror-wrapping', $div).width(Math.round(width)+'px');\n } else {\n $('div.default').width(Math.round(detailsWidth - 30)+'px');\n }\n}\nvar $ul = $('#options-ul');\nvar uTop = $ul.position().top;\nvar mTop = $('#more').position().top;\n$ul.height(mTop-uTop-10);\n};\nfunction newFile() {\nvar name = prompt('Name of the file:');\nif (name == configFileName) {\n alert('You cannot create a file with this name.');\n return;\n}\nif (name) {\n var f = {\n id: new Date().getTime(),\n name: name,\n contents: ''\n };\n files.push(f);\n addFile(f);\n select(f);\n setModified(f.id);\n}\n};\nfunction renameFile() {\nif (selected) {\n name = prompt(\"Name of the file:\", selected.name);\n if (name && name !='null' && Nabble.trim(name).length > 0) {\n selected.name = Nabble.trim(name);\n $tab = $('#tab_'+selected.id).html(fileImg + name);\n $toolbar = $('#toolbar_'+selected.id+' div').html(name);\n setModified(selected.id);\n }\n}\n};\nfunction removeFile() {\nif (selected && confirm(\"Do you really want to delete \" + selected.name + \"?\")) {\n var i = files.indexOf(selected);\n files.remove(selected);\n setModified('removed');\n $('#tab_'+selected.id+',#div_'+selected.id).remove();\n i = i > 0? i-1 : files.length > 0? 0 : -1;\n if (i == -1)\n setVisible('no-selection',true);\n else\n select(files[i]);\n}\n};\nfunction saveChanges() {\nnotice('Saving data... please wait');\nvar params = {};\nparams['fileCount'] = files.length;\nvar c = 0;\nfor (var i=0; i < files.length; i++) {\n var name = files[i].name;\n params['name'+c] = name;\n params['contents'+c] = files[i].editor.getCode();\n c++;\n}\n$.post(\"./NamlEditor$Save.jtp\", params,\n function(data){\n if (data == null || data.length == 0) {\n setError(null);\n notice('Data successfully saved, no errors found', 2000, 2000);\n resetModified();\n } else {\n setError(data);\n notice('Data NOT saved, please fix errors', 5000, 2000);\n }\n }\n);\n};\n\nfunction getOrCreateFile(name) {\nfor (var i=0; i<files.length; i++) {\n if (files[i].name == name)\n return files[i];\n}\nfiles.push({\n id: new Date().getTime(),\n name: name,\n contents:''\n});\nreturn files[files.length-1];\n};\nfunction getLineNumber(s, token) {\nvar line = 1;\nvar pos = s.indexOf(token);\nfor (var i=0; i < pos; i++) {\n if (s.charAt(i) == '\\n')\n line++;\n}\nreturn line;\n};\nfunction startDefaultTabs() {\n/* Advanced options tab*/\nvar $tabs = $('#tab_advanced_options');\n$tabs.click(function() { select(advancedOptions); });\n};\nfunction setError(err) {\nvar $errorMsg = $('#error-message');\n$errorMsg.html(err? err : '');\nvar $status = $('#error-status');\nif (err) {\n var visible = false;\n function errorClick(e) {\n e.stopPropagation();\n if (visible) {\n $errorMsg.slideUp('fast', function() { $errorMsg.hide() });\n $status.html('View Error');\n } else {\n $errorMsg.slideDown('fast');\n $status.html('Hide Error');\n }\n visible = !visible;\n };\n $status.addClass('has-error').removeClass('no-error').html('View Error').click(errorClick).click();\n $(document).click(function(e) {\n if ($(e.target).attr('id') == 'error-message')\n return;\n var $parents = $(e.target).parents();\n if ($parents.hasClass('error-message'))\n return;\n visible = true;\n $status.click();\n });\n} else {\n $status.addClass('no-error').removeClass('has-error').html('No Errors').unbind('click');\n $(document).unbind('click');\n}\n};\nvar error = " );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
121 out.print( (exception == null? "null" : "\"" + HtmlUtils.javascriptStringEncode(getErrorMessage(exception)) + "\"") );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
122 out.print( ";\n\nfunction startEditors() {\nnotice('Starting editor... please wait');\nstartDefaultTabs();\nsetError(error);\nlayout();\nvar selectedFileName = " );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
123 out.print( (selectedFileName == null? "null" : "\""+selectedFileName+"\"") );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
124 out.print( ";\nvar selectedFile = files[0];\nvar macroDef = " );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
125 out.print( (macroDef == null? "null" : "\""+HtmlUtils.javascriptStringEncode(macroDef)+"\"") );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
126 out.print( ";\nvar overridenBody = " );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
127 out.print( (overridenBody == null? "null" : "\""+HtmlUtils.javascriptStringEncode(overridenBody)+"\"") );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
128 out.print( ";\nvar macroLineNumber = 0;\nif (selectedFileName != null) {\n var f = getOrCreateFile(selectedFileName);\n macroLineNumber = getLineNumber(f.contents,macroDef);\n} else if (overridenBody != null) {\n var f = getOrCreateFile('tweaks');\n selectedFileName = f.name;\n f.contents = Nabble.trim(f.contents);\n f.contents = (f.contents.length > 0? f.contents + '\\n\\n':'') + overridenBody;\n macroLineNumber = getLineNumber(f.contents,macroDef);\n} else {\n var f = files.length == 0? getOrCreateFile('tweaks') : files[0];\n selectedFileName = f.name;\n}\nfor (var i=0; i < files.length; i++) {\n addFile(files[i]);\n if (files[i].name == selectedFileName)\n selectedFile = files[i];\n}\nselect(selectedFile);\nif (selectedFile && macroLineNumber > 0) {\n function goToLine() {\n var $lines = $('#wrapping_'+selectedFile.id+' div.CodeMirror-line-numbers').children();\n if (selectedFile.editor.editor && $lines.size() >= macroLineNumber) {\n var c = 1;\n $lines.each(function() {\n var t = $(this).html();\n if (c == macroLineNumber) {\n $(this).css('font-weight','bold').addClass('highlight');\n setTimeout(function(){\n selectedFile.editor.jumpToLine(Number(macroLineNumber));\n notice('Ready', 2000, 1000);\n }, 150);\n return false;\n }\n if (t != \"&nbsp;\")\n c++;\n });\n } else\n setTimeout(goToLine, 50);\n };\n goToLine();\n} else\n notice('Ready', 2000, 1000);\n$(window).resize(layout);\n};\n\nvar started = false;\n$(document).ready(function() {\nif (!started) {\n started = true;\n startEditors();\n}\n});\n</script>\n</head>\n<body>\n<div id=\"notice\" class=\"notice rounded-bottom\"></div>\n" );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
129 Shared.minHeader(request, response, site.getRootNode(), null, false);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
130 out.print( "\n\n<div class=\"shaded-bg-color\" style=\"padding:.5em\">\n<div id=\"error-status\" class=\"status-label rounded no-error\">No Errors</div>\n<div id=\"error-message\"class=\"border2 error-message drop-shadow\"></div>\n<span class=\"big-title second-font\">NAML Editor</span>\n</div>\n\n<div class=\"main-content\">\n<table class=\"vertical-control\">\n<tr>\n <td class=\"options\">\n <button class=\"toolbar\" onclick=\"newFile()\">Add New File</button>\n <ul id=\"options-ul\" class=\"vertical-control\">\n </ul>\n <div id=\"more\" class=\"more\">\n <ul class=\"vertical-control\">\n <li id=\"tab_advanced_options\" class=\"weak-color\">\n <img src=\"/images/tool.png\" width=\"16\" height=\"17\" style=\"vertical-align:-15%\"/>\n Advanced Options\n </li>\n " );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
131 if (previousUrl != null) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
132 out.print( "\n <li style=\"cursor:text\">\n <img src=\"/images/arrowleft.png\" style=\"width:15px;height:15px;vertical-align:-15%;margin-right:1px\"/>\n <a href=\"" );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
133 out.print( (previousUrl) );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
134 out.print( "\">Continue</a>\n </li>\n " );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
135 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
136 out.print( "\n </ul>\n <button class=\"toolbar action-button\" onclick=\"saveChanges()\" style=\"width:100%;padding:.4em 0\">Save Changes</button>\n </div>\n </td>\n <td id=\"details\" class=\"details dark-bg-color\">\n <div id=\"no-selection\" class=\"no-bg-color\" style=\"display:none;padding:.2em 1em\">\n <div class=\"big-title second-font weak-color\">No Files</div>\n <div class=\"weak-color\">Use the button on the left to create a new file.</div>\n </div>\n <div id=\"div_advanced_options\" class=\"no-bg-color default\" style=\"display:none;padding:.2em 1em\">\n <div id=\"modified-warning\" class=\"info-message invisible\" style=\"padding: .2em .5em .5em\">\n <div class=\"big-title important\">Warning -- You have unsaved changes!</div>\n It is highly recommended that you save your changes before using the options below.\n The download option will NOT see your modified files and the upload option will override your last changes. Click on the\n \"Save Changes\" button first if you don't want to lose your modified files.\n </div>\n <div class=\"big-title second-font\">Download Changes</div>\n <div class=\"advanced-option-body\">\n Download a ZIP file with your custom NAML code and save a copy on your computer.\n <div style=\"padding:.3em 0\">\n <a href=\"" );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
137 out.print( (NamlDownload.getFilePath(site)) );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
138 out.print( "\">Download ZIP file</a>\n </div>\n </div>\n\n <div class=\"big-title second-font\">Upload Changes</div>\n <div class=\"advanced-option-body\">\n Import a ZIP file with custom NAML code.<br/>\n You may consider downloading a backup before uploading a new file.<br/>\n <iframe id=\"upload-frame\" src=\"./NamlEditor$UploadForm.jtp\" frameborder=\"0\" width=\"100%\" scrolling=\"0\"></iframe>\n </div>\n </div>\n </td>\n</tr>\n</table>\n</div>\n\n" );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
139 Shared.noFooter(request,response);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
140 out.print( "\n" );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
141 Shared.analytics(request,response);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
142 out.print( "\n</body>\n</html>\n" );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
143
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
144 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
145
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
146 public static void save(HttpServletRequest request, HttpServletResponse response)
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
147 throws ServletException, IOException
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
148 {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
149 Site site = Jtp.getSite(request);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
150 int fileCount = Integer.valueOf(request.getParameter("fileCount"));
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
151 Map<String, String> tweaks = new HashMap<String, String>();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
152 for (int i = 0; i < fileCount; i++) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
153 String name = request.getParameter("name"+i);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
154 String contents = request.getParameter("contents"+i);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
155 tweaks.put(name, contents);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
156 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
157 Map<String, String> previousTweaks = site.getCustomTweaks();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
158 site.setCustomTweaks(tweaks);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
159 try {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
160 site.getProgram().getTemplate("do_nothing");
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
161 } catch (CompileException e) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
162 response.getWriter().print(getErrorMessage(e));
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
163 // reverting changes
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
164 site.setCustomTweaks(previousTweaks);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
165 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
166 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
167
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
168 public static void uploadForm(HttpServletRequest request, HttpServletResponse response)
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
169 throws ServletException, IOException
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
170 {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
171 PrintWriter out = response.getWriter();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
172
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
173 out.print( "\n<html>\n <head>\n " );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
174 Shared.head(request, response, false);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
175 out.print( "\n </head>\n <body style=\"margin-left:0\">\n <form action=\"./NamlEditor$Upload.jtp\" method=\"POST\" enctype=\"multipart/form-data\">\n <input name=\"file\" type=\"file\" size=\"20\" />\n <div style=\"padding:.5em 0\">\n <input type=\"radio\" name=\"type\" id=\"override\" value=\"override\" checked=\"true\"/> <label for=\"override\">Override my changes</label><br/>\n <input type=\"radio\" name=\"type\" id=\"append\" value=\"append\"/> <label for=\"append\">Merge with my changes</label><br/>\n </div>\n <button type=\"submit\" class=\"toolbar second-font\" style=\"padding:.25em\">Upload ZIP File</button>\n </form>\n </body>\n</html>\n" );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
176
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
177 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
178
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
179 private static final int SIZE_LIMIT = 1024 * 1024 * 2; // 2 Mb
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
180 private static final CharsetEncoder CHARSET_ENCODER = Charset.forName("UTF-8").newEncoder();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
181
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
182 public static void upload(HttpServletRequest request, HttpServletResponse response)
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
183 throws ServletException, IOException
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
184 {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
185 final Map<String, FileItem> map;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
186 try {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
187 map = Jtp.getFileItems(request);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
188 } catch (FileUploadException e) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
189 resultPage("Upload failed: " + e.getMessage(), request, response);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
190 return;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
191 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
192 FileItem fi = map.get("file");
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
193 if (fi == null) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
194 resultPage("Image upload failed, please try again.", request, response);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
195 return;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
196 } else if (fi.getSize() > SIZE_LIMIT) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
197 resultPage("The file you uploaded is too big. Please upload a smaller image (less than 2Mb).", request, response);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
198 return;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
199 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
200 Site site = Jtp.getSite(request);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
201 Map<String,String> tweaks = new HashMap<String, String>(site.getCustomTweaks());
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
202
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
203 String type = map.get("type").getString();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
204 boolean isOverride = "override".equals(type);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
205 if (isOverride)
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
206 tweaks.clear();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
207
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
208 InputStream in = fi.getInputStream();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
209 ZipInputStream zis = new ZipInputStream(in);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
210 ZipEntry entry;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
211 int i = 0;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
212 while ((entry = zis.getNextEntry()) != null) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
213 String name = entry.getName();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
214 if (name.endsWith(".naml")) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
215 int size;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
216 byte[] buffer = new byte[2048];
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
217 ByteArrayOutputStream baos = new ByteArrayOutputStream();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
218 while ((size = zis.read(buffer, 0, buffer.length)) != -1) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
219 baos.write(buffer, 0, size);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
220 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
221 if (CHARSET_ENCODER.canEncode(baos.toString())) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
222 String contents = baos.toString("UTF-8");
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
223 name = name.replaceAll("\\.naml", ""); // remove ".naml" ext
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
224 if (tweaks.containsKey(name)) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
225 String original = tweaks.get(name);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
226 tweaks.put(name, original + "\n\n----------- Merged -----------\n\n" + contents);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
227 } else
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
228 tweaks.put(name, contents);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
229 baos.flush();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
230 baos.close();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
231 i++;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
232 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
233 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
234 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
235 if (i == 0) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
236 resultPage("Invalid ZIP file.", request, response);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
237 return;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
238 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
239 // Saves tweaks and recompiles XML
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
240 site.setCustomTweaks(tweaks);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
241 site.getTemplate("do_nothing");
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
242 // Reloads the page (if there is any exception, it will be loaded and displayed)
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
243 resultPage(null, request, response);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
244 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
245
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
246 private static void resultPage(String message, HttpServletRequest request, HttpServletResponse response)
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
247 throws IOException
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
248 {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
249 PrintWriter out = response.getWriter();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
250
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
251 out.print( "\n<html>\n <head>\n " );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
252 Shared.head(request, response, false);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
253 out.print( "\n </head>\n <body style=\"margin-left:0\">\n " );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
254 if (message == null) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
255 out.print( "\n <script type=\"text/javascript\">\n parent.location = './NamlEditor.jtp';\n </script>\n " );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
256 } else {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
257 out.print( "\n Error: <span style=\"color:red\">" );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
258 out.print( (message) );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
259 out.print( "</span>\n <br/><br/>\n <a href=\"./NamlEditor$UploadForm.jtp\">Try again</a>\n " );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
260 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
261 out.print( "\n </body>\n</html>\n" );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
262
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
263 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
264
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
265 private static String getErrorMessage(Exception exception) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
266 StringBuilder errorMessage = new StringBuilder();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
267 if (exception != null) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
268 errorMessage
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
269 .append("<div class=\"important big-title second-font\">Error</div>")
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
270 .append(exception.getMessage().replaceAll("\n","<br/>"))
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
271 .append("<div class=\"bold\" style=\"padding:.5em 0 .3em\">Full Stack Trace</div>");
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
272 StackTraceElement[] stack = exception.getStackTrace();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
273 for (StackTraceElement e : stack)
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
274 errorMessage.append(e).append("<br/>");
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
275 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
276 return errorMessage.toString();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
277 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
278
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
279 public static class Save extends HttpServlet {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
280
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
281 protected void service(HttpServletRequest request, HttpServletResponse response)
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
282 throws ServletException, IOException
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
283 {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
284 User user = Jtp.getUser(request, response);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
285 boolean isSiteAdmin = user != null && Permissions.isInGroup(user, Permissions.ADMINISTRATORS_GROUP);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
286 boolean isSysAdmin = user != null && Permissions.isSysAdmin(user);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
287 if ((isSiteAdmin || isSysAdmin) && "POST".equals(request.getMethod())) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
288 save(request, response);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
289 } else
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
290 response.getWriter().print("Please log in with your administrator account. Your may have logged out or your session has expired.");
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
291 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
292 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
293
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
294 public static class UploadForm extends HttpServlet {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
295
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
296 protected void service(HttpServletRequest request, HttpServletResponse response)
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
297 throws ServletException, IOException
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
298 {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
299 uploadForm(request, response);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
300 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
301 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
302
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
303 public static class Upload extends HttpServlet {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
304
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
305 protected void service(HttpServletRequest request, HttpServletResponse response)
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
306 throws ServletException, IOException
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
307 {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
308 User user = Jtp.getUser(request, response);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
309 if (user == null) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
310 resultPage("You are not logged in as an administrator.", request, response);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
311 return;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
312 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
313 boolean isSiteAdmin = Permissions.isInGroup(user, Permissions.ADMINISTRATORS_GROUP);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
314 boolean isSysAdmin = Permissions.isSysAdmin(user);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
315 if (!isSiteAdmin && !isSysAdmin) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
316 resultPage("You are not logged in as an administrator.", request, response);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
317 return;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
318 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
319
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
320 upload(request, response);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
321 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
322 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
323
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
324 private static void simpleLoginPage(String message, HttpServletRequest request, HttpServletResponse response)
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
325 throws ServletException, IOException
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
326 {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
327 PrintWriter out = response.getWriter();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
328
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
329 out.print( "\n <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n <html>\n <head>\n " );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
330 Shared.loadJavascript(request, out);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
331 out.print( "\n <title>Naml Editor | Login</title>\n </head>\n <body style=\"text-align:center;font-family: Verdana,sans-serif;font-size:.84em;padding-top:2em\">\n <img src=\"/images/naml.png\"/>\n <p><b>" );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
332 out.print( (message) );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
333 out.print( "</b></p>\n <form action=\"./NamlEditor$SimpleLogin.jtp\" method=\"post\">\n <table style=\"margin:0 auto;font:inherit\">\n <tr>\n <td style=\"text-align:right\">Email</td>\n <td><input type=\"text\" name=\"email\"/></td>\n </tr>\n <tr>\n <td style=\"text-align:right\">Password</td>\n <td><input type=\"password\" name=\"password\"/></td>\n </tr>\n <tr>\n <td colspan=\"2\" style=\"padding: .5em 0 0;text-align:center\">\n <input type=\"submit\" value=\"Login\" style=\"font-weight:bold;padding:.3em .4em\"/>\n or <a href=\"/\">Cancel</a>\n </td>\n </tr>\n </table>\n </form>\n <div style=\"margin:2em 15%;text-align:center;background:#eee;padding:.3em 0\">\n Powered by <a href=\"" );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
334 out.print( (Jtp.homePage()) );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
335 out.print( "\">Nabble</a>\n </div>\n </body>\n </html>\n" );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
336
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
337 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
338
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
339 public static class SimpleLogin extends HttpServlet {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
340
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
341 protected void service(HttpServletRequest request, HttpServletResponse response)
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
342 throws ServletException, IOException
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
343 {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
344 Site site = Jtp.getSite(request);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
345 String email = request.getParameter("email");
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
346 String password = request.getParameter("password");
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
347 User user = site.getUserFromEmail(email);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
348 if (user != null && user.isRegistered() && user.checkPassword(password) && "post".equalsIgnoreCase(request.getMethod())) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
349 Jtp.doLogin(request,response,user,true);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
350 DailyNumber.logins.inc();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
351
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
352 Shared.javascriptRedirect(request,response, "./NamlEditor.jtp");
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
353 } else {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
354 simpleLoginPage("<span style=\"color:#C00\">Incorrect login!</span>", request, response);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
355 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
356 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
357 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
358
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
359 public static class ViewFile extends HttpServlet {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
360
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
361 protected void service(HttpServletRequest request, HttpServletResponse response)
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
362 throws ServletException, IOException
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
363 {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
364 JtpContext jtpContext = (JtpContext)getServletContext().getAttribute(JtpContext.attrName);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
365 jtpContext.setEtag(request,response);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
366
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
367 Site site = Jtp.getSite(request);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
368 String file = request.getParameter("file");
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
369 PrintWriter out = response.getWriter();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
370 List<Source> sources = site.getProgram().getSources();
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
371 for (Source s : sources) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
372 if (s.id.equals(file)) {
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
373 file = file.replaceFirst("^.+:", "");
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
374 file = file.endsWith(".naml")? file : file + ".naml";
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
375 String code = HtmlUtils.htmlEncode(s.content);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
376
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
377 out.print( "\n <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n <html>\n <head>\n <title>" );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
378 out.print( (file) );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
379 out.print( " | Naml File</title>\n " );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
380 Shared.head(request, response, false);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
381 out.print( "\n </head>\n <body>\n " );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
382 Shared.minHeader(request, response, site.getRootNode(), null, false);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
383 out.print( "\n <h1>" );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
384 out.print( (file) );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
385 out.print( "</h1>\n <pre>" );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
386 out.print( (code) );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
387 out.print( "</pre>\n " );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
388 Shared.footer(request, response);
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
389 out.print( "\n </body>\n </html>\n" );
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
390
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
391 return;
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
392 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
393 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
394 response.sendError(HttpServletResponse.SC_NOT_FOUND, "Source file not found.");
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
395 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
396 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
397 }
7ecd1a4ef557 add content
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
398