You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@beehive.apache.org by ri...@apache.org on 2004/09/21 06:47:10 UTC

svn commit: rev 46957 - in incubator/beehive/trunk/netui: src/compiler/org/apache/beehive/netui/compiler src/compiler/org/apache/beehive/netui/compiler/apt src/compiler/org/apache/beehive/netui/compiler/grammar test/webapps/drt/coreWeb test/webapps/drt/coreWeb/WEB-INF/src/global test/webapps/drt/coreWeb/resources/jsp test/webapps/drt/testRecorder/config

Author: rich
Date: Mon Sep 20 21:47:07 2004
New Revision: 46957

Added:
   incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/FacesBackingInfo.java   (contents, props changed)
   incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/SourceFileInfo.java   (contents, props changed)
   incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/resources/jsp/qaPageSnap.jspf   (contents, props changed)
   incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/resources/jsp/qaTraceResults.jsp   (contents, props changed)
Modified:
   incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/CompilerUtils.java
   incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/FacesBackingChecker.java
   incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/FlowControllerChecker.java
   incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/FlowControllerInfo.java
   incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/JpfLanguageConstants.java
   incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/apt/PageFlowAnnotationProcessor.java
   incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/apt/PageFlowAnnotationProcessorFactory.java
   incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/ForwardToExternalPathType.java
   incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/WebappPathType.java
   incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/SharedFlow.jpfs
   incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF/src/global/merge-jpf-struts-config.xml
   incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-config.xml
Log:

- Fixed to avoid warnings for @Jpf.Forwards that contain encoded paths to files with spaces in their names.
- Fixed to avoid warnings for @Jpf.Forwards that contain .jpf paths with "../" in them.
- Added a FacesBackingInfo result object when processing .jsfb ("JSF backing") files.  This currently contains the source file, the backing class name, and a list of annotated command handlers.
- Changed the warning about message resources that's printed when forwarding from a @Jpf.ExceptionHandler/@Jpf.Catch to an external page.  This is now only shown when the page flow has at least one @Jpf.MessageResource annotation.
- Fixed the StrutsMergeTest2 BVT.
- Fixed to get rid of extraneous warnings from the page flow compiler during DRT app build.

DRT: netui (WinXP)
BB: self (linux)



Modified: incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/CompilerUtils.java
==============================================================================
--- incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/CompilerUtils.java	(original)
+++ incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/CompilerUtils.java	Mon Sep 20 21:47:07 2004
@@ -690,7 +690,8 @@
     {
         int extensionPos = fileRelativePath.lastIndexOf( JAVA_FILE_EXTENSION_DOT );
         assert extensionPos != -1 : "expected a .java file: " + fileRelativePath;
-        webappRootPath += '/';
+        webappRootPath += File.separatorChar;
+        String base = webappRootPath + fileRelativePath;
         
         // See if we can find the file by chopping out the temp-dir.
         File retVal = new File( webappRootPath + fileRelativePath );
@@ -699,26 +700,40 @@
         {
             // See if we need to replace ".java" with ".jpf" or ".jpfs".
             fileRelativePath = fileRelativePath.substring( 0, extensionPos );
-            retVal = new File( webappRootPath + fileRelativePath + JPF_FILE_EXTENSION_DOT );
-            if ( ! retVal.exists() ) retVal = new File( webappRootPath + fileRelativePath + SHARED_FLOW_FILE_EXTENSION_DOT );
-            if ( ! retVal.exists() ) retVal = new File( webappRootPath + fileRelativePath + FACES_BACKING_FILE_EXTENSION_DOT );
+            retVal = getSourceFile( webappRootPath + fileRelativePath );
             
-            // See if the .java file lives in WEB-INF/src.
-            if ( ! retVal.exists() )
+            //
+            // See if the file lives in WEB-INF/src.
+            //
+            if ( retVal == null )
             {
                 StringBuilder retValPath = new StringBuilder( webappRootPath );
                 retValPath.append( WEBINF_DIR_NAME ).append( File.separatorChar );
                 retValPath.append( "src" ).append( File.separatorChar );
-                retValPath.append( fileRelativePath ).append( JAVA_FILE_EXTENSION_DOT );
-                retVal = new File( retValPath.toString() );
+                retValPath.append( fileRelativePath );
+                retVal = getSourceFile( retValPath.toString() );
             }
-
-            if ( ! retVal.exists() ) retVal = null;
         }
 
-        if ( retVal.exists() ) retVal = retVal.getAbsoluteFile();
-        return retVal;
+        return retVal.exists() ? retVal.getAbsoluteFile() : null;
+    }
+    
+    /**
+     * Tries to find the file with '.jpf', '.jpfs', '.jsfb', '.java' extensions.
+     */ 
+    private static File getSourceFile( String base )
+    {
+        File file = new File( base + JAVA_FILE_EXTENSION_DOT );
+        if ( file.exists() ) return file;
+        file = new File( base + JPF_FILE_EXTENSION_DOT );
+        if ( file.exists() ) return file;
+        file = new File( base + SHARED_FLOW_FILE_EXTENSION_DOT );
+        if ( file.exists() ) return file;
+        file = new File( base + FACES_BACKING_FILE_EXTENSION_DOT );
+        if ( file.exists() ) return file;
+        return null;
     }
