Teams Winter 2011/team2/lab2

From CDOT Wiki
Revision as of 23:22, 17 February 2011 by Scborges (talk | contribs)
Jump to: navigation, search

Tutorial

Prerequisites

Creating and Setting the Interface Bundle

  • Run Eclipse
  • Select/Enter your preferred workspace in the text box provided and click okay

Workspace2T2.png

  • After Eclipse has completed loaded, create a plug-in by clicking on "File" on the menu bar then scroll to New->Project->Plug-in
  • Enter the following information that is seen in the image below

PluginT2.png

  • Click Next->Finish
  • Now open the src folder, open the package inside, remove the activator file currently residing in it, and create a class called "Weather" and an interface called "WeatherSystem"
  • Copy and paste the following code to their respective file

Weather

package ecl.team2.lab2.weather;

public class Weather {
    private String city;
    private float tempInCelcius;
    private float rainInMM;
    private float snowInMM;
    private float windspeedInKM;
    private char windDirection;
   
    public Weather(String pcity, float ptemp, float prain, float psnow, float pwspeed, char pwdirection){
        this.setCity(pcity);
        this.setTempInCelcius(ptemp);
        this.setRainInMM(prain);
        this.setSnowInMM(psnow);
        this.setWindspeedInKM(pwspeed);
        this.setWindDirection(pwdirection);
    }
   
   
    public void setWindDirection(char windDirection) {
        this.windDirection = windDirection;
    }

    public char getWindDirection() {
        return windDirection;
    }



    public void setWindspeedInKM(float windspeedInKM) {
        this.windspeedInKM = windspeedInKM;
    }



    public float getWindspeedInKM() {
        return windspeedInKM;
    }



    public void setSnowInMM(float snowInMM) {
        this.snowInMM = snowInMM;
    }



    public float getSnowInMM() {
        return snowInMM;
    }



    public void setRainInMM(float rainInMM) {
        this.rainInMM = rainInMM;
    }



    public float getRainInMM() {
        return rainInMM;
    }



    public void setTempInCelcius(float tempInCelcius) {
        this.tempInCelcius = tempInCelcius;
    }



    public float getTempInCelcius() {
        return tempInCelcius;
    }



    public void setCity(String city) {
        this.city = city;
    }



    public String getCity() {
        return city;
    }
}

WeatherSystem

package ecl.team2.lab2.weather;

public interface WeatherSystem {
    Weather getWeather(String city) throws Exception;
}
  • Save and close both files and now open the manifest file

ManiT2.png

  • Click on the runtime tab then click on add in the "export packages" panel.
  • click on the ecl.... package and click okay

Mani2T2.png

  • Now close the manifest and save all changes

Creating and Setting the Provide Bundle

  • Follow the same steps for creating a new plug-in projects but instead supply the name "ecl.team2.lab2.weathersystem.provider"
  • Remove all contents within the src->current package and add a class file called "ProviderActivator"
  • Add a new package to the current project we're dealing with and name it "ecl.team2.lab2.weathersystem.provider.internal" and within it create a class called "SimpleWeatherSystem"
  • Copy and paste the following code to their respective file

ProviderActivator

package ecl.team2.lab2.weathersystem.provider;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

import ecl.team2.lab2.weather.WeatherSystem;
import ecl.team2.lab2.weathersystem.provider.internal.SimpleWeatherSystem;

public class ProviderActivator implements BundleActivator {

    private static BundleContext context;

    static BundleContext getContext() {
        return context;
    }

    /*
     * (non-Javadoc)
     * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
     */
    public void start(BundleContext bundleContext) throws Exception {
        ProviderActivator.context = bundleContext;
       
        SimpleWeatherSystem sws = new SimpleWeatherSystem();
        context.registerService(WeatherSystem.class.getName(), sws, null);
        System.out.println("Weather Station On !");
    }

    /*
     * (non-Javadoc)
     * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
     */
    public void stop(BundleContext bundleContext) throws Exception {
        ProviderActivator.context = null;
        System.out.println("Weather Station Off !");
    }

}

SimpleWeatherSystem

package ecl.team2.lab2.weathersystem.provider.internal;

import ecl.team2.lab2.weather.WeatherSystem;
import ecl.team2.lab2.weather.Weather;
import java.util.ArrayList;
import java.util.Random;


public class SimpleWeatherSystem implements WeatherSystem {
    ArrayList<Weather> weathers = new ArrayList<Weather>();
    public SimpleWeatherSystem(){
        ArrayList<String> cities = new ArrayList<String>();
        cities.add("Toronto");
        cities.add("New York");
        cities.add("Calgary");
        cities.add("Ottawa");
        cities.add("Vancouver");
        cities.add("Regina");
        cities.add("Winnipeg");
        cities.add("St. John");
        cities.add("Fredericton");
        cities.add("Halifax");
        cities.add("Quebec City");
        cities.add("Whitehorse");
        cities.add("Yellowknife");
        for(String c:cities){
            Random randomGenerator = new Random();
            float temp = randomGenerator.nextFloat()+35;
            float rain = randomGenerator.nextFloat()+10;
            float snow = randomGenerator.nextFloat()+10;
            float windspeed = randomGenerator.nextFloat()+50;
            char winddirection = '.';
            int r = randomGenerator.nextInt(4);
            switch(r){
            case 0:
                winddirection = 'E';
                break;
            case 1:
                winddirection = 'W';
                break;
            case 2:
                winddirection = 'N';
                break;
            case 3:
                winddirection = 'S';
                break;
                   
            }
           
            Weather w =  new Weather(c, temp, rain, snow, windspeed, winddirection);
            this.weathers.add(w);
            System.out.println(w.toString());
        }   
    }
    public Weather getWeather(String city) throws Exception {
        // TODO Auto-generated method stub
        Weather found = null;
        for(Weather w:this.weathers){
            city = city.toLowerCase();
            String wcity =w.getCity().toLowerCase();
            if(city.equals(wcity)){
                found = w;
                return found;
            }
        }
        return found;
    }

}
  • Save and close both files and now open the manifest file
  • Click on the dependencies tab then click on add in the "import packages" panel.
  • In the search field, enter "ecl", then click on "ecl.team2.lab2.weather", and afterwords click okay

