Subversion Repository Public Repository

WOX2

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
package wox.serial;

import java.lang.reflect.*;
import org.litesoft.core.typeutils.Objects;
import java.util.*;

/**
 * Version: 1.0
 * Author: Carlos R. Jaimez Gonzalez
 * Author: Simon M. Lucas
 * Site: http://woxserializer.sourceforge.net/
 *
 * Version: 1.5
 * Author: Steven M Lewis
 *
 * Version: 2.0
 * Author: George Smith
 * SVN: http://svn.xp-dev.com/svn/WOX2/
 * Note: XML form for vs 2 is more compact and therefor incompatible with vs 1
 */

public class ArrayHandler extends AbstractHandler implements WoxIsAHandler
{
    public static final String WOX_TYPE = "array";

    public static final ArrayHandler INSTANCE = new ArrayHandler();

    protected ArrayHandler()
    {
    }

    @Override
    public String[] getForReadObjectWoxTypeNames()
    {
        return new String[]{WOX_TYPE}; // Because we only support one type
    }

    @Override
    public String getWoxTypeFor( WoxHandlers pWoxHandlers, Class pType, Field pField, boolean pJustType )
    {
        return WOX_TYPE; // Because we only support one type
    }

    @Override
    public boolean willReadObjectForWoxType( String pWoxType )
    {
        return Util.areEqual( WOX_TYPE, pWoxType );
    }

    public boolean isFor( Class pType )
    {
        return pType.isArray();
    }

    @Override
    public Class getNativeTypeFor( WoxHandlers pWoxHandlers, String pWoxType )
    {
        throw new ApplicationException( "Array Handler does not support GetNativeTypeFor for any type, including: " + pWoxType );
    }

    @Override
    public Object readObject( WoxHandlers pWoxHandlers, WoxReader pWoxReader, XMLreader pReader )
    {
        XMLreader zSubtree = pReader.createSubtreeReader();
        zSubtree.readStartElement(); //position the cursor to our element

        try
        {
            String zWoxArrayType = pReader.getAttribute( Serial.ELEMENT_TYPE );

            WoxHandler zHandler = pWoxHandlers.getWoxFieldHandler( zWoxArrayType );
            if ( zHandler != null && zHandler.willFieldValueNeverHaveAnySpaces() )
            {
                Class zFieldElementType = zHandler.getNativeTypeFor( pWoxHandlers, zWoxArrayType );
                // get element's value as String. e.g. "67 87 98 87"
                String zValuesAsString = pReader.readElementText().trim();
                String[] zValues = (zValuesAsString.length() != 0) //
                                   ? splitOnSpaces( zValuesAsString ) //
                                   : EMPTY_STRING_ARRAY;
                return zHandler.createArrayFor( zFieldElementType, zValues );
            }
            Class zComponentType = commonNativeType( pWoxHandlers, zWoxArrayType );
            if ( zComponentType == null )
            {
                throw new ApplicationException( "No Native Type for Wox Type: " + zWoxArrayType );
            }
            ArrayList zList = readObjects( pWoxReader, zSubtree );
            Object zArray = Array.newInstance( zComponentType, zList.size() );
            for ( int i = 0; i < zList.size(); i++ )
            {
                Array.set( zArray, i, zList.get( i ) );
            }
            return zArray;
        }
        catch ( Exception e )
        {
            throw new ApplicationException( "ArrayList Exception is: " + e.getMessage(), e );
        }
        finally
        {
            consume( zSubtree );
        }
    }

    @Override
    public void writeObject( WoxHandlers pWoxHandlers, WoxWriter pWoxWriter, Object pObject, Field pField, XMLwriter pWriter, boolean pJustType )
    {
        pWriter.writeStartElement( Serial.OBJECT );
        pWriter.writeAttributeString( Serial.TYPE, WOX_TYPE );

        Class zElementType = pObject.getClass().getComponentType();
        WoxHandler zHandler = pWoxHandlers.getNativeHandler( zElementType );
        if ( zHandler.willFieldValueNeverHaveAnySpaces() )
        {
            //These arrays can go easily to a String with spaces separating their elements.
            writeInLineArray( pWoxHandlers, zHandler, zElementType, pObject, pWriter );
        }
        else
        {
            String zElementWoxType = commonWoxType( pWoxHandlers, zElementType, pField, pJustType );

            pWriter.writeAttributeString( Serial.ELEMENT_TYPE, zElementWoxType );

            int zLength = Array.getLength( pObject );
            if ( zLength > 0 )
            {
                pWriter.writeAttributeString( Serial.ID, pWoxWriter.createIDfor( pObject ) );

                for ( int i = 0; i < zLength; i++ )
                {
                    pWoxWriter.write( Array.get( pObject, i ), pField, pWriter, pJustType );
                }
            }
        }
        pWriter.writeEndElement();
    }


    private static void writeInLineArray( WoxHandlers pWoxHandlers, WoxHandler pHandler, Class pElementType, Object pObject, XMLwriter pWriter )
    {
        pWriter.writeAttributeString( Serial.ELEMENT_TYPE, pHandler.getWoxTypeFor( pWoxHandlers, pElementType, null, false ) );

        int zLength = Array.getLength( pObject );

        if ( zLength != 0 )
        {
            StringBuilder sb = new StringBuilder();

            sb.append( pHandler.createFieldValue( Array.get( pObject, 0 ) ) );

            for ( int i = 1; i < zLength; i++ )
            {
                sb.append( ' ' ).append( pHandler.createFieldValue( Array.get( pObject, i ) ) );
            }

            pWriter.writeElementText( sb.toString() );
        }
    }

    private static String[] splitOnSpaces( String pValues )
    {
        List<String> zValues = new ArrayList<String>();
        int zFrom = 0;
        for ( int zAt; -1 != (zAt = pValues.indexOf( ' ', zFrom )); zFrom = zAt + 1 )
        {
            zValues.add( pValues.substring( zFrom, zAt ) );
        }
        zValues.add( pValues.substring( zFrom ) );
        return zValues.toArray( new String[zValues.size()] );
    }
}

Commits for WOX2/trunk/Java/src/wox/serial/ArrayHandler.java

Diff revisions: vs.
Revision Author Commited Message
17 Diff Diff GeorgeS picture GeorgeS Mon 02 Jun, 2014 23:44:02 +0000

Extracting commonfoundation

15 Diff Diff GeorgeS picture GeorgeS Fri 19 Feb, 2010 22:29:49 +0000
5 Diff Diff GeorgeS picture GeorgeS Fri 05 Feb, 2010 18:59:04 +0000
4 Diff Diff GeorgeS picture GeorgeS Fri 05 Feb, 2010 18:15:55 +0000
3 GeorgeS picture GeorgeS Thu 04 Feb, 2010 23:53:47 +0000