/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.aries.tutorials.blueprint.greeter.client.osgi;
import org.apache.aries.tutorials.blueprint.greeter.api.GreeterMessageService;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;
/**
* Example of various approaches to using an osgi service.
*/
public class GreeterTestClient {
String clientID = "<unset>";
ServiceTracker tracker = null;
GreeterMessageService cachedService = null;
BundleContext owningContext;
GreeterMessageService proxy = null;
/**
* A simple class to hide if a service is available to invoke.
*/
class GreeterMessageServiceProxy implements GreeterMessageService{
ServiceTracker greetingServiceTracker = null;
public GreeterMessageServiceProxy(BundleContext ctx){
greetingServiceTracker = new ServiceTracker(ctx, GreeterMessageService.class.getName(), null);
greetingServiceTracker.open();
}
public String getGreetingMessage(){
if(greetingServiceTracker.getTrackingCount()>0){
return ((GreeterMessageService)greetingServiceTracker.getService()).getGreetingMessage();
}else{
return "<No Service Available>";
}
}
}
public GreeterTestClient(BundleContext ctx, String clientID){
this.clientID = clientID;
owningContext = ctx;
//setup for proxied service usage.
proxy = new GreeterMessageServiceProxy(ctx);
//setup for tracker usage.
tracker = new ServiceTracker(ctx, GreeterMessageService.class.getName(), null);
tracker.open();
//setup for super optimistic osgi service usage ;-)
try{
cachedService = (GreeterMessageService)ctx.getService(ctx.getServiceReference(GreeterMessageService.class.getName()));
}catch(RuntimeException e){
System.err.println("Unable to cache service at bundle start!");
}
}
public void doRequests(){
System.out.println("Proxy based...");
doRequestUsingProxy();
System.out.println("Tracker based...");
doRequestUsingTracker();
System.out.println("Immediate Lookup... ");
doRequestUsingImmediateLookup(owningContext);
System.out.println("Extremely hopeful...");
doRequestUsingCachedService();
}
private void doRequestUsingImmediateLookup(BundleContext ctx){
ServiceReference ref = ctx.getServiceReference(GreeterMessageService.class.getName());
if(ref!=null){
GreeterMessageService greetingService = (GreeterMessageService)ctx.getService(ref);
if(greetingService!=null){
String response = greetingService.getGreetingMessage();
printResult(response);
}else{
System.err.println("Immediate lookup gave null for getService");
}
ctx.ungetService(ref); // dont forget this!!
}else{
System.err.println("Immediate lookup gave null service reference");
}
}
private void doRequestUsingTracker(){
System.out.println("Tracker is tracking.. "+tracker.getTrackingCount()+" services");
GreeterMessageService greetingService = (GreeterMessageService)tracker.getService();
if(greetingService!=null){
String response = greetingService.getGreetingMessage();
printResult(response);
}else{
System.err.println("Tracker gave null for service..");
}
}
private void doRequestUsingCachedService(){
try{
printResult(cachedService.getGreetingMessage());
}catch(RuntimeException e){
System.err.println("Unable to use cached service. "+e);
}
}
private void doRequestUsingProxy(){
try{
printResult(proxy.getGreetingMessage());
}catch(RuntimeException e){
System.err.println("Unable to use proxied service. "+e);
}
}
private void printResult(String response){
System.out.println("**********************************");
System.out.println("*"+clientID);
System.out.println("*"+response);
System.out.println("**********************************");
}
}