Author: cdupoirieux Date: Wed Jan 18 08:54:10 2006 New Revision: 370184 URL: http://svn.apache.org/viewcvs?rev=370184&view=rev Log: Add a condition - to the XPath - on the position() of hooks in case several hooks have the same name at the same level in the DOM. (FOR-788) Modified: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.internal.structurer/src/java/org/apache/forrest/dispatcher/DispatcherHelper.java forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.internal.structurer/src/java/org/apache/forrest/dispatcher/transformation/DispatcherTransformer.java Modified: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.internal.structurer/src/java/org/apache/forrest/dispatcher/DispatcherHelper.java URL: http://svn.apache.org/viewcvs/forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.internal.structurer/src/java/org/apache/forrest/dispatcher/DispatcherHelper.java?rev=370184&r1=370183&r2=370184&view=diff ============================================================================== --- forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.internal.structurer/src/java/org/apache/forrest/dispatcher/DispatcherHelper.java (original) +++ forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.internal.structurer/src/java/org/apache/forrest/dispatcher/DispatcherHelper.java Wed Jan 18 08:54:10 2006 @@ -157,6 +157,33 @@ } + /** + * setAttributesXPathWithPosition(Attributes attr, String path, int position) generates an XPath with the supplied attributes + * and add the condition on the position() to avoid confusion with hooks using the same name. + * @param attr Attributes of the XPath + * @param path The path + * @param position The position of the node + * @throws DOMException + */ + public String setAttributesXPathWithPosition(Attributes attr, String path, int position) + throws DOMException { + String xpath = "["; + if (attr.getLength() > 0) { + for (int i = 0; i < attr.getLength(); i++) { + String localName = attr.getLocalName(i); + String value = attr.getValue(i); + xpath = xpath + "@" + localName + "='" + value + "'"; + if (i < (attr.getLength() )) { + xpath = xpath + " and "; + } + } + xpath = xpath + " position()=" + position + "]"; + path = path + xpath; + } + return path; + + } + public DispatcherHelper(ServiceManager manager) throws ParserConfigurationException { this.manager = manager; Modified: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.internal.structurer/src/java/org/apache/forrest/dispatcher/transformation/DispatcherTransformer.java URL: http://svn.apache.org/viewcvs/forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.internal.structurer/src/java/org/apache/forrest/dispatcher/transformation/DispatcherTransformer.java?rev=370184&r1=370183&r2=370184&view=diff ============================================================================== --- forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.internal.structurer/src/java/org/apache/forrest/dispatcher/transformation/DispatcherTransformer.java (original) +++ forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.internal.structurer/src/java/org/apache/forrest/dispatcher/transformation/DispatcherTransformer.java Wed Jan 18 08:54:10 2006 @@ -185,6 +185,8 @@ private String hooksXSL; + private HashMap hooksPosition; + private HashMap parameterHelper; private SourceResolver m_resolver; @@ -274,6 +276,8 @@ storedPrefixMap = new HashMap(); this.parameterHelper = new HashMap(); + this.hooksPosition = new HashMap(); + this.allowMarkup = Boolean.getBoolean(parameters.getParameter( DISPATCHER_ALLOW_MARKUP, null)); this.requestedFormat = parameters.getParameter( @@ -391,8 +395,19 @@ /* create a DOM node from the current sax event */ Element currentElement = dispatcher.getDocument().createElement(name); dispatcherHelper.setAttributesDOM(attr, currentElement); - String tempPath = path + "/" + name; - tempPath = dispatcherHelper.setAttributesXPath(attr, tempPath); + String tempPathWithoutAttr = path + "/" + name; + String tempPath = dispatcherHelper.setAttributesXPath(attr, tempPathWithoutAttr); + // If the hook has already been met, we use the position in the XPath to avoid confusion ... + if( hooksPosition.containsKey( tempPath ) ) + { + int pos = ((Integer)hooksPosition.get( tempPath )).intValue() + 1; + hooksPosition.put( tempPath, new Integer( pos ) ); + tempPath = dispatcherHelper.setAttributesXPathWithPosition(attr, tempPathWithoutAttr, pos ); + } + else + { + hooksPosition.put( tempPath, new Integer( 1 ) ) ; + } if (path == null || path.equals("")) { path = name; this.rootNode.appendChild(currentElement);