| /************************************************************************ |
| * |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER |
| * |
| * Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved. |
| * |
| * Use is subject to license terms. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy |
| * of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also |
| * obtain a copy of the License at http://odftoolkit.org/docs/license.txt |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| ************************************************************************//* |
| package org.odftoolkit.odfdom.pkg; |
| |
| import java.util.Map; |
| import org.odftoolkit.odfdom.pkg.manifest.Algorithm; |
| import org.odftoolkit.odfdom.pkg.manifest.EncryptionData; |
| import org.odftoolkit.odfdom.pkg.manifest.KeyDerivation; |
| import org.odftoolkit.odfdom.pkg.manifest.OdfFileEntry; |
| import org.xml.sax.Attributes; |
| import org.xml.sax.ContentHandler; |
| import org.xml.sax.Locator; |
| import org.xml.sax.SAXException; |
| |
| class OdfManifestSaxHandler implements ContentHandler { |
| |
| private OdfFileEntry _currentFileEntry; |
| private EncryptionData _currentEncryptionData; |
| private OdfPackage mPackage; |
| private static final String EMPTY_STRING = ""; |
| |
| public OdfManifestSaxHandler(OdfPackage pkg) { |
| mPackage = pkg; |
| } |
| |
| *//** |
| * Receive an object for locating the origin of SAX document events. |
| *//* |
| public void setDocumentLocator(Locator locator) { |
| } |
| |
| *//** |
| * Receive notification of the beginning of a document. |
| *//* |
| public void startDocument() throws SAXException { |
| } |
| |
| *//** |
| * Receive notification of the end of a document. |
| *//* |
| public void endDocument() throws SAXException { |
| } |
| |
| *//** |
| * Begin the scope of a prefix-URI Namespace mapping. |
| *//* |
| public void startPrefixMapping(String prefix, String uri) |
| throws SAXException { |
| } |
| |
| *//** |
| * End the scope of a prefix-URI mapping. |
| *//* |
| public void endPrefixMapping(String prefix) throws SAXException { |
| } |
| |
| *//** |
| * Receive notification of the beginning of an element. |
| *//* |
| public void startElement(String namespaceURI, String localName, |
| String qName, Attributes atts) throws SAXException { |
| Map<String, OdfFileEntry> entries = mPackage.getManifestEntries(); |
| |
| if (localName.equals("file-entry")) { |
| String path = atts.getValue("manifest:full-path"); |
| if (path.equals(EMPTY_STRING)) { |
| if(mPackage.getErrorHandler() != null){ |
| mPackage.logValidationError(OdfPackageConstraint.MANIFEST_WITH_EMPTY_PATH, mPackage.getBaseURI()); |
| } |
| } |
| path = OdfPackage.normalizePath(path); |
| _currentFileEntry = entries.get(path); |
| if (_currentFileEntry == null) { |
| _currentFileEntry = new OdfFileEntry(); |
| } |
| if (path != null) { |
| entries.put(path, _currentFileEntry); |
| } |
| _currentFileEntry.setPath(atts.getValue("manifest:full-path")); |
| _currentFileEntry.setMediaTypeString(atts.getValue("manifest:media-type")); |
| if (atts.getValue("manifest:size") != null) { |
| try { |
| _currentFileEntry.setSize(Integer.parseInt(atts.getValue("manifest:size"))); |
| } catch (NumberFormatException nfe) { |
| throw new SAXException("not a number: " |
| + atts.getValue("manifest:size") + nfe.getMessage()); |
| } |
| } |
| } else if (localName.equals("encryption-data")) { |
| _currentEncryptionData = new EncryptionData(); |
| if (_currentFileEntry != null) { |
| _currentEncryptionData.setChecksumType(atts.getValue("manifest:checksum-type")); |
| _currentEncryptionData.setChecksum(atts.getValue("manifest:checksum")); |
| _currentFileEntry.setEncryptionData(_currentEncryptionData); |
| } |
| } else if (localName.equals("algorithm")) { |
| Algorithm algorithm = new Algorithm(); |
| algorithm.setName(atts.getValue("manifest:algorithm-name")); |
| algorithm.setInitializationVector(atts.getValue("manifest:initialization-vector")); |
| if (_currentEncryptionData != null) { |
| _currentEncryptionData.setAlgorithm(algorithm); |
| } |
| } else if (localName.equals("key-derivation")) { |
| KeyDerivation keyDerivation = new KeyDerivation(); |
| keyDerivation.setName(atts.getValue("manifest:key-derivation-name")); |
| keyDerivation.setSalt(atts.getValue("manifest:salt")); |
| if (atts.getValue("manifest:iteration-count") != null) { |
| try { |
| keyDerivation.setIterationCount(Integer.parseInt(atts.getValue("manifest:iteration-count"))); |
| } catch (NumberFormatException nfe) { |
| throw new SAXException("not a number: " |
| + atts.getValue("manifest:iteration-count")); |
| } |
| } |
| if (_currentEncryptionData != null) { |
| _currentEncryptionData.setKeyDerivation(keyDerivation); |
| } |
| }else if (localName.equals("manifest")) { |
| mPackage.setManifestVersion(atts.getValue("manifest:version")); |
| } |
| |
| } |
| |
| *//** |
| * Receive notification of the end of an element. |
| *//* |
| public void endElement(String namespaceURI, String localName, |
| String qName) throws SAXException { |
| //ToDo Issue 263: Parsing of Manifest.xml specific part to be added to parser |
| if (localName.equals("encryption-data")) { |
| _currentEncryptionData = null; |
| } |
| } |
| |
| *//** |
| * Receive notification of character data. |
| *//* |
| public void characters(char[] ch, int start, int length) |
| throws SAXException { |
| } |
| |
| *//** |
| * Receive notification of ignorable whitespace in element content. |
| *//* |
| public void ignorableWhitespace(char[] ch, int start, int length) |
| throws SAXException { |
| } |
| |
| *//** |
| * Receive notification of a processing instruction. |
| *//* |
| public void processingInstruction(String target, String data) |
| throws SAXException { |
| } |
| |
| *//** |
| * Receive notification of a skipped entity. |
| *//* |
| public void skippedEntity(String name) throws SAXException { |
| } |
| } |
| */ |