Remove some generics warnings from the HPSF custom properties and sections parts
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@898804 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
0d7ef148b5
commit
4cb27e5095
@ -49,21 +49,26 @@ import org.apache.poi.hpsf.wellknown.PropertyIDMap;
|
||||
* <p>This class is not thread-safe; concurrent access to instances of this
|
||||
* class must be synchronized.</p>
|
||||
*
|
||||
* <p>While this class is roughly HashMap<Long,CustomProperty>, that's the
|
||||
* internal representation. To external calls, it should appear as
|
||||
* HashMap<String,Object> mapping between Names and Custom Property Values.</p>
|
||||
*
|
||||
* @author Rainer Klute <a
|
||||
* href="mailto:klute@rainer-klute.de"><klute@rainer-klute.de></a>
|
||||
*/
|
||||
public class CustomProperties extends HashMap
|
||||
@SuppressWarnings("serial")
|
||||
public class CustomProperties extends HashMap<Object,CustomProperty>
|
||||
{
|
||||
|
||||
/**
|
||||
* <p>Maps property IDs to property names.</p>
|
||||
*/
|
||||
private Map dictionaryIDToName = new HashMap();
|
||||
private Map<Long,String> dictionaryIDToName = new HashMap<Long,String>();
|
||||
|
||||
/**
|
||||
* <p>Maps property names to property IDs.</p>
|
||||
*/
|
||||
private Map dictionaryNameToID = new HashMap();
|
||||
private Map<String,Long> dictionaryNameToID = new HashMap<String,Long>();
|
||||
|
||||
/**
|
||||
* <p>Tells whether this object is pure or not.</p>
|
||||
@ -71,25 +76,19 @@ public class CustomProperties extends HashMap
|
||||
private boolean isPure = true;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* <p>Puts a {@link CustomProperty} into this map. It is assumed that the
|
||||
* {@link CustomProperty} already has a valid ID. Otherwise use
|
||||
* {@link #put(CustomProperty)}.</p>
|
||||
*/
|
||||
public Object put(final Object name, final Object customProperty) throws ClassCastException
|
||||
public CustomProperty put(final String name, final CustomProperty cp)
|
||||
{
|
||||
final CustomProperty cp = (CustomProperty) customProperty;
|
||||
if (name == null)
|
||||
{
|
||||
/* Ignoring a property without a name. */
|
||||
isPure = false;
|
||||
return null;
|
||||
}
|
||||
if (!(name instanceof String))
|
||||
throw new ClassCastException("The name of a custom property must " +
|
||||
"be a java.lang.String, but it is a " +
|
||||
name.getClass().getName());
|
||||
if (!(name.equals(cp.getName())))
|
||||
throw new IllegalArgumentException("Parameter \"name\" (" + name +
|
||||
") and custom property's name (" + cp.getName() +
|
||||
@ -97,13 +96,13 @@ public class CustomProperties extends HashMap
|
||||
|
||||
/* Register name and ID in the dictionary. Mapping in both directions is possible. If there is already a */
|
||||
final Long idKey = Long.valueOf(cp.getID());
|
||||
final Object oldID = dictionaryNameToID.get(name);
|
||||
final Long oldID = dictionaryNameToID.get(name);
|
||||
dictionaryIDToName.remove(oldID);
|
||||
dictionaryNameToID.put(name, idKey);
|
||||
dictionaryIDToName.put(idKey, name);
|
||||
|
||||
/* Put the custom property into this map. */
|
||||
final Object oldCp = super.remove(oldID);
|
||||
final CustomProperty oldCp = super.remove(oldID);
|
||||
super.put(idKey, cp);
|
||||
return oldCp;
|
||||
}
|
||||
@ -138,9 +137,9 @@ public class CustomProperties extends HashMap
|
||||
else
|
||||
{
|
||||
long max = 1;
|
||||
for (final Iterator i = dictionaryIDToName.keySet().iterator(); i.hasNext();)
|
||||
for (final Iterator<Long> i = dictionaryIDToName.keySet().iterator(); i.hasNext();)
|
||||
{
|
||||
final long id = ((Long) i.next()).longValue();
|
||||
final long id = i.next().longValue();
|
||||
if (id > max)
|
||||
max = id;
|
||||
}
|
||||
@ -295,12 +294,28 @@ public class CustomProperties extends HashMap
|
||||
|
||||
/**
|
||||
* Returns a set of all the names of our
|
||||
* custom properties
|
||||
* custom properties. Equivalent to
|
||||
* {@link #nameSet()}
|
||||
*/
|
||||
public Set keySet() {
|
||||
return dictionaryNameToID.keySet();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a set of all the names of our
|
||||
* custom properties
|
||||
*/
|
||||
public Set<String> nameSet() {
|
||||
return dictionaryNameToID.keySet();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a set of all the IDs of our
|
||||
* custom properties
|
||||
*/
|
||||
public Set<String> idSet() {
|
||||
return dictionaryNameToID.keySet();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@ -325,12 +340,42 @@ public class CustomProperties extends HashMap
|
||||
*
|
||||
* @return the dictionary.
|
||||
*/
|
||||
Map getDictionary()
|
||||
Map<Long,String> getDictionary()
|
||||
{
|
||||
return dictionaryIDToName;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks against both String Name and Long ID
|
||||
*/
|
||||
public boolean containsKey(Object key) {
|
||||
if(key instanceof Long) {
|
||||
return super.containsKey((Long)key);
|
||||
}
|
||||
if(key instanceof String) {
|
||||
return super.containsKey((Long)dictionaryNameToID.get(key));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks against both the property, and its values.
|
||||
*/
|
||||
public boolean containsValue(Object value) {
|
||||
if(value instanceof CustomProperty) {
|
||||
return super.containsValue((CustomProperty)value);
|
||||
} else {
|
||||
for(CustomProperty cp : super.values()) {
|
||||
if(cp.getValue() == value) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* <p>Gets the codepage.</p>
|
||||
@ -340,9 +385,9 @@ public class CustomProperties extends HashMap
|
||||
public int getCodepage()
|
||||
{
|
||||
int codepage = -1;
|
||||
for (final Iterator i = this.values().iterator(); codepage == -1 && i.hasNext();)
|
||||
for (final Iterator<CustomProperty> i = this.values().iterator(); codepage == -1 && i.hasNext();)
|
||||
{
|
||||
final CustomProperty cp = (CustomProperty) i.next();
|
||||
final CustomProperty cp = i.next();
|
||||
if (cp.getID() == PropertyIDMap.PID_CODEPAGE)
|
||||
codepage = ((Integer) cp.getValue()).intValue();
|
||||
}
|
||||
|
@ -577,7 +577,7 @@ public class DocumentSummaryInformation extends SpecialPropertySet
|
||||
{
|
||||
cps = new CustomProperties();
|
||||
final Section section = (Section) getSections().get(1);
|
||||
final Map dictionary = section.getDictionary();
|
||||
final Map<Long,String> dictionary = section.getDictionary();
|
||||
final Property[] properties = section.getProperties();
|
||||
int propertyCount = 0;
|
||||
for (int i = 0; i < properties.length; i++)
|
||||
@ -588,7 +588,7 @@ public class DocumentSummaryInformation extends SpecialPropertySet
|
||||
{
|
||||
propertyCount++;
|
||||
final CustomProperty cp = new CustomProperty(p,
|
||||
(String) dictionary.get(Long.valueOf(id)));
|
||||
dictionary.get(Long.valueOf(id)));
|
||||
cps.put(cp.getName(), cp);
|
||||
}
|
||||
}
|
||||
@ -607,7 +607,7 @@ public class DocumentSummaryInformation extends SpecialPropertySet
|
||||
{
|
||||
ensureSection2();
|
||||
final MutableSection section = (MutableSection) getSections().get(1);
|
||||
final Map dictionary = customProperties.getDictionary();
|
||||
final Map<Long,String> dictionary = customProperties.getDictionary();
|
||||
section.clear();
|
||||
|
||||
/* Set the codepage. If both custom properties and section have a
|
||||
@ -621,9 +621,9 @@ public class DocumentSummaryInformation extends SpecialPropertySet
|
||||
customProperties.setCodepage(cpCodepage);
|
||||
section.setCodepage(cpCodepage);
|
||||
section.setDictionary(dictionary);
|
||||
for (final Iterator i = customProperties.values().iterator(); i.hasNext();)
|
||||
for (final Iterator<CustomProperty> i = customProperties.values().iterator(); i.hasNext();)
|
||||
{
|
||||
final Property p = (Property) i.next();
|
||||
final Property p = i.next();
|
||||
section.setProperty(p);
|
||||
}
|
||||
}
|
||||
|
@ -53,7 +53,7 @@ public class MutableSection extends Section
|
||||
* decision has been taken when specifying the "properties" field
|
||||
* as an Property[]. It should have been a {@link java.util.List}.</p>
|
||||
*/
|
||||
private List preprops;
|
||||
private List<Property> preprops;
|
||||
|
||||
|
||||
|
||||
@ -74,7 +74,7 @@ public class MutableSection extends Section
|
||||
dirty = true;
|
||||
formatID = null;
|
||||
offset = -1;
|
||||
preprops = new LinkedList();
|
||||
preprops = new LinkedList<Property>();
|
||||
}
|
||||
|
||||
|
||||
@ -145,7 +145,7 @@ public class MutableSection extends Section
|
||||
public void setProperties(final Property[] properties)
|
||||
{
|
||||
this.properties = properties;
|
||||
preprops = new LinkedList();
|
||||
preprops = new LinkedList<Property>();
|
||||
for (int i = 0; i < properties.length; i++)
|
||||
preprops.add(properties[i]);
|
||||
dirty = true;
|
||||
@ -276,8 +276,8 @@ public class MutableSection extends Section
|
||||
*/
|
||||
public void removeProperty(final long id)
|
||||
{
|
||||
for (final Iterator i = preprops.iterator(); i.hasNext();)
|
||||
if (((Property) i.next()).getID() == id)
|
||||
for (final Iterator<Property> i = preprops.iterator(); i.hasNext();)
|
||||
if (i.next().getID() == id)
|
||||
{
|
||||
i.remove();
|
||||
break;
|
||||
@ -423,12 +423,10 @@ public class MutableSection extends Section
|
||||
}
|
||||
|
||||
/* Sort the property list by their property IDs: */
|
||||
Collections.sort(preprops, new Comparator()
|
||||
Collections.sort(preprops, new Comparator<Property>()
|
||||
{
|
||||
public int compare(final Object o1, final Object o2)
|
||||
public int compare(final Property p1, final Property p2)
|
||||
{
|
||||
final Property p1 = (Property) o1;
|
||||
final Property p2 = (Property) o2;
|
||||
if (p1.getID() < p2.getID())
|
||||
return -1;
|
||||
else if (p1.getID() == p2.getID())
|
||||
@ -440,7 +438,7 @@ public class MutableSection extends Section
|
||||
|
||||
/* Write the properties and the property list into their respective
|
||||
* streams: */
|
||||
for (final ListIterator i = preprops.listIterator(); i.hasNext();)
|
||||
for (final ListIterator<Property> i = preprops.listIterator(); i.hasNext();)
|
||||
{
|
||||
final MutableProperty p = (MutableProperty) i.next();
|
||||
final long id = p.getID();
|
||||
@ -502,14 +500,14 @@ public class MutableSection extends Section
|
||||
* @exception IOException if an I/O exception occurs.
|
||||
*/
|
||||
private static int writeDictionary(final OutputStream out,
|
||||
final Map dictionary, final int codepage)
|
||||
final Map<Long,String> dictionary, final int codepage)
|
||||
throws IOException
|
||||
{
|
||||
int length = TypeWriter.writeUIntToStream(out, dictionary.size());
|
||||
for (final Iterator i = dictionary.keySet().iterator(); i.hasNext();)
|
||||
for (final Iterator<Long> i = dictionary.keySet().iterator(); i.hasNext();)
|
||||
{
|
||||
final Long key = (Long) i.next();
|
||||
final String value = (String) dictionary.get(key);
|
||||
final Long key = i.next();
|
||||
final String value = dictionary.get(key);
|
||||
|
||||
if (codepage == Constants.CP_UNICODE)
|
||||
{
|
||||
@ -617,21 +615,11 @@ public class MutableSection extends Section
|
||||
*
|
||||
* @see Section#getDictionary()
|
||||
*/
|
||||
public void setDictionary(final Map dictionary)
|
||||
public void setDictionary(final Map<Long,String> dictionary)
|
||||
throws IllegalPropertySetDataException
|
||||
{
|
||||
if (dictionary != null)
|
||||
{
|
||||
for (final Iterator i = dictionary.keySet().iterator();
|
||||
i.hasNext();)
|
||||
if (!(i.next() instanceof Long))
|
||||
throw new IllegalPropertySetDataException
|
||||
("Dictionary keys must be of type Long.");
|
||||
for (final Iterator i = dictionary.values().iterator();
|
||||
i.hasNext();)
|
||||
if (!(i.next() instanceof String))
|
||||
throw new IllegalPropertySetDataException
|
||||
("Dictionary values must be of type String.");
|
||||
this.dictionary = dictionary;
|
||||
|
||||
/* Set the dictionary property (ID 0). Please note that the second
|
||||
|
@ -42,7 +42,7 @@ public class Section
|
||||
* <p>Maps property IDs to section-private PID strings. These
|
||||
* strings can be found in the property with ID 0.</p>
|
||||
*/
|
||||
protected Map dictionary;
|
||||
protected Map<Long,String> dictionary;
|
||||
|
||||
/**
|
||||
* <p>The section's format ID, {@link #getFormatID}.</p>
|
||||
@ -244,10 +244,10 @@ public class Section
|
||||
|
||||
/* Look for the codepage. */
|
||||
int codepage = -1;
|
||||
for (final Iterator i = propertyList.iterator();
|
||||
for (final Iterator<PropertyListEntry> i = propertyList.iterator();
|
||||
codepage == -1 && i.hasNext();)
|
||||
{
|
||||
ple = (PropertyListEntry) i.next();
|
||||
ple = i.next();
|
||||
|
||||
/* Read the codepage if the property ID is 1. */
|
||||
if (ple.id == PropertyIDMap.PID_CODEPAGE)
|
||||
@ -271,9 +271,9 @@ public class Section
|
||||
/* Pass 2: Read all properties - including the codepage property,
|
||||
* if available. */
|
||||
int i1 = 0;
|
||||
for (final Iterator i = propertyList.iterator(); i.hasNext();)
|
||||
for (final Iterator<PropertyListEntry> i = propertyList.iterator(); i.hasNext();)
|
||||
{
|
||||
ple = (PropertyListEntry) i.next();
|
||||
ple = i.next();
|
||||
Property p = new Property(ple.id, src,
|
||||
this.offset + ple.offset,
|
||||
ple.length, codepage);
|
||||
@ -294,7 +294,7 @@ public class Section
|
||||
* <p>Represents an entry in the property list and holds a property's ID and
|
||||
* its offset from the section's beginning.</p>
|
||||
*/
|
||||
class PropertyListEntry implements Comparable
|
||||
class PropertyListEntry implements Comparable<PropertyListEntry>
|
||||
{
|
||||
int id;
|
||||
int offset;
|
||||
@ -307,11 +307,9 @@ public class Section
|
||||
*
|
||||
* @see Comparable#compareTo(java.lang.Object)
|
||||
*/
|
||||
public int compareTo(final Object o)
|
||||
public int compareTo(final PropertyListEntry o)
|
||||
{
|
||||
if (!(o instanceof PropertyListEntry))
|
||||
throw new ClassCastException(o.toString());
|
||||
final int otherOffset = ((PropertyListEntry) o).offset;
|
||||
final int otherOffset = o.offset;
|
||||
if (offset < otherOffset)
|
||||
return -1;
|
||||
else if (offset == otherOffset)
|
||||
@ -630,7 +628,7 @@ public class Section
|
||||
* @return the dictionary or <code>null</code> if the section does not have
|
||||
* a dictionary.
|
||||
*/
|
||||
public Map getDictionary()
|
||||
public Map<Long,String> getDictionary()
|
||||
{
|
||||
return dictionary;
|
||||
}
|
||||
|
@ -57,9 +57,9 @@ public class HPSFPropertiesExtractor extends POITextExtractor {
|
||||
// Now custom ones
|
||||
CustomProperties cps = dsi == null ? null : dsi.getCustomProperties();
|
||||
if(cps != null) {
|
||||
Iterator keys = cps.keySet().iterator();
|
||||
Iterator<String> keys = cps.nameSet().iterator();
|
||||
while(keys.hasNext()) {
|
||||
String key = (String)keys.next();
|
||||
String key = keys.next();
|
||||
String val = getPropertyValueText( cps.get(key) );
|
||||
text.append(key + " = " + val + "\n");
|
||||
}
|
||||
|
@ -348,8 +348,25 @@ public class TestWriteWellKnown extends TestCase {
|
||||
customProperties.put("min_Long", MIN_LONG);
|
||||
customProperties.put("max_Double", MAX_DOUBLE);
|
||||
customProperties.put("min_Double", MIN_DOUBLE);
|
||||
|
||||
// Check the keys went in
|
||||
assertTrue(customProperties.containsKey("Schl\u00fcssel \u00e4"));
|
||||
assertTrue(customProperties.containsKey("Boolean"));
|
||||
|
||||
// Check the values went in
|
||||
assertEquals("Wert \u00e4", customProperties.get("Schl\u00fcssel \u00e4"));
|
||||
assertEquals(Boolean.TRUE, customProperties.get("Boolean"));
|
||||
assertTrue(customProperties.containsValue(Boolean.TRUE));
|
||||
assertTrue(customProperties.containsValue("Wert \u00e4"));
|
||||
|
||||
// Check that things that aren't in aren't in
|
||||
assertFalse(customProperties.containsKey("False Boolean"));
|
||||
assertFalse(customProperties.containsValue(Boolean.FALSE));
|
||||
|
||||
// Save as our custom properties
|
||||
dsi.setCustomProperties(customProperties);
|
||||
|
||||
|
||||
/* Write the summary information stream and the document summary
|
||||
* information stream to the POI filesystem. */
|
||||
si.write(dir, siEntry.getName());
|
||||
|
Loading…
Reference in New Issue
Block a user