You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by mm...@apache.org on 2001/01/23 00:17:51 UTC

cvs commit: xml-xalan/java/src/org/apache/xalan/processor StylesheetPIHandler.java

mmidy       01/01/22 15:17:51

  Modified:    java/src/org/apache/xalan/processor StylesheetPIHandler.java
  Log:
  Fix problem with an href value with parameters to be passed to a servlet (ie foobar?id=16). Make sure the href value is not clipped at the "=".
  
  Revision  Changes    Path
  1.8       +71 -20    xml-xalan/java/src/org/apache/xalan/processor/StylesheetPIHandler.java
  
  Index: StylesheetPIHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/processor/StylesheetPIHandler.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- StylesheetPIHandler.java	2000/11/23 04:57:24	1.7
  +++ StylesheetPIHandler.java	2001/01/22 23:17:50	1.8
  @@ -154,24 +154,62 @@
         String media = null;  // CDATA #IMPLIED
         String charset = null;  // CDATA #IMPLIED
         boolean alternate = false;  // (yes|no) "no"
  -      StringTokenizer tokenizer = new StringTokenizer(data, " \t=");
  +      StringTokenizer tokenizer = new StringTokenizer(data, " \t=", true);
  +      boolean lookedAhead = false; 
   
  +      String token = "";
         while (tokenizer.hasMoreTokens())
  -      {
  -        String name = tokenizer.nextToken();
  -
  +      {        
  +        if (!lookedAhead)
  +          token = tokenizer.nextToken();
  +        else
  +          lookedAhead = false;
  +        if (tokenizer.hasMoreTokens() && 
  +               (token.equals(" ") || token.equals("\t") || token.equals("=")))
  +          continue;
  +          
  +        String name = token;  
           if (name.equals("type"))
  -        {
  -          String typeVal = tokenizer.nextToken();
  -
  -          type = typeVal.substring(1, typeVal.length() - 1);
  +        { 
  +          token = tokenizer.nextToken();
  +          while (tokenizer.hasMoreTokens() && 
  +               (token.equals(" " ) || token.equals("\t") || token.equals("=")))
  +            token = tokenizer.nextToken();
  +          type = token.substring(1, token.length() - 1);
  +          
           }
           else if (name.equals("href"))
           {
  -          href = tokenizer.nextToken();
  +          token = tokenizer.nextToken();
  +          while (tokenizer.hasMoreTokens() && 
  +               (token.equals(" " ) || token.equals("\t") || token.equals("=")))
  +            token = tokenizer.nextToken();
  +          href = token;
  +          token = tokenizer.nextToken();
  +          // If the href value has parameters to be passed to a 
  +          // servlet(something like "foobar?id=12..."), 
  +          // we want to make sure we get them added to
  +          // the href value. Without this check, we would move on 
  +          // to try to process another attribute and that would be
  +          // wrong.
  +          // We need to set lookedAhead here to flag that we
  +          // already have the next token. 
  +          while ( token.equals("="))
  +          {  
  +            href = href + token + tokenizer.nextToken();
  +            if (tokenizer.hasMoreTokens())
  +            {  
  +              token = tokenizer.nextToken();
  +              lookedAhead = true;
  +            }
  +            else
  +            {
  +              break;
  +            }
  +          }
             href = href.substring(1, href.length() - 1);
             try
  -          {
  +          {              
               href = SystemIDResolver.getAbsoluteURI(href, m_baseID);
             }
             catch(TransformerException te)
  @@ -181,26 +219,38 @@
           }
           else if (name.equals("title"))
           {
  -          title = tokenizer.nextToken();
  -          title = title.substring(1, title.length() - 1);
  +          token = tokenizer.nextToken();
  +          while (tokenizer.hasMoreTokens() && 
  +               (token.equals(" " ) || token.equals("\t") || token.equals("=")))
  +            token = tokenizer.nextToken();
  +          title = token.substring(1, token.length() - 1);
           }
           else if (name.equals("media"))
           {
  -          media = tokenizer.nextToken();
  -          media = media.substring(1, media.length() - 1);
  +          token = tokenizer.nextToken();
  +          while (tokenizer.hasMoreTokens() && 
  +               (token.equals(" " ) || token.equals("\t") || token.equals("=")))
  +            token = tokenizer.nextToken();
  +          media = token.substring(1, token.length() - 1);
           }
           else if (name.equals("charset"))
           {
  -          charset = tokenizer.nextToken();
  -          charset = charset.substring(1, charset.length() - 1);
  +          token = tokenizer.nextToken();
  +          while (tokenizer.hasMoreTokens() && 
  +              (token.equals(" " ) || token.equals("\t") || token.equals("=")))
  +            token = tokenizer.nextToken();
  +          charset = token.substring(1, token.length() - 1);
           }
           else if (name.equals("alternate"))
           {
  -          String alternateStr = tokenizer.nextToken();
  -
  -          alternate = alternateStr.substring(1, alternateStr.length()
  +          token = tokenizer.nextToken();
  +          while (tokenizer.hasMoreTokens() && 
  +               (token.equals(" " ) || token.equals("\t") || token.equals("=")))
  +            token = tokenizer.nextToken();
  +          alternate = token.substring(1, token.length()
                                                - 1).equals("yes");
           }
  +        
         }
   
         if ((null != type) && type.equals("text/xsl") && (null != href))
  @@ -242,7 +292,8 @@
         }
       }
     }
  -
  +  
  +  
     /**
      * The spec notes that "The xml-stylesheet processing instruction is allowed only in the prolog of an XML document.",
      * so, at least for right now, I'm going to go ahead an throw a TransformerException