[
https://issues.apache.org/jira/browse/TUSCANY-1838?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12566049#action_12566049
]
Amita Vadhavkar commented on TUSCANY-1838:
------------------------------------------
See below analysis of what I understood so far - conclusion from that -
Kelvin's fix in http://svn.apache.org/viewvc?rev=583095&view=rev
is correct even though it is irrelevant for the below as well as for Ron's test
condition.
HelperProviderBase is abstract but HelperProviderImpl does provide required
Helpers. When the call comes to
Resolvable.writeExternal(ObjectOutput) and when target in Resolvable is set to
a DataObject -
HelperProvideBase.ResolvableImpl.writeDataObject(DataObject dataObject,
ObjectOutput objectOutput) is called.
In this if DataObject(target) does not have a DataGraph and does not have a
container, xmlHelperLocal is assigned
from instance member xmlHelper. As HelperProviderImpl does provide all Helpers,
at this point xmlHelper should be
not null. Further as a special case, if ObjectOutput is instance of
SDOObjectOutputStream, its HelperContext is used
and so xmlHelperLocal take value from it. But if ObjectOutput is not instance
of SDOObjectOutputStream, the xmlHelper
already obtained from HelperProviderImpl will hold good. So it will be
"available".
To further verify this, I wrote a small test case like below - please note -
quote.detach();//to make sure data graph and container are null
****************************************************************
public void testWriteDataObject() throws Exception {
URL url = getClass().getResource("/simple.xsd");
InputStream inputStream = url.openStream();
XSDHelper.INSTANCE.define(inputStream, url.toString());
inputStream.close();
DataGraph dataGraph = SDOUtil.createDataGraph();
Type quoteType = dataGraph.getType("http://www.example.com/simple",
"Quote");
DataObject quote = dataGraph.createRootObject(quoteType);
quote.setString("symbol", "HP");
System.out.println("before detach:"+XMLHelper.INSTANCE.save(quote,
"quote", "quote"));
quote.detach();//***to make sure data graph and container are null
System.out.println("after detach:"+XMLHelper.INSTANCE.save(quote,
"quote", "quote"));
ByteArrayOutputStream compressedByteArrayOutputStream = new
ByteArrayOutputStream();
GZIPOutputStream gzipOutputStream = new
GZIPOutputStream(compressedByteArrayOutputStream);
XMLHelper.INSTANCE.save(quote, "commonj.sdo", "dataObject",
gzipOutputStream);
gzipOutputStream.close(); // Flush the contents
System.out.println("byes in target DO..being
written:"+compressedByteArrayOutputStream.toByteArray().length);
HelperProvider hp = HelperProvider.getInstance();
if(hp instanceof HelperProviderBase) {
HelperProviderBase hpb = (HelperProviderBase)hp;
Resolvable resolvable = hpb.resolvable(quote);
FileOutputStream fos = new FileOutputStream("c:/test123.txt");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
resolvable.writeExternal(oos);
oos.flush();
byte[] writtenDOBytes = baos.toByteArray();
fos.write(writtenDOBytes);
fos.flush();
fos.close();
System.out.println("Reading Now.......");
FileInputStream fis = new FileInputStream("c:/test123.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
byte firstByte = ois.readByte();
System.out.println("firstByte:"+firstByte);
int nextInt = ois.readInt();
System.out.println("nextInt-length:"+nextInt);
int idx = 0;
byte[] readRemainingBytes = new byte[1000];
while(true) {
try{
readRemainingBytes[idx] = ois.readByte();
//System.out.println("read byte:"+idx);
idx++;
} catch(Exception e) {
//e.printStackTrace();
break;
}
}
String stringOfDO = new String(readRemainingBytes, 0, idx);
System.out.println("stringOfDOBytes
length:"+stringOfDO.length());
}
}
****************************************************************
Output
before detach:<?xml version="1.0" encoding="UTF-8"?>
<quote:quote xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:quote="quote"
xmlns:simple="http://www.example.com/simple" xsi:type="simple:Quote">
<symbol>HP</symbol>
</quote:quote>
after detach:<?xml version="1.0" encoding="UTF-8"?>
<quote:quote xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:quote="quote"
xmlns:simple="http://www.example.com/simple" xsi:type="simple:Quote">
<symbol>HP</symbol>
</quote:quote>
byes in target DO..being written:199
Reading Now.......
firstByte:1
nextInt-length:199
stringOfDOBytes length:199
****************************************************************
In above test ByteArrayOutputStream was not instance of SDOObjectOutputStream
and still xmlHelper was available.
Will you please provide a test case to demonstrate the exact failure/xmlHelper
unavailability? Ot else shall we mark
this JIRA Resolved/Fixed?
Regards,
Amita
> HelperContext provided to createObjectOutputStream is inadvertantly ignored
> ---------------------------------------------------------------------------
>
> Key: TUSCANY-1838
> URL: https://issues.apache.org/jira/browse/TUSCANY-1838
> Project: Tuscany
> Issue Type: Bug
> Affects Versions: Java-SDO-1.0
> Reporter: Kelvin Goodson
> Fix For: Java-SDO-Next
>
>
> Ron Gavlin reported in http://www.mail-archive.com/[EMAIL
> PROTECTED]/msg01884.html an issue with HelperContexts being unavailable
> during marshalling. I feel sure that this is due to this piece of code here
> in HelperProviderBase::ResolvableImpl#writeDataObject
> XMLHelper xmlHelperLocal = xmlHelper;
> if(objectOutput instanceof SDOObjectInputStream)
> {
> xmlHelperLocal =
> ((SDOObjectInputStream)objectOutput).getHelperContext().getXMLHelper();
> }
> xmlHelperLocal.save(dataObject, "commonj.sdo", "dataObject",
> gzipOutputStream);
> where the instanceof test and cast should be to SDOObjectOutputStream
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]