mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
Merged HEAD-QA to HEAD (4.2) (including moving test classes into separate folders)
51903 to 54309 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@54310 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2010 Alfresco Software Limited.
|
||||
*
|
||||
* This file is part of Alfresco
|
||||
*
|
||||
* Alfresco 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Alfresco 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 Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package org.alfresco.web.app;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
/**
|
||||
* Unit test for resource bundle wrapper
|
||||
*
|
||||
* @author Roy Wetherall
|
||||
*/
|
||||
public class ResourceBundleWrapperTest extends TestCase
|
||||
{
|
||||
private static final String BUNDLE_NAME = "org.alfresco.web.app.resourceBundleWrapperTest";
|
||||
private static final String KEY_1 = "test_key_one";
|
||||
private static final String KEY_2 = "test_key_two";
|
||||
private static final String MSG_1 = "Test Key One";
|
||||
private static final String MSG_2 = "Test Key Two";
|
||||
|
||||
/**
|
||||
* Test adding the bundles
|
||||
*/
|
||||
public void test1AddingBundles()
|
||||
{
|
||||
// Check that the string's are not added to the bundle
|
||||
ResourceBundle before = ResourceBundleWrapper.getResourceBundle("alfresco.messages.webclient", Locale.US);
|
||||
Enumeration<String> keys = before.getKeys();
|
||||
assertFalse(containsValue(keys, KEY_1));
|
||||
assertFalse(containsValue(keys, KEY_2));
|
||||
try
|
||||
{
|
||||
before.getString(KEY_1);
|
||||
fail("Not expecting the key to be there");
|
||||
}
|
||||
catch (Throwable exception){};
|
||||
try
|
||||
{
|
||||
before.getString(KEY_2);
|
||||
fail("Not expecting the key to be there");
|
||||
}
|
||||
catch (Throwable exception){};
|
||||
|
||||
// Add an additional resource bundle
|
||||
ResourceBundleWrapper.addResourceBundle(BUNDLE_NAME);
|
||||
|
||||
// Check that the string's are now added to the bundle
|
||||
ResourceBundle after = ResourceBundleWrapper.getResourceBundle("alfresco.messages.webclient", Locale.US);
|
||||
Enumeration<String> keys2 = after.getKeys();
|
||||
assertTrue(containsValue(keys2, KEY_1));
|
||||
assertEquals(after.getString(KEY_1), MSG_1);
|
||||
assertEquals(after.getString(KEY_2), MSG_2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the bootstrap bean
|
||||
*/
|
||||
public void test2Bootstrap()
|
||||
{
|
||||
// Use the bootstrap bean to add the bundles
|
||||
List<String> bundles = new ArrayList<String>(1);
|
||||
bundles.add(BUNDLE_NAME);
|
||||
ResourceBundleBootstrap bootstrap = new ResourceBundleBootstrap();
|
||||
bootstrap.setResourceBundles(bundles);
|
||||
|
||||
// Check that the string's are now added to the bundle
|
||||
ResourceBundle after = ResourceBundleWrapper.getResourceBundle("alfresco.messages.webclient", Locale.US);
|
||||
Enumeration<String> keys2 = after.getKeys();
|
||||
assertTrue(containsValue(keys2, KEY_1));
|
||||
assertTrue(containsValue(keys2, KEY_2));
|
||||
assertEquals(after.getString(KEY_1), MSG_1);
|
||||
assertEquals(after.getString(KEY_2), MSG_2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether the list contains the values
|
||||
*
|
||||
* @param values list of values to check
|
||||
* @param value value to look for
|
||||
* @return boolean true if value contained, false otherwise
|
||||
*/
|
||||
private boolean containsValue(Enumeration<String> values, String value)
|
||||
{
|
||||
boolean result = false;
|
||||
while (values.hasMoreElements() == true)
|
||||
{
|
||||
if (values.nextElement().equals(value) == true)
|
||||
{
|
||||
result = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2013 Alfresco Software Limited.
|
||||
*
|
||||
* This file is part of Alfresco
|
||||
*
|
||||
* Alfresco 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Alfresco 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 Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package org.alfresco.web.app.servlet;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
import javax.servlet.FilterChain;
|
||||
import javax.servlet.ServletContext;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import org.alfresco.repo.tenant.TenantContextHolder;
|
||||
import org.alfresco.web.config.ClientConfigElement;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.runners.MockitoJUnitRunner;
|
||||
import org.springframework.context.ApplicationEvent;
|
||||
import org.springframework.extensions.config.ConfigImpl;
|
||||
import org.springframework.extensions.config.ConfigService;
|
||||
|
||||
/**
|
||||
* Test for the AuthenticationFilter class.
|
||||
*
|
||||
* @author alex.mukha
|
||||
*/
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
public class AuthenticationFilterTest
|
||||
{
|
||||
private static String loginPage = "loginpage";
|
||||
|
||||
private String tenantDomain = "tenantDomain-" + System.currentTimeMillis();
|
||||
|
||||
private @Mock ServletContext context;
|
||||
private @Mock HttpServletResponse res;
|
||||
private @Mock FilterChain chain;
|
||||
private @Mock ApplicationEvent event;
|
||||
|
||||
/**
|
||||
* Test for the fix for ALF-18611
|
||||
* @throws Exception
|
||||
*/
|
||||
@Test
|
||||
public void testALF18611() throws Exception
|
||||
{
|
||||
ClientConfigElement clientConfigElementMock = mock(ClientConfigElement.class);
|
||||
when(clientConfigElementMock.getLoginPage()).thenReturn(loginPage);
|
||||
ConfigImpl configImplMock = mock(ConfigImpl.class);
|
||||
when(configImplMock.getConfigElement(ClientConfigElement.CONFIG_ELEMENT_ID)).thenReturn(clientConfigElementMock);
|
||||
ConfigService configServiceMock = mock(ConfigService.class);
|
||||
when(configServiceMock.getGlobalConfig()).thenReturn(configImplMock);
|
||||
|
||||
TenantContextHolder.setTenantDomain(tenantDomain);
|
||||
assertTrue("Tenant domain should be equal", TenantContextHolder.getTenantDomain().equals(tenantDomain.toLowerCase()));
|
||||
AuthenticationFilter authenticationFilter = new AuthenticationFilter();
|
||||
authenticationFilter.setConfigService(configServiceMock);
|
||||
authenticationFilter.onBootstrap(event);
|
||||
|
||||
HttpServletRequest reqMock = mock(HttpServletRequest.class);
|
||||
when(reqMock.getRequestURI()).thenReturn(loginPage);
|
||||
authenticationFilter.doFilter(context, reqMock, res, chain);
|
||||
|
||||
assertTrue("Tenant domain should be empty", TenantContextHolder.getTenantDomain() == null);
|
||||
}
|
||||
}
|
@@ -0,0 +1,124 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2010 Alfresco Software Limited.
|
||||
*
|
||||
* This file is part of Alfresco
|
||||
*
|
||||
* Alfresco 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Alfresco 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 Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package org.alfresco.web.app.servlet;
|
||||
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.alfresco.repo.management.subsystems.AbstractChainedSubsystemTest;
|
||||
import org.alfresco.repo.management.subsystems.ChildApplicationContextFactory;
|
||||
import org.alfresco.repo.management.subsystems.DefaultChildApplicationContextManager;
|
||||
import org.alfresco.repo.webdav.auth.RemoteUserMapper;
|
||||
import org.alfresco.util.ApplicationContextHelper;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
|
||||
|
||||
/**
|
||||
* @author dward
|
||||
*
|
||||
*/
|
||||
public class DefaultRemoteUserMapperTest extends AbstractChainedSubsystemTest
|
||||
{
|
||||
ApplicationContext ctx = ApplicationContextHelper.getApplicationContext();
|
||||
DefaultChildApplicationContextManager childApplicationContextManager;
|
||||
ChildApplicationContextFactory childApplicationContextFactory;
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see junit.framework.TestCase#setUp()
|
||||
*/
|
||||
@Override
|
||||
protected void setUp() throws Exception
|
||||
{
|
||||
childApplicationContextManager = (DefaultChildApplicationContextManager) ctx.getBean("Authentication");
|
||||
childApplicationContextManager.stop();
|
||||
childApplicationContextManager.setProperty("chain", "external1:external");
|
||||
childApplicationContextFactory = getChildApplicationContextFactory(childApplicationContextManager, "external1");
|
||||
}
|
||||
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see junit.framework.TestCase#tearDown()
|
||||
*/
|
||||
@Override
|
||||
protected void tearDown() throws Exception
|
||||
{
|
||||
childApplicationContextManager.destroy();
|
||||
childApplicationContextManager = null;
|
||||
childApplicationContextFactory = null;
|
||||
}
|
||||
|
||||
|
||||
public void testUnproxiedHeader() throws Exception
|
||||
{
|
||||
// Clear the proxy user name
|
||||
childApplicationContextFactory.stop();
|
||||
childApplicationContextFactory.setProperty("external.authentication.proxyUserName", "");
|
||||
|
||||
// Mock a request with a username in the header
|
||||
HttpServletRequest mockRequest = mock(HttpServletRequest.class);
|
||||
when(mockRequest.getHeader("X-Alfresco-Remote-User")).thenReturn("AdMiN");
|
||||
assertEquals("admin", ((RemoteUserMapper) childApplicationContextFactory.getApplicationContext().getBean(
|
||||
"remoteUserMapper")).getRemoteUser(mockRequest));
|
||||
|
||||
// Mock an unauthenticated request
|
||||
when(mockRequest.getHeader("X-Alfresco-Remote-User")).thenReturn(null);
|
||||
assertNull(((RemoteUserMapper) childApplicationContextFactory.getApplicationContext().getBean(
|
||||
"remoteUserMapper")).getRemoteUser(mockRequest));
|
||||
|
||||
// Mock a remote user request
|
||||
when(mockRequest.getRemoteUser()).thenReturn("ADMIN");
|
||||
assertEquals("admin", ((RemoteUserMapper) childApplicationContextFactory.getApplicationContext().getBean(
|
||||
"remoteUserMapper")).getRemoteUser(mockRequest));
|
||||
}
|
||||
|
||||
|
||||
public void testProxiedHeader() throws Exception
|
||||
{
|
||||
// Set the proxy user name
|
||||
childApplicationContextFactory.stop();
|
||||
childApplicationContextFactory.setProperty("external.authentication.proxyUserName", "bob");
|
||||
|
||||
// Mock a request with both a user and a header
|
||||
HttpServletRequest mockRequest = mock(HttpServletRequest.class);
|
||||
when(mockRequest.getRemoteUser()).thenReturn("bob");
|
||||
when(mockRequest.getHeader("X-Alfresco-Remote-User")).thenReturn("AdMiN");
|
||||
assertEquals("admin", ((RemoteUserMapper) childApplicationContextFactory.getApplicationContext().getBean(
|
||||
"remoteUserMapper")).getRemoteUser(mockRequest));
|
||||
|
||||
// Now try header pattern matching
|
||||
childApplicationContextFactory.stop();
|
||||
childApplicationContextFactory.setProperty("external.authentication.userIdPattern", "abc-(.*)-999");
|
||||
when(mockRequest.getHeader("X-Alfresco-Remote-User")).thenReturn("abc-AdMiN-999");
|
||||
assertEquals("admin", ((RemoteUserMapper) childApplicationContextFactory.getApplicationContext().getBean(
|
||||
"remoteUserMapper")).getRemoteUser(mockRequest));
|
||||
|
||||
// Try a request with an invalid match
|
||||
when(mockRequest.getHeader("X-Alfresco-Remote-User")).thenReturn("abc-AdMiN-998");
|
||||
assertNull(((RemoteUserMapper) childApplicationContextFactory.getApplicationContext().getBean(
|
||||
"remoteUserMapper")).getRemoteUser(mockRequest));
|
||||
|
||||
// Try a request without the remote user
|
||||
when(mockRequest.getRemoteUser()).thenReturn(null);
|
||||
assertNull(((RemoteUserMapper) childApplicationContextFactory.getApplicationContext().getBean(
|
||||
"remoteUserMapper")).getRemoteUser(mockRequest));
|
||||
}
|
||||
|
||||
}
|
1059
source/test-java/org/alfresco/web/config/WebClientConfigTest.java
Normal file
1059
source/test-java/org/alfresco/web/config/WebClientConfigTest.java
Normal file
File diff suppressed because it is too large
Load Diff
295
source/test-java/org/alfresco/web/forms/FormsTest.java
Normal file
295
source/test-java/org/alfresco/web/forms/FormsTest.java
Normal file
@@ -0,0 +1,295 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2010 Alfresco Software Limited.
|
||||
*
|
||||
* This file is part of Alfresco
|
||||
*
|
||||
* Alfresco 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Alfresco 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 Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package org.alfresco.web.forms;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Calendar;
|
||||
import java.util.HashMap;
|
||||
|
||||
import org.alfresco.model.WCMAppModel;
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||
import org.alfresco.repo.security.authentication.MutableAuthenticationDao;
|
||||
import org.alfresco.service.cmr.model.FileFolderService;
|
||||
import org.alfresco.service.cmr.model.FileInfo;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.NodeService;
|
||||
import org.alfresco.service.cmr.repository.StoreRef;
|
||||
import org.alfresco.service.cmr.security.MutableAuthenticationService;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.util.XMLUtil;
|
||||
import org.alfresco.util.BaseSpringTest;
|
||||
import org.alfresco.util.TestWithUserUtils;
|
||||
import org.apache.commons.lang.ArrayUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.apache.shale.test.mock.MockExternalContext;
|
||||
import org.apache.shale.test.mock.MockFacesContext;
|
||||
import org.apache.shale.test.mock.MockHttpServletRequest;
|
||||
import org.apache.shale.test.mock.MockHttpServletResponse;
|
||||
import org.apache.shale.test.mock.MockServletContext;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
import org.springframework.web.context.support.StaticWebApplicationContext;
|
||||
import org.w3c.dom.Document;
|
||||
|
||||
/**
|
||||
* JUnit tests to exercise parts of the forms codebase
|
||||
*
|
||||
* @author ariel backenroth
|
||||
*/
|
||||
public class FormsTest
|
||||
extends BaseSpringTest
|
||||
{
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
private static class MockForm
|
||||
extends FormImpl
|
||||
{
|
||||
|
||||
MockForm(final NodeRef folderNodeRef,
|
||||
final FormsService formsService)
|
||||
{
|
||||
super(folderNodeRef, formsService);
|
||||
}
|
||||
|
||||
|
||||
public void setOutputPathPattern(final String opp)
|
||||
{
|
||||
final NodeService nodeService = this.getServiceRegistry().getNodeService();
|
||||
nodeService.setProperty(this.getNodeRef(), WCMAppModel.PROP_OUTPUT_PATH_PATTERN, opp);
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
private final static Log LOGGER = LogFactory.getLog(FormsTest.class);
|
||||
private final static String WEB_CLIENT_APPLICATION_CONTEXT =
|
||||
"classpath:alfresco/web-client-application-context.xml";
|
||||
|
||||
private NodeService nodeService;
|
||||
private FormsService formsService;
|
||||
private MockForm mockForm;
|
||||
|
||||
protected void onSetUpInTransaction()
|
||||
throws Exception
|
||||
{
|
||||
System.err.println("onSetUpInTransaction");
|
||||
super.onSetUpInTransaction();
|
||||
this.nodeService = (NodeService)super.applicationContext.getBean("dbNodeService");
|
||||
assertNotNull(this.nodeService);
|
||||
final FileFolderService fileFolderService = (FileFolderService)
|
||||
super.applicationContext.getBean("fileFolderService");
|
||||
assertNotNull(fileFolderService);
|
||||
this.formsService = (FormsService)super.applicationContext.getBean("FormsService");
|
||||
assertNotNull(this.formsService);
|
||||
final MutableAuthenticationService authenticationService = (MutableAuthenticationService)
|
||||
applicationContext.getBean("authenticationService");
|
||||
authenticationService.clearCurrentSecurityContext();
|
||||
final MutableAuthenticationDao authenticationDAO = (MutableAuthenticationDao)
|
||||
applicationContext.getBean("authenticationDao");
|
||||
|
||||
// Create a workspace that contains the 'live' nodes
|
||||
final StoreRef testStoreRef = this.nodeService.createStore(StoreRef.PROTOCOL_WORKSPACE,
|
||||
"Test_" + System.currentTimeMillis());
|
||||
|
||||
// Get a reference to the root node
|
||||
final NodeRef rootNodeRef = this.nodeService.getRootNode(testStoreRef);
|
||||
|
||||
// Create an authenticate the user
|
||||
if(!authenticationDAO.userExists(AuthenticationUtil.getAdminUserName()))
|
||||
{
|
||||
authenticationService.createAuthentication(AuthenticationUtil.getAdminUserName(), "admin".toCharArray());
|
||||
}
|
||||
|
||||
TestWithUserUtils.authenticateUser(AuthenticationUtil.getAdminUserName(),
|
||||
"admin",
|
||||
rootNodeRef,
|
||||
authenticationService);
|
||||
|
||||
// set up a faces context
|
||||
final MockExternalContext ec = new MockExternalContext(new MockServletContext(),
|
||||
new MockHttpServletRequest(),
|
||||
new MockHttpServletResponse());
|
||||
final StaticWebApplicationContext ac = new StaticWebApplicationContext();
|
||||
ac.setParent(this.applicationContext);
|
||||
this.applicationContext = ac;
|
||||
ec.getApplicationMap().put(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
|
||||
this.applicationContext);
|
||||
new MockFacesContext(ec);
|
||||
|
||||
|
||||
final FileInfo folderInfo =
|
||||
fileFolderService.create(rootNodeRef,
|
||||
"test_form",
|
||||
WCMAppModel.TYPE_FORMFOLDER);
|
||||
final HashMap<QName, Serializable> props = new HashMap<QName, Serializable>();
|
||||
this.nodeService.addAspect(folderInfo.getNodeRef(),
|
||||
WCMAppModel.ASPECT_FORM,
|
||||
props);
|
||||
this.mockForm = new MockForm(folderInfo.getNodeRef(), this.formsService);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String[] getConfigLocations()
|
||||
{
|
||||
return (String[])ArrayUtils.add(super.getConfigLocations(),
|
||||
WEB_CLIENT_APPLICATION_CONTEXT);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ConfigurableApplicationContext loadContext(Object key)
|
||||
throws Exception
|
||||
{
|
||||
return new ClassPathXmlApplicationContext((String[])key);
|
||||
}
|
||||
|
||||
public void testOutputPathPatternForFormInstanceData()
|
||||
throws Exception
|
||||
{
|
||||
class OutputPathPatternTest
|
||||
{
|
||||
public final String expected;
|
||||
public final String pattern;
|
||||
public final Document xml;
|
||||
public final String name;
|
||||
public final String parentAVMPath;
|
||||
public final String webapp;
|
||||
|
||||
public OutputPathPatternTest(final String expected,
|
||||
final String pattern,
|
||||
final Document xml,
|
||||
final String name,
|
||||
final String parentAVMPath,
|
||||
final String webapp)
|
||||
{
|
||||
this.expected = expected;
|
||||
this.pattern = pattern;
|
||||
this.xml = xml;
|
||||
this.name = name;
|
||||
this.parentAVMPath = parentAVMPath;
|
||||
this.webapp = webapp;
|
||||
}
|
||||
}
|
||||
|
||||
final OutputPathPatternTest[] opps = new OutputPathPatternTest[] {
|
||||
new OutputPathPatternTest("avmstore:/www/avm_webapps/webapp/dir/foo.xml",
|
||||
"${name}.xml",
|
||||
XMLUtil.parse("<foo/>"),
|
||||
"foo",
|
||||
"avmstore:/www/avm_webapps/webapp/dir",
|
||||
"webapp"),
|
||||
new OutputPathPatternTest("avmstore:/www/avm_webapps/foo.xml",
|
||||
"/${name}.xml",
|
||||
XMLUtil.parse("<foo/>"),
|
||||
"foo",
|
||||
"avmstore:/www/avm_webapps/webapp/dir",
|
||||
"webapp"),
|
||||
new OutputPathPatternTest("avmstore:/www/avm_webapps/webapp/foo.xml",
|
||||
"/${webapp}/${name}.xml",
|
||||
XMLUtil.parse("<foo/>"),
|
||||
"foo",
|
||||
"avmstore:/www/avm_webapps/webapp/dir",
|
||||
"webapp"),
|
||||
new OutputPathPatternTest("avmstore:/www/avm_webapps/webapp/foo.xml",
|
||||
"/${webapp}/${name}.xml",
|
||||
XMLUtil.parse("<foo/>"),
|
||||
"foo",
|
||||
"avmstore:/www/avm_webapps/another_webapp/dir",
|
||||
"webapp"),
|
||||
new OutputPathPatternTest("avmstore:/www/avm_webapps/webapp/dir1/dir2/foo.xml",
|
||||
"/${webapp}/${cwd}/${name}.xml",
|
||||
XMLUtil.parse("<foo/>"),
|
||||
"foo",
|
||||
"avmstore:/www/avm_webapps/another_webapp/dir1/dir2",
|
||||
"webapp"),
|
||||
new OutputPathPatternTest("avmstore:/www/avm_webapps/webapp/dir/" + Calendar.getInstance().get(Calendar.YEAR) + "_foo.xml",
|
||||
"${date?string('yyyy')}_${name}.xml",
|
||||
XMLUtil.parse("<foo/>"),
|
||||
"foo",
|
||||
"avmstore:/www/avm_webapps/webapp/dir",
|
||||
"webapp"),
|
||||
new OutputPathPatternTest("avmstore:/www/avm_webapps/webapp/dir/foo.xml",
|
||||
"${xml.root_tag.name}.xml",
|
||||
XMLUtil.parse("<root_tag><name>foo</name></root_tag>"),
|
||||
"foo",
|
||||
"avmstore:/www/avm_webapps/webapp/dir",
|
||||
"webapp"),
|
||||
new OutputPathPatternTest("avmstore:/www/avm_webapps/webapp/dir/07.xml",
|
||||
"${xml.root_tag.date?date('yyyy-MM-dd')?string('MM')}.xml",
|
||||
XMLUtil.parse("<root_tag><date>1776-07-04</date></root_tag>"),
|
||||
"foo",
|
||||
"avmstore:/www/avm_webapps/webapp/dir",
|
||||
"webapp"),
|
||||
new OutputPathPatternTest("avmstore:/www/avm_webapps/webapp/dir/foo.xml",
|
||||
"${xml['foons:root_tag/foons:name']}.xml",
|
||||
XMLUtil.parse("<foons:root_tag xmlns:foons='bar'><foons:name>foo</foons:name></foons:root_tag>"),
|
||||
"foo",
|
||||
"avmstore:/www/avm_webapps/webapp/dir",
|
||||
"webapp"),
|
||||
new OutputPathPatternTest("avmstore:/www/avm_webapps/webapp/dir/foo.xml",
|
||||
"${xml[\"/*[name()='foons:root_tag']/*[name()='foons:name']\"]}.xml",
|
||||
XMLUtil.parse("<foons:root_tag xmlns:foons='bar'><foons:name>foo</foons:name></foons:root_tag>"),
|
||||
"foo",
|
||||
"avmstore:/www/avm_webapps/webapp/dir",
|
||||
"webapp"),
|
||||
new OutputPathPatternTest("avmstore:/www/avm_webapps/webapp/dir/foo.xml",
|
||||
"${xml['/foons:root_tag/foons:name']}.xml",
|
||||
XMLUtil.parse("<foons:root_tag xmlns:foons='bar'><foons:name>foo</foons:name></foons:root_tag>"),
|
||||
"foo",
|
||||
"avmstore:/www/avm_webapps/webapp/dir",
|
||||
"webapp"),
|
||||
new OutputPathPatternTest(null,
|
||||
"${xml.root_tag.name}",
|
||||
XMLUtil.parse("<foons:root_tag xmlns:foons='bar'><foons:name>foo</foons:name></foons:root_tag>"),
|
||||
"foo",
|
||||
"avmstore:/www/avm_webapps/webapp/dir",
|
||||
"webapp")
|
||||
};
|
||||
for (final OutputPathPatternTest oppt : opps)
|
||||
{
|
||||
this.mockForm.setOutputPathPattern(oppt.pattern);
|
||||
if (oppt.expected == null)
|
||||
{
|
||||
try
|
||||
{
|
||||
this.mockForm.getOutputPathForFormInstanceData(oppt.xml,
|
||||
oppt.name,
|
||||
oppt.parentAVMPath,
|
||||
oppt.webapp);
|
||||
fail("expected pattern " + oppt.pattern + " to fail");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
// expected failure
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
assertEquals(oppt.pattern + " failed",
|
||||
oppt.expected,
|
||||
this.mockForm.getOutputPathForFormInstanceData(oppt.xml,
|
||||
oppt.name,
|
||||
oppt.parentAVMPath,
|
||||
oppt.webapp));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
143
source/test-java/org/alfresco/web/forms/XMLUtilTest.java
Normal file
143
source/test-java/org/alfresco/web/forms/XMLUtilTest.java
Normal file
@@ -0,0 +1,143 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2010 Alfresco Software Limited.
|
||||
*
|
||||
* This file is part of Alfresco
|
||||
*
|
||||
* Alfresco 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Alfresco 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 Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package org.alfresco.web.forms;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.alfresco.util.XMLUtil;
|
||||
|
||||
/**
|
||||
* Simple XMLUtil test
|
||||
*/
|
||||
public class XMLUtilTest extends TestCase
|
||||
{
|
||||
public static final String SOME_XML =
|
||||
" <model name='test1:testModelOne' xmlns='http://www.alfresco.org/model/dictionary/1.0'>" +
|
||||
" <description>Test model one</description>" +
|
||||
" <author>Alfresco</author>" +
|
||||
" <published>2008-01-01</published>" +
|
||||
" <version>1.0</version>" +
|
||||
" <imports>" +
|
||||
" <import uri='http://www.alfresco.org/model/dictionary/1.0' prefix='d'/>" +
|
||||
" </imports>" +
|
||||
" <namespaces>" +
|
||||
" <namespace uri='http://www.alfresco.org/test/testmodel1/1.0' prefix='test1'/>" +
|
||||
" </namespaces>" +
|
||||
" <types>" +
|
||||
" <type name='test1:base'>" +
|
||||
" <title>Base</title>" +
|
||||
" <description>The Base Type</description>" +
|
||||
" <properties>" +
|
||||
" <property name='test1:prop1'>" +
|
||||
" <type>d:text</type>" +
|
||||
" </property>" +
|
||||
" </properties>" +
|
||||
" </type>" +
|
||||
" </types>" +
|
||||
" </model>";
|
||||
|
||||
|
||||
private final static int threadCount = 5;
|
||||
|
||||
private final static int loopCount = 50;
|
||||
private final static int randomNextInt = 100;
|
||||
|
||||
private Map<String, Throwable> errors = new HashMap<String, Throwable>();
|
||||
|
||||
|
||||
protected void setUp() throws Exception
|
||||
{
|
||||
}
|
||||
|
||||
// https://issues.alfresco.com/browse/ETWOONE-241
|
||||
public void testConcurrentParse()
|
||||
{
|
||||
ThreadGroup threadGroup = new ThreadGroup(getName());
|
||||
Thread[] threads = new Thread[threadCount];
|
||||
|
||||
for (int i = 0; i < threadCount; i++)
|
||||
{
|
||||
threads[i] = new Thread(threadGroup, new TestRun(""+i), String.format("XMLUtilTest-%02d", i));
|
||||
threads[i].start();
|
||||
}
|
||||
|
||||
// join each thread so that we wait for them all to finish
|
||||
for (int i = 0; i < threads.length; i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
threads[i].join();
|
||||
}
|
||||
catch (InterruptedException e)
|
||||
{
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
|
||||
if (errors.size() != 0)
|
||||
{
|
||||
fail();
|
||||
}
|
||||
}
|
||||
|
||||
class TestRun extends Thread
|
||||
{
|
||||
private String arg;
|
||||
|
||||
public TestRun(String arg)
|
||||
{
|
||||
this.arg = arg;
|
||||
}
|
||||
|
||||
public String getArg()
|
||||
{
|
||||
return arg;
|
||||
}
|
||||
|
||||
public void run()
|
||||
{
|
||||
Random random = new Random(System.currentTimeMillis());
|
||||
|
||||
for (int i = 0; i < loopCount; i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
XMLUtil.parse(SOME_XML); // ignore returned doc
|
||||
}
|
||||
catch (Throwable t)
|
||||
{
|
||||
t.printStackTrace();
|
||||
errors.put(arg, t);
|
||||
break;
|
||||
}
|
||||
|
||||
// random delay ...
|
||||
if (randomNextInt != 0)
|
||||
{
|
||||
int msecs = random.nextInt(randomNextInt);
|
||||
try {Thread.sleep(msecs);} catch (Exception exception){};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,679 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2010 Alfresco Software Limited.
|
||||
*
|
||||
* This file is part of Alfresco
|
||||
*
|
||||
* Alfresco 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Alfresco 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 Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package org.alfresco.web.forms.xforms;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.Enumeration;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Vector;
|
||||
import java.util.ResourceBundle;
|
||||
import junit.framework.AssertionFailedError;
|
||||
import org.alfresco.service.namespace.NamespaceService;
|
||||
import org.alfresco.util.BaseTest;
|
||||
import org.alfresco.util.XMLUtil;
|
||||
import org.apache.commons.jxpath.JXPathContext;
|
||||
import org.apache.commons.jxpath.Pointer;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.chiba.xml.ns.NamespaceConstants;
|
||||
import org.chiba.xml.events.XFormsEventNames;
|
||||
import org.chiba.xml.events.XMLEvent;
|
||||
import org.chiba.xml.xforms.ChibaBean;
|
||||
import org.chiba.xml.xforms.exception.XFormsException;
|
||||
import org.chiba.xml.xforms.XFormsElement;
|
||||
import org.chiba.xml.events.DOMEventNames;
|
||||
import org.w3c.dom.*;
|
||||
import org.w3c.dom.events.*;
|
||||
import org.xml.sax.*;
|
||||
|
||||
/**
|
||||
* JUnit tests to exercise the the schema to xforms converter
|
||||
*
|
||||
* @author ariel backenroth
|
||||
*/
|
||||
public class Schema2XFormsTest
|
||||
extends BaseTest
|
||||
{
|
||||
|
||||
private final static Log LOGGER = LogFactory.getLog(Schema2XFormsTest.class);
|
||||
|
||||
public void testOneStringTestWithEmptyInstanceDocument()
|
||||
throws Exception
|
||||
{
|
||||
final Document schemaDocument = this.loadTestResourceDocument("xforms/unit-tests/one-string-test.xsd");
|
||||
final Document xformsDocument = Schema2XFormsTest.buildXForm(null, schemaDocument, "one-string-test");
|
||||
this.runXForm(xformsDocument);
|
||||
final JXPathContext xpathContext = JXPathContext.newContext(xformsDocument);
|
||||
Pointer pointer = xpathContext.getPointer("//*[@id='input_0']");
|
||||
assertNotNull(pointer);
|
||||
String s = ((Element)pointer.getNode()).getAttributeNS(NamespaceConstants.XFORMS_NS, "bind");
|
||||
assertNotNull(s);
|
||||
pointer = xpathContext.getPointer("//*[@id='" + s + "']");
|
||||
assertNotNull(pointer);
|
||||
assertEquals("true()", ((Element)pointer.getNode()).getAttributeNS(NamespaceConstants.XFORMS_NS, "required"));
|
||||
pointer = xpathContext.getPointer("//" + NamespaceConstants.XFORMS_PREFIX + ":instance[@id='instance_0']/one-string-test/string");
|
||||
assertNotNull(pointer);
|
||||
assertEquals("default-value", ((Element)pointer.getNode()).getTextContent());
|
||||
}
|
||||
|
||||
public void testOneStringTestWithInstanceDocument()
|
||||
throws Exception
|
||||
{
|
||||
final Document instanceDocument = XMLUtil.parse("<one-string-test><string>test</string></one-string-test>");
|
||||
final Document schemaDocument = this.loadTestResourceDocument("xforms/unit-tests/one-string-test.xsd");
|
||||
final Document xformsDocument = Schema2XFormsTest.buildXForm(instanceDocument, schemaDocument, "one-string-test");
|
||||
this.runXForm(xformsDocument);
|
||||
final JXPathContext xpathContext = JXPathContext.newContext(xformsDocument);
|
||||
Pointer pointer = xpathContext.getPointer("//*[@id='input_0']");
|
||||
assertNotNull(pointer);
|
||||
String s = ((Element)pointer.getNode()).getAttributeNS(NamespaceConstants.XFORMS_NS, "bind");
|
||||
pointer = xpathContext.getPointer("//*[@id='" + s + "']");
|
||||
assertNotNull(pointer);
|
||||
assertEquals("true()", ((Element)pointer.getNode()).getAttributeNS(NamespaceConstants.XFORMS_NS, "required"));
|
||||
pointer = xpathContext.getPointer("//" + NamespaceConstants.XFORMS_PREFIX + ":instance[@id='instance_0']/one-string-test/string");
|
||||
assertNotNull(pointer);
|
||||
assertEquals("test", ((Element)pointer.getNode()).getTextContent());
|
||||
}
|
||||
|
||||
public void testNumbers()
|
||||
throws Exception
|
||||
{
|
||||
final Document schemaDocument = this.loadTestResourceDocument("xforms/unit-tests/number-test.xsd");
|
||||
final Document xformsDocument = Schema2XFormsTest.buildXForm(null, schemaDocument, "number-test");
|
||||
System.err.println("generated xform " + XMLUtil.toString(xformsDocument));
|
||||
final Element[] repeatedNumbers = Schema2XFormsTest.resolveXFormsControl(xformsDocument, "/number-test/repeated_numbers");
|
||||
final ChibaBean chibaBean = this.runXForm(xformsDocument);
|
||||
try
|
||||
{
|
||||
chibaBean.dispatch(repeatedNumbers[0].getAttribute("id") + "-insert_before", DOMEventNames.ACTIVATE);
|
||||
fail("expected to reproduce WCM-778");
|
||||
}
|
||||
catch (XFormsException bindingIssue)
|
||||
{
|
||||
// tracked as WCM-778
|
||||
}
|
||||
}
|
||||
|
||||
public void testRepeatConstraintsTest()
|
||||
throws Exception
|
||||
{
|
||||
final Document schemaDocument = this.loadTestResourceDocument("xforms/unit-tests/repeat-constraints-test.xsd");
|
||||
final Document xformsDocument = Schema2XFormsTest.buildXForm(null, schemaDocument, "repeat-constraints-test");
|
||||
Schema2XFormsTest.assertRepeatProperties(xformsDocument,
|
||||
"/repeat-constraints-test/one-to-inf",
|
||||
new SchemaUtil.Occurrence(1, SchemaUtil.Occurrence.UNBOUNDED));
|
||||
Schema2XFormsTest.assertRepeatProperties(xformsDocument,
|
||||
"/repeat-constraints-test/zero-to-inf",
|
||||
new SchemaUtil.Occurrence(0, SchemaUtil.Occurrence.UNBOUNDED));
|
||||
Schema2XFormsTest.assertRepeatProperties(xformsDocument,
|
||||
"/repeat-constraints-test/one-to-five",
|
||||
new SchemaUtil.Occurrence(1, 5));
|
||||
Schema2XFormsTest.assertRepeatProperties(xformsDocument,
|
||||
"/repeat-constraints-test/three-to-five",
|
||||
new SchemaUtil.Occurrence(3, 5));
|
||||
Schema2XFormsTest.assertRepeatProperties(xformsDocument,
|
||||
"/repeat-constraints-test/zero-to-five",
|
||||
new SchemaUtil.Occurrence(0, 5));
|
||||
Schema2XFormsTest.assertRepeatProperties(xformsDocument,
|
||||
"/repeat-constraints-test/referenced-string",
|
||||
new SchemaUtil.Occurrence(1, SchemaUtil.Occurrence.UNBOUNDED));
|
||||
Schema2XFormsTest.assertRepeatProperties(xformsDocument,
|
||||
"/repeat-constraints-test/nested-outer-zero-to-inf",
|
||||
new SchemaUtil.Occurrence(0, SchemaUtil.Occurrence.UNBOUNDED));
|
||||
Schema2XFormsTest.assertRepeatProperties(xformsDocument,
|
||||
"/repeat-constraints-test/nested-outer-zero-to-inf/nested-zero-to-inf-inner-zero-to-inf",
|
||||
new SchemaUtil.Occurrence(0, SchemaUtil.Occurrence.UNBOUNDED));
|
||||
Schema2XFormsTest.assertRepeatProperties(xformsDocument,
|
||||
"/repeat-constraints-test/nested-outer-zero-to-inf/nested-zero-to-inf-inner-one-to-inf",
|
||||
new SchemaUtil.Occurrence(1, SchemaUtil.Occurrence.UNBOUNDED));
|
||||
Schema2XFormsTest.assertRepeatProperties(xformsDocument,
|
||||
"/repeat-constraints-test/nested-outer-one-to-inf",
|
||||
new SchemaUtil.Occurrence(1, SchemaUtil.Occurrence.UNBOUNDED));
|
||||
Schema2XFormsTest.assertRepeatProperties(xformsDocument,
|
||||
"/repeat-constraints-test/nested-outer-one-to-inf/nested-one-to-inf-inner-zero-to-inf",
|
||||
new SchemaUtil.Occurrence(0, SchemaUtil.Occurrence.UNBOUNDED));
|
||||
Schema2XFormsTest.assertRepeatProperties(xformsDocument,
|
||||
"/repeat-constraints-test/nested-outer-one-to-inf/nested-one-to-inf-inner-one-to-inf",
|
||||
new SchemaUtil.Occurrence(1, SchemaUtil.Occurrence.UNBOUNDED));
|
||||
Schema2XFormsTest.assertRepeatProperties(xformsDocument,
|
||||
"/repeat-constraints-test/nested-outer-three-to-five",
|
||||
new SchemaUtil.Occurrence(3, 5));
|
||||
Schema2XFormsTest.assertRepeatProperties(xformsDocument,
|
||||
"/repeat-constraints-test/nested-outer-three-to-five/nested-three-to-five-inner-zero-to-inf",
|
||||
new SchemaUtil.Occurrence(0, SchemaUtil.Occurrence.UNBOUNDED));
|
||||
Schema2XFormsTest.assertRepeatProperties(xformsDocument,
|
||||
"/repeat-constraints-test/nested-outer-three-to-five/nested-three-to-five-inner-one-to-inf",
|
||||
new SchemaUtil.Occurrence(1, SchemaUtil.Occurrence.UNBOUNDED));
|
||||
Schema2XFormsTest.assertRepeatProperties(xformsDocument,
|
||||
"/repeat-constraints-test/nested-outer-outer-three-to-inf",
|
||||
new SchemaUtil.Occurrence(3, SchemaUtil.Occurrence.UNBOUNDED));
|
||||
Schema2XFormsTest.assertRepeatProperties(xformsDocument,
|
||||
"/repeat-constraints-test/nested-outer-outer-three-to-inf/nested-outer-inner-five-to-inf",
|
||||
new SchemaUtil.Occurrence(5, SchemaUtil.Occurrence.UNBOUNDED));
|
||||
Schema2XFormsTest.assertRepeatProperties(xformsDocument,
|
||||
"/repeat-constraints-test/nested-outer-outer-three-to-inf/nested-outer-inner-five-to-inf/nested-inner-inner-seven-to-inf",
|
||||
new SchemaUtil.Occurrence(7, SchemaUtil.Occurrence.UNBOUNDED));
|
||||
this.runXForm(xformsDocument);
|
||||
}
|
||||
|
||||
public void testRootElementWithExtension()
|
||||
throws Exception
|
||||
{
|
||||
final Document schemaDocument = this.loadTestResourceDocument("xforms/unit-tests/root-element-with-extension-test.xsd");
|
||||
Document xformsDocument = Schema2XFormsTest.buildXForm(null, schemaDocument, "without-extension-test");
|
||||
this.runXForm(xformsDocument);
|
||||
assertEquals(3, xformsDocument.getElementsByTagNameNS(NamespaceConstants.XFORMS_NS, "input").getLength());
|
||||
|
||||
try
|
||||
{
|
||||
xformsDocument = Schema2XFormsTest.buildXForm(null, schemaDocument, "with-extension-test");
|
||||
fail("expected failure creating xform with root element with-extension-test in schema " + XMLUtil.toString(schemaDocument));
|
||||
}
|
||||
catch (FormBuilderException fbe)
|
||||
{
|
||||
LOGGER.debug("got expected exception " + fbe.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void testSwitch()
|
||||
throws Exception
|
||||
{
|
||||
final Document schemaDocument = this.loadTestResourceDocument("xforms/unit-tests/switch-test.xsd");
|
||||
final Document xformsDocument = Schema2XFormsTest.buildXForm(null, schemaDocument, "switch-test");
|
||||
this.runXForm(xformsDocument);
|
||||
// assertEquals(3, xformsDocument.getElementsByTagNameNS(NamespaceConstants.XFORMS_NS, "input").getLength());
|
||||
//
|
||||
// try
|
||||
// {
|
||||
// xformsDocument = Schema2XFormsTest.buildXForm(null, schemaDocument, "with-extension-test");
|
||||
// fail("expected failure creating xform with root element with-extension-test in schema " + XMLUtil.toString(schemaDocument));
|
||||
// }
|
||||
// catch (FormBuilderException fbe)
|
||||
// {
|
||||
// }
|
||||
}
|
||||
|
||||
public void testDerivedType()
|
||||
throws Exception
|
||||
{
|
||||
final Document schemaDocument = this.loadTestResourceDocument("xforms/unit-tests/derived-type-test.xsd");
|
||||
final Document xformsDocument = Schema2XFormsTest.buildXForm(null, schemaDocument, "derived-type-test");
|
||||
this.runXForm(xformsDocument);
|
||||
LOGGER.debug("generated xforms " + XMLUtil.toString(xformsDocument));
|
||||
assertBindProperties(xformsDocument,
|
||||
"/derived-type-test/raw-normalized-string",
|
||||
"normalizedString",
|
||||
"normalizedString");
|
||||
assertControlProperties(xformsDocument,
|
||||
"/derived-type-test/raw-normalized-string",
|
||||
NamespaceConstants.XFORMS_PREFIX + ":input");
|
||||
assertBindProperties(xformsDocument,
|
||||
"/derived-type-test/non-empty-normalized-string",
|
||||
"non-empty-normalized-string-type",
|
||||
"normalizedString");
|
||||
assertControlProperties(xformsDocument,
|
||||
"/derived-type-test/non-empty-normalized-string",
|
||||
NamespaceConstants.XFORMS_PREFIX + ":input");
|
||||
assertBindProperties(xformsDocument,
|
||||
"/derived-type-test/raw-string",
|
||||
"string",
|
||||
"string");
|
||||
assertControlProperties(xformsDocument,
|
||||
"/derived-type-test/raw-string",
|
||||
NamespaceConstants.XFORMS_PREFIX + ":textarea");
|
||||
assertBindProperties(xformsDocument,
|
||||
"/derived-type-test/non-empty-string",
|
||||
"non-empty-string-type",
|
||||
"string");
|
||||
assertControlProperties(xformsDocument,
|
||||
"/derived-type-test/non-empty-string",
|
||||
NamespaceConstants.XFORMS_PREFIX + ":textarea");
|
||||
assertBindProperties(xformsDocument,
|
||||
"/derived-type-test/raw-any-uri",
|
||||
"anyURI",
|
||||
"anyURI");
|
||||
assertControlProperties(xformsDocument,
|
||||
"/derived-type-test/raw-any-uri",
|
||||
NamespaceConstants.XFORMS_PREFIX + ":upload");
|
||||
assertBindProperties(xformsDocument,
|
||||
"/derived-type-test/non-empty-any-uri",
|
||||
"non-empty-any-uri-type",
|
||||
"anyURI");
|
||||
assertControlProperties(xformsDocument,
|
||||
"/derived-type-test/non-empty-any-uri",
|
||||
NamespaceConstants.XFORMS_PREFIX + ":upload");
|
||||
assertBindProperties(xformsDocument,
|
||||
"/derived-type-test/raw-decimal",
|
||||
"decimal",
|
||||
"decimal");
|
||||
assertControlProperties(xformsDocument,
|
||||
"/derived-type-test/raw-decimal",
|
||||
NamespaceConstants.XFORMS_PREFIX + ":input");
|
||||
try
|
||||
{
|
||||
assertBindProperties(xformsDocument,
|
||||
"/derived-type-test/non-zero-decimal",
|
||||
"non-zero-decimal-type",
|
||||
"decimal");
|
||||
fail("expected union type non-zero-decimal to fail");
|
||||
}
|
||||
catch (AssertionFailedError ignore)
|
||||
{
|
||||
}
|
||||
assertControlProperties(xformsDocument,
|
||||
"/derived-type-test/non-zero-decimal",
|
||||
NamespaceConstants.XFORMS_PREFIX + ":input");
|
||||
assertBindProperties(xformsDocument,
|
||||
"/derived-type-test/raw-positive-integer",
|
||||
"positiveInteger",
|
||||
"positiveInteger");
|
||||
Element control = assertControlProperties(xformsDocument,
|
||||
"/derived-type-test/raw-positive-integer",
|
||||
NamespaceConstants.XFORMS_PREFIX + ":input");
|
||||
assertEquals(0, Integer.parseInt(control.getAttributeNS(NamespaceService.ALFRESCO_URI, "fractionDigits")));
|
||||
|
||||
assertBindProperties(xformsDocument,
|
||||
"/derived-type-test/one-to-ten-positive-integer",
|
||||
"one-to-ten-positive-integer-type",
|
||||
"positiveInteger");
|
||||
control = assertControlProperties(xformsDocument,
|
||||
"/derived-type-test/one-to-ten-positive-integer",
|
||||
NamespaceConstants.XFORMS_PREFIX + ":range");
|
||||
assertEquals(1, Integer.parseInt(control.getAttributeNS(NamespaceConstants.XFORMS_NS, "start")));
|
||||
assertEquals(10, Integer.parseInt(control.getAttributeNS(NamespaceConstants.XFORMS_NS, "end")));
|
||||
assertEquals(0, Integer.parseInt(control.getAttributeNS(NamespaceService.ALFRESCO_URI, "fractionDigits")));
|
||||
|
||||
assertBindProperties(xformsDocument,
|
||||
"/derived-type-test/raw-boolean",
|
||||
"boolean",
|
||||
"boolean");
|
||||
assertControlProperties(xformsDocument,
|
||||
"/derived-type-test/raw-boolean",
|
||||
NamespaceConstants.XFORMS_PREFIX + ":select1");
|
||||
assertBindProperties(xformsDocument,
|
||||
"/derived-type-test/always-true-boolean",
|
||||
"always-true-boolean-type",
|
||||
"boolean");
|
||||
assertControlProperties(xformsDocument,
|
||||
"/derived-type-test/always-true-boolean",
|
||||
NamespaceConstants.XFORMS_PREFIX + ":select1");
|
||||
try
|
||||
{
|
||||
assertBindProperties(xformsDocument,
|
||||
"/derived-type-test/raw-any-type",
|
||||
"anyType",
|
||||
"anyType");
|
||||
fail("expected unexpected behavior for anyType");
|
||||
}
|
||||
catch (AssertionFailedError ignore)
|
||||
{
|
||||
}
|
||||
assertControlProperties(xformsDocument,
|
||||
"/derived-type-test/raw-any-type",
|
||||
NamespaceConstants.XFORMS_PREFIX + ":textarea");
|
||||
}
|
||||
|
||||
public void testRecursive()
|
||||
throws Exception
|
||||
{
|
||||
final Document schemaDocument = this.loadTestResourceDocument("xforms/unit-tests/recursive-test.xsd");
|
||||
Document xformsDocument = Schema2XFormsTest.buildXForm(null, schemaDocument, "non-recursive-test");
|
||||
this.runXForm(xformsDocument);
|
||||
try
|
||||
{
|
||||
xformsDocument = Schema2XFormsTest.buildXForm(null, schemaDocument, "recursive-test");
|
||||
fail("expected failure creating xform with recursive element definition root element recursive-test in schema " + XMLUtil.toString(schemaDocument));
|
||||
}
|
||||
catch (FormBuilderException fbe)
|
||||
{
|
||||
LOGGER.debug("got expected exception " + fbe.getMessage());
|
||||
}
|
||||
try
|
||||
{
|
||||
xformsDocument = Schema2XFormsTest.buildXForm(null, schemaDocument, "nested-recursive-test");
|
||||
fail("expected failure creating xform with recursive element definition root element nested-recursive-test in schema " + XMLUtil.toString(schemaDocument));
|
||||
}
|
||||
catch (FormBuilderException fbe)
|
||||
{
|
||||
LOGGER.debug("got expected exception " + fbe.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void testAnnotation()
|
||||
throws Exception
|
||||
{
|
||||
final Document schemaDocument = this.loadTestResourceDocument("xforms/unit-tests/annotation-test.xsd");
|
||||
Document xformsDocument = Schema2XFormsTest.buildXForm(null, schemaDocument, "annotation-test");
|
||||
this.runXForm(xformsDocument);
|
||||
System.err.println("generated xform " + XMLUtil.toString(xformsDocument));
|
||||
Element control = assertControlProperties(xformsDocument,
|
||||
"/annotation-test/upload_in_root",
|
||||
NamespaceConstants.XFORMS_PREFIX + ":upload");
|
||||
assertEquals("upload_in_root", control.getAttributeNS(NamespaceConstants.XFORMS_NS, "appearance"));
|
||||
control = assertControlProperties(xformsDocument,
|
||||
"/annotation-test/string_in_root",
|
||||
NamespaceConstants.XFORMS_PREFIX + ":textarea");
|
||||
assertEquals("string_in_root", control.getAttributeNS(NamespaceConstants.XFORMS_NS, "appearance"));
|
||||
|
||||
control = assertControlProperties(xformsDocument,
|
||||
"/annotation-test/struct_1/upload_in_base",
|
||||
NamespaceConstants.XFORMS_PREFIX + ":upload");
|
||||
assertEquals("upload_in_base", control.getAttributeNS(NamespaceConstants.XFORMS_NS, "appearance"));
|
||||
control = assertControlProperties(xformsDocument,
|
||||
"/annotation-test/struct_1/string_in_base",
|
||||
NamespaceConstants.XFORMS_PREFIX + ":textarea");
|
||||
assertEquals("string_in_base", control.getAttributeNS(NamespaceConstants.XFORMS_NS, "appearance"));
|
||||
|
||||
control = assertControlProperties(xformsDocument,
|
||||
"/annotation-test/struct_1/upload_in_struct",
|
||||
NamespaceConstants.XFORMS_PREFIX + ":upload");
|
||||
assertEquals("upload_in_struct", control.getAttributeNS(NamespaceConstants.XFORMS_NS, "appearance"));
|
||||
control = assertControlProperties(xformsDocument,
|
||||
"/annotation-test/struct_1/string_in_struct",
|
||||
NamespaceConstants.XFORMS_PREFIX + ":textarea");
|
||||
assertEquals("string_in_struct", control.getAttributeNS(NamespaceConstants.XFORMS_NS, "appearance"));
|
||||
}
|
||||
|
||||
public void testConstraint()
|
||||
throws Exception
|
||||
{
|
||||
final Document schemaDocument = this.loadTestResourceDocument("xforms/unit-tests/constraint-test.xsd");
|
||||
Document xformsDocument = Schema2XFormsTest.buildXForm(null, schemaDocument, "constraint-test");
|
||||
final ChibaBean chibaBean = this.runXForm(xformsDocument);
|
||||
final LinkedList<XMLEvent> events = new LinkedList<XMLEvent>();
|
||||
final EventListener el = new EventListener()
|
||||
{
|
||||
public void handleEvent(final Event e)
|
||||
{
|
||||
events.add((XMLEvent)e);
|
||||
}
|
||||
};
|
||||
((EventTarget)chibaBean.getXMLContainer().getDocumentElement()).addEventListener(XFormsEventNames.VALID, el, true);
|
||||
((EventTarget)chibaBean.getXMLContainer().getDocumentElement()).addEventListener(XFormsEventNames.INVALID, el, true);
|
||||
((EventTarget)chibaBean.getXMLContainer().getDocumentElement()).addEventListener(XFormsEventNames.SUBMIT_DONE, el, true);
|
||||
((EventTarget)chibaBean.getXMLContainer().getDocumentElement()).addEventListener(XFormsEventNames.SUBMIT_ERROR, el, true);
|
||||
|
||||
Element e = Schema2XFormsTest.resolveXFormsControl(xformsDocument, "/constraint-test/zip-pattern")[0];
|
||||
chibaBean.updateControlValue(e.getAttribute("id"), "not a zip");
|
||||
assertEquals(1, events.size());
|
||||
assertEquals(XFormsEventNames.INVALID, events.get(0).getType());
|
||||
events.clear();
|
||||
|
||||
chibaBean.updateControlValue(e.getAttribute("id"), "94110");
|
||||
assertEquals(1, events.size());
|
||||
assertEquals(XFormsEventNames.VALID, events.get(0).getType());
|
||||
events.clear();
|
||||
|
||||
e = Schema2XFormsTest.resolveXFormsControl(xformsDocument, "/constraint-test/email-pattern")[0];
|
||||
chibaBean.updateControlValue(e.getAttribute("id"), "iamnotanemailaddress");
|
||||
assertEquals(1, events.size());
|
||||
assertEquals(XFormsEventNames.INVALID, events.get(0).getType());
|
||||
events.clear();
|
||||
|
||||
chibaBean.updateControlValue(e.getAttribute("id"), "ariel.backenroth@alfresco.org");
|
||||
assertEquals(1, events.size());
|
||||
assertEquals(XFormsEventNames.VALID, events.get(0).getType());
|
||||
events.clear();
|
||||
|
||||
Element[] controls = Schema2XFormsTest.resolveXFormsControl(xformsDocument, "/constraint-test/repeated-zip-pattern/.");
|
||||
assertEquals(3 /* 2 actual + prototype */, controls.length);
|
||||
Element[] repeat = Schema2XFormsTest.resolveXFormsControl(xformsDocument, "/constraint-test/repeated-zip-pattern");
|
||||
assertEquals(4 /* 1 repeat + 3 triggers */, repeat.length);
|
||||
|
||||
final Element[] bindForRepeat = Schema2XFormsTest.resolveBind(xformsDocument, "/constraint-test/repeated-zip-pattern");
|
||||
assertEquals(bindForRepeat[bindForRepeat.length - 1].getAttribute("id"), repeat[0].getAttributeNS(NamespaceConstants.XFORMS_NS, "bind"));
|
||||
for (int i = 1; i <= Integer.parseInt(bindForRepeat[bindForRepeat.length - 1].getAttributeNS(NamespaceConstants.XFORMS_NS, "minOccurs")); i++)
|
||||
{
|
||||
chibaBean.updateRepeatIndex(repeat[0].getAttribute("id"), i);
|
||||
chibaBean.updateControlValue(controls[controls.length - 1].getAttribute("id"), "notavalidzip");
|
||||
}
|
||||
// assertEquals("unexpected events " + events, controls.length, events.size());
|
||||
for (final Event event : events)
|
||||
{
|
||||
assertEquals(XFormsEventNames.INVALID, event.getType());
|
||||
}
|
||||
events.clear();
|
||||
|
||||
chibaBean.dispatch("submit", DOMEventNames.ACTIVATE);
|
||||
assertEquals(1, events.size());
|
||||
assertEquals(XFormsEventNames.SUBMIT_ERROR, events.get(0).getType());
|
||||
events.clear();
|
||||
|
||||
for (final Element c : controls)
|
||||
{
|
||||
chibaBean.updateControlValue(c.getAttribute("id"), "07666");
|
||||
}
|
||||
// assertEquals("unexpected events " + events, controls.length, events.size());
|
||||
for (final Event event : events)
|
||||
{
|
||||
assertEquals(XFormsEventNames.VALID, event.getType());
|
||||
}
|
||||
events.clear();
|
||||
|
||||
chibaBean.dispatch("submit", DOMEventNames.ACTIVATE);
|
||||
assertEquals(1, events.size());
|
||||
assertEquals(XFormsEventNames.SUBMIT_DONE, events.get(0).getType());
|
||||
}
|
||||
|
||||
private static void assertRepeatProperties(final Document xformsDocument,
|
||||
final String nodeset,
|
||||
final SchemaUtil.Occurrence o)
|
||||
{
|
||||
final Element[] bindElements = Schema2XFormsTest.resolveBind(xformsDocument, nodeset);
|
||||
assertNotNull("unable to resolve bind for nodeset " + nodeset, bindElements);
|
||||
assertFalse("unable to resolve bind for nodeset " + nodeset, 0 == bindElements.length);
|
||||
final Element nodesetBindElement = bindElements[bindElements.length - 1];
|
||||
assertEquals("unexpected minimum value for nodeset " + nodeset,
|
||||
o.minimum,
|
||||
Integer.parseInt(nodesetBindElement.getAttributeNS(NamespaceConstants.XFORMS_NS, "minOccurs")));
|
||||
if (o.isUnbounded())
|
||||
{
|
||||
assertEquals("unexpected maximum value for nodeset " + nodeset,
|
||||
"unbounded",
|
||||
nodesetBindElement.getAttributeNS(NamespaceConstants.XFORMS_NS, "maxOccurs"));
|
||||
}
|
||||
else
|
||||
{
|
||||
assertEquals("unexpected maximum value for nodeset " + nodeset,
|
||||
o.maximum,
|
||||
Integer.parseInt(nodesetBindElement.getAttributeNS(NamespaceConstants.XFORMS_NS, "maxOccurs")));
|
||||
}
|
||||
assertEquals("unexpected required value for nodeset " + nodeset,
|
||||
(o.minimum != 0 && nodesetBindElement.hasAttributeNS(NamespaceConstants.XFORMS_NS, "type")) + "()",
|
||||
nodesetBindElement.getAttributeNS(NamespaceConstants.XFORMS_NS, "required"));
|
||||
|
||||
JXPathContext xpathContext = JXPathContext.newContext(xformsDocument);
|
||||
String xpath = "//*[@" + NamespaceConstants.XFORMS_PREFIX + ":bind='" + nodesetBindElement.getAttribute("id") + "']";
|
||||
assertEquals(4, xpathContext.selectNodes(xpath).size());
|
||||
xpath = ("//" + NamespaceConstants.XFORMS_PREFIX +
|
||||
":repeat[@" + NamespaceConstants.XFORMS_PREFIX +
|
||||
":bind='" + nodesetBindElement.getAttribute("id") + "']");
|
||||
assertEquals(1, xpathContext.selectNodes(xpath).size());
|
||||
xpath = ("//" + NamespaceConstants.XFORMS_PREFIX +
|
||||
":trigger[@" + NamespaceConstants.XFORMS_PREFIX +
|
||||
":bind='" + nodesetBindElement.getAttribute("id") + "']");
|
||||
assertEquals(3, xpathContext.selectNodes(xpath).size());
|
||||
|
||||
int nestingFactor = 1;
|
||||
for (int i = 0; i < bindElements.length - 1; i++)
|
||||
{
|
||||
final SchemaUtil.Occurrence parentO = Schema2XFormsTest.occuranceFromBind(bindElements[i]);
|
||||
if (parentO.isRepeated())
|
||||
{
|
||||
nestingFactor = nestingFactor * (1 + parentO.minimum);
|
||||
}
|
||||
}
|
||||
final Pointer instance0 = xpathContext.getPointer("//" + NamespaceConstants.XFORMS_PREFIX + ":instance[@id='instance_0']");
|
||||
assertNotNull(instance0);
|
||||
assertNotNull(instance0.getNode());
|
||||
xpathContext = xpathContext.getRelativeContext(instance0);
|
||||
xpath = nodeset.substring(1);
|
||||
assertEquals("unexpected result for instance nodeset " + xpath + " in " + instance0.getNode(),
|
||||
nestingFactor * (o.minimum + 1),
|
||||
xpathContext.selectNodes(xpath).size());
|
||||
xpath = nodeset.substring(1) + "[@" + NamespaceService.ALFRESCO_PREFIX + ":prototype='true']";
|
||||
assertEquals("unexpected result for instance prototype nodeset " + nodeset + " in " + instance0.getNode(),
|
||||
nestingFactor,
|
||||
xpathContext.selectNodes(xpath).size());
|
||||
}
|
||||
|
||||
private static Element assertBindProperties(final Document xformsDocument,
|
||||
final String nodeset,
|
||||
final String schemaType,
|
||||
final String builtInType)
|
||||
{
|
||||
final Element[] binds = Schema2XFormsTest.resolveBind(xformsDocument, nodeset);
|
||||
assertEquals("unexpected type for nodeset " + nodeset,
|
||||
schemaType,
|
||||
binds[binds.length - 1].getAttributeNS(NamespaceConstants.XFORMS_NS, "type"));
|
||||
assertEquals("unexpected built in type for nodeset " + nodeset,
|
||||
builtInType,
|
||||
binds[binds.length - 1].getAttributeNS(NamespaceService.ALFRESCO_URI, "builtInType"));
|
||||
return binds[binds.length - 1];
|
||||
}
|
||||
|
||||
private static Element assertControlProperties(final Document xformsDocument,
|
||||
final String nodeset,
|
||||
final String controlType)
|
||||
{
|
||||
final Element[] controls = Schema2XFormsTest.resolveXFormsControl(xformsDocument, nodeset);
|
||||
assertEquals("unexpected xforms control for " + nodeset,
|
||||
controlType,
|
||||
controls[controls.length - 1].getNodeName());
|
||||
return controls[controls.length - 1];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the resolved bind and all parents binds for the nodeset.
|
||||
*/
|
||||
private static Element[] resolveBind(final Document xformsDocument, final String nodeset)
|
||||
{
|
||||
JXPathContext xpathContext = JXPathContext.newContext(xformsDocument);
|
||||
assertNotNull(nodeset);
|
||||
assertEquals('/', nodeset.charAt(0));
|
||||
final String rootNodePath = nodeset.replaceFirst("(\\/[^\\/]+).*", "$1");
|
||||
assertNotNull(rootNodePath);
|
||||
String xpath = ("//" + NamespaceConstants.XFORMS_PREFIX +
|
||||
":bind[@" + NamespaceConstants.XFORMS_PREFIX +
|
||||
":nodeset='" + rootNodePath + "']");
|
||||
Pointer pointer = xpathContext.getPointer(xpath);
|
||||
assertNotNull("unable to resolve xpath for root node " + xpath, pointer);
|
||||
assertNotNull("unable to resolve xpath for root node " + xpath, pointer.getNode());
|
||||
if (nodeset.equals(rootNodePath))
|
||||
{
|
||||
return new Element[] { (Element)pointer.getNode() };
|
||||
}
|
||||
xpathContext = xpathContext.getRelativeContext(pointer);
|
||||
// substring the path to the next slash and split it
|
||||
final LinkedList<Element> result = new LinkedList<Element>();
|
||||
result.add((Element)pointer.getNode());
|
||||
for (String p : nodeset.substring(rootNodePath.length() + 1).split("/"))
|
||||
{
|
||||
xpath = NamespaceConstants.XFORMS_PREFIX + ":bind[starts-with(@" + NamespaceConstants.XFORMS_PREFIX + ":nodeset, '" + p + "')]";
|
||||
pointer = xpathContext.getPointer(xpath);
|
||||
assertNotNull("unable to resolve path " + xpath +
|
||||
" on bind with nodeset " + result.getLast().getAttributeNS(NamespaceConstants.XFORMS_NS, "nodeset"),
|
||||
pointer);
|
||||
assertNotNull("unable to resolve path " + xpath +
|
||||
" on bind with nodeset " + result.getLast().getAttributeNS(NamespaceConstants.XFORMS_NS, "nodeset"),
|
||||
pointer.getNode());
|
||||
xpathContext = xpathContext.getRelativeContext(pointer);
|
||||
result.add((Element)pointer.getNode());
|
||||
}
|
||||
return (Element[])result.toArray(new Element[result.size()]);
|
||||
}
|
||||
|
||||
private static Element[] resolveXFormsControl(final Document xformsDocument,
|
||||
final String nodeset)
|
||||
{
|
||||
final Element[] binds = Schema2XFormsTest.resolveBind(xformsDocument, nodeset);
|
||||
assertNotNull(binds);
|
||||
assertFalse(binds.length == 0);
|
||||
final String bindId = binds[binds.length - 1].getAttribute("id");
|
||||
|
||||
final JXPathContext xpathContext = JXPathContext.newContext(xformsDocument);
|
||||
String xpath = "//*[@" + NamespaceConstants.XFORMS_PREFIX + ":bind='" + bindId + "']";
|
||||
return (Element[])xpathContext.selectNodes(xpath).toArray(new Element[0]);
|
||||
}
|
||||
|
||||
private Document loadTestResourceDocument(final String path)
|
||||
throws IOException, SAXException
|
||||
{
|
||||
File f = new File(this.getResourcesDir());
|
||||
for (final String p : path.split("/"))
|
||||
{
|
||||
f = new File(f, p);
|
||||
}
|
||||
return XMLUtil.parse(f);
|
||||
}
|
||||
|
||||
private ChibaBean runXForm(final Document xformsDocument)
|
||||
throws Exception
|
||||
{
|
||||
final ChibaBean chibaBean = new ChibaBean();
|
||||
String webResourceDir = System.getProperty("alfresco.web.resources.dir",
|
||||
this.getResourcesDir() + File.separator + ".." + File.separator + "web");
|
||||
chibaBean.setConfig(webResourceDir + File.separator +
|
||||
"WEB-INF" + File.separator + "chiba.xml");
|
||||
chibaBean.setXMLContainer(xformsDocument);
|
||||
chibaBean.init();
|
||||
return chibaBean;
|
||||
}
|
||||
|
||||
private static Document buildXForm(final Document instanceDocument,
|
||||
final Document schemaDocument,
|
||||
final String rootElementName)
|
||||
throws FormBuilderException
|
||||
{
|
||||
final Schema2XForms s2xf = new Schema2XForms("/test_action",
|
||||
Schema2XForms.SubmitMethod.POST,
|
||||
"echo://fake.base.url", true);
|
||||
return s2xf.buildXForm(instanceDocument,
|
||||
schemaDocument,
|
||||
rootElementName,
|
||||
new ResourceBundle()
|
||||
{
|
||||
public Object handleGetObject(final String key)
|
||||
{
|
||||
if (key == null)
|
||||
{
|
||||
throw new NullPointerException();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public Enumeration<String> getKeys()
|
||||
{
|
||||
return new Vector<String>().elements();
|
||||
}
|
||||
}).getFirst();
|
||||
}
|
||||
|
||||
private static SchemaUtil.Occurrence occuranceFromBind(final Element bindElement)
|
||||
{
|
||||
return new SchemaUtil.Occurrence(bindElement.hasAttributeNS(NamespaceConstants.XFORMS_NS, "minOccurs")
|
||||
? Integer.parseInt(bindElement.getAttributeNS(NamespaceConstants.XFORMS_NS, "minOccurs"))
|
||||
: 1,
|
||||
bindElement.hasAttributeNS(NamespaceConstants.XFORMS_NS, "maxOccurs")
|
||||
? ("unbounded".equals(bindElement.getAttributeNS(NamespaceConstants.XFORMS_NS, "maxOccurs"))
|
||||
? SchemaUtil.Occurrence.UNBOUNDED
|
||||
: Integer.parseInt(bindElement.getAttributeNS(NamespaceConstants.XFORMS_NS, "maxOccurs")))
|
||||
: 1);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user