Hello all
In the last days, I didn't ported significant classes. Instead, I worked
on some known holes in the existing classes, so this is new code.
The formatToCharacterIterator(Object) method defined in the
java.text.Format class is now implemented by AngleFormat. This allows
those who are interested in such information to known which part of the
formatted string is the degrees field, which part is the minutes field,
etc. It is possible to go down to "which part is the fraction digits of
the seconds field" for example. Some Graphical User Interfaces like
javax.swing.JFormatterTextField can use this information.
This information will cascade through SIS Format implementations. So
when formatting a metadata object in plain text (non-XML), it will be
possible to know for example which part is the north bound latitude
field of a geographic bounding box (or the fraction part of the seconds
field if someone really wants to go down to that level).
The implementation details required the port of
org.apache.sis.util.ObjectConverter interface. I noticed that Apache
Camel has a TypeConverter interface and Spring has a Converter
interface. Both uses slightly different approaches, but I think that the
Spring's one is closer to the SIS needs. The interface name is
ObjectConverter instead than TypeConverter because it does not
necessarily change the type; it may just changes the values while
keeping the same type.
Compared to the Spring interface, org.apache.sis.util.ObjectConverter
has the same "convert" method (so I think that it will be possible for
users to implement both the Spring one and the SIS one by the same
class), and the SIS interface defines additional methods for getting
some information about the conversion properties. There is many ways we
could describe the properties of such conversion, so I tried to stick to
concept in uses in mathematics:
* is the conversion injective?
* is the conversion surjective?
* is the conversion order preserving?
* is the conversion order reversing?
The javadoc tries to explain more what "injective" or "surjective"
means. Those information become important when we need to take in
account the context of the objects we are converting. For example when
converting the values of a range, if the conversing is order reversing
then we need to swap the min and max values. If the conversion is
neither order preserving or reversing (as for example conversions from
Integer to String, even if String implements Comparable) then we are not
allowed to convert range of values.
Martin