Subversion Repository Public Repository

litesoft

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package org.litesoft.codec;

import org.litesoft.core.annotations.*;
import org.litesoft.core.util.*;

public abstract class AbstractCodec<T> implements Codec<T>
{
    protected static final char NULL_AS_CHAR = SixBitCodec.ESCAPE;
    protected static final String NULL_AS_STRING = Character.toString( NULL_AS_CHAR );

    @Override
    public final @NotNull String encode( @Nullable T pValue )
    {
        return (pValue == null) ? NULL_AS_STRING : encodeNonNull( pValue );
    }

    @Override
    public final @Nullable T decode( @NotNull String pValue )
    {
        CharSource zCharSource = new CharSource( pValue );
        T zDecoded = decode( zCharSource );
        if ( zCharSource.anyRemaining() )
        {
            throw new IllegalArgumentException( "Extraneous character(s) starting at " + zCharSource.getFrom() + " in: " + pValue );
        }
        return zDecoded;
    }

    @Override
    public final @Nullable T decode( @NotNull CharSource pCharSource )
    {
        return isEscapeWithConsume( pCharSource ) ? null : decodeNonNull( pCharSource );
    }

    protected abstract @NotNull String encodeNonNull( T pValue );

    protected abstract @NotNull T decodeNonNull( CharSource pCharSource );

    protected static boolean isEscapeWithConsume( CharSource pCharSource )
    {
        if ( pCharSource.peek() == NULL_AS_CHAR )
        {
            pCharSource.get(); // consume
            return true;
        }
        return false;
    }
}

Commits for litesoft/trunk/Java/core/Anywhere/src/org/litesoft/codec/AbstractCodec.java

Diff revisions: vs.
Revision Author Commited Message
767 Diff Diff GeorgeS picture GeorgeS Sat 14 Jul, 2012 18:19:39 +0000
766 GeorgeS picture GeorgeS Sat 14 Jul, 2012 16:38:04 +0000

!