Manifest3T2.png

Creating and Implementing the Client Bundle

  • Follow the same steps for creating a new plug-in projects but instead supply the name "ecl.team2.lab2.weathersystem.client"
  • Remove all contents within the src->current package and add a class file called "Activator" and another class file called "
  • Copy and paste the following code to their respective file

Activator

package ecl.team2.lab2.weathersystem.client;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;

import ecl.team2.lab2.weather.WeatherSystem;

public class Activator implements BundleActivator {

    private static BundleContext context;
    private WeatherSystem sws;

    static BundleContext getContext() {
        return context;
    }

    /*
     * (non-Javadoc)
     * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
     */
    public void start(BundleContext bundleContext) throws Exception {
        Activator.context = bundleContext;
       
        ServiceReference reference = context.getServiceReference(WeatherSystem.class.getName());
        if(reference != null){
            sws = (WeatherSystem) context.getService(reference);
           
            if(sws != null) {
                WeatherDialog.runDialog(sws);
                context.ungetService(reference);
            } else
                System.err.println("The Weather Station is down !!!");
        } else
            System.err.println("The Weather Station can not be found !!!");
    }

    /*
     * (non-Javadoc)
     * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
     */
    public void stop(BundleContext bundleContext) throws Exception {
        Activator.context = null;
        System.err.println("Client Not Interested !");
    }
}

WeatherDialog

package ecl.team2.lab2.weathersystem.client;
import javax.swing.*;

import ecl.team2.lab2.weather.WeatherSystem;

import java.awt.*;
import java.awt.event.*;


public class WeatherDialog extends JFrame{
    private static final long serialVersionUID = 1L;
    private  JPanel panel;
    private  JButton btnGo;
    private  JComboBox combo;
    private  JLabel labelTitle;
    private  JLabel labelTemperature;
    private  JLabel labelRain;
    private  JLabel labelSnow;
    private  JLabel labelWindDirection;
    private  JLabel labelWindSpeed;
   
    private WeatherSystem sws;
    String[] cities = {"Toronto","New York","Calgary","Ottawa","Vancouver",
                        "Regina","Winnipeg","St. John","Fredericton",
                        "Halifax","Quebec City", "Whitehorse","Yellowknife"
                        };
   

    public WeatherDialog(){
        panel = new JPanel();
        panel.setPreferredSize(new Dimension(200,200));
        panel.setLayout(new FlowLayout(FlowLayout.LEFT));
        combo = new JComboBox();
        for(int i=0;i<cities.length;i++){
            combo.addItem(cities[i]);
        }
        panel.add(combo);
       
       
        btnGo = new JButton("Go");
        panel.add(btnGo);
       
        btnGo.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                String chosencity = (String)combo.getSelectedItem();
                ShowWeather(chosencity);
            }
        }
        );
        this.labelTitle = new JLabel();
        this.labelTemperature = new JLabel();
        this.labelRain = new JLabel();
        this.labelSnow = new JLabel();
        this.labelWindDirection = new JLabel();
        this.labelWindSpeed = new JLabel();
       
        panel.add(labelTitle);panel.add(labelTemperature);panel.add(labelRain);
        panel.add(labelSnow);panel.add(labelWindDirection);panel.add(labelWindSpeed);
        this.setTitle("Todays Weather");
       
        // Display the window.
        this.setContentPane(panel);
        this.pack();
       
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.setLocationRelativeTo(null);
    }
    public void ShowWeather(String city){
        try {       
            float temp = sws.getWeather(city).getTempInCelcius();
            float rain =sws.getWeather(city).getRainInMM();
            float snow = sws.getWeather(city).getSnowInMM();
            char direction = sws.getWeather(city).getWindDirection();
            float speed = sws.getWeather(city).getWindspeedInKM();
           
           
            this.labelTitle.setText("Todays weather in "+ city);
            this.labelTemperature.setText("Temperature: "+ String.format("%.2f", temp) + " Celcius");
            this.labelRain.setText("Rain: " + String.format("%.2f", rain) + " mm");
            this.labelSnow.setText("Snow: " + String.format("%.2f", snow)  + " mm");
            this.labelWindDirection.setText("Wind Direction: " + direction);
            this.labelWindSpeed.setText("Speed: " + String.format("%.2f", speed) + " km/hr");
        }
        catch (Exception ex){
            System.err.println(ex.getMessage());
        }
    }
   
    private static void createAndShowGUI(WeatherSystem ws) {
        WeatherDialog frame = new WeatherDialog();
        frame.sws = ws;
    }
 
    public static void runDialog(final WeatherSystem ws) {
        // Schedule a job for the event-dispatching thread:
        // creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI(ws);
            }
        });
    }
}
  • Save and close all files

Creating and Implementing the Client Bundle