+    
     
     public static boolean annotationsAreEqual( AnnotationMirror a1, AnnotationMirror a2 ) 
     {

Modified: incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/FacesBackingChecker.java
==============================================================================
--- incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/FacesBackingChecker.java	(original)
+++ incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/FacesBackingChecker.java	Mon Sep 20 21:47:07 2004
@@ -23,6 +23,7 @@
 
 import java.util.Map;
 import java.util.Collection;
+import java.util.HashMap;
 
 import org.apache.beehive.netui.compiler.grammar.CommandHandlerGrammar;
 
@@ -33,9 +34,12 @@
 public class FacesBackingChecker
         extends BaseChecker
 {
-    public FacesBackingChecker( AnnotationProcessorEnvironment env, Diagnostics diags )
+    private FacesBackingInfo _facesBackingInfo;
+    
+    public FacesBackingChecker( AnnotationProcessorEnvironment env, Diagnostics diags, FacesBackingInfo fbInfo )
     {
         super( env, diags );
+        _facesBackingInfo = fbInfo;
     }
     
     public BaseGenerator getGenerator()
@@ -73,9 +77,12 @@
 
         for ( MethodDeclaration method : methods )
         {
+            _facesBackingInfo.addCommandHandler( method.getSimpleName() );
             chg.check( CompilerUtils.getAnnotation( method, COMMAND_HANDLER_TAG_NAME ), null, method );
         }
         
-        return null;
+        Map checkResultMap = new HashMap();
+        checkResultMap.put( JpfLanguageConstants.ExtraInfoKeys.facesBackingInfo, _facesBackingInfo );
+        return checkResultMap;
     }
 }

Added: incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/FacesBackingInfo.java
==============================================================================
--- (empty file)
+++ incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/FacesBackingInfo.java	Mon Sep 20 21:47:07 2004
@@ -0,0 +1,43 @@
+/*
+ * Copyright 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.
+ *
+ * $Header:$
+ */
+package org.apache.beehive.netui.compiler;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.io.File;
+
+public class FacesBackingInfo
+        extends SourceFileInfo
+{
+    private List< String > _commandHandlers = new ArrayList< String >();
+
+    public FacesBackingInfo( File sourceFile, String className )
+    {
+        super( sourceFile, className );
+    }
+    
+    public List< String > getCommandHandlers()
+    {
+        return _commandHandlers;
+    }
+    
+    void addCommandHandler( String commandHandlerName )
+    {
+        _commandHandlers.add( commandHandlerName );
+    }
+}

