You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jspwiki.apache.org by ju...@apache.org on 2020/01/16 23:07:27 UTC

[jspwiki] 07/26: extract text nodes extraction routine from Dom to XmlUtils

This is an automated email from the ASF dual-hosted git repository.

juanpablo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jspwiki.git

commit 5851edd12f623e4db3fd28941afbd29f5ef41197
Author: juanpablo <ju...@apache.org>
AuthorDate: Mon Jan 13 00:16:46 2020 +0100

    extract text nodes extraction routine from Dom to XmlUtils
---
 .../apache/wiki/parser/JSPWikiMarkupParser.java    | 53 ++++++----------------
 .../org/apache/wiki/render/CleanTextRenderer.java  | 30 ++----------
 .../main/java/org/apache/wiki/util/XmlUtil.java    | 35 +++++++++++---
 .../java/org/apache/wiki/util/XmlUtilTest.java     | 17 +++++++
 4 files changed, 65 insertions(+), 70 deletions(-)

diff --git a/jspwiki-main/src/main/java/org/apache/wiki/parser/JSPWikiMarkupParser.java b/jspwiki-main/src/main/java/org/apache/wiki/parser/JSPWikiMarkupParser.java
index 7dad359..567e65c 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/parser/JSPWikiMarkupParser.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/parser/JSPWikiMarkupParser.java
@@ -38,8 +38,8 @@ import org.apache.wiki.auth.WikiSecurityException;
 import org.apache.wiki.auth.acl.Acl;
 import org.apache.wiki.i18n.InternationalizationManager;
 import org.apache.wiki.preferences.Preferences;
-import org.apache.wiki.render.CleanTextRenderer;
 import org.apache.wiki.util.TextUtil;
+import org.apache.wiki.util.XmlUtil;
 import org.jdom2.Attribute;
 import org.jdom2.Content;
 import org.jdom2.Element;
