import be.nikiroo.utils.IOUtils;
import be.nikiroo.utils.streams.NextableInputStream;
import be.nikiroo.utils.streams.NextableInputStreamStep;
+import be.nikiroo.utils.streams.ReplaceInputStream;
+import be.nikiroo.utils.streams.ReplaceOutputStream;
public abstract class CustomSerializer {
* @param value
* the object to encode
*
- * @return FALSE if the value is not supported, TRUE if the operation was
- * successful (if the value is supported by the operation was not
- * successful, you will get an {@link IOException})
- *
* @throws IOException
* in case of I/O error
*/
- public boolean encode(OutputStream out, Object value) throws IOException {
- SerialUtils.write(out, "custom^");
- SerialUtils.write(out, getType());
- SerialUtils.write(out, "^");
- // TODO: manage ENTER
- toStream(out, value);
-
- return true;
+ public void encode(OutputStream out, Object value) throws IOException {
+ ReplaceOutputStream replace = new ReplaceOutputStream(out, //
+ new String[] { "\\", "\n" }, //
+ new String[] { "\\\\", "\\n" });
+ try {
+ SerialUtils.write(replace, "custom^");
+ SerialUtils.write(replace, getType());
+ SerialUtils.write(replace, "^");
+ toStream(replace, value);
+ } finally {
+ replace.close(false);
+ }
}
public Object decode(InputStream in) throws IOException {
- // TODO: manage ENTER
- NextableInputStream stream = new NextableInputStream(in,
- new NextableInputStreamStep('^'));
+ ReplaceInputStream replace = new ReplaceInputStream(in, //
+ new String[] { "\\\\", "\\n" }, //
+ new String[] { "\\", "\n" });
try {
- if (!stream.next()) {
- throw new IOException("Cannot find the first custom^ element");
+ NextableInputStream stream = new NextableInputStream(
+ replace.open(), new NextableInputStreamStep('^'));
+ try {
+ if (!stream.next()) {
+ throw new IOException(
+ "Cannot find the first custom^ element");
+ }
+
+ String custom = IOUtils.readSmallStream(stream);
+ if (!"custom".equals(custom)) {
+ throw new IOException(
+ "Cannot find the first custom^ element, it is: "
+ + custom + "^");
+ }
+
+ if (!stream.next()) {
+ throw new IOException("Cannot find the second custom^"
+ + getType() + " element");
+ }
+
+ String type = IOUtils.readSmallStream(stream);
+ if (!getType().equals(type)) {
+ throw new IOException("Cannot find the second custom^"
+ + getType() + " element, it is: custom^" + type
+ + "^");
+ }
+
+ if (!stream.nextAll()) {
+ throw new IOException("Cannot find the third custom^"
+ + getType() + "^value element");
+ }
+
+ return fromStream(stream);
+ } finally {
+ stream.close();
}
-
- String custom = IOUtils.readSmallStream(stream);
- if (!"custom".equals(custom)) {
- throw new IOException(
- "Cannot find the first custom^ element, it is: "
- + custom + "^");
- }
-
- if (!stream.next()) {
- throw new IOException("Cannot find the second custom^"
- + getType() + " element");
- }
-
- String type = IOUtils.readSmallStream(stream);
- if (!getType().equals(type)) {
- throw new IOException("Cannot find the second custom^"
- + getType() + " element, it is: custom^" + type + "^");
- }
-
- if (!stream.nextAll()) {
- throw new IOException("Cannot find the third custom^"
- + getType() + "^value element");
- }
-
- // TODO: manage ENTER
- return fromStream(stream);
} finally {
- stream.close(false);
+ replace.close(false);
}
}
import java.util.Map;
import be.nikiroo.utils.IOUtils;
+import be.nikiroo.utils.StringUtils;
import be.nikiroo.utils.streams.NextableInputStream;
import be.nikiroo.utils.streams.NextableInputStreamStep;
-import be.nikiroo.utils.StringUtils;
/**
* A simple class that can accept the output of {@link Exporter} to recreate
* content, or a number of lines of it (any given line <b>MUST</b> be
* complete though) and accumulate it with the already present data.
*
- * @param data
+ * @param in
* the data to parse
*
* @return itself so it can be chained
* Read a single (whole) line of serialised data into this {@link Importer}
* and accumulate it with the already present data.
*
- * @param line
+ * @param in
* the line to parse
*
* @return TRUE if we are just done with one object or sub-object
import be.nikiroo.utils.IOUtils;
import be.nikiroo.utils.Image;
+import be.nikiroo.utils.StringUtils;
import be.nikiroo.utils.streams.NextableInputStream;
import be.nikiroo.utils.streams.NextableInputStreamStep;
-import be.nikiroo.utils.StringUtils;
/**
* Small class to help with serialisation.
@Override
protected void toStream(OutputStream out, Object value)
throws IOException {
- // TODO: we use \n to separate, and b64 to un-\n -- but we could
- // use \\n ?
+
+ // TODO: we use \n to separate, and b64 to un-\n
+ // -- but we could use \\n ?
String type = value.getClass().getCanonicalName();
type = type.substring(0, type.length() - 2); // remove the []
} else if (value.getClass().getSimpleName().endsWith("[]")) {
// Simple name does support [] suffix and do not return NULL for
// inner anonymous classes
- return customTypes.get("[]").encode(out, value);
+ customTypes.get("[]").encode(out, value);
} else if (customTypes.containsKey(value.getClass().getCanonicalName())) {
- return customTypes.get(value.getClass().getCanonicalName())//
+ customTypes.get(value.getClass().getCanonicalName())//
.encode(out, value);
} else if (value instanceof String) {
encodeString(out, (String) value);
// aa bb -> "aa\tbb"
static void encodeString(OutputStream out, String raw) throws IOException {
+ // TODO: not. efficient.
out.write('\"');
// TODO !! utf-8 required
for (char car : raw.toCharArray()) {