/* license-start
*
* Copyright (C) 2008 - 2013 Crispico, <http://www.crispico.com/>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 3.
*
* This program 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 General Public License for more details, at <http://www.gnu.org/licenses/>.
*
* Contributors:
* Crispico - Initial API and implementation
*
* license-end
*/
package org.flowerplatform.web.tests.codesync;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.io.File;
import java.io.IOException;
import java.security.PrivilegedAction;
import java.util.Arrays;
import java.util.Iterator;
import javax.security.auth.Subject;
import org.apache.commons.io.FileUtils;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.flowerplatform.communication.CommunicationPlugin;
import org.flowerplatform.communication.channel.CommunicationChannel;
import org.flowerplatform.communication.service.ServiceInvocationContext;
import org.flowerplatform.communication.stateful_service.StatefulServiceInvocationContext;
import org.flowerplatform.editor.EditorPlugin;
import org.flowerplatform.model.astcache.wiki.AstCacheWikiFactory;
import org.flowerplatform.model.astcache.wiki.Page;
import org.flowerplatform.web.communication.RecordingTestWebCommunicationChannel;
import org.flowerplatform.web.projects.remote.ProjectsService;
import org.flowerplatform.web.security.sandbox.FlowerWebPrincipal;
import org.flowerplatform.web.tests.TestUtil;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import com.crispico.flower.mp.codesync.base.CodeSyncEditableResource;
import com.crispico.flower.mp.codesync.base.CodeSyncPlugin;
import com.crispico.flower.mp.codesync.base.communication.CodeSyncEditorStatefulService;
import com.crispico.flower.mp.codesync.wiki.WikiPlugin;
import com.crispico.flower.mp.codesync.wiki.dokuwiki.DokuWikiClientConfiguration;
import com.crispico.flower.mp.codesync.wiki.dokuwiki.DokuWikiConfigurationProvider;
import com.crispico.flower.mp.codesync.wiki.dokuwiki.DokuWikiPage;
import com.crispico.flower.mp.codesync.wiki.dokuwiki.DokuWikiPlugin;
import com.crispico.flower.mp.codesync.wiki.github.GithubConfigurationProvider;
import com.crispico.flower.mp.model.codesync.CodeSyncElement;
import com.crispico.flower.mp.model.codesync.CodeSyncFactory;
import com.crispico.flower.mp.model.codesync.CodeSyncPackage;
import com.crispico.flower.mp.model.codesync.CodeSyncRoot;
import flex.messaging.FlexContext;
import flex.messaging.HttpFlexSession;
public class CodeSyncWikiTest {
private static final String PROJECT = "codesync_wiki";
private static String DIR = TestUtil.getResourcesDir(CodeSyncWikiTest.class) + TestUtil.NORMAL;
public static final String LINK = "/link-to-project";
private File DOKUWIKI_FILE = (File) CodeSyncPlugin.getInstance().getProjectAccessController().getFile(getProject(), ProjectsService.LINK_TO_PROJECT + "/dokuwiki/teste Scenarios in Diagrams.txt");
private File DOKUWIKI_FILE_2 = (File) CodeSyncPlugin.getInstance().getProjectAccessController().getFile(getProject(), ProjectsService.LINK_TO_PROJECT + "/dokuwiki/teste Scenarios in Diagrams 2.txt");
private File DOKUWIKI_FILE_3 = (File) CodeSyncPlugin.getInstance().getProjectAccessController().getFile(getProject(), ProjectsService.LINK_TO_PROJECT + "/dokuwiki/teste Scenarios in Diagrams 3.txt");
private File MD_FILE = (File) CodeSyncPlugin.getInstance().getProjectAccessController().getFile(getProject(), ProjectsService.LINK_TO_PROJECT + "/markdown/Test.md");
private File MD_FILE_2 = (File) CodeSyncPlugin.getInstance().getProjectAccessController().getFile(getProject(), ProjectsService.LINK_TO_PROJECT + "/markdown/left/Test.md");
private File MD_FILE_3 = (File) CodeSyncPlugin.getInstance().getProjectAccessController().getFile(getProject(), ProjectsService.LINK_TO_PROJECT + "/markdown/right/Test.md");
private Pair[] expected;
private int index;
private static CommunicationChannel communicationChannel = new RecordingTestWebCommunicationChannel();
@BeforeClass
public static void setUpBeforeClass() {
CommunicationPlugin.getInstance().getServiceRegistry().registerService(CodeSyncEditorStatefulService.SERVICE_ID, new CodeSyncEditorStatefulService());
TestUtil.copyFilesAndCreateProject(new ServiceInvocationContext(communicationChannel), DIR, PROJECT);
}
@Before
public void setUp() {
expected = null;
index = 0;
}
// @Test
public void testDokuWiki() {
Subject subject = new Subject();
final FlowerWebPrincipal principal = new FlowerWebPrincipal(0);
final String technology = "Doku";
String url = "http://csp1/dokuwiki/lib/exe/xmlrpc.php";
String user = "";
String password = "";
principal.getWikiClientConfigurations().put(technology, new DokuWikiClientConfiguration(url, user, password));
subject.getPrincipals().add(principal);
Subject.doAsPrivileged(subject, new PrivilegedAction<Void>() {
@Override
public Void run() {
FlexContext.setThreadLocalSession(new HttpFlexSession());
FlexContext.setUserPrincipal(principal);
RecordingTestWebCommunicationChannel cc = new RecordingTestWebCommunicationChannel();
cc.setPrincipal((FlowerWebPrincipal) principal);
ServiceInvocationContext context = new ServiceInvocationContext(cc);
Object wiki = DokuWikiPlugin.getInstance().getWikiPages("proiecte:flower:teste");
WikiPlugin.getInstance().getConfigurationProviders().put(technology, new DokuWikiConfigurationProvider());
WikiPlugin wikiPlugin = WikiPlugin.getInstance();
File project = getProject();
ResourceSet resourceSet = CodeSyncPlugin.getInstance().getOrCreateResourceSet(project, "mindmapEditorStatefulService");
CodeSyncRoot leftRoot = wikiPlugin.getWikiTree(null, resourceSet, wiki, "proiecte:flower:teste", technology);
CodeSyncRoot rightRoot = wikiPlugin.getWikiTree(project, resourceSet, null, "proiecte:flower:teste", technology);
expected = new Pair[] {
new Pair(WikiPlugin.FOLDER_CATEGORY, 0), // Crispico
new Pair(WikiPlugin.FOLDER_CATEGORY, 1), // proiecte
new Pair(WikiPlugin.FOLDER_CATEGORY, 2), // flower
new Pair(WikiPlugin.PAGE_CATEGORY, 3), // teste
new Pair(WikiPlugin.FOLDER_CATEGORY, 4), // teste
new Pair(WikiPlugin.PAGE_CATEGORY, 5), // new_test
new Pair(WikiPlugin.HEADING_LEVEL_2_CATEGORY, 6),
new Pair(WikiPlugin.HEADING_LEVEL_3_CATEGORY, 7),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 8),
new Pair(WikiPlugin.HEADING_LEVEL_1_CATEGORY, 4),
new Pair(WikiPlugin.HEADING_LEVEL_1_CATEGORY, 4),
new Pair(WikiPlugin.HEADING_LEVEL_2_CATEGORY, 5),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 6),
new Pair(WikiPlugin.FLOWER_BLOCK_CATEGORY, 6),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 6),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 6),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 6),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 6),
new Pair(WikiPlugin.HEADING_LEVEL_2_CATEGORY, 5),
new Pair(WikiPlugin.HEADING_LEVEL_1_CATEGORY, 4)
};
test(leftRoot, rightRoot, resourceSet, technology, expected);
return null;
}
}, null);
}
@Test
public void testDokuWiki_dummy() throws CoreException, IOException {
WikiPlugin wikiPlugin = WikiPlugin.getInstance();
String ancestor = FileUtils.readFileToString(DOKUWIKI_FILE);
String left = FileUtils.readFileToString(DOKUWIKI_FILE_2);
String right = FileUtils.readFileToString(DOKUWIKI_FILE_3);
String pageName = "page";
DokuWikiPage page = new DokuWikiPage(pageName, ancestor);
String technology = "Dummy";
DummyDokuWikiConfigurationProvider dummyConfigProvider = new DummyDokuWikiConfigurationProvider();
WikiPlugin.getInstance().getConfigurationProviders().put(technology, dummyConfigProvider);
File project = getProject();
ResourceSet resourceSet = CodeSyncPlugin.getInstance().getOrCreateResourceSet(project, "mindmapEditorStatefulService");
CodeSyncRoot leftRoot = wikiPlugin.getWikiTree(null, resourceSet, Arrays.asList(page), "", technology);
CodeSyncRoot rightRoot = wikiPlugin.getWikiTree(project, resourceSet, null, "", technology);
expected = new Pair[] {
new Pair(WikiPlugin.FOLDER_CATEGORY, 0),
new Pair(WikiPlugin.PAGE_CATEGORY, 1),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 2),
new Pair(WikiPlugin.HEADING_LEVEL_1_CATEGORY, 2),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 3),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 3),
new Pair(WikiPlugin.HEADING_LEVEL_1_CATEGORY, 2),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 3),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 3),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 3),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 3),
new Pair(WikiPlugin.HEADING_LEVEL_2_CATEGORY, 3),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 4),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 4),
new Pair(WikiPlugin.FLOWER_BLOCK_CATEGORY, 4),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 4),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 4),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 4),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 4),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 4),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 4),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 4),
new Pair(WikiPlugin.HEADING_LEVEL_2_CATEGORY, 3),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 4),
new Pair(WikiPlugin.HEADING_LEVEL_1_CATEGORY, 2),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 3),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 3),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 3)
};
test(leftRoot, rightRoot, resourceSet, technology, expected);
// left modifications
page = new DokuWikiPage(pageName, left);
leftRoot = wikiPlugin.getWikiTree(null, resourceSet, Arrays.asList(page), "", technology);
// right modifications
CodeSyncElement newRightPage = CodeSyncPackage.eINSTANCE.getCodeSyncFactory().createCodeSyncElement();
newRightPage.setName("page");
newRightPage.setType(WikiPlugin.PAGE_CATEGORY);
Page wikiPage = AstCacheWikiFactory.eINSTANCE.createPage();
wikiPage.setInitialContent(ancestor);
wikiPage.setLineDelimiter("\r\n");
newRightPage.setAstCacheElement(wikiPage);
WikiPlugin.getInstance().replaceWikiPage(rightRoot, newRightPage);
WikiPlugin.getInstance().addToAstCacheResource(rightRoot, WikiPlugin.getInstance().getAstCacheResource(project, resourceSet));
wikiPlugin.getWikiPageTree(right, newRightPage, technology, null);
CodeSyncPlugin.getInstance().saveResource(rightRoot.eResource());
test(leftRoot, rightRoot, resourceSet, technology, null);
assertEquals(wikiPlugin.getWikiText(newRightPage, technology), dummyConfigProvider.page.getInitialContent());
}
@Test
public void testMarkdown() throws IOException {
WikiPlugin wikiPlugin = WikiPlugin.getInstance();
String technology = GithubConfigurationProvider.TECHNOLOGY;
wikiPlugin.getConfigurationProviders().put(technology, new GithubConfigurationProvider());
File ancestor = MD_FILE;
File left = MD_FILE_2;
File right = MD_FILE_3;
File project = getProject();
ResourceSet resourceSet = CodeSyncPlugin.getInstance().getOrCreateResourceSet(project, "mindmapEditorStatefulService");
CodeSyncRoot leftRoot = wikiPlugin.getWikiTree(null, resourceSet, ancestor, ancestor.getPath(), technology);
CodeSyncRoot rightRoot = wikiPlugin.getWikiTree(project, resourceSet, null, ancestor.getPath(), technology);
rightRoot.setName(ancestor.getPath());
expected = new Pair[] {
new Pair(WikiPlugin.FOLDER_CATEGORY, 0),
new Pair(WikiPlugin.PAGE_CATEGORY, 1),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 2),
new Pair(WikiPlugin.HEADING_LEVEL_1_CATEGORY, 2),
new Pair(WikiPlugin.HEADING_LEVEL_4_CATEGORY, 3),
new Pair(WikiPlugin.HEADING_LEVEL_2_CATEGORY, 3),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 4),
new Pair(WikiPlugin.FLOWER_BLOCK_CATEGORY, 4),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 4),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 4),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 4),
new Pair(WikiPlugin.PARAGRAPH_CATEGORY, 4)
};
test(leftRoot, rightRoot, resourceSet, technology, expected);
// left modifications
leftRoot = wikiPlugin.getWikiTree(null, resourceSet, left, ancestor.getPath(), technology);
// right modifications
CodeSyncElement newRightPage = CodeSyncFactory.eINSTANCE.createCodeSyncElement();
newRightPage.setName(ancestor.getName());
newRightPage.setType(WikiPlugin.PAGE_CATEGORY);
Page wikiPage = AstCacheWikiFactory.eINSTANCE.createPage();
wikiPage.setInitialContent(FileUtils.readFileToString(ancestor));
wikiPage.setLineDelimiter(wikiPlugin.getLineDelimiter(FileUtils.readFileToString(ancestor)));
newRightPage.setAstCacheElement(wikiPage);
wikiPlugin.replaceWikiPage(rightRoot, newRightPage);
wikiPlugin.addToAstCacheResource(rightRoot, wikiPlugin.getAstCacheResource(project, resourceSet));
wikiPlugin.getWikiPageTree(FileUtils.readFileToString(right), newRightPage, technology, null);
CodeSyncPlugin.getInstance().saveResource(rightRoot.eResource());
test(leftRoot, rightRoot, resourceSet, technology, null);
String newContent = FileUtils.readFileToString(MD_FILE_2);
assertEquals(wikiPlugin.getWikiText(newRightPage, technology), newContent);
}
private File getProject() {
return CodeSyncTestSuite.getProject(PROJECT);
}
private void test(CodeSyncRoot leftRoot, CodeSyncRoot rightRoot, ResourceSet resourceSet, String technology, Pair[] expected) {
File project = getProject();
WikiPlugin wikiPlugin = WikiPlugin.getInstance();
wikiPlugin.updateTree(leftRoot, rightRoot, project, resourceSet, technology, communicationChannel, true);
CodeSyncEditorStatefulService service = (CodeSyncEditorStatefulService) CommunicationPlugin.getInstance().getServiceRegistry().getService(CodeSyncEditorStatefulService.SERVICE_ID);
CodeSyncEditableResource editableResource = (CodeSyncEditableResource) service.subscribeClientForcefully(communicationChannel, EditorPlugin.getInstance().getFileAccessController().getPath(project));
assertNotNull(editableResource);
service.synchronize(new StatefulServiceInvocationContext(communicationChannel), EditorPlugin.getInstance().getFileAccessController().getPath(project));
service.applySelectedActions(new StatefulServiceInvocationContext(communicationChannel), EditorPlugin.getInstance().getFileAccessController().getPath(project), true);
if (expected != null) {
testWikiTree(rightRoot, 0);
assertEquals(expected.length, index);
}
}
private void testWikiTree(CodeSyncElement node, int level) {
assertEquals("At index " + index, expected[index].type, node.getType());
assertEquals("At index " + index, expected[index].level, level);
index++;
for (Iterator it = WikiPlugin.getInstance().getChildrenIterator(node); it.hasNext();) {
CodeSyncElement child = (CodeSyncElement) it.next();
testWikiTree(child, level + 1);
}
}
class Pair {
public String type;
public int level;
public Pair(String type, int level) {
this.type = type;
this.level = level;
}
}
}