From 683d490074d93baa8a47db7ec43b7bd31145a12a Mon Sep 17 00:00:00 2001 From: Mark Donszelmann Date: Thu, 5 Nov 2009 23:00:15 +0100 Subject: Tar file expanded and committed --- .../cpptasks/apple/PropertyListSerialization.java | 235 +++++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 src/main/java/net/sf/antcontrib/cpptasks/apple/PropertyListSerialization.java (limited to 'src/main/java/net/sf/antcontrib/cpptasks/apple/PropertyListSerialization.java') diff --git a/src/main/java/net/sf/antcontrib/cpptasks/apple/PropertyListSerialization.java b/src/main/java/net/sf/antcontrib/cpptasks/apple/PropertyListSerialization.java new file mode 100644 index 0000000..c3a6807 --- /dev/null +++ b/src/main/java/net/sf/antcontrib/cpptasks/apple/PropertyListSerialization.java @@ -0,0 +1,235 @@ +/* + * Licensed to the Ant-Contrib Project under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The Ant-Contrib licenses this file to You 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 + * + * 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 net.sf.antcontrib.cpptasks.apple; + +import org.xml.sax.ContentHandler; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.AttributesImpl; + +import javax.xml.transform.Result; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.sax.SAXTransformerFactory; +import javax.xml.transform.sax.TransformerHandler; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.io.File; +import java.io.IOException; +import java.io.FileOutputStream; + +/** + * Static class that provides methods to serialize + * a Map to a Cocoa XML Property List. Does not currently support + * date or data elements. + */ +public final class PropertyListSerialization { + /** + * Private constructor. + */ + private PropertyListSerialization() { + + } + + /** + * Serializes a property list into a Cocoa XML Property List document. + * @param propertyList property list. + * @param file destination. + * @param comments comments to insert into document. + * @throws SAXException if exception during serialization. + * @throws TransformerConfigurationException if exception creating serializer. + */ + public static void serialize(final Map propertyList, + final List comments, + final File file) + throws IOException, SAXException, + TransformerConfigurationException { + SAXTransformerFactory sf = (SAXTransformerFactory) + SAXTransformerFactory.newInstance(); + TransformerHandler handler = sf.newTransformerHandler(); + + FileOutputStream os = new FileOutputStream(file); + StreamResult result = new StreamResult(os); + handler.setResult(result); + + handler.startDocument(); + for(Iterator iter = comments.iterator(); iter.hasNext();) { + char[] comment = String.valueOf(iter.next()).toCharArray(); + handler.comment(comment, 0, comment.length); + } + AttributesImpl attributes = new AttributesImpl(); + handler.startElement(null, "plist", "plist", attributes); + serializeMap(propertyList, handler); + handler.endElement(null, "plist", "plist"); + + handler.endDocument(); + } + + /** + * Serialize a map as a dict element. + * @param map map to serialize. + * @param handler destination of serialization events. + * @throws SAXException if exception during serialization. + */ + private static void serializeMap(final Map map, + final ContentHandler handler) + throws SAXException { + AttributesImpl attributes = new AttributesImpl(); + handler.startElement(null, "dict", "dict", attributes); + + if (map.size() > 0) { + // + // need to output with sorted keys to maintain + // reproducability + // + Object[] keys = map.keySet().toArray(); + Arrays.sort(keys); + for(int i = 0; i < keys.length; i++) { + String key = String.valueOf(keys[i]); + handler.startElement(null, "key", "key", attributes); + handler.characters(key.toCharArray(), 0, key.length()); + handler.endElement(null, "key", "key"); + serializeObject(map.get(keys[i]), handler); + } + } + handler.endElement(null, "dict", "dict"); + } + + /** + * Serialize a list as an array element. + * @param list list to serialize. + * @param handler destination of serialization events. + * @throws SAXException if exception during serialization. + */ + private static void serializeList(final List list, + final ContentHandler handler) + throws SAXException { + AttributesImpl attributes = new AttributesImpl(); + handler.startElement(null, "array", "array", attributes); + for(Iterator iter = list.iterator();iter.hasNext();) { + serializeObject(iter.next(), handler); + } + handler.endElement(null, "array", "array"); + } + + /** + * Creates an element with the specified tag name and character content. + * @param tag tag name. + * @param content character content. + * @param handler destination of serialization events. + * @throws SAXException if exception during serialization. + */ + private static void serializeElement(final String tag, + final String content, + final ContentHandler handler) + throws SAXException { + AttributesImpl attributes = new AttributesImpl(); + handler.startElement(null, tag, tag, attributes); + handler.characters(content.toCharArray(), 0, content.length()); + handler.endElement(null, tag, tag); + } + + + /** + * Serialize a Number as an integer element. + * @param integer number to serialize. + * @param handler destination of serialization events. + * @throws SAXException if exception during serialization. + */ + private static void serializeInteger(final Number integer, + final ContentHandler handler) + throws SAXException { + serializeElement("integer", String.valueOf(integer.longValue()), + handler); + } + + /** + * Serialize a Number as a real element. + * @param real number to serialize. + * @param handler destination of serialization events. + * @throws SAXException if exception during serialization. + */ + private static void serializeReal(final Number real, + final ContentHandler handler) + throws SAXException { + serializeElement("real", + String.valueOf(real.doubleValue()), + handler); + } + + + /** + * Serialize a Boolean as a true or false element. + * @param val boolean to serialize. + * @param handler destination of serialization events. + * @throws SAXException if exception during serialization. + */ + private static void serializeBoolean(final Boolean val, + final ContentHandler handler) + throws SAXException { + String tag = "false"; + if (val.booleanValue()) { + tag = "true"; + } + AttributesImpl attributes = new AttributesImpl(); + handler.startElement(null, tag, tag, attributes); + handler.endElement(null, tag, tag); + } + + /** + * Serialize a string as a string element. + * @param val string to serialize. + * @param handler destination of serialization events. + * @throws SAXException if exception during serialization. + */ + private static void serializeString(final String val, + final ContentHandler handler) + throws SAXException { + serializeElement("string", + val, + handler); + } + + + /** + * Serialize an object using the best available element. + * @param obj object to serialize. + * @param handler destination of serialization events. + * @throws SAXException if exception during serialization. + */ + private static void serializeObject(final Object obj, + final ContentHandler handler) + throws SAXException { + if (obj instanceof Map) { + serializeMap((Map) obj, handler); + } else if (obj instanceof List) { + serializeList((List) obj, handler); + } else if (obj instanceof Number) { + if(obj instanceof Double + ||obj instanceof Float) { + serializeReal((Number) obj, handler); + } else { + serializeInteger((Number) obj, handler); + } + } else if (obj instanceof Boolean) { + serializeBoolean((Boolean) obj, handler); + } else { + serializeString(String.valueOf(obj), handler); + } + } +} -- cgit v1.2.3