[jboss-dev-forums] [Design of JBossXB] - Re: GenericObjectModelProvider not setting attributes in XML

info@connext.co.za do-not-reply at jboss.com
Thu Aug 31 03:04:36 EDT 2006


Good Day,

I got the source from common/jbossxb and that seems to have the change to fix the attributes.

The problem is that when I add a handler for an element text then that xml node is duplicated, once without the text element and once with.


  | <?xml version="1.0" encoding="UTF-8"?>
  | <!DOCTYPE policy PUBLIC "-//JBoss//DTD JBOSS Security Config 3.0//EN" "http://www.jboss.org/j2ee/dtd/security_config.dtd">
  | 
  | <policy>
  |    <application-policy name="other">
  |       <authentication>
  |          <login-module flag="required" code="org.jboss.security.auth.spi.LdapExtLoginModule">
  |             <module-option name="bindCredentials"></module-option>
  |             <module-option name="java.naming.provider.url"></module-option>
  |          </login-module>
  |       </authentication>
  |    </application-policy>
  |    <application-policy name="test">
  |       <authentication>
  |          <login-module flag="required" code="org.jboss.security.auth.spi.LdapExtLoginModule">
  |             <module-option name="bindCredentials"></module-option>
  |             <module-option name="java.naming.provider.url"></module-option>
  |          </login-module>
  |       </authentication>
  |    </application-policy>
  | </policy>
  | 

I have written a testcase to help with the fixing of the issue. The testcase has a dependancy on jbosssx.jar.

