KickJava   Java API By Example, From Geeks To Geeks.

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


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.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 JavaDoc;
35
36 import java.io.ByteArrayInputStream JavaDoc;
37 import java.io.StringReader JavaDoc;
38 import java.util.Map JavaDoc;
39 import java.util.Iterator JavaDoc;
40
41 /**
42  * Part editor for the book metadata.
43  */

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 JavaDoc 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 JavaDoc {
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 JavaDoc getXmlFieldPath() {
64                 return "editors/xml/metadataXml";
65             }
66
67             public String JavaDoc getXmlFromGuiEditor() {
68                 return getMetadataXml((Repeater)form.lookupWidget("editors/gui/metadata"));
69             }
70
71             public boolean loadGui(String JavaDoc xml) {
72                 Map JavaDoc metadata;
73                 try {
74                     metadata = XMLPropertiesHelper.load(new InputSource JavaDoc(new StringReader JavaDoc(xml)), null, "metadata");
75                 } catch (Exception JavaDoc e) {
76                     // TODO nicer error message?
77
((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         // set some defaults
93
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 JavaDoc 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 JavaDoc {
109         Repeater repeater = (Repeater)form.lookupWidget("editors/gui/metadata");
110         repeater.clear();
111
112         byte[] data = part.getData();
113
114         Map JavaDoc metadata = null;
115         try {
116             metadata = XMLPropertiesHelper.load(new ByteArrayInputStream JavaDoc(data), "metadata");
117         } catch (Throwable JavaDoc e) {
118             // ignore
119
}
120
121         if (metadata != null) {
122             loadRepeater(repeater, metadata);
123         } else {
124             // parsing failed
125
form.setAttribute("ignore-editmode-change", Boolean.TRUE);
126             form.getChild("editmode").setValue("xml");
127             // TODO might want to do smarter encoding detection
128
form.lookupWidget("editors/xml/metadataXml").setValue(new String JavaDoc(data, "UTF-8"));
129         }
130     }
131
132     public void save(Form form, Document document) throws Exception JavaDoc {
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 JavaDoc xml = getMetadataXml(repeater);
139             PartEditorHelper.save(form, document, null, xml.getBytes("UTF-8"), "text/xml");
140         }
141     }
142
143     private static String JavaDoc 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 JavaDoc name = (String JavaDoc)row.getChild("name").getValue();
152             if (name == null)
153                 name = "";
154             String JavaDoc value = (String JavaDoc)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 JavaDoc metadata) {
172         Iterator JavaDoc metadataIt = metadata.entrySet().iterator();
173         while (metadataIt.hasNext()) {
174             Map.Entry JavaDoc entry = (Map.Entry JavaDoc)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