/* * © 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.generic; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.HashMap; import java.util.List; import java.util.Map; import com.ibm.commons.util.StringUtil; import com.ibm.commons.util.io.json.JsonJavaObject; 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.GenericService; import com.ibm.sbt.services.endpoints.Endpoint; import com.ibm.sbt.util.JsonNavigator; import com.ibm.xsp.FacesExceptionEx; import com.ibm.xsp.extlib.sbt.model.RestDataBlockAccessor; import com.ibm.xsp.extlib.sbt.model.accessor.JsonArrayBlockAccessor; /** * Generic Json Rest Data Source. * @author Philippe Riand */ public class GenericRestJsonDataSource extends GenericRestDataSource { public static class JsonAccessor extends JsonArrayBlockAccessor { private static final int FT_FIRST0 = 0; private static final int FT_FIRST1 = 1; private static final int FT_PAGE0 = 2; private static final int FT_PAGE1 = 3; private static final long serialVersionUID = 1L; private String splitPath; private String pFirst; private int pFirstType; private String pCount; public JsonAccessor() { } public JsonAccessor(GenericRestJsonDataSource ds) { super(ds); this.splitPath = ds.getSplitPath(); this.pFirst = ds.getParamFirst(); if(StringUtil.isEmpty(pFirst)) { // Default pFirst = "first"; } String ft = ds.getParamFirstType(); if(StringUtil.equals(ft, "first0")) { this.pFirstType = FT_FIRST0; } else if(StringUtil.equals(ft, "first1")) { this.pFirstType = FT_FIRST1; } else if(StringUtil.equals(ft, "page0")) { this.pFirstType = FT_PAGE0; } else if(StringUtil.equals(ft, "page1")) { this.pFirstType = FT_PAGE1; } else { // Default this.pFirstType = FT_FIRST0; } this.pCount = ds.getParamCount(); if(StringUtil.isEmpty(pCount)) { // Default pCount = "count"; } } protected Map<String,String> getParameters(int index, int blockSize) { HashMap<String,String> map = new HashMap<String,String>(); map.putAll(getUrlParameters()); int page = 0; switch(pFirstType) { case FT_FIRST0: { page = index*blockSize; } break; case FT_FIRST1: { page = (index*blockSize)+1; } break; case FT_PAGE0: { page = index; } break; case FT_PAGE1: { page = index+1; } break; } ///2.0/answers?page=1&pagesize=3&order=desc&sort=activity&site=stackoverflow map.put(pFirst,Integer.toString(page)); map.put(pCount,Integer.toString(blockSize)); return map; } @Override protected Block loadBlock(int index, int blockSize) { try { ClientService svc = createService(findEndpointBean(),getServiceUrl()); Map<String,String> parameters = getParameters(index, blockSize); //String text = (String)svc.get(parameters, ClientService.FORMAT_TEXT); //IValue collection = (IValue)JsonParser.fromJson(JSJson.factory,text); Object[] data = null; HandlerJson json= new HandlerJson(); JsonJavaObject result = (JsonJavaObject)svc.get(getServiceUrl(),parameters,json).getData(); if(result!=null) { if(StringUtil.isNotEmpty(splitPath)) { JsonNavigator nav = new JsonNavigator(result); List<Object> nodes = nav.nodes(splitPath); if(nodes!=null) { data=nodes.toArray(); } } } if(data!=null) { return new ArrayBlock(index,data); } else { return new EmptyBlock(index); } } catch(Exception ex) { throw new FacesExceptionEx(ex,"Error while reading the JSON stream"); } } protected ClientService createService(Endpoint endpoint, String serviceUrl) { GenericService svc = new GenericService(endpoint); return svc; } @Override public void writeExternal(ObjectOutput out) throws IOException { super.writeExternal(out); out.writeObject(splitPath); out.writeObject(pFirst); out.writeInt(pFirstType); out.writeObject(pCount); } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { super.readExternal(in); this.splitPath = (String)in.readObject(); this.pFirst = (String)in.readObject(); this.pFirstType = in.readInt(); this.pCount = (String)in.readObject(); } } public GenericRestJsonDataSource() { } @Override protected RestDataBlockAccessor createAccessor() { return new JsonAccessor(this); } // @Override // public Object saveState(FacesContext context) { // if (isTransient()) { // return null; // } // Object[] state = new Object[1]; // state[0] = super.saveState(context); // return state; // } // @Override // public void restoreState(FacesContext context, Object state) { // Object[] values = (Object[])state; // super.restoreState(context, values[0]); // } }