[ 
https://issues.apache.org/jira/browse/PDFBOX-5724?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Axel Howind updated PDFBOX-5724:
--------------------------------
    Description: 
The equals() method in CharStringCommand breaks the contract of 
Object.equals(). From the Object.equals() Javadoc:
 
{quote}The {{equals}} method implements an equivalence relation on non-null 
object references:
 * It is {_}reflexive{_}: for any non-null reference value {{{}x{}}}, 
{{x.equals(x)}} should return {{{}true{}}}.
 * It is {_}symmetric{_}: for any non-null reference values {{x}} and 
{{{}y{}}}, {{x.equals(y)}} should return {{true}} if and only if 
{{y.equals(x)}} returns {{{}true{}}}.
 * It is {_}transitive{_}: for any non-null reference values {{{}x{}}}, 
{{{}y{}}}, and {{{}z{}}}, if {{x.equals(y)}} returns {{true}} and 
{{y.equals(z)}} returns {{{}true{}}}, then {{x.equals(z)}} should return 
{{{}true{}}}.
 * It is {_}consistent{_}: for any non-null reference values {{x}} and 
{{{}y{}}}, multiple invocations of {{x.equals(y)}} consistently return {{true}} 
or consistently return {{{}false{}}}, provided no information used in 
{{equals}} comparisons on the objects is modified.
 * For any non-null reference value {{{}x{}}}, {{x.equals(null)}} should return 
{{{}false{}}}.{quote}
This is the current implementation:
{code:java}
    @Override
    public boolean equals(Object object)
    {
        if (object instanceof CharStringCommand)
        {
            CharStringCommand that = (CharStringCommand) object;
            if (type1KeyWord != null && type1KeyWord == that.getType1KeyWord())
            {
                return true;
            }
            if (type2KeyWord != null && type2KeyWord == that.getType2KeyWord())
            {
                return true;
            }
            if (type1KeyWord == null && type2KeyWord == null)
            {
                return true;
            }
        }
        return false;
    }

{code}
If type1Keyword==null and type2Keyword!=null, true is returned without checking 
the values of that.getType1Keyword() and that.getType2Keyword().

Now imagine a has both fields set to null and b has not. Then a.equals(b)==true 
and b.equals(a)!=true.
 

  was:
The equals() method in CharStringCommand breaks the contract of 
Object.equals(). From the Object.equals() Javadoc:
 
{quote}The {{equals}} method implements an equivalence relation on non-null 
object references:
 * It is {_}reflexive{_}: for any non-null reference value {{{}x{}}}, 
{{x.equals(x)}} should return {{{}true{}}}.
 * It is {_}symmetric{_}: for any non-null reference values {{x}} and 
{{{}y{}}}, {{x.equals(y)}} should return {{true}} if and only if 
{{y.equals(x)}} returns {{{}true{}}}.
 * It is {_}transitive{_}: for any non-null reference values {{{}x{}}}, 
{{{}y{}}}, and {{{}z{}}}, if {{x.equals(y)}} returns {{true}} and 
{{y.equals(z)}} returns {{{}true{}}}, then {{x.equals(z)}} should return 
{{{}true{}}}.
 * It is {_}consistent{_}: for any non-null reference values {{x}} and 
{{{}y{}}}, multiple invocations of {{x.equals(y)}} consistently return {{true}} 
or consistently return {{{}false{}}}, provided no information used in 
{{equals}} comparisons on the objects is modified.
 * For any non-null reference value {{{}x{}}}, {{x.equals(null)}} should return 
{{{}false{}}}.
 {quote}
 


{code:java}
    @Override
    public boolean equals(Object object)
    {
        if (object instanceof CharStringCommand)
        {
            CharStringCommand that = (CharStringCommand) object;
            if (type1KeyWord != null && type1KeyWord == that.getType1KeyWord())
            {
                return true;
            }
            if (type2KeyWord != null && type2KeyWord == that.getType2KeyWord())
            {
                return true;
            }
            if (type1KeyWord == null && type2KeyWord == null)
            {
                return true;
            }
        }
        return false;
    }

{code}

If type1Keyword==null and type2Keyword!=null, true is returned without checking 
the values of that.getType1Keyword() and that.getType2Keyword().

Now imagine a has both fields set to null and b has not. Then a.equals(b)==true 
and b.equals(a)!=true.
 


> CharStringCommand.equals() does not conform to the contract of Object.equals
> ----------------------------------------------------------------------------
>
>                 Key: PDFBOX-5724
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-5724
>             Project: PDFBox
>          Issue Type: Bug
>    Affects Versions: 4.0.0
>            Reporter: Axel Howind
>            Priority: Critical
>
> The equals() method in CharStringCommand breaks the contract of 
> Object.equals(). From the Object.equals() Javadoc:
>  
> {quote}The {{equals}} method implements an equivalence relation on non-null 
> object references:
>  * It is {_}reflexive{_}: for any non-null reference value {{{}x{}}}, 
> {{x.equals(x)}} should return {{{}true{}}}.
>  * It is {_}symmetric{_}: for any non-null reference values {{x}} and 
> {{{}y{}}}, {{x.equals(y)}} should return {{true}} if and only if 
> {{y.equals(x)}} returns {{{}true{}}}.
>  * It is {_}transitive{_}: for any non-null reference values {{{}x{}}}, 
> {{{}y{}}}, and {{{}z{}}}, if {{x.equals(y)}} returns {{true}} and 
> {{y.equals(z)}} returns {{{}true{}}}, then {{x.equals(z)}} should return 
> {{{}true{}}}.
>  * It is {_}consistent{_}: for any non-null reference values {{x}} and 
> {{{}y{}}}, multiple invocations of {{x.equals(y)}} consistently return 
> {{true}} or consistently return {{{}false{}}}, provided no information used 
> in {{equals}} comparisons on the objects is modified.
>  * For any non-null reference value {{{}x{}}}, {{x.equals(null)}} should 
> return {{{}false{}}}.{quote}
> This is the current implementation:
> {code:java}
>     @Override
>     public boolean equals(Object object)
>     {
>         if (object instanceof CharStringCommand)
>         {
>             CharStringCommand that = (CharStringCommand) object;
>             if (type1KeyWord != null && type1KeyWord == 
> that.getType1KeyWord())
>             {
>                 return true;
>             }
>             if (type2KeyWord != null && type2KeyWord == 
> that.getType2KeyWord())
>             {
>                 return true;
>             }
>             if (type1KeyWord == null && type2KeyWord == null)
>             {
>                 return true;
>             }
>         }
>         return false;
>     }
> {code}
> If type1Keyword==null and type2Keyword!=null, true is returned without 
> checking the values of that.getType1Keyword() and that.getType2Keyword().
> Now imagine a has both fields set to null and b has not. Then 
> a.equals(b)==true and b.equals(a)!=true.
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@pdfbox.apache.org
For additional commands, e-mail: dev-h...@pdfbox.apache.org

Reply via email to