X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=source%2Fmircoders%2Flocalizer%2Fbasic%2FMirBasicProducerAssistantLocalizer.java;h=6697d4c45a2edf80438b3fe9831760c97edb863b;hb=6958569d68414487e0ee1bb37772fe8711e7ebc8;hp=00d51314ee701459e6f226106c5b3e5cb82a18c1;hpb=04633fe2077c48dd8e3c6bb2d6f4c14eb24ba129;p=mir.git diff --git a/source/mircoders/localizer/basic/MirBasicProducerAssistantLocalizer.java b/source/mircoders/localizer/basic/MirBasicProducerAssistantLocalizer.java index 00d51314..6697d4c4 100755 --- a/source/mircoders/localizer/basic/MirBasicProducerAssistantLocalizer.java +++ b/source/mircoders/localizer/basic/MirBasicProducerAssistantLocalizer.java @@ -29,34 +29,64 @@ */ package mircoders.localizer.basic; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.StringWriter; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; +import gnu.regexp.RE; + import mir.config.MirPropertiesConfiguration; import mir.entity.adapter.EntityAdapter; import mir.entity.adapter.EntityIteratorAdapter; +import mir.generator.Generator; +import mir.generator.GeneratorExc; +import mir.generator.GeneratorFailure; import mir.log.LoggerWrapper; import mir.misc.StringUtil; -import mir.util.DateToMapAdapter; -import mir.util.GeneratorExpressionFunctions; -import mir.util.*; -import mir.util.GeneratorIntegerFunctions; -import mir.util.GeneratorListFunctions; -import mir.util.GeneratorStringFunctions; +import mir.util.GeneratorDateTimeFunctions; +import mir.util.GeneratorFormatAdapters; +import mir.util.generator.ReflectionGeneratorFunctionsAdapter; +import mir.util.StringRoutines; import mircoders.global.MirGlobal; -import mircoders.localizer.*; +import mircoders.localizer.MirLocalizerExc; +import mircoders.localizer.MirLocalizerFailure; +import mircoders.localizer.MirProducerAssistantLocalizer; + +import org.w3c.dom.Document; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.tidy.Configuration; +import org.w3c.tidy.Tidy; public class MirBasicProducerAssistantLocalizer implements MirProducerAssistantLocalizer { protected LoggerWrapper logger; + private RE regularExpressionLT; + private RE regularExpressionGT; + private RE regularExpressionWhitespace; + + public MirBasicProducerAssistantLocalizer() throws MirLocalizerFailure { + try{ + regularExpressionLT = new RE("<"); + regularExpressionGT = new RE(">"); + regularExpressionWhitespace = new RE("\\s+"); + } + catch (Throwable t) { + throw new MirLocalizerFailure(t); + } + } + public void initializeGenerationValueSet(Map aValueSet) throws MirLocalizerExc, MirLocalizerFailure { try { Iterator i; Map configMap = new HashMap(); - Map utilityMap = new HashMap(); logger = new LoggerWrapper("Localizer.ProducerAssistant"); @@ -67,7 +97,7 @@ public class MirBasicProducerAssistantLocalizer implements MirProducerAssistantL configMap.put("openAction", MirGlobal.config().getString("Producer.OpenAction")); configMap.put("docRoot", MirGlobal.config().getString("RootUri")); configMap.put("actionRoot", MirGlobal.config().getString("RootUri") + "/servlet/Mir"); - configMap.put("now", new DateToMapAdapter( (new GregorianCalendar()).getTime())); + configMap.put("now", new GeneratorFormatAdapters.DateFormatAdapter(new GregorianCalendar().getTime(), MirGlobal.config().getString("Mir.DefaultTimezone"))); configMap.put("videoHost", MirGlobal.config().getString("Producer.Video.Host")); configMap.put("audioHost", MirGlobal.config().getString("Producer.Audio.Host")); configMap.put("imageHost", MirGlobal.config().getString("Producer.Image.Host")); @@ -78,21 +108,9 @@ public class MirBasicProducerAssistantLocalizer implements MirProducerAssistantL // "new": configMap.putAll(MirPropertiesConfiguration.instance().allSettings()); - utilityMap.put("compressWhitespace", new freemarker.template.utility.CompressWhitespace()); - utilityMap.put("encodeHTML", new GeneratorHTMLFunctions.encodeHTMLGeneratorFunction()); - utilityMap.put("encodeXML", new GeneratorHTMLFunctions.encodeXMLGeneratorFunction()); - utilityMap.put("encodeURI", new GeneratorHTMLFunctions.encodeURIGeneratorFunction()); - utilityMap.put("subString", new GeneratorStringFunctions.subStringFunction()); - utilityMap.put("subList", new GeneratorListFunctions.subListFunction()); - utilityMap.put("isOdd", new GeneratorIntegerFunctions.isOddFunction()); - utilityMap.put("increment", new GeneratorIntegerFunctions.incrementFunction()); - utilityMap.put("evaluate", new GeneratorExpressionFunctions.evaluateExpressionFunction()); - utilityMap.put("constructString", new GeneratorStringFunctions.constructStructuredStringFunction()); - utilityMap.put("escapeJDBCString", new GeneratorStringFunctions.jdbcStringEscapeFunction()); - utilityMap.put("regexpreplace", new GeneratorRegularExpressionFunctions.regularExpressionReplaceFunction()); - aValueSet.put("config", configMap); - aValueSet.put("utility", utilityMap); + + aValueSet.put("utility", new Utility()); aValueSet.put("languages", new EntityIteratorAdapter("", "", 20, MirGlobal.localizer().dataModel().adapterModel(), "language")); @@ -123,25 +141,238 @@ public class MirBasicProducerAssistantLocalizer implements MirProducerAssistantL commentStatusMap.put(commentStatus.get("name"), commentStatus.get("id")); } aValueSet.put("commentstatus", commentStatusMap); + aValueSet.put("languageCodeToId", new getLanguageIdFunction()); } catch (Throwable t) { logger.error("initializeGenerationValueSet: Exception while collecting comment statuses" + t.getMessage()); - throw new RuntimeException(t.getMessage()); + + throw new MirLocalizerFailure(t); } - }; + } + + public static class getLanguageIdFunction implements Generator.Function { + private Map languageCodeToId; + private String otherLanguageId; + private LoggerWrapper logger = new LoggerWrapper("Localizer.Earth.getLanguageIdFunction"); - public String filterNonHTMLText(String aText) { - return StringUtil.createHTML( - StringUtil.removeHTMLTags(aText), - MirGlobal.config().getString("Producer.ImageRoot"), - MirGlobal.config().getString("Producer.MailLinkName"), - MirGlobal.config().getString("Producer.ExtLinkName"), - MirGlobal.config().getString("Producer.IntLinkName") - ); + public getLanguageIdFunction() throws MirLocalizerFailure { + try { + otherLanguageId = ""; + languageCodeToId = new HashMap(); + + Iterator i = new EntityIteratorAdapter("", "", 20, MirGlobal.localizer().dataModel().adapterModel(), "language"); + while (i.hasNext()) { + EntityAdapter language = (EntityAdapter) i.next(); + if (language.get("code").equals("ot")) + otherLanguageId = (String) language.get("id"); + + languageCodeToId.put(language.get("code"), language.get("id")); + } + } + catch (Throwable t) { + logger.error(t.toString()); + + throw new MirLocalizerFailure(t); + } + } + + public Object perform(List aParameters) throws GeneratorExc, GeneratorFailure { + try { + if (aParameters.size() != 1) + throw new GeneratorExc("getLanguageIdFunction: 1 parameter expected: language-code"); + + String result = (String) languageCodeToId.get(aParameters.get(0)); + if (result == null) + result = otherLanguageId; + + return result; + } + catch (GeneratorExc e) { + throw e; + } + catch (Throwable t) { + throw new GeneratorFailure("getLanguageIdFunction: " + t.getMessage(), t); + } + } } + + public String filterNonHTMLText(String aText) { + + logger.debug("about to filter non HTML Text of length " + aText.length()); + try { + String result = + StringUtil.createHTML( + StringUtil.removeHTMLTags(aText), + MirGlobal.config().getString("Producer.ImageRoot"), + MirGlobal.config().getString("Producer.MailLinkName"), + MirGlobal.config().getString("Producer.ExtLinkName"), + MirGlobal.config().getString("Producer.IntLinkName") + ); + logger.debug("done filtering non-HTML text "); + return result; + } + catch (Throwable t) { + logger.error("error while filtering non-HTML text: " + t.toString()); + + throw new RuntimeException(t.toString()); + } + } public String filterHTMLText(String aText) { - return StringUtil.deleteForbiddenTags(aText); + try { + StringWriter out = new StringWriter(); + Tidy tidy = new Tidy(); + ByteArrayInputStream in = new ByteArrayInputStream(aText.getBytes("UTF8")); + tidy.setMakeClean(true); + tidy.setCharEncoding(Configuration.UTF8); + tidy.setErrout(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE)); + print(tidy.parseDOM(in, null), out); + + return out.toString(); + } + catch (IOException e) { + return e.getMessage(); + } + } + + + private String[] badAttributeValuePrefixes= {"javascript","vbscript","about","wysiwyg","data","view-source","ms-its","mhtml","shell","lynxexec","lynxcgi","hcp","ms-help","help","disk","vnd.ms.radio","opera","res","resource","chrome","mocha","livescript"}; + + + private String[] badAttributes = {"onabort", "onblur", "onchange", "onclick", "ondblclick", "onerror", "onfocus", "onkeydown", "onKeypress", "onkeyup", "onload", "onmousedown", "onmousemove", "onmouseout", "onmouseover", "onmouseup", "onreset", "onselect", "onsubmit", "onunload","onload","onclick","onfocus","onblur","style","height","width"}; + + private boolean isBadAttr(String attrName){ + for (int i=0;i'); + } + NodeList children = node.getChildNodes(); + if (children != null) { + int len = children.getLength(); + for (int i = 0; i < len; i++) { + print(children.item(i), out); + } + } + break; + + case Node.TEXT_NODE: + String value=node.getNodeValue(); + try{ + value=regularExpressionLT.substituteAll(value, "<"); + value=regularExpressionGT.substituteAll(value, ">"); + } + catch (Throwable t){ + value=""; + } + out.write(value); + + break; + + } + + if (type == Node.ELEMENT_NODE && canOutput && node.getChildNodes()!=null && node.getChildNodes().getLength()>0) { + out.write("'); + } + + out.flush(); + } + + public static class Utility extends ReflectionGeneratorFunctionsAdapter { + public Utility () { + super(new MirBasicUtilityFunctions()); + } + + public Object getDatetime() { + return new GeneratorDateTimeFunctions.DateTimeFunctions( + MirPropertiesConfiguration.instance().getString("Mir.DefaultTimezone")); + } + + public Object getCompressWhitespace() { + return new freemarker.template.utility.CompressWhitespace(); + } } }