Tutorial
Prerequisites
- Download Eclipse Classic
Creating and Setting the Interface Bundle
- Run Eclipse
- Select/Enter your preferred workspace in the text box provided and click okay
- 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
- 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
- Click on the runtime tab then click on add in the "export packages" panel.
- click on the ecl.... package and click okay
- 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
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