[Seasar-user:3668] Re: S2JSF validatorについて
Shinpei Ohtani
[E-MAIL ADDRESS DELETED]
2006年 5月 21日 (日) 13:47:18 JST
shotです。
返事がおそくなりすいません。
contributeありがとうございます。
参考にさせてもらい、整理したうえで修正したいと思います。
06/05/20 に O.Goto<[E-MAIL ADDRESS DELETED]> さんは書きました:
> 後藤です。
>
> On Sat, 20 May 2006 01:30:29 +0900
> "Shinpei Ohtani" <[E-MAIL ADDRESS DELETED]> wrote:
>
> > shotです。
> >
> > > というわけで、<textarea>の子要素としてバリデータを追加できるようにして欲しいという要望を挙げておきます。
> > > <textarea>だけできないというのは優しくないかなと感じます。
> > > 一応自分でTagProcessorHandlerに手を入れて<textarea>の子要素にバリデータを追加できるようにしてみました。
> > > でも場当たり的な直しになってしまったので、動くことは動くのですがとても美しいとは言えない状態です。
> > > 今のところは元に戻して、上記で教えていただいた<textarea>の属性としてバリデータを指定することにしました。
> >
> > 後藤さんが手を入れた方法は、
> >
> > 1)<textarea>の子要素をPCDATAに加えて<span>も追加した改変DTDでパースする。
> > 2)TagProcessorHandler#characters()でpeekProcessor()の戻りがInputTextareaProcessorの時に
> > textがバリデータかどうかチェックしてバリデータならValidatorProcessorを作成してaddChild()する。
> >
> > の2)の方法でしょうか?
> >
> はい。2)の方法です。
>
> > 美しいかどうかよりも、ニーズが満たせるかどうかの方が大事だと思っているので、
> > もしよければ教えてください。それを元にS2JSFに修正を入れるか検討してみますので。
> >
> 以下は今回修正したパッチです。
> 自分で見ても恥ずかしい(笑)。
> 今回の私の修正は本当に場当たりな修正なので、TagProcessorTreeFactoryImplも
> 巻き込んで直した方がいいと思っています。
> 他にももっと良い方法があるように思えますし。
>
> patch start ----------------------------
> Index: /home/o-goto/eclipse/workspace/s2jsf/src/main/java/org/seasar/jsf/processor/InputTextareaProcessor.java
> ===================================================================
> --- /home/o-goto/eclipse/workspace/s2jsf/src/main/java/org/seasar/jsf/processor/InputTextareaProcessor.java (revision 2)
> +++ /home/o-goto/eclipse/workspace/s2jsf/src/main/java/org/seasar/jsf/processor/InputTextareaProcessor.java (working copy)
> @@ -28,7 +28,8 @@
> }
>
> public void addChild(TagProcessor child) {
> - if (child instanceof TextProcessor) {
> + if (child instanceof TextProcessor
> + || !(child instanceof ValidatorProcessor)) {
> return;
> }
> super.addChild(child);
> Index: /home/o-goto/eclipse/workspace/s2jsf/src/main/java/org/seasar/jsf/processor/SelectProcessor.java
> ===================================================================
> --- /home/o-goto/eclipse/workspace/s2jsf/src/main/java/org/seasar/jsf/processor/SelectProcessor.java (revision 2)
> +++ /home/o-goto/eclipse/workspace/s2jsf/src/main/java/org/seasar/jsf/processor/SelectProcessor.java (working copy)
> @@ -30,7 +30,8 @@
>
> public void addChild(TagProcessor child) {
> if (child instanceof TextProcessor
> - || getProperty(JsfConstants.ITEMS_ATTR) != null) {
> + || ((!(child instanceof ValidatorProcessor)) &&
> + getProperty(JsfConstants.ITEMS_ATTR) != null)) {
> return;
> }
> super.addChild(child);
> Index: /home/o-goto/eclipse/workspace/s2jsf/src/main/java/org/seasar/jsf/runtime/TagProcessorHandler.java
> ===================================================================
> --- /home/o-goto/eclipse/workspace/s2jsf/src/main/java/org/seasar/jsf/runtime/TagProcessorHandler.java (revision 2)
> +++ /home/o-goto/eclipse/workspace/s2jsf/src/main/java/org/seasar/jsf/runtime/TagProcessorHandler.java (working copy)
> @@ -15,8 +15,12 @@
> */
> package org.seasar.jsf.runtime;
>
> +import java.io.ByteArrayInputStream;
> +import java.io.IOException;
> import java.util.Stack;
>
> +import org.seasar.framework.exception.IORuntimeException;
> +import org.seasar.framework.exception.SAXRuntimeException;
> import org.seasar.jsf.JsfConfig;
> import org.seasar.jsf.JsfConstants;
> import org.seasar.jsf.TagProcessor;
> @@ -23,11 +27,17 @@
> import org.seasar.jsf.TagSelector;
> import org.seasar.jsf.ViewTemplateFactory;
> import org.seasar.jsf.processor.ElementProcessor;
> +import org.seasar.jsf.processor.InputTextareaProcessor;
> import org.seasar.jsf.processor.TextProcessor;
> +import org.seasar.jsf.processor.ValidatorProcessor;
> import org.seasar.jsf.processor.ViewProcessor;
> import org.xml.sax.Attributes;
> +import org.xml.sax.ContentHandler;
> +import org.xml.sax.InputSource;
> +import org.xml.sax.Locator;
> import org.xml.sax.SAXException;
> import org.xml.sax.SAXParseException;
> +import org.xml.sax.XMLReader;
> import org.xml.sax.helpers.DefaultHandler;
>
> public class TagProcessorHandler extends DefaultHandler {
> @@ -102,6 +112,18 @@
> }
>
> protected void addText(TagProcessor processor, String text) {
> + if (processor instanceof InputTextareaProcessor) {
> + try {
> + TagProcessor child = getChildProcessorForTextarea(text, processor);
> + if (child != null) {
> + return;
> + }
> + } catch (SAXException e) {
> + throw new SAXRuntimeException(e);
> + } catch (IOException e) {
> + throw new IORuntimeException(e);
> + }
> + }
> TagProcessor child = getPreviousChildProcessor(processor);
> if (child instanceof ElementProcessor) {
> ((ElementProcessor) child).addAfterContents(text);
> @@ -138,4 +160,47 @@
> public void warning(SAXParseException e) throws SAXException {
> System.err.println(e);
> }
> +
> + private TagProcessor getChildProcessorForTextarea(String text, final TagProcessor parentProcessor) throws SAXException, IOException {
> + if (text.trim().length() == 0) {
> + return null;
> + }
> + String html = "<html xmlns:m=\"http://www.seasar.org/maya\">" +
> + "<head/><body><form><input type=\"text\">" +
> + text + "</input></form></body></html>";
> + final TagProcessor[] tagProcessors = new TagProcessor[1];
> + tagProcessors[0] = null;
> + XMLReader reader = new TagProcessorTreeFactoryImpl().createReader();
> + reader.setContentHandler(new ContentHandler() {
> + public void endDocument() throws SAXException {}
> + public void startDocument() throws SAXException {}
> + public void characters(char[] ch, int start, int length) throws SAXException {}
> + public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {}
> + public void endPrefixMapping(String prefix) throws SAXException {}
> + public void skippedEntity(String name) throws SAXException {}
> + public void setDocumentLocator(Locator locator) {}
> + public void processingInstruction(String target, String data) throws SAXException {}
> + public void startPrefixMapping(String prefix, String uri) throws SAXException {}
> + public void endElement(String namespaceURI, String localName, String qName) throws SAXException {}
> + public void startElement(String namespaceURI, String localName, String qName, Attributes attributes) throws SAXException {
> + if (tagProcessors[0] != null || !localName.equals("span")) {
> + return;
> + }
> + TagSelector selector = tagSelectors.getTagSelector(namespaceURI,
> + localName, qName, attributes);
> + if (selector == null) {
> + return;
> + }
> + TagProcessor processor = selector.createProcessor();
> + if (!(processor instanceof ValidatorProcessor)) {
> + return;
> + }
> + parentProcessor.addChild(processor);
> + processor.setup(namespaceURI, localName, qName, attributes, jsfConfig);
> + tagProcessors[0] = processor;
> + }});
> + reader.parse(new InputSource(new ByteArrayInputStream(html.getBytes())));
> + return tagProcessors[0];
> + }
> +
> }
>
> patch end----------------------------
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://www.seasar.org/mailman/listinfo/seasar-user
>
--
=============================
Shinpei Ohtani
[E-MAIL ADDRESS DELETED]
=============================
Seasar-user メーリングリストの案内