Skip to main content

Temperature SPOT - Part 6

Posted by mriem on August 29, 2007 at 8:00 PM PDT

The JSF component needs to be able to render, so you have to either deliver the renderer inline with the component or write a separate renderer. The code below describes the separate renderer.

package com.manorrock.jsf.sunspot.temperature;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import java.text.MessageFormat;
import java.util.ResourceBundle;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.render.Renderer;

/**
* The JSF SunSPOT temperature renderer.
*
* @author Manfred Riem (mriem@manorrock.com)
*/
public class TemperatureRenderer extends Renderer {
    /**
     * Stores the bundle we use to get for rendering.
     */
    private ResourceBundle bundle = ResourceBundle.getBundle("com.manorrock.jsf.sunspot.temperature.Bundle");
   
    /**
     * Encode end.
     */
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
        ResponseWriter writer = context.getResponseWriter();
        String value = null;
       
        TemperatureComponent temperatureComponent = (TemperatureComponent) component;
        String sunspotId = "";
       
        if (temperatureComponent.getAttributes().get("sunspotId") != null) {
            sunspotId = (String) temperatureComponent.getAttributes().get("sunspotId");
        }
        else if (temperatureComponent.getValueBinding("sunspotId") != null) {
            sunspotId = (String) temperatureComponent.getValueBinding("sunspotId").getValue(context);
        }
        else {
            value = "Set sunspotId please";
        }

        if (value == null) {
            synchronized(context) {
                try {
                    InetAddress address = InetAddress.getByName("localhost");
                    int port = 8888;
                    SocketAddress sockaddress = new InetSocketAddress(address, port);
                    Socket socket = new Socket();
                    int timeout = 2000;
                    socket.connect(sockaddress, timeout);

                    PrintStream printer = new PrintStream(socket.getOutputStream());
                    printer.println(sunspotId);
                    printer.flush();

                    DataInputStream dataIn = new DataInputStream(socket.getInputStream());
                    value = dataIn.readLine();

                } catch (UnknownHostException e) {
                    e.printStackTrace();
                    value = e.getMessage();
                } catch (SocketTimeoutException e) {
                    e.printStackTrace();
                    value = e.getMessage();
                } catch (IOException e) {
                    e.printStackTrace();
                    value = e.getMessage();
                }
            }
        }
       
        String html = MessageFormat.format(
            bundle.getString("temperature.text.renderer"),
            new Object[] { component.getClientId(context), value });
       
        writer.write(html);
    }
}

The last entry will be about some remaining bits and pieces.

Related Topics >>