ICE - Как передать реализацию на прокси?

Я использую ICE в своем коде. И я хочу запустить функцию, которой нужен параметр GameObserverPrx. Я не хочу передавать GameObserver по значению, и я использую GameObserver * в интерфейсе среза для передачи прокси.

Какую функцию мне следует использовать для преобразования GameObserver в GameObserverPrx? И второй вопрос - почему ICE не смог сделать это вместо меня? Я искал ответ в интернете. Я нашел только ObjectAdapter.checkedCast, но он служит другой цели.

Вот ошибка:

Метод addObserver (String, GameObserverPrx, Current) в типе GameProxyImpl не применим для аргументов (String, GameObserverImpl, null) PrzeciwnikKomputerowy.java / warcaby-serwer / src / main / java / sr / warcaby / serwer line 74 Проблема Java

Вот фрагменты моего кода: В этой строке я вижу ошибку.

partia.addObserver(token, new GameObserverImpl(this)), null);

Фрагмент реализации GameObserver:

class GameObserverImpl extends _GameObserverDisp { //extends IGameObserverPOA{

    private static final long serialVersionUID = 1L;
    PrzeciwnikKomputerowy p;
    public GameObserverImpl(PrzeciwnikKomputerowy p) {
        this.p = p;
    }

Фрагменты api.ice:

interface GameObserver {
    void notifyObserver(  CORBAMove lastMove);
};



interface GameProxy {
    void addObserver(  string token,   GameObserver* o) throws MyException;
    bool isMyTurn(  string token) throws MyException;
    void doMove(  string token,   CORBAMove move) throws MyException;
    Position getPosition(  string token) throws MyException;
    string showPosition(  string token) throws MyException;
};

Пусть вас не смущает название CORBAMove. Я использовал CORBA, но изменил свой код на ICE.


person Wojciech Kałuski    schedule 07.05.2015    source источник


Ответы (1)


Я нашел ответ на свой вопрос. Теперь мое приложение работает как задумано.

Я написал метод создания ObjectPrx из Ice.Object. Этот метод использует отражение, чтобы найти метод приведения для указанного класса.

На этом сайте я нашел нужные мне функции: https://doc.zeroc.com/display/Ice/Object+Incarnation+in+Java#ObjectIncarnationinJava-proxies

Самая важная строка: ObjectPrx objectPrx = adapter.addWithUUID (iceObject).

И затем я использовал метод xxxPrxHelper.checkedCast (objectPrx), который я получаю от отражения. Вот измененный код:

partia.addObserver(token, (GameObserverPrx)
    serwer.createProxyForObject(observer, GameObserverPrxHelper.class), null)

Метод в классе ServerImpl:

public ObjectPrx createProxyForObject(Ice.Object iceObject, Class<?> clazz) {
    ObjectPrx objectPrx = adapter.addWithUUID(iceObject);
    try {
        Method method = clazz.getMethod("checkedCast", ObjectPrx.class);
        objectPrx =  (ObjectPrx) method.invoke(null, objectPrx);//adapter.createIndirectProxy(id));
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return objectPrx;

Метод createProxyForObject использует обычный адаптер, инициализированный в конструкторе сервера (поскольку класс PrzeciwnikKomputerowy по-прежнему является частью серверной программы).

    Ice.Communicator communicator = Ice.Util.initialize(args); 

    ObjectAdapter adapter = communicator.createObjectAdapter("ChessServer");
person Wojciech Kałuski    schedule 07.05.2015