[java/CORBA] sequence out parameter

Pagina: 1
Acties:

  • Nvidiot
  • Registratie: Mei 2003
  • Laatst online: 11-01 23:32
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:
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 |:( 8)7 maar ik zie niet in wat ik verkeerd doe. Als er meer code nodig is (bijvoorbeeld van de server kant) hoor ik dat wel ;)

What a caterpillar calls the end, the rest of the world calls a butterfly. (Lao-Tze)


  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
Niet dat het de oorzaak is maar je output eerst v[0] tm 2 naar stdout en gaat daarna eens kijken of v niet null is. :o

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 19:36
Ik ken helaas de Java binding voor CORBA niet, maar het zou me niets verbazen als excepties niet goed geïsoleerd zijn en wat Gert beschrijft ook de oorzaak van het probleem is.

Op zich lijkt me dat wel vreemd, want dat zou ook betekenen dat je HashTable niet goed werkt en dat lijkt me nogal onwaarschijnlijk. Kun je eens de hele stack trace geven?

  • Nvidiot
  • Registratie: Mei 2003
  • Laatst online: 11-01 23:32
sorry voor de trage reply, nogal druk geweest met LOTR marathon :+

De print gaat prima, das het probleem niet, die staat er alleen om ff te kijken wat er gebeurt.

code:
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
readPair TEST2
readPair, found key: ABC
readPair, created bytelistHolder
warning: Servant method raised a non-CORBA exception
Client receives this exception as CORBA::UNKNOWN
operation name: "readPair"
id: iiop
local address: 129.125.21.131:44178
remote address: 129.125.21.131:44185
java.lang.NullPointerException
        at bytelistHelper.write(bytelistHelper.java:70)
        at TasksPOA._OB_op_readPair(TasksPOA.java:150)
        at TasksPOA._invoke(TasksPOA.java:90)
        at com.ooc.OBPortableServer.ServantDispatcher.dispatch(ServantDispatcher.java:211)
        at com.ooc.OBPortableServer.POA_impl._OB_dispatch(POA_impl.java:1734)
        at com.ooc.OB.DispatchRequest_impl.invoke(DispatchRequest_impl.java:52)
        at com.ooc.OB.DispatchSameThread_impl.dispatch(DispatchStrategyFactory_impl.java:46)
        at com.ooc.OB.Upcall.invoke(Upcall.java:426)
        at com.ooc.OB.GIOPServerWorkerThreaded.receiverRun(GIOPServerWorkerThreaded.java:528)
        at com.ooc.OB.GIOPServerWorkerThreaded$ReceiverThread.run(GIOPServerWorkerThreaded.java:70)

org.omg.CORBA.UNKNOWN  minor code: 0  completed: No
        at com.ooc.OB.Util.unmarshalSystemException(Util.java:272)
        at com.ooc.OB.GIOPClientWorker.execute(GIOPClientWorker.java:544)
        at com.ooc.OB.GIOPClientWorkerThreaded.receiverRun(GIOPClientWorkerThreaded.java:498)
        at com.ooc.OB.GIOPClientWorkerThreaded$ReceiverThread.run(GIOPClientWorkerThreaded.java:67)

What a caterpillar calls the end, the rest of the world calls a butterfly. (Lao-Tze)