001: /**
002: * Copyright (c) 2003-2006, www.pdfbox.org
003: * All rights reserved.
004: *
005: * Redistribution and use in source and binary forms, with or without
006: * modification, are permitted provided that the following conditions are met:
007: *
008: * 1. Redistributions of source code must retain the above copyright notice,
009: * this list of conditions and the following disclaimer.
010: * 2. Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: * 3. Neither the name of pdfbox; nor the names of its
014: * contributors may be used to endorse or promote products derived from this
015: * software without specific prior written permission.
016: *
017: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
018: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
019: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
020: * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
021: * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
022: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
023: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
024: * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
025: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
026: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
027: *
028: * http://www.pdfbox.org
029: *
030: */package org.pdfbox.pdmodel.common;
031:
032: import org.pdfbox.cos.COSBase;
033: import org.pdfbox.cos.COSBoolean;
034: import org.pdfbox.cos.COSDictionary;
035: import org.pdfbox.cos.COSFloat;
036: import org.pdfbox.cos.COSInteger;
037: import org.pdfbox.cos.COSName;
038: import org.pdfbox.cos.COSString;
039:
040: import java.io.IOException;
041:
042: import java.util.Collection;
043: import java.util.HashMap;
044: import java.util.Iterator;
045: import java.util.Map;
046: import java.util.Set;
047:
048: /**
049: * This is a Map that will automatically sync the contents to a COSDictionary.
050: *
051: * @author <a href="mailto:ben@benlitchfield.com">Ben Litchfield</a>
052: * @version $Revision: 1.10 $
053: */
054: public class COSDictionaryMap implements Map {
055: private COSDictionary map;
056: private Map actuals;
057:
058: /**
059: * Constructor for this map.
060: *
061: * @param actualsMap The map with standard java objects as values.
062: * @param dicMap The map with COSBase objects as values.
063: */
064: public COSDictionaryMap(Map actualsMap, COSDictionary dicMap) {
065: actuals = actualsMap;
066: map = dicMap;
067: }
068:
069: /**
070: * {@inheritDoc}
071: */
072: public int size() {
073: return map.size();
074: }
075:
076: /**
077: * {@inheritDoc}
078: */
079: public boolean isEmpty() {
080: return size() == 0;
081: }
082:
083: /**
084: * {@inheritDoc}
085: */
086: public boolean containsKey(Object key) {
087: return map.keyList().contains(key);
088: }
089:
090: /**
091: * {@inheritDoc}
092: */
093: public boolean containsValue(Object value) {
094: return actuals.containsValue(value);
095: }
096:
097: /**
098: * {@inheritDoc}
099: */
100: public Object get(Object key) {
101: return actuals.get(key);
102: }
103:
104: /**
105: * {@inheritDoc}
106: */
107: public Object put(Object key, Object value) {
108: COSObjectable object = (COSObjectable) value;
109:
110: map.setItem(COSName.getPDFName((String) key), object
111: .getCOSObject());
112: return actuals.put(key, value);
113: }
114:
115: /**
116: * {@inheritDoc}
117: */
118: public Object remove(Object key) {
119: map.removeItem(COSName.getPDFName((String) key));
120: return actuals.remove(key);
121: }
122:
123: /**
124: * {@inheritDoc}
125: */
126: public void putAll(Map t) {
127: throw new RuntimeException("Not yet implemented");
128: }
129:
130: /**
131: * {@inheritDoc}
132: */
133: public void clear() {
134: map.clear();
135: actuals.clear();
136: }
137:
138: /**
139: * {@inheritDoc}
140: */
141: public Set keySet() {
142: return actuals.keySet();
143: }
144:
145: /**
146: * {@inheritDoc}
147: */
148: public Collection values() {
149: return actuals.values();
150: }
151:
152: /**
153: * {@inheritDoc}
154: */
155: public Set entrySet() {
156: throw new RuntimeException("Not yet implemented");
157: }
158:
159: /**
160: * {@inheritDoc}
161: */
162: public boolean equals(Object o) {
163: boolean retval = false;
164: if (o instanceof COSDictionaryMap) {
165: COSDictionaryMap other = (COSDictionaryMap) o;
166: retval = other.map.equals(this .map);
167: }
168: return retval;
169: }
170:
171: /**
172: * {@inheritDoc}
173: */
174: public String toString() {
175: return actuals.toString();
176: }
177:
178: /**
179: * {@inheritDoc}
180: */
181: public int hashCode() {
182: return map.hashCode();
183: }
184:
185: /**
186: * This will take a map<java.lang.String,org.pdfbox.pdmodel.COSObjectable>
187: * and convert it into a COSDictionary<COSName,COSBase>.
188: *
189: * @param someMap A map containing COSObjectables
190: *
191: * @return A proper COSDictionary
192: */
193: public static COSDictionary convert(Map someMap) {
194: Iterator iter = someMap.keySet().iterator();
195: COSDictionary dic = new COSDictionary();
196: while (iter.hasNext()) {
197: String name = (String) iter.next();
198: COSObjectable object = (COSObjectable) someMap.get(name);
199: dic
200: .setItem(COSName.getPDFName(name), object
201: .getCOSObject());
202: }
203: return dic;
204: }
205:
206: /**
207: * This will take a COS dictionary and convert it into COSDictionaryMap. All cos
208: * objects will be converted to their primitive form.
209: *
210: * @param map The COS mappings.
211: * @return A standard java map.
212: * @throws IOException If there is an error during the conversion.
213: */
214: public static COSDictionaryMap convertBasicTypesToMap(
215: COSDictionary map) throws IOException {
216: COSDictionaryMap retval = null;
217: if (map != null) {
218: Map actualMap = new HashMap();
219: Iterator keyIter = map.keyList().iterator();
220: while (keyIter.hasNext()) {
221: COSName key = (COSName) keyIter.next();
222: COSBase cosObj = map.getDictionaryObject(key);
223: Object actualObject = null;
224: if (cosObj instanceof COSString) {
225: actualObject = ((COSString) cosObj).getString();
226: } else if (cosObj instanceof COSInteger) {
227: actualObject = new Integer(((COSInteger) cosObj)
228: .intValue());
229: } else if (cosObj instanceof COSName) {
230: actualObject = ((COSName) cosObj).getName();
231: } else if (cosObj instanceof COSFloat) {
232: actualObject = new Float(((COSInteger) cosObj)
233: .floatValue());
234: } else if (cosObj instanceof COSBoolean) {
235: actualObject = ((COSBoolean) cosObj).getValue() ? Boolean.TRUE
236: : Boolean.FALSE;
237: } else {
238: throw new IOException(
239: "Error:unknown type of object to convert:"
240: + cosObj);
241: }
242: actualMap.put(key.getName(), actualObject);
243: }
244: retval = new COSDictionaryMap(actualMap, map);
245: }
246:
247: return retval;
248: }
249: }
|