1 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 ; 27 import javax.xml.transform.sax.SAXTransformerFactory ; 28 import javax.xml.transform.stream.StreamResult ; 29 import javax.xml.parsers.SAXParserFactory ; 30 import javax.xml.parsers.SAXParser ; 31 import java.util.Locale ; 32 import java.util.Stack ; 33 import java.io.StringWriter ; 34 import java.io.ByteArrayInputStream ; 35 import java.io.File ; 36 import java.io.FileInputStream ; 37 38 42 public class Upgrade1 { 43 private SAXTransformerFactory transformerFactory = (SAXTransformerFactory )SAXTransformerFactory.newInstance(); 44 private HtmlCleanerTemplate htmlCleanerTemplate; 45 private String daisyUser = "testuser"; 46 private String daisyPassword = "testuser"; 47 private String daisyURL = "http://localhost:9263"; 48 49 public static void main(String [] args) throws Exception { 50 new Upgrade1().run(); 51 } 52 53 public void run() throws Exception { 54 File htmlCleanerConfig = new File ("../daisywiki/frontend/src/cocoon/webapp/daisy/resources/conf/htmlcleaner.xml"); 55 htmlCleanerTemplate = new HtmlCleanerFactory().buildTemplate(new InputSource(new FileInputStream (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 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 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 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 htmlData) throws Exception { 100 HtmlCleaner cleaner = htmlCleanerTemplate.newHtmlCleaner(); 101 return cleaner.cleanToByteArray(htmlData); 102 } 103 104 private String performUpdate(byte[] data) throws Exception { 105 TransformerHandler serializer = transformerFactory.newTransformerHandler(); 106 StringWriter writer = new StringWriter (); 107 serializer.setResult(new StreamResult (writer)); 108 109 SAXParserFactory parserFactory = SAXParserFactory.newInstance(); 110 parserFactory.setNamespaceAware(true); 111 SAXParser parser = parserFactory.newSAXParser(); 112 UpdateHandler updateHandler = new UpdateHandler(serializer); 113 parser.getXMLReader().setContentHandler(updateHandler); 114 parser.getXMLReader().parse(new InputSource(new ByteArrayInputStream (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 elementChanges = new Stack (); 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 prefix) throws SAXException { 148 consumer.endPrefixMapping(prefix); 149 } 150 151 public void skippedEntity(String 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 target, String data) throws SAXException { 160 consumer.processingInstruction(target, data); 161 } 162 163 public void startPrefixMapping(String prefix, String uri) throws SAXException { 164 consumer.startPrefixMapping(prefix, uri); 165 } 166 167 168 public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { 169 boolean needsChange = false; 170 if (namespaceURI.equals("") && localName.equals("p")) { 171 String 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 namespaceURI, String localName, String qName) throws SAXException { 188 boolean needsChange = ((Boolean )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 |