@@ -85,7 +85,7 @@ public class JSPWikiMarkupParser extends MarkupParser {
     protected static final int              IMAGEWIKILINK = 9;
     protected static final int              ATTACHMENT    = 10;
 
-    private static Logger log = Logger.getLogger( JSPWikiMarkupParser.class );
+    private static final Logger log = Logger.getLogger( JSPWikiMarkupParser.class );
 
     private boolean        m_isbold       = false;
     private boolean        m_isitalic     = false;
@@ -221,17 +221,12 @@ public class JSPWikiMarkupParser extends MarkupParser {
      *  @param text Text that should be passed to the mutate() method of each of the mutators in the chain.
      *  @return The result of the mutation.
      */
-    protected String callMutatorChain( Collection< StringTransmutator > list, String text )
-    {
-        if( list == null || list.size() == 0 )
-        {
+    protected String callMutatorChain( final Collection< StringTransmutator > list, String text ) {
+        if( list == null || list.size() == 0 ) {
             return text;
         }
 
-        for( Iterator< StringTransmutator > i = list.iterator(); i.hasNext(); )
-        {
-            StringTransmutator m = i.next();
-
+        for( final StringTransmutator m : list ) {
             text = m.mutate( m_context, text );
         }
 
@@ -808,19 +803,13 @@ public class JSPWikiMarkupParser extends MarkupParser {
     private JSPWikiMarkupParser m_cleanTranslator;
 
     /**
-     *  Does a lazy init.  Otherwise, we would get into a situation
-     *  where HTMLRenderer would try and boot a TranslatorReader before
+     *  Does a lazy init.  Otherwise, we would get into a situation where HTMLRenderer would try and boot a TranslatorReader before
      *  the TranslatorReader it is contained by is up.
      */
-    private JSPWikiMarkupParser getCleanTranslator()
-    {
-        if( m_cleanTranslator == null )
-        {
-            WikiContext dummyContext = new WikiContext( m_engine,
-                                                        m_context.getHttpRequest(),
-                                                        m_context.getPage() );
+    private JSPWikiMarkupParser getCleanTranslator() {
+        if( m_cleanTranslator == null ) {
+            final WikiContext dummyContext = new WikiContext( m_engine, m_context.getHttpRequest(), m_context.getPage() );
             m_cleanTranslator = new JSPWikiMarkupParser( dummyContext, null );
-
             m_cleanTranslator.m_allowHTML = true;
         }
 
@@ -834,27 +823,20 @@ public class JSPWikiMarkupParser extends MarkupParser {
      *  Counts also duplicate headings (= headings with similar name), and
      *  attaches a counter.
      */
-    private String makeHeadingAnchor( String baseName, String title, Heading hd )
-    {
+    private String makeHeadingAnchor( final String baseName, String title, final Heading hd ) {
         hd.m_titleText = title;
         title = MarkupParser.wikifyLink( title );
-
         hd.m_titleSection = m_engine.encodeName(title);
 
-        if( m_titleSectionCounter.containsKey( hd.m_titleSection ) )
-        {
-            Integer count = m_titleSectionCounter.get( hd.m_titleSection );
-            count = count + 1;
+        if( m_titleSectionCounter.containsKey( hd.m_titleSection ) ) {
+            final Integer count = m_titleSectionCounter.get( hd.m_titleSection ) + 1;
             m_titleSectionCounter.put( hd.m_titleSection, count );
             hd.m_titleSection += "-" + count;
-        }
-        else
-        {
+        } else {
             m_titleSectionCounter.put( hd.m_titleSection, 1 );
         }
 
-        hd.m_titleAnchor = "section-"+m_engine.encodeName(baseName)+
-                           "-"+hd.m_titleSection;
+        hd.m_titleAnchor = "section-" + m_engine.encodeName( baseName ) + "-" + hd.m_titleSection;
         hd.m_titleAnchor = hd.m_titleAnchor.replace( '%', '_' );
         hd.m_titleAnchor = hd.m_titleAnchor.replace( '/', '_' );
 
@@ -863,20 +845,15 @@ public class JSPWikiMarkupParser extends MarkupParser {
 
     private String makeSectionTitle( String title ) {
         title = title.trim();
-        final String outTitle;
-
         try {
             final JSPWikiMarkupParser dtr = getCleanTranslator();
             dtr.setInputReader( new StringReader( title ) );
 
-            final CleanTextRenderer ctt = new CleanTextRenderer( m_context, dtr.parse() );
-            outTitle = ctt.getString();
+            return XmlUtil.extractTextFromDocument( dtr.parse() );
         } catch( final IOException e ) {
             log.fatal("CleanTranslator not working", e );
             throw new InternalWikiException( "CleanTranslator not working as expected, when cleaning title"+ e.getMessage() , e );
         }
-
-        return outTitle;
     }
 
     /**
diff --git a/jspwiki-main/src/main/java/org/apache/wiki/render/CleanTextRenderer.java b/jspwiki-main/src/main/java/org/apache/wiki/render/CleanTextRenderer.java
index 602f6ba..dec05ec 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/render/CleanTextRenderer.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/render/CleanTextRenderer.java
@@ -18,27 +18,18 @@
  */
 package org.apache.wiki.render;
 
-import org.apache.log4j.Logger;
 import org.apache.wiki.WikiContext;
 import org.apache.wiki.parser.WikiDocument;
-import org.jdom2.Text;
-import org.jdom2.xpath.XPathFactory;
-
-import java.io.IOException;
-import java.util.List;
+import org.apache.wiki.util.XmlUtil;
 
 
 /**
- *  A simple renderer that just renders all the text() nodes from the DOM tree.
- *  This is very useful for cleaning away all of the XHTML.
+ *  A simple renderer that just renders all the text() nodes from the DOM tree. This is very useful for cleaning away all of the XHTML.
  *
  *  @since  2.4
  */
 public class CleanTextRenderer extends WikiRenderer {
 
-    private static final String ALL_TEXT_NODES = "//text()";
-    private static final Logger log = Logger.getLogger( CleanTextRenderer.class );
-
     /**
      *  Create a renderer.
      *
@@ -52,21 +43,8 @@ public class CleanTextRenderer extends WikiRenderer {
     /**
      *  {@inheritDoc}
      */
-    public String getString() throws IOException {
-    	final StringBuilder sb = new StringBuilder();
-        try {
-            final List< ? > nodes = XPathFactory.instance().compile( ALL_TEXT_NODES ).evaluate( m_document.getDocument() );
-            for( final Object el : nodes ) {
-                if( el instanceof Text ) {
-                    sb.append( ( ( Text )el ).getValue() );
-                }
-            }
-        } catch( final IllegalStateException e ) {
-            log.error("Could not parse XPATH expression");
-            throw new IOException( e.getMessage(), e );
-        }
-
-        return sb.toString();
+    public String getString() {
+    	return m_document != null ? XmlUtil.extractTextFromDocument( m_document.getDocument() ) : "";
     }
 
 }
diff --git a/jspwiki-util/src/main/java/org/apache/wiki/util/XmlUtil.java b/jspwiki-util/src/main/java/org/apache/wiki/util/XmlUtil.java
index 2412b2c..1d0ef08 100644
--- a/jspwiki-util/src/main/java/org/apache/wiki/util/XmlUtil.java
+++ b/jspwiki-util/src/main/java/org/apache/wiki/util/XmlUtil.java
@@ -24,6 +24,7 @@ import org.apache.log4j.Logger;
 import org.jdom2.Document;
 import org.jdom2.Element;
 import org.jdom2.JDOMException;
+import org.jdom2.Text;
 import org.jdom2.filter.Filters;
 import org.jdom2.input.SAXBuilder;
 import org.jdom2.xpath.XPathExpression;
@@ -49,7 +50,8 @@ import java.util.Set;
  */
 public final class XmlUtil  {
 
-	private static final Logger log = Logger.getLogger( XmlUtil.class );
+	private static final String ALL_TEXT_NODES = "//text()";
+	private static final Logger LOG = Logger.getLogger( XmlUtil.class );
 	private XmlUtil() {}
 	
 	/**
@@ -69,7 +71,7 @@ public final class XmlUtil  {
 				final Enumeration< URL > resources = XmlUtil.class.getClassLoader().getResources( xml );
 				while( resources.hasMoreElements() ) {
 					final URL resource = resources.nextElement();
-	                log.debug( "reading " + resource.toString() );
+					LOG.debug( "reading " + resource.toString() );
 					final Document doc = builder.build( resource );
 					final XPathFactory xpfac = XPathFactory.instance();
 					final XPathExpression<Element> xp = xpfac.compile( requestedNodes, Filters.element() );
@@ -77,9 +79,9 @@ public final class XmlUtil  {
 	            }
 				return new ArrayList<>( readed );
 			} catch( final IOException ioe ) {
-				log.error( "Couldn't load all " + xml + " resources", ioe );
+				LOG.error( "Couldn't load all " + xml + " resources", ioe );
 			} catch( final JDOMException jdome ) {
-				log.error( "error parsing " + xml + " resources", jdome );
+				LOG.error( "error parsing " + xml + " resources", jdome );
 			}
 		}
 		return Collections.emptyList();
@@ -102,12 +104,33 @@ public final class XmlUtil  {
 				final XPathExpression< Element > xp = xpfac.compile( requestedNodes,Filters.element() );
 				return xp.evaluate( doc );
 			} catch( final IOException ioe ) {
-				log.error( "Couldn't load all " + xmlStream + " resources", ioe );
+				LOG.error( "Couldn't load all " + xmlStream + " resources", ioe );
 			} catch( final JDOMException jdome ) {
-				log.error( "error parsing " + xmlStream + " resources", jdome );
+				LOG.error( "error parsing " + xmlStream + " resources", jdome );
 			}
 		}		
 		return Collections.emptyList();
 	}
 
+	/**
+	 * Renders all the text() nodes from the DOM tree. This is very useful for cleaning away all of the XHTML.
+	 *
+	 * @param doc Dom tree
+	 * @return String containing only the text from the provided Dom tree.
+	 */
+	public static String extractTextFromDocument( final Document doc ) {
+		if( doc == null ) {
+			return "";
+		}
+		final StringBuilder sb = new StringBuilder();
+		final List< ? > nodes = XPathFactory.instance().compile( ALL_TEXT_NODES ).evaluate( doc );
+		for( final Object el : nodes ) {
+			if( el instanceof Text ) {
+				sb.append( ( ( Text )el ).getValue() );
+			}
+		}
+
+		return sb.toString();
+	}
+
 }
\ No newline at end of file
diff --git a/jspwiki-util/src/test/java/org/apache/wiki/util/XmlUtilTest.java b/jspwiki-util/src/test/java/org/apache/wiki/util/XmlUtilTest.java
index cefc0e9..68aa485 100644
--- a/jspwiki-util/src/test/java/org/apache/wiki/util/XmlUtilTest.java
+++ b/jspwiki-util/src/test/java/org/apache/wiki/util/XmlUtilTest.java
@@ -18,7 +18,9 @@
  */
 package org.apache.wiki.util;
 
+import org.jdom2.Document;
 import org.jdom2.Element;
+import org.jdom2.input.SAXBuilder;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
@@ -80,4 +82,19 @@ public class XmlUtilTest {
         }
     }
 
+    @Test
+    public void testExtractTestFrom() throws Exception {
+        Assertions.assertEquals( "", XmlUtil.extractTextFromDocument( null ) );
+        final SAXBuilder builder = new SAXBuilder();
+        try( final InputStream is = new FileInputStream( new File ("./src/test/resources/ini/classmappings.xml" ) ) ) {
+            final Document doc = builder.build( is );
+            final String text = XmlUtil.extractTextFromDocument( doc );
+            Assertions.assertEquals( "\n" +
+                                     "  \n" +
+                                     "    java.util.List\n" +
+                                     "    java.util.ArrayList\n" +
+                                     "  \n", text );
+        }
+    }
+
 }