diff --git a/Radio/bnd.bnd b/Radio/bnd.bnd new file mode 100644 index 0000000..c05ac9f --- /dev/null +++ b/Radio/bnd.bnd @@ -0,0 +1,8 @@ +Bundle-Version: 1.0.0 +Private-Package: Radio +Bundle-Activator: Radio.Radio + +-buildfeatures: +-buildpath: \ + channelapi;version=latest,\ + outputapi;version=latest diff --git a/Radio/src/Radio/ChannelSelector.java b/Radio/src/Radio/ChannelSelector.java new file mode 100644 index 0000000..f23d360 --- /dev/null +++ b/Radio/src/Radio/ChannelSelector.java @@ -0,0 +1,21 @@ +package Radio; + +import channelapi.Channel; +import org.osgi.framework.BundleContext; +import org.osgi.util.tracker.ServiceTracker; + +public class ChannelSelector { + private final BundleContext context; + + public ChannelSelector (BundleContext context){ + this.context = context; + } + + public Channel selectChannel(){ + ServiceTracker serviceTracker = new ServiceTracker(context, Channel.class, null); + serviceTracker.open(); + Channel channel = serviceTracker.getService(); + serviceTracker.close(); + return channel; + } +} diff --git a/Radio/src/Radio/OutputSelector.java b/Radio/src/Radio/OutputSelector.java new file mode 100644 index 0000000..4737db5 --- /dev/null +++ b/Radio/src/Radio/OutputSelector.java @@ -0,0 +1,21 @@ +package Radio; + +import org.osgi.framework.BundleContext; +import org.osgi.util.tracker.ServiceTracker; +import outputapi.Output; + +public class OutputSelector { + private final BundleContext context; + + public OutputSelector(BundleContext context){ + this.context = context; + } + + public Output selectOutput (){ + ServiceTracker serviceTracker = new ServiceTracker<>(context, Output.class, null); + serviceTracker.open(); + Output output = serviceTracker.getService(); + serviceTracker.close(); + return output; + } +} diff --git a/Radio/src/Radio/Radio.java b/Radio/src/Radio/Radio.java new file mode 100644 index 0000000..5328dba --- /dev/null +++ b/Radio/src/Radio/Radio.java @@ -0,0 +1,30 @@ +package Radio; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +public class Radio implements BundleActivator { + private ChannelSelector channelSelector = null; + private OutputSelector outputSelector = null; + private Receiver receiver = null; + + @Override + public void start(BundleContext context) throws Exception { + System.out.println("Starting radio"); + channelSelector = new ChannelSelector(context); + outputSelector = new OutputSelector(context); + + receiver = new Receiver(); + System.out.println("Selecting channel"); + receiver.setChannel(channelSelector.selectChannel()); + System.out.println("Selecting output"); + receiver.setOutput(outputSelector.selectOutput()); + System.out.println("Starting receiver"); + receiver.start(); + } + + @Override + public void stop(BundleContext context) throws Exception { + receiver.stop(); + } +} diff --git a/Radio/src/Radio/Receiver.java b/Radio/src/Radio/Receiver.java new file mode 100644 index 0000000..0100838 --- /dev/null +++ b/Radio/src/Radio/Receiver.java @@ -0,0 +1,44 @@ +package Radio; + +import channelapi.Channel; +import channelapi.Stream; +import outputapi.Output; + +public class Receiver { + private Channel channel = null; + private Output output = null; + private Thread receiverThread = null; + + public Receiver (){ + + } + + public void setChannel(Channel channel) { + this.channel = channel; + } + + public void setOutput(Output output) { + this.output = output; + } + + public void start (){ + System.out.println("Starting receiver"); + Stream stream = channel.getStream(); + + receiverThread = new Thread(() -> { + try{ + while (true) { + output.write(stream.read()); + Thread.sleep(1000); + } + } catch (InterruptedException e){ + System.out.println("Receiver stopped"); + } + }); + receiverThread.start(); + } + + public void stop(){ + receiverThread.interrupt(); + } +} diff --git a/Radio1/bnd.bnd b/Radio1/bnd.bnd new file mode 100644 index 0000000..b841345 --- /dev/null +++ b/Radio1/bnd.bnd @@ -0,0 +1,7 @@ +Bundle-Version: 1.0.0 +Private-Package: Radio1 +Bundle-Activator: Radio1.Radio1 + +-buildfeatures: +-buildpath: \ + channelapi;version=latest \ No newline at end of file diff --git a/Radio1/src/Radio1/Radio1.java b/Radio1/src/Radio1/Radio1.java new file mode 100644 index 0000000..2d2ccd0 --- /dev/null +++ b/Radio1/src/Radio1/Radio1.java @@ -0,0 +1,25 @@ +package Radio1; + +import channelapi.Channel; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; + +import java.util.Dictionary; +import java.util.Hashtable; + +public class Radio1 implements BundleActivator { + private ServiceRegistration registration; + + @Override + public void start(BundleContext context) throws Exception { + Dictionary props = new Hashtable<>(); + props.put("name", "Radio 1"); + registration = context.registerService( Channel.class, new Radio1Channel(), props); + } + + @Override + public void stop(BundleContext context) throws Exception { + registration.unregister(); + } +} diff --git a/Radio1/src/Radio1/Radio1Channel.java b/Radio1/src/Radio1/Radio1Channel.java new file mode 100644 index 0000000..69f638b --- /dev/null +++ b/Radio1/src/Radio1/Radio1Channel.java @@ -0,0 +1,13 @@ +package Radio1; + +import channelapi.Channel; +import channelapi.Stream; + +public class Radio1Channel implements Channel { + private Stream stream = new Radio1Stream(); + + @Override + public Stream getStream() { + return stream; + } +} diff --git a/Radio1/src/Radio1/Radio1Stream.java b/Radio1/src/Radio1/Radio1Stream.java new file mode 100644 index 0000000..952eced --- /dev/null +++ b/Radio1/src/Radio1/Radio1Stream.java @@ -0,0 +1,10 @@ +package Radio1; + +import channelapi.Stream; + +public class Radio1Stream implements Stream { + @Override + public String read() { + return "Radio 1"; + } +} diff --git a/Radio538/bnd.bnd b/Radio538/bnd.bnd new file mode 100644 index 0000000..d5f1d35 --- /dev/null +++ b/Radio538/bnd.bnd @@ -0,0 +1,7 @@ +Bundle-Version: 1.0.0 +Private-Package: Radio538 +Bundle-Activator: Radio538.Radio538 + +-buildfeatures: +-buildpath: \ + channelapi;version=latest \ No newline at end of file diff --git a/Radio538/src/Radio538/Radio538.java b/Radio538/src/Radio538/Radio538.java new file mode 100644 index 0000000..d92fdfa --- /dev/null +++ b/Radio538/src/Radio538/Radio538.java @@ -0,0 +1,26 @@ +package Radio538; + +import channelapi.Channel; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; + +import java.util.Dictionary; +import java.util.Hashtable; + +public class Radio538 implements BundleActivator { + + private ServiceRegistration registration; + + @Override + public void start(BundleContext context) throws Exception { + Dictionary props = new Hashtable<>(); + props.put("name", "Radio 538"); + registration = context.registerService( Channel.class, new Radio538Channel(), props); + } + + @Override + public void stop(BundleContext context) throws Exception { + registration.unregister(); + } +} diff --git a/Radio538/src/Radio538/Radio538Channel.java b/Radio538/src/Radio538/Radio538Channel.java new file mode 100644 index 0000000..22ac8ce --- /dev/null +++ b/Radio538/src/Radio538/Radio538Channel.java @@ -0,0 +1,12 @@ +package Radio538; + +import channelapi.Channel; +import channelapi.Stream; + +public class Radio538Channel implements Channel { + private Stream stream = new Radio538Stream(); + @Override + public Stream getStream() { + return stream; + } +} diff --git a/Radio538/src/Radio538/Radio538Stream.java b/Radio538/src/Radio538/Radio538Stream.java new file mode 100644 index 0000000..27185cf --- /dev/null +++ b/Radio538/src/Radio538/Radio538Stream.java @@ -0,0 +1,10 @@ +package Radio538; + +import channelapi.Stream; + +public class Radio538Stream implements Stream { + @Override + public String read() { + return "Radio 538"; + } +} diff --git a/RadioRunner/bnd.bnd b/RadioRunner/bnd.bnd new file mode 100644 index 0000000..c7790d9 --- /dev/null +++ b/RadioRunner/bnd.bnd @@ -0,0 +1 @@ +-nobundles: true \ No newline at end of file diff --git a/RadioRunner/conf/.gitignore b/RadioRunner/conf/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/RadioRunner/run.bndrun b/RadioRunner/run.bndrun new file mode 100644 index 0000000..bd2019c --- /dev/null +++ b/RadioRunner/run.bndrun @@ -0,0 +1,12 @@ +-runfw: org.apache.felix.framework + +-runfeatures: shell +-runbundles: \ + channelapi;version=latest,\ + outputapi;version=latest,\ + Radio538;version=latest,\ + speaker;version=latest,\ + Radio;version=latest + +-runproperties: \ + org.ops4j.pax.logging.DefaultServiceLog.level=WARN \ No newline at end of file diff --git a/channelapi/bnd.bnd b/channelapi/bnd.bnd new file mode 100644 index 0000000..424ddea --- /dev/null +++ b/channelapi/bnd.bnd @@ -0,0 +1,5 @@ +Bundle-Version: 1.0.0 +Export-Package: channelapi + +-buildfeatures: +-buildpath: \ No newline at end of file diff --git a/channelapi/src/channelapi/Channel.java b/channelapi/src/channelapi/Channel.java new file mode 100644 index 0000000..77f4cf0 --- /dev/null +++ b/channelapi/src/channelapi/Channel.java @@ -0,0 +1,5 @@ +package channelapi; + +public interface Channel { + Stream getStream(); +} diff --git a/channelapi/src/channelapi/Stream.java b/channelapi/src/channelapi/Stream.java new file mode 100644 index 0000000..44408fb --- /dev/null +++ b/channelapi/src/channelapi/Stream.java @@ -0,0 +1,5 @@ +package channelapi; + +public interface Stream { + String read(); +} diff --git a/channelapi/src/channelapi/package-info.java b/channelapi/src/channelapi/package-info.java new file mode 100644 index 0000000..33eda65 --- /dev/null +++ b/channelapi/src/channelapi/package-info.java @@ -0,0 +1,2 @@ +@org.osgi.annotation.versioning.Version("1.0.0") +package channelapi; \ No newline at end of file diff --git a/outputapi/bnd.bnd b/outputapi/bnd.bnd new file mode 100644 index 0000000..dae03d0 --- /dev/null +++ b/outputapi/bnd.bnd @@ -0,0 +1,5 @@ +Bundle-Version: 1.0.0 +Export-Package: outputapi + +-buildfeatures: +-buildpath: \ No newline at end of file diff --git a/outputapi/src/outputapi/Output.java b/outputapi/src/outputapi/Output.java new file mode 100644 index 0000000..9497459 --- /dev/null +++ b/outputapi/src/outputapi/Output.java @@ -0,0 +1,5 @@ +package outputapi; + +public interface Output { + void write (String sound); +} diff --git a/outputapi/src/outputapi/package-info.java b/outputapi/src/outputapi/package-info.java new file mode 100644 index 0000000..95335f6 --- /dev/null +++ b/outputapi/src/outputapi/package-info.java @@ -0,0 +1,2 @@ +@org.osgi.annotation.versioning.Version("1.0.0") +package outputapi; \ No newline at end of file diff --git a/speaker/bnd.bnd b/speaker/bnd.bnd new file mode 100644 index 0000000..4a058ab --- /dev/null +++ b/speaker/bnd.bnd @@ -0,0 +1,7 @@ +Bundle-Version: 1.0.0 +Private-Package: speaker +Bundle-Activator: speaker.Speaker + +-buildfeatures: +-buildpath: \ + outputapi;version=latest \ No newline at end of file diff --git a/speaker/src/speaker/Speaker.java b/speaker/src/speaker/Speaker.java new file mode 100644 index 0000000..ebd8b94 --- /dev/null +++ b/speaker/src/speaker/Speaker.java @@ -0,0 +1,25 @@ +package speaker; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; +import outputapi.Output; + +import java.util.Dictionary; +import java.util.Hashtable; + +public class Speaker implements BundleActivator { + private ServiceRegistration registration; + + @Override + public void start(BundleContext context) throws Exception { + Dictionary props = new Hashtable<>(); + props.put("type", "Speaker"); + registration = context.registerService( Output.class, new SpeakerOutput(), props); + } + + @Override + public void stop(BundleContext context) throws Exception { + registration.unregister(); + } +} diff --git a/speaker/src/speaker/SpeakerOutput.java b/speaker/src/speaker/SpeakerOutput.java new file mode 100644 index 0000000..25ae64b --- /dev/null +++ b/speaker/src/speaker/SpeakerOutput.java @@ -0,0 +1,10 @@ +package speaker; + +import outputapi.Output; + +public class SpeakerOutput implements Output { + @Override + public void write(String sound) { + System.out.println(sound); + } +}