You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ja...@apache.org on 2015/05/16 02:31:39 UTC
svn commit: r1679669 - in /pdfbox/trunk/pdfbox/src:
main/java/org/apache/pdfbox/pdmodel/interactive/form/
test/java/org/apache/pdfbox/pdmodel/interactive/form/
Author: jahewson
Date: Sat May 16 00:31:39 2015
New Revision: 1679669
URL: http://svn.apache.org/r1679669
Log:
PDFBOX-2459: Introduce type safety for getDefaultValue() and setDefaultValue()
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDButton.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDCheckbox.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDChoice.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDField.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDPushButton.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDRadioButton.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDSignatureField.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDTextField.java
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestCheckBox.java
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestFields.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDButton.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDButton.java?rev=1679669&r1=1679668&r2=1679669&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDButton.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDButton.java Sat May 16 00:31:39 2015
@@ -113,39 +113,6 @@ public abstract class PDButton extends P
public void setRadioButton(boolean radiobutton)
{
dictionary.setFlag(COSName.FF, FLAG_RADIO, radiobutton);
- }
-
-
- @Override
- public String getDefaultValue() throws IOException
- {
- COSBase attribute = getInheritableAttribute(COSName.DV);
-
- if (attribute == null)
- {
- return "";
- }
- else if (attribute instanceof COSName)
- {
- return ((COSName) attribute).getName();
- }
- else
- {
- throw new IOException("Expected a COSName entry but got " + attribute.getClass().getName());
- }
- }
-
- @Override
- public void setDefaultValue(String defaultValue)
- {
- if (defaultValue == null)
- {
- dictionary.removeItem(COSName.DV);
- }
- else
- {
- dictionary.setItem(COSName.DV, COSName.getPDFName(defaultValue));
- }
}
/**
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDCheckbox.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDCheckbox.java?rev=1679669&r1=1679668&r2=1679669&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDCheckbox.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDCheckbox.java Sat May 16 00:31:39 2015
@@ -90,6 +90,21 @@ public final class PDCheckbox extends PD
return value instanceof COSName && value.equals(COSName.YES);
}
+ /**
+ * Returns the default value, if any.
+ *
+ * @return True if checked, false if not checked, null if missing.
+ */
+ public Boolean getDefaultValue()
+ {
+ COSBase value = getInheritableAttribute(COSName.DV);
+ if (value == null)
+ {
+ return null;
+ }
+ return value instanceof COSName && value.equals(COSName.YES);
+ }
+
@Override
public String getValueAsString()
{
@@ -112,4 +127,16 @@ public final class PDCheckbox extends PD
applyChange();
}
+
+ /**
+ * Sets the default value.
+ *
+ * @param value True if checked
+ * @throws IOException if the value could not be set
+ */
+ public void setDefaultValue(boolean value) throws IOException
+ {
+ COSName name = value ? COSName.YES : COSName.OFF;
+ dictionary.setItem(COSName.DV, name);
+ }
}
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDChoice.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDChoice.java?rev=1679669&r1=1679668&r2=1679669&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDChoice.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDChoice.java Sat May 16 00:31:39 2015
@@ -67,42 +67,6 @@ public abstract class PDChoice extends P
{
super(acroForm, field, parent);
}
-
- /**
- * Get the fields default value.
- *
- * The value is stored in the field dictionaries "DV" entry.
- *
- * @return The value of this entry.
- */
- public String getDefaultValue()
- {
- return ((COSString) getInheritableAttribute(COSName.DV)).getString();
- }
-
- /**
- * Set the default value for the field.
- *
- * @param value the value
- */
- public void setDefaultValue(String value)
- {
- if (value != null)
- {
- if (getOptions().indexOf(value) == -1)
- {
- throw new IllegalArgumentException("The list box does not contain the given value.");
- }
- else
- {
- dictionary.setString(COSName.DV, value);
- }
- }
- else
- {
- dictionary.removeItem(COSName.DV);
- }
- }
/**
* This will get the option values "Opt".
@@ -421,6 +385,17 @@ public abstract class PDChoice extends P
applyChange();
}
+
+ /**
+ * Sets the default value of this field.
+ *
+ * @param value The name of the selected item.
+ * @throws IOException if the value could not be set
+ */
+ public void setDefaultValue(String value) throws IOException
+ {
+ dictionary.setString(COSName.DV, value);
+ }
/**
* Sets the entry "V" to the given values. Requires {@link #isMultiSelect()} to be true.
@@ -457,7 +432,26 @@ public abstract class PDChoice extends P
*/
public List<String> getValue()
{
- COSBase value = dictionary.getDictionaryObject(COSName.V);
+ return getValueFor(COSName.V);
+ }
+
+ /**
+ * Returns the default values, or an empty string. This list always contains a single item
+ * unless {@link #isMultiSelect()} is true.
+ *
+ * @return A non-null string.
+ */
+ public List<String> getDefaultValue()
+ {
+ return getValueFor(COSName.DV);
+ }
+
+ /**
+ * Returns the selected values, or an empty string, for the given key.
+ */
+ private List<String> getValueFor(COSName name)
+ {
+ COSBase value = dictionary.getDictionaryObject(name);
if (value instanceof COSString)
{
List<String> array = new ArrayList<String>();
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDField.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDField.java?rev=1679669&r1=1679668&r2=1679669&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDField.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDField.java Sat May 16 00:31:39 2015
@@ -104,43 +104,6 @@ public abstract class PDField implements
*
*/
public abstract String getFieldType();
-
- /**
- * Get the value of the "DV" entry. The "DV" entry is an inheritable attribute.
- *
- * This will return null if the "DV" entry doesn't exist or if it has no value assigned.
- *
- * The different field types do require specific object types for their value
- * e.g. for RadioButtons the DV entry needs to be a name object.
- * If the value doesn't match the expected type an IOException is thrown. Such a wrong entry might
- * have been set with a different library or by using PDFBox low level COS model.
- *
- * To get the value in such cases the lower level COS model can be used.
- *
- * @return The value of this field.
- * @throws IOException If there is an error reading the data for this field
- * or the type is not in line with the fields required type.
- *
- */
- public abstract Object getDefaultValue() throws IOException;
-
- /**
- * Set the value of the "DV" entry. The "DV" entry is an inheritable attribute.
- *
- * The different field types do require specific object types for their value
- * e.g. for RadioButtons the DV entry needs to be a name object. This needs to be handled by the
- * individual classes.
- *
- * Trying to set the default value for a {@link PDPushButton} field will lead to an
- * {@link IllegalArgumentException} as PDPushButton fields do not support setting the
- * entry although, common to all field types, the DV entry shall not be set.
- *
- * As a result it might be necessary to check the type of the value before
- * reusing it.
- *
- * @param defaultValue The new default field value.
- */
- public abstract void setDefaultValue(String defaultValue);
/**
* Returns a string representation of the "V" entry, or an empty string.
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java?rev=1679669&r1=1679668&r2=1679669&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDNonTerminalField.java Sat May 16 00:31:39 2015
@@ -196,26 +196,26 @@ public class PDNonTerminalField extends
}
/**
- * @inheritDoc
+ * Returns the default value of this field. This may be of any kind which is valid for this field's
+ * children.
*
* <p><b>Note:</b> while non-terminal fields <b>do</b> inherit field values, this method returns
* the local value, without inheritance.
*/
- @Override
- public Object getDefaultValue()
+ public COSBase getDefaultValue()
{
- return dictionary.getNameAsString(COSName.DV);
+ return dictionary.getDictionaryObject(COSName.DV);
}
/**
- * @inheritDoc
+ * Sets the default of this field. This may be of any kind which is valid for this field's
+ * children.
*
* <p><b>Note:</b> while non-terminal fields <b>do</b> inherit field values, this method returns
* the local value, without inheritance.
*/
- @Override
- public void setDefaultValue(String defaultValue)
+ public void setDefaultValue(COSBase value)
{
- dictionary.setString(COSName.V, defaultValue);
+ dictionary.setItem(COSName.V, value);
}
}
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDPushButton.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDPushButton.java?rev=1679669&r1=1679668&r2=1679669&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDPushButton.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDPushButton.java Sat May 16 00:31:39 2015
@@ -53,22 +53,6 @@ public class PDPushButton extends PDButt
}
@Override
- public String getDefaultValue()
- {
- // PushButton fields don't support the "DV" entry.
- return "";
- }
-
- @Override
- public void setDefaultValue(String defaultValue)
- {
- if (defaultValue != null && !defaultValue.isEmpty())
- {
- throw new IllegalArgumentException("A PDPushButton shall not use the DV entry in the field dictionary");
- }
- }
-
- @Override
public List<String> getOptions()
{
return Collections.emptyList();
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDRadioButton.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDRadioButton.java?rev=1679669&r1=1679668&r2=1679669&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDRadioButton.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDRadioButton.java Sat May 16 00:31:39 2015
@@ -149,6 +149,24 @@ public final class PDRadioButton extends
}
}
+ /**
+ * Returns the default value, if any.
+ *
+ * @return A non-null string.
+ */
+ public String getDefaultValue()
+ {
+ COSBase value = getInheritableAttribute(COSName.DV);
+ if (value instanceof COSName)
+ {
+ return ((COSName)value).getName();
+ }
+ else
+ {
+ return "";
+ }
+ }
+
@Override
public String getValueAsString()
{
@@ -179,4 +197,15 @@ public final class PDRadioButton extends
}
applyChange();
}
+
+ /**
+ * Sets the default value.
+ *
+ * @param value Name of radio button to select
+ * @throws IOException if the value could not be set
+ */
+ public void setDefaultValue(String value) throws IOException
+ {
+ dictionary.setName(COSName.DV, value);
+ }
}
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDSignatureField.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDSignatureField.java?rev=1679669&r1=1679668&r2=1679669&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDSignatureField.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDSignatureField.java Sat May 16 00:31:39 2015
@@ -122,6 +122,16 @@ public class PDSignatureField extends PD
}
/**
+ * Sets the default value of this field to be the given signature.
+ *
+ * @param value is the PDSignatureField
+ */
+ public void setDefaultValue(PDSignature value) throws IOException
+ {
+ dictionary.setItem(COSName.DV, value);
+ }
+
+ /**
* Returns the signature contained in this field.
*
* @return A signature dictionary.
@@ -135,6 +145,21 @@ public class PDSignatureField extends PD
}
return new PDSignature((COSDictionary)value);
}
+
+ /**
+ * Returns the default value, if any.
+ *
+ * @return A signature dictionary.
+ */
+ public PDSignature getDefaultValue()
+ {
+ COSBase value = dictionary.getDictionaryObject(COSName.DV);
+ if (value == null)
+ {
+ return null;
+ }
+ return new PDSignature((COSDictionary)value);
+ }
@Override
public String getValueAsString()
@@ -174,20 +199,6 @@ public class PDSignatureField extends PD
dictionary.setItem(COSName.SV, sv);
}
}
-
- @Override
- public Object getDefaultValue()
- {
- // Signature fields don't support the "DV" entry.
- return null;
- }
-
- @Override
- public void setDefaultValue(String defaultValue)
- {
- // Signature fields don't support the "DV" entry.
- throw new IllegalArgumentException("Signature fields don't support the \"DV\" entry.");
- }
@Override
void constructAppearances() throws IOException
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDTextField.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDTextField.java?rev=1679669&r1=1679668&r2=1679669&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDTextField.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDTextField.java Sat May 16 00:31:39 2015
@@ -17,10 +17,8 @@
package org.apache.pdfbox.pdmodel.interactive.form;
import java.io.IOException;
-import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
-import org.apache.pdfbox.cos.COSString;
/**
* A text field is a box or space for text fill-in data typically entered from a keyboard.
@@ -206,23 +204,6 @@ public final class PDTextField extends P
{
dictionary.setInt(COSName.MAX_LEN, maxLen);
}
-
- @Override
- public void setDefaultValue(String value)
- {
- dictionary.setString(COSName.DV, value);
- }
-
- @Override
- public String getDefaultValue()
- {
- COSBase fieldValue = getInheritableAttribute(COSName.DV);
- if (fieldValue instanceof COSString)
- {
- return ((COSString) fieldValue).getString();
- }
- return "";
- }
/**
* Sets the plain text value of this field.
@@ -237,6 +218,17 @@ public final class PDTextField extends P
}
/**
+ * Sets the default value of this field.
+ *
+ * @param value Plain text
+ * @throws IOException if the value could not be set
+ */
+ public void setDefaultValue(String value) throws IOException
+ {
+ dictionary.setString(COSName.DV, value);
+ }
+
+ /**
* Returns the value of this field, or an empty string.
*
* @return A non-null string.
@@ -246,6 +238,16 @@ public final class PDTextField extends P
return getStringOrStream(getInheritableAttribute(COSName.V));
}
+ /**
+ * Returns the default value of this field, or an empty string.
+ *
+ * @return A non-null string.
+ */
+ public String getDefaultValue()
+ {
+ return getStringOrStream(getInheritableAttribute(COSName.DV));
+ }
+
@Override
public String getValueAsString()
{
Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestCheckBox.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestCheckBox.java?rev=1679669&r1=1679668&r2=1679669&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestCheckBox.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestCheckBox.java Sat May 16 00:31:39 2015
@@ -81,7 +81,6 @@ public class TestCheckBox extends TestCa
// test that there are no nulls returned for an empty field
// only specific methods are tested here
- assertNotNull(checkBox.getDefaultValue());
assertNotNull(checkBox.getOptions());
assertNotNull(checkBox.getValue());
Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestFields.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestFields.java?rev=1679669&r1=1679668&r2=1679669&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestFields.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestFields.java Sat May 16 00:31:39 2015
@@ -164,9 +164,8 @@ public class TestFields extends TestCase
// get the Checkbox with a DV entry
PDCheckbox checkBox = (PDCheckbox)form.getField("Checkbox-DefaultValue");
assertNotNull(checkBox);
- assertEquals(checkBox.getDefaultValue(),"Yes");
- assertEquals(checkBox.getDefaultValue(),
- ((COSName) checkBox.getCOSObject().getDictionaryObject(COSName.DV)).getName());
+ assertEquals(Boolean.TRUE, checkBox.getDefaultValue());
+ assertEquals(COSName.YES, checkBox.getCOSObject().getDictionaryObject(COSName.DV));
// get the TextField with a DV entry
textField = (PDTextField)form.getField("TextField-DefaultValue");