001/* 002 * (C) Copyright 2006-2007 Nuxeo SAS (http://nuxeo.com/) and contributors. 003 * 004 * All rights reserved. This program and the accompanying materials 005 * are made available under the terms of the GNU Lesser General Public License 006 * (LGPL) version 2.1 which accompanies this distribution, and is available at 007 * http://www.gnu.org/licenses/lgpl.html 008 * 009 * This library is distributed in the hope that it will be useful, 010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 012 * Lesser General Public License for more details. 013 * 014 * Contributors: 015 * anguenot 016 * 017 * $Id: WSRemotingSessionManagerImpl.java 21703 2007-07-01 20:48:16Z sfermigier $ 018 */ 019 020package org.nuxeo.ecm.platform.ws.session; 021 022import java.util.HashMap; 023import java.util.Hashtable; 024import java.util.List; 025import java.util.Map; 026 027import org.apache.commons.logging.Log; 028import org.apache.commons.logging.LogFactory; 029import org.nuxeo.ecm.core.api.CoreSession; 030import org.nuxeo.ecm.core.api.DocumentModel; 031import org.nuxeo.ecm.core.api.NuxeoException; 032import org.nuxeo.ecm.platform.api.ws.DocumentLoader; 033import org.nuxeo.ecm.platform.api.ws.DocumentLoaderDescriptor; 034import org.nuxeo.ecm.platform.api.ws.DocumentProperty; 035import org.nuxeo.ecm.platform.api.ws.session.WSRemotingSession; 036import org.nuxeo.ecm.platform.api.ws.session.WSRemotingSessionManager; 037import org.nuxeo.ecm.platform.api.ws.session.impl.WSRemotingSessionImpl; 038import org.nuxeo.ecm.platform.usermanager.UserManager; 039import org.nuxeo.runtime.model.ComponentInstance; 040import org.nuxeo.runtime.model.ComponentName; 041import org.nuxeo.runtime.model.DefaultComponent; 042 043/** 044 * Web service Remoting session manager implemtation. 045 * 046 * @author <a href="mailto:ja@nuxeo.com">Julien Anguenot</a> 047 */ 048public class WSRemotingSessionManagerImpl extends DefaultComponent implements WSRemotingSessionManager, DocumentLoader { 049 050 public static final ComponentName NAME = new ComponentName( 051 "org.nuxeo.ecm.platform.ws.session.WSRemotingSessionManagerImpl"); 052 053 private static final Log log = LogFactory.getLog(WSRemotingSessionManagerImpl.class); 054 055 private static final Map<String, WSRemotingSession> sessions = new Hashtable<String, WSRemotingSession>(); 056 057 protected final HashMap<String, DocumentLoader> loaders = new HashMap<String, DocumentLoader>(); 058 059 public void addSession(String sid, WSRemotingSession session) { 060 log.debug("Adding a new Web Service remoting session for username=" + session.getUsername()); 061 sessions.put(sid, session); 062 } 063 064 public WSRemotingSession createSession(String username, String password, String repository, UserManager um, 065 CoreSession session) { 066 return new WSRemotingSessionImpl(session, um, repository, username, password); 067 } 068 069 public WSRemotingSession getSession(String sid) { 070 if (sid == null) { 071 throw new NuxeoException("Invalid value for sid... null value"); 072 } 073 WSRemotingSession session = sessions.get(sid); 074 if (session == null) { 075 throw new NuxeoException("Cannot find session for sid=" + sid); 076 } 077 log.debug("Found session for username=" + session.getUsername()); 078 log.debug("Forwarding the session now..."); 079 return session; 080 } 081 082 public void delSession(String sid) { 083 WSRemotingSession session = getSession(sid); 084 sessions.remove(sid); 085 log.debug("Removing session for username=" + session.getUsername()); 086 } 087 088 @Override 089 public void registerContribution(Object contribution, String extensionPoint, ComponentInstance contributor) { 090 if ("loaders".equals(extensionPoint)) { 091 registerLoader((DocumentLoaderDescriptor) contribution); 092 } 093 } 094 095 protected void registerLoader(DocumentLoaderDescriptor desc) { 096 loaders.put(desc.name, desc.instance); 097 } 098 099 @Override 100 public void fillProperties(DocumentModel doc, List<DocumentProperty> props, WSRemotingSession rs) 101 { 102 for (DocumentLoader loader : loaders.values()) { 103 loader.fillProperties(doc, props, rs); 104 } 105 } 106 107 @Override 108 public <T> T getAdapter(Class<T> adapter) { 109 if (DocumentLoader.class.isAssignableFrom(adapter)) { 110 return adapter.cast(this); 111 } 112 return super.getAdapter(adapter); 113 } 114}