/*
* Copyright (C) 2010 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.web.controller.router;
import java.net.URL;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import junit.framework.TestCase;
import org.exoplatform.web.WebAppController;
import org.exoplatform.web.controller.metadata.ControllerDescriptor;
import org.exoplatform.web.controller.metadata.DescriptorBuilder;
import org.exoplatform.web.controller.metadata.RouteDescriptor;
/**
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
*/
public class TestDescriptorBuilder extends TestCase {
public void testFoo() throws Exception {
URL routerURL = TestDescriptorBuilder.class.getResource("router.xml");
XMLStreamReader routerReader = XMLInputFactory.newInstance().createXMLStreamReader(routerURL.openStream());
ControllerDescriptor routerDesc = new DescriptorBuilder().build(routerReader);
//
assertEquals('&', routerDesc.getSeparatorEscape());
//
Iterator<RouteDescriptor> i = routerDesc.getRoutes().iterator();
//
assertTrue(i.hasNext());
RouteDescriptor route1 = i.next();
assertEquals("/public/{gtn:sitetype}/{gtn:sitename}{gtn:path}", route1.getPath());
assertEquals(Collections.singleton(WebAppController.HANDLER_PARAM), route1.getRouteParamNames());
assertEquals(WebAppController.HANDLER_PARAM, route1.getRouteParam(WebAppController.HANDLER_PARAM).getQualifiedName());
assertEquals("portal", route1.getRouteParam(WebAppController.HANDLER_PARAM).getValue());
assertEquals(Collections.singleton(Names.GTN_PATH), route1.getPathParams().keySet());
assertEquals(Names.GTN_PATH, route1.getPathParams().get(Names.GTN_PATH).getQualifiedName());
assertEquals(".*", route1.getPathParams().get(Names.GTN_PATH).getPattern());
assertEquals(EncodingMode.FORM, route1.getPathParams().get(Names.GTN_PATH).getEncodingMode());
//
assertTrue(i.hasNext());
RouteDescriptor route2 = i.next();
assertEquals("/private/{gtn:sitetype}/{gtn:sitename}{gtn:path}", route2.getPath());
assertEquals(Collections.singleton(WebAppController.HANDLER_PARAM), route2.getRouteParamNames());
assertEquals(WebAppController.HANDLER_PARAM, route2.getRouteParam(WebAppController.HANDLER_PARAM).getQualifiedName());
assertEquals("portal", route2.getRouteParam(WebAppController.HANDLER_PARAM).getValue());
assertEquals(Collections.singleton(Names.GTN_PATH), route2.getPathParams().keySet());
assertEquals(Names.GTN_PATH, route2.getPathParams().get(Names.GTN_PATH).getQualifiedName());
assertEquals(".*", route2.getPathParams().get(Names.GTN_PATH).getPattern());
assertEquals(EncodingMode.PRESERVE_PATH, route2.getPathParams().get(Names.GTN_PATH).getEncodingMode());
//
assertTrue(i.hasNext());
RouteDescriptor route3 = i.next();
assertEquals("/upload", route3.getPath());
assertEquals(Collections.singleton(WebAppController.HANDLER_PARAM), route3.getRouteParamNames());
assertEquals(WebAppController.HANDLER_PARAM, route3.getRouteParam(WebAppController.HANDLER_PARAM).getQualifiedName());
assertEquals("upload", route3.getRouteParam(WebAppController.HANDLER_PARAM).getValue());
//
assertTrue(i.hasNext());
RouteDescriptor route4 = i.next();
assertEquals("/download", route4.getPath());
assertEquals(Collections.singleton(WebAppController.HANDLER_PARAM), route4.getRouteParamNames());
assertEquals(WebAppController.HANDLER_PARAM, route4.getRouteParam(WebAppController.HANDLER_PARAM).getQualifiedName());
assertEquals("download", route4.getRouteParam(WebAppController.HANDLER_PARAM).getValue());
//
assertTrue(i.hasNext());
RouteDescriptor route5 = i.next();
assertEquals("/a", route5.getPath());
assertEquals(Collections.singleton(Names.A), route5.getRouteParamNames());
assertEquals(Names.A, route5.getRouteParam(Names.A).getQualifiedName());
assertEquals("a_value", route5.getRouteParam(Names.A).getValue());
assertEquals(1, route5.getChildren().size());
RouteDescriptor route5_1 = route5.getChildren().get(0);
assertEquals("/b", route5_1.getPath());
assertEquals(Collections.singleton(Names.B), route5_1.getRouteParamNames());
assertEquals(Names.B, route5_1.getRouteParam(Names.B).getQualifiedName());
assertEquals("b_value", route5_1.getRouteParam(Names.B).getValue());
//
assertTrue(i.hasNext());
RouteDescriptor route6 = i.next();
assertEquals("/b", route6.getPath());
assertEquals(new HashSet<String>(Arrays.asList("foo", "bar", "juu")), route6.getRequestParamMatchNames());
assertEquals(Names.FOO, route6.getRequestParam("foo").getQualifiedName());
assertEquals("foo", route6.getRequestParam("foo").getName());
assertEquals(null, route6.getRequestParam("foo").getValue());
assertEquals(ValueType.LITERAL, route6.getRequestParam("foo").getValueType());
assertEquals(ControlMode.OPTIONAL, route6.getRequestParam("foo").getControlMode());
assertEquals(Names.BAR, route6.getRequestParam("bar").getQualifiedName());
assertEquals("bar", route6.getRequestParam("bar").getName());
assertEquals("bar", route6.getRequestParam("bar").getValue());
assertEquals(ValueType.LITERAL, route6.getRequestParam("bar").getValueType());
assertEquals(ControlMode.OPTIONAL, route6.getRequestParam("bar").getControlMode());
assertEquals(Names.JUU, route6.getRequestParam("juu").getQualifiedName());
assertEquals("juu", route6.getRequestParam("juu").getName());
assertEquals("juu", route6.getRequestParam("juu").getValue());
assertEquals(ValueType.PATTERN, route6.getRequestParam("juu").getValueType());
assertEquals(ControlMode.REQUIRED, route6.getRequestParam("juu").getControlMode());
//
assertFalse(i.hasNext());
}
}