KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > outerj > daisy > upgrade1 > Upgrade1


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.upgrade1;
17
18 import org.outerj.daisy.repository.*;
19 import org.outerj.daisy.repository.schema.RepositorySchema;
20 import org.outerj.daisy.repository.clientimpl.RemoteRepositoryManager;
21 import org.outerj.daisy.htmlcleaner.HtmlCleaner;
22 import org.outerj.daisy.htmlcleaner.HtmlCleanerTemplate;
23 import org.outerj.daisy.htmlcleaner.HtmlCleanerFactory;
24 import org.xml.sax.*;
25
26 import javax.xml.transform.sax.TransformerHandler JavaDoc;
27 import javax.xml.transform.sax.SAXTransformerFactory JavaDoc;
28 import javax.xml.transform.stream.StreamResult JavaDoc;
29 import javax.xml.parsers.SAXParserFactory JavaDoc;
30 import javax.xml.parsers.SAXParser JavaDoc;
31 import java.util.Locale JavaDoc;
32 import java.util.Stack JavaDoc;
33 import java.io.StringWriter JavaDoc;
34 import java.io.ByteArrayInputStream JavaDoc;
35 import java.io.File JavaDoc;
36 import java.io.FileInputStream JavaDoc;
37
38 /**
39  * Program to upgrade from old <p>-tag usage for incudes, query-and-includes and queries
40  * to new <pre>-tag usage.
41  */

