/* * JBoss, a division of Red Hat * Copyright 2011, Red Hat Middleware, LLC, and individual * contributors as indicated by the @authors tag. See the * copyright.txt in the distribution for a full listing of * individual contributors. * * 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.gatein.integration.wsrp.jcr; import javax.jcr.Credentials; import javax.jcr.RepositoryException; import javax.jcr.Session; import org.chromattic.api.ChromatticBuilder; import org.chromattic.api.format.FormatterContext; import org.chromattic.api.format.ObjectFormatter; import org.chromattic.spi.jcr.SessionLifeCycle; import org.exoplatform.container.ExoContainer; import org.exoplatform.container.ExoContainerContext; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.core.ManageableRepository; import org.exoplatform.services.jcr.ext.common.SessionProvider; import org.gatein.wsrp.jcr.BaseChromatticPersister; /** * @author <a href="mailto:chris.laprun@jboss.com">Chris Laprun</a> * @version $Revision$ */ public class JCRPersister extends BaseChromatticPersister { public JCRPersister(ExoContainer container, String workspaceName) { super(workspaceName); } @Override protected void setBuilderOptions(ChromatticBuilder builder) { if (PORTLET_STATES_WORKSPACE_NAME.equals(workspaceName)) { builder.setOptionValue(ChromatticBuilder.SESSION_LIFECYCLE_CLASSNAME, PortletStatesSessionLifeCycle.class.getName()); } else if (WSRP_WORKSPACE_NAME.equals(workspaceName)) { builder.setOptionValue(ChromatticBuilder.SESSION_LIFECYCLE_CLASSNAME, WSRPSessionLifeCycle.class.getName()); } else { throw new IllegalArgumentException("Unknown workspace name: '" + workspaceName + "'"); } } public abstract static class AbstractSessionLifeCycle implements SessionLifeCycle { private ManageableRepository repository; private ThreadLocal<SessionProvider> provider = new ThreadLocal<SessionProvider>(); public AbstractSessionLifeCycle() { try { ExoContainer container = ExoContainerContext.getCurrentContainer(); RepositoryService repoService = (RepositoryService) container.getComponentInstanceOfType(RepositoryService.class); repository = repoService.getRepository(REPOSITORY_NAME); } catch (Exception e) { throw new RuntimeException(e); } } public Session login() throws RepositoryException { SessionProvider sessionProvider = provider.get(); if (sessionProvider == null) { sessionProvider = SessionProvider.createSystemProvider(); provider.set(sessionProvider); } return sessionProvider.getSession(getWorkspaceName(), repository); } protected abstract String getWorkspaceName(); public Session login(String s) throws RepositoryException { throw new UnsupportedOperationException(); } public Session login(Credentials credentials, String s) throws RepositoryException { throw new UnsupportedOperationException(); } public Session login(Credentials credentials) throws RepositoryException { throw new UnsupportedOperationException(); } public void save(Session session) throws RepositoryException { session.save(); } public void close(Session session) { session.logout(); } } public static class WSRPSessionLifeCycle extends AbstractSessionLifeCycle { @Override protected String getWorkspaceName() { return WSRP_WORKSPACE_NAME; } } public static class PortletStatesSessionLifeCycle extends AbstractSessionLifeCycle { @Override protected String getWorkspaceName() { return PORTLET_STATES_WORKSPACE_NAME; } } public static class QNameFormatter implements ObjectFormatter { private static final String OPEN_BRACE_REPLACEMENT = "-__"; private static final String CLOSE_BRACE_REPLACEMENT = "__-"; private static final String COLON_REPLACEMENT = "_-_"; private static final String CLOSE_BRACE = "}"; private static final String OPEN_BRACE = "{"; private static final String COLON = ":"; public String decodeNodeName(FormatterContext formatterContext, String s) { return decode(s); } public String encodeNodeName(FormatterContext formatterContext, String s) { return encode(s); } public String decodePropertyName(FormatterContext formatterContext, String s) { return decode(s); } public String encodePropertyName(FormatterContext formatterContext, String s) { return encode(s); } public static String decode(String s) { return s.replace(CLOSE_BRACE_REPLACEMENT, CLOSE_BRACE).replace(OPEN_BRACE_REPLACEMENT, OPEN_BRACE) .replace(COLON_REPLACEMENT, COLON); } public static String encode(String s) { return s.replace(OPEN_BRACE, OPEN_BRACE_REPLACEMENT).replace(CLOSE_BRACE, CLOSE_BRACE_REPLACEMENT) .replace(COLON, COLON_REPLACEMENT); } } public static class PortletNameFormatter implements ObjectFormatter { public static final String SLASH_REPLACEMENT = "-_-"; private static final String SLASH = "/"; public String decodeNodeName(FormatterContext formatterContext, String s) { return decode(s); } public static String decode(String s) { return s.replace(SLASH_REPLACEMENT, SLASH); } public String encodeNodeName(FormatterContext formatterContext, String s) throws IllegalArgumentException, NullPointerException { return encode(s); } public static String encode(String s) { return s.replace(SLASH, SLASH_REPLACEMENT); } } }