Ik heb een probleem met out parameters met corba, ik doe vast iets heel simpels fout, maar wat ik hierover kan vinden met google en de search kom ik niet verder. Ik zal eerst de code even geven en daarna het probleem omschrijven 
De IDL-file:
implementatie:
de client
Het probleem: de aanroep task.readPair("TEST2", bl); geeft een nullpointer in bytelistHolder.java (een van de automatisch gegenereerde files door de jidl compiler). Dit is vast iets waarna ik straks zeg
maar ik zie niet in wat ik verkeerd doe. Als er meer code nodig is (bijvoorbeeld van de server kant) hoor ik dat wel
De IDL-file:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| exception NotFound { long problem_number; string description; }; typedef sequence<char> bytelist; interface Tasks { readonly attribute unsigned long numElem; void pairOut(in string key, in bytelist value); // store key/value in bag void pairIn(in string key, out bytelist value) raises(NotFound); // return value belonging to key and remove it void readPair(in string key, out bytelist value) raises(NotFound); // return value belonging to key, keep in bag }; |
implementatie:
Java:
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
| import java.util.*; public class Tasks_impl extends TasksPOA { private Hashtable bag = new Hashtable(); public int numElem() { System.out.println("numElem() called"); return bag.size(); } public void pairOut(String key, char[] value) { // store key + value System.out.println("pairOut: " + key + " val:" + value); bag.put(key, value); } public void pairIn(String key, bytelistHolder value) throws NotFound { // remove key, return value System.out.println("pairIn: " + key); char[] v = (char[]) bag.get(key); if (v != null) { value = new bytelistHolder(v); bag.remove(key); } else { throw new NotFound(1, "No such element in bag."); } } public void readPair(String key, bytelistHolder value) throws NotFound { // return value belonging to key System.out.println("readPair " + key); char[] v = (char[]) bag.get(key); System.out.println("readPair, found key: " + v[0] + v[1] + v[2]); if (v != null) { value = new bytelistHolder(v); System.out.println("readPair, created bytelistHolder"); } else { throw new NotFound(1, "No such element in bag."); } } } |
de client
Java:
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
| import java.io.*; import org.omg.CORBA.*; import org.omg.CosNaming.*; public class taskclient_ns { public static void main(String[] args) { java.util.Properties props = System.getProperties(); props.put("org.omg.CORBA.ORBClass","com.ooc.CORBA.ORB"); props.put("org.omg.CORBA.ORBSingletonClass","com.ooc.CORBA.ORBSingleton"); try { ORB orb = ORB.init(args, props); org.omg.CORBA.Object ns_obj = orb.resolve_initial_references("NameService"); NamingContext nc = NamingContextHelper.narrow(ns_obj); NameComponent[] pathToObject = new NameComponent[2]; pathToObject[0] = new NameComponent("matthieu",""); pathToObject[1] = new NameComponent("TaskServer",""); org.omg.CORBA.Object obj = nc.resolve(pathToObject); Tasks task = TasksHelper.narrow(obj); char[] value = {'A','B','C'}; task.pairOut("TEST", value); task.pairOut("TEST2", value); System.out.println("Aantal elementen: " + task.numElem()); bytelistHolder bl = new bytelistHolder(); task.readPair("TEST2", bl); System.out.println("Test: " + bl.value[0]); orb.destroy(); } catch (Exception ex) { ex.printStackTrace(); } } } |
Het probleem: de aanroep task.readPair("TEST2", bl); geeft een nullpointer in bytelistHolder.java (een van de automatisch gegenereerde files door de jidl compiler). Dit is vast iets waarna ik straks zeg
What a caterpillar calls the end, the rest of the world calls a butterfly. (Lao-Tze)