sbgn / libsbgn

Libraries for the Systems Biology Graphical Notation (SBGN); Java and C++
Other
15 stars 8 forks source link

SbgnUtil.readFrom(InputStream is) fails when conversion from Milestone 1 or 2 necessary #49

Open tczauderna opened 5 years ago

tczauderna commented 5 years ago

SbgnUtil.readFrom(InputStream is) fails when a conversion is necessary (from Milestone 1 or 2).

The problem is that the input stream can only be used once.

This happens here Sbgn result = (Sbgn) unmarshaller.unmarshal(is);

Afterwards the input stream is closed and a conversion is not possible.

This will always fail String docUri = XmlUtil.getDocumentUri(is);

Possible fixes

  1. Don't provide conversion when an input stream is used. There is other readFrom methods which don't provide a conversion.
  2. Save the input stream to a file and use readFromFile
public static Sbgn readFrom(InputStream is) throws IOException, JAXBException {

    try {
        File tmp = File.createTempFile("sbgn-", ".sbgn");
        tmp.deleteOnExit();
        Files.copy(is, tmp.toPath(), StandardCopyOption.REPLACE_EXISTING);
        return readFromFile(tmp);
    } catch (IOException ex) {
        throw ex;
    }
}
fbergmann commented 5 years ago

thanks for letting me know, I have to say i was really surprised how hard it seems to be to get the namespace uri's in Java. I'll have a look ... maybe there should be an option on SbgnUtil that controls whether a conversion should be attempted or not, and only if perform the workaround. I'll think about it

fbergmann commented 5 years ago

added test code, and unified the way non-files are treated, i hope this resolves the issue.