KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > outerj > daisy > frontend > editor > XmlBeansConvertor


1 /*
2  * Copyright 2004 Outerthought bvba and Schaubroeck nv
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16 package org.outerj.daisy.frontend.editor;
17
18 import org.apache.cocoon.forms.validation.ValidationError;
19 import org.apache.cocoon.forms.datatype.convertor.Convertor;
20 import org.apache.cocoon.forms.datatype.convertor.ConversionResult;
21 import org.apache.xmlbeans.XmlOptions;
22 import org.apache.xmlbeans.XmlError;
23 import org.apache.xmlbeans.XmlException;
24 import org.apache.xmlbeans.XmlObject;
25 import org.apache.excalibur.xml.sax.XMLizable;
26 import org.xml.sax.ContentHandler JavaDoc;
27 import org.xml.sax.SAXException JavaDoc;
28 import org.outerj.daisy.frontend.util.TaggedMessage;
29
30 import java.io.StringReader JavaDoc;
31 import java.util.*;
32 import java.lang.reflect.Method JavaDoc;
33 import java.lang.reflect.InvocationTargetException JavaDoc;
34
35 public class XmlBeansConvertor implements Convertor {
36     private Method JavaDoc parseMethod;
37
38     public XmlBeansConvertor(Method JavaDoc parseMethod) {
39         this.parseMethod = parseMethod;
40     }
41
42     public ConversionResult convertFromString(String JavaDoc value, Locale locale, FormatCache formatCache) {
43         List errors = new ArrayList();
44         boolean valid;
45
46         XmlObject document = null;
47         try {
48             XmlOptions xmlOptions = new XmlOptions();
49             xmlOptions.setDocumentSourceName("edited xml");
50             xmlOptions.setErrorListener(errors);
51             xmlOptions.setLoadLineNumbers();
52             document = (XmlObject)parseMethod.invoke(null, new Object JavaDoc[] {new StringReader JavaDoc(value), xmlOptions});
53
54             xmlOptions = new XmlOptions();
55             xmlOptions.setErrorListener(errors);
56             valid = document.validate(xmlOptions);
57         } catch (InvocationTargetException JavaDoc e) {
58             Throwable JavaDoc targetException = e.getTargetException();
59             if (targetException instanceof XmlException) {
60                 return new ConversionResult(validationErrorForXmlErrors(((XmlException)targetException).getErrors()));
61             } else {
62                 return new ConversionResult(new ValidationError("Problem parsing navigtion tree: " + e.getMessage(), false));
63             }
64         } catch (Exception JavaDoc e) {
65             return new ConversionResult(new ValidationError("Problem parsing navigtion tree: " + e.getMessage(), false));
66         }
67
68         if (!valid) {
69             return new ConversionResult(validationErrorForXmlErrors(errors));
70         } else {
71             return new ConversionResult(document.toString());
72         }
73     }
74
75     private ValidationError validationErrorForXmlErrors(Collection xmlErrors) {
76         MultiMessage message = new MultiMessage();
77         message.addMessage(new TaggedMessage("title", "Error parsing or validating XML:"));
78         Iterator errorsIt = xmlErrors.iterator();
79         while (errorsIt.hasNext()) {
80             XmlError error = (XmlError)errorsIt.next();
81             message.addMessage(new TaggedMessage("error", error.getMessage()));
82         }
83         return new ValidationError(message);
84     }
85
86     public String JavaDoc convertToString(Object JavaDoc o, Locale locale, Convertor.FormatCache formatCache) {
87         return (String JavaDoc)o;
88     }
89
90     public Class JavaDoc getTypeClass() {
91         return java.lang.String JavaDoc.class;
92     }
93
94     public void generateSaxFragment(ContentHandler JavaDoc contentHandler, Locale locale) throws SAXException JavaDoc {
95     }
96
97     static class MultiMessage implements XMLizable {
98         private List messages = new ArrayList();
99
100         public void addMessage(XMLizable message) {
101             messages.add(message);
102         }
103
104         public void toSAX(ContentHandler JavaDoc contentHandler) throws SAXException JavaDoc {
105             Iterator messagesIt = messages.iterator();
106             while (messagesIt.hasNext()) {
107                 ((XMLizable)messagesIt.next()).toSAX(contentHandler);
108             }
109         }
110     }
111
112 }
113
Popular Tags