Skip to content

Commit

Permalink
Fix issue #133 by making pxp:zip sensitive to c:data/@encoding settin…
Browse files Browse the repository at this point in the history
…gs on the stored document
  • Loading branch information
ndw committed Dec 11, 2013
1 parent f31ff67 commit ffa56c8
Showing 1 changed file with 62 additions and 12 deletions.
74 changes: 62 additions & 12 deletions src/com/xmlcalabash/extensions/Zip.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import java.io.InputStream; import java.io.InputStream;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URI; import java.net.URI;
import java.net.URL; import java.net.URL;
Expand All @@ -19,6 +21,7 @@
import java.util.Map; import java.util.Map;
import java.util.TimeZone; import java.util.TimeZone;
import java.util.zip.CRC32; import java.util.zip.CRC32;
import java.util.zip.GZIPOutputStream;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipFile; import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream; import java.util.zip.ZipInputStream;
Expand All @@ -32,6 +35,8 @@
import com.xmlcalabash.core.XProcRuntime; import com.xmlcalabash.core.XProcRuntime;
import com.xmlcalabash.core.XProcConstants; import com.xmlcalabash.core.XProcConstants;
import com.xmlcalabash.model.RuntimeValue; import com.xmlcalabash.model.RuntimeValue;
import com.xmlcalabash.util.Base64;
import com.xmlcalabash.util.JSONtoXML;
import com.xmlcalabash.util.TreeWriter; import com.xmlcalabash.util.TreeWriter;
import com.xmlcalabash.util.S9apiUtils; import com.xmlcalabash.util.S9apiUtils;
import com.xmlcalabash.util.RelevantNodes; import com.xmlcalabash.util.RelevantNodes;
Expand All @@ -41,6 +46,7 @@
import com.xmlcalabash.library.DefaultStep; import com.xmlcalabash.library.DefaultStep;
import com.xmlcalabash.library.HttpRequest; import com.xmlcalabash.library.HttpRequest;
import com.xmlcalabash.runtime.XAtomicStep; import com.xmlcalabash.runtime.XAtomicStep;
import com.xmlcalabash.util.XMLtoJSON;
import net.sf.saxon.s9api.SaxonApiException; import net.sf.saxon.s9api.SaxonApiException;
import net.sf.saxon.s9api.QName; import net.sf.saxon.s9api.QName;
import net.sf.saxon.s9api.XdmNode; import net.sf.saxon.s9api.XdmNode;
Expand Down Expand Up @@ -71,6 +77,10 @@ public class Zip extends DefaultStep {
private static final QName _detailed = new QName("detailed"); private static final QName _detailed = new QName("detailed");
private static final QName _status = new QName("status"); private static final QName _status = new QName("status");
private static final QName _value = new QName("value"); private static final QName _value = new QName("value");
private static final QName c_encoding = new QName("c", XProcConstants.NS_XPROC_STEP, "encoding");
private static final QName c_body = new QName("c", XProcConstants.NS_XPROC_STEP, "body");
private static final QName c_json = new QName("c", XProcConstants.NS_XPROC_STEP, "json");
private static final QName _content_type = new QName("content-type");
private final static int bufsize = 8192; private final static int bufsize = 8192;


private final static QName serializerAttrs[] = { private final static QName serializerAttrs[] = {
Expand Down Expand Up @@ -139,12 +149,8 @@ public void run() throws SaxonApiException {


parseManifest(man); parseManifest(man);


File zipFile = null; URI uri = getOption(_href).getBaseURI().resolve(zipFn);
try { File zipFile = new File(uri);
zipFile = new File(new URI(zipFn));
} catch (URISyntaxException e) {
throw new XProcException(e);
}


File zipParent = zipFile.getParentFile(); File zipParent = zipFile.getParentFile();
File zipTemp = null; File zipTemp = null;
Expand Down Expand Up @@ -352,9 +358,7 @@ public void update(ZipFile inZip, ZipOutputStream outZip, boolean freshen) {
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
if (srcManifest.containsKey(uri.toString())) { if (srcManifest.containsKey(uri.toString())) {
XdmNode doc = srcManifest.get(href); XdmNode doc = srcManifest.get(href);
Serializer serializer = makeSerializer(file.getOptions()); store(file, doc, baos);
serializer.setOutputStream(baos);
S9apiUtils.serialize(runtime, doc, serializer);
} else { } else {
URLConnection connection = uri.toURL().openConnection(); URLConnection connection = uri.toURL().openConnection();
InputStream stream = connection.getInputStream(); InputStream stream = connection.getInputStream();
Expand All @@ -376,9 +380,7 @@ public void update(ZipFile inZip, ZipOutputStream outZip, boolean freshen) {


if (srcManifest.containsKey(href)) { if (srcManifest.containsKey(href)) {
XdmNode doc = srcManifest.get(href); XdmNode doc = srcManifest.get(href);
Serializer serializer = makeSerializer(file.getOptions()); store(file, doc, outZip);
serializer.setOutputStream(outZip);
S9apiUtils.serialize(runtime, doc, serializer);
} else { } else {
URL url = uri.toURL(); URL url = uri.toURL();
URLConnection connection = url.openConnection(); URLConnection connection = url.openConnection();
Expand Down Expand Up @@ -592,6 +594,54 @@ private long readLastModified(URI uri) {
} }
} }


protected void store(FileToZip file, XdmNode doc, OutputStream out) throws SaxonApiException, IOException {
XdmNode root = S9apiUtils.getDocumentElement(doc);

if (((XProcConstants.NS_XPROC_STEP.equals(root.getNodeName().getNamespaceURI())
&& "base64".equals(root.getAttributeValue(_encoding)))
|| ("".equals(root.getNodeName().getNamespaceURI())
&& "base64".equals(root.getAttributeValue(c_encoding))))) {
storeBinary(file, doc, out);
} else if (XProcConstants.c_result.equals(root.getNodeName())
&& root.getAttributeValue(_content_type) != null
&& root.getAttributeValue(_content_type).startsWith("text/")) {
storeText(file, doc, out);
} else if (runtime.transparentJSON()
&& (((c_body.equals(root.getNodeName())
&& ("application/json".equals(root.getAttributeValue(_content_type))
|| "text/json".equals(root.getAttributeValue(_content_type))))
|| c_json.equals(root.getNodeName()))
|| JSONtoXML.JSONX_NS.equals(root.getNodeName().getNamespaceURI())
|| JSONtoXML.JXML_NS.equals(root.getNodeName().getNamespaceURI())
|| JSONtoXML.MLJS_NS.equals(root.getNodeName().getNamespaceURI()))) {
storeJSON(file, doc, out);
} else {
storeXML(file, doc, out);
}
}

public void storeBinary(FileToZip file, XdmNode doc, OutputStream out) throws IOException {
byte[] decoded = Base64.decode(doc.getStringValue());
out.write(decoded);
}

public void storeText(FileToZip file, XdmNode doc, OutputStream out) throws IOException {
out.write(doc.getStringValue().getBytes());
}

public void storeJSON(FileToZip file, XdmNode doc, OutputStream out) {
PrintWriter writer = new PrintWriter(out);
String json = XMLtoJSON.convert(doc);
writer.print(json);
writer.close();
}

public void storeXML(FileToZip file, XdmNode doc, OutputStream out) throws SaxonApiException {
Serializer serializer = makeSerializer(file.getOptions());
serializer.setOutputStream(out);
S9apiUtils.serialize(runtime, doc, serializer);
}

public Serializer makeSerializer(Hashtable<QName,String> options) { public Serializer makeSerializer(Hashtable<QName,String> options) {
Serializer serializer = new Serializer(); Serializer serializer = new Serializer();


Expand Down

0 comments on commit ffa56c8

Please sign in to comment.