=== modified file 'src/com/goldencode/p2j/cfg/Configuration.java'
--- old/src/com/goldencode/p2j/cfg/Configuration.java	2026-09-22 14:06:34 +0000
+++ new/src/com/goldencode/p2j/cfg/Configuration.java	2026-09-23 11:59:59 +0000
@@ -139,6 +139,7 @@
 **     DDF 20260205          Moved the ArtifactManager initialization to Configuration.
 ** 036 TG  20260728          Added CFG_BINARY_AST constant.
 ** 037 DDF 20260922          Fix unused ArtifactCollection.
+**     DDF 20260923          Replaced isJarMode() with getAbsolutePath().
 */
 
 /*
@@ -888,8 +889,7 @@
             {
                try
                {
-                  col = processFileSet(cfg.getFileSet(),
-                                       ArtifactManager.isJarMode());
+                  col = processFileSet(cfg.getFileSet(), isCaseSensitive());
                   if (col == null || col.isEmpty())
                   {
                      continue;

=== modified file 'src/com/goldencode/p2j/pattern/ServiceSupport.java'
--- old/src/com/goldencode/p2j/pattern/ServiceSupport.java	2026-07-30 11:38:34 +0000
+++ new/src/com/goldencode/p2j/pattern/ServiceSupport.java	2026-09-23 09:59:20 +0000
@@ -50,6 +50,7 @@
 **     DDF 20260406 Log inexistent service files and ensure the correct path is looked up for rest.
 **     DDF 20260407 <wsad:Name/> nodes can contain paths that need to be resolved.
 ** 016 AOG 20260729 Added synchronization as this worker is used during multi-threaded conversion.
+** 017 DDF 20260923 Replaced getCanonicalPath() with getAbsolutePath().
 */
 
 /*
@@ -535,7 +536,7 @@
    private static List<LegacyProxyConfig> parseProxyProgram(File file)
    throws Exception
    {
-      Artifact artifact = ArtifactManager.addArtifact(file.getCanonicalPath());
+      Artifact artifact = ArtifactManager.addArtifact(file.getAbsolutePath());
       Document dom = XmlHelper.parse(new FileInputStream(file));
       
       Element root = dom.getDocumentElement();
@@ -892,7 +893,7 @@
       String defaultService = cfg.getConfig("Name");
       wsdl.addService(defaultService, null);
       
-      Artifact key = ArtifactManager.addArtifact(f.getCanonicalPath());
+      Artifact key = ArtifactManager.addArtifact(f.getAbsolutePath());
       ArtifactCollection value = new ArtifactCollection();
       WorkArea wa = context.get();
       wa.soapArtifacts.putIfAbsent(key, value);
@@ -1052,7 +1053,7 @@
       {
          wa.restArtifacts = new HashMap<>();
       }
-      Artifact key = ArtifactManager.addArtifact(file.getCanonicalPath());
+      Artifact key = ArtifactManager.addArtifact(file.getAbsolutePath());
       ArtifactCollection value = new ArtifactCollection();
       wa.restArtifacts.putIfAbsent(key, value);
       

=== modified file 'src/com/goldencode/p2j/preproc/BuiltinVariable.java'
--- old/src/com/goldencode/p2j/preproc/BuiltinVariable.java	2026-07-17 12:09:50 +0000
+++ new/src/com/goldencode/p2j/preproc/BuiltinVariable.java	2026-09-23 10:30:07 +0000
@@ -33,6 +33,7 @@
 ** 012 DDF 20251022          Moved normalizeFilename() to ArtifactWorker
 **     DDF 20251208          Used wildcards for imports.
 ** 013 AL2 20260717          Skip canonical-path resolution for a runtime include (no server file).
+** 014 DDF 20260923          FILE-NAME uses getAbsolutePath(), strips basepath only if the file is under it.
 */
 
 /*
@@ -292,26 +293,12 @@
             return fs.getFileName();
          }
 
-         String base = env.getOpt().getBasepath();
-
-         try
+         // normalize the base path the same way as the filename, so both use the same separators
+         String base = ArtifactManager.normalizeFilename(env.getOpt().getBasepath()) + File.separator;
+         normalized = ArtifactManager.normalizeFilename(fs.getFile().getAbsolutePath());
+         if (normalized.startsWith(base))
          {
-            // take the base-path relative part of the filename.
-            normalized = ArtifactManager.normalizeFilename(fs.getFile().getCanonicalPath());
             normalized = normalized.substring(base.length());
-            if (normalized.startsWith(File.separator))
-            {
-               normalized = normalized.substring(1);
-            }
-         }
-         
-         catch (IOException e)
-         {
-            env.eprint("Exception caught in &{FILE_NAME} builtin variable",
-                       env.getLex().getLine(),
-                       env.getLex().getColumn());
-            LOG.log(Level.INFO, "", e);
-            normalized = fs.getFileName();
          }
    
          return normalized;

=== modified file 'src/com/goldencode/p2j/preproc/FileScope.java'
--- old/src/com/goldencode/p2j/preproc/FileScope.java	2026-07-16 13:58:38 +0000
+++ new/src/com/goldencode/p2j/preproc/FileScope.java	2026-09-23 11:53:21 +0000
@@ -65,6 +65,8 @@
 ** 025 DDF 20251022          Moved normalizeFilename() to ArtifactWorker.
 **     DDF 20251208          Used wildcards for imports.
 ** 026 AL2 20260716          Made normalizeArguments protected for the RuntimeFileScope subclass.
+** 027 DDF 20260923          Replaced canonicalizePath() with replaceSeparator(), make use of absolutePath().
+**                           findCaseInsensitively() no longer follows symbolic links.
 */
 
 /*
@@ -129,6 +131,7 @@
 import com.goldencode.p2j.util.Utils;
 
 import java.nio.charset.*;
+import java.nio.file.*;
 import java.util.*;
 import java.io.*;
 
@@ -452,53 +455,39 @@
       
       boolean hit = false;
       
-      try
-      {
-         String fileSep = env.getOpt().getFileSeparator();
-         
-         File file = new File(fileName);
-         
-         // locate the file using given paths
-         if (file.isAbsolute() || paths == null)
-         {
-            fullname = Utils.canonicalizePath(fileName, File.separator, fileSep);
+      String fileSep = env.getOpt().getFileSeparator();
+      
+      File file = new File(fileName);
+      
+      // locate the file using given paths
+      if (file.isAbsolute() || paths == null)
+      {
+         fullname = Utils.replaceSeparator(file.getAbsolutePath(), File.separator, fileSep);
+         if ((new File(fullname)).canRead())
+         {
+            hit = true;
+         }
+      }
+      else
+      {
+         for (int i = 0; !hit && i < paths.length; i ++)
+         {
+            StringBuilder sb = new StringBuilder(paths[i]);
+            sb.append(File.separator).append(fileName);
+            String path = sb.toString();
+            fullname = Utils.replaceSeparator(new File(path).getAbsolutePath(), File.separator, fileSep);
+            
             if ((new File(fullname)).canRead())
             {
                hit = true;
             }
          }
-         else
-         {
-            for (int i = 0; !hit && i < paths.length; i ++)
-            {
-               StringBuilder sb = new StringBuilder(paths[i]);
-               sb.append(File.separator).append(fileName);
-               String path = sb.toString();
-               fullname = Utils.canonicalizePath(path, File.separator, fileSep);
-               
-               if ((new File(fullname)).canRead())
-               {
-                  hit = true;
-               }
-            }
-         }
-      }
-      catch (IOException exc)
-      {
-         CharScanner lex = env.getLex();
-         env.eprint("Error canonicalizing filename '" +
-                    fileName +
-                    "';  " +
-                    exc.getMessage(),
-                    lex.getLine(), lex.getColumn());
       }
       
       // special processing for files originating on a case-insensitive file
       // system, when processing them on a case-sensitive file system
       if (!hit && !env.getOpt().isCaseSensitive())
       {
-         File file = new File(fileName);
-         
          // locate the file using given paths
          if (file.isAbsolute() || paths == null)
          {
@@ -817,8 +806,11 @@
       try
       {
          String fileSep = env.getOpt().getFileSeparator();
-         List<File> list =
-            com.goldencode.p2j.util.Utils.getCaseInsensitiveFilenameMatches(filename, fileSep);
+
+         String path = Utils.replaceSeparator(filename, fileSep, File.separator);
+         path = new File(path).getAbsoluteFile().toPath().normalize().toString();
+
+         List<File> list = Utils.getCaseInsensitiveFilenameMatches(path);
          
          int matches = list.size();
          if (matches >= 1)
@@ -842,7 +834,7 @@
             return list.get(0);
          }
       }
-      catch (IOException exc)
+      catch (IOException | InvalidPathException exc)
       {
          CharScanner lex = env.getLex();
          env.eprint("Error searching for include file \"" +

=== modified file 'src/com/goldencode/p2j/uast/AstGenerator.java'
--- old/src/com/goldencode/p2j/uast/AstGenerator.java	2026-03-18 11:53:39 +0000
+++ new/src/com/goldencode/p2j/uast/AstGenerator.java	2026-09-23 10:13:46 +0000
@@ -225,6 +225,7 @@
 **     RAA 20260713          Register generated .w as original instead of rewriting the .htm tree.
 ** 071 TG  20260728          Added useBinaryAst parameter c'tor on XmlFilePlugin.
 ** 072 AOG 20250819          Added resetIds flag value to brainwash method call.
+** 073 DDF 20260923          Replaced getCanonicalPath() with getAbsolutePath().
 */
 
 /*
@@ -1658,7 +1659,7 @@
          
          // persist schema dictionary state
          File schemaFile = createUniqueFile(artifact.getRelativePath(), FileExtensions.DICT_POSTFIX);
-         Artifact schemaArtifact = ArtifactManager.addArtifact(schemaFile.getCanonicalPath());
+         Artifact schemaArtifact = ArtifactManager.addArtifact(schemaFile.getAbsolutePath());
          try
          {
             sym.persistSchemaData(artifact, schemaArtifact);
@@ -1867,19 +1868,8 @@
    private void persistAst(Artifact artifact, Aast ast)
    throws AstException
    {
-      File   target = createUniqueFile(artifact.getRelativePath(), FileExtensions.AST_POSTFIX);
-      Artifact fname  = null;
-      
-      try
-      {
-         fname = ArtifactManager.addArtifact(target.getCanonicalPath());
-      }
-      
-      catch (IOException ioe)
-      {
-         throw new AstException("Invalid filename " + artifact.getRelativePath(), ioe);
-      }
-      
+      File target = createUniqueFile(artifact.getRelativePath(), FileExtensions.AST_POSTFIX);
+      Artifact fname = ArtifactManager.addArtifact(target.getAbsolutePath());
       AstManager.get().saveTree(ast, fname, false);
    }   
    
@@ -1919,19 +1909,7 @@
    throws AstException
    {
       File source = createUniqueFile(artifact.getRelativePath(), FileExtensions.AST_POSTFIX);
-      
-      Artifact fname  = null;
-      
-      try
-      {
-         fname = ArtifactManager.addArtifact(source.getCanonicalPath());
-      }
-      
-      catch (IOException ioe)
-      {
-         throw new AstException("Invalid filename " + artifact.getRelativePath(), ioe);
-      }
-      
+      Artifact fname = ArtifactManager.addArtifact(source.getAbsolutePath());
       return AstManager.get().loadTree(fname);
    }   
    

=== modified file 'src/com/goldencode/p2j/uast/SymbolResolver.java'
--- old/src/com/goldencode/p2j/uast/SymbolResolver.java	2026-07-31 09:19:16 +0000
+++ new/src/com/goldencode/p2j/uast/SymbolResolver.java	2026-09-23 10:14:10 +0000
@@ -584,6 +584,7 @@
 **     DDF 20260406          getOriginalArtifact() returns the given artifact when it fails.
 ** 119 AOG 20250819          Added synchronization as this class is used in multithreaded conversion.
 **     AOG 20250924          Replaced HashSet with LinkedHashSet for consistent ordering of field set.
+** 120 DDF 20260923          Replaced getCanonicalPath() with getAbsolutePath().
 */  
 
 /*
@@ -10228,14 +10229,7 @@
       // quick out: does the exact match exist?
       if (file.exists())
       {
-         try
-         {
-            return file.getCanonicalPath();
-         }
-         catch (IOException e)
-         {
-            // ignore
-         }
+         return file.getAbsolutePath();
       }
       
       if (!caseSens)

