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
Run Configuration Setting
- After completing all previous steps, on the menu bar click on run, then click "run configuration.."
- A window should have popped up, on the left panel, double click on "OSGI Framework"
- The right panel should have altered, click on deselect all button to deactivate all bundles.
- click on the check box in the table dubbed "workspace", this is essentially what we have been working on throughout the tutorial.
- After click on the button "add required bundles" and click on the check box labeled "only show selected"
- This reveals all the bundles that are required for our small program to work. Now under "start level" column, place the items in the following order, click apply and then run the code by clicking the run button
- Once executed, a java window should have popped up
- Click Go and you should see something similar to this
- Most of the values are randomly generated and shows an excellent example of OSGI
- This concludes the tutorial