42 public class Upgrade1 {
43     private SAXTransformerFactory JavaDoc transformerFactory = (SAXTransformerFactory JavaDoc)SAXTransformerFactory.newInstance();
44     private HtmlCleanerTemplate htmlCleanerTemplate;
45     private String JavaDoc daisyUser = "testuser";
46     private String JavaDoc daisyPassword = "testuser";
47     private String JavaDoc daisyURL = "http://localhost:9263";
48
49     public static void main(String JavaDoc[] args) throws Exception JavaDoc {
50         new Upgrade1().run();
51     }
52
53     public void run() throws Exception JavaDoc {
54         File JavaDoc htmlCleanerConfig = new File JavaDoc("../daisywiki/frontend/src/cocoon/webapp/daisy/resources/conf/htmlcleaner.xml");
55         htmlCleanerTemplate = new HtmlCleanerFactory().buildTemplate(new InputSource(new FileInputStream JavaDoc(htmlCleanerConfig)));
56
57         Credentials credentials = new Credentials(daisyUser, daisyPassword);
58         RepositoryManager repositoryManager = new RemoteRepositoryManager(daisyURL, credentials);
59         Repository repository = repositoryManager.getRepository(credentials);
60         RepositorySchema repoSchema = repository.getRepositorySchema();
61
62         long[] documentIds = repository.getQueryManager().performQueryReturnIds("select id where true", Locale.US);
63
64         System.out.println("Will process " + documentIds.length + " documents.");
65
66         for (int i = 0; i < documentIds.length; i++) {
67             Document document = repository.getDocument(documentIds[i], true);
68             Part[] parts = document.getParts().getArray();
69             boolean docChanges = false;
70             try {
71                 for (int j = 0; j < parts.length; j++) {
72                     if (repoSchema.getPartTypeById(parts[j].getTypeId(), false).isDaisyHtml()) {
73                         byte[] data = parts[j].getData();
74                         String JavaDoc updateResult = performUpdate(data);
75                         if (updateResult != null) {
76                             byte[] updatedData = clean(performUpdate(data));
77                             document.setPart(parts[j].getTypeId(), parts[j].getMimeType(), updatedData);
78                             docChanges = true;
79                         }
80                     }
81                 }
82             } catch (Exception JavaDoc e) {
83                 System.out.println("Problem updating document " + documentIds[i] + ": " + e.toString());
84                 e.printStackTrace();
85             }
86             if (docChanges) {
87                 try {
88                     document.setNewVersionState(document.getLastVersion().getState());
89                     document.save();
90                     System.out.println("Updated document " + document.getId() + " : " + document.getName());
91                 } catch (Exception JavaDoc e) {
92                     System.out.println("Error saving changes to document " + document.getId() + ": " + e.toString());
93                     e.printStackTrace();
94                 }
95             }
96         }
97     }
98
99     private byte[] clean(String JavaDoc htmlData) throws Exception JavaDoc {
100         HtmlCleaner cleaner = htmlCleanerTemplate.newHtmlCleaner();
101         return cleaner.cleanToByteArray(htmlData);
102     }
103
104     private String JavaDoc performUpdate(byte[] data) throws Exception JavaDoc {
105         TransformerHandler JavaDoc serializer = transformerFactory.newTransformerHandler();
106         StringWriter JavaDoc writer = new StringWriter JavaDoc();
107         serializer.setResult(new StreamResult JavaDoc(writer));
108
109         SAXParserFactory JavaDoc parserFactory = SAXParserFactory.newInstance();
110         parserFactory.setNamespaceAware(true);
111         SAXParser JavaDoc parser = parserFactory.newSAXParser();
112         UpdateHandler updateHandler = new UpdateHandler(serializer);
113         parser.getXMLReader().setContentHandler(updateHandler);
114         parser.getXMLReader().parse(new InputSource(new ByteArrayInputStream JavaDoc(data)));
115
116         if (updateHandler.isChanged())
117             return writer.toString();
118         else
119             return null;
120     }
121
122     class UpdateHandler implements ContentHandler {
123         private ContentHandler consumer;
124         private Stack JavaDoc elementChanges = new Stack JavaDoc();
125         private boolean changes = false;
126
127         public UpdateHandler(ContentHandler consumer) {
128             this.consumer = consumer;
129         }
130
131         public void endDocument() throws SAXException {
132             consumer.endDocument();
133         }
134
135         public void startDocument() throws SAXException {
136             consumer.startDocument();
137         }
138
139         public void characters(char ch[], int start, int length) throws SAXException {
140             consumer.characters(ch, start, length);
141         }
142
143         public void ignorableWhitespace(char ch[], int start, int length) throws SAXException {
144             consumer.ignorableWhitespace(ch, start, length);
145         }
146
147         public void endPrefixMapping(String JavaDoc prefix) throws SAXException {
148             consumer.endPrefixMapping(prefix);
149         }
150
151         public void skippedEntity(String JavaDoc name) throws SAXException {
152             consumer.skippedEntity(name);
153         }
154
155         public void setDocumentLocator(Locator locator) {
156             consumer.setDocumentLocator(locator);
157         }
158
159         public void processingInstruction(String JavaDoc target, String JavaDoc data) throws SAXException {
160             consumer.processingInstruction(target, data);
161         }
162
163         public void startPrefixMapping(String JavaDoc prefix, String JavaDoc uri) throws SAXException {
164             consumer.startPrefixMapping(prefix, uri);
165         }
166
167
168         public void startElement(String JavaDoc namespaceURI, String JavaDoc localName, String JavaDoc qName, Attributes atts) throws SAXException {
169             boolean needsChange = false;
170             if (namespaceURI.equals("") && localName.equals("p")) {
171                 String JavaDoc clazz = atts.getValue("class");
172                 if (clazz != null && (clazz.equals("query") || clazz.equals("query-and-include") || clazz.equals("include"))) {
173                     needsChange = true;
174                     changes = true;
175                 }
176             }
177
178             if (needsChange) {
179                 consumer.startElement("", "pre", "pre", atts);
180                 elementChanges.push(Boolean.TRUE);
181             } else {
182                 consumer.startElement(namespaceURI, localName, qName, atts);
183                 elementChanges.push(Boolean.FALSE);
184             }
185         }
186
187         public void endElement(String JavaDoc namespaceURI, String JavaDoc localName, String JavaDoc qName) throws SAXException {
188             boolean needsChange = ((Boolean JavaDoc)elementChanges.pop()).booleanValue();
189
190             if (needsChange) {
191                 consumer.endElement("", "pre", "pre");
192             } else {
193                 consumer.endElement(namespaceURI, localName, qName);
194             }
195         }
196
197         public boolean isChanged() {
198             return changes;
199         }
200     }
201
202 }
203
Popular Tags