/*
* © Copyright IBM Corp. 2010
*
* Licensed 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 com.ibm.xsp.extlib.sbt.activitystreams;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;
import org.w3c.dom.Document;
import com.ibm.commons.util.StringUtil;
import com.ibm.commons.xml.NamespaceContext;
import com.ibm.commons.xml.util.XMIConverter;
import com.ibm.jscript.IValue;
import com.ibm.sbt.services.client.ClientService;
import com.ibm.sbt.services.client.ClientService.HandlerJson;
import com.ibm.sbt.services.client.connections.activitystreams.ActivityStreamService;
import com.ibm.sbt.services.endpoints.Endpoint;
import com.ibm.sbt.util.DataNavigator;
import com.ibm.sbt.util.XmlNavigator;
import com.ibm.xsp.FacesExceptionEx;
import com.ibm.xsp.extlib.sbt.connections.ConnectionDataSource;
import com.ibm.xsp.extlib.sbt.model.RestDataBlockAccessor;
import com.ibm.xsp.extlib.sbt.model.RestDataSource;
import com.ibm.xsp.extlib.sbt.model.accessor.AtomXmlBlockAccessor;
import com.ibm.xsp.extlib.sbt.model.accessor.JsonArrayBlockAccessor;
/**
* Data source that handles Data Accessor.
* @author Philippe Riand
*/
public class ActivityStreamDataSource extends RestDataSource {
public static class ASJsonAccessor extends JsonArrayBlockAccessor {
private static final long serialVersionUID = 1L;
// Coming from the data source
private String userId;
private String groupId;
private String appId;
private String activityId;
private String updatedSince;
private String sortOrder;
private String filterBy;
private String filterOp;
private String filterValue;
public ASJsonAccessor() {
}
public ASJsonAccessor(ActivityStreamDataSource ds) {
super(ds);
this.userId = ds.getUserId();
this.groupId = ds.getGroupId();
this.appId = ds.getAppId();
this.activityId = ds.getActivityId();
Object us = ds.getUpdatedSince();
if(us!=null) {
if(us instanceof Number) {
this.updatedSince = XMIConverter.composeDate(((Number)us).longValue());
} else if(us instanceof Date) {
this.updatedSince = XMIConverter.composeDate(((Date)us).getTime());
} else {
this.updatedSince = us.toString();
}
}
this.sortOrder = ds.getSortOrder();
this.filterBy = ds.getFilterBy();
this.filterOp = ds.getFilterOp();
this.filterValue = ds.getFilterValue();
}
protected Map<String,String> getParameters(int index, int blockSize) {
HashMap<String,String> map = new HashMap<String,String>();
map.putAll(getUrlParameters());
map.put("startIndex",Integer.toString(index+1));
map.put("count",Integer.toString(blockSize));
if(userId!=null) map.put("userId",userId);
if(groupId!=null) map.put("groupId",groupId);
if(appId!=null) map.put("appId",appId);
if(activityId!=null) map.put("activityId",activityId);
if(updatedSince!=null) map.put("updatedSince",updatedSince);
if(sortOrder!=null) map.put("sortOrder",sortOrder);
if(filterBy!=null) map.put("filterBy",filterBy);
if(filterOp!=null) map.put("filterOp",filterOp);
if(filterValue!=null) map.put("filterValue",filterValue);
map.put("format","json");
return map;
}
@Override
protected Block loadBlock(int index, int blockSize) {
try {
ActivityStreamService svc = createService(findEndpointBean(),getServiceUrl());
Map<String,String> parameters = getParameters(index, blockSize);
//TODO Padraic Is this correct?
DataNavigator.Json nav = new DataNavigator.Json(svc.getAllUpdates(parameters)); // this.data has the response feed.
DataNavigator entry = nav.get("list");
Object[] data = new Object[entry.getCount()];
for(int i=0; i<data.length; i++) {
data[i] = entry.get(i);
}
return new ArrayBlock(index,data);
} catch(Exception ex) {
throw new FacesExceptionEx(ex,"Error while reading the Activity Streams");
}
}
protected ActivityStreamService createService(Endpoint endpoint, String serviceUrl) {
//TODO Padraic service URL ?
ActivityStreamService svc = new ActivityStreamService();
//ActivityStreamService svc = new ActivityStreamService(enpoint,serviceUrl);
return svc;
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
super.writeExternal(out);
out.writeObject(userId);
out.writeObject(groupId);
out.writeObject(appId);
out.writeObject(activityId);
out.writeObject(updatedSince);
out.writeObject(sortOrder);
out.writeObject(filterBy);
out.writeObject(filterOp);
out.writeObject(filterValue);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
super.readExternal(in);
userId = (String)in.readObject();
groupId = (String)in.readObject();
appId = (String)in.readObject();
activityId = (String)in.readObject();
updatedSince = (String)in.readObject();
sortOrder = (String)in.readObject();
filterBy = (String)in.readObject();
filterOp = (String)in.readObject();
filterValue = (String)in.readObject();
}
}
public static class ASXmlAccessor extends AtomXmlBlockAccessor {
private static final long serialVersionUID = 1L;
// Coming from the data source
private String userId;
private String groupId;
private String appId;
private String activityId;
private String updatedSince;
private String sortOrder;
private String filterBy;
private String filterOp;
private String filterValue;
public ASXmlAccessor() {
}
public ASXmlAccessor(ActivityStreamDataSource ds) {
super(ds);
this.userId = ds.getUserId();
this.groupId = ds.getGroupId();
this.appId = ds.getAppId();
this.activityId = ds.getActivityId();
Object us = ds.getUpdatedSince();
if(us!=null) {
if(us instanceof Number) {
this.updatedSince = XMIConverter.composeDate(((Number)us).longValue());
} else if(us instanceof Date) {
this.updatedSince = XMIConverter.composeDate(((Date)us).getTime());
} else {
this.updatedSince = us.toString();
}
}
this.sortOrder = ds.getSortOrder();
this.filterBy = ds.getFilterBy();
this.filterOp = ds.getFilterOp();
this.filterValue = ds.getFilterValue();
}
protected Map<String,String> getParameters(int index, int blockSize) {
HashMap<String,String> map = new HashMap<String,String>();
map.putAll(getUrlParameters());
map.put("startIndex",Integer.toString(index+1));
map.put("count",Integer.toString(blockSize));
if(userId!=null) map.put("userId",userId);
if(groupId!=null) map.put("groupId",groupId);
if(appId!=null) map.put("appId",appId);
if(activityId!=null) map.put("activityId",activityId);
if(updatedSince!=null) map.put("updatedSince",updatedSince);
if(sortOrder!=null) map.put("sortOrder",sortOrder);
if(filterBy!=null) map.put("filterBy",filterBy);
if(filterOp!=null) map.put("filterOp",filterOp);
if(filterValue!=null) map.put("filterValue",filterValue);
map.put("format","atom");
return map;
}
@Override
public NamespaceContext getNamespaceContext() {
return ConnectionDataSource.XPATH_CONTEXT;
}
@Override
protected Block loadBlock(int index, int blockSize) {
try {
ActivityStreamService svc = createService(findEndpointBean(),getServiceUrl());
Map<String,String> parameters = getParameters(index, blockSize);
//TODO ActivityStream DataSource as XML?
// XmlNavigator.Xml nav = new XmlNavigator.Xml(svc.get); // this.data has the response feed.
// DataNavigator entry = nav.get("list");
//
//
// Document doc = (Document)svc.get(parameters, ClientService.FORMAT_XML);
// return new XmlBlock(index,doc);
return null;
} catch(Exception ex) {
throw new FacesExceptionEx(ex,"Error while reading the Activity Streams");
}
}
protected ActivityStreamService createService(Endpoint endpoint, String serviceUrl) {
//TODO Padraic
ActivityStreamService svc = new ActivityStreamService();
return svc;
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
super.writeExternal(out);
out.writeObject(userId);
out.writeObject(groupId);
out.writeObject(appId);
out.writeObject(activityId);
out.writeObject(updatedSince);
out.writeObject(sortOrder);
out.writeObject(filterBy);
out.writeObject(filterOp);
out.writeObject(filterValue);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
super.readExternal(in);
userId = (String)in.readObject();
groupId = (String)in.readObject();
appId = (String)in.readObject();
activityId = (String)in.readObject();
updatedSince = (String)in.readObject();
sortOrder = (String)in.readObject();
filterBy = (String)in.readObject();
filterOp = (String)in.readObject();
filterValue = (String)in.readObject();
}
}
// Keywords
private String userId;
private String groupId;
private String appId;
private String activityId;
private Object updatedSince;
private String format;
private String sortOrder;
private String filterBy;
private String filterOp;
private String filterValue;
public ActivityStreamDataSource() {
}
@Override
protected RestDataBlockAccessor createAccessor() {
String format = getFormat();
if(StringUtil.isEmpty(format) || StringUtil.equals(format, "json")) {
return new ASJsonAccessor(this);
}
if(StringUtil.equals(format, "atom")) {
return new ASXmlAccessor(this);
}
throw new FacesExceptionEx(null,"Unknown ActivityStreams format {0}",format);
}
public String getUserId() {
if (null != userId) {
return userId;
}
ValueBinding valueBinding = getValueBinding("userId");
if (valueBinding != null) {
String value = (String)valueBinding.getValue(getFacesContext());
return value;
}
return null;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getGroupId() {
if (null != groupId) {
return groupId;
}
ValueBinding valueBinding = getValueBinding("groupId");
if (valueBinding != null) {
String value = (String)valueBinding.getValue(getFacesContext());
return value;
}
return null;
}
public void setGroupId(String groupId) {
this.groupId = groupId;
}
public String getAppId() {
if (null != appId) {
return appId;
}
ValueBinding valueBinding = getValueBinding("appId");
if (valueBinding != null) {
String value = (String)valueBinding.getValue(getFacesContext());
return value;
}
return null;
}
public void setAppId(String appId) {
this.appId = appId;
}
public String getActivityId() {
if (null != activityId) {
return activityId;
}
ValueBinding valueBinding = getValueBinding("activityId");
if (valueBinding != null) {
String value = (String)valueBinding.getValue(getFacesContext());
return value;
}
return null;
}
public void setActivityId(String activityId) {
this.activityId = activityId;
}
public Object getUpdatedSince() {
if (null != updatedSince) {
return updatedSince;
}
ValueBinding valueBinding = getValueBinding("updatedSince");
if (valueBinding != null) {
Object value = valueBinding.getValue(getFacesContext());
return value;
}
return null;
}
public void setUpdatedSince(Object updatedSince) {
this.updatedSince = updatedSince;
}
public String getFormat() {
if (null != format) {
return format;
}
ValueBinding valueBinding = getValueBinding("format");
if (valueBinding != null) {
String value = (String)valueBinding.getValue(getFacesContext());
return value;
}
return null;
}
public void setFormat(String format) {
this.format = format;
}
public String getSortOrder() {
if (null != sortOrder) {
return sortOrder;
}
ValueBinding valueBinding = getValueBinding("sortOrder");
if (valueBinding != null) {
String value = (String)valueBinding.getValue(getFacesContext());
return value;
}
return null;
}
public void setSortOrder(String sortOrder) {
this.sortOrder = sortOrder;
}
public String getFilterBy() {
if (null != filterBy) {
return filterBy;
}
ValueBinding valueBinding = getValueBinding("filterBy");
if (valueBinding != null) {
String value = (String)valueBinding.getValue(getFacesContext());
return value;
}
return null;
}
public void setFilterBy(String filterBy) {
this.filterBy = filterBy;
}
public String getFilterOp() {
if (null != filterOp) {
return filterOp;
}
ValueBinding valueBinding = getValueBinding("filterOp");
if (valueBinding != null) {
String value = (String)valueBinding.getValue(getFacesContext());
return value;
}
return null;
}
public void setFilterOp(String filterOp) {
this.filterOp = filterOp;
}
public String getFilterValue() {
if (null != filterValue) {
return filterValue;
}
ValueBinding valueBinding = getValueBinding("filterValue");
if (valueBinding != null) {
String value = (String)valueBinding.getValue(getFacesContext());
return value;
}
return null;
}
public void setFilterValue(String filterValue) {
this.filterValue = filterValue;
}
@Override
public Object saveState(FacesContext context) {
if (isTransient()) {
return null;
}
Object[] state = new Object[11];
state[0] = super.saveState(context);
state[1] = userId;
state[2] = groupId;
state[3] = appId;
state[4] = activityId;
state[5] = updatedSince;
state[6] = format;
state[7] = sortOrder;
state[8] = filterBy;
state[9] = filterOp;
state[10] = filterValue;
return state;
}
@Override
public void restoreState(FacesContext context, Object state) {
Object[] values = (Object[])state;
super.restoreState(context, values[0]);
userId = (String)values[1];
groupId = (String)values[2];
appId = (String)values[3];
activityId = (String)values[4];
updatedSince = values[5];
format = (String)values[6];
sortOrder = (String)values[7];
filterBy = (String)values[8];
filterOp = (String)values[9];
filterValue = (String)values[10];
}
}