/***************************************************************************
* Copyright (C) 2003-2009 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/liceenses/>.
*
**************************************************************************/
package org.exoplatform.services.ecm.dms.i18n;
import java.io.IOException;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.jcr.Node;
import javax.jcr.Value;
import org.exoplatform.services.cms.CmsService;
import org.exoplatform.services.cms.JcrInputProperty;
import org.exoplatform.services.cms.i18n.MultiLanguageService;
import org.exoplatform.services.exceptions.SameAsDefaultLangException;
import org.exoplatform.services.wcm.BaseWCMTestCase;
/**
* Created by The eXo Platform SARL
* Author : Hoang Van Hung
* hunghvit@gmail.com
* Jun 17, 2009
*/
public class TestMultiLanguageService extends BaseWCMTestCase {
private static final String I18NMixin = "mix:i18n";
private static final String VOTEABLE = "mix:votable";
private static final String ARTICLE = "exo:article";
private static final String FILE = "nt:file";
private static final String RESOURCE = "nt:resource";
private static final String TITLE = "exo:title";
private static final String SUMMARY = "exo:summary";
private static final String TEXT = "exo:text";
private static final String CONTENT = "jcr:content";
private static final String MIMETYPE = "jcr:mimeType";
private static final String LASTMODIFIED = "jcr:lastModified";
private static final String DATA = "jcr:data";
private static final String LINK = "exo:link";
private static final String TEMPLATE = "exo:template";
private static final String NTFOLDER = "nt:folder";
private MultiLanguageService multiLanguageService;
public void setUp() throws Exception {
super.setUp();
multiLanguageService = (MultiLanguageService) container.getComponentInstanceOfType(MultiLanguageService.class);
applyUserSession("john", "gtn", COLLABORATION_WS);
}
/**
* Test method MultiLanguagetService.getSupportedLanguages()
* Input: Add mixin type mix:i18n, add vi language for node
* Expect: Node has two language: vi and English
* @throws Exception
*/
public void testGetSupportedLanguages() throws Exception {
Node test = session.getRootNode().addNode("test", ARTICLE);
test.addMixin(I18NMixin);
test.setProperty(TITLE, "sport");
test.setProperty(SUMMARY, "report of season");
test.setProperty(TEXT, "sport is exciting");
session.save();
multiLanguageService.addLanguage(test, createMapInput1(), "vi", false);
List<String> lstLanguages = multiLanguageService.getSupportedLanguages(test);
assertTrue(lstLanguages.contains("en"));
assertTrue(lstLanguages.contains("vi"));
}
/**
* Create data for Node
*/
private Map<String, JcrInputProperty> createMapInput1() {
Map<String, JcrInputProperty> map = new HashMap<String, JcrInputProperty>();
String titlePath = CmsService.NODE + "/" + TITLE;
String summaryPath = CmsService.NODE + "/" + SUMMARY;
String textPath = CmsService.NODE + "/" + TEXT;
JcrInputProperty inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(CmsService.NODE);
inputProperty.setValue("test");
map.put(CmsService.NODE, inputProperty);
inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(titlePath);
inputProperty.setValue("this is title");
map.put(titlePath, inputProperty);
inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(summaryPath);
inputProperty.setValue("this is summary");
map.put(summaryPath, inputProperty);
inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(textPath);
inputProperty.setValue("this is article content");
map.put(textPath, inputProperty);
return map;
}
/**
* Create data for Node
*/
private Map<String, JcrInputProperty> createMapInput2() {
Map<String, JcrInputProperty> map = new HashMap<String, JcrInputProperty>();
String titlePath = CmsService.NODE + "/" + TITLE;
String summaryPath = CmsService.NODE + "/" + SUMMARY;
String textPath = CmsService.NODE + "/" + TEXT;
JcrInputProperty inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(CmsService.NODE);
inputProperty.setValue("test");
map.put(CmsService.NODE, inputProperty);
inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(titlePath);
inputProperty.setValue("football");
map.put(titlePath, inputProperty);
inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(summaryPath);
inputProperty.setValue("report of season");
map.put(summaryPath, inputProperty);
inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(textPath);
inputProperty.setValue(null);
map.put(textPath, inputProperty);
return map;
}
/**
* Create binary data for node
* @throws IOException
*/
private Map<String, JcrInputProperty> createFileInput() throws IOException {
Map<String, JcrInputProperty> map = new HashMap<String, JcrInputProperty>();
String data = CmsService.NODE + "/" + CONTENT + "/" + DATA;
String mimeType = CmsService.NODE + "/" + CONTENT + "/" + MIMETYPE;
JcrInputProperty inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(data);
inputProperty.setValue("test");
map.put(data, inputProperty);
inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(mimeType);
inputProperty.setValue("text/xml");
map.put(mimeType, inputProperty);
return map;
}
/**
* Create podcast node
* @return
* @throws IOException
*/
private Map<String, JcrInputProperty> createPodcastMapInput() throws IOException {
Map<String, JcrInputProperty> map = new HashMap<String, JcrInputProperty>();
String titlePath = CmsService.NODE + "/" + TITLE;
String linkPath = CmsService.NODE + "/" + LINK;
String data = CmsService.NODE + "/" + CONTENT + "/" + DATA;
String mimeType = CmsService.NODE + "/" + CONTENT + "/" + MIMETYPE;
String lastModified = CmsService.NODE + "/" + CONTENT + "/" + LASTMODIFIED;
JcrInputProperty inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(titlePath);
inputProperty.setValue("this is podcast");
map.put(titlePath, inputProperty);
inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(linkPath);
inputProperty.setValue("connect");
map.put(linkPath, inputProperty);
inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(data);
inputProperty.setValue("test");
map.put(data, inputProperty);
inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(mimeType);
inputProperty.setValue("text/xml");
map.put(mimeType, inputProperty);
inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(lastModified);
inputProperty.setValue(new GregorianCalendar());
map.put(lastModified, inputProperty);
return map;
}
/**
* Test method MultiLanguagetService.addLanguage(Node node, Map inputs, String language, boolean isDefault, String nodeType)
* Input: add mix:i18n, exo:title = sport, exo:summary = report of season, exo:text: sport is exciting
* add language = fr with default = false for test node;
* Expect: test node have these above property. test node has node language fr. Node language fr has properties:
* exo:title = this is title; exo:summary = this is summary; exo:text: this is article content;
* @throws Exception
*/
public void testAddLanguage1() throws Exception {
Node test = session.getRootNode().addNode("test", ARTICLE);
test.addMixin(I18NMixin);
test.setProperty(TITLE, "sport");
test.setProperty(SUMMARY, "report of season");
test.setProperty(TEXT, "sport is exciting");
session.save();
multiLanguageService.addLanguage(test, createMapInput1(), "fr", false);
assertTrue(test.hasNode("languages/fr"));
Node testlanguage = test.getNode("languages/fr");
assertEquals("this is title", testlanguage.getProperty(TITLE).getString());
assertEquals("this is summary", testlanguage.getProperty(SUMMARY).getString());
assertEquals("this is article content", testlanguage.getProperty(TEXT).getString());
assertEquals("sport", test.getProperty(TITLE).getString());
assertEquals("report of season", test.getProperty(SUMMARY).getString());
assertEquals("sport is exciting", test.getProperty(TEXT).getString());
}
/**
* Test method MultiLanguagetService.addLanguage(Node node, Map inputs, String language, boolean isDefault)
* Input: add mix:i18n, exo:title = "sport", exo:summary = "supporter", exo:text: "sport is exciting"
* add language = fr with default = false for test node;
* Expect: test node have these above property. test node has node language fr. Node language fr has properties:
* exo:title = "this is title"; exo:summary = "this is summary"; exo:text: "this is article content";
* if add language = fr with default = true then node test has language = fr, with properties created in method createMapInput2
* @throws Exception
*/
public void testAddLanguage2() throws Exception {
Node test = session.getRootNode().addNode("test", ARTICLE);
test.addMixin(I18NMixin);
test.setProperty(TITLE, "sport");
test.setProperty(SUMMARY, "supporter");
test.setProperty(TEXT, "sport is exciting");
session.save();
multiLanguageService.addLanguage(test, createMapInput1(), "fr", false);
assertTrue(test.hasNode("languages/fr"));
Node testlanguage = test.getNode("languages/fr");
assertEquals("this is title", testlanguage.getProperty(TITLE).getString());
assertEquals("this is summary", testlanguage.getProperty(SUMMARY).getString());
assertEquals("this is article content", testlanguage.getProperty(TEXT).getString());
assertEquals("sport", test.getProperty(TITLE).getString());
assertEquals("supporter", test.getProperty(SUMMARY).getString());
assertEquals("sport is exciting", test.getProperty(TEXT).getString());
multiLanguageService.addLanguage(test, createMapInput2(), "fr", true);
assertEquals("fr", test.getProperty(MultiLanguageService.EXO_LANGUAGE).getString());
assertFalse(test.hasNode("languages/fr"));
assertEquals("football", test.getProperty(TITLE).getString());
assertEquals("report of season", test.getProperty(SUMMARY).getString());
assertEquals("", test.getProperty(TEXT).getString());
}
/**
* Test method MultiLanguagetService.addLanguage(Node node, Map inputs, String language, boolean isDefault)
* Input: Add language fr for node test with child node is a nt:file node type
* Expect: if language fr is added as not default language then language node is add following relative path = languages/fr
* if language fr is added as default language then content of test node contains data defined in method createFileInput()
* @throws Exception
*/
public void testAddLanguage3() throws Exception {
Node test = session.getRootNode().addNode("test", FILE);
Node testFile = test.addNode(CONTENT, RESOURCE);
testFile.setProperty(DATA, "test");
testFile.setProperty(MIMETYPE, "text/xml");
testFile.setProperty(LASTMODIFIED, new GregorianCalendar());
test.addMixin(I18NMixin);
session.save();
multiLanguageService.addLanguage(test, createFileInput(), "fr", false, CONTENT);
String defaultLanguage = test.getProperty(MultiLanguageService.EXO_LANGUAGE).getString();
assertEquals("en", defaultLanguage);
assertTrue(test.hasNode("languages/fr"));
Node testlanguage = test.getNode("languages/fr");
assertTrue(testlanguage.hasNode(CONTENT));
assertEquals("test", testlanguage.getNode(CONTENT).getProperty(DATA).getString());
multiLanguageService.addLanguage(test, createFileInput(), "vi", true, CONTENT);
defaultLanguage = test.getProperty(MultiLanguageService.EXO_LANGUAGE).getString();
assertEquals("vi", defaultLanguage);
assertTrue(test.hasNode(CONTENT));
assertEquals("test", test.getNode(CONTENT).getProperty(DATA).getString());
Map<String, JcrInputProperty> map = new HashMap<String, JcrInputProperty>();
String data = CmsService.NODE + "/" + CONTENT + "/" + DATA;
JcrInputProperty inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(data);
inputProperty.setValue(null);
map.put(data, inputProperty);
multiLanguageService.addLanguage(test, map, "ar", false, CONTENT);
testlanguage = test.getNode("languages/ar");
assertEquals("", testlanguage.getNode(CONTENT).getProperty(DATA).getString());
inputProperty.setJcrPath(data);
inputProperty.setValue(new byte[1]);
map.put(data, inputProperty);
multiLanguageService.addLanguage(test, map, "br", false, CONTENT);
testlanguage = test.getNode("languages/br");
assertNotNull(testlanguage.getNode(CONTENT).getProperty(DATA).getStream());
inputProperty.setJcrPath(data);
String[] stringData = { "data" };
inputProperty.setValue(stringData);
map.put(data, inputProperty);
multiLanguageService.addLanguage(test, map, "tn", false, CONTENT);
testlanguage = test.getNode("languages/tn");
assertNotNull(testlanguage.getNode(CONTENT).getProperty(DATA).getStream());
}
/**
* Test method MultiLanguagetService.addLanguage(Node node, Map inputs, String language, boolean isDefault) in case inputs map contain a multiple value property
* Input: Add language fr for node test with primary type is exo:templates
* Expect: if language fr is added as not default language then language node is add following relative path = languages/fr
* @throws Exception
*/
public void testAddLanguage4() throws Exception {
Node test = session.getRootNode().addNode("test", TEMPLATE);
test.setProperty("exo:templateFile", "test");
String[] roles = { "*" };
test.setProperty("exo:roles", roles);
test.addMixin(I18NMixin);
session.save();
Map<String, JcrInputProperty> map = new HashMap<String, JcrInputProperty>();
String rolePath = CmsService.NODE + "/" + "exo:roles";
String templateFilePath = CmsService.NODE + "/" + "exo:templateFile";
JcrInputProperty inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(rolePath);
inputProperty.setValue(roles);
map.put(rolePath, inputProperty);
inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(templateFilePath);
inputProperty.setValue("test");
map.put(templateFilePath, inputProperty);
multiLanguageService.addLanguage(test, map, "fr", false);
String defaultLanguage = test.getProperty(MultiLanguageService.EXO_LANGUAGE).getString();
assertEquals("en", defaultLanguage);
assertTrue(test.hasNode("languages/fr"));
Node testlanguage = test.getNode("languages/fr");
assertEquals("*", testlanguage.getProperty("exo:roles").getValues()[0].getString());
}
/**
* Test method MultiLanguagetService.setDefault()
* Input: Add language = fr as default language, then set fr as default language
* Expect: language default of node test is language. Properties of test node are properties defined in creatMapInput1() method
* @throws Exception
*/
public void testSetDefault() throws Exception {
Node test = session.getRootNode().addNode("test", ARTICLE);
test.addMixin(I18NMixin);
test.setProperty(TITLE, "sport");
test.setProperty(TEXT, "sport is exciting");
session.save();
multiLanguageService.addLanguage(test, createMapInput1(), "fr", false);
assertTrue(test.hasNode("languages/fr"));
Node testlanguage = test.getNode("languages/fr");
testlanguage.addNode(CONTENT);
assertEquals("this is title", testlanguage.getProperty(TITLE).getString());
assertEquals("this is summary", testlanguage.getProperty(SUMMARY).getString());
assertEquals("this is article content", testlanguage.getProperty(TEXT).getString());
multiLanguageService.setDefault(test, "fr", REPO_NAME);
String defaultLanguage = test.getProperty(MultiLanguageService.EXO_LANGUAGE).getString();
assertEquals("fr", defaultLanguage);
assertFalse(test.hasNode("languages/fr"));
}
public void testSetDefault2() throws Exception {
Node test = session.getRootNode().addNode("test", FILE);
Node testFile = test.addNode(CONTENT, RESOURCE);
testFile.setProperty(DATA, "test");
testFile.setProperty(MIMETYPE, "text/xml");
testFile.setProperty(LASTMODIFIED, new GregorianCalendar());
test.addMixin(I18NMixin);
test.addMixin(VOTEABLE);
session.save();
multiLanguageService.addLanguage(test, createFileInput(), "fr", false, CONTENT);
assertTrue(test.hasNode("languages/fr"));
multiLanguageService.setDefault(test, "fr", REPO_NAME);
String defaultLanguage = test.getProperty(MultiLanguageService.EXO_LANGUAGE).getString();
assertEquals("fr", defaultLanguage);
assertFalse(test.hasNode("languages/fr"));
}
public void testSetDefault3() throws Exception {
Node test = session.getRootNode().addNode("test", FILE);
Node testFile = test.addNode(CONTENT, RESOURCE);
testFile.setProperty(DATA, getClass().getResourceAsStream("/conf/dms/artifacts/images/ThumnailView.jpg"));
testFile.setProperty(MIMETYPE, "image/jpg");
testFile.setProperty(LASTMODIFIED, new GregorianCalendar());
test.addMixin(I18NMixin);
test.addMixin(VOTEABLE);
session.save();
Map<String, JcrInputProperty> map = new HashMap<String, JcrInputProperty>();
String data = CmsService.NODE + "/" + CONTENT + "/" + DATA;
String mimeType = CmsService.NODE + "/" + CONTENT + "/" + MIMETYPE;
JcrInputProperty inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(data);
inputProperty.setValue(getClass().getResourceAsStream("/conf/dms/artifacts/images/ThumnailView.jpg"));
map.put(data, inputProperty);
inputProperty = new JcrInputProperty();
inputProperty.setJcrPath(mimeType);
inputProperty.setValue("image/jpg");
map.put(mimeType, inputProperty);
multiLanguageService.addLanguage(test, map, "fr", false, CONTENT);
assertTrue(test.hasNode("languages/fr"));
multiLanguageService.setDefault(test, "fr", REPO_NAME);
String defaultLanguage = test.getProperty(MultiLanguageService.EXO_LANGUAGE).getString();
assertEquals("fr", defaultLanguage);
assertFalse(test.hasNode("languages/fr"));
}
/**
* Test method MultiLanguagetService.getDefault()
* Input: add mix:i18n for node test, then add language fr for test node, then set language of node is fr
* Expect: language default of node is fr
* @throws Exception
*/
public void testGetDefault() throws Exception {
Node test = session.getRootNode().addNode("test", ARTICLE);
test.setProperty(TITLE, "Document");
test.addMixin(I18NMixin);
session.save();
String defaultLanguage = multiLanguageService.getDefault(test);
assertEquals("en", defaultLanguage);
multiLanguageService.addLanguage(test, createMapInput1(), "fr", false);
multiLanguageService.setDefault(test, "fr", REPO_NAME);
assertEquals("fr", multiLanguageService.getDefault(test));
}
/**
* Test method MultiLanguagetService.addFileLanguage(Node node, String fileName, Value value, String mimeType, String language, String repositoryName, boolean isDefault)
* Input: add child node nt:file ("/conf/standalone/system-configuration.xml") to node
* language fr for node with child node nt:file ("/conf/standalone/system-configuration.xml")
* language vi for node with child node nt:file ("/conf/standalone/system-configuration.xml") as default language
* Expect: data of child node nt:file of test node is ("/conf/standalone/system-configuration.xml")
* data of child node nt:file of node in path: /test/languages/English/test/jcr:content is
* ("/conf/standalone/system-configuration.xml")
*
* @throws Exception
*/
public void testAddFileLanguage1() throws Exception {
Node test = session.getRootNode().addNode("test", FILE);
Node testFile = test.addNode(CONTENT, RESOURCE);
testFile.setProperty(DATA, "test");
testFile.setProperty(MIMETYPE, "text/xml");
testFile.setProperty(LASTMODIFIED, new GregorianCalendar());
test.addMixin(I18NMixin);
test.addMixin(VOTEABLE);
session.save();
Value contentValue = session.getValueFactory().createValue("test");
multiLanguageService.addFileLanguage(test, "system-configuration.xml" , contentValue, "text/xml", "fr", REPO_NAME, false);
String defaultLanguage = test.getProperty(MultiLanguageService.EXO_LANGUAGE).getString();
assertEquals("en", defaultLanguage);
Value contentValue1 = session.getValueFactory().createValue("test");
multiLanguageService.addFileLanguage(test, "test-configuration.xml" , contentValue1, "text/xml", "vi", REPO_NAME, true);
defaultLanguage = test.getProperty(MultiLanguageService.EXO_LANGUAGE).getString();
assertEquals("vi", defaultLanguage);
}
/**
* Get language node by language MultiLanguageService.getLanguage()
* Input language fr is not default language and default language
* Expect: if fr is not default language then method return fr node, else return null
* @throws Exception
*/
public void testGetLanguage() throws Exception {
Node test = session.getRootNode().addNode("test", FILE);
Node testFile = test.addNode(CONTENT, RESOURCE);
testFile.setProperty(MIMETYPE, "text/xml");
testFile.setProperty(LASTMODIFIED, new GregorianCalendar());
testFile.setProperty(DATA, "test");
test.addMixin(I18NMixin);
session.save();
multiLanguageService.addFileLanguage(test, "fr" , createFileInput(), false);
assertTrue(test.hasNode("languages/fr"));
Node node = multiLanguageService.getLanguage(test, "fr");
assertTrue(node.hasNode(CONTENT));
assertEquals("test", node.getNode(CONTENT).getProperty(DATA).getString());
multiLanguageService.addFileLanguage(test, "pt" , createFileInput(), false);
assertTrue(test.hasNode("languages/pt"));
node = multiLanguageService.getLanguage(test, "pt_br");
assertTrue(node.hasNode(CONTENT));
assertEquals("test", node.getNode(CONTENT).getProperty(DATA).getString());
}
/** Add synchronized linked language node to another node MultiLanguageService.addSynchronizedLinkedLanguage()
* Input create a node then link a French translation node to it, then try to link a English(default language) translation node to it
* Expect: linking successfully if the source node has different language from the default one of target node and vice versa
* @throws Exception
*/
public void testAddSynchronizedLinkedLanguage() throws Exception{
Node test = session.getRootNode().addNode("article1", ARTICLE);
test.addMixin(I18NMixin);
test.setProperty(TITLE, "sport");
test.setProperty(SUMMARY, "report of season");
test.setProperty(TEXT, "sport is exciting");
Node test2 = session.getRootNode().addNode("article2", ARTICLE);
test2.addMixin(I18NMixin);
test2.setProperty(TITLE, "sport");
test2.setProperty(SUMMARY, "french version");
test2.setProperty(TEXT, "le sport est passionnant");
test2.setProperty(MultiLanguageService.EXO_LANGUAGE, "fr");
session.save();
multiLanguageService.addSynchronizedLinkedLanguage(test, test2);
List<String> lstLanguages = multiLanguageService.getSupportedLanguages(test);
assertTrue(lstLanguages.contains("en"));
assertTrue(lstLanguages.contains("fr"));
Node test3 = session.getRootNode().addNode("article3", ARTICLE);
test3.addMixin(I18NMixin);
test3.setProperty(TITLE, "sport");
test3.setProperty(SUMMARY, "english version");
test3.setProperty(TEXT, "sport is exciting");
session.save();
try {
multiLanguageService.addSynchronizedLinkedLanguage(test, test3);
fail();
} catch (SameAsDefaultLangException ex) {
assertTrue(true);
}
}
/**
* Test addLinkedLanguage the case that force to replace existing language symlink.
*
* @throws Exception
*/
public void testAddLinkedLanguage() throws Exception {
Node test = session.getRootNode().addNode("test");
Node article1 = test.addNode("article1", ARTICLE);
article1.addMixin(I18NMixin);
article1.setProperty(TITLE, "sport");
article1.setProperty(SUMMARY, "report of season");
article1.setProperty(TEXT, "sport is exciting");
Node article2 = test.addNode("article2", ARTICLE);
article2.addMixin(I18NMixin);
article2.setProperty(TITLE, "sport");
article2.setProperty(SUMMARY, "french version");
article2.setProperty(TEXT, "le sport est passionnant");
article2.setProperty(MultiLanguageService.EXO_LANGUAGE, "fr");
session.save();
multiLanguageService.addLinkedLanguage(article1, article2);
List<String> lstLanguages = multiLanguageService.getSupportedLanguages(article1);
assertTrue(lstLanguages.contains("en"));
assertTrue(lstLanguages.contains("fr"));
Node frNode = multiLanguageService.getLanguage(article1, "fr");
assertTrue(frNode.getName().equals("article2"));
Node article3 = test.addNode("article3", ARTICLE);
article3.addMixin(I18NMixin);
article3.setProperty(TITLE, "sport");
article3.setProperty(SUMMARY, "french version");
article3.setProperty(TEXT, "le sport est passionnant");
article3.setProperty(MultiLanguageService.EXO_LANGUAGE, "fr");
session.save();
multiLanguageService.addLinkedLanguage(article1, article3, true);
lstLanguages = multiLanguageService.getSupportedLanguages(article1);
assertTrue(lstLanguages.contains("en"));
assertTrue(lstLanguages.contains("fr"));
frNode = multiLanguageService.getLanguage(article1, "fr");
assertTrue(frNode.getName().equals("article3"));
}
/**
* Clean data test
*/
public void tearDown() throws Exception {
if (session.itemExists("/test")) {
Node test = session.getRootNode().getNode("test");
test.remove();
session.save();
}
super.tearDown();
}
}