You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by di...@apache.org on 2004/10/27 23:49:28 UTC

cvs commit: jakarta-commons/jelly/src/java/org/apache/commons/jelly/util TagUtils.java

dion        2004/10/27 14:49:28

  Added:       jelly/src/java/org/apache/commons/jelly/impl
                        WeakReferenceWrapperScript.java
               jelly/src/java/org/apache/commons/jelly/util TagUtils.java
  Log:
  Add classes for Jelly-148, with a little refactoring to remove reliance on XML taglib.
  
  Revision  Changes    Path
  1.1                  jakarta-commons/jelly/src/java/org/apache/commons/jelly/impl/WeakReferenceWrapperScript.java
  
  Index: WeakReferenceWrapperScript.java
  ===================================================================
  /*
   * Copyright 2002,2004 The Apache Software Foundation.
   *
   * Licensed 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.commons.jelly.impl;
  
  import java.lang.ref.WeakReference;
  import java.util.Iterator;
  import java.util.List;
  
  import org.apache.commons.jelly.JellyContext;
  import org.apache.commons.jelly.JellyException;
  import org.apache.commons.jelly.JellyTagException;
  import org.apache.commons.jelly.Script;
  import org.apache.commons.jelly.XMLOutput;
  import org.apache.commons.jelly.util.TagUtils;
  
  /** Wraps another Script instance in a WeakReference. Used to prevent
   * a Tag class from holding a hard reference to its body script.
   * <p/>
   * If the underlying Script has been GC'd and is no longer available,
   * an exception is thrown on any attempt to use this Script.
   * <p/>
   * WARNING: This class is not a permanent part of the API and will be removed or replaced in a future release.
   * Don't extend it or use it unless you absolutely must.
   * 
   * @author Hans Gilde
   *
   */
  public class WeakReferenceWrapperScript implements Script {
      private WeakReference reference;
      
      public WeakReferenceWrapperScript(Script script) {
          reference = new WeakReference(script);
      }
      
      /* (non-Javadoc)
       * @see org.apache.commons.jelly.Script#compile()
       */
      public Script compile() throws JellyException {
          return script().compile();
      }
  
      /** Use this method to access the script.
       * @throws JellyException If the script has been GC'd.
       */
      public Script script() throws JellyTagException {
          Script script = (Script) reference.get();
          
          if (script == null) {
              throw new JellyTagException("Attempt to use a script that has been garbage collected.");
          }
          
          return script;
      }
  
      /* (non-Javadoc)
       * @see org.apache.commons.jelly.Script#run(org.apache.commons.jelly.JellyContext, org.apache.commons.jelly.XMLOutput)
       */
      public void run(JellyContext context, XMLOutput output)
              throws JellyTagException {
          
          script().run(context, output);
      }
      
      /**Trims the white space from the script and its children.
       * TODO this code should be refactored into a formal part of the Script interface.
       * It has currently been cut and pasted from TagSupport.
       */
      public void trimWhitespace() throws JellyTagException {
          TagUtils.trimScript(script());
      }
      
      /** Determines if this script (the one in the WeakReference) 
       * or a child reference contains a Script
       * that's of a particular class. 
       * <p/>
       * <strong>This method is in place
       * to support specific features in the XML tag library and
       * shouldn't be used by anyone at all.
       * This method will be removed in a near-future verison of jelly.</strong>
       * <p/>
       * This method will be removed in a near-future verison of jelly.
       * XXX this is totally bogus and temporary, we should not need to check the type of scripts.
       * @param clazz Find a script that's an instance of this classs.
       * @throws JellyTagException
       */
      public boolean containsScriptType(Class clazz) throws JellyTagException {
          Object bodyScript = script();
          
          if (clazz.isInstance(bodyScript)) {
              return true;
          }
          
          if (bodyScript instanceof ScriptBlock) {
              ScriptBlock scriptBlock = (ScriptBlock) bodyScript;
              List scriptList = scriptBlock.getScriptList();
              for (Iterator iter = scriptList.iterator(); iter.hasNext(); ) {
                  Script script = (Script) iter.next();
                  if (script instanceof StaticTagScript) {
                      return true;
                  }
              }
          }
          
          return false;
      }
      
  }
  
  
  1.1                  jakarta-commons/jelly/src/java/org/apache/commons/jelly/util/TagUtils.java
  
  Index: TagUtils.java
  ===================================================================
  /*
   * Copyright 2002,2004 The Apache Software Foundation.
   *
   * Licensed 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.commons.jelly.util;
  
  import org.apache.commons.jelly.JellyTagException;
  import org.apache.commons.jelly.Script;
  import org.apache.commons.jelly.impl.CompositeTextScriptBlock;
  import org.apache.commons.jelly.impl.ScriptBlock;
  import org.apache.commons.jelly.impl.TextScript;
  import org.apache.commons.jelly.impl.WeakReferenceWrapperScript;
  
  /** Contains static methods to help tag developers.
   * @author Hans Gilde
   *
   */
  public class TagUtils {
      private TagUtils() {
          
      }
  
      /** Trims the whitespace from a script and its children.
       * 
       */
      public static void trimScript(Script body) {
          synchronized(body) {
              if (body instanceof WeakReferenceWrapperScript) {
                  WeakReferenceWrapperScript wrrs = (WeakReferenceWrapperScript) body;
                  try {
                      wrrs.trimWhitespace();
                  } catch (JellyTagException e) {
                      //TODO handle this exception once the Tag interface allows JellyTagException to be thrown
                      return;
                  }
              } else if ( body instanceof CompositeTextScriptBlock ) {
                  CompositeTextScriptBlock block = (CompositeTextScriptBlock) body;
                  block.trimWhitespace();
              }
              else
              if ( body instanceof ScriptBlock ) {
                  ScriptBlock block = (ScriptBlock) body;
                  block.trimWhitespace();
              }
              else if ( body instanceof TextScript ) {
                  TextScript textScript = (TextScript) body;
                  textScript.trimWhitespace();
              }
          }
      }
  
  }
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org