/* * 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.services.jcr.usecases.export; import org.exoplatform.services.jcr.config.ContainerEntry; import org.exoplatform.services.jcr.config.QueryHandlerEntry; import org.exoplatform.services.jcr.config.QueryHandlerParams; import org.exoplatform.services.jcr.config.RepositoryConfigurationException; import org.exoplatform.services.jcr.config.SimpleParameterEntry; import org.exoplatform.services.jcr.config.WorkspaceEntry; import org.exoplatform.services.jcr.config.WorkspaceInitializerEntry; import org.exoplatform.services.jcr.impl.core.RepositoryImpl; import org.exoplatform.services.jcr.impl.core.SessionImpl; import org.exoplatform.services.jcr.impl.core.SysViewWorkspaceInitializer; import org.exoplatform.services.jcr.impl.storage.jdbc.JDBCDataContainerConfig.DatabaseStructureType; import org.exoplatform.services.jcr.impl.util.jdbc.DBInitializerHelper; import org.exoplatform.services.jcr.usecases.BaseUsecasesTest; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * Created by The eXo Platform SAS. * * <br>Date: 06.05.2009 * * @author <a href="mailto:alex.reshetnyak@exoplatform.com.ua">Alex Reshetnyak</a> * @version $Id: ExportWorkspaceSystemViewTest.java 111 2008-11-11 11:11:11Z rainf0x $ */ public class ExportWorkspaceSystemViewTest extends BaseUsecasesTest { public void testTwoRestores() throws Exception { { SessionImpl sessionWS1 = (SessionImpl)repository.login(credentials, "ws1"); sessionWS1.getRootNode().addNode("asdasdasda", "nt:unstructured").setProperty("data", "data_1"); sessionWS1.save(); // 1-st export File f1 = new File("target/1.xml"); sessionWS1.exportWorkspaceSystemView(new FileOutputStream(f1), false, false); // 1-st import WorkspaceEntry ws1_restore_1 = makeWorkspaceEntry("ws1_restore_1", isMultiDB(session) ? "jdbcjcr2export1" : "jdbcjcr", f1); repository.configWorkspace(ws1_restore_1); repository.createWorkspace(ws1_restore_1.getName()); // check SessionImpl back1 = (SessionImpl)repository.login(credentials, "ws1_restore_1"); assertNotNull(back1.getRootNode().getNode("asdasdasda").getProperty("data")); // add date to restored workspace back1.getRootNode().addNode("gdfgrghfhf", "nt:unstructured").setProperty("data", "data_2"); back1.save(); } { // 2-st export SessionImpl back1 = (SessionImpl)repository.login(credentials, "ws1_restore_1"); File f2 = new File("target/2.xml"); back1.exportWorkspaceSystemView(new FileOutputStream(f2), false, false); // 2-st import WorkspaceEntry ws1_restore_2 = makeWorkspaceEntry("ws1_restore_2", isMultiDB(session) ? "jdbcjcr2export2" : "jdbcjcr", f2); repository.configWorkspace(ws1_restore_2); repository.createWorkspace(ws1_restore_2.getName()); // check SessionImpl back2 = (SessionImpl)repository.login(credentials, "ws1_restore_2"); assertNotNull(back2.getRootNode().getNode("gdfgrghfhf").getProperty("data")); } } private WorkspaceEntry makeWorkspaceEntry(String name, String sourceName, File sysViewFile) { WorkspaceEntry ws1e = session.getContainer().getComponentInstanceOfType(WorkspaceEntry.class); WorkspaceEntry ws1back = new WorkspaceEntry(); ws1back.setName(name); ws1back.setUniqueName(((RepositoryImpl)session.getRepository()).getName() + "_" + ws1back.getName()); ws1back.setAccessManager(ws1e.getAccessManager()); ws1back.setCache(ws1e.getCache()); ws1back.setContainer(ws1e.getContainer()); ws1back.setLockManager(ws1e.getLockManager()); // Initializer WorkspaceInitializerEntry wiEntry = new WorkspaceInitializerEntry(); wiEntry.setType(SysViewWorkspaceInitializer.class.getCanonicalName()); List<SimpleParameterEntry> wieParams = new ArrayList<SimpleParameterEntry>(); wieParams .add(new SimpleParameterEntry(SysViewWorkspaceInitializer.RESTORE_PATH_PARAMETER, sysViewFile.getPath())); wiEntry.setParameters(wieParams); ws1back.setInitializer(wiEntry); // Indexer List<SimpleParameterEntry> qParams = new ArrayList<SimpleParameterEntry>(); qParams.add(new SimpleParameterEntry(QueryHandlerParams.PARAM_INDEX_DIR, "target" + File.separator + name)); QueryHandlerEntry qEntry = new QueryHandlerEntry("org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex", qParams); ws1back.setQueryHandler(qEntry); List<SimpleParameterEntry> params = new ArrayList<SimpleParameterEntry>(); for (Iterator<SimpleParameterEntry> i = ws1back.getContainer().getParameterIterator(); i.hasNext();) { SimpleParameterEntry p = i.next(); SimpleParameterEntry newp = new SimpleParameterEntry(p.getName(), p.getValue()); if (isMultiDB(session) && newp.getName().equals("source-name")) { newp.setValue(sourceName); } else if (newp.getName().equals("swap-directory")) { newp.setValue("target/temp/swap/" + name); } else if (isMultiDB(session) && newp.getName().equals("dialect")) { newp.setValue("hsqldb"); } params.add(newp); } ContainerEntry ce = new ContainerEntry("org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer", params); ws1back.setContainer(ce); return ws1back; } private boolean isMultiDB(SessionImpl session) { WorkspaceEntry ws1e = session.getContainer().getComponentInstanceOfType(WorkspaceEntry.class); try { DatabaseStructureType databaseType = DBInitializerHelper.getDatabaseType(ws1e); return databaseType.isMultiDatabase(); } catch (RepositoryConfigurationException e) { throw new RuntimeException("Can not get property 'multi-db' in configuration on workspace '" + ws1e.getName() + "'"); } } }