/* * ModeShape (http://www.modeshape.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.modeshape.web.server.impl; import java.io.File; import java.util.HashMap; import javax.jcr.Credentials; import javax.jcr.LoginException; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.Workspace; import javax.servlet.ServletContext; import org.modeshape.common.logging.Logger; import org.modeshape.jcr.JcrRepository; import org.modeshape.jcr.api.RepositoryManager; import org.modeshape.web.shared.RemoteException; import org.modeshape.web.server.LRepository; import org.modeshape.web.shared.BackupParams; import org.modeshape.web.shared.RestoreParams; /** * @author kulikov */ public class LRepositoryImpl implements LRepository { private Credentials creds; private JcrRepository repository; //server's env private transient ServletContext context; private transient File tempDir; private HashMap<String, Session> sessions = new HashMap<>(); private String[] workspaces; private final static Logger logger = Logger.getLogger(LRepositoryImpl.class); public LRepositoryImpl( ServletContext context, JcrRepository repository, Credentials creds ) throws LoginException, RepositoryException { this.context = context; this.creds = creds; assert repository != null; this.repository = repository; logger.debug("Logging to repository " + repository + " as " + creds); Session session = creds != null ? repository.login(creds) : repository.login(); sessions.put(session.getWorkspace().getName(), session); workspaces = session.getWorkspace().getAccessibleWorkspaceNames(); logger.debug("[" + this.repository.getName() + "] available workspaces " + wsnames()); tempDir = (File) context.getAttribute("javax.servlet.context.tempdir"); } @Override public String name() { return repository.getName(); } @Override public String[] getWorkspaces() { logger.debug("[" + this.repository.getName() + "] Requested workspaces " + wsnames()); return workspaces; } private String wsnames() { StringBuilder builder = new StringBuilder(); builder.append("{"); for (int i = 0; i < workspaces.length - 1; i++) { builder.append(workspaces[i]); builder.append(","); } builder.append(workspaces[workspaces.length - 1]); builder.append("}"); return builder.toString(); } @Override public Session session( String workspace ) throws RemoteException { if (sessions.containsKey(workspace)) { logger.debug("[" + this.repository.getName() + "] has already session to " + workspace); return sessions.get(workspace); } try { logger.debug("[" + this.repository.getName() + "] has not yet session to " + workspace); Session session = creds != null ? repository.login(creds, workspace) : repository.login(workspace); sessions.put(workspace, session); return session; } catch (RepositoryException e) { throw new RemoteException(e.getMessage()); } } private Session session() { return sessions.values().iterator().next(); } @Override public Repository repository() { return repository; } @Override public void backup( String name, BackupParams options ) throws RemoteException { try { File dir = new File(tempDir.getAbsolutePath() + File.separator + name); RepositoryManager mgr = ((org.modeshape.jcr.api.Session)session()).getWorkspace().getRepositoryManager(); mgr.backupRepository(dir, new BackupUsrOptions(options)); } catch (Exception e) { throw new RemoteException(e.getMessage()); } } @Override public void restore( String name, RestoreParams options ) throws RemoteException { try { File dir = new File(tempDir.getAbsolutePath() + File.separator + name); RepositoryManager mgr = ((org.modeshape.jcr.api.Session)session()).getWorkspace().getRepositoryManager(); mgr.restoreRepository(dir, new RestoreUsrOptions(options)); //after restore process session will be closed so we need to clean up //sessions to avoid access of invalid session. sessions.clear(); } catch (Exception e) { throw new RemoteException(e.getMessage()); } } public void importXML( String workspace ) throws RemoteException { try { Workspace ws = ((org.modeshape.jcr.api.Session)session(workspace)).getWorkspace(); ws.importXML(workspace, null, 0); } catch (Exception e) { throw new RemoteException(e.getMessage()); } } }