001    /*                                                                                      */
002    /* Module Broadcasting 1.0, 05-2007                 */
003    /* +++++++++++++++++++++++++++++++++++++                */
004    /*                                                                                      */
005    /* Andreas Trappe       - concept, devel. in misc.  */
006    /*                                                                                      */
007    /*                                                                                      */
008    /*                                                                                      */
009    
010    package org.mycore.services.broadcasting;
011    
012    import java.io.IOException;
013    import java.util.HashMap;
014    import java.util.Map;
015    
016    import javax.servlet.ServletException;
017    import javax.servlet.http.HttpServletRequest;
018    import javax.servlet.http.HttpServletResponse;
019    
020    import org.jdom.Document;
021    import org.jdom.Element;
022    import org.jdom.JDOMException;
023    
024    import org.mycore.access.MCRAccessManager;
025    import org.mycore.common.MCRConfigurationException;
026    import org.mycore.common.MCRSession;
027    import org.mycore.common.MCRSessionMgr;
028    import org.mycore.frontend.servlets.MCRServlet;
029    import org.mycore.frontend.servlets.MCRServletJob;
030    
031    public class MCRBroadcastingServlet extends MCRServlet {
032    
033        private static final long serialVersionUID = 1L;
034    
035        final static Map<String, Element> bcRecList = new HashMap<String, Element>();
036    
037        public void init() throws MCRConfigurationException, ServletException {
038            super.init();
039        }
040    
041        public void doGetPost(MCRServletJob job) throws IOException, ServletException, JDOMException {
042    
043            HttpServletRequest request = job.getRequest();
044            HttpServletResponse response = job.getResponse();
045            MCRSession session = MCRSessionMgr.getCurrentSession();
046    
047            // get mode and process
048            Element answer = null;
049            boolean transformByXSL = false;
050            if (request.getParameter("mode").equals("hasReceived")) {
051                String hasReceived = Boolean.toString(hasReceived(session, request));
052                answer = new Element("hasReceived").setText(hasReceived);
053            } else if (request.getParameter("mode").equals("addReceiver")) {
054                addReceiver(session, request);
055                answer = new Element("addReceiver").setText("done");
056            } else if (request.getParameter("mode").equals("clearReceiverList") && access()) {
057                clearReceiverList();
058                answer = getReceiverListAsXML(session);
059                transformByXSL = true;
060            } else if (request.getParameter("mode").equals("getReceiverList") && access()) {
061                answer = getReceiverListAsXML(session);
062                transformByXSL = true;
063            } else {
064                transformByXSL = true;
065                answer = new Element("nothingDone");
066            }
067    
068            // render xml
069            forwardJDOM(request, response, answer, transformByXSL);
070        }
071    
072        private static boolean access() {
073            return MCRAccessManager.checkPermission("broadcasting") || MCRAccessManager.checkPermission("module-broadcasting", "manage");
074        }
075    
076        private Element getReceiverListAsXML(MCRSession session) {
077    
078            Element recListRoot = new Element("receiverList").setAttribute("access", "true");
079            for (Map.Entry<String, Element> entry : bcRecList.entrySet()) {
080                Element key = new Element("key").setText(entry.getKey());
081                Element recValue = entry.getValue();
082                recListRoot.addContent(new Element("receiver").addContent(key).addContent(recValue.detach()));
083            }
084            if (bcRecList.isEmpty()) {
085                recListRoot.addContent(new Element("empty"));
086            }
087            return recListRoot;
088        }
089    
090        private void clearReceiverList() {
091            bcRecList.clear();
092        }
093    
094        private void addReceiver(MCRSession session, HttpServletRequest request) {
095            Element value = getReceiverDetails(session);
096    
097            // if user==gast put sessionID, otherwise put username+sessionID
098            if (session.getCurrentUserID().equals("gast"))
099                bcRecList.put(session.getID(), value);
100            else {
101                String key = getKey(request, session);
102                bcRecList.put(key, value);
103            }
104        }
105    
106        private final Element getReceiverDetails(MCRSession session) {
107            Element details = new Element("details").addContent(new Element("login").setText(session.getCurrentUserID())).addContent(
108                            new Element("ip").setText(session.getCurrentIP())).addContent(new Element("session-id").setText(session.getID()));
109            return details;
110        }
111    
112        private boolean hasReceived(MCRSession session, HttpServletRequest request) {
113            // if (!cache.isEmpty() && cache.get("bcRecList") != null) {
114            String key = getKey(request, session);
115            if ((session.getCurrentUserID().equals("gast") && bcRecList.get(session.getID()) != null)
116                            || (!session.getCurrentUserID().equals("gast") && bcRecList.get(key) != null))
117                return true;
118            return false;
119        }
120    
121        private final static String getKey(HttpServletRequest request, MCRSession session) {
122            if (request.getParameter("sessionSensitive").equals("true"))
123                return session.getCurrentUserID().trim() + session.getID().trim();
124            else
125                return session.getCurrentUserID().trim();
126        }
127    
128        public void forwardJDOM(HttpServletRequest request, HttpServletResponse response, Element elem, boolean xslTransformation) throws IOException {
129    
130            Element root = null;
131            if (xslTransformation)
132                root = new Element("mcr-module-broadcasting-admin");
133            else
134                root = new Element("mcr-module-broadcasting");
135    
136            root.addContent(elem);
137            Document jdom = new Document(root);
138    
139            if (xslTransformation)
140                getLayoutService().doLayout(request, response, jdom);
141            else
142                getLayoutService().sendXML(request, response, jdom);
143        }
144    }