/*
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.applications.jcr.browser;
import org.exoplatform.container.ExoContainer;
import org.exoplatform.container.web.AbstractFilter;
import org.exoplatform.frameworks.jcr.web.WebConstants;
import org.exoplatform.services.jcr.RepositoryService;
import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
import org.exoplatform.services.jcr.core.ManageableRepository;
import org.exoplatform.services.jcr.ext.app.SessionProviderService;
import org.exoplatform.services.jcr.impl.core.JCRPath;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.security.ConversationState;
import java.io.IOException;
import javax.jcr.LoginException;
import javax.jcr.NoSuchWorkspaceException;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
/**
* Created by The eXo Platform SAS. <br>
*
* Date: 27.05.2008 <br>
*
* Inits JCRBrowser instance in HTTP session.
*
* @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter Nedonosko</a>
* @version $Id: JCRBrowserFilter.java 111 2008-11-11 11:11:11Z peterit $
*/
public class JCRBrowserFilter extends AbstractFilter
{
private static final Log LOG = ExoLogger.getLogger("exo.jcr.applications.browser.JCRBrowserFilter");
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException
{
HttpServletRequest httpRequest = (HttpServletRequest)servletRequest;
httpRequest.setCharacterEncoding("UTF-8");
JCRBrowser jcrBrowser = (JCRBrowser)httpRequest.getSession().getAttribute("browser");
ExoContainer container =
(ExoContainer)httpRequest.getSession().getServletContext().getAttribute(WebConstants.EXO_CONTAINER);
if (container == null)
{
container = getContainer();
}
SessionProviderService sessionProviderService =
(SessionProviderService)container.getComponentInstanceOfType(SessionProviderService.class);
RepositoryService repositoryService =
(RepositoryService)container.getComponentInstanceOfType(RepositoryService.class);
try
{
if (ConversationState.getCurrent() != null)
{
if (jcrBrowser != null && jcrBrowser.getNode() != null)
{
// navigate through JCR Repository
String repositoryName = (String)httpRequest.getParameter("repositoryName");
String workspaceName = (String)httpRequest.getParameter("workspaceName");
// check if browser related to repository/workspace given in attrs
if (repositoryName != null
&& !jcrBrowser.getRepository().getConfiguration().getName().equals(repositoryName))
{
// ask repositoryService and if not found lookup JNDI by given name
try
{
jcrBrowser.setRepository(repositoryService.getRepository(repositoryName));
}
catch (RepositoryException e)
{
if (e.getMessage().indexOf("not found") > 0)
{
// check in JNDI
LOG.warn("Repository '" + repositoryName + "' is not local. Trying JNDI lookup with the name.");
ManageableRepository jndiRepo;
try
{
InitialContext ctx = new InitialContext();
Object obj = ctx.lookup(repositoryName);
if (obj instanceof ManageableRepository)
{
jndiRepo = (ManageableRepository)obj;
}
else
{
obj = ctx.lookup("java:comp/env/" + repositoryName);
if (obj instanceof ManageableRepository)
{
jndiRepo = (ManageableRepository)obj;
}
else
{
LOG.warn("Can't cast object " + obj + " as ManageableRepository class object");
jndiRepo = null;
}
}
if (jndiRepo == null)
{
jcrBrowser.addError(e);
}
else
{
jcrBrowser.setRepository(jndiRepo);
}
}
catch (NamingException jndie)
{
LOG.warn("Repository not bound in JNDI with one of names '" + repositoryName
+ "', 'java:comp/env/" + repositoryName + "' or can't be connected.", jndie);
try
{
InitialContext ctx = new InitialContext();
Object obj = ctx.lookup("java:comp/env/jcr/" + repositoryName);
if (obj instanceof ManageableRepository)
{
jndiRepo = (ManageableRepository)obj;
}
else
{
LOG.warn("Can't cast object " + obj + " as ManageableRepository class object");
jndiRepo = null;
}
if (jndiRepo == null)
{
jcrBrowser.addError(e);
jcrBrowser.addError(jndie);
}
else
{
jcrBrowser.setRepository(jndiRepo);
}
}
catch (NamingException jndie1)
{
LOG.warn("Repository not bound in JNDI with name 'java:comp/env/jcr/" + repositoryName
+ "' or can't be connected.", jndie1);
jcrBrowser.addError(e);
jcrBrowser.addError(jndie);
jcrBrowser.addError(jndie1);
}
}
}
}
}
if (jcrBrowser.getRepository() != null)
{
if (workspaceChanged(workspaceName, jcrBrowser))
{
Session currentSession =
sessionProviderService.getSessionProvider(null).getSession(workspaceName,
jcrBrowser.getRepository());
jcrBrowser.setSession(currentSession);
jcrBrowser.setNode(JCRPath.ROOT_PATH);
}
else
{
Session currentSession =
sessionProviderService.getSessionProvider(null).getSession(
jcrBrowser.getSession().getWorkspace().getName(), jcrBrowser.getRepository());
jcrBrowser.setSession(currentSession);
jcrBrowser.refreshNode();
}
// Navigation
String path = (String)httpRequest.getParameter("goParent");
if (path != null)
{
if (!jcrBrowser.getNode().getPath().equals(JCRPath.ROOT_PATH))
{
Node parentNode = jcrBrowser.getNode().getNode(path);
jcrBrowser.setNode(parentNode.getPath());
}
}
else
{
path = (String)httpRequest.getParameter("goNodePath");
if (path != null)
{
jcrBrowser.setNode(path);
}
// else seems nothing changed in JCR navigation
}
// Synchronization
String doSynchronize = (String)httpRequest.getParameter("synchronize");
if (doSynchronize != null && doSynchronize.equals("run"))
{
jcrBrowser.runSynchronization();
}
}
}
else
{
// start from root node
ManageableRepository repository = repositoryService.getDefaultRepository();
Session jcrSession =
sessionProviderService.getSessionProvider(null).getSession(
repository.getConfiguration().getDefaultWorkspaceName(), repository);
if (jcrBrowser == null)
{
jcrBrowser = new JCRBrowser();
jcrBrowser.setRepositoryService(repositoryService);
}
jcrBrowser.setRepository(repository);
jcrBrowser.setSession(jcrSession);
jcrBrowser.setNode(JCRPath.ROOT_PATH);
}
} // conversation state check end
}
catch (NoSuchWorkspaceException e)
{
LOG.error("JCR Browser error " + e, e);
jcrBrowser.addError(e);
}
catch (LoginException e)
{
LOG.error("JCR Browser error " + e, e);
jcrBrowser.addError(e);
}
catch (RepositoryException e)
{
LOG.error("JCR Browser error " + e, e);
jcrBrowser.addError(e);
}
catch (RepositoryConfigurationException e)
{
LOG.error("JCR Browser error " + e, e);
jcrBrowser.addError(e);
}
finally
{
httpRequest.getSession().setAttribute("browser", jcrBrowser);
}
chain.doFilter(servletRequest, servletResponse);
}
private boolean workspaceChanged(String workspaceName, JCRBrowser jcrBrowser)
{
return workspaceName != null && !jcrBrowser.getSession().getWorkspace().getName().equals(workspaceName);
}
public void destroy()
{
}
}