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+og3Rqq5ccj19BL6joB0PKQmnJRlU0bw9ZGJntrIVH4g9Lq1E4Sx
bquW8iIOBGvsE3kYaW0bbf1mdPT2ubNnW2+fbm17wnhQxw9Ertbz1M69Mdp649/TZ//64WVw6Gg5
aLwq2161CMeKB0glbtMXxpNGASDG4G42q16YDtOIbJwRF429GLfpc+OJAI7UkHhGvx+cDcHYbTUC
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]