1 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 ; 27 import org.xml.sax.SAXException ; 28 import org.outerj.daisy.frontend.util.TaggedMessage; 29 30 import java.io.StringReader ; 31 import java.util.*; 32 import java.lang.reflect.Method ; 33 import java.lang.reflect.InvocationTargetException ; 34 35 public class XmlBeansConvertor implements Convertor { 36 private Method parseMethod; 37 38 public XmlBeansConvertor(Method parseMethod) { 39 this.parseMethod = parseMethod; 40 } 41 42 public ConversionResult convertFromString(String 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 [] {new StringReader (value), xmlOptions}); 53 54 xmlOptions = new XmlOptions(); 55 xmlOptions.setErrorListener(errors); 56 valid = document.validate(xmlOptions); 57 } catch (InvocationTargetException e) { 58 Throwable 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 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 convertToString(Object o, Locale locale, Convertor.FormatCache formatCache) { 87 return (String )o; 88 } 89 90 public Class getTypeClass() { 91 return java.lang.String .class; 92 } 93 94 public void generateSaxFragment(ContentHandler contentHandler, Locale locale) throws SAXException { 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 contentHandler) throws SAXException { 105 Iterator messagesIt = messages.iterator(); 106 while (messagesIt.hasNext()) { 107 ((XMLizable)messagesIt.next()).toSAX(contentHandler); 108 } 109 } 110 } 111 112 } 113 | Popular Tags |