Here is my ObjectModelProvider


  | package org.jboss.xb.test;
  | 
  | import java.util.ArrayList;
  | import java.util.Arrays;
  | import java.util.HashMap;
  | import java.util.List;
  | import java.util.Map;
  | import java.util.Set;
  | 
  | import javax.security.auth.login.AppConfigurationEntry;
  | import javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag;
  | 
  | import org.jboss.security.auth.login.AuthenticationInfo;
  | import org.jboss.security.auth.login.PolicyConfig;
  | import org.jboss.xb.binding.MarshallingContext;
  | import org.jboss.xb.binding.ObjectModelProvider;
  | 
  | /**
  |  * @author Mark Ashworth 
  |  * @version 1.0.0
  |  */
  | public class LoginConfigObjectModelProvider implements ObjectModelProvider {
  | 	/**
  | 	 * Used to simulate the authentication node
  |   	 */
  | 	static class Authentication {
  | 		public List<AppConfigurationEntry> entries;
  | 		public Authentication(List<AppConfigurationEntry> entries) {
  | 			this.entries = entries;
  | 		}
  | 	}
  | 	/**
  | 	 * ROOT: policy
  | 	 */
  | 	public Object getRoot(
  | 			Object o, 
  | 			MarshallingContext ctx,
  | 			String namespaceURI, 
  | 			String localName) {
  | 		
  | 		return o;
  | 	}
  | 	/**
  | 	 * application-policy
  | 	 */
  | 	public Object getChildren(
  | 			PolicyConfig policyConfig, 
  | 			String namespaceUri, 
  | 			String localName) {
  | 		
  | 		List<AuthenticationInfo> infos = new ArrayList<AuthenticationInfo>();
  | 		Set<String> keys = policyConfig.getConfigNames();
  | 		for (String name : keys) {
  | 			infos.add(policyConfig.get(name));
  | 		}
  | 		return infos;
  | 	}
  | 	/**
  | 	 * application-policy name
  | 	 */
  | 	public Object getAttributeValue(
  | 			AuthenticationInfo authInfo, 
  | 			String namespaceUri, 
  | 			String localName) {
  | 	      
  | 		Object value = null;
  | 		if ("name".equals(localName)) {
  | 	         value = authInfo.getName();
  | 		}
  | 	    
  | 		return value;
  | 	}
  | 	/**
  | 	 * authentication
  | 	 */
  | 	public Object getChildren(
  | 			AuthenticationInfo authInfo, 
  | 			String namespaceUri, 
  | 			String localName) {
  | 		
  | 		return new Authentication(Arrays.asList((authInfo.getAppConfigurationEntry())));
  | 	}
  | 	/**
  | 	 * login-module
  | 	 */
  | 	public Object getChildren(
  | 			Authentication authentication,
  | 			String namespaceUri,
  | 			String localName) {
  | 		
  | 		return authentication.entries;
  | 	}
  | 	/**
  | 	 * login-module code flag
  | 	 */
  | 	public Object getAttributeValue(
  | 			AppConfigurationEntry entry, 
  | 			String namespaceUri, 
  | 			String localName) {
  | 		
  | 		Object value = null;
  | 		if ("code".equals(localName)) {
  | 	         value = entry.getLoginModuleName();
  | 		} else if ("flag".equals(localName)) {
  | 			
  | 			if (entry.getControlFlag() == LoginModuleControlFlag.OPTIONAL) {
  | 				value = "optional";
  | 			} else if (entry.getControlFlag() == LoginModuleControlFlag.REQUIRED) {
  | 				value = "required";
  | 			} else if (entry.getControlFlag() == LoginModuleControlFlag.REQUISITE) {
  | 				value = "requisite";
  | 			} else if (entry.getControlFlag() == LoginModuleControlFlag.SUFFICIENT) {
  | 				value = "sufficient";
  | 			} else{
  | 				value = "";
  | 			}
  | 		} 
  | 	    
  | 		return value;
  | 	}
  | 	/**
  | 	 * module-option
  | 	 */
  | 	public Object getChildren(
  | 			AppConfigurationEntry entry, 
  | 			String namespaceUri, 
  | 			String localName) {
  | 
  | 		Map<String, ModuleOption> options = new HashMap<String, ModuleOption>();
  | 		
  | 		Set<String> keys = entry.getOptions().keySet();
  | 		for (String key : keys) {
  | 			Object value = entry.getOptions().get(key);
  | 			options.put(key, new ModuleOption(key, value));
  | 		}
  | 		
  | 		return options.values();
  | 	}
  | 	/**
  | 	 * module-option name
  | 	 */
  | 	public Object getAttributeValue(
  | 			ModuleOption moduleOption, 
  | 			String namespaceUri, 
  | 			String localName) {
  | 	      
  | 		Object value = null;
  | 		if ("name".equals(localName)) {
  | 	         value = moduleOption.getName();
  | 		}
  | 	    
  | 		return value;
  | 	}
  | 	/**
  | 	 * module-option text
  | 	 */
  | //	public Object getElementValue(
  | //			ModuleOption moduleOption, 
  | //			String namespaceUri,
  | //			String localName) {
  | //		
  | //		return moduleOption.getValue();
  | //	}
  | }
  | 


  | package org.jboss.xb.test;
  | 
  | import java.io.Serializable;
  | 
  | /**
  |  * @author Mark Ashworth 
  |  * @version 1.0.0
  |  */
  | public class ModuleOption implements Serializable {
  | 	/** Serial version id*/
  | 	private static final long serialVersionUID = 2105836972498754806L;
  | 	
  | 	private String name;
  | 	private Object value = "";
  | 	/**
  | 	 * Constructs an option with a null value
  | 	 * @param name The name of the option
  | 	 */
  | 	public ModuleOption(String name) {
  | 		this.name = name;
  | 	}
  | 	/**
  | 	 * Constructs an option with a null value
  | 	 * @param name The name of the option
  | 	 * @param value The value of the option
  | 	 */
  | 	public ModuleOption(String name, Object value) {
  | 		this.name = name;
  | 		this.value = value;
  | 	}
  | 	/**
  | 	 * Returns the option name
  | 	 * @return The name of the option
  | 	 */
  | 	public String getName() {
  | 		return name;
  | 	}
  | 	/**
  | 	 * Returns the option value
  | 	 * @return The value of the option
  | 	 */
  | 	public Object getValue() {
  | 		return value;
  | 	}
  | 	/**
  | 	 * Sets the option value
  | 	 * @param value The value of the option
  | 	 */
  | 	public void setValue(Object value) {
  | 		this.value = value;
  | 	}
  | 	/**
  | 	 * Returns whether the option is a password / credential
  | 	 * @return boolean
  | 	 */
  | 	public boolean isPassword() {
  | 		if (getName() == null) {
  | 			return false;
  | 		}
  | 		String value = getName().toUpperCase();
  | 		if (value.indexOf("PASSWORD") >= 0) {
  | 			return true;
  | 		}
  | 		if (value.indexOf("PWD") >= 0) {
  | 			return true;
  | 		}
  | 		if (value.indexOf("CREDENTIAL") >= 0) {
  | 			return true;
  | 		}
  | 		return false;
  | 	}
  | }
  | 
  | 

  | package org.jboss.xb.test;
  | 
  | import java.io.StringWriter;
  | import java.util.HashMap;
  | import java.util.Map;
  | 
  | import javax.security.auth.login.AppConfigurationEntry;
  | import javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag;
  | 
  | import junit.framework.TestCase;
  | 
  | import org.jboss.security.auth.login.AuthenticationInfo;
  | import org.jboss.security.auth.login.PolicyConfig;
  | import org.jboss.security.auth.spi.LdapExtLoginModule;
  | import org.jboss.xb.binding.AbstractMarshaller;
  | import org.jboss.xb.binding.DtdMarshaller;
  | import org.jboss.xb.binding.Marshaller;
  | 
  | public class TestPolicyConfigMarshalling extends TestCase {
  | 
  | 	public void testMarshal() throws Exception {
  | 		
  | 		/*
  | 		 * Create the PolicyConfig Object
  | 		 */
  | 		Map<String, Object> options = new HashMap<String, Object>();
  | 		options.put("bindCredentials", "password");
  | 		options.put("java.naming.provider.url", "ldap://localhost:389");
  | 		
  | 		AuthenticationInfo[] authInfos = new AuthenticationInfo[2];
  | 		authInfos[0] = new AuthenticationInfo("other");
  | 		authInfos[0].addAppConfigurationEntry(
  | 				new AppConfigurationEntry(LdapExtLoginModule.class.getName(),
  | 				LoginModuleControlFlag.REQUIRED, options));
  | 		
  | 		authInfos[1] = new AuthenticationInfo("test");
  | 		authInfos[1].addAppConfigurationEntry(
  | 				new AppConfigurationEntry(LdapExtLoginModule.class.getName(),
  | 				LoginModuleControlFlag.REQUIRED, options));
  | 		
  | 		
  | 		PolicyConfig config = new PolicyConfig();
  | 		config.add(authInfos[0]);
  | 		config.add(authInfos[1]);
  | 		
  | 		/*
  | 		 * Marshal the PolicyConfig to XML using the DTD
  | 		 */
  | 		StringWriter xmlOutput = new StringWriter();
  | 
  | 		System.setProperty(Marshaller.PROP_MARSHALLER, DtdMarshaller.class
  | 				.getName());
  | 
  | 		AbstractMarshaller marshaller = (AbstractMarshaller) Marshaller.FACTORY
  | 				.getInstance();
  | 
  | 		marshaller.mapPublicIdToSystemId(
  | 				"-//JBoss//DTD JBOSS Security Config 3.0//EN",
  | 				"http://www.jboss.org/j2ee/dtd/security_config.dtd");
  | 		LoginConfigObjectModelProvider provider = new LoginConfigObjectModelProvider();
  | 		marshaller.marshal("http://www.jboss.org/j2ee/dtd/security_config.dtd",
  | 				provider, config, xmlOutput);
  | 
  | 		System.out.println(xmlOutput.getBuffer());
  | 	}
  | }
  | 
  | 

I could probably attach the files to the Jira task once it is created.

Regards,
Mark P Ashworth

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3968544#3968544

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3968544



More information about the jboss-dev-forums mailing list