Hi Ajit,

On 3/30/2016 5:12 AM, Ajit Ghaisas wrote:
Raster.java, line 986: Something to file as a potential bug for future work 
since the fix would have to be verified that it doesn't disrupt the other parts 
of this method, but... The set of if statements in this method never checked 
for a BandedSampleModel to try to create a BandedRaster as in 
createBandedRaster.  On the other hand, no developer has complained so far 
(that I know of, but maybe we have an old bug filed on it that I'm not aware 
of).

[Ajit] :  Without my fix, it was easier to get RasterFormatException as 
explained in Bug Description. This fix enhances the code by making type 
specific Raster class constructors type-safe.
Now, the bigger question is: Whether methods in Raster.java support all 
possible combinations of Raster creations?
What I can say is - this fix does not break anything than what is already 
present in Raster.java.
If there is specific user complaint or any existing bug - we can look into it 
separately.

I agree that this creates no new failure modes, which is why I suggested it as something to file for future work. (an enhancement)

The following 2 comments are identical for all of the raster types {
      ByteBandedRaster.java, line 76: This code will throw a ClassCastException
          now instead of the RasterFormatException that used to be thrown.
          Do we care?  It would be easy enough to add a test to just this
          method (and the similar versions in other files).
[Ajit] :  Since we have decided to make the type specific Raster class constructors type 
safe, yes, it is possible to get ClassCastException. But, as the usage of these classes 
is guarded now with "instanceof" checks, it would be rare.

In other cases, where the caller supplies the data buffer, we have protected them all with instance checks, but in this case the method is relying on the sample model to create the correct type of data buffer.

If this method were called from a random place then we'd have no guarantees, but as far as I can see, it is only called from within ByteBandedRaster itself and it is called on the same sample model that it was originally created with.

The typical case will probably not be an issue, but it's not immediately clear if there is any way that someone can end up with a custom sample model in a ByteBandedRaster that produces some other kind of data buffer? Possibly this would be more likely if there were any other callers to that method, but a search of java.desktop didn't turn up any.

It would be difficult at best to engineer a test case that would discover the difference here and that test case would have previously thrown an exception anyway so I suppose I'm not going to be concerned if the type of the exception has changed here...

      ByteBandedRaster.java, line 668: Extra credit: This cast could be avoided
          if we make SunWritableRaster employ generics for a strongly typed 
DataBuffer.

[Ajit] : the casted member ' dataBuffer' on this line is a member of Raster 
class.
The class hierarchy of ByteBandedRaster is ( added on single line for 
convenience)
  --------   ByteBandedRaster extends SunWritableRaster extends WritableRaster 
extends Raster.

I am not quite clear on how we can avoid cast on this line. Can you please 
elaborate?

}

The object being cast here is the contents of the dataBuffer field of the raster, which is known to be a DataBufferByte for the case of ByteBandedRaster because all of its constructors enforce that type, especially so now that the constructors are all type-specific. If all of the super-classes were generified for the kind of DataBuffer that they held then we wouldn't need a cast here.

But, that would be a public API change since the field is stored in the public java.awt.image.Raster class, so the generification would have to extend all the way up to that class.

Something to consider for the future, but definitely outside the scope of this fix. And if we do that, then we should also consider other use of generics within all of the java.awt.image classes and that would be a much larger effort.

Here is the updated webrev:
http://cr.openjdk.java.net/~arapte/ajit/6353518/webrev.05/

If you only changed those things you mentioned above then it looks good to go. If there is something else that was changed, let me know and I'll do a more thorough review...

                        ...jim

Reply via email to