that's a very good point :)
so far, i'd been thinking in terms of adding an optional mapping for byte arrays but maybe this is something that is a common enough use case to support out-of-the-can. what do people think about this?
since the conversion will be performed (i think) in an ObjectStringConverter, encoding type could very reasonably be support through the flavour. this is intended for just the kind of usage you've used the encoding for and it has the (slight) advantage that it's saves adding an extra attribute. (it'd also be a good excuse for me to finish off the implementation of flavour.) again, opinions welcomed on this one.
- robert
On 14 Jul 2004, at 14:53, Inger, Matthew wrote:
If you're going to put something like <binary>, I would encourage you to put an encoding style there:
<foo> <bar encoding="base64">...</bar> </foo>
This would give people other methods of encoding in the future. As for the mapping, I think something like:
<element name="foo"> <element name="bar" property="bar" binary="true" encoding="base64" /> </element> </element>
In this way, it would become abundtantly clear exactly what is going on from the mapping. These properties could potentially be ignored if you weren't dealing with a type which could be converted to binary (byte[], String)
-----Original Message----- From: Henning P. Schmiedehausen [mailto:[EMAIL PROTECTED] Sent: Tuesday, July 13, 2004 11:51 AM To: [EMAIL PROTECTED] Subject: [BETWIXT] Array of bytes anyone?
Hi,
for a project, I need Betwixt to convert a special sort of beans into XML. Beans, which contain a byte [] property (They come from Hibernate which maps BINARY and TEXT onto these types, which is fine).
Regular Betwixt builds something like
<foo> <byte>0</byte> <byte>1</byte> <byte>2</byte> <byte>3</byte> </foo>
for propery foo, which is not exactly the most efficient way to express this array of bytes. Especially if it has about 5 MBytes size. ;-)
I was wondering whether I could get this done with regular betwixt but the isPrimitive() in XMLIntrospectorHelp always bite me. In the end I came up with the attached patch, which works fine for me (it might not be ideal, because the resulting XML contains the raw sew^Wbinary data if you write the bean out.
For my application I extend the DefaultObjectStringConverter to do base64 encoding on the fly and end up with nice looking XML like this:
<foo attr1="1" attr2="2" attr3="3">
<binary>
xCHPdC7mAlirPoYY8dZr1fACaXAqpW83BKOz// yCMWUkzgtkvkMhD0MwQpclKdsOhHB1PbaRzbxA
5KmsIprAxtG5Vkm2ze5jRUPY+og3Rqq5ccj19BL6joB0PKQmnJRlU0bw9ZGJntrIVH4g9Lq 1E4Sx
bquW8iIOBGvsE3kYaW0bbf1mdPT2ubNnW2+fbm17wnhQxw9Ertbz1M69Mdp649/TZ// 64WVw6Gg5
aLwq2161CMeKB0glbtMXxpNGASDG4G42q16YDtOIbJwRF429GLfpc+OJAI7UkHhGvx+cDcH YbTUC
YoSnsRNN+jn9AfcogqRDz/ SfejeSC8FY0WQzggCCM8LT2BdjNs3T9fNEgCzWMyXRTRSCofdVFiD2
L1cSbZxSgQAAAABJRU5ErkJggg==
</binary>
</foo>
which is exactly what I need.
I was wondering if it would be more clever to allow the user to explicitly set the primitiveType property of the element descriptor from the .betwixt file. I found no way to do so, though and I already had this patch which works for me.
Anyway, here is the patch, discussions welcome. ;-) This is against CVS HEAD. I would volunteer to write an Unit test for it if has a chance to get applied.
Regards Henning
--- cut ---
Index:
src/java/org/apache/commons/betwixt/digester/XMLIntrospectorHelper.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/ digest
er/XMLIntrospectorHelper.java,v
retrieving revision 1.31
diff -u -r1.31 XMLIntrospectorHelper.java
--- src/java/org/apache/commons/betwixt/digester/ XMLIntrospectorHelper.java
4 Jul 2004 16:40:49 -0000 1.31
+++ src/java/org/apache/commons/betwixt/digester/ XMLIntrospectorHelper.java
13 Jul 2004 15:39:37 -0000
@@ -583,6 +583,8 @@
} else if ( type.equals( Object.class ) ) {
return false;
+ } else if (type.equals ( byte [].class) ) {
+ return true;
}
return type.getName().startsWith( "java.lang." )
|| Number.class.isAssignableFrom( type )
Index:
src/java/org/apache/commons/betwixt/strategy/ DefaultObjectStringConverter.ja
va
===================================================================
RCS file:
/home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/ strate
gy/DefaultObjectStringConverter.java,v
retrieving revision 1.10
diff -u -r1.10 DefaultObjectStringConverter.java
---
src/java/org/apache/commons/betwixt/strategy/ DefaultObjectStringConverter.ja
va 4 Jul 2004 16:57:05 -0000 1.10
+++
src/java/org/apache/commons/betwixt/strategy/ DefaultObjectStringConverter.ja
va 13 Jul 2004 15:39:37 -0000
@@ -66,7 +66,8 @@
if ( object instanceof java.util.Date && isUtilDate( type ) ) {
return formatter.format( (java.util.Date) object );
-
+ } else if ( object instanceof byte[]) {
+ return new String((byte []) object);
} else {
// use ConvertUtils implementation
return super.objectToString( object, type, flavour, context
);
@@ -98,6 +99,8 @@
// but never mind
return value;
}
+ } else if (type.equals(byte [].class)) {
+ return value.getBytes();
} else {
// use ConvertUtils implementation
return super.stringToObject( value, type, flavour, context
);
--- cut ---
-- Dipl.-Inf. (Univ.) Henning P. Schmiedehausen INTERMETA GmbH [EMAIL PROTECTED] +49 9131 50 654 0 http://www.intermeta.de/
RedHat Certified Engineer -- Jakarta Turbine Development -- hero for hire
Linux, Java, perl, Solaris -- Consulting, Training, Development
"Fighting for one's political stand is an honorable action, but re- fusing to acknowledge that there might be weaknesses in one's position - in order to identify them so that they can be remedied - is a large enough problem with the Open Source movement that it deserves to be on this list of the top five problems." -- Michelle Levesque, "Fundamental Issues with Open Source Software Development"
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