Modified: incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/FlowControllerChecker.java
==============================================================================
--- incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/FlowControllerChecker.java	(original)
+++ incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/FlowControllerChecker.java	Mon Sep 20 21:47:07 2004
@@ -191,6 +191,8 @@
             {
                 File parentDir = strutsConfigFile.getParentFile();
         
+                getFlowControllerInfo().addReferencedFile( strutsConfigFile );
+                
                 if ( ! parentDir.isDirectory() )
                 {
                     //

Modified: incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/FlowControllerInfo.java
==============================================================================
--- incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/FlowControllerInfo.java	(original)
+++ incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/FlowControllerInfo.java	Mon Sep 20 21:47:07 2004
@@ -28,14 +28,12 @@
 import java.util.HashMap;
 import java.io.File;
 
-import static org.apache.beehive.netui.compiler.JpfLanguageConstants.GLOBALAPP_FULL_CLASSNAME;
-import static org.apache.beehive.netui.compiler.JpfLanguageConstants.WEBINF_SRC_DIR;
-import static org.apache.beehive.netui.compiler.JpfLanguageConstants.GLOBALAPP_PACKAGE;
-import static org.apache.beehive.netui.compiler.JpfLanguageConstants.GLOBALAPP_CLASSNAME;
-import static org.apache.beehive.netui.compiler.JpfLanguageConstants.GLOBALAPP_FILE_EXTENSION_DOT;
 
 public class FlowControllerInfo
+        extends SourceFileInfo
 {
+    private static final ActionInfo[] EMPTY_ACTION_INFO_ARRAY = new ActionInfo[0];
+    
     private Set< ActionInfo > _actions = new HashSet< ActionInfo >();
     private boolean _nested = false;
     private Set _returnActions = null;
@@ -44,9 +42,7 @@
     private List< String > _sharedFlowTypeNameHierarchy;
     private List< File > _sharedFlowFileHierarchy;
     private List< File > _referencedFiles = new ArrayList< File >();
-    private File _sourceFile;
     private boolean _isBuilding = false;
-    private String _controllerClassName = null;
     private Map< String, String > _messageResourcesByKey = new HashMap< String, String >();
 
     
@@ -105,8 +101,7 @@
     
     public FlowControllerInfo( File sourceFile, String controllerClassName )
     {
-        _sourceFile = sourceFile;
-        _controllerClassName = controllerClassName;
+        super( sourceFile, controllerClassName );
     }
     
     void reset()
@@ -141,7 +136,7 @@
     {
         if ( _returnActions == null )
         {
-            return new ActionInfo[0];
+            return EMPTY_ACTION_INFO_ARRAY;
         }
         
         return ( ActionInfo[] ) _returnActions.toArray( new ActionInfo[ _returnActions.size() ] );
@@ -205,7 +200,7 @@
     
     public void addReferencedFile( File file )
     {
-        if ( ! file.equals( _sourceFile ) )
+        if ( ! file.equals( getSourceFile() ) )
         {
             _referencedFiles.add( file );
         }
@@ -254,16 +249,6 @@
         _webappRoot = webappRoot;
     }
 
-    File getSourceFile()
-    {
-        return _sourceFile;
-    }
-
-    public String getControllerClassName()
-    {
-        return _controllerClassName;
-    }
-
     public Map< String, String > getMessageResourcesByKey()
     {
         return _messageResourcesByKey;
@@ -272,5 +257,10 @@
     public void addMessageResource( String key, String name )
     {
         _messageResourcesByKey.put( key, name );
+    }
+    
+    public String getControllerClassName()
+    {
+        return getClassName();
     }
 }

Modified: incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/JpfLanguageConstants.java
==============================================================================
--- incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/JpfLanguageConstants.java	(original)
+++ incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/JpfLanguageConstants.java	Mon Sep 20 21:47:07 2004
@@ -200,6 +200,7 @@
     public enum ExtraInfoKeys
     {
         flowControllerInfo,
+        facesBackingInfo,
         overlappingPageFlowFiles
     }
 

Added: incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/SourceFileInfo.java
==============================================================================
--- (empty file)
+++ incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/SourceFileInfo.java	Mon Sep 20 21:47:07 2004
@@ -0,0 +1,44 @@
+/*
+ * Copyright 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.
+ *
+ * $Header:$
+ */
+package org.apache.beehive.netui.compiler;
+
+import java.io.File;
+
+public class SourceFileInfo
+{
+    private File _sourceFile;
+    private String _className = null;
+
+    
+    public SourceFileInfo( File sourceFile, String className )
+    {
+        _sourceFile = sourceFile;
+        _className = className;
+    }
+
+    public File getSourceFile()
+    {
+        return _sourceFile;
+    }
+    
+    public String getClassName()
+    {
+        return _className;
+    }
+    
+}

Modified: incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/apt/PageFlowAnnotationProcessor.java
==============================================================================
--- incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/apt/PageFlowAnnotationProcessor.java	(original)
+++ incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/apt/PageFlowAnnotationProcessor.java	Mon Sep 20 21:47:07 2004
@@ -28,6 +28,7 @@
 import org.apache.beehive.netui.compiler.PageFlowChecker;
 import org.apache.beehive.netui.compiler.SharedFlowChecker;
 import org.apache.beehive.netui.compiler.FacesBackingChecker;
+import org.apache.beehive.netui.compiler.FacesBackingInfo;
 import static org.apache.beehive.netui.compiler.JpfLanguageConstants.JPF_BASE_CLASS;
 import static org.apache.beehive.netui.compiler.JpfLanguageConstants.SHARED_FLOW_BASE_CLASS;
 import static org.apache.beehive.netui.compiler.JpfLanguageConstants.GLOBALAPP_BASE_CLASS;
@@ -38,6 +39,8 @@
 import static org.apache.beehive.netui.compiler.JpfLanguageConstants.FACES_BACKING_TAG_NAME;
 import static org.apache.beehive.netui.compiler.JpfLanguageConstants.ANNOTATIONS_CLASSNAME;
 
+import java.io.File;
+
 
 public class PageFlowAnnotationProcessor
         extends BaseAnnotationProcessor
@@ -49,15 +52,18 @@
 
     protected BaseChecker getChecker( ClassDeclaration classDecl, Diagnostics diagnostics )
     {
-        FlowControllerInfo fcInfo =
-                new FlowControllerInfo( CompilerUtils.getOriginalFile( classDecl ), classDecl.getQualifiedName() );
+        File originalFile = CompilerUtils.getOriginalFile( classDecl );
+        String className = classDecl.getQualifiedName();
         
         if ( CompilerUtils.getAnnotation( classDecl, FACES_BACKING_TAG_NAME ) != null )
         {
-            return new FacesBackingChecker( getEnv(), diagnostics );
+            FacesBackingInfo fbInfo = new FacesBackingInfo( originalFile, className );
+            return new FacesBackingChecker( getEnv(), diagnostics, fbInfo );
         }
         else if ( CompilerUtils.isAssignableFrom( JPF_BASE_CLASS, classDecl, getEnv() ) )
         {
+            FlowControllerInfo fcInfo = new FlowControllerInfo( originalFile, className );
+            
             if ( expectControllerAnnotation( classDecl, JPF_FILE_EXTENSION_DOT, JPF_BASE_CLASS, diagnostics ) )
             {
                 return new PageFlowChecker( getEnv(), diagnostics, fcInfo );
@@ -65,6 +71,8 @@
         }
         else if ( CompilerUtils.isAssignableFrom( SHARED_FLOW_BASE_CLASS, classDecl, getEnv() ) )
         {
+            FlowControllerInfo fcInfo = new FlowControllerInfo( originalFile, className );
+            
             if ( expectControllerAnnotation( classDecl, SHARED_FLOW_FILE_EXTENSION_DOT, SHARED_FLOW_BASE_CLASS,
                                              diagnostics ) )
             {
@@ -73,6 +81,8 @@
         }
         else if ( CompilerUtils.isAssignableFrom( GLOBALAPP_BASE_CLASS, classDecl, getEnv() ) )
         {
+            FlowControllerInfo fcInfo = new FlowControllerInfo( originalFile, className );
+            
             if ( expectControllerAnnotation( classDecl, GLOBALAPP_FILE_EXTENSION_DOT, GLOBALAPP_BASE_CLASS,
                                              diagnostics ) )
             {

Modified: incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/apt/PageFlowAnnotationProcessorFactory.java
==============================================================================
--- incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/apt/PageFlowAnnotationProcessorFactory.java	(original)
+++ incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/apt/PageFlowAnnotationProcessorFactory.java	Mon Sep 20 21:47:07 2004
@@ -33,14 +33,14 @@
 public class PageFlowAnnotationProcessorFactory
         implements AnnotationProcessorFactory
 {
-    public Collection<String> supportedAnnotationTypes()
+    public Collection< String > supportedAnnotationTypes()
     {
         return Collections.unmodifiableCollection( Arrays.asList( new String[]{ "*" } ) );
     }
 
     public Collection< String > supportedOptions()
     {
-        return new ArrayList< String >();
+        return Collections.emptyList();
     }
 
     public AnnotationProcessor getProcessorFor( Set< AnnotationTypeDeclaration > annotationTypeDeclarations,

Modified: incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/ForwardToExternalPathType.java
==============================================================================
--- incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/ForwardToExternalPathType.java	(original)
+++ incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/ForwardToExternalPathType.java	Mon Sep 20 21:47:07 2004
@@ -22,9 +22,13 @@
 import com.sun.mirror.declaration.AnnotationValue;
 import com.sun.mirror.declaration.AnnotationMirror;
 import com.sun.mirror.declaration.MemberDeclaration;
+import com.sun.mirror.declaration.TypeDeclaration;
 import org.apache.beehive.netui.compiler.AnnotationGrammar;
 import org.apache.beehive.netui.compiler.FlowControllerInfo;
 import org.apache.beehive.netui.compiler.AnnotationMemberType;
+import org.apache.beehive.netui.compiler.CompilerUtils;
+
+import java.util.List;
 
 public class ForwardToExternalPathType
         extends DelegatingType
@@ -40,9 +44,20 @@
     {
         String stringValue = ( String ) value.getValue();
         
+        //
+        // If we're forwarding to an external page, print a warning about error messages on the destination page not
+        // having access to messages defined in the current page flow... *unless* the current page flow has no message
+        // resources defined.
+        //
         if ( stringValue.indexOf( '/' ) != -1 )
         {
-            addWarning( value, "warning.exception-handler-forward-to-external-page", stringValue );
+            TypeDeclaration fcClass = CompilerUtils.getOutermostClass( classMember );
+            List< String > messageResources = 
+                CompilerUtils.getStringArrayValue( fcClass, CONTROLLER_TAG_NAME, MESSAGE_RESOURCES_ATTR, true );
+            if ( messageResources != null && messageResources.size() > 0 )
+            {
+                addWarning( value, "warning.exception-handler-forward-to-external-page", stringValue );
+            }
         }
         
         return super.onCheck( valueDecl, value, parentAnnotation, classMember );

Modified: incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/WebappPathType.java
==============================================================================
--- incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/WebappPathType.java	(original)
+++ incubator/beehive/trunk/netui/src/compiler/org/apache/beehive/netui/compiler/grammar/WebappPathType.java	Mon Sep 20 21:47:07 2004
@@ -30,6 +30,7 @@
 import com.sun.mirror.declaration.TypeDeclaration;
 
 import java.net.URISyntaxException;
+import java.net.URI;
 import java.io.File;
 
 /**
@@ -62,14 +63,15 @@
     public Object onCheck( AnnotationTypeElementDeclaration valueDecl, AnnotationValue value,
                            AnnotationMirror parentAnnotation, MemberDeclaration classMember )
     {
-        String stringValue = ( String ) value.getValue();
+        String filePath = ( String ) value.getValue();
         
         //
         // First make sure it's a valid URI.
         //
         try
         {
-            new java.net.URI( stringValue );
+            URI uri = new URI( filePath );
+            filePath = uri.getPath();   // decodes the path
         }
         catch ( URISyntaxException e )
         {
@@ -84,7 +86,7 @@
             boolean isCheckableExtension = false;
             for ( int i = 0; i < CHECKABLE_EXTENSIONS.length; ++i )
             {
-                if ( stringValue.endsWith( CHECKABLE_EXTENSIONS[i] ) )
+                if ( filePath.endsWith( CHECKABLE_EXTENSIONS[i] ) )
                 {
                     isCheckableExtension = true;
                     break;
@@ -101,16 +103,16 @@
         File jpfFile = CompilerUtils.getOriginalFile( CompilerUtils.getOuterClass( classMember ) );
         File fileToCheck = null;
 
-        if ( stringValue.startsWith( "/" ) )  // relative to webapp root
+        if ( filePath.startsWith( "/" ) )  // relative to webapp root
         {
             if ( _pathMustBeRelative )
             {
                 addError( value, "error.relative-uri" );
             }
             
-            if ( stringValue.endsWith( JPF_FILE_EXTENSION_DOT ) )
+            if ( filePath.endsWith( JPF_FILE_EXTENSION_DOT ) )
             {
-                TypeDeclaration type = CompilerUtils.inferTypeFromPath( stringValue, getEnv() );
+                TypeDeclaration type = CompilerUtils.inferTypeFromPath( filePath, getEnv() );
                 fileToCheck = type != null ? CompilerUtils.getOriginalFile( type ) : null;
                 if ( fileToCheck == null ) fileExists = false;
             }
@@ -120,7 +122,7 @@
                 {
                     // @TODO cache the stringValue of getWebappRootFromJpf.  It's expensive to calculate.
                     File webappRoot = StrutsApp.getWebappRootFromJpf( jpfFile );
-                    fileToCheck = new File( webappRoot + stringValue );
+                    fileToCheck = new File( webappRoot + filePath );
                     
                     if ( ! fileToCheck.exists() && ! ( ignoreDirectories() && fileToCheck.isDirectory() ) )
                     {
@@ -137,12 +139,18 @@
         //
         // In certain error conditions, we can't determine the file.  In this case, just ignore.
         //
-        else if ( jpfFile != null && stringValue.indexOf( '/' ) != 0 )  // under this pageflow's directory
+        else if ( jpfFile != null && filePath.indexOf( '/' ) != 0 )  // under this pageflow's directory
         {
-            if ( stringValue.endsWith( JPF_FILE_EXTENSION_DOT ) )
+            if ( filePath.endsWith( JPF_FILE_EXTENSION_DOT ) )
             {
-                String className = stringValue.substring( 0, stringValue.length() - JPF_FILE_EXTENSION_DOT.length() );
+                String className = filePath.substring( 0, filePath.length() - JPF_FILE_EXTENSION_DOT.length() );
                 String pkg = CompilerUtils.getOutermostClass( classMember ).getPackage().getQualifiedName();
+                while ( className.startsWith( "../" ) && className.length() > 3 )
+                {
+                    className = className.substring( 3 );
+                    int lastDot = pkg.lastIndexOf( '.' );
+                    pkg = lastDot != -1 ? pkg.substring( 0, lastDot ) : "";
+                }
                 className = ( pkg.length() > 0 ? pkg + '.' : "" ) + className.replace( '/', '.' );
                 TypeDeclaration type = getEnv().getTypeDeclaration( className );
                 fileToCheck = type != null ? CompilerUtils.getOriginalFile( type ) : null;
@@ -158,7 +166,7 @@
                 // in the web-addressable part of the webapp, unless we're looking for a .jpf (in the
                 // case that there's a forward to the current page flow from within the page flow).
                 //
-                if ( ! mustBeInPageFlowDir() && ! stringValue.endsWith( JPF_FILE_EXTENSION ) )
+                if ( ! mustBeInPageFlowDir() && ! filePath.endsWith( JPF_FILE_EXTENSION ) )
                 {
                     int webinfSrcPos = jpfFilePath.replace( '\\', '/' ).indexOf( WEBINF_SRC_DIR );
                     if ( webinfSrcPos != -1 )
@@ -169,7 +177,7 @@
                     }
                 }
                 
-                fileToCheck = new File( parentFile, stringValue );
+                fileToCheck = new File( parentFile, filePath );
                 
                 if ( ! fileToCheck.exists() && ! ( ignoreDirectories() && fileToCheck.isDirectory() ) )
                 {
@@ -186,11 +194,11 @@
         {
             if ( doFatalError() )
             {
-                addError( value, "error.file-not-found", stringValue );
+                addError( value, "error.file-not-found", filePath );
             }
             else
             {
-                addWarning( value, "warning.file-not-found", stringValue );
+                addWarning( value, "warning.file-not-found", filePath );
             }
         }
         

Modified: incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/SharedFlow.jpfs
==============================================================================
--- incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/SharedFlow.jpfs	(original)
+++ incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/SharedFlow.jpfs	Mon Sep 20 21:47:07 2004
@@ -16,7 +16,7 @@
 import pageFlowCore.returnToTest.returnToTestController.InputForm;
 
 
-@Jpf.Controller
+@Jpf.Controller( strutsMerge="/WEB-INF/src/global/merge-jpf-struts-config.xml" )
 public class SharedFlow extends SharedFlowController
 {
     private String _pageGroupState = "";
@@ -498,7 +498,7 @@
         forwards = {
             @Jpf.Forward(
                 name = "success",
-                path = "/singletonJpf/jpfTest10/jpf1/jpf1.jpf") 
+                path = "/singletonJpf/jpfTest10/jpf1/Jpf1.jpf") 
         })
    public Forward gblJpfTest10()
       {

Modified: incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF/src/global/merge-jpf-struts-config.xml
==============================================================================
--- incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF/src/global/merge-jpf-struts-config.xml	(original)
+++ incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF/src/global/merge-jpf-struts-config.xml	Mon Sep 20 21:47:07 2004
@@ -16,12 +16,9 @@
    <!-- ========== Action Mapping Definitions ============================== -->
    <action-mappings>
       <action
-         path="/unKnown"
-         parameter="Action (/unKnown) from global.app merge-jpf-struts-config.xml file." >
-      </action>
+         path="/unKnown"/>
       <action
-         path="/unHandledAction"
-         parameter="Action (/unHandledAction) from global.app merge-jpf-struts-config.xml file." >
+         path="/unHandledAction">
          <forward
             contextRelative="true"
             path="/strutsMerge/test2/action1.do"

Added: incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/resources/jsp/qaPageSnap.jspf
==============================================================================
--- (empty file)
+++ incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/resources/jsp/qaPageSnap.jspf	Mon Sep 20 21:47:07 2004
@@ -0,0 +1,20 @@
+         <!-- QA test harness ---------------------------------------------- -->
+         <script>
+            function snapPage()
+                {
+                var blah = document.getElementById(getNetuiTagName("txtBox"));
+                blah.value = "";
+                blah.value = document.documentElement.outerHTML;
+                return true;
+                }
+        </script>
+
+        <br/><br/>
+        <netui:form tagId="qaForm" action="logPage">
+            <center>
+            <netui:hidden tagId="txtBox" dataSource="{actionForm.pageText}" />
+            <netui:button type="submit" value="QA - LogPage" onClick="return snapPage()"/>
+            </center>
+        </netui:form>
+        <br/><br/>
+        <!-- end QA test harness ------------------------------------------- -->

Added: incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/resources/jsp/qaTraceResults.jsp
==============================================================================
--- (empty file)
+++ incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/resources/jsp/qaTraceResults.jsp	Mon Sep 20 21:47:07 2004
@@ -0,0 +1,26 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@ taglib uri="netui-tags-html.tld" prefix="netui" %>
+<%@ taglib uri="netui-tags-databinding.tld" prefix="netui-data" %>
+
+<html>
+    <head>
+        <title>QA Trace results</title>
+    </head>
+    <body>
+        <h3 align="center" style="color: green;">QA Trace results - TraceResults.jsp</h3>
+        <hr width="95%"/>
+        <br/>
+        <ul>
+            <netui-data:repeater dataSource="{session.QaTrace.tracePoints}">
+                <li>
+                    <netui:label value="{container.item}" />
+                </li>
+            </netui-data:repeater>
+        </ul>
+        <center>
+            <hr width="95%"/>
+            <br/>
+            <a href="done.jsp">Okay</a>
+        </center>
+    </body>
+</html>

Modified: incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-config.xml
==============================================================================
--- incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-config.xml	(original)
+++ incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-config.xml	Mon Sep 20 21:47:07 2004
@@ -6,8 +6,9 @@
         <suffix>jspx</suffix>
         <suffix>do</suffix>
         <suffix>jpf</suffix>
+        <suffix>faces</suffix>
         <suffix></suffix>
     </suffixList>
     <servletURI>testRecorder</servletURI>
     <baseDirectory>@BASE_DIR@</baseDirectory>
-</config>
\ No newline at end of file
+</config>