Author: ddewolf Date: Thu Nov 9 06:29:02 2006 New Revision: 472913 URL: http://svn.apache.org/viewvc?view=rev&rev=472913 Log: Beginning to flush out the mutable container api
Added: struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/mgmt/ struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/mgmt/MutableTilesContainer.java (with props) struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/mgmt/TileDefinition.java (with props) struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/CachingTilesContainer.java (with props) struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/DefinitionManager.java (with props) Modified: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/definition/ComponentDefinition.java struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/definition/digester/DigesterDefinitionsReader.java struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/taglib/definition/DefinitionTag.java struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/taglib/definition/DefinitionTagSupport.java struts/sandbox/trunk/tiles/tiles-test/src/main/webapp/index.jsp Added: struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/mgmt/MutableTilesContainer.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/mgmt/MutableTilesContainer.java?view=auto&rev=472913 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/mgmt/MutableTilesContainer.java (added) +++ struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/mgmt/MutableTilesContainer.java Thu Nov 9 06:29:02 2006 @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.tiles.mgmt; + +import org.apache.tiles.TilesContainer; +import org.apache.tiles.TilesException; + +/** + * Defines a mutable version of the TilesContainer. + * + * @since Tiles 2.0 + * @version $Rev$ + */ +public interface MutableTilesContainer extends TilesContainer { + + /** + * Register a new definition with the container. + * @param definition + */ + void register(TileDefinition definition) throws TilesException; + +} Propchange: struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/mgmt/MutableTilesContainer.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/mgmt/MutableTilesContainer.java ------------------------------------------------------------------------------ svn:keywords = Id Author Date Rev Added: struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/mgmt/TileDefinition.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/mgmt/TileDefinition.java?view=auto&rev=472913 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/mgmt/TileDefinition.java (added) +++ struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/mgmt/TileDefinition.java Thu Nov 9 06:29:02 2006 @@ -0,0 +1,174 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.tiles.mgmt; + +import org.apache.tiles.ComponentAttribute; + +import java.util.Map; + +/** + * Data transfer object used for registering new + * definitions with the Container. + * + * @since Tiles 2.0 + * @version $Rev$ + * + */ +public class TileDefinition { + /** + * Extends attribute value. + */ + protected String inherit; + /** + * TileDefinition name + */ + protected String name = null; + /** + * Template path. + */ + protected String template = null; + /** + * Attributes defined for the component. + */ + protected Map<String, ComponentAttribute> attributes = null; + /** + * Role associated to definition. + */ + protected String role = null; + /** + * Associated ViewPreparer URL or classname, if defined + */ + protected String preparer = null; + + + /** + * Access method for the name property. + * + * @return the current value of the name property + */ + public String getName() { + return name; + } + + /** + * Sets the value of the name property. + * + * @param aName the new value of the name property + */ + public void setName(String aName) { + name = aName; + } + + /** + * Access method for the template property. + * + * @return the current value of the template property + */ + public String getTemplate() { + return template; + } + + /** + * Sets the value of the template property. + * + * @param template the new value of the path property + */ + public void setTemplate(String template) { + this.template = template; + } + + /** + * Access method for the role property. + * + * @return the current value of the role property + */ + public String getRole() { + return role; + } + + /** + * Sets the value of the role property. + * + * @param role the new value of the path property + */ + public void setRole(String role) { + this.role = role; + } + + /** + * Access method for the attributes property. + * If there is no attributes, return an empty map. + * + * @return the current value of the attributes property + */ + public Map<String, ComponentAttribute> getAttributes() { + return attributes; + } + + /** + * Returns the value of the named attribute as an Object, or null if no + * attribute of the given name exists. + * + * @param key name of the attribute + * @return requested attribute or null if not found + */ + public Object getAttribute(String key) { + ComponentAttribute attribute = attributes.get(key); + if (attribute != null) { + return attribute.getValue(); + } else { + return null; + } + } + + /** + * Get associated preparerInstance + */ + public String getPreparer() { + return preparer; + } + + /** + * Set associated preparerInstance URL. + * + * @param url Url called locally + */ + public void setPreparer(String url) { + this.preparer = url; + } + + /** + * Set extends. + * + * @param name Name of the extended definition. + */ + public void setExtends(String name) { + inherit = name; + } + + /** + * Get extends. + * + * @return Name of the extended definition. + */ + public String getExtends() { + return inherit; + } +} Propchange: struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/mgmt/TileDefinition.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: struts/sandbox/trunk/tiles/tiles-api/src/main/java/org/apache/tiles/mgmt/TileDefinition.java ------------------------------------------------------------------------------ svn:keywords = Id Author Date Rev Modified: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/definition/ComponentDefinition.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/definition/ComponentDefinition.java?view=diff&rev=472913&r1=472912&r2=472913 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/definition/ComponentDefinition.java (original) +++ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/definition/ComponentDefinition.java Thu Nov 9 06:29:02 2006 @@ -23,22 +23,18 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.tiles.ComponentAttribute; +import org.apache.tiles.mgmt.TileDefinition; import java.io.Serializable; import java.util.HashMap; import java.util.Map; /** - * Definition of a template / component attributes. + * TileDefinition of a template / component attributes. * Attributes of a component can be defined with the help of this class. * An instance of this class can be used as a bean, and passed to 'insert' tag. */ -public class ComponentDefinition implements Serializable { - - /** - * Extends attribute value. - */ - private String inherit; +public class ComponentDefinition extends TileDefinition implements Serializable { /** * Commons Logging instance. @@ -46,31 +42,6 @@ protected static Log log = LogFactory.getLog(ComponentDefinition.class); /** - * Definition name - */ - protected String name = null; - - /** - * Template path. - */ - protected String template = null; - - /** - * Attributes defined for the component. - */ - protected Map<String, ComponentAttribute> attributes = null; - - /** - * Role associated to definition. - */ - protected String role = null; - - /** - * Associated ViewPreparer URL or classname, if defined - */ - protected String preparer = null; - - /** * Used for resolving inheritance. */ private boolean isVisited = false; @@ -88,9 +59,9 @@ * Do a shallow copy : attributes are shared between copies, but not the Map * containing attributes. */ - public ComponentDefinition(ComponentDefinition definition) { + public ComponentDefinition(TileDefinition definition) { attributes = new HashMap<String, ComponentAttribute>( - definition.getAttributes()); + definition.getAttributes()); this.name = definition.getName(); this.template = definition.getTemplate(); this.role = definition.getRole(); @@ -101,93 +72,13 @@ * Constructor. */ public ComponentDefinition(String name, String template, - Map<String, ComponentAttribute> attributes) { + Map<String, ComponentAttribute> attributes) { this.name = name; this.template = template; this.attributes = attributes; } /** - * Access method for the name property. - * - * @return the current value of the name property - */ - public String getName() { - return name; - } - - /** - * Sets the value of the name property. - * - * @param aName the new value of the name property - */ - public void setName(String aName) { - name = aName; - } - - /** - * Access method for the template property. - * - * @return the current value of the template property - */ - public String getTemplate() { - return template; - } - - /** - * Sets the value of the template property. - * - * @param template the new value of the path property - */ - public void setTemplate(String template) { - this.template = template; - } - - /** - * Access method for the role property. - * - * @return the current value of the role property - */ - public String getRole() { - return role; - } - - /** - * Sets the value of the role property. - * - * @param role the new value of the path property - */ - public void setRole(String role) { - this.role = role; - } - - /** - * Access method for the attributes property. - * If there is no attributes, return an empty map. - * - * @return the current value of the attributes property - */ - public Map<String, ComponentAttribute> getAttributes() { - return attributes; - } - - /** - * Returns the value of the named attribute as an Object, or null if no - * attribute of the given name exists. - * - * @param key name of the attribute - * @return requested attribute or null if not found - */ - public Object getAttribute(String key) { - ComponentAttribute attribute = attributes.get(key); - if (attribute != null) { - return attribute.getValue(); - } else { - return null; - } - } - - /** * Put a new attribute in this component * * @param key String key for attribute @@ -211,10 +102,10 @@ /** * Put an attribute in template definition. * Attribute can be used as content for tag get. - * @param name Attribute name + * + * @param name Attribute name * @param content Attribute value - * @param direct Determines how content is handled by get tag: true means content is printed directly; false, the default, means content is included - * @param role Determine if content is used by get tag. If user is in role, content is used. + * @param role Determine if content is used by get tag. If user is in role, content is used. */ public void put(String name, Object content, String role) { put(name, content, null, role); @@ -255,22 +146,6 @@ } /** - * Get associated preparerInstance - */ - public String getPreparer() { - return preparer; - } - - /** - * Set associated preparerInstance URL. - * - * @param url Url called locally - */ - public void setPreparer(String url) { - this.preparer = url; - } - - /** * Add an attribute to this component. * <p/> * This method is used by Digester to load definitions. @@ -279,24 +154,6 @@ */ public void addAttribute(ComponentAttribute attribute) { putAttribute(attribute.getName(), attribute); - } - - /** - * Set extends. - * - * @param name Name of the extended definition. - */ - public void setExtends(String name) { - inherit = name; - } - - /** - * Get extends. - * - * @return Name of the extended definition. - */ - public String getExtends() { - return inherit; } /** Modified: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/definition/digester/DigesterDefinitionsReader.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/definition/digester/DigesterDefinitionsReader.java?view=diff&rev=472913&r1=472912&r2=472913 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/definition/digester/DigesterDefinitionsReader.java (original) +++ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/definition/digester/DigesterDefinitionsReader.java Thu Nov 9 06:29:02 2006 @@ -227,7 +227,7 @@ digester.addSetProperties(PUT_TAG); digester.addSetNext(PUT_TAG, "addAttribute", putAttributeHandlerClass); digester.addCallMethod(PUT_TAG, "setBody", 0); - // Definition level list rules + // TileDefinition level list rules // This is rules for lists nested in a definition digester.addObjectCreate(DEF_LIST_TAG, listHandlerClass); digester.addSetProperties(DEF_LIST_TAG); Added: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/CachingTilesContainer.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/CachingTilesContainer.java?view=auto&rev=472913 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/CachingTilesContainer.java (added) +++ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/CachingTilesContainer.java Thu Nov 9 06:29:02 2006 @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.tiles.impl.mgmt; + +import org.apache.tiles.TilesException; +import org.apache.tiles.definition.ComponentDefinition; +import org.apache.tiles.impl.BasicTilesContainer; +import org.apache.tiles.mgmt.TileDefinition; +import org.apache.tiles.mgmt.MutableTilesContainer; + +/** + * Mutable container which caches (in memory) the definitions + * registered to it. If a definition is not found in cache, it + * will revert back to it's definitions factory. + * + * @since Tiles 2.0 + * @version $Rev$ + */ +public class CachingTilesContainer extends BasicTilesContainer + implements MutableTilesContainer { + + private DefinitionManager mgr = new DefinitionManager(); + + public void register(TileDefinition definition) + throws TilesException { + ComponentDefinition def = new ComponentDefinition(definition); + mgr.addDefinition(def); + } + +} Propchange: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/CachingTilesContainer.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/CachingTilesContainer.java ------------------------------------------------------------------------------ svn:keywords = Id Author Date Rev Added: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/DefinitionManager.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/DefinitionManager.java?view=auto&rev=472913 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/DefinitionManager.java (added) +++ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/DefinitionManager.java Thu Nov 9 06:29:02 2006 @@ -0,0 +1,141 @@ +package org.apache.tiles.impl.mgmt; + +import org.apache.tiles.ComponentAttribute; +import org.apache.tiles.context.TilesRequestContext; +import org.apache.tiles.definition.ComponentDefinition; +import org.apache.tiles.definition.DefinitionsFactory; +import org.apache.tiles.definition.DefinitionsFactoryException; +import org.apache.tiles.definition.NoSuchDefinitionException; +import org.apache.tiles.mgmt.TileDefinition; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.util.HashMap; +import java.util.Map; + +public class DefinitionManager { + + private static final Log LOG = + LogFactory.getLog(DefinitionManager.class); + + private Map<String, ComponentDefinition> definitions; + private DefinitionsFactory factory; + + public DefinitionManager() { + definitions = new HashMap<String, ComponentDefinition>(); + } + + + public DefinitionsFactory getFactory() { + return factory; + } + + public void setFactory(DefinitionsFactory factory) { + this.factory = factory; + } + + public ComponentDefinition getDefinition(String definition, TilesRequestContext request) + throws DefinitionsFactoryException { + if (definitions.containsKey(definition)) { + return definitions.get(definition); + } + return getFactory().getDefinition(definition, request); + } + + public void addDefinition(ComponentDefinition definition) { + validate(definition); + + if(definition.getExtends() != null) { + } + + definitions.put(definition.getName(), definition); + } + + private void validate(TileDefinition definition) { + Map<String, ComponentAttribute> attrs = definition.getAttributes(); + for (ComponentAttribute attribute : attrs.values()) { + if (attribute.getName() == null) { + throw new IllegalArgumentException("Attribute name not defined"); + } + + if (attribute.getValue() == null) { + throw new IllegalArgumentException("Attribute value not defined"); + } + } + } + + /** + * Resolve inheritance. + * First, resolve parent's inheritance, then set template to the parent's + * template. + * Also copy attributes setted in parent, and not set in child + * If instance doesn't extend anything, do nothing. + * + * @throws NoSuchDefinitionException If an inheritance can not be solved. + * @param definition def + */ + protected void resolveInheritance(ComponentDefinition definition) + throws DefinitionsFactoryException { + // Already done, or not needed ? + if (definition.isIsVisited() || !definition.isExtending()) + return; + + if (LOG.isDebugEnabled()) + LOG.debug("Resolve definition for child name='" + + definition.getName() + + "' extends='" + definition.getExtends() + "'."); + + // Set as visited to avoid endless recurisvity. + definition.setIsVisited(true); + + // TODO Factories our factory implementations will be context agnostic, + // however, this may cause errors for other implementations. + // we should probably make all factories agnostic and allow the manager to + // utilize the correct factory based on the context. + ComponentDefinition parent = getDefinition(definition.getExtends(), null); + + + if (parent == null) { // error + String msg = "Error while resolving definition inheritance: child '" + + definition.getName() + + "' can't find its ancestor '" + + definition.getExtends() + + "'. Please check your description file."; + LOG.error(msg); + // to do : find better exception + throw new NoSuchDefinitionException(msg); + } + + // Resolve parent before itself. + resolveInheritance(parent); + overload(parent, definition); + } + + /** + * Overloads a child definition with a given parent. + * All attributes present in child are kept. All missing attributes are + * copied from the parent. + * Special attribute 'template','role' and 'extends' are overloaded in child + * if not defined + * + * @param parent The parent definition. + * @param child The child that will be overloaded. + */ + protected void overload(ComponentDefinition parent, + ComponentDefinition child) { + // Iterate on each parent's attribute and add it if not defined in child. + for(Map.Entry<String, ComponentAttribute> entry : parent.getAttributes().entrySet()) { + child.putAttribute(entry.getKey(), new ComponentAttribute(entry.getValue())); + } + + if (child.getTemplate() == null) + child.setTemplate(parent.getTemplate()); + + if (child.getRole() == null) + child.setRole(parent.getRole()); + + if (child.getPreparer() == null) { + child.setPreparer(parent.getPreparer()); + } + } +} Propchange: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/DefinitionManager.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/DefinitionManager.java ------------------------------------------------------------------------------ svn:keywords = Id Author Date Rev Modified: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/taglib/definition/DefinitionTag.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/taglib/definition/DefinitionTag.java?view=diff&rev=472913&r1=472912&r2=472913 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/taglib/definition/DefinitionTag.java (original) +++ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/taglib/definition/DefinitionTag.java Thu Nov 9 06:29:02 2006 @@ -31,7 +31,7 @@ /** * This is the tag handler for <tiles:definition>, which defines - * a tiles (or template / component). Definition is put in requested context and can be + * a tiles (or template / component). TileDefinition is put in requested context and can be * used in <tiles:insert>. * * @version $Rev$ $Date$ @@ -41,7 +41,7 @@ /* JSP Tag attributes */ /** - * Definition identifier. + * TileDefinition identifier. */ private String name = null; Modified: struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/taglib/definition/DefinitionTagSupport.java URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/taglib/definition/DefinitionTagSupport.java?view=diff&rev=472913&r1=472912&r2=472913 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/taglib/definition/DefinitionTagSupport.java (original) +++ struts/sandbox/trunk/tiles/tiles-core/src/main/java/org/apache/tiles/taglib/definition/DefinitionTagSupport.java Thu Nov 9 06:29:02 2006 @@ -24,7 +24,7 @@ /** * Common base class for tags dealing with Tiles definitions. - * This class defines properties used in Definition Tags. + * This class defines properties used in TileDefinition Tags. * It also extends TagSupport. */ public class DefinitionTagSupport extends TagSupport implements Serializable { Modified: struts/sandbox/trunk/tiles/tiles-test/src/main/webapp/index.jsp URL: http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-test/src/main/webapp/index.jsp?view=diff&rev=472913&r1=472912&r2=472913 ============================================================================== --- struts/sandbox/trunk/tiles/tiles-test/src/main/webapp/index.jsp (original) +++ struts/sandbox/trunk/tiles/tiles-test/src/main/webapp/index.jsp Thu Nov 9 06:29:02 2006 @@ -39,7 +39,7 @@ <a href="testput.jsp">Test Put Tag</a><br/> <a href="testput_servlet.jsp">Test Put Tag using a servlet mapping as a template</a><br/> <a href="testimportattribute.jsp">Test importAttribute Tag</a><br/> - <a href="testimportattribute_all.jsp">Test importAttribute Tag with not name</a><br/> + <a href="testimportattribute_all.jsp">Test importAttribute Tag with no name</a><br/> <h2>Currently not working tests</h2> <a href="testdef.jsp">Test Definition Tag</a><br/>