/*
* Copyright (C) 2011 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.portal.mop.importer;
import static org.exoplatform.portal.mop.importer.Builder.fragment;
import static org.exoplatform.portal.mop.importer.Builder.node;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
import org.exoplatform.portal.config.model.I18NString;
import org.exoplatform.portal.config.model.LocalizedString;
import org.exoplatform.portal.config.model.NavigationFragment;
import org.exoplatform.portal.config.model.PageNavigation;
import org.exoplatform.portal.mop.Described;
import org.exoplatform.portal.mop.SiteKey;
import org.exoplatform.portal.mop.navigation.AbstractTestNavigationService;
import org.exoplatform.portal.mop.navigation.NavigationContext;
import org.exoplatform.portal.mop.navigation.Node;
import org.exoplatform.portal.mop.navigation.NodeContext;
import org.exoplatform.portal.mop.navigation.NodeModel;
import org.exoplatform.portal.mop.navigation.Scope;
import org.gatein.common.util.Tools;
import org.gatein.mop.api.workspace.ObjectType;
import org.gatein.mop.core.api.MOPService;
/**
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
*/
public class TestNavigationImporter extends AbstractTestNavigationService {
public void testInsertCreateNavigation() {
testCreate(ImportMode.INSERT);
}
public void testConserveCreateNavigation() {
testCreate(ImportMode.CONSERVE);
}
public void testOverwriteCreateNavigation() {
testCreate(ImportMode.OVERWRITE);
}
private void testCreate(ImportMode mode) {
String name = mode.name() + "_create";
//
MOPService mop = mgr.getPOMService();
mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, name);
sync(true);
//
assertNull(service.loadNavigation(SiteKey.portal(name)));
PageNavigation src = new PageNavigation("portal", name);
src.setPriority(2);
NavigationImporter importer = new NavigationImporter(Locale.ENGLISH, mode, src, service, descriptionService);
importer.perform();
//
NavigationContext ctx = service.loadNavigation(SiteKey.portal(name));
assertEquals(2, (int) ctx.getState().getPriority());
}
public void testMergePriority() {
String name = "merge_priority";
//
MOPService mop = mgr.getPOMService();
mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, name);
sync(true);
//
assertNull(service.loadNavigation(SiteKey.portal(name)));
PageNavigation src = new PageNavigation("portal", name);
src.setPriority(1);
NavigationImporter importer = new NavigationImporter(Locale.ENGLISH, ImportMode.MERGE, src, service, descriptionService);
importer.perform();
//
NavigationContext ctx = service.loadNavigation(SiteKey.portal(name));
assertEquals(1, (int) ctx.getState().getPriority());
//
src.setPriority(2);
importer = new NavigationImporter(Locale.ENGLISH, ImportMode.MERGE, src, service, descriptionService);
importer.perform();
//
ctx = service.loadNavigation(SiteKey.portal(name));
assertEquals(2, (int) ctx.getState().getPriority());
}
public void testInsertNavigation() {
MOPService mop = mgr.getPOMService();
mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "insert_navigation");
sync(true);
//
assertNull(service.loadNavigation(SiteKey.portal("insert_navigation")));
//
FragmentBuilder builder = fragment().add(node("a"));
//
PageNavigation src = new PageNavigation("portal", "insert_navigation").addFragment(builder.build());
NavigationImporter importer = new NavigationImporter(Locale.ENGLISH, ImportMode.INSERT, src, service,
descriptionService);
importer.perform();
//
NavigationContext ctx = service.loadNavigation(SiteKey.portal("insert_navigation"));
NodeContext<?> node = service.loadNode(NodeModel.SELF_MODEL, ctx, Scope.ALL, null).getNode();
NodeContext<?> a = node.get("a");
assertNotNull(a);
assertEquals("a", a.getName());
assertEquals("a", a.getState().getLabel());
assertEquals(0, a.getNodeCount());
}
public void testInsertFragment() {
MOPService mop = mgr.getPOMService();
mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "insert_fragment");
sync(true);
//
assertNull(service.loadNavigation(SiteKey.portal("insert_fragment")));
//
FragmentBuilder builder = fragment().add(node("a").add(node("b")));
//
PageNavigation src = new PageNavigation("portal", "insert_fragment").addFragment(builder.build());
NavigationImporter importer = new NavigationImporter(Locale.ENGLISH, ImportMode.INSERT, src, service,
descriptionService);
importer.perform();
//
NavigationContext ctx = service.loadNavigation(SiteKey.portal("insert_fragment"));
NodeContext<?> node = service.loadNode(NodeModel.SELF_MODEL, ctx, Scope.ALL, null).getNode();
NodeContext<?> a = node.get("a");
assertNotNull(a);
assertEquals("a", a.getName());
assertEquals("a", a.getState().getLabel());
assertEquals(1, a.getNodeCount());
}
public void testCreateMerge() {
testMerge(ImportMode.CONSERVE);
}
public void testInsertMerge() {
testMerge(ImportMode.INSERT);
}
public void testOverwriteMerge() {
testMerge(ImportMode.OVERWRITE);
}
private void testMerge(ImportMode importMode) {
String name = importMode.name() + "_merge";
//
MOPService mop = mgr.getPOMService();
mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, name);
sync(true);
//
assertNull(service.loadNavigation(SiteKey.portal(name)));
//
FragmentBuilder builder = fragment().add(node("a").add(node("b")));
//
PageNavigation src = new PageNavigation("portal", name).addFragment(builder.build());
NavigationImporter importer = new NavigationImporter(Locale.ENGLISH, ImportMode.CONSERVE, src, service,
descriptionService);
importer.perform();
//
NavigationContext ctx = service.loadNavigation(SiteKey.portal(name));
Node node = service.loadNode(Node.MODEL, ctx, Scope.ALL, null).getNode();
Node a = node.getChild("a");
assertNotNull(a);
assertEquals("a", a.getName());
assertEquals(1, a.getNodeCount());
Node b = a.getChild("b");
assertNotNull(b);
assertEquals("b", b.getName());
assertEquals(0, b.getNodeCount());
//
builder = fragment().add(node("a").add(node("d"))).add(node("c"));
src = new PageNavigation("portal", name).addFragment(builder.build());
importer = new NavigationImporter(Locale.ENGLISH, importMode, src, service, descriptionService);
importer.perform();
//
ctx = service.loadNavigation(SiteKey.portal(name));
node = service.loadNode(Node.MODEL, ctx, Scope.ALL, null).getNode();
switch (importMode) {
case INSERT: {
assertEquals(2, node.getNodeCount());
a = node.getChild("a");
assertNotNull(a);
assertEquals("a", a.getState().getLabel());
assertEquals(2, a.getNodeCount());
b = a.getChild("b");
assertNotNull(b);
assertEquals("b", b.getState().getLabel());
assertEquals(0, b.getNodeCount());
Node c = node.getChild("c");
assertNotNull(c);
assertEquals("c", c.getState().getLabel());
assertEquals(0, c.getNodeCount());
Node d = a.getChild("d");
assertNotNull(d);
assertEquals("d", d.getName());
assertEquals(0, d.getNodeCount());
break;
}
case CONSERVE: {
assertEquals(1, node.getNodeCount());
a = node.getChild("a");
assertNotNull(a);
assertEquals(1, a.getNodeCount());
assertNotNull(b);
assertEquals("b", b.getState().getLabel());
assertEquals(0, b.getNodeCount());
break;
}
case OVERWRITE: {
assertEquals(2, node.getNodeCount());
a = node.getChild("a");
assertNotNull(a);
assertEquals("a", a.getState().getLabel());
assertEquals(1, a.getNodeCount());
Node c = node.getChild("c");
assertNotNull(c);
assertEquals("c", c.getState().getLabel());
assertEquals(0, c.getNodeCount());
Node d = a.getChild("d");
assertNotNull(d);
assertEquals("d", d.getName());
assertEquals(0, d.getNodeCount());
break;
}
}
}
public void testOrder() {
MOPService mop = mgr.getPOMService();
mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "order");
sync(true);
//
assertNull(service.loadNavigation(SiteKey.portal("order")));
//
PageNavigation src = new PageNavigation("portal", "order").addFragment(fragment().add(node("a"), node("b"), node("c"))
.build());
NavigationImporter importer = new NavigationImporter(Locale.ENGLISH, ImportMode.INSERT, src, service,
descriptionService);
importer.perform();
//
NavigationContext ctx = service.loadNavigation(SiteKey.portal("order"));
NodeContext<?> node = service.loadNode(NodeModel.SELF_MODEL, ctx, Scope.ALL, null).getNode();
assertEquals(3, node.getNodeCount());
assertEquals("a", node.get(0).getName());
assertEquals("b", node.get(1).getName());
assertEquals("c", node.get(2).getName());
//
src.getFragment().getNodes().add(0, node("d").build());
importer = new NavigationImporter(Locale.ENGLISH, ImportMode.INSERT, src, service, descriptionService);
importer.perform();
//
node = service.loadNode(NodeModel.SELF_MODEL, ctx, Scope.ALL, null).getNode();
assertEquals(4, node.getNodeCount());
assertEquals("d", node.get(0).getName());
assertEquals("a", node.get(1).getName());
assertEquals("b", node.get(2).getName());
assertEquals("c", node.get(3).getName());
//
src.getFragment().getNodes().add(node("e").build());
importer = new NavigationImporter(Locale.ENGLISH, ImportMode.INSERT, src, service, descriptionService);
importer.perform();
//
node = service.loadNode(NodeModel.SELF_MODEL, ctx, Scope.ALL, null).getNode();
assertEquals(5, node.getNodeCount());
assertEquals("d", node.get(0).getName());
assertEquals("a", node.get(1).getName());
assertEquals("b", node.get(2).getName());
assertEquals("c", node.get(3).getName());
assertEquals("e", node.get(4).getName());
}
public void testExtendedLabel() {
MOPService mop = mgr.getPOMService();
mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "extended_label");
sync(true);
//
assertNull(service.loadNavigation(SiteKey.portal("extended_label")));
//
PageNavigation src = new PageNavigation("portal", "extended_label").addFragment(fragment().add(node("a"), node("b"),
node("c")).build());
NavigationFragment fragment = src.getFragment();
fragment.getNode("a").setLabels(
new I18NString(new LocalizedString("a_en", Locale.ENGLISH), new LocalizedString("a_fr", Locale.FRENCH)));
fragment.getNode("b")
.setLabels(new I18NString(new LocalizedString("b_en"), new LocalizedString("b_fr", Locale.FRENCH)));
fragment.getNode("c").setLabels(new I18NString(new LocalizedString("c_en")));
src.setOwnerId("extended_label");
NavigationImporter importer = new NavigationImporter(Locale.ENGLISH, ImportMode.OVERWRITE, src, service,
descriptionService);
importer.perform();
//
NavigationContext ctx = service.loadNavigation(SiteKey.portal("extended_label"));
NodeContext<?> node = service.loadNode(NodeModel.SELF_MODEL, ctx, Scope.ALL, null).getNode();
// The fully explicit case
NodeContext<?> a = (NodeContext<?>) node.getNode("a");
Map<Locale, Described.State> aDesc = descriptionService.getDescriptions(a.getId());
assertNotNull(aDesc);
assertEquals(Tools.toSet(Locale.ENGLISH, Locale.FRENCH), aDesc.keySet());
assertEquals(new Described.State("a_en", null), aDesc.get(Locale.ENGLISH));
assertEquals(new Described.State("a_fr", null), aDesc.get(Locale.FRENCH));
assertNull(a.getState().getLabel());
// No explicit language means to use the portal locale
NodeContext<?> b = (NodeContext<?>) node.getNode("b");
Map<Locale, Described.State> bDesc = descriptionService.getDescriptions(b.getId());
assertNotNull(bDesc);
assertEquals(Tools.toSet(Locale.ENGLISH, Locale.FRENCH), bDesc.keySet());
assertEquals(new Described.State("b_en", null), bDesc.get(Locale.ENGLISH));
assertEquals(new Described.State("b_fr", null), bDesc.get(Locale.FRENCH));
assertNull(b.getState().getLabel());
// The simple use case : one single label without the xml:lang attribute
NodeContext<?> c = (NodeContext<?>) node.getNode("c");
Map<Locale, Described.State> cDesc = descriptionService.getDescriptions(c.getId());
assertNull(cDesc);
assertEquals("c_en", c.getState().getLabel());
// ----------------- Now test extended labels merge -----------------//
src = new PageNavigation("portal", "extended_label").addFragment(fragment().add(node("a"), node("b"), node("c"))
.build());
fragment = src.getFragment();
fragment.getNode("a").setLabels(
new I18NString(new LocalizedString("a_it", Locale.ITALIAN), new LocalizedString("a_de", Locale.GERMAN)));
fragment.getNode("b").setLabels(
new I18NString(new LocalizedString("foo_b_en"), new LocalizedString("b_it", Locale.ITALIAN)));
fragment.getNode("c").setLabels(new I18NString(new LocalizedString("foo_c_en")));
src.setOwnerId("extended_label");
importer = new NavigationImporter(Locale.ENGLISH, ImportMode.MERGE, src, service, descriptionService);
importer.perform();
//
ctx = service.loadNavigation(SiteKey.portal("extended_label"));
node = service.loadNode(NodeModel.SELF_MODEL, ctx, Scope.ALL, null).getNode();
// The fully explicit case
a = (NodeContext<?>) node.getNode("a");
aDesc = descriptionService.getDescriptions(a.getId());
assertNotNull(aDesc);
assertEquals(Tools.toSet(Locale.ITALIAN, Locale.GERMAN), aDesc.keySet());
assertEquals(new Described.State("a_it", null), aDesc.get(Locale.ITALIAN));
assertEquals(new Described.State("a_de", null), aDesc.get(Locale.GERMAN));
assertNull(a.getState().getLabel());
// No explicit language means to use the portal locale
b = (NodeContext<?>) node.getNode("b");
bDesc = descriptionService.getDescriptions(b.getId());
assertNotNull(bDesc);
assertEquals(Tools.toSet(Locale.ENGLISH, Locale.ITALIAN), bDesc.keySet());
assertEquals(new Described.State("foo_b_en", null), bDesc.get(Locale.ENGLISH));
assertEquals(new Described.State("b_it", null), bDesc.get(Locale.ITALIAN));
assertNull(b.getState().getLabel());
// The simple use case : one single label without the xml:lang attribute
c = (NodeContext<?>) node.getNode("c");
cDesc = descriptionService.getDescriptions(c.getId());
assertNull(cDesc);
assertEquals("foo_c_en", c.getState().getLabel());
// ----------------- Now test extended labels overwrite -----------------//
src = new PageNavigation("portal", "extended_label").addFragment(fragment().add(node("a"), node("b"), node("c"))
.build());
fragment = src.getFragment();
fragment.getNode("a")
.setLabels(
new I18NString(new LocalizedString("bar_a_en", Locale.ENGLISH), new LocalizedString("bar_a_fr",
Locale.FRENCH)));
fragment.getNode("b").setLabels(
new I18NString(new LocalizedString("bar_b_en"), new LocalizedString("bar_b_fr", Locale.FRENCH)));
fragment.getNode("c").setLabels(new I18NString(new LocalizedString("bar_c_en")));
src.setOwnerId("extended_label");
importer = new NavigationImporter(Locale.ENGLISH, ImportMode.OVERWRITE, src, service, descriptionService);
importer.perform();
//
ctx = service.loadNavigation(SiteKey.portal("extended_label"));
node = service.loadNode(NodeModel.SELF_MODEL, ctx, Scope.ALL, null).getNode();
// The fully explicit case
a = (NodeContext<?>) node.getNode("a");
aDesc = descriptionService.getDescriptions(a.getId());
assertNotNull(aDesc);
assertEquals(Tools.toSet(Locale.ENGLISH, Locale.FRENCH), aDesc.keySet());
assertEquals(new Described.State("bar_a_en", null), aDesc.get(Locale.ENGLISH));
assertEquals(new Described.State("bar_a_fr", null), aDesc.get(Locale.FRENCH));
assertNull(a.getState().getLabel());
// No explicit language means to use the portal locale
b = (NodeContext<?>) node.getNode("b");
bDesc = descriptionService.getDescriptions(b.getId());
assertNotNull(bDesc);
assertEquals(Tools.toSet(Locale.ENGLISH, Locale.FRENCH), bDesc.keySet());
assertEquals(new Described.State("bar_b_en", null), bDesc.get(Locale.ENGLISH));
assertEquals(new Described.State("bar_b_fr", null), bDesc.get(Locale.FRENCH));
assertNull(b.getState().getLabel());
// The simple use case : one single label without the xml:lang attribute
c = (NodeContext<?>) node.getNode("c");
cDesc = descriptionService.getDescriptions(c.getId());
assertNull(cDesc);
assertEquals("bar_c_en", c.getState().getLabel());
}
public void testFullNavigation() {
MOPService mop = mgr.getPOMService();
mop.getModel().getWorkspace().addSite(ObjectType.PORTAL_SITE, "full_navigation");
sync(true);
//
assertNull(service.loadNavigation(SiteKey.portal("full_navigation")));
//
PageNavigation src = new PageNavigation("portal", "full_navigation").addFragment(fragment().add(node("a")).build());
src.addFragment(fragment().add(node("b"), node("c")).build());
src.addFragment(fragment("a").add(node("d")).build());
//
NavigationImporter importer = new NavigationImporter(Locale.ENGLISH, ImportMode.INSERT, src, service,
descriptionService);
importer.perform();
//
NavigationContext ctx = service.loadNavigation(SiteKey.portal("full_navigation"));
NodeContext<NodeContext<?>> root = service.loadNode(NodeModel.SELF_MODEL, ctx, Scope.ALL, null);
assertEquals(3, root.getNodeSize());
Iterator<NodeContext<?>> i = root.iterator();
NodeContext<?> a = i.next();
assertEquals("a", a.getName());
assertEquals(1, a.getNodeSize());
NodeContext<?> d = a.get("d");
assertNotNull(d);
assertEquals(0, d.getNodeSize());
NodeContext<?> b = i.next();
assertEquals("b", b.getName());
assertEquals(0, b.getNodeSize());
NodeContext<?> c = i.next();
assertEquals("c", c.getName());
assertEquals(0, c.getNodeSize());
assertFalse(i.hasNext());
}
}