1 16 package org.outerj.daisy.frontend.editor; 17 18 import org.apache.cocoon.forms.formmodel.Form; 19 import org.apache.cocoon.forms.formmodel.Repeater; 20 import org.apache.cocoon.forms.formmodel.Field; 21 import org.apache.cocoon.forms.validation.ValidationErrorAware; 22 import org.apache.cocoon.forms.validation.ValidationError; 23 import org.apache.avalon.framework.service.ServiceManager; 24 import org.apache.avalon.framework.context.Context; 25 import org.apache.xmlbeans.XmlObject; 26 import org.apache.xmlbeans.XmlCursor; 27 import org.apache.xmlbeans.XmlOptions; 28 import org.outerj.daisy.repository.schema.PartTypeUse; 29 import org.outerj.daisy.repository.Document; 30 import org.outerj.daisy.repository.Part; 31 import org.outerj.daisy.repository.Repository; 32 import org.outerj.daisy.frontend.util.FormHelper; 33 import org.outerj.daisy.books.publisher.impl.util.XMLPropertiesHelper; 34 import org.xml.sax.InputSource ; 35 36 import java.io.ByteArrayInputStream ; 37 import java.io.StringReader ; 38 import java.util.Map ; 39 import java.util.Iterator ; 40 41 44 public class BookMetadataPartEditor implements PartEditor { 45 private final ServiceManager serviceManager; 46 47 private BookMetadataPartEditor(ServiceManager serviceManager) { 48 this.serviceManager = serviceManager; 49 } 50 51 public static class Factory implements PartEditorFactory { 52 public PartEditor getPartEditor(Map properties, ServiceManager serviceManager, Context context) { 53 return new BookMetadataPartEditor(serviceManager); 54 } 55 } 56 57 public Form getForm(PartTypeUse partTypeUse, DocumentEditorForm documentEditorForm, Repository repository) throws Exception { 58 final Form form = FormHelper.createForm(serviceManager, "resources/form/parteditor_bookmeta_definition.xml"); 59 60 Field editMode = (Field)form.getChild("editmode"); 61 editMode.setValue("gui"); 62 editMode.addValueChangedListener(new EditModeListener(new EditModeListener.EditModeListenerConfig() { 63 public String getXmlFieldPath() { 64 return "editors/xml/metadataXml"; 65 } 66 67 public String getXmlFromGuiEditor() { 68 return getMetadataXml((Repeater)form.lookupWidget("editors/gui/metadata")); 69 } 70 71 public boolean loadGui(String xml) { 72 Map metadata; 73 try { 74 metadata = XMLPropertiesHelper.load(new InputSource (new StringReader (xml)), null, "metadata"); 75 } catch (Exception e) { 76 ((ValidationErrorAware)form.lookupWidget(getXmlFieldPath())).setValidationError(new ValidationError(e.toString(), false)); 78 return false; 79 } 80 Repeater repeater = (Repeater)form.lookupWidget("editors/gui/metadata"); 81 repeater.clear(); 82 loadRepeater(repeater, metadata); 83 return true; 84 } 85 86 public void clearGui() { 87 Repeater repeater = (Repeater)form.lookupWidget("editors/gui/metadata"); 88 repeater.clear(); 89 } 90 })); 91 92 Repeater repeater = (Repeater)form.lookupWidget("editors/gui/metadata"); 94 Repeater.RepeaterRow row = repeater.addRow(); 95 row.getChild("name").setValue("title"); 96 row.getChild("value").setValue("enter book title here"); 97 row = repeater.addRow(); 98 row.getChild("name").setValue("locale"); 99 row.getChild("value").setValue("en"); 100 101 return form; 102 } 103 104 public String getFormTemplate() { 105 return "resources/form/parteditor_bookmeta_template.xml"; 106 } 107 108 public void load(Form form, Document document, Part part, Repository repository) throws Exception { 109 Repeater repeater = (Repeater)form.lookupWidget("editors/gui/metadata"); 110 repeater.clear(); 111 112 byte[] data = part.getData(); 113 114 Map metadata = null; 115 try { 116 metadata = XMLPropertiesHelper.load(new ByteArrayInputStream (data), "metadata"); 117 } catch (Throwable e) { 118 } 120 121 if (metadata != null) { 122 loadRepeater(repeater, metadata); 123 } else { 124 form.setAttribute("ignore-editmode-change", Boolean.TRUE); 126 form.getChild("editmode").setValue("xml"); 127 form.lookupWidget("editors/xml/metadataXml").setValue(new String (data, "UTF-8")); 129 } 130 } 131 132 public void save(Form form, Document document) throws Exception { 133 Field editMode = (Field)form.getChild("editmode"); 134 if (editMode.getValue().equals("xml")) { 135 PartEditorHelper.save(form, document, "editors/xml/metadataXml", "text/xml"); 136 } else if (editMode.getValue().equals("gui")) { 137 Repeater repeater = (Repeater)form.lookupWidget("editors/gui/metadata"); 138 String xml = getMetadataXml(repeater); 139 PartEditorHelper.save(form, document, null, xml.getBytes("UTF-8"), "text/xml"); 140 } 141 } 142 143 private static String getMetadataXml(Repeater repeater) { 144 XmlObject xml = XmlObject.Factory.newInstance(); 145 XmlCursor cursor = xml.newCursor(); 146 cursor.toNextToken(); 147 cursor.beginElement("metadata"); 148 149 for (int i = 0; i < repeater.getSize(); i++) { 150 Repeater.RepeaterRow row = repeater.getRow(i); 151 String name = (String )row.getChild("name").getValue(); 152 if (name == null) 153 name = ""; 154 String value = (String )row.getChild("value").getValue(); 155 if (value == null) 156 value = ""; 157 cursor.beginElement("entry"); 158 cursor.insertAttributeWithValue("key", name); 159 cursor.insertChars(value); 160 cursor.toEndToken(); 161 cursor.toNextToken(); 162 } 163 cursor.dispose(); 164 165 XmlOptions xmlOptions = new XmlOptions(); 166 xmlOptions.setSavePrettyPrint(); 167 xmlOptions.setCharacterEncoding("UTF-8"); 168 return xml.xmlText(xmlOptions); 169 } 170 171 private static void loadRepeater(Repeater repeater, Map metadata) { 172 Iterator metadataIt = metadata.entrySet().iterator(); 173 while (metadataIt.hasNext()) { 174 Map.Entry entry = (Map.Entry )metadataIt.next(); 175 Repeater.RepeaterRow row = repeater.addRow(); 176 row.getChild("name").setValue(entry.getKey()); 177 row.getChild("value").setValue(entry.getValue()); 178 } 179 } 180 } 181 | Popular Tags |