Poster.java

/*
 * Copyright © 2011 Nokia Corporation. All rights reserved.
 * Nokia and Nokia Connecting People are registered trademarks of Nokia Corporation. 
 * Oracle and Java are trademarks or registered trademarks of Oracle and/or its
 * affiliates. Other product and company names mentioned herein may be trademarks
 * or trade names of their respective owners. 
 * See LICENSE.TXT for license information.
 */
package com.nokia.example.capitals;

import javax.xml.rpc.Stub;
import java.rmi.RemoteException;

/**
 * The Poster class does the call to the remote web service
 * It creates the stub and fill the parameters
 * The call is done in a separate thread and the results
 * are delivered asynchronoulsy via PosterListener
 */
public class Poster implements Runnable {
    // true if IO thread is running, false if not
    private boolean isThreadRunning = false;
    // The listener
    private PosterListener listener;
    private String nation;
    private String endPoint;

    public Poster(PosterListener listener, String endPoint) {
        if (listener == null) {
            throw new IllegalArgumentException("Listener cannot be null");
        }
        this.endPoint = endPoint;
        this.listener = listener;
    }

    /**
     * Start the WebService call in a separate thread.
     * It checks that only one call is active at the same time
     */
    public synchronized void requestCapital(String country) {
        if (!isThreadRunning) {
            isThreadRunning = true;
            this.nation = country;
            new Thread(this).start();
        }
    }

    /**
     * This is an IO operation and thus is executed in a
     * separate thread
     */
    public void run() {
        CapitalBinding_Stub capitalServiceStub = new CapitalBinding_Stub();
        capitalServiceStub._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, endPoint);

        CapitalPortType capitalService = (CapitalPortType) capitalServiceStub;
        try {
            String capital = capitalService.getCapital(nation);
            listener.onCapitalRequestComplete(nation, capital);
        } catch (RemoteException e) {
            listener.onCapitalRequestError(e.getMessage());
        }
    }
}