You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@velocity.apache.org by apache-velocity-dev-subscriber <ap...@unitedplanet.de> on 2002/11/20 18:05:12 UTC

Possible fix for [Bug 14711]

// The following quick fix may solve bug 14711. However it is not tested thoroughly nor we are sure if it fits in well.

    private Twonk calcDistance( Object[] set, Class[] base )
    {
        if ( set.length != base.length)
            return null;
            
        Twonk twonk = new Twonk( set.length );

        for (int i = 0; i < set.length; i++)
        {
            /* 
             * can I get from here to there?
             */
             
            Class setclass = set[i].getClass();
            
            Class tmpclass = base[i];

			if (tmpclass.isPrimitive())
			{
				if (tmpclass.equals(Boolean.TYPE))
					tmpclass = java.lang.Boolean.class;
				else if (tmpclass.equals(Byte.TYPE))
					tmpclass = java.lang.Byte.class;
				else if (tmpclass.equals(Character.TYPE))
					tmpclass = java.lang.Character.class;
				else if (tmpclass.equals(Double.TYPE))
					tmpclass = java.lang.Double.class;
				else if (tmpclass.equals(Float.TYPE))
					tmpclass = java.lang.Float.class;
				else if (tmpclass.equals(Integer.TYPE))
					tmpclass = java.lang.Integer.class;
				else if (tmpclass.equals(Long.TYPE))
					tmpclass = java.lang.Long.class;
				else if (tmpclass.equals(Short.TYPE))
					tmpclass = java.lang.Short.class;
			}

            if ( !tmpclass.isAssignableFrom( set[i].getClass() ))
                return null;
    
            /*
             * ok, I can.  How many steps?
             */
           
            Class c = setclass;
                      
            while( c != null)
            {      
                /*
                 * is this a valid step?
                 */
                 
                if ( !tmpclass.isAssignableFrom( c ) )
                {      
                    /*
                     *  it stopped being assignable - therefore we are looking at
                     *  an interface as our target, so move back one step
                     *  from the distance as the stop wasn't valid
                     */
                    break;
                }
                
                if(  tmpclass.equals( c ) )
                {
                    /*
                     *  we are equal, so no need to move forward
                     */
                     
                    break;
                }

                c = c.getSuperclass();
                twonk.distance++;
                twonk.vec[i]++;
            }
         }
                
        return twonk;
    }

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


Re: Possible fix for [Bug 14711]

Posted by Daniel Rall <dl...@finemaltcoding.com>.
Mind attaching this to the issue in patch format?  `cvs diff -u
file.java > patch`.  Thanks!

"apache-velocity-dev-subscriber" <ap...@unitedplanet.de> writes:

> // The following quick fix may solve bug 14711. However it is not tested thoroughly nor we are sure if it fits in well.
> 
>     private Twonk calcDistance( Object[] set, Class[] base )
>     {
>         if ( set.length != base.length)
>             return null;
>             
>         Twonk twonk = new Twonk( set.length );
> 
>         for (int i = 0; i < set.length; i++)
>         {
>             /* 
>              * can I get from here to there?
>              */
>              
>             Class setclass = set[i].getClass();
>             
>             Class tmpclass = base[i];
> 
> 			if (tmpclass.isPrimitive())
> 			{
> 				if (tmpclass.equals(Boolean.TYPE))
> 					tmpclass = java.lang.Boolean.class;
> 				else if (tmpclass.equals(Byte.TYPE))
> 					tmpclass = java.lang.Byte.class;
> 				else if (tmpclass.equals(Character.TYPE))
> 					tmpclass = java.lang.Character.class;
> 				else if (tmpclass.equals(Double.TYPE))
> 					tmpclass = java.lang.Double.class;
> 				else if (tmpclass.equals(Float.TYPE))
> 					tmpclass = java.lang.Float.class;
> 				else if (tmpclass.equals(Integer.TYPE))
> 					tmpclass = java.lang.Integer.class;
> 				else if (tmpclass.equals(Long.TYPE))
> 					tmpclass = java.lang.Long.class;
> 				else if (tmpclass.equals(Short.TYPE))
> 					tmpclass = java.lang.Short.class;
> 			}
> 
>             if ( !tmpclass.isAssignableFrom( set[i].getClass() ))
>                 return null;
>     
>             /*
>              * ok, I can.  How many steps?
>              */
>            
>             Class c = setclass;
>                       
>             while( c != null)
>             {      
>                 /*
>                  * is this a valid step?
>                  */
>                  
>                 if ( !tmpclass.isAssignableFrom( c ) )
>                 {      
>                     /*
>                      *  it stopped being assignable - therefore we are looking at
>                      *  an interface as our target, so move back one step
>                      *  from the distance as the stop wasn't valid
>                      */
>                     break;
>                 }
>                 
>                 if(  tmpclass.equals( c ) )
>                 {
>                     /*
>                      *  we are equal, so no need to move forward
>                      */
>                      
>                     break;
>                 }
> 
>                 c = c.getSuperclass();
>                 twonk.distance++;
>                 twonk.vec[i]++;
>             }
>          }
>                 
>         return twonk;
>     }
> 
> --
> To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
> For additional commands, e-mail: <ma...@jakarta.apache.org>
> 

-- 

Daniel Rall <dl...@finemaltcoding.com>

---------------------------------------------------------------------
To unsubscribe, e-mail: velocity-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: velocity-dev-help@jakarta.apache.org