summaryrefslogtreecommitdiff
path: root/source/com/c2kernel/persistency/ProxyLoader.java
blob: d20fb2d40b9eb562910fcdad4d26ea9848d6ebd9 (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
package com.c2kernel.persistency;
import java.util.HashMap;
import java.util.StringTokenizer;

import com.c2kernel.entity.AgentHelper;
import com.c2kernel.entity.C2KLocalObject;
import com.c2kernel.entity.ItemHelper;
import com.c2kernel.entity.ManageableEntity;
import com.c2kernel.lookup.EntityPath;
import com.c2kernel.lookup.LDAPLookup;
import com.c2kernel.persistency.outcome.Outcome;
import com.c2kernel.process.Gateway;
import com.c2kernel.utils.CastorXMLUtility;
import com.c2kernel.utils.Logger;

/** Used by proxies to load clusters by queryData from the Entity.
*   Last client storage - only used if not cached elsewhere
*/

public class ProxyLoader extends ClusterStorage {
    HashMap entities = new HashMap();
    LDAPLookup lookup;

    public void open() throws ClusterStorageException {
        lookup = Gateway.getLDAPLookup();
    }

    public void close() throws ClusterStorageException {
    }
    // introspection
    public short queryClusterSupport(String clusterType) {
        return READ;
    }

    public String getName() {
        return "Proxy Cluster Loader";
    }
    
    public String getId() {
        return "CORBA";
    }

    // retrieve object by path
    public C2KLocalObject get(Integer sysKey, String path) throws ClusterStorageException {
        try {
            ManageableEntity thisEntity = getIOR(sysKey);
            String type = getClusterType(path);

            // fetch the xml from the item
            String queryData = thisEntity.queryData(path);
            
            if (queryData != null) {
                if (type.equals(OUTCOME)) 
                    return new Outcome(path, queryData);
                else                	
                    return (C2KLocalObject)CastorXMLUtility.unmarshall(queryData);
            }
        } catch (Exception e) {
            //Logger.error(e);
            throw new ClusterStorageException(e.getMessage());
        }
        return null;
    }
    
    // store object by path
    public void put(Integer sysKey, C2KLocalObject obj) throws ClusterStorageException {
        // not supported
        throw new ClusterStorageException("Cannot write to items through the ProxyLoader");
    }
    // delete cluster
    public void delete(Integer sysKey, String path) throws ClusterStorageException {
        // not supported
        throw new ClusterStorageException("Cannot write to items through the ProxyLoader");
    }

    /* navigation */

    // directory listing
    public String[] getClusterContents(Integer sysKey, String path) throws ClusterStorageException {
        try {
            ManageableEntity thisEntity = getIOR(sysKey);
            String contents = thisEntity.queryData(path+"/all");
            StringTokenizer tok = new StringTokenizer(contents, ",");
            String[] result = new String[tok.countTokens()];
            for (int i=0; i<result.length; i++) 
                result[i] = tok.nextToken();
                
            return result;
        } catch (Exception e) {
            throw new ClusterStorageException(e.getMessage());
        }
    }
    
    private ManageableEntity getIOR(Integer sysKey) throws ClusterStorageException {
        if (entities.containsKey(sysKey)) {
            // check the cache
            Logger.msg(7, "ProxyLoader.getIOR() - "+sysKey+" cached.");
            return (ManageableEntity)entities.get(sysKey);
        }
        
        try {
            Logger.msg(7, "ProxyLoader.getIOR() - Resolving "+sysKey+".");
        
            org.omg.CORBA.Object ior = lookup.getIOR(new EntityPath(sysKey.intValue()));
        
            ManageableEntity thisEntity = null;
            try {
                thisEntity = ItemHelper.narrow(ior);
            } catch (org.omg.CORBA.BAD_PARAM ex) {
                try {
                    thisEntity =  AgentHelper.narrow(ior);
                } catch (org.omg.CORBA.BAD_PARAM ex2) {
                    throw new ClusterStorageException ("Could not narrow "+sysKey+" as a known Entity type");
                }
            }
            
            Logger.msg(7, "ProxyLoader.getIOR() - Found "+sysKey+".");
            entities.put(sysKey, thisEntity);
            return thisEntity;
        } catch (Exception e) {
            throw new ClusterStorageException("Error narrowing "+sysKey+": "+e.getMessage());
        }
    }
}