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

//Java
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.MalformedURLException;
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 org.exolab.castor.xml.XMLContext;

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 XMLContext mappingContext;
    
    /**
     * 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
     */    
    public CastorXMLUtility(URL mapURL) throws InvalidDataException {
        // load index
        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);
        Mapping thisMapping = new Mapping();
        HashSet<URL> loadedMapURLs = new HashSet<URL>();
        try { 
        	while( sTokenizer.hasMoreTokens() ) {
	            String thisMap = sTokenizer.nextToken();
	            URL thisMapURL = new URL(mapURL, thisMap);
	            if( !loadedMapURLs.contains(thisMapURL) ) {
	                Logger.msg(7, "Adding mapping file:"+thisMapURL);
	                thisMapping.loadMapping( thisMapURL );
	                loadedMapURLs.add( thisMapURL );
	            }
	            else {
	                Logger.msg("Map file already loaded:"+thisMapURL);
	            }
	        }
	        
        	mappingContext = new XMLContext();
			mappingContext.addMapping(thisMapping);
		} catch (MappingException ex) {
			Logger.error(ex);
			throw new InvalidDataException("XML Mapping files are not valid: "+ex.getMessage());
		} catch (MalformedURLException ex) {
			Logger.error(ex);
			throw new InvalidDataException("Mapping file location invalid: "+ex.getMessage());
		} catch (IOException ex) {
			Logger.error(ex);
			throw new InvalidDataException("Could not read XML mapping files: "+ex.getMessage());
		}
        
        Logger.msg(1, "Loaded all maps from "+mapURL.toString());

    }

   /**************************************************************************
    * Marshalls a mapped object to string. The mapping must be loaded before.
    * See updateMapping().
    **************************************************************************/
    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 = mappingContext.createMarshaller();
        
        marshaller.setWriter(sWriter);
        marshaller.setMarshalAsDocument( false );
        marshaller.marshal( obj );

        return sWriter.toString();
    }

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