/* * File : JClicReportService.java * Created : 26-mar-2003 16:30 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2005 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.report.rp; import edu.xtec.jclic.report.ActionReg; import edu.xtec.jclic.report.ActivityReg; import edu.xtec.jclic.report.BasicJDBCBridge; import edu.xtec.jclic.report.GroupData; import edu.xtec.jclic.report.ReportServerEventMaker; import edu.xtec.jclic.report.TCPReportBean; import edu.xtec.jclic.report.UserData; import edu.xtec.util.Domable; import edu.xtec.util.JDomUtility; import java.util.List; import java.util.Map; import java.io.InputStream; /** * * @author Francesc Busquets (fbusquets@xtec.cat) * @version(13.09.17) */ public class JClicReportService extends ReportsRequestProcessor{ TCPReportBean request=null, response=null; public static ReportServerEventMaker eventMaker=new ReportServerEventMaker(); boolean trustClientDateTime=false; @Override public boolean init() throws Exception{ if(!super.init()) return false; InputStream is = getInputStream(); if (is != null) { if (prop != null) { trustClientDateTime = "true".equalsIgnoreCase((String) prop.get(BasicJDBCBridge.TRUST_CLIENT_DATETIME)); } org.jdom.Document doc = JDomUtility.getSAXBuilder().build(is); request = new TCPReportBean(doc.getRootElement()); response = processRequest(request); } else response = new TCPReportBean(); return true; } @Override public boolean usesWriter(){ return false; } @Override public boolean wantsInputStream(){ return true; } @Override public void process(java.io.OutputStream out) throws Exception{ JDomUtility.saveDocument(out, response.getJDomElement()); }; @Override public void header(List<String[]> v){ super.header(v); v.add(new String[]{CONTENT_TYPE, "text/xml"}); // 8-Jun-16: Added support for Cross-Domain requests // 12-Jun-16: Support also Preflight requests sent via OPTIONS method // TODO: Allow to set specific values for CORS v.add(new String[]{EXTRA, "Access-Control-Allow-Origin", "*"}); v.add(new String[]{EXTRA, "Access-Control-Allow-Methods", "POST, OPTIONS"}); v.add(new String[]{EXTRA, "Access-Control-Allow-Headers", "Content-Type"}); v.add(new String[]{EXTRA, "Access-Control-Allow-Max-Age", "1728000"}); } private TCPReportBean processRequest(TCPReportBean bean) throws Exception{ TCPReportBean result=new TCPReportBean(TCPReportBean.ERROR); String id=bean.getId(); if(TCPReportBean.MULTIPLE.equals(id)){ Domable[] beans=bean.getData(); for(int i=0; i<beans.length; i++) result=processRequest((TCPReportBean)beans[i]); } else if(TCPReportBean.ADD_SESSION.equals(id)){ String sessionId=bridge.addSession (bean.getParam(TCPReportBean.USER) ,trustClientDateTime ? Long.parseLong(bean.getParam(TCPReportBean.TIME)) : System.currentTimeMillis() ,bean.getParam(TCPReportBean.PROJECT) ,bean.getParam(TCPReportBean.CODE) ,bean.getParam(TCPReportBean.KEY) ,bean.getParam(TCPReportBean.CONTEXT)); result.setParam(TCPReportBean.SESSION, sessionId); result.setId(TCPReportBean.ADD_SESSION); } else if(TCPReportBean.ADD_ACTIVITY.equals(id)){ ActivityReg ar=(ActivityReg)bean.getSingleData(); int actId=Integer.parseInt(bean.getParam(TCPReportBean.NUM)); String sessionId=bean.getParam(TCPReportBean.SESSION); int actIdR=bridge.addActivity(actId, sessionId, ar); ActionReg actReg; for(int arc=0; (actReg=ar.getActionReg(arc))!=null; arc++) bridge.addAction(actId, sessionId, arc, actReg); result.setParam(TCPReportBean.ACTIVITY, Integer.toString(actIdR)); result.setId(TCPReportBean.ADD_ACTIVITY); } else if(TCPReportBean.NEW_GROUP.equals(id)){ String groupId=bridge.newGroup((GroupData)bean.getSingleData()); result.setParam(TCPReportBean.GROUP, groupId); result.setId(TCPReportBean.NEW_GROUP); } else if(TCPReportBean.NEW_USER.equals(id)){ String userId=bridge.newUser((UserData)bean.getSingleData()); result.setParam(TCPReportBean.USER, userId); result.setId(TCPReportBean.NEW_USER); } else if(TCPReportBean.GET_USER_DATA.equals(id)){ result.setData(bridge.getUserData(bean.getParam(TCPReportBean.USER))); result.setId(TCPReportBean.GET_USER_DATA); } else if(TCPReportBean.GET_GROUP_DATA.equals(id)){ result.setData(bridge.getGroupData(bean.getParam(TCPReportBean.GROUP))); result.setId(TCPReportBean.GET_GROUP_DATA); } else if(TCPReportBean.GET_PROPERTY.equals(id)){ String k=bean.getParam(TCPReportBean.KEY); String dv=bean.getParam(TCPReportBean.DEFAULT); result.setParam(TCPReportBean.RESULT, bridge.getProperty(k,dv)); result.setId(TCPReportBean.GET_PROPERTY); } else if(TCPReportBean.GET_PROPERTIES.equals(id)){ Map<String, String> map=bridge.getProperties(); for (String key : map.keySet()) { result.setParam(key, map.get(key)); } result.setId(TCPReportBean.GET_PROPERTIES); } else if(TCPReportBean.GET_GROUPS.equals(id)){ List<GroupData> v=bridge.getGroups(); result.setData((GroupData[])v.toArray(new GroupData[v.size()])); result.setId(TCPReportBean.GET_GROUPS); } else if(TCPReportBean.GET_USERS.equals(id)){ List<UserData> v=bridge.getUsers(bean.getParam(TCPReportBean.GROUP)); result.setData((UserData[])v.toArray(new UserData[v.size()])); result.setId(TCPReportBean.GET_USERS); } else{ //fireReportServerEvent(ReportServerEvent.DB, "unknow command", socket, ReportServerEvent.ERROR); result.setParam(TCPReportBean.ERROR, "unknown command"); } // Mirar qus el que es reporta!!! eventMaker.fireReportServerSystemEvent(id); return result; } }