package org.mobicents.slee.service.httpclientra.example;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.slee.ActivityContextInterface;
import javax.slee.CreateException;
import javax.slee.RolledBackContext;
import javax.slee.SbbContext;
import javax.slee.facilities.TimerEvent;
import javax.slee.facilities.TimerFacility;
import javax.slee.facilities.TimerID;
import javax.slee.facilities.TimerOptions;
import javax.slee.facilities.TimerPreserveMissed;
import javax.slee.facilities.Tracer;
import net.java.client.slee.resource.http.HttpClientActivity;
import net.java.client.slee.resource.http.HttpClientActivityContextInterfaceFactory;
import net.java.client.slee.resource.http.HttpClientResourceAdaptorSbbInterface;
import net.java.client.slee.resource.http.HttpMethodName;
import net.java.client.slee.resource.http.event.Response;
import net.java.client.slee.resource.http.event.ResponseEvent;
import org.apache.commons.httpclient.HttpMethod;
import com.sun.syndication.feed.synd.SyndEntryImpl;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.FeedException;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader;
/**
* This is a simple Service to demonstrate the usage of Http-client-ra
* This service reads the RSS Feed link from sbb-jar.xml and fetches the
* links periodically using ROME api (Look at https://rome.dev.java.net/ to know more about
* ROME.)
*
* If there are changes in the RSS Feed, this service retrieves the content of the link
*
* @author amit.bhayani
*
*/
public abstract class HttpClientRAExampleSbb implements javax.slee.Sbb {
private Tracer tracer;
private SbbContext sbbContext; // This SBB's SbbContext
private TimerFacility timerFacility;
private HttpClientActivityContextInterfaceFactory httpClientAci;
private HttpClientResourceAdaptorSbbInterface raSbbInterface;
/*
* (non-Javadoc)
*
* @see javax.slee.Sbb#sbbActivate()
*/
public void sbbActivate() {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
*
* @see javax.slee.Sbb#sbbCreate()
*/
public void sbbCreate() throws CreateException {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
*
* @see javax.slee.Sbb#sbbExceptionThrown(java.lang.Exception,
* java.lang.Object, javax.slee.ActivityContextInterface)
*/
public void sbbExceptionThrown(Exception arg0, Object arg1,
ActivityContextInterface arg2) {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
*
* @see javax.slee.Sbb#sbbLoad()
*/
public void sbbLoad() {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
*
* @see javax.slee.Sbb#sbbPassivate()
*/
public void sbbPassivate() {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
*
* @see javax.slee.Sbb#sbbPostCreate()
*/
public void sbbPostCreate() throws CreateException {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
*
* @see javax.slee.Sbb#sbbRemove()
*/
public void sbbRemove() {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
*
* @see javax.slee.Sbb#sbbRolledBack(javax.slee.RolledBackContext)
*/
public void sbbRolledBack(RolledBackContext arg0) {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
*
* @see javax.slee.Sbb#sbbStore()
*/
public void sbbStore() {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
*
* @see javax.slee.Sbb#setSbbContext(javax.slee.SbbContext)
*/
public void setSbbContext(SbbContext context) {
this.sbbContext = context;
this.tracer = sbbContext.getTracer(HttpClientRAExampleSbb.class.getSimpleName());
try {
Context ctx = (Context) new InitialContext()
.lookup("java:comp/env");
httpClientAci = (HttpClientActivityContextInterfaceFactory) ctx
.lookup("slee/resources/http-client-ra/http-client-ra-acif");
raSbbInterface = (HttpClientResourceAdaptorSbbInterface) ctx
.lookup("slee/resources/http-client-ra/org.mobicents/1.0.00/http-client-ra/sbb2ra");
// Getting Timer Facility interface
timerFacility = (TimerFacility) ctx.lookup("slee/facilities/timer");
} catch (NamingException ne) {
tracer.severe("Could not set SBB context:", ne);
}
}
/*
* (non-Javadoc)
*
* @see javax.slee.Sbb#unsetSbbContext()
*/
public void unsetSbbContext() {
// TODO Auto-generated method stub
}
public void onStartServiceEvent(
javax.slee.serviceactivity.ServiceStartedEvent event,
ActivityContextInterface aci) {
tracer.info("<><><><><> \n onStartServiceEvent of HttpClientRAExampleSbb \n <><><><><><><>");
processRssFeed();
setTimer(aci);
aci.detach(sbbContext.getSbbLocalObject());
}
private void processRssFeed() {
try {
Context myEnv = (Context) new InitialContext()
.lookup("java:comp/env");
String rssFeedString = (String) myEnv.lookup("RSSFeedURL");
URL rssFeedUrl = new URL(rssFeedString);
SyndFeedInput input = new SyndFeedInput();
SyndFeed feed = input.build(new XmlReader(rssFeedUrl));
if (feed.hashCode() != this.getFeedHashCode()) {
tracer.info("There is a new entry in the RSS Feed "
+ rssFeedString);
this.setFeedHashCode(feed.hashCode());
List<?> list = feed.getEntries();
Iterator<?> itr = list.iterator();
while (itr.hasNext()) {
SyndEntryImpl syndFeed = (SyndEntryImpl) itr.next();
tracer.info("Getting the Content for URL "
+ syndFeed.getLink());
HttpMethod httpMethod = raSbbInterface.createHttpMethod(
HttpMethodName.GET, syndFeed.getLink());
try {
HttpClientActivity clientActivity = raSbbInterface
.createHttpClientActivity(true);
ActivityContextInterface clientAci = httpClientAci
.getActivityContextInterface(clientActivity);
clientAci.attach(sbbContext.getSbbLocalObject());
clientActivity.executeMethod(httpMethod);
} catch (Throwable e) {
tracer.severe("Error while creating HttpClientActivity",
e);
}
}
} else {
tracer.info("No new entry in the RSS Feed " + rssFeedString);
}
} catch (NamingException namingEx) {
tracer.severe("NamingException", namingEx);
} catch (MalformedURLException malformedEx) {
tracer.severe("MalformedURLException", malformedEx);
} catch (IOException ioEx) {
tracer.severe("IOException", ioEx);
} catch (FeedException feedEx) {
tracer.severe("FeedException", feedEx);
}
}
private void setTimer(ActivityContextInterface aci) {
TimerOptions options = new TimerOptions();
options.setPreserveMissed(TimerPreserveMissed.ALL);
TimerID timerID;
long refreshTime;
try {
Context initCtx = new InitialContext();
Context myEnv = (Context) initCtx.lookup("java:comp/env");
refreshTime = ((Long) myEnv.lookup("RefreshTime")).longValue();
timerID = this.timerFacility.setTimer(aci, null, System
.currentTimeMillis()
+ refreshTime, options);
// Setting Timer ID
this.setTimerID(timerID);
} catch (NamingException e) {
tracer.severe(e.getMessage(), e);
}
}
public void onTimerEvent(TimerEvent event, ActivityContextInterface aci) {
tracer.info("########## HttpClientRAExampleSbb: onTimerEvent ##########");
processRssFeed();
setTimer(aci);
}
public void onResponseEvent(ResponseEvent event,
ActivityContextInterface aci) {
Response response = event.getResponse();
tracer.info("********** onResponseEvent **************");
tracer.info("Status Code = "+response.getStatusCode());
tracer.info("Response Body = "+response.getResponseBodyAsString());
tracer.info("*****************************************");
}
// 'timerID' CMP field setter
public abstract void setTimerID(TimerID value);
public abstract TimerID getTimerID();
public abstract void setFeedHashCode(int feedHashCode);
public abstract int getFeedHashCode();
}