import java.io.InputStream;
import java.io.OutputStream;
+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 {
protected abstract void toStream(OutputStream out, Object value)
* @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 {
- if (!isSupported(value)) {
- return false;
+ 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);
}
+ }
- SerialUtils.write(out, "custom^");
- SerialUtils.write(out, getType());
- SerialUtils.write(out, "^");
- toStream(out, value);
+ public Object decode(InputStream in) throws IOException {
+ ReplaceInputStream replace = new ReplaceInputStream(in, //
+ new String[] { "\\\\", "\\n" }, //
+ new String[] { "\\", "\n" });
- return true;
- }
+ try {
+ NextableInputStream stream = new NextableInputStream(
+ replace.open(), new NextableInputStreamStep('^'));
+ try {
+ if (!stream.next()) {
+ throw new IOException(
+ "Cannot find the first custom^ element");
+ }
- public Object decode(String encodedValue) throws IOException {
- return fromString((String) SerialUtils.decode(contentOf(encodedValue)));
+ 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();
+ }
+ } finally {
+ replace.close(false);
+ }
}
public static boolean isCustom(String encodedValue) {