summaryrefslogtreecommitdiff
path: root/src/main/java/com/c2kernel/utils/CastorXMLUtility.java
blob: 4dca39194f6bc51b946506279083b793ff79ff3f (plain)
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
package com.c2kernel.utils;

//Java
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.URL;
import java.util.HashSet;
import java.util.StringTokenizer;

import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;

import com.c2kernel.common.InvalidDataException;
import com.c2kernel.persistency.outcome.Outcome;


/**************************************************************************
 * Loads all mapfiles, and wraps marshalling/unmarshalling
 *
 * @author $Author: abranson $ $Date: 2004/10/20 14:10:21 $
 * @version $Revision: 1.12 $
 **************************************************************************/
public class CastorXMLUtility
{
    private static Mapping mMapping     = new Mapping();
    private static HashSet<URL> mMappingKeys = new HashSet<URL>();

    /**
     * Looks for a file called 'index.xml' at the given URL, and loads every file
     * listed in there by relative path
     *
     * @param mapURL - map root
     */
    static public void loadMapsFrom(URL mapURL) throws InvalidDataException {
        // load index.xml
        Logger.msg(3, "Loading maps from "+mapURL);
        String index;
        try {
            index = FileStringUtility.url2String( new URL(mapURL, "index") );
        } catch (Exception e) {
            Logger.warning("Could not load map index from "+mapURL.toString());
            return;
        }

        StringTokenizer sTokenizer = new StringTokenizer(index);
        while( sTokenizer.hasMoreTokens() ) {
            String thisMap = sTokenizer.nextToken();
            try {
                addMapping( new URL(mapURL, thisMap));
            } catch (Exception e) {
                Logger.error(e);
                throw new InvalidDataException("Error loading map '"+thisMap+"'", "");
            }
        }
        Logger.msg("Loaded all maps from "+mapURL.toString());
    }

   /**************************************************************************
    * Updates a mapping referenced by the mapID.
    * The same mapping cannot be loaded many times as it generates an exception.
    * That is the reason for this method as it maintains the HashSet of MappingKeys.
    **************************************************************************/
    static public void addMapping( URL mapID )
        throws IOException,
               MappingException,
               MarshalException,
               ValidationException
    {

        if( !mMappingKeys.contains(mapID) )
        {
            Logger.msg(7, "Added mapping file:"+mapID);

            mMapping.loadMapping( mapID );
            mMappingKeys.add( mapID );
        }
        else
        {
            Logger.msg("Map file already loaded:"+mapID);
        }
    }

   /**************************************************************************
    * Marshalls a mapped object to string. The mapping must be loaded before.
    * See updateMapping().
    **************************************************************************/
    static public String marshall( Object obj )
        throws IOException,
               MappingException,
               MarshalException,
               ValidationException
    {
        if (obj == null) return "<NULL/>";
        if (obj instanceof Outcome)
            return ((Outcome)obj).getData();
        StringWriter sWriter    = new StringWriter();
        Marshaller   marshaller = new Marshaller( sWriter );

        marshaller.setMapping( mMapping );
        marshaller.setMarshalAsDocument( false );
        marshaller.marshal( obj );

        return sWriter.toString();
    }

   /**************************************************************************
    * Unmarshalls a mapped object from string. The mapping must be loaded before.
    * See updateMapping().
    **************************************************************************/
    static public Object unmarshall( String data )
        throws IOException,
               MappingException,
               MarshalException,
               ValidationException
    {
        StringReader sReader      = new StringReader( data );
        Unmarshaller unmarshaller = new Unmarshaller( mMapping );
        if (data.equals("<NULL/>")) return null;
        return unmarshaller.unmarshal( sReader );
    }
}