Source ret = null;
if(src instanceof DOMSource) {
DOMSource dsrc = (DOMSource)src;
ret = new DOMSource(dsrc.getNode() != null ? dsrc.getNode().cloneNode(true) : null);
} else if(src instanceof SAXSource) {
SAXSource ssrc = (SAXSource)src;
if(ssrc.getInputSource().getByteStream() != null) {
InputStream inp = ssrc.getInputSource().getByteStream();
ByteArrayOutputStream bout = new ByteArrayOutputStream();
int b;
try {
while((b = inp.read()) != -1) {
bout.write(b);
}
} catch (IOException ignored) {
}
try { bout.close();} catch (IOException ignored) {}
try { inp.reset();} catch (IOException ignored) {}
ret = new SAXSource(new InputSource(new ByteArrayInputStream(bout.toByteArray())));
} else if(ssrc.getInputSource().getCharacterStream() != null) {
Reader rdr = ssrc.getInputSource().getCharacterStream();
CharArrayWriter caw = new CharArrayWriter();
try {
int c;
while((c = rdr.read()) != -1) {
caw.append((char)c);
}
} catch (IOException ignored) {
}
caw.close();
try{ rdr.reset();} catch(IOException ignored) {}
ret = new SAXSource(new InputSource(new CharArrayReader(caw.toCharArray())));
} else {
ret = new SAXSource();
}
} else if(src instanceof StreamSource) {
StreamSource ssrc = (StreamSource)src;
if(ssrc.getInputStream() != null) {
InputStream inp = ssrc.getInputStream();
ByteArrayOutputStream bout = new ByteArrayOutputStream();
int b;
try {
while((b = inp.read()) != -1) {
bout.write(b);
}
} catch (IOException ignored) {
}
try { bout.close();} catch (IOException ignored) {}
try { inp.reset();} catch (IOException ignored) {}
ret = new StreamSource(new ByteArrayInputStream(bout.toByteArray()));
} else if(ssrc.getReader() != null) {
Reader rdr = ssrc.getReader();
CharArrayWriter caw = new CharArrayWriter();
try {
int c;
while((c = rdr.read()) != -1) {
caw.append((char)c);