8000741: refactor javadoc to use abstraction to handle relative paths
authorjjg
Tue, 23 Oct 2012 13:20:37 -0700
changeset 14357 faf9cde2817b
parent 14267 6321fbe0cf50
child 14358 9eda9239cba0
8000741: refactor javadoc to use abstraction to handle relative paths Reviewed-by: darcy
langtools/src/share/classes/com/sun/javadoc/SerialFieldTag.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractIndexWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractPackageIndexWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstructorWriterImpl.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/EnumConstantWriterImpl.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/FieldWriterImpl.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/MethodWriterImpl.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/NestedClassWriterImpl.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageTreeWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/TagletWriterImpl.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/TreeWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java
langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AbstractDoclet.java
langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/PackageSummaryWriter.java
langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java
langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java
langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/PackageSummaryBuilder.java
langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java
langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DirectoryManager.java
langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPath.java
langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPaths.java
langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletConstants.java
langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java
langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/PackageListWriter.java
langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/SourcePath.java
langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java
langtools/src/share/classes/com/sun/tools/javadoc/SerializedForm.java
langtools/test/com/sun/javadoc/testIndex/TestIndex.java
langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java
langtools/test/com/sun/javadoc/testPackagePage/TestPackagePage.java
--- a/langtools/src/share/classes/com/sun/javadoc/SerialFieldTag.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/javadoc/SerialFieldTag.java	Tue Oct 23 13:20:37 2012 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -46,7 +46,7 @@
 public interface SerialFieldTag extends Tag, Comparable<Object> {
 
     /**
-     * Return the serialziable field name.
+     * Return the serializable field name.
      */
     public String fieldName();
 
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractIndexWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractIndexWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -56,32 +56,18 @@
     protected IndexBuilder indexbuilder;
 
     /**
-     * This constructor will be used by {@link SplitIndexWriter}. Initialises
+     * This constructor will be used by {@link SplitIndexWriter}. Initializes
      * path to this file and relative path from this file.
      *
+     * @param configuration  The current configuration
      * @param path       Path to the file which is getting generated.
-     * @param filename   Name of the file which is getting genrated.
-     * @param relpath    Relative path from this file to the current directory.
      * @param indexbuilder Unicode based Index from {@link IndexBuilder}
      */
     protected AbstractIndexWriter(ConfigurationImpl configuration,
-                                  String path, String filename,
-                                  String relpath, IndexBuilder indexbuilder)
+                                  DocPath path,
+                                  IndexBuilder indexbuilder)
                                   throws IOException {
-        super(configuration, path, filename, relpath);
-        this.indexbuilder = indexbuilder;
-    }
-
-    /**
-     * This Constructor will be used by {@link SingleIndexWriter}.
-     *
-     * @param filename   Name of the file which is getting genrated.
-     * @param indexbuilder Unicode based Index form {@link IndexBuilder}
-     */
-    protected AbstractIndexWriter(ConfigurationImpl configuration,
-                                  String filename, IndexBuilder indexbuilder)
-                                  throws IOException {
-        super(configuration, filename);
+        super(configuration, path);
         this.indexbuilder = indexbuilder;
     }
 
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractPackageIndexWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractPackageIndexWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -27,9 +27,11 @@
 
 import java.io.*;
 import java.util.*;
+
 import com.sun.javadoc.*;
 import com.sun.tools.doclets.formats.html.markup.*;
 import com.sun.tools.doclets.internal.toolkit.*;
+import com.sun.tools.doclets.internal.toolkit.util.DocPath;
 
 /**
  * Abstract class to generate the overview files in
@@ -52,14 +54,14 @@
     protected PackageDoc[] packages;
 
     /**
-     * Constructor. Also initialises the packages variable.
+     * Constructor. Also initializes the packages variable.
      *
+     * @param configuration  The current configuration
      * @param filename Name of the package index file to be generated.
      */
     public AbstractPackageIndexWriter(ConfigurationImpl configuration,
-                                      String filename) throws IOException {
+                                      DocPath filename) throws IOException {
         super(configuration, filename);
-        this.relativepathNoSlash = ".";
         packages = configuration.packages;
     }
 
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -56,46 +56,23 @@
     private static final String LI_CIRCLE  = "circle";
 
     /**
-     * Constructor initilises classtree variable. This constructor will be used
+     * Constructor initializes classtree variable. This constructor will be used
      * while generating global tree file "overview-tree.html".
      *
+     * @param configuration  The current configuration
      * @param filename   File to be generated.
      * @param classtree  Tree built by {@link ClassTree}.
      * @throws IOException
      * @throws DocletAbortException
      */
     protected AbstractTreeWriter(ConfigurationImpl configuration,
-                                 String filename, ClassTree classtree)
+                                 DocPath filename, ClassTree classtree)
                                  throws IOException {
         super(configuration, filename);
         this.classtree = classtree;
     }
 
     /**
-     * Create appropriate directory for the package and also initilise the
-     * relative path from this generated file to the current or
-     * the destination directory. This constructor will be used while
-     * generating "package tree" file.
-     *
-     * @param path Directories in this path will be created if they are not
-     * already there.
-     * @param filename Name of the package tree file to be generated.
-     * @param classtree The tree built using {@link ClassTree}.
-     * for the package pkg.
-     * @param pkg PackageDoc for which tree file will be generated.
-     * @throws IOException
-     * @throws DocletAbortException
-     */
-    protected AbstractTreeWriter(ConfigurationImpl configuration,
-                                 String path, String filename,
-                                 ClassTree classtree, PackageDoc pkg)
-                                 throws IOException {
-        super(configuration,
-              path, filename, DirectoryManager.getRelativePath(pkg.name()));
-        this.classtree = classtree;
-    }
-
-    /**
      * Add each level of the class tree. For each sub-class or
      * sub-interface indents the next level information.
      * Recurses itself to add subclasses info.
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -51,16 +51,6 @@
 public class AllClassesFrameWriter extends HtmlDocletWriter {
 
     /**
-     * The name of the output file with frames
-     */
-    public static final String OUTPUT_FILE_NAME_FRAMES = "allclasses-frame.html";
-
-    /**
-     * The name of the output file without frames
-     */
-    public static final String OUTPUT_FILE_NAME_NOFRAMES = "allclasses-noframe.html";
-
-    /**
      * Index of all the classes.
      */
     protected IndexBuilder indexbuilder;
@@ -71,13 +61,16 @@
     final HtmlTree BR = new HtmlTree(HtmlTag.BR);
 
     /**
-     * Construct AllClassesFrameWriter object. Also initilises the indexbuilder
+     * Construct AllClassesFrameWriter object. Also initializes the indexbuilder
      * variable in this class.
+     * @param configuration  The current configuration
+     * @param filename       Path to the file which is getting generated.
+     * @param indexbuilder   Unicode based Index from {@link IndexBuilder}
      * @throws IOException
      * @throws DocletAbortException
      */
     public AllClassesFrameWriter(ConfigurationImpl configuration,
-                                 String filename, IndexBuilder indexbuilder)
+                                 DocPath filename, IndexBuilder indexbuilder)
                               throws IOException {
         super(configuration, filename);
         this.indexbuilder = indexbuilder;
@@ -94,13 +87,13 @@
     public static void generate(ConfigurationImpl configuration,
                                 IndexBuilder indexbuilder) {
         AllClassesFrameWriter allclassgen;
-        String filename = OUTPUT_FILE_NAME_FRAMES;
+        DocPath filename = DocPaths.ALLCLASSES_FRAME;
         try {
             allclassgen = new AllClassesFrameWriter(configuration,
                                                     filename, indexbuilder);
             allclassgen.buildAllClassesFile(true);
             allclassgen.close();
-            filename = OUTPUT_FILE_NAME_NOFRAMES;
+            filename = DocPaths.ALLCLASSES_NOFRAME;
             allclassgen = new AllClassesFrameWriter(configuration,
                                                     filename, indexbuilder);
             allclassgen.buildAllClassesFile(false);
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java	Tue Oct 23 13:20:37 2012 -0700
@@ -141,7 +141,7 @@
      */
     protected Content getNavSummaryLink(ClassDoc cd, boolean link) {
         if (link) {
-            return writer.getHyperLink("", "annotation_type_optional_element_summary",
+            return writer.getHyperLink("annotation_type_optional_element_summary",
                     writer.getResource("doclet.navAnnotationTypeOptionalMember"));
         } else {
             return writer.getResource("doclet.navAnnotationTypeOptionalMember");
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java	Tue Oct 23 13:20:37 2012 -0700
@@ -260,7 +260,7 @@
      */
     protected Content getNavSummaryLink(ClassDoc cd, boolean link) {
         if (link) {
-            return writer.getHyperLink("", "annotation_type_required_element_summary",
+            return writer.getHyperLink("annotation_type_required_element_summary",
                     writer.getResource("doclet.navAnnotationTypeRequiredMember"));
         } else {
             return writer.getResource("doclet.navAnnotationTypeRequiredMember");
@@ -272,7 +272,7 @@
      */
     protected void addNavDetailLink(boolean link, Content liNav) {
         if (link) {
-            liNav.addContent(writer.getHyperLink("", "annotation_type_element_detail",
+            liNav.addContent(writer.getHyperLink("annotation_type_element_detail",
                     writer.getResource("doclet.navAnnotationTypeMember")));
         } else {
             liNav.addContent(writer.getResource("doclet.navAnnotationTypeMember"));
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java	Tue Oct 23 13:20:37 2012 -0700
@@ -65,13 +65,10 @@
      * @param prevType the previous class that was documented.
      * @param nextType the next class being documented.
      */
-    public AnnotationTypeWriterImpl (AnnotationTypeDoc annotationType,
+    public AnnotationTypeWriterImpl(AnnotationTypeDoc annotationType,
             Type prevType, Type nextType)
-    throws Exception {
-        super(ConfigurationImpl.getInstance(),
-              DirectoryManager.getDirectoryPath(annotationType.containingPackage()),
-              annotationType.name() + ".html",
-              DirectoryManager.getRelativePath(annotationType.containingPackage().name()));
+            throws Exception {
+        super(ConfigurationImpl.getInstance(), DocPath.forClass(annotationType));
         this.annotationType = annotationType;
         configuration.currentcd = annotationType.asClassDoc();
         this.prev = prevType;
@@ -84,7 +81,7 @@
      * @return a content tree for the package link
      */
     protected Content getNavLinkPackage() {
-        Content linkContent = getHyperLink("package-summary.html", "",
+        Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, "",
                 packageLabel);
         Content li = HtmlTree.LI(linkContent);
         return li;
@@ -106,7 +103,7 @@
      * @return a content tree for the class use link
      */
     protected Content getNavLinkClassUse() {
-        Content linkContent = getHyperLink("class-use/" + filename, "", useLabel);
+        Content linkContent = getHyperLink(DocPaths.CLASS_USE.resolve(filename), "", useLabel);
         Content li = HtmlTree.LI(linkContent);
         return li;
     }
@@ -289,7 +286,7 @@
      * {@inheritDoc}
      */
     protected Content getNavLinkTree() {
-        Content treeLinkContent = getHyperLink("package-tree.html",
+        Content treeLinkContent = getHyperLink(DocPaths.PACKAGE_TREE,
                 "", treeLabel, "", "");
         Content li = HtmlTree.LI(treeLinkContent);
         return li;
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -82,7 +82,6 @@
     final String methodUseTableSummary;
     final String constructorUseTableSummary;
 
-
     /**
      * Constructor.
      *
@@ -91,10 +90,9 @@
      * @throws DocletAbortException
      */
     public ClassUseWriter(ConfigurationImpl configuration,
-                          ClassUseMapper mapper, String path,
-                          String filename, String relpath,
+                          ClassUseMapper mapper, DocPath filename,
                           ClassDoc classdoc) throws IOException {
-        super(configuration, path, filename, relpath);
+        super(configuration, filename);
         this.classdoc = classdoc;
         if (mapper.classToPackageAnnotations.containsKey(classdoc.qualifiedName()))
                 pkgToPackageAnnotations = new HashSet<PackageDoc>(mapper.classToPackageAnnotations.get(classdoc.qualifiedName()));
@@ -199,23 +197,19 @@
     public static void generate(ConfigurationImpl configuration,
                                 ClassUseMapper mapper, ClassDoc classdoc) {
         ClassUseWriter clsgen;
-        String path = DirectoryManager.getDirectoryPath(classdoc.
-                                                            containingPackage());
-        path += "class-use" + DirectoryManager.URL_FILE_SEPARATOR;
-        String filename = classdoc.name() + ".html";
-        String pkgname = classdoc.containingPackage().name();
-        pkgname += (pkgname.length() > 0)? ".class-use": "class-use";
-        String relpath = DirectoryManager.getRelativePath(pkgname);
+        DocPath path = DocPath.forPackage(classdoc)
+                .resolve(DocPaths.CLASS_USE)
+                .resolve(DocPath.forName(classdoc));
         try {
             clsgen = new ClassUseWriter(configuration,
-                                        mapper, path, filename,
-                                        relpath, classdoc);
+                                        mapper, path,
+                                        classdoc);
             clsgen.generateClassUseFile();
             clsgen.close();
         } catch (IOException exc) {
             configuration.standardmessage.
                 error("doclet.exception_encountered",
-                      exc.toString(), filename);
+                      exc.toString(), path.getPath());
             throw new DocletAbortException();
         }
     }
@@ -359,7 +353,7 @@
      */
     protected void addPackageUse(PackageDoc pkg, Content contentTree) throws IOException {
         Content tdFirst = HtmlTree.TD(HtmlStyle.colFirst,
-                getHyperLink("", pkg.name(), new StringContent(Util.getPackageName(pkg))));
+                getHyperLink(pkg.name(), new StringContent(Util.getPackageName(pkg))));
         contentTree.addContent(tdFirst);
         HtmlTree tdLast = new HtmlTree(HtmlTag.TD);
         tdLast.addStyle(HtmlStyle.colLast);
@@ -470,8 +464,8 @@
      * @return a content tree for the package link
      */
     protected Content getNavLinkPackage() {
-        Content linkContent = getHyperLink("../package-summary.html", "",
-                packageLabel);
+        Content linkContent =
+                getHyperLink(DocPath.parent.resolve(DocPaths.PACKAGE_SUMMARY), "", packageLabel);
         Content li = HtmlTree.LI(linkContent);
         return li;
     }
@@ -506,8 +500,8 @@
      */
     protected Content getNavLinkTree() {
         Content linkContent = classdoc.containingPackage().isIncluded() ?
-            getHyperLink("../package-tree.html", "", treeLabel) :
-            getHyperLink(relativePath + "overview-tree.html", "", treeLabel);
+            getHyperLink(DocPath.parent.resolve(DocPaths.PACKAGE_TREE), "", treeLabel) :
+            getHyperLink(pathToRoot.resolve(DocPaths.OVERVIEW_TREE), "", treeLabel);
         Content li = HtmlTree.LI(linkContent);
         return li;
     }
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java	Tue Oct 23 13:20:37 2012 -0700
@@ -72,11 +72,8 @@
      */
     public ClassWriterImpl (ClassDoc classDoc,
             ClassDoc prevClass, ClassDoc nextClass, ClassTree classTree)
-    throws Exception {
-        super(ConfigurationImpl.getInstance(),
-              DirectoryManager.getDirectoryPath(classDoc.containingPackage()),
-              classDoc.name() + ".html",
-              DirectoryManager.getRelativePath(classDoc.containingPackage().name()));
+            throws Exception {
+        super(ConfigurationImpl.getInstance(), DocPath.forClass(classDoc));
         this.classDoc = classDoc;
         configuration.currentcd = classDoc;
         this.classtree = classTree;
@@ -90,7 +87,7 @@
      * @return a content tree for the package link
      */
     protected Content getNavLinkPackage() {
-        Content linkContent = getHyperLink("package-summary.html", "",
+        Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, "",
                 packageLabel);
         Content li = HtmlTree.LI(linkContent);
         return li;
@@ -112,7 +109,7 @@
      * @return a content tree for the class use link
      */
     protected Content getNavLinkClassUse() {
-        Content linkContent = getHyperLink("class-use/" + filename, "", useLabel);
+        Content linkContent = getHyperLink(DocPaths.CLASS_USE.resolve(filename), "", useLabel);
         Content li = HtmlTree.LI(linkContent);
         return li;
     }
@@ -567,7 +564,7 @@
      * {@inheritDoc}
      */
     protected Content getNavLinkTree() {
-        Content treeLinkContent = getHyperLink("package-tree.html",
+        Content treeLinkContent = getHyperLink(DocPaths.PACKAGE_TREE,
                 "", treeLabel, "", "");
         Content li = HtmlTree.LI(treeLinkContent);
         return li;
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java	Tue Oct 23 13:20:37 2012 -0700
@@ -62,11 +62,6 @@
     public static final String BUILD_DATE = System.getProperty("java.version");
 
     /**
-     * The name of the constant values file.
-     */
-    public static final String CONSTANTS_FILE_NAME = "constant-values.html";
-
-    /**
      * Argument for command line option "-header".
      */
     public String header = "";
@@ -179,7 +174,7 @@
      * First file to appear in the right-hand frame in the generated
      * documentation.
      */
-    public String topFile = "";
+    public DocPath topFile = DocPath.empty;
 
     /**
      * The classdoc for the class file getting generated.
@@ -447,18 +442,17 @@
             return;
         }
         if (createoverview) {
-            topFile = "overview-summary.html";
+            topFile = DocPaths.OVERVIEW_SUMMARY;
         } else {
             if (packages.length == 1 && packages[0].name().equals("")) {
                 if (root.classes().length > 0) {
                     ClassDoc[] classarr = root.classes();
                     Arrays.sort(classarr);
                     ClassDoc cd = getValidClass(classarr);
-                    topFile = DirectoryManager.getPathToClass(cd);
+                    topFile = DocPath.forClass(cd);
                 }
             } else {
-                topFile = DirectoryManager.getPathToPackage(packages[0],
-                                                            "package-summary.html");
+                topFile = DocPath.forPackage(packages[0]).resolve(DocPaths.PACKAGE_SUMMARY);
             }
         }
     }
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java	Tue Oct 23 13:20:37 2012 -0700
@@ -69,7 +69,7 @@
      */
     public ConstantsSummaryWriterImpl(ConfigurationImpl configuration)
             throws IOException {
-        super(configuration, ConfigurationImpl.CONSTANTS_FILE_NAME);
+        super(configuration, DocPaths.CONSTANT_VALUES);
         this.configuration = configuration;
         constantsTableSummary = configuration.getText("doclet.Constants_Table_Summary",
                 configuration.getText("doclet.Constants_Summary"));
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstructorWriterImpl.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstructorWriterImpl.java	Tue Oct 23 13:20:37 2012 -0700
@@ -280,7 +280,7 @@
      */
     protected Content getNavSummaryLink(ClassDoc cd, boolean link) {
         if (link) {
-            return writer.getHyperLink("", "constructor_summary",
+            return writer.getHyperLink("constructor_summary",
                     writer.getResource("doclet.navConstructor"));
         } else {
             return writer.getResource("doclet.navConstructor");
@@ -292,7 +292,7 @@
      */
     protected void addNavDetailLink(boolean link, Content liNav) {
         if (link) {
-            liNav.addContent(writer.getHyperLink("", "constructor_detail",
+            liNav.addContent(writer.getHyperLink("constructor_detail",
                     writer.getResource("doclet.navConstructor")));
         } else {
             liNav.addContent(writer.getResource("doclet.navConstructor"));
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -95,7 +95,7 @@
      * @param filename the file to be generated.
      */
     public DeprecatedListWriter(ConfigurationImpl configuration,
-                                String filename) throws IOException {
+                                DocPath filename) throws IOException {
         super(configuration, filename);
         this.configuration = configuration;
         NestedClassWriterImpl classW = new NestedClassWriterImpl(this);
@@ -116,7 +116,7 @@
      * @param configuration the current configuration of the doclet.
      */
     public static void generate(ConfigurationImpl configuration) {
-        String filename = "deprecated-list.html";
+        DocPath filename = DocPaths.DEPRECATED_LIST;
         try {
             DeprecatedListWriter depr =
                    new DeprecatedListWriter(configuration, filename);
@@ -180,7 +180,7 @@
     private void addIndexLink(DeprecatedAPIListBuilder builder,
             int type, Content contentTree) {
         if (builder.hasDocumentation(type)) {
-            Content li = HtmlTree.LI(getHyperLink("#" + ANCHORS[type],
+            Content li = HtmlTree.LI(getHyperLink(ANCHORS[type],
                     getResource(HEADING_KEYS[type])));
             contentTree.addContent(li);
         }
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/EnumConstantWriterImpl.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/EnumConstantWriterImpl.java	Tue Oct 23 13:20:37 2012 -0700
@@ -263,7 +263,7 @@
      */
     protected Content getNavSummaryLink(ClassDoc cd, boolean link) {
         if (link) {
-            return writer.getHyperLink("", (cd == null)?
+            return writer.getHyperLink((cd == null)?
                 "enum_constant_summary":
                 "enum_constants_inherited_from_class_" +
                 configuration().getClassName(cd),
@@ -278,7 +278,7 @@
      */
     protected void addNavDetailLink(boolean link, Content liNav) {
         if (link) {
-            liNav.addContent(writer.getHyperLink("", "enum_constant_detail",
+            liNav.addContent(writer.getHyperLink("enum_constant_detail",
                     writer.getResource("doclet.navEnum")));
         } else {
             liNav.addContent(writer.getResource("doclet.navEnum"));
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FieldWriterImpl.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FieldWriterImpl.java	Tue Oct 23 13:20:37 2012 -0700
@@ -293,7 +293,7 @@
      */
     protected Content getNavSummaryLink(ClassDoc cd, boolean link) {
         if (link) {
-            return writer.getHyperLink("", (cd == null)?
+            return writer.getHyperLink((cd == null)?
                 "field_summary":
                 "fields_inherited_from_class_" +
                 configuration().getClassName(cd),
@@ -308,7 +308,7 @@
      */
     protected void addNavDetailLink(boolean link, Content liNav) {
         if (link) {
-            liNav.addContent(writer.getHyperLink("", "field_detail",
+            liNav.addContent(writer.getHyperLink("field_detail",
                     writer.getResource("doclet.navField")));
         } else {
             liNav.addContent(writer.getResource("doclet.navField"));
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -63,7 +63,7 @@
      * @param filename File to be generated.
      */
     public FrameOutputWriter(ConfigurationImpl configuration,
-                             String filename) throws IOException {
+                             DocPath filename) throws IOException {
         super(configuration, filename);
     noOfPackages = configuration.packages.length;
     }
@@ -77,9 +77,9 @@
      */
     public static void generate(ConfigurationImpl configuration) {
         FrameOutputWriter framegen;
-        String filename = "";
+        DocPath filename = DocPath.empty;
         try {
-            filename = "index.html";
+            filename = DocPaths.INDEX;
             framegen = new FrameOutputWriter(configuration, filename);
             framegen.generateFrameFile();
             framegen.close();
@@ -92,7 +92,7 @@
     }
 
     /**
-     * Generate the contants in the "index.html" file. Print the frame details
+     * Generate the constants in the "index.html" file. Print the frame details
      * as well as warning if browser is not supporting the Html frames.
      */
     protected void generateFrameFile() throws IOException {
@@ -155,8 +155,8 @@
      * @param contentTree the content tree to which the information will be added
      */
     private void addAllPackagesFrameTag(Content contentTree) {
-        HtmlTree frame = HtmlTree.FRAME("overview-frame.html", "packageListFrame",
-                configuration.getText("doclet.All_Packages"));
+        HtmlTree frame = HtmlTree.FRAME(DocPaths.OVERVIEW_FRAME.getPath(),
+                "packageListFrame", configuration.getText("doclet.All_Packages"));
         contentTree.addContent(frame);
     }
 
@@ -166,8 +166,8 @@
      * @param contentTree the content tree to which the information will be added
      */
     private void addAllClassesFrameTag(Content contentTree) {
-        HtmlTree frame = HtmlTree.FRAME("allclasses-frame.html", "packageFrame",
-                configuration.getText("doclet.All_classes_and_interfaces"));
+        HtmlTree frame = HtmlTree.FRAME(DocPaths.ALLCLASSES_FRAME.getPath(),
+                "packageFrame", configuration.getText("doclet.All_classes_and_interfaces"));
         contentTree.addContent(frame);
     }
 
@@ -177,7 +177,7 @@
      * @param contentTree the content tree to which the information will be added
      */
     private void addClassFrameTag(Content contentTree) {
-        HtmlTree frame = HtmlTree.FRAME(configuration.topFile, "classFrame",
+        HtmlTree frame = HtmlTree.FRAME(configuration.topFile.getPath(), "classFrame",
                 configuration.getText("doclet.Package_class_and_interface_descriptions"),
                 SCROLL_YES);
         contentTree.addContent(frame);
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -49,7 +49,7 @@
      * @param filename File to be generated.
      */
     public HelpWriter(ConfigurationImpl configuration,
-                      String filename) throws IOException {
+                      DocPath filename) throws IOException {
         super(configuration, filename);
     }
 
@@ -62,9 +62,9 @@
      */
     public static void generate(ConfigurationImpl configuration) {
         HelpWriter helpgen;
-        String filename = "";
+        DocPath filename = DocPath.empty;
         try {
-            filename = "help-doc.html";
+            filename = DocPaths.HELP_DOC;
             helpgen = new HelpWriter(configuration, filename);
             helpgen.generateHelpFile();
             helpgen.close();
@@ -113,7 +113,7 @@
                 getResource("doclet.Overview"));
             Content liOverview = HtmlTree.LI(HtmlStyle.blockList, overviewHeading);
             Content line3 = getResource("doclet.Help_line_3",
-                    getHyperLinkString("overview-summary.html",
+                    getHyperLinkString(DocPaths.OVERVIEW_SUMMARY,
                     configuration.getText("doclet.Overview")));
             Content overviewPara = HtmlTree.P(line3);
             liOverview.addContent(overviewPara);
@@ -234,7 +234,7 @@
                     getResource("doclet.Help_line_16"));
             Content liTree = HtmlTree.LI(HtmlStyle.blockList, treeHead);
             Content line17 = getResource("doclet.Help_line_17_with_tree_link",
-                    getHyperLinkString("overview-tree.html",
+                    getHyperLinkString(DocPaths.OVERVIEW_TREE,
                     configuration.getText("doclet.Class_Hierarchy")));
             Content treePara = HtmlTree.P(line17);
             liTree.addContent(treePara);
@@ -252,7 +252,7 @@
                     getResource("doclet.Deprecated_API"));
             Content liDeprecated = HtmlTree.LI(HtmlStyle.blockList, dHead);
             Content line20 = getResource("doclet.Help_line_20_with_deprecated_api_link",
-                    getHyperLinkString("deprecated-list.html",
+                    getHyperLinkString(DocPaths.DEPRECATED_LIST,
                     configuration.getText("doclet.Deprecated_API")));
             Content dPara = HtmlTree.P(line20);
             liDeprecated.addContent(dPara);
@@ -261,10 +261,10 @@
         if (configuration.createindex) {
             String indexlink;
             if (configuration.splitindex) {
-                indexlink = getHyperLinkString("index-files/index-1.html",
+                indexlink = getHyperLinkString(DocPaths.INDEX_FILES.resolve(DocPaths.indexN(1)),
                         configuration.getText("doclet.Index"));
             } else {
-                indexlink = getHyperLinkString("index-all.html",
+                indexlink = getHyperLinkString(DocPaths.INDEX_ALL,
                         configuration.getText("doclet.Index"));
             }
             Content indexHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING,
@@ -293,7 +293,7 @@
                 getResource("doclet.All_Classes"));
         Content liAllClasses = HtmlTree.LI(HtmlStyle.blockList, allclassesHead);
         Content line27 = getResource("doclet.Help_line_27",
-                getHyperLinkString("allclasses-noframe.html",
+                getHyperLinkString(DocPaths.ALLCLASSES_NOFRAME,
                 configuration.getText("doclet.All_Classes")));
         Content allclassesPara = HtmlTree.P(line27);
         liAllClasses.addContent(allclassesPara);
@@ -309,7 +309,7 @@
                 getResource("doclet.Constants_Summary"));
         Content liConst = HtmlTree.LI(HtmlStyle.blockList, constHead);
         Content line29 = getResource("doclet.Help_line_29",
-                getHyperLinkString("constant-values.html",
+                getHyperLinkString(DocPaths.CONSTANT_VALUES,
                 configuration.getText("doclet.Constants_Summary")));
         Content constPara = HtmlTree.P(line29);
         liConst.addContent(constPara);
@@ -325,6 +325,7 @@
      *
      * @return a content tree for the help label
      */
+    @Override
     protected Content getNavLinkHelp() {
         Content li = HtmlTree.LI(HtmlStyle.navBarCell1Rev, helpLabel);
         return li;
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java	Tue Oct 23 13:20:37 2012 -0700
@@ -94,17 +94,11 @@
             throws Exception {
         super.generateOtherFiles(root, classtree);
         if (configuration.linksource) {
-            if (configuration.destDirName.length() > 0) {
-                SourceToHTMLConverter.convertRoot(configuration,
-                    root, configuration.destDirName + File.separator
-                    + DocletConstants.SOURCE_OUTPUT_DIR_NAME);
-            } else {
-                SourceToHTMLConverter.convertRoot(configuration,
-                    root, DocletConstants.SOURCE_OUTPUT_DIR_NAME);
-            }
+            SourceToHTMLConverter.convertRoot(configuration,
+                root, DocPaths.SOURCE_OUTPUT);
         }
 
-        if (configuration.topFile.length() == 0) {
+        if (configuration.topFile.isEmpty()) {
             configuration.standardmessage.
                 error("doclet.No_Non_Deprecated_Classes_To_Document");
             return;
@@ -155,9 +149,8 @@
         // If a stylesheet file is not specified, copy the default stylesheet
         // and replace newline with platform-specific newline.
         if (configuration.stylesheetfile.length() == 0) {
-            Util.copyFile(configuration, "stylesheet.css", Util.RESOURCESDIR,
-                    (configdestdir.isEmpty()) ?
-                        System.getProperty("user.dir") : configdestdir, false, true);
+            Util.copyFile(configuration, "stylesheet.css", DocPaths.RESOURCES,
+                    DocPath.empty, false, true);
         }
     }
 
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -55,32 +55,24 @@
     /**
      * Relative path from the file getting generated to the destination
      * directory. For example, if the file getting generated is
-     * "java/lang/Object.html", then the relative path string is "../../".
+     * "java/lang/Object.html", then the path to the root is "../..".
      * This string can be empty if the file getting generated is in
      * the destination directory.
      */
-    public String relativePath = "";
+    public final DocPath pathToRoot;
 
     /**
-     * Same as relativepath, but normalized to never be empty or
-     * end with a slash.
-     */
-    public String relativepathNoSlash = "";
-
-    /**
-     * Platform-dependent directory path from the current or the
+     * Platform-independent path from the current or the
      * destination directory to the file getting generated.
      * Used when creating the file.
-     * For example, if the file getting generated is
-     * "java/lang/Object.html", then the path string is "java/lang".
      */
-    public String path = "";
+    public final DocPath path;
 
     /**
      * Name of the file getting generated. If the file getting generated is
      * "java/lang/Object.html", then the filename is "Object.html".
      */
-    public String filename = "";
+    public final DocPath filename;
 
     /**
      * The display length used for indentation while generating the class page.
@@ -100,33 +92,15 @@
     /**
      * Constructor to construct the HtmlStandardWriter object.
      *
-     * @param filename File to be generated.
+     * @param path File to be generated.
      */
-    public HtmlDocletWriter(ConfigurationImpl configuration,
-                              String filename) throws IOException {
-        super(configuration, filename);
-        this.configuration = configuration;
-        this.filename = filename;
-    }
-
-    /**
-     * Constructor to construct the HtmlStandardWriter object.
-     *
-     * @param path         Platform-dependent {@link #path} used when
-     *                     creating file.
-     * @param filename     Name of file to be generated.
-     * @param relativePath Value for the variable {@link #relativePath}.
-     */
-    public HtmlDocletWriter(ConfigurationImpl configuration,
-                              String path, String filename,
-                              String relativePath) throws IOException {
-        super(configuration, path, filename);
+    public HtmlDocletWriter(ConfigurationImpl configuration, DocPath path)
+            throws IOException {
+        super(configuration, path);
         this.configuration = configuration;
         this.path = path;
-        this.relativePath = relativePath;
-        this.relativepathNoSlash =
-            DirectoryManager.getPathNoTrailingSlash(this.relativePath);
-        this.filename = filename;
+        this.pathToRoot = path.parent().invert();
+        this.filename = path.basename();
     }
 
     /**
@@ -165,8 +139,9 @@
         int previndex = 0;
         while (true) {
             if (configuration.docrootparent.length() > 0) {
+                final String docroot_parent = "{@docroot}/..";
                 // Search for lowercase version of {@docRoot}/..
-                index = lowerHtml.indexOf("{@docroot}/..", previndex);
+                index = lowerHtml.indexOf(docroot_parent, previndex);
                 // If next {@docRoot}/.. pattern not found, append rest of htmlstr and exit loop
                 if (index < 0) {
                     buf.append(htmlstr.substring(previndex));
@@ -174,17 +149,18 @@
                 }
                 // If next {@docroot}/.. pattern found, append htmlstr up to start of tag
                 buf.append(htmlstr.substring(previndex, index));
-                previndex = index + 13;  // length for {@docroot}/.. string
+                previndex = index + docroot_parent.length();
                 // Insert docrootparent absolute path where {@docRoot}/.. was located
 
                 buf.append(configuration.docrootparent);
                 // Append slash if next character is not a slash
                 if (previndex < htmlstr.length() && htmlstr.charAt(previndex) != '/') {
-                    buf.append(DirectoryManager.URL_FILE_SEPARATOR);
+                    buf.append('/');
                 }
             } else {
+                final String docroot = "{@docroot}";
                 // Search for lowercase version of {@docRoot}
-                index = lowerHtml.indexOf("{@docroot}", previndex);
+                index = lowerHtml.indexOf(docroot, previndex);
                 // If next {@docRoot} tag not found, append rest of htmlstr and exit loop
                 if (index < 0) {
                     buf.append(htmlstr.substring(previndex));
@@ -192,13 +168,12 @@
                 }
                 // If next {@docroot} tag found, append htmlstr up to start of tag
                 buf.append(htmlstr.substring(previndex, index));
-                previndex = index + 10;  // length for {@docroot} string
+                previndex = index + docroot.length();
                 // Insert relative path where {@docRoot} was located
-                buf.append(relativepathNoSlash);
+                buf.append(pathToRoot.isEmpty() ? "." : pathToRoot.getPath());
                 // Append slash if next character is not a slash
-                if (relativepathNoSlash.length() > 0 && previndex < htmlstr.length() &&
-                        htmlstr.charAt(previndex) != '/') {
-                    buf.append(DirectoryManager.URL_FILE_SEPARATOR);
+                if (previndex < htmlstr.length() && htmlstr.charAt(previndex) != '/') {
+                    buf.append('/');
                 }
             }
         }
@@ -312,7 +287,7 @@
      */
     public Content getTargetPackageLink(PackageDoc pd, String target,
             Content label) {
-        return getHyperLink(pathString(pd, "package-summary.html"), "", label, "", target);
+        return getHyperLink(pathString(pd, DocPaths.PACKAGE_SUMMARY), "", label, "", target);
     }
 
     /**
@@ -539,8 +514,8 @@
      * @return a content tree for the link
      */
     protected Content getNavLinkContents() {
-        Content linkContent = getHyperLink(relativePath +
-                "overview-summary.html", "", overviewLabel, "", "");
+        Content linkContent = getHyperLink(pathToRoot.resolve(DocPaths.OVERVIEW_SUMMARY),
+                "", overviewLabel, "", "");
         Content li = HtmlTree.LI(linkContent);
         return li;
     }
@@ -584,7 +559,7 @@
      * @param prev File name for the prev link
      * @return a content tree for the link
      */
-    public Content getNavLinkPrevious(String prev) {
+    public Content getNavLinkPrevious(DocPath prev) {
         Content li;
         if (prev != null) {
             li = HtmlTree.LI(getHyperLink(prev, "", prevLabel, "", ""));
@@ -601,7 +576,7 @@
      * @param next File name for the next link
      * @return a content tree for the link
      */
-    public Content getNavLinkNext(String next) {
+    public Content getNavLinkNext(DocPath next) {
         Content li;
         if (next != null) {
             li = HtmlTree.LI(getHyperLink(next, "", nextLabel, "", ""));
@@ -617,9 +592,9 @@
      * @param link File to be linked, "index.html"
      * @return a content tree for the link
      */
-    protected Content getNavShowLists(String link) {
-        Content framesContent = getHyperLink(link + "?" + path +
-                filename, "", framesLabel, "", "_top");
+    protected Content getNavShowLists(DocPath link) {
+        Content framesContent = getHyperLink(link.getPath() + "?" + path.getPath(),
+                "", framesLabel, "", "_top");
         Content li = HtmlTree.LI(framesContent);
         return li;
     }
@@ -630,7 +605,7 @@
      * @return a content tree for the link
      */
     protected Content getNavShowLists() {
-        return getNavShowLists(relativePath + "index.html");
+        return getNavShowLists(pathToRoot.resolve(DocPaths.INDEX));
     }
 
     /**
@@ -639,7 +614,7 @@
      * @param link File to be linked
      * @return a content tree for the link
      */
-    protected Content getNavHideLists(String link) {
+    protected Content getNavHideLists(DocPath link) {
         Content noFramesContent = getHyperLink(link, "", noframesLabel, "", "_top");
         Content li = HtmlTree.LI(noFramesContent);
         return li;
@@ -658,10 +633,10 @@
         PackageDoc[] packages = configuration.root.specifiedPackages();
         if (packages.length == 1 && configuration.root.specifiedClasses().length == 0) {
             treeLinkContent = getHyperLink(pathString(packages[0],
-                    "package-tree.html"), "", treeLabel,
+                    DocPaths.PACKAGE_TREE), "", treeLabel,
                     "", "");
         } else {
-            treeLinkContent = getHyperLink(relativePath + "overview-tree.html",
+            treeLinkContent = getHyperLink(pathToRoot.resolve(DocPaths.OVERVIEW_TREE),
                     "", treeLabel, "", "");
         }
         Content li = HtmlTree.LI(treeLinkContent);
@@ -675,7 +650,7 @@
      * @return a content tree for the link
      */
     protected Content getNavLinkMainTree(String label) {
-        Content mainTreeContent = getHyperLink(relativePath + "overview-tree.html",
+        Content mainTreeContent = getHyperLink(pathToRoot.resolve(DocPaths.OVERVIEW_TREE),
                 new StringContent(label));
         Content li = HtmlTree.LI(mainTreeContent);
         return li;
@@ -697,8 +672,8 @@
      * @return a content tree for the link
      */
     protected Content getNavLinkDeprecated() {
-        Content linkContent = getHyperLink(relativePath +
-                "deprecated-list.html", "", deprecatedLabel, "", "");
+        Content linkContent = getHyperLink(pathToRoot.resolve(DocPaths.DEPRECATED_LIST),
+                "", deprecatedLabel, "", "");
         Content li = HtmlTree.LI(linkContent);
         return li;
     }
@@ -711,8 +686,8 @@
      * @return a content tree for the link
      */
     protected Content getNavLinkClassIndex() {
-        Content allClassesContent = getHyperLink(relativePath +
-                AllClassesFrameWriter.OUTPUT_FILE_NAME_NOFRAMES, "",
+        Content allClassesContent = getHyperLink(pathToRoot.resolve(
+                DocPaths.ALLCLASSES_NOFRAME), "",
                 allclassesLabel, "", "");
         Content li = HtmlTree.LI(allClassesContent);
         return li;
@@ -724,9 +699,10 @@
      * @return a content tree for the link
      */
     protected Content getNavLinkIndex() {
-        Content linkContent = getHyperLink(relativePath +(configuration.splitindex?
-            DirectoryManager.getPath("index-files") + fileseparator: "") +
-            (configuration.splitindex?"index-1.html" : "index-all.html"), "",
+        Content linkContent = getHyperLink(pathToRoot.resolve(
+                (configuration.splitindex
+                    ? DocPaths.INDEX_FILES.resolve(DocPaths.indexN(1))
+                    : DocPaths.INDEX_ALL)), "",
             indexLabel, "", "");
         Content li = HtmlTree.LI(linkContent);
         return li;
@@ -740,16 +716,14 @@
      * @return a content tree for the link
      */
     protected Content getNavLinkHelp() {
-        String helpfilenm = configuration.helpfile;
-        if (helpfilenm.equals("")) {
-            helpfilenm = "help-doc.html";
+        String helpfile = configuration.helpfile;
+        DocPath helpfilenm;
+        if (helpfile.isEmpty()) {
+            helpfilenm = DocPaths.HELP_DOC;
         } else {
-            int lastsep;
-            if ((lastsep = helpfilenm.lastIndexOf(File.separatorChar)) != -1) {
-                helpfilenm = helpfilenm.substring(lastsep + 1);
-            }
+            helpfilenm = DocPath.create(new File(helpfile).getName());
         }
-        Content linkContent = getHyperLink(relativePath + helpfilenm, "",
+        Content linkContent = getHyperLink(pathToRoot.resolve(helpfilenm), "",
                 helpLabel, "", "");
         Content li = HtmlTree.LI(linkContent);
         return li;
@@ -884,25 +858,13 @@
     }
 
     /**
-     * Return path to the class page for a classdoc. For example, the class
-     * name is "java.lang.Object" and if the current file getting generated is
-     * "java/io/File.html", then the path string to the class, returned is
-     * "../../java/lang.Object.html".
-     *
-     * @param cd Class to which the path is requested.
-     */
-    protected String pathToClass(ClassDoc cd) {
-        return pathString(cd.containingPackage(), cd.name() + ".html");
-    }
-
-    /**
      * Return the path to the class page for a classdoc. Works same as
      * {@link #pathToClass(ClassDoc)}.
      *
      * @param cd   Class to which the path is requested.
      * @param name Name of the file(doesn't include path).
      */
-    protected String pathString(ClassDoc cd, String name) {
+    protected DocPath pathString(ClassDoc cd, DocPath name) {
         return pathString(cd.containingPackage(), name);
     }
 
@@ -915,10 +877,8 @@
      * @param pd Package in which the file name is assumed to be.
      * @param name File name, to which path string is.
      */
-    protected String pathString(PackageDoc pd, String name) {
-        StringBuilder buf = new StringBuilder(relativePath);
-        buf.append(DirectoryManager.getPathToPackage(pd, name));
-        return buf.toString();
+    protected DocPath pathString(PackageDoc pd, DocPath name) {
+        return pathToRoot.resolve(DocPath.forPackage(pd).resolve(name));
     }
 
     /**
@@ -956,12 +916,12 @@
             }
         }
         if (included || pkg == null) {
-            return getHyperLinkString(pathString(pkg, "package-summary.html"),
+            return getHyperLinkString(pathString(pkg, DocPaths.PACKAGE_SUMMARY),
                                 "", label, isStrong, style);
         } else {
             String crossPkgLink = getCrossPackageLink(Util.getPackageName(pkg));
             if (crossPkgLink != null) {
-                return getHyperLinkString(crossPkgLink, "", label, isStrong, style);
+                return getHyperLinkString(/*TEMP*/ DocPath.create(crossPkgLink), "", label, isStrong, style);
             } else {
                 return label;
             }
@@ -987,12 +947,12 @@
             }
         }
         if (included || pkg == null) {
-            return getHyperLink(pathString(pkg, "package-summary.html"),
+            return getHyperLink(pathString(pkg, DocPaths.PACKAGE_SUMMARY),
                                 "", label);
         } else {
             String crossPkgLink = getCrossPackageLink(Util.getPackageName(pkg));
             if (crossPkgLink != null) {
-                return getHyperLink(crossPkgLink, "", label);
+                return getHyperLink(/*TEMP*/ DocPath.create(crossPkgLink), "", label);
             } else {
                 return label;
             }
@@ -1020,10 +980,10 @@
             //d must be a class doc since in has no containing class.
             cd = (ClassDoc) doc;
         }
-        String href = relativePath + DocletConstants.SOURCE_OUTPUT_DIR_NAME
-                + DirectoryManager.getDirectoryPath(cd.containingPackage())
-                + cd.name() + ".html#" + SourceToHTMLConverter.getAnchorName(doc);
-        Content linkContent = getHyperLink(href, "", label, "", "");
+        DocPath href = pathToRoot
+                .resolve(DocPaths.SOURCE_OUTPUT)
+                .resolve(DocPath.forClass(cd));
+        Content linkContent = getHyperLink(href, SourceToHTMLConverter.getAnchorName(doc), label, "", "");
         htmltree.addContent(linkContent);
     }
 
@@ -1085,7 +1045,7 @@
                 //exists, but no way to determine if the external class exists.  We just
                 //have to assume that it does.
                 return getHyperLinkString(
-                    configuration.extern.getExternalLink(packageName, relativePath,
+                    configuration.extern.getExternalLink(packageName, pathToRoot,
                                 className + ".html?is-external=true"),
                     refMemName == null ? "" : refMemName,
                     label == null || label.length() == 0 ? defaultLabel : label,
@@ -1105,7 +1065,7 @@
     }
 
     public String getCrossPackageLink(String pkgName) {
-        return configuration.extern.getExternalLink(pkgName, relativePath,
+        return configuration.extern.getExternalLink(pkgName, pathToRoot,
             "package-summary.html?is-external=true");
     }
 
@@ -1321,7 +1281,7 @@
                 String classCrossLink, packageCrossLink = getCrossPackageLink(refClassName);
                 if (packageCrossLink != null) {
                     //Package cross link found
-                    return getHyperLinkString(packageCrossLink, "",
+                    return getHyperLinkString(/*TEMP*/ DocPath.create(packageCrossLink), "",
                         (label.isEmpty() ? text : label), false);
                 } else if ((classCrossLink = getCrossClassLink(refClassName,
                         refMemName, label, false, "", !plain)) != null) {
@@ -1450,7 +1410,7 @@
      * @param doc the doc for which the comment tags will be generated
      * @param tags the first sentence tags for the doc
      * @param depr true if it is deprecated
-     * @param first true if the first sentenge tags should be added
+     * @param first true if the first sentence tags should be added
      * @param htmltree the documentation tree to which the comment tags will be added
      */
     private void addCommentTags(Doc doc, Tag[] tags, boolean depr,
@@ -1561,7 +1521,7 @@
 
     /**
      * Suppose a piece of documentation has a relative link.  When you copy
-     * that documetation to another place such as the index or class-use page,
+     * that documentation to another place such as the index or class-use page,
      * that relative link will no longer work.  We should redirect those links
      * so that they will work again.
      * <p>
@@ -1587,21 +1547,17 @@
             return text;
         }
 
-        String redirectPathFromRoot;
+        DocPath redirectPathFromRoot;
         if (doc instanceof ClassDoc) {
-            redirectPathFromRoot = DirectoryManager.getDirectoryPath(((ClassDoc) doc).containingPackage());
+            redirectPathFromRoot = DocPath.forPackage(((ClassDoc) doc).containingPackage());
         } else if (doc instanceof MemberDoc) {
-            redirectPathFromRoot = DirectoryManager.getDirectoryPath(((MemberDoc) doc).containingPackage());
+            redirectPathFromRoot = DocPath.forPackage(((MemberDoc) doc).containingPackage());
         } else if (doc instanceof PackageDoc) {
-            redirectPathFromRoot = DirectoryManager.getDirectoryPath((PackageDoc) doc);
+            redirectPathFromRoot = DocPath.forPackage((PackageDoc) doc);
         } else {
             return text;
         }
 
-        if (! redirectPathFromRoot.endsWith(DirectoryManager.URL_FILE_SEPARATOR)) {
-            redirectPathFromRoot += DirectoryManager.URL_FILE_SEPARATOR;
-        }
-
         //Redirect all relative links.
         int end, begin = text.toLowerCase().indexOf("<a");
         if(begin >= 0){
@@ -1627,22 +1583,21 @@
                     //might be missing '>' character because the href has an inline tag.
                     break;
                 }
-                if(textBuff.substring(begin, end).indexOf("\"") != -1){
+                if (textBuff.substring(begin, end).indexOf("\"") != -1){
                     begin = textBuff.indexOf("\"", begin) + 1;
                     end = textBuff.indexOf("\"", begin +1);
-                    if(begin == 0 || end == -1){
+                    if (begin == 0 || end == -1){
                         //Link is missing a quote.
                         break;
                     }
                 }
                 String relativeLink = textBuff.substring(begin, end);
-                if(!(relativeLink.toLowerCase().startsWith("mailto:") ||
-                     relativeLink.toLowerCase().startsWith("http:") ||
-                     relativeLink.toLowerCase().startsWith("https:") ||
-                     relativeLink.toLowerCase().startsWith("file:"))){
-                     relativeLink = "{@"+(new DocRootTaglet()).getName() + "}"
-                        + redirectPathFromRoot
-                        + relativeLink;
+                if (!(relativeLink.toLowerCase().startsWith("mailto:") ||
+                        relativeLink.toLowerCase().startsWith("http:") ||
+                        relativeLink.toLowerCase().startsWith("https:") ||
+                        relativeLink.toLowerCase().startsWith("file:"))) {
+                    relativeLink = "{@"+(new DocRootTaglet()).getName() + "}/"
+                        + redirectPathFromRoot.resolve(relativeLink).getPath();
                     textBuff.replace(begin, end, relativeLink);
                 }
                 begin = textBuff.toString().toLowerCase().indexOf("<a", begin + 1);
@@ -1715,17 +1670,15 @@
      */
     public HtmlTree getStyleSheetProperties() {
         String filename = configuration.stylesheetfile;
+        DocPath stylesheet;
         if (filename.length() > 0) {
-            File stylefile = new File(filename);
-            String parent = stylefile.getParent();
-            filename = (parent == null)?
-                filename:
-                filename.substring(parent.length() + 1);
+            stylesheet = DocPath.create(new File(filename).getName());
         } else {
-            filename = "stylesheet.css";
+            stylesheet = DocPaths.STYLESHEET;
         }
-        filename = relativePath + filename;
-        HtmlTree link = HtmlTree.LINK("stylesheet", "text/css", filename, "Style");
+        HtmlTree link = HtmlTree.LINK("stylesheet", "text/css",
+                pathToRoot.resolve(stylesheet).getPath(),
+                "Style");
         return link;
     }
 
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java	Tue Oct 23 13:20:37 2012 -0700
@@ -78,9 +78,9 @@
         LinkOutputImpl linkOutput = new LinkOutputImpl();
         if (classDoc.isIncluded()) {
             if (configuration.isGeneratedDoc(classDoc)) {
-                String filename = pathString(classLinkInfo);
+                DocPath filename = getPath(classLinkInfo);
                 if (linkInfo.linkToSelf ||
-                                !(linkInfo.classDoc.name() + ".html").equals(m_writer.filename)) {
+                                !(DocPath.forName(classDoc)).equals(m_writer.filename)) {
                         linkOutput.append(m_writer.getHyperLinkString(filename,
                             classLinkInfo.where, label.toString(),
                             classLinkInfo.isStrong, classLinkInfo.styleName,
@@ -161,16 +161,12 @@
      *
      * @param linkInfo the information about the link.
      */
-    private String pathString(LinkInfoImpl linkInfo) {
+    private DocPath getPath(LinkInfoImpl linkInfo) {
         if (linkInfo.context == LinkInfoImpl.PACKAGE_FRAME) {
             //Not really necessary to do this but we want to be consistent
             //with 1.4.2 output.
-            return linkInfo.classDoc.name() + ".html";
+            return DocPath.forName(linkInfo.classDoc);
         }
-        StringBuilder buf = new StringBuilder(m_writer.relativePath);
-        buf.append(DirectoryManager.getPathToPackage(
-            linkInfo.classDoc.containingPackage(),
-            linkInfo.classDoc.name() + ".html"));
-        return buf.toString();
+        return m_writer.pathToRoot.resolve(DocPath.forClass(linkInfo.classDoc));
     }
 }
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/MethodWriterImpl.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/MethodWriterImpl.java	Tue Oct 23 13:20:37 2012 -0700
@@ -400,7 +400,7 @@
      */
     protected Content getNavSummaryLink(ClassDoc cd, boolean link) {
         if (link) {
-            return writer.getHyperLink("", (cd == null)?
+            return writer.getHyperLink((cd == null)?
                 "method_summary":
                 "methods_inherited_from_class_" +
                 configuration().getClassName(cd),
@@ -415,7 +415,7 @@
      */
     protected void addNavDetailLink(boolean link, Content liNav) {
         if (link) {
-            liNav.addContent(writer.getHyperLink("", "method_detail",
+            liNav.addContent(writer.getHyperLink("method_detail",
                     writer.getResource("doclet.navMethod")));
         } else {
             liNav.addContent(writer.getResource("doclet.navMethod"));
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/NestedClassWriterImpl.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/NestedClassWriterImpl.java	Tue Oct 23 13:20:37 2012 -0700
@@ -203,9 +203,8 @@
      */
     protected Content getNavSummaryLink(ClassDoc cd, boolean link) {
         if (link) {
-            return writer.getHyperLink("", (cd == null) ? "nested_class_summary":
-                "nested_classes_inherited_from_class_" +
-                cd.qualifiedName(),
+            return writer.getHyperLink((cd == null) ? "nested_class_summary":
+                "nested_classes_inherited_from_class_" + cd.qualifiedName(),
                 writer.getResource("doclet.navNested"));
         } else {
             return writer.getResource("doclet.navNested");
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -60,17 +60,12 @@
     private Set<ClassDoc> documentedClasses;
 
     /**
-     * The name of the output file.
-     */
-    public static final String OUTPUT_FILE_NAME = "package-frame.html";
-
-    /**
      * Constructor to construct PackageFrameWriter object and to generate
      * "package-frame.html" file in the respective package directory.
      * For example for package "java.lang" this will generate file
      * "package-frame.html" file in the "java/lang" directory. It will also
      * create "java/lang" directory in the current or the destination directory
-     * if it doesen't exist.
+     * if it doesn't exist.
      *
      * @param configuration the configuration of the doclet.
      * @param packageDoc PackageDoc under consideration.
@@ -78,7 +73,7 @@
     public PackageFrameWriter(ConfigurationImpl configuration,
                               PackageDoc packageDoc)
                               throws IOException {
-        super(configuration, DirectoryManager.getDirectoryPath(packageDoc), OUTPUT_FILE_NAME, DirectoryManager.getRelativePath(packageDoc));
+        super(configuration, DocPath.forPackage(packageDoc).resolve(DocPaths.PACKAGE_FRAME));
         this.packageDoc = packageDoc;
         if (configuration.root.specifiedPackages().length == 0) {
             documentedClasses = new HashSet<ClassDoc>(Arrays.asList(configuration.root.classes()));
@@ -113,7 +108,7 @@
         } catch (IOException exc) {
             configuration.standardmessage.error(
                     "doclet.exception_encountered",
-                    exc.toString(), OUTPUT_FILE_NAME);
+                    exc.toString(), DocPaths.PACKAGE_FRAME.getPath());
             throw new DocletAbortException();
         }
     }
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -52,7 +52,7 @@
      * @param filename Name of the package index file to be generated.
      */
     public PackageIndexFrameWriter(ConfigurationImpl configuration,
-                                   String filename) throws IOException {
+                                   DocPath filename) throws IOException {
         super(configuration, filename);
     }
 
@@ -62,7 +62,7 @@
      */
     public static void generate(ConfigurationImpl configuration) {
         PackageIndexFrameWriter packgen;
-        String filename = "overview-frame.html";
+        DocPath filename = DocPaths.OVERVIEW_FRAME;
         try {
             packgen = new PackageIndexFrameWriter(configuration, filename);
             packgen.buildPackageIndexFile("doclet.Window_Overview", false);
@@ -109,11 +109,11 @@
         if (pd.name().length() > 0) {
             packageLabel = getPackageLabel(pd.name());
             packageLinkContent = getHyperLink(pathString(pd,
-                    "package-frame.html"), "", packageLabel, "",
+                     DocPaths.PACKAGE_FRAME), "", packageLabel, "",
                     "packageFrame");
         } else {
             packageLabel = new RawHtml("&lt;unnamed package&gt;");
-            packageLinkContent = getHyperLink("package-frame.html",
+            packageLinkContent = getHyperLink(DocPaths.PACKAGE_FRAME,
                     "", packageLabel, "", "packageFrame");
         }
         Content li = HtmlTree.LI(packageLinkContent);
@@ -148,7 +148,7 @@
      * @param body the Content object to which the all classes link should be added
      */
     protected void addAllClassesLink(Content body) {
-        Content linkContent = getHyperLink("allclasses-frame.html", "",
+        Content linkContent = getHyperLink(DocPaths.ALLCLASSES_FRAME, "",
                 allclassesLabel, "", "packageFrame");
         Content div = HtmlTree.DIV(HtmlStyle.indexHeader, linkContent);
         body.addContent(div);
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -36,7 +36,7 @@
 /**
  * Generate the package index page "overview-summary.html" for the right-hand
  * frame. A click on the package name on this page will update the same frame
- * with the "pacakge-summary.html" file for the clicked package.
+ * with the "package-summary.html" file for the clicked package.
  *
  *  <p><b>This is NOT part of any supported API.
  *  If you write code that depends on this, you do so at your own risk.
@@ -73,7 +73,7 @@
      * @see Group
      */
     public PackageIndexWriter(ConfigurationImpl configuration,
-                              String filename)
+                              DocPath filename)
                        throws IOException {
         super(configuration, filename);
         this.root = configuration.root;
@@ -88,7 +88,7 @@
      */
     public static void generate(ConfigurationImpl configuration) {
         PackageIndexWriter packgen;
-        String filename = "overview-summary.html";
+        DocPath filename = DocPaths.OVERVIEW_SUMMARY;
         try {
             packgen = new PackageIndexWriter(configuration, filename);
             packgen.buildPackageIndexFile("doclet.Window_Overview_Summary", true);
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageTreeWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageTreeWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -67,15 +67,14 @@
      * @throws DocletAbortException
      */
     public PackageTreeWriter(ConfigurationImpl configuration,
-                             String path, String filename,
+                             DocPath path,
                              PackageDoc packagedoc,
                              PackageDoc prev, PackageDoc next)
                       throws IOException {
-        super(configuration, path, filename,
+        super(configuration, path,
               new ClassTree(
                 configuration.classDocCatalog.allClasses(packagedoc),
-                configuration),
-              packagedoc);
+                configuration));
         this.packagedoc = packagedoc;
         this.prev = prev;
         this.next = next;
@@ -96,17 +95,16 @@
                                 PackageDoc pkg, PackageDoc prev,
                                 PackageDoc next, boolean noDeprecated) {
         PackageTreeWriter packgen;
-        String path = DirectoryManager.getDirectoryPath(pkg);
-        String filename = "package-tree.html";
+        DocPath path = DocPath.forPackage(pkg).resolve(DocPaths.PACKAGE_TREE);
         try {
-            packgen = new PackageTreeWriter(configuration, path, filename, pkg,
+            packgen = new PackageTreeWriter(configuration, path, pkg,
                 prev, next);
             packgen.generatePackageTreeFile();
             packgen.close();
         } catch (IOException exc) {
             configuration.standardmessage.error(
                         "doclet.exception_encountered",
-                        exc.toString(), filename);
+                        exc.toString(), path.getPath());
             throw new DocletAbortException();
         }
     }
@@ -175,9 +173,8 @@
         if (prev == null) {
             return getNavLinkPrevious(null);
         } else {
-            String path = DirectoryManager.getRelativePath(packagedoc.name(),
-                    prev.name());
-            return getNavLinkPrevious(path + "package-tree.html");
+            DocPath path = DocPath.relativePath(packagedoc, prev);
+            return getNavLinkPrevious(path.resolve(DocPaths.PACKAGE_TREE));
         }
     }
 
@@ -190,9 +187,8 @@
         if (next == null) {
             return getNavLinkNext(null);
         } else {
-            String path = DirectoryManager.getRelativePath(packagedoc.name(),
-                    next.name());
-            return getNavLinkNext(path + "package-tree.html");
+            DocPath path = DocPath.relativePath(packagedoc, next);
+            return getNavLinkNext(path.resolve(DocPaths.PACKAGE_TREE));
         }
     }
 
@@ -202,7 +198,7 @@
      * @return a content tree for the package link
      */
     protected Content getNavLinkPackage() {
-        Content linkContent = getHyperLink("package-summary.html", "",
+        Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, "",
                 packageLabel);
         Content li = HtmlTree.LI(linkContent);
         return li;
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -57,11 +57,9 @@
      * @throws DocletAbortException
      */
     public PackageUseWriter(ConfigurationImpl configuration,
-                            ClassUseMapper mapper, String filename,
+                            ClassUseMapper mapper, DocPath filename,
                             PackageDoc pkgdoc) throws IOException {
-        super(configuration, DirectoryManager.getDirectoryPath(pkgdoc),
-              filename,
-              DirectoryManager.getRelativePath(pkgdoc.name()));
+        super(configuration, DocPath.forPackage(pkgdoc).resolve(filename));
         this.pkgdoc = pkgdoc;
 
         // by examining all classes in this package, find what packages
@@ -98,7 +96,7 @@
     public static void generate(ConfigurationImpl configuration,
                                 ClassUseMapper mapper, PackageDoc pkgdoc) {
         PackageUseWriter pkgusegen;
-        String filename = "package-use.html";
+        DocPath filename = DocPaths.PACKAGE_USE;
         try {
             pkgusegen = new PackageUseWriter(configuration,
                                              mapper, filename, pkgdoc);
@@ -232,8 +230,8 @@
      */
     protected void addClassRow(ClassDoc usedClass, String packageName,
             Content contentTree) {
-        String path = pathString(usedClass,
-                "class-use/" + usedClass.name() + ".html");
+        DocPath path = pathString(usedClass,
+                DocPaths.CLASS_USE.resolve(DocPath.forName(usedClass)));
         Content td = HtmlTree.TD(HtmlStyle.colOne,
                 getHyperLink(path, packageName, new StringContent(usedClass.name())));
         addIndexComment(usedClass, td);
@@ -248,7 +246,7 @@
      */
     protected void addPackageUse(PackageDoc pkg, Content contentTree) throws IOException {
         Content tdFirst = HtmlTree.TD(HtmlStyle.colFirst,
-                getHyperLink("", Util.getPackageName(pkg),
+                getHyperLink(Util.getPackageName(pkg),
                 new RawHtml(Util.getPackageName(pkg))));
         contentTree.addContent(tdFirst);
         HtmlTree tdLast = new HtmlTree(HtmlTag.TD);
@@ -288,7 +286,7 @@
      * @return a content tree for the package link
      */
     protected Content getNavLinkPackage() {
-        Content linkContent = getHyperLink("package-summary.html", "",
+        Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, "",
                 packageLabel);
         Content li = HtmlTree.LI(linkContent);
         return li;
@@ -310,7 +308,7 @@
      * @return a content tree for the tree link
      */
     protected Content getNavLinkTree() {
-        Content linkContent = getHyperLink("package-tree.html", "",
+        Content linkContent = getHyperLink(DocPaths.PACKAGE_TREE, "",
                 treeLabel);
         Content li = HtmlTree.LI(linkContent);
         return li;
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java	Tue Oct 23 13:20:37 2012 -0700
@@ -65,17 +65,12 @@
     protected PackageDoc packageDoc;
 
     /**
-     * The name of the output file.
-     */
-    private static final String OUTPUT_FILE_NAME = "package-summary.html";
-
-    /**
      * Constructor to construct PackageWriter object and to generate
      * "package-summary.html" file in the respective package directory.
      * For example for package "java.lang" this will generate file
      * "package-summary.html" file in the "java/lang" directory. It will also
      * create "java/lang" directory in the current or the destination directory
-     * if it doesen't exist.
+     * if it doesn't exist.
      *
      * @param configuration the configuration of the doclet.
      * @param packageDoc    PackageDoc under consideration.
@@ -83,25 +78,15 @@
      * @param next            Next package in the sorted array.
      */
     public PackageWriterImpl(ConfigurationImpl configuration,
-        PackageDoc packageDoc, PackageDoc prev, PackageDoc next)
-    throws IOException {
-        super(configuration, DirectoryManager.getDirectoryPath(packageDoc), OUTPUT_FILE_NAME,
-             DirectoryManager.getRelativePath(packageDoc.name()));
+            PackageDoc packageDoc, PackageDoc prev, PackageDoc next)
+            throws IOException {
+        super(configuration, DocPath.forPackage(packageDoc).resolve(DocPaths.PACKAGE_SUMMARY));
         this.prev = prev;
         this.next = next;
         this.packageDoc = packageDoc;
     }
 
     /**
-     * Return the name of the output file.
-     *
-     * @return the name of the output file.
-     */
-    public String getOutputFileName() {
-        return OUTPUT_FILE_NAME;
-    }
-
-    /**
      * {@inheritDoc}
      */
     public Content getPackageHeader(String heading) {
@@ -265,7 +250,7 @@
      * @return a content tree for the class use link
      */
     protected Content getNavLinkClassUse() {
-        Content useLink = getHyperLink("package-use.html", "",
+        Content useLink = getHyperLink(DocPaths.PACKAGE_USE, "",
                 useLabel, "", "");
         Content li = HtmlTree.LI(useLink);
         return li;
@@ -281,9 +266,8 @@
         if (prev == null) {
             li = HtmlTree.LI(prevpackageLabel);
         } else {
-            String path = DirectoryManager.getRelativePath(packageDoc.name(),
-                                                           prev.name());
-            li = HtmlTree.LI(getHyperLink(path + "package-summary.html", "",
+            DocPath path = DocPath.relativePath(packageDoc, prev);
+            li = HtmlTree.LI(getHyperLink(path.resolve(DocPaths.PACKAGE_SUMMARY), "",
                 prevpackageLabel, "", ""));
         }
         return li;
@@ -299,9 +283,8 @@
         if (next == null) {
             li = HtmlTree.LI(nextpackageLabel);
         } else {
-            String path = DirectoryManager.getRelativePath(packageDoc.name(),
-                                                           next.name());
-            li = HtmlTree.LI(getHyperLink(path + "package-summary.html", "",
+            DocPath path = DocPath.relativePath(packageDoc, next);
+            li = HtmlTree.LI(getHyperLink(path.resolve(DocPaths.PACKAGE_SUMMARY), "",
                 nextpackageLabel, "", ""));
         }
         return li;
@@ -314,7 +297,7 @@
      * @return a content tree for the tree link
      */
     protected Content getNavLinkTree() {
-        Content useLink = getHyperLink("package-tree.html", "",
+        Content useLink = getHyperLink(DocPaths.PACKAGE_TREE, "",
                 treeLabel, "", "");
         Content li = HtmlTree.LI(useLink);
         return li;
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java	Tue Oct 23 13:20:37 2012 -0700
@@ -29,6 +29,7 @@
 import com.sun.javadoc.*;
 import com.sun.tools.doclets.formats.html.markup.*;
 import com.sun.tools.doclets.internal.toolkit.*;
+import com.sun.tools.doclets.internal.toolkit.util.DocPaths;
 import com.sun.tools.doclets.internal.toolkit.util.DocletAbortException;
 
 /**
@@ -44,14 +45,12 @@
 public class SerializedFormWriterImpl extends SubWriterHolderWriter
     implements SerializedFormWriter {
 
-    private static final String FILE_NAME = "serialized-form.html";
-
     /**
      * @throws IOException
      * @throws DocletAbortException
      */
     public SerializedFormWriterImpl() throws IOException {
-        super(ConfigurationImpl.getInstance(), FILE_NAME);
+        super(ConfigurationImpl.getInstance(), DocPaths.SERIALIZED_FORM);
     }
 
     /**
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -55,11 +55,9 @@
      * @param indexbuilder Unicode based Index from {@link IndexBuilder}
      */
     public SingleIndexWriter(ConfigurationImpl configuration,
-                             String filename,
+                             DocPath filename,
                              IndexBuilder indexbuilder) throws IOException {
         super(configuration, filename, indexbuilder);
-        relativepathNoSlash = ".";
-        relativePath = "./";
     }
 
     /**
@@ -71,7 +69,7 @@
     public static void generate(ConfigurationImpl configuration,
                                 IndexBuilder indexbuilder) {
         SingleIndexWriter indexgen;
-        String filename = "index-all.html";
+        DocPath filename = DocPaths.INDEX_ALL;
         try {
             indexgen = new SingleIndexWriter(configuration,
                                              filename, indexbuilder);
@@ -117,7 +115,7 @@
         for (int i = 0; i < indexbuilder.elements().length; i++) {
             String unicode = (indexbuilder.elements())[i].toString();
             contentTree.addContent(
-                    getHyperLink("#_" + unicode + "_", new StringContent(unicode)));
+                    getHyperLink("_" + unicode + "_", new StringContent(unicode)));
             contentTree.addContent(getSpace());
         }
     }
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -62,7 +62,7 @@
      * Relative path from the documentation root to the file that is being
      * generated.
      */
-    private static String relativePath = "";
+    private static DocPath relativePath = DocPath.empty;
 
     /**
      * Source is converted to HTML using static methods below.
@@ -77,7 +77,7 @@
      * @param outputdir the name of the directory to output to.
      */
     public static void convertRoot(ConfigurationImpl configuration, RootDoc rd,
-            String outputdir) {
+            DocPath outputdir) {
         if (rd == null || outputdir == null) {
             return;
         }
@@ -108,11 +108,11 @@
      * @param outputdir the name of the directory to output to.
      */
     public static void convertPackage(ConfigurationImpl configuration, PackageDoc pd,
-            String outputdir) {
+            DocPath outputdir) {
         if (pd == null || outputdir == null) {
             return;
         }
-        String classOutputdir = getPackageOutputDir(outputdir, pd);
+        DocPath classOutputdir = getPackageOutputDir(outputdir, pd);
         ClassDoc[] cds = pd.allClasses();
         for (int i = 0; i < cds.length; i++) {
             // If -nodeprecated option is set and the class is marked as deprecated,
@@ -131,9 +131,8 @@
      * @param pd the Package to generate output for.
      * @return the package output directory as a String.
      */
-    private static String getPackageOutputDir(String outputDir, PackageDoc pd) {
-        return outputDir + File.separator +
-            DirectoryManager.getDirectoryPath(pd) + File.separator;
+    private static DocPath getPackageOutputDir(DocPath outputDir, PackageDoc pd) {
+        return outputDir.resolve(DocPath.forPackage(pd));
     }
 
     /**
@@ -144,7 +143,7 @@
      * @param outputdir the name of the directory to output to.
      */
     public static void convertClass(ConfigurationImpl configuration, ClassDoc cd,
-            String outputdir) {
+            DocPath outputdir) {
         if (cd == null || outputdir == null) {
             return;
         }
@@ -168,8 +167,9 @@
             LineNumberReader reader = new LineNumberReader(r);
             int lineno = 1;
             String line;
-            relativePath = DirectoryManager.getRelativePath(DocletConstants.SOURCE_OUTPUT_DIR_NAME) +
-                    DirectoryManager.getRelativePath(cd.containingPackage());
+            relativePath = DocPaths.SOURCE_OUTPUT
+                    .resolve(DocPath.forPackage(cd))
+                    .invert();
             Content body = getHeader();
             Content pre = new HtmlTree(HtmlTag.PRE);
             try {
@@ -198,7 +198,7 @@
      * @param className the name of the class that I am converting to HTML.
      * @param configuration the Doclet configuration to pass notices to.
      */
-    private static void writeToFile(Content body, String outputDir,
+    private static void writeToFile(Content body, DocPath outputDir,
             String className, ConfigurationImpl configuration) throws IOException {
         Content htmlDocType = DocType.Transitional();
         Content head = new HtmlTree(HtmlTag.HEAD);
@@ -208,7 +208,7 @@
         Content htmlTree = HtmlTree.HTML(configuration.getLocale().getLanguage(),
                 head, body);
         Content htmlDocument = new HtmlDocument(htmlDocType, htmlTree);
-        File dir = new File(outputDir);
+        File dir = outputDir.resolveAgainst(configuration.destDirName);
         dir.mkdirs();
         File newFile = new File(dir, className + ".html");
         configuration.message.notice("doclet.Generating_0", newFile.getPath());
@@ -227,17 +227,14 @@
      */
     public static HtmlTree getStyleSheetProperties(ConfigurationImpl configuration) {
         String filename = configuration.stylesheetfile;
+        DocPath stylesheet;
         if (filename.length() > 0) {
-            File stylefile = new File(filename);
-            String parent = stylefile.getParent();
-            filename = (parent == null)?
-                filename:
-                filename.substring(parent.length() + 1);
+            stylesheet = DocPath.create(new File(filename).getName());
         } else {
-            filename = "stylesheet.css";
+            stylesheet = DocPaths.STYLESHEET;
         }
-        filename = relativePath + filename;
-        HtmlTree link = HtmlTree.LINK("stylesheet", "text/css", filename, "Style");
+        DocPath p = relativePath.resolve(stylesheet);
+        HtmlTree link = HtmlTree.LINK("stylesheet", "text/css", p.getPath(), "Style");
         return link;
     }
 
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -67,10 +67,10 @@
      * @param indexbuilder Unicode based Index from {@link IndexBuilder}
      */
     public SplitIndexWriter(ConfigurationImpl configuration,
-                            String path, String filename,
-                            String relpath, IndexBuilder indexbuilder,
+                            DocPath path,
+                            IndexBuilder indexbuilder,
                             int prev, int next) throws IOException {
-        super(configuration, path, filename, relpath, indexbuilder);
+        super(configuration, path, indexbuilder);
         this.prev = prev;
         this.next = next;
     }
@@ -85,17 +85,16 @@
     public static void generate(ConfigurationImpl configuration,
                                 IndexBuilder indexbuilder) {
         SplitIndexWriter indexgen;
-        String filename = "";
-        String path = DirectoryManager.getPath("index-files");
-        String relpath = DirectoryManager.getRelativePath("index-files");
+        DocPath filename = DocPath.empty;
+        DocPath path = DocPaths.INDEX_FILES;
         try {
             for (int i = 0; i < indexbuilder.elements().length; i++) {
                 int j = i + 1;
                 int prev = (j == 1)? -1: i;
                 int next = (j == indexbuilder.elements().length)? -1: j + 1;
-                filename = "index-" + j +".html";
+                filename = DocPaths.indexN(j);
                 indexgen = new SplitIndexWriter(configuration,
-                                                path, filename, relpath,
+                                                path.resolve(filename),
                                                 indexbuilder, prev, next);
                 indexgen.generateIndexFile((Character)indexbuilder.
                                                                  elements()[i]);
@@ -104,7 +103,7 @@
         } catch (IOException exc) {
             configuration.standardmessage.error(
                         "doclet.exception_encountered",
-                        exc.toString(), filename);
+                        exc.toString(), filename.getPath());
             throw new DocletAbortException();
         }
     }
@@ -142,7 +141,7 @@
         Object[] unicodeChars = indexbuilder.elements();
         for (int i = 0; i < unicodeChars.length; i++) {
             int j = i + 1;
-            contentTree.addContent(getHyperLink("index-" + j + ".html",
+            contentTree.addContent(getHyperLink(DocPaths.indexN(j),
                     new StringContent(unicodeChars[i].toString())));
             contentTree.addContent(getSpace());
         }
@@ -159,7 +158,7 @@
             return HtmlTree.LI(prevletterLabel);
         }
         else {
-            Content prevLink = getHyperLink("index-" + prev + ".html", "",
+            Content prevLink = getHyperLink(DocPaths.indexN(prev), "",
                     prevletterLabel);
             return HtmlTree.LI(prevLink);
         }
@@ -176,7 +175,7 @@
             return HtmlTree.LI(nextletterLabel);
         }
         else {
-            Content nextLink = getHyperLink("index-" + next + ".html","",
+            Content nextLink = getHyperLink(DocPaths.indexN(next), "",
                     nextletterLabel);
             return HtmlTree.LI(nextLink);
         }
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -54,18 +54,11 @@
  */
 public abstract class SubWriterHolderWriter extends HtmlDocletWriter {
 
-    public SubWriterHolderWriter(ConfigurationImpl configuration,
-                                 String filename) throws IOException {
+    public SubWriterHolderWriter(ConfigurationImpl configuration, DocPath filename)
+            throws IOException {
         super(configuration, filename);
     }
 
-
-    public SubWriterHolderWriter(ConfigurationImpl configuration,
-                                 String path, String filename, String relpath)
-                                 throws IOException {
-        super(configuration, path, filename, relpath);
-    }
-
     /**
      * Add the summary header.
      *
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TagletWriterImpl.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TagletWriterImpl.java	Tue Oct 23 13:20:37 2012 -0700
@@ -66,8 +66,10 @@
     public TagletOutput getDocRootOutput() {
         if (htmlWriter.configuration.docrootparent.length() > 0)
             return new TagletOutputImpl(htmlWriter.configuration.docrootparent);
+        else if (htmlWriter.pathToRoot.isEmpty())
+            return new TagletOutputImpl(".");
         else
-            return new TagletOutputImpl(htmlWriter.relativepathNoSlash);
+            return new TagletOutputImpl(htmlWriter.pathToRoot.getPath());
     }
 
     /**
@@ -170,18 +172,18 @@
                 htmlWriter instanceof ClassWriterImpl) {
             //Automatically add link to constant values page for constant fields.
             result = addSeeHeader(result);
-            result += htmlWriter.getHyperLinkString(htmlWriter.relativePath +
-                ConfigurationImpl.CONSTANTS_FILE_NAME
-                + "#" + ((ClassWriterImpl) htmlWriter).getClassDoc().qualifiedName()
+            result += htmlWriter.getHyperLinkString(htmlWriter.pathToRoot.resolve(
+                DocPaths.CONSTANT_VALUES),
+                ((ClassWriterImpl) htmlWriter).getClassDoc().qualifiedName()
                 + "." + ((FieldDoc) holder).name(),
-                htmlWriter.configuration.getText("doclet.Constants_Summary"));
+                htmlWriter.configuration.getText("doclet.Constants_Summary"), false);
         }
         if (holder.isClass() && ((ClassDoc)holder).isSerializable()) {
             //Automatically add link to serialized form page for serializable classes.
             if ((SerializedFormBuilder.serialInclude(holder) &&
                       SerializedFormBuilder.serialInclude(((ClassDoc)holder).containingPackage()))) {
                 result = addSeeHeader(result);
-                result += htmlWriter.getHyperLinkString(htmlWriter.relativePath + "serialized-form.html",
+                result += htmlWriter.getHyperLinkString(htmlWriter.pathToRoot.resolve(DocPaths.SERIALIZED_FORM),
                         ((ClassDoc)holder).qualifiedName(), htmlWriter.configuration.getText("doclet.Serialized_Form"), false);
             }
         }
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TreeWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TreeWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -67,7 +67,7 @@
      * @param classtree the tree being built.
      */
     public TreeWriter(ConfigurationImpl configuration,
-            String filename, ClassTree classtree)
+            DocPath filename, ClassTree classtree)
     throws IOException {
         super(configuration, filename, classtree);
         packages = configuration.packages;
@@ -84,7 +84,7 @@
     public static void generate(ConfigurationImpl configuration,
                                 ClassTree classtree) {
         TreeWriter treegen;
-        String filename = "overview-tree.html";
+        DocPath filename = DocPaths.OVERVIEW_TREE;
         try {
             treegen = new TreeWriter(configuration, filename, classtree);
             treegen.generateTreeFile();
@@ -144,7 +144,7 @@
                         (configuration.nodeprecated && Util.isDeprecated(packages[i]))) {
                     continue;
                 }
-                String link = pathString(packages[i], "package-tree.html");
+                DocPath link = pathString(packages[i], DocPaths.PACKAGE_TREE);
                 Content li = HtmlTree.LI(getHyperLink(
                         link, "", new StringContent(packages[i].name())));
                 if (i < packages.length - 1) {
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -31,6 +31,8 @@
 import com.sun.javadoc.*;
 import com.sun.tools.doclets.formats.html.ConfigurationImpl;
 import com.sun.tools.doclets.internal.toolkit.*;
+import com.sun.tools.doclets.internal.toolkit.util.DocPath;
+import com.sun.tools.doclets.internal.toolkit.util.DocPaths;
 
 
 /**
@@ -56,25 +58,11 @@
      *
      * @param filename String file name.
      */
-    public HtmlDocWriter(Configuration configuration,
-                         String filename) throws IOException {
-        super(configuration,
-              null, configuration.destDirName + filename,
-              configuration.docencoding);
-        // use File to normalize file separators
+    public HtmlDocWriter(Configuration configuration, DocPath filename)
+            throws IOException {
+        super(configuration, filename);
         configuration.message.notice("doclet.Generating_0",
-            new File(configuration.destDirName, filename));
-    }
-
-    public HtmlDocWriter(Configuration configuration,
-                         String path, String filename) throws IOException {
-        super(configuration,
-              configuration.destDirName + path, filename,
-              configuration.docencoding);
-        // use File to normalize file separators
-        configuration.message.notice("doclet.Generating_0",
-            new File(configuration.destDirName,
-                    ((path.length() > 0)? path + File.separator: "") + filename));
+            filename.resolveAgainst(configuration.destDirName));
     }
 
     /**
@@ -92,7 +80,7 @@
      * @param strong       Boolean that sets label to strong.
      * @return String    Hyper Link.
      */
-    public String getHyperLinkString(String link, String where,
+    public String getHyperLinkString(DocPath link, String where,
                                String label, boolean strong) {
         return getHyperLinkString(link, where, label, strong, "", "", "");
     }
@@ -108,7 +96,7 @@
      * @param stylename  String style of text defined in style sheet.
      * @return String    Hyper Link.
      */
-    public String getHyperLinkString(String link, String where,
+    public String getHyperLinkString(DocPath link, String where,
                                String label, boolean strong,
                                String stylename) {
         return getHyperLinkString(link, where, label, strong, stylename, "", "");
@@ -117,13 +105,26 @@
     /**
      * Get Html Hyper Link string.
      *
+     * @param where      Position of the link in the file. Character '#' is not
+     *                   needed.
+     * @param label      Tag for the link.
+     * @return a content tree for the hyper link
+     */
+    public Content getHyperLink(String where,
+                               Content label) {
+        return getHyperLink(DocPath.empty, where, label, "", "");
+    }
+
+    /**
+     * Get Html Hyper Link string.
+     *
      * @param link       String name of the file.
      * @param where      Position of the link in the file. Character '#' is not
      *                   needed.
      * @param label      Tag for the link.
      * @return a content tree for the hyper link
      */
-    public Content getHyperLink(String link, String where,
+    public Content getHyperLink(DocPath link, String where,
                                Content label) {
         return getHyperLink(link, where, label, "", "");
     }
@@ -141,6 +142,13 @@
      * @param target     Target frame.
      * @return String    Hyper Link.
      */
+    public String getHyperLinkString(DocPath link, String where,
+                               String label, boolean strong,
+                               String stylename, String title, String target) {
+        return getHyperLinkString(link.getPath(), where, label, strong,
+                stylename, title, target);
+    }
+
     public String getHyperLinkString(String link, String where,
                                String label, boolean strong,
                                String stylename, String title, String target) {
@@ -189,8 +197,13 @@
      * @param target     Target frame.
      * @return a content tree for the hyper link.
      */
+    public Content getHyperLink(DocPath link, String where,
+            Content label, String title, String target) {
+        return getHyperLink(link.getPath(), where, label, title, target);
+    }
     public Content getHyperLink(String link, String where,
             Content label, String title, String target) {
+        if (link.startsWith("/")) Thread.dumpStack();
         if (where != null && where.length() != 0) {
             link += "#" + where;
         }
@@ -211,7 +224,7 @@
      * @param label Label for the link
      * @return a content for the hyperlink to the file
      */
-    public Content getHyperLink(String link, Content label) {
+    public Content getHyperLink(DocPath link, Content label) {
         return getHyperLink(link, "", label);
     }
 
@@ -222,7 +235,7 @@
      * @param label      Tag for the link.
      * @return Strign    Hyper link.
      */
-    public String getHyperLinkString(String link, String label) {
+    public String getHyperLinkString(DocPath link, String label) {
         return getHyperLinkString(link, "", label, false);
     }
 
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -47,22 +47,11 @@
 public class HtmlWriter {
 
     /**
-     * Name of the file, to which this writer is writing to.
-     */
-    protected final String htmlFilename;
-
-    /**
      * The window title of this file
      */
     protected String winTitle;
 
     /**
-     * URL file separator string("/").
-     */
-    public static final String fileseparator =
-         DirectoryManager.URL_FILE_SEPARATOR;
-
-    /**
      * The configuration
      */
     protected Configuration configuration;
@@ -162,18 +151,15 @@
      *             or null if none to be created.
      * @param filename File Name to which the PrintWriter will
      *                 do the Output.
-     * @param docencoding Encoding to be used for this file.
      * @exception IOException Exception raised by the FileWriter is passed on
      * to next level.
      * @exception UnsupportedEncodingException Exception raised by the
      * OutputStreamWriter is passed on to next level.
      */
-    public HtmlWriter(Configuration configuration,
-                      String path, String filename, String docencoding)
-                      throws IOException, UnsupportedEncodingException {
-        writer = Util.genWriter(configuration, path, filename, docencoding);
+    public HtmlWriter(Configuration configuration,DocPath path)
+            throws IOException, UnsupportedEncodingException {
+        writer = Util.genWriter(configuration, path);
         this.configuration = configuration;
-        htmlFilename = filename;
         this.memberDetailsListPrinted = false;
         packageTableHeader = new String[] {
             configuration.getText("doclet.Package"),
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AbstractDoclet.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AbstractDoclet.java	Tue Oct 23 13:20:37 2012 -0700
@@ -130,8 +130,8 @@
             boolean first = true;
             while(pathTokens.hasMoreTokens()){
                 Util.copyDocFiles(configuration,
-                    pathTokens.nextToken() + File.separator,
-                    DocletConstants.DOC_FILES_DIR_NAME, first);
+                    new File(pathTokens.nextToken()),
+                    DocPaths.DOC_FILES, first);
                 first = false;
             }
         }
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/PackageSummaryWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/PackageSummaryWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -45,13 +45,6 @@
 public interface PackageSummaryWriter {
 
     /**
-     * Return the name of the output file.
-     *
-     * @return the name of the output file.
-     */
-    public abstract String getOutputFileName();
-
-    /**
      * Get the header for the summary.
      *
      * @param heading Package name.
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java	Tue Oct 23 13:20:37 2012 -0700
@@ -141,11 +141,9 @@
             //documented AND if we have not documented a class from the same
             //package already. Otherwise, we are making duplicate copies.
             Util.copyDocFiles(configuration,
-                Util.getPackageSourcePath(configuration,
-                    annotationTypeDoc.containingPackage()) +
-                DirectoryManager.getDirectoryPath(
-                    annotationTypeDoc.containingPackage())
-                    + File.separator, DocletConstants.DOC_FILES_DIR_NAME, true);
+                new File(Util.getPackageSourcePath(configuration, containingPackage),
+                    DocPath.forPackage(annotationTypeDoc).getPath()),
+                DocPaths.DOC_FILES, true);
             containingPackagesSeen.add(containingPackage.name());
         }
      }
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java	Tue Oct 23 13:20:37 2012 -0700
@@ -267,10 +267,9 @@
             //documented AND if we have not documented a class from the same
             //package already. Otherwise, we are making duplicate copies.
             Util.copyDocFiles(configuration,
-                    Util.getPackageSourcePath(configuration,
-                    classDoc.containingPackage()) +
-                    DirectoryManager.getDirectoryPath(classDoc.containingPackage())
-                    + File.separator, DocletConstants.DOC_FILES_DIR_NAME, true);
+                new File(Util.getPackageSourcePath(configuration, containingPackage),
+                    DocPath.forPackage(classDoc).getPath()),
+                DocPaths.DOC_FILES, true);
             containingPackagesSeen.add(containingPackage.name());
         }
      }
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/PackageSummaryBuilder.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/PackageSummaryBuilder.java	Tue Oct 23 13:20:37 2012 -0700
@@ -122,9 +122,7 @@
         Util.copyDocFiles(
                 configuration,
                 Util.getPackageSourcePath(configuration, packageDoc),
-                DirectoryManager.getDirectoryPath(packageDoc)
-                        + File.separator
-                        + DocletConstants.DOC_FILES_DIR_NAME,
+                DocPath.forPackage(packageDoc).resolve(DocPaths.DOC_FILES),
                 true);
     }
 
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java	Tue Oct 23 13:20:37 2012 -0700
@@ -474,6 +474,8 @@
         Arrays.sort(tags);
         int tagsLength = tags.length;
         for (int i = 0; i < tagsLength; i++) {
+            if (tags[i].fieldName() == null || tags[i].fieldType() == null) // ignore malformed @serialField tags
+                continue;
             Content fieldsContentTree = fieldWriter.getFieldsContentHeader(
                     (i == tagsLength - 1));
             fieldWriter.addMemberHeader(tags[i].fieldTypeDoc(),
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DirectoryManager.java	Wed Oct 17 16:43:26 2012 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,317 +0,0 @@
-/*
- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.tools.doclets.internal.toolkit.util;
-
-import com.sun.tools.doclets.internal.toolkit.*;
-import com.sun.javadoc.*;
-import java.io.*;
-
-
-/**
- * Handle the directory creations and the path string generations.
- * All static - never instaniated.
- *
- * This code is not part of an API.
- * It is implementation that is subject to change.
- * Do not use it as an API
- *
- * @since 1.2
- * @author Atul M Dambalkar
- */
-public class DirectoryManager {
-
-    /**
-     * The file separator string, "/", used in the formation of the URL path.
-     */
-    public static final String URL_FILE_SEPARATOR = "/";
-
-    /**
-     * Never instaniated.
-     */
-    private DirectoryManager() {
-    }
-
-    /**
-     * Given a PackageDoc, return its URL path string.
-     *
-     * @param pd PackageDoc
-     * @see #getPath(String)
-     */
-    public static String createPathString(PackageDoc pd) {
-        if (pd == null) {
-            return "";
-        }
-        return getPath(pd.name());
-    }
-
-    /**
-     * Given a ClassDoc, return its URL path string.
-     *
-     * @param cd ClassDoc
-     * @see #getPath(String)
-     */
-    public static String createPathString(ClassDoc cd) {
-        if (cd == null) {
-            return "";
-        }
-        PackageDoc pd = cd.containingPackage();
-        return (pd == null)? "": getPath(pd.name());
-    }
-
-    /**
-     * Given a PackageDoc, return the corresponding directory name
-     * with the platform-dependent file separator between subdirectory names.
-     * For example, if name of the package is "java.lang" , then it
-     * returns "java/lang" on Unix and "java\lang" on Windows.
-     * If name of the package contains no dot, then the value
-     * will be returned unchanged.  Because package names cannot
-     * end in a dot, the return value will never end with a slash.
-     * <p>
-     * Also see getPath for the URL separator version of this method
-     * that takes a string instead of a PackageDoc.
-     *
-     * @param  pd    the PackageDoc
-     * @return       the platform-dependent directory path for the package
-     */
-    public static String getDirectoryPath(PackageDoc pd) {
-        return pd == null || pd.name().length() == 0 ? "" : getDirectoryPath(pd.name());
-    }
-
-    /**
-     * Given a package name, return the corresponding directory name
-     * with the platform-dependent file separator between subdirectory names.
-     * For example, if name of the package is "java.lang" , then it
-     * returns "java/lang" on Unix and "java\lang" on Windows.
-     * If name of the package contains no dot, then the value
-     * will be returned unchanged.  Because package names cannot
-     * end in a dot, the return value will never end with a slash.
-     * <p>
-     * Also see getPath for the URL separator version of this method
-     * that takes a string instead of a PackageDoc.
-     *
-     * @param  packageName    the name of the package
-     * @return       the platform-dependent directory path for the package
-     */
-    public static String getDirectoryPath(String packageName) {
-        if (packageName == null || packageName.length() == 0) {
-            return "";
-        }
-        StringBuilder pathstr = new StringBuilder();
-        for (int i = 0; i < packageName.length(); i++) {
-            char ch = packageName.charAt(i);
-            if (ch == '.') {
-                pathstr.append(URL_FILE_SEPARATOR);
-            } else {
-                pathstr.append(ch);
-            }
-        }
-        if (pathstr.length() > 0 && ! pathstr.toString().endsWith(URL_FILE_SEPARATOR)) {
-            pathstr.append(URL_FILE_SEPARATOR);
-        }
-        return pathstr.toString();
-    }
-
-    /**
-     * Given a package name (a string), return the path string,
-     * with the URL separator "/" separating the subdirectory names.
-     * If name of the package contains no dot, then the value
-     * will be returned unchanged.  Because package names cannot
-     * end in a dot, the return value will never end with a slash.
-     * <p>
-     * For example if the string is "com.sun.javadoc" then the URL
-     * path string will be "com/sun/javadoc".
-     *
-     * @param name   the package name as a String
-     * @return       the String URL path
-     */
-    public static String getPath(String name) {
-        if (name == null || name.length() == 0) {
-            return "";
-        }
-        StringBuilder pathstr = new StringBuilder();
-        for (int i = 0; i < name.length(); i++) {
-            char ch = name.charAt(i);
-            if (ch == '.') {
-                pathstr.append(URL_FILE_SEPARATOR);
-            } else {
-                pathstr.append(ch);
-            }
-        }
-        return pathstr.toString();
-    }
-
-    /**
-     * Given two package names as strings, return the relative path
-     * from the package directory corresponding to the first string
-     * to the package directory corresponding to the second string,
-     * with the URL file separator "/" separating subdirectory names.
-     * <p>
-     * For example, if the parameter "from" is "java.lang"
-     * and parameter "to" is "java.applet", return string
-     * "../../java/applet".
-     *
-     * @param from   the package name from which path is calculated
-     * @param to     the package name to which path is calculated
-     * @return       relative path between "from" and "to" with URL
-     *               separators
-     * @see          #getRelativePath(String)
-     * @see          #getPath(String)
-     */
-    public static String getRelativePath(String from, String to) {
-        StringBuilder pathstr = new StringBuilder();
-        pathstr.append(getRelativePath(from));
-        pathstr.append(getPath(to));
-        pathstr.append(URL_FILE_SEPARATOR);
-        return pathstr.toString();
-    }
-
-    /**
-     * Given a package name as a string, return relative path string
-     * from the corresponding package directory to the root of
-     * the documentation, using the URL separator "/" between
-     * subdirectory names.
-     * <p>
-     * For example, if the string "from" is "java.lang",
-     * return "../../"
-     *
-     * @param from    the package
-     * @return        String relative path from "from".
-     * @see           #getRelativePath(String, String)
-     */
-    public static String getRelativePath(PackageDoc from) {
-        return from == null || from.name().length() == 0 ? "" : getRelativePath(from.name());
-    }
-
-    /**
-     * Given a package name as a string, return relative path string
-     * from the corresponding package directory to the root of
-     * the documentation, using the URL separator "/" between
-     * subdirectory names.
-     * <p>
-     * For example, if the string "from" is "java.lang",
-     * return "../../"
-     *
-     * @param from    the package name
-     * @return        String relative path from "from".
-     * @see           #getRelativePath(String, String)
-     */
-    public static String getRelativePath(String from) {
-        if (from == null || from.length() == 0) {
-            return "";
-        }
-        StringBuilder pathstr = new StringBuilder();
-        for (int i = 0; i < from.length(); i++) {
-            char ch = from.charAt(i);
-            if (ch == '.') {
-                pathstr.append(".." + URL_FILE_SEPARATOR);
-            }
-        }
-        pathstr.append(".." + URL_FILE_SEPARATOR);
-        return pathstr.toString();
-    }
-
-    /**
-     * Given a relative or absolute path that might be empty,
-     * convert it to a path that does not end with a
-     * URL separator "/".  Used for converting
-     * HtmlStandardWriter.relativepath when replacing {@docRoot}.
-     *
-     * @param path   the path to convert.  An empty path represents
-     *               the current directory.
-     */
-    public static String getPathNoTrailingSlash(String path) {
-        if ( path.equals("") ) {
-            return ".";
-        }
-        if ( path.equals("/") ) {
-            return "/.";
-        }
-        if ( path.endsWith("/") ) {
-            // Remove trailing slash
-            path = path.substring(0, path.length() -1);
-        }
-        return path;
-    }
-
-    /**
-     * Given a path string create all the directories in the path. For example,
-     * if the path string is "java/applet", the method will create directory
-     * "java" and then "java/applet" if they don't exist. The file separator
-     * string "/" is platform dependent system property.
-     *
-     * @param path Directory path string.
-     */
-    public static void createDirectory(Configuration configuration,
-                                       String path) {
-        if (path == null || path.length() == 0) {
-            return;
-        }
-        File dir = new File(path);
-        if (dir.exists()) {
-            return;
-        } else {
-            if (dir.mkdirs()) {
-                return;
-            } else {
-                configuration.message.error(
-                       "doclet.Unable_to_create_directory_0", path);
-                throw new DocletAbortException();
-            }
-        }
-    }
-
-    /**
-     * Given a package name and a file name, return the full path to that file.
-     * For example, if PackageDoc passed is for "java.lang" and the filename
-     * passed is "package-summary.html", then the string returned is
-     * "java/lang/package-summary.html".
-     *
-     * @param pd         PackageDoc.
-     * @param filename   File name to be appended to the path of the package.
-     */
-    public static String getPathToPackage(PackageDoc pd, String filename) {
-        StringBuilder buf = new StringBuilder();
-        String pathstr = createPathString(pd);
-        if (pathstr.length() > 0) {
-            buf.append(pathstr);
-            buf.append(URL_FILE_SEPARATOR);
-        }
-        buf.append(filename);
-        return buf.toString();
-    }
-
-    /**
-     * Given a class name return the full path to the class file.
-     * For example, if ClassDoc passed is for "java.lang.Object" then the
-     * string returned is "java/lang/Object.html".
-     *
-     * @param cd   ClassDoc.
-     */
-    public static String getPathToClass(ClassDoc cd) {
-        return getPathToPackage(cd.containingPackage(), cd.name() + ".html");
-    }
-
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPath.java	Tue Oct 23 13:20:37 2012 -0700
@@ -0,0 +1,188 @@
+/*
+ * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.doclets.internal.toolkit.util;
+
+import com.sun.javadoc.ClassDoc;
+import com.sun.javadoc.PackageDoc;
+import java.io.File;
+
+/**
+ * Abstraction for immutable relative paths.
+ * Paths always use '/' as a separator, and never begin or end with '/'.
+ */
+public class DocPath {
+    private final String path;
+
+    /** The empty path. */
+    public static final DocPath empty = new DocPath("");
+
+    /** The empty path. */
+    public static final DocPath parent = new DocPath("..");
+
+    /**
+     * Create a path from a string.
+     */
+    public static DocPath create(String p) {
+        return (p == null) || p.isEmpty() ? empty : new DocPath(p);
+    }
+
+    /**
+     * Return the path for a class.
+     * For example, if the class is java.lang.Object,
+     * the path is java/lang/Object.html.
+     */
+    public static DocPath forClass(ClassDoc cd) {
+        return (cd == null) ? empty :
+                forPackage(cd.containingPackage()).resolve(forName(cd));
+    }
+
+    /**
+     * Return the path for the simple name of the class.
+     * For example, if the class is java.lang.Object,
+     * the path is Object.html.
+     */
+    public static DocPath forName(ClassDoc cd) {
+        return (cd == null) ? empty : new DocPath(cd.name() + ".html");
+    }
+
+    /**
+     * Return the path for the package of a class.
+     * For example, if the class is java.lang.Object,
+     * the path is java/lang.
+     */
+    public static DocPath forPackage(ClassDoc cd) {
+        return (cd == null) ? empty : forPackage(cd.containingPackage());
+    }
+
+    /**
+     * Return the path for a package.
+     * For example, if the package is java.lang,
+     * the path is java/lang.
+     */
+    public static DocPath forPackage(PackageDoc pd) {
+        return (pd == null) ? empty : DocPath.create(pd.name().replace('.', '/'));
+    }
+
+    /**
+     * Return the inverse path for a package.
+     * For example, if the package is java.lang,
+     * the inverse path is ../...
+     */
+    public static DocPath forRoot(PackageDoc pd) {
+        String name = (pd == null) ? "" : pd.name();
+        if (name.isEmpty())
+            return empty;
+        return new DocPath(name.replace('.', '/').replaceAll("[^/]+", ".."));
+    }
+
+    /**
+     * Return the relative path from one package to another.
+     */
+    public static DocPath relativePath(PackageDoc from, PackageDoc to) {
+        return forRoot(from).resolve(forPackage(to));
+    }
+
+    protected DocPath(String p) {
+        path = (p.endsWith("/") ? p.substring(0, p.length() - 1) : p);
+    }
+
+    /** @inheritDoc */
+    @Override
+    public boolean equals(Object other) {
+        return (other instanceof DocPath) && path.equals(((DocPath)other).path);
+    }
+
+    /** @inheritDoc */
+    @Override
+    public int hashCode() {
+        return path.hashCode();
+    }
+
+    public DocPath basename() {
+        int sep = path.lastIndexOf("/");
+        return (sep == -1) ? this : new DocPath(path.substring(sep + 1));
+    }
+
+    public DocPath parent() {
+        int sep = path.lastIndexOf("/");
+        return (sep == -1) ? empty : new DocPath(path.substring(0, sep));
+    }
+
+    /**
+     * Return the path formed by appending the specified string to the current path.
+     */
+    public DocPath resolve(String p) {
+        if (p == null || p.isEmpty())
+            return this;
+        if (path.isEmpty())
+            return new DocPath(p);
+        return new DocPath(path + "/" + p);
+    }
+
+    /**
+     * Return the path by appending the specified path to the current path.
+     */
+    public DocPath resolve(DocPath p) {
+        if (p == null || p.isEmpty())
+            return this;
+        if (path.isEmpty())
+            return p;
+        return new DocPath(path + "/" + p.getPath());
+    }
+
+    /**
+     * Get the file created by evaluating the path against a specified directory.
+     */
+    // Temporary: this signature should not use String for dir.
+    // Eventually, this should involve javax.tools.Location.
+    public File resolveAgainst(String dir) {
+        return dir.isEmpty() ? new File(path) : new File(dir, path);
+    }
+
+    /**
+     * Return the inverse path for this path.
+     * For example, if the path is a/b/c, the inverse path is ../../..
+     */
+    public DocPath invert() {
+        return new DocPath(path.replaceAll("[^/]+", ".."));
+    }
+
+    /**
+     * Return true if this path is empty.
+     */
+    public boolean isEmpty() {
+        return path.isEmpty();
+    }
+
+    /**
+     * Return this path as a string.
+     */
+    // This is provided instead of using toString() to help catch
+    // unintended use of toString() in string concatenation sequences.
+    public String getPath() {
+        return path;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPaths.java	Tue Oct 23 13:20:37 2012 -0700
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.doclets.internal.toolkit.util;
+
+/**
+ * Standard DocPath objects.
+ *
+ * @since 8
+ */
+public class DocPaths {
+
+    /** The name of the file for all classes, using frames. */
+    public static final DocPath ALLCLASSES_FRAME = DocPath.create("allclasses-frame.html");
+
+    /** The name of the file for all classes, without using frames. */
+    public static final DocPath ALLCLASSES_NOFRAME = DocPath.create("allclasses-noframe.html");
+
+    /** The name of the sub-directory for storing class usage info. */
+    public static final DocPath CLASS_USE = DocPath.create("class-use");
+
+    /** The name of the file for constant values. */
+    public static final DocPath CONSTANT_VALUES = DocPath.create("constant-values.html");
+
+    /** The name of the fie for deprecated elements. */
+    public static final DocPath DEPRECATED_LIST = DocPath.create("deprecated-list.html");
+
+    /** The name of the subdirectory for user-provided additional documentation files. */
+    public static final DocPath DOC_FILES = DocPath.create("doc-files");
+
+    /** The name of the file for help info. */
+    public static final DocPath HELP_DOC = DocPath.create("help-doc.html");
+
+    /** The name of the main index file. */
+    public static final DocPath INDEX = DocPath.create("index.html");
+
+    /** The name of the single index file for all classes. */
+    public static final DocPath INDEX_ALL = DocPath.create("index-all.html");
+
+    /** The name of the directory for the split index files. */
+    public static final DocPath INDEX_FILES = DocPath.create("index-files");
+
+    /** Generate the name of one of the files in the split index. */
+    public static final DocPath indexN(int n) {
+        return DocPath.create("index-" + n + ".html");
+    }
+
+    /** The name of the file for the overview frame. */
+    public static final DocPath OVERVIEW_FRAME = DocPath.create("overview-frame.html");
+
+    /** The name of the file for the overview summary. */
+    public static final DocPath OVERVIEW_SUMMARY = DocPath.create("overview-summary.html");
+
+    /** The name of the file for the overview tree. */
+    public static final DocPath OVERVIEW_TREE = DocPath.create("overview-tree.html");
+
+    /** The name of the file for the package frame. */
+    public static final DocPath PACKAGE_FRAME = DocPath.create("package-frame.html");
+
+    /** The name of the file for the package list. */
+    public static final DocPath PACKAGE_LIST = DocPath.create("package-list");
+
+    /** The name of the file for the package summary. */
+    public static final DocPath PACKAGE_SUMMARY = DocPath.create("package-summary.html");
+
+    /** The name of the file for the package tree. */
+    public static final DocPath PACKAGE_TREE = DocPath.create("package-tree.html");
+
+    /** The name of the file for the package usage info. */
+    public static final DocPath PACKAGE_USE = DocPath.create("package-use.html");
+
+    /** The name of the directory in which resources are generated.
+     *  Also the name of the sub-package from which resources are read.
+     */
+    public static final DocPath RESOURCES = DocPath.create("resources");
+
+    /** The name of the file for the serialized form info. */
+    public static final DocPath SERIALIZED_FORM = DocPath.create("serialized-form.html");
+
+    /** The name of the directory in which HTML versions of the source code
+     *  are generated.
+     */
+    public static final DocPath SOURCE_OUTPUT = DocPath.create("src-html");
+
+    /** The name of the default stylesheet. */
+    public static final DocPath STYLESHEET = DocPath.create("stylesheet.css");
+
+}
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletConstants.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletConstants.java	Tue Oct 23 13:20:37 2012 -0700
@@ -40,6 +40,16 @@
 public class DocletConstants {
 
     /**
+     * The default amount of space between tab stops.
+     */
+    public static final int DEFAULT_TAB_STOP_LENGTH = 8;
+
+    /**
+     * The line separator for the current operating system.
+     */
+    public static final String NL = System.getProperty("line.separator");
+
+    /**
      * The default package name.
      */
     public static final String DEFAULT_PACKAGE_NAME = "&lt;Unnamed&gt;";
@@ -53,34 +63,4 @@
      * The anchor for the default package.
      */
     public static final String UNNAMED_PACKAGE_ANCHOR = "unnamed_package";
-
-    /**
-     * The name of the doc files directory.
-     */
-    public static final String DOC_FILES_DIR_NAME = "doc-files";
-
-    /**
-     * The default amount of space between tab stops.
-     */
-    public static final int DEFAULT_TAB_STOP_LENGTH = 8;
-
-    /**
-     * The name of the directory where we will copy resource files to.
-     */
-    public static final String RESOURE_DIR_NAME = "resources";
-
-    /**
-     * The source output directory name
-     */
-    public static final String SOURCE_OUTPUT_DIR_NAME = "src-html/";
-
-    /**
-     * The name of the package list file.
-     */
-    public static final String PACKAGE_LIST_FILE_NAME = "package-list";
-
-    /**
-     * The line seperator for the current operating system.
-     */
-    public static final String NL = System.getProperty("line.separator");
 }
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java	Tue Oct 23 13:20:37 2012 -0700
@@ -142,12 +142,15 @@
      * @return if external return converted link else return null
      */
     public String getExternalLink(String pkgName,
-                                  String relativepath, String link) {
+                                  DocPath relativepath, String link) {
         Item fnd = findPackageItem(pkgName);
         if (fnd != null) {
             String externlink = fnd.path + link;
             if (fnd.relative) {  // it's a relative path.
-                return relativepath + externlink;
+                if (relativepath.isEmpty())
+                    return externlink;
+                else
+                    return relativepath.getPath() + "/" + externlink;
             } else {
                 return externlink;
             }
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/PackageListWriter.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/PackageListWriter.java	Tue Oct 23 13:20:37 2012 -0700
@@ -52,8 +52,7 @@
      * @param configuration the current configuration of the doclet.
      */
     public PackageListWriter(Configuration configuration) throws IOException {
-        super(Util.genWriter(configuration, configuration.destDirName,
-            DocletConstants.PACKAGE_LIST_FILE_NAME, configuration.docencoding));
+        super(Util.genWriter(configuration, DocPaths.PACKAGE_LIST));
         this.configuration = configuration;
     }
 
@@ -71,7 +70,7 @@
             packgen.close();
         } catch (IOException exc) {
             configuration.message.error("doclet.exception_encountered",
-                exc.toString(), DocletConstants.PACKAGE_LIST_FILE_NAME);
+                exc.toString(), DocPaths.PACKAGE_LIST);
             throw new DocletAbortException();
         }
     }
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/SourcePath.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/SourcePath.java	Tue Oct 23 13:20:37 2012 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -38,8 +38,7 @@
  *
  * @author Atul M Dambalkar
  */
-public
-    class SourcePath {
+public class SourcePath {
     private final char dirSeparator = File.pathSeparatorChar;
 
     /**
@@ -114,9 +113,9 @@
      * @param name Name of the directory to be searched for in the source path.
      * @return File Return the directory if found else return null.
      */
-    public File getDirectory(String name) {
+    public File getDirectory(DocPath p) {
         for (int i = 0; i < sourcePath.length; i++) {
-            File directoryNeeded = new File(sourcePath[i], name);
+            File directoryNeeded = new File(sourcePath[i], p.getPath());
             if (directoryNeeded.isDirectory()) {
                 return directoryNeeded;
             }
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java	Tue Oct 23 13:20:37 2012 -0700
@@ -52,11 +52,6 @@
     {{"&", "&amp;"}, {"<", "&lt;"}, {">", "&gt;"}};
 
     /**
-     * Name of the resource directory.
-     */
-    public static final String RESOURCESDIR = "resources";
-
-    /**
      * Return array of class members whose documentation is to be generated.
      * If the member is deprecated do not include such a member in the
      * returned array.
@@ -236,26 +231,20 @@
      * @param overwrite Overwrite files if true.
      */
     public static void copyDocFiles(Configuration configuration,
-            String path, String dir, boolean overwrite) {
+            File path, DocPath dir, boolean overwrite) {
         if (checkCopyDocFilesErrors(configuration, path, dir)) {
             return;
         }
-        String destname = configuration.docFileDestDirName;
-        File srcdir = new File(path + dir);
-        if (destname.length() > 0 && !destname.endsWith(
-               DirectoryManager.URL_FILE_SEPARATOR)) {
-            destname += DirectoryManager.URL_FILE_SEPARATOR;
-        }
-        String dest = destname + dir;
+        File srcdir = new File(path, dir.getPath());
+        File destdir = new File(configuration.docFileDestDirName, dir.getPath());
         try {
-            File destdir = new File(dest);
-            DirectoryManager.createDirectory(configuration, dest);
+            createDirectory(configuration, destdir);
             String[] files = srcdir.list();
             for (int i = 0; i < files.length; i++) {
                 File srcfile = new File(srcdir, files[i]);
                 File destfile = new File(destdir, files[i]);
                 if (srcfile.isFile()) {
-                    if(destfile.exists() && ! overwrite) {
+                    if (destfile.exists() && ! overwrite) {
                         configuration.message.warning((SourcePosition) null,
                                 "doclet.Copy_Overwrite_warning",
                                 srcfile.toString(), destdir.toString());
@@ -265,12 +254,11 @@
                             srcfile.toString(), destdir.toString());
                         Util.copyFile(destfile, srcfile);
                     }
-                } else if(srcfile.isDirectory()) {
-                    if(configuration.copydocfilesubdirs
+                } else if (srcfile.isDirectory()) {
+                    if (configuration.copydocfilesubdirs
                         && ! configuration.shouldExcludeDocFileDir(
                           srcfile.getName())){
-                        copyDocFiles(configuration, path, dir +
-                                    DirectoryManager.URL_FILE_SEPARATOR + srcfile.getName(),
+                        copyDocFiles(configuration, path, dir.resolve(files[i]),
                                 overwrite);
                     }
                 }
@@ -290,7 +278,7 @@
      * @param dirName The original directory name to copy from.
      */
     private static boolean checkCopyDocFilesErrors (Configuration configuration,
-            String path, String dirName) {
+            File path, DocPath dirName) {
         if ((configuration.sourcepath == null || configuration.sourcepath.length() == 0) &&
                (configuration.destDirName == null || configuration.destDirName.length() == 0)) {
             //The destination path and source path are definitely equal.
@@ -309,7 +297,7 @@
             }
         }
         //Make sure the doc-file being copied exists.
-        File srcdir = new File(path + dirName);
+        File srcdir = new File(path, dirName.getPath());
         if (! srcdir.exists()) {
             return true;
         }
@@ -330,8 +318,7 @@
      */
     public static void copyResourceFile(Configuration configuration,
             String resourcefile, boolean overwrite) {
-        String destresourcesdir = configuration.destDirName + RESOURCESDIR;
-        copyFile(configuration, resourcefile, RESOURCESDIR, destresourcesdir,
+        copyFile(configuration, resourcefile, DocPaths.RESOURCES, DocPaths.RESOURCES,
                 overwrite, false);
     }
 
@@ -350,15 +337,24 @@
      * @param replaceNewLine true if the newline needs to be replaced with platform-
      *                  specific newline.
      */
+    public static void copyFile(Configuration configuration, String file, DocPath source,
+            DocPath destination, boolean overwrite, boolean replaceNewLine) {
+        copyFile(configuration, file, source.getPath(), destination.getPath(),
+                overwrite, replaceNewLine);
+    }
+
     public static void copyFile(Configuration configuration, String file, String source,
             String destination, boolean overwrite, boolean replaceNewLine) {
-        DirectoryManager.createDirectory(configuration, destination);
-        File destfile = new File(destination, file);
-        if(destfile.exists() && (! overwrite)) return;
+        File destdir = configuration.destDirName.isEmpty() ?
+                (destination.isEmpty() ? null : new File(destination)) :
+                new File(configuration.destDirName, destination);
+        File destfile = (destdir == null) ? new File(file) : new File(destdir, file);
+        createDirectory(configuration, destfile.getParentFile());
+        if (destfile.exists() && (! overwrite)) return;
         try {
             InputStream in = Configuration.class.getResourceAsStream(
-                    source + DirectoryManager.URL_FILE_SEPARATOR + file);
-            if(in==null) return;
+                    source + '/' + file);
+            if (in == null) return;
             OutputStream out = new FileOutputStream(destfile);
             try {
                 if (!replaceNewLine) {
@@ -396,26 +392,46 @@
     }
 
     /**
+     * Given a path string create all the directories in the path. For example,
+     * if the path string is "java/applet", the method will create directory
+     * "java" and then "java/applet" if they don't exist. The file separator
+     * string "/" is platform dependent system property.
+     *
+     * @param path Directory path string.
+     */
+    public static void createDirectory(Configuration configuration, File dir) {
+        if (dir == null) {
+            return;
+        }
+        if (dir.exists()) {
+            return;
+        } else {
+            if (dir.mkdirs()) {
+                return;
+            } else {
+                configuration.message.error(
+                       "doclet.Unable_to_create_directory_0", dir.getPath());
+                throw new DocletAbortException();
+            }
+        }
+    }
+
+    /**
      * Given a PackageDoc, return the source path for that package.
      * @param configuration The Configuration for the current Doclet.
-     * @param pkgDoc The package to seach the path for.
+     * @param pkgDoc The package to search the path for.
      * @return A string representing the path to the given package.
      */
-    public static String getPackageSourcePath(Configuration configuration,
-            PackageDoc pkgDoc){
-        try{
-            String pkgPath = DirectoryManager.getDirectoryPath(pkgDoc);
-            String completePath = new SourcePath(configuration.sourcepath).
-                getDirectory(pkgPath) + DirectoryManager.URL_FILE_SEPARATOR;
-            //Make sure that both paths are using the same separators.
-            completePath = Util.replaceText(completePath, File.separator,
-                    DirectoryManager.URL_FILE_SEPARATOR);
-            pkgPath = Util.replaceText(pkgPath, File.separator,
-                    DirectoryManager.URL_FILE_SEPARATOR);
-            return completePath.substring(0, completePath.lastIndexOf(pkgPath));
-        } catch (Exception e){
-            return "";
-        }
+    public static File getPackageSourcePath(Configuration configuration,
+            PackageDoc pkgDoc) {
+        DocPath pkgPath = DocPath.forPackage(pkgDoc);
+        File pkgDir = new SourcePath(configuration.sourcepath).getDirectory(pkgPath);
+        if (pkgDir == null)
+            return null;
+        //Make sure that both paths are using the same separators.
+        String completePath = Util.replaceText(pkgDir.getPath(), File.separator, "/");
+        String pathForPkg = completePath.substring(0, completePath.lastIndexOf(pkgPath.getPath()));
+        return new File(pathForPkg);
     }
 
     /**
@@ -552,7 +568,7 @@
     }
 
     /**
-     * Given a package, return it's name.
+     * Given a package, return its name.
      * @param packageDoc the package to check.
      * @return the name of the given package.
      */
@@ -562,7 +578,7 @@
     }
 
     /**
-     * Given a package, return it's file name without the extension.
+     * Given a package, return its file name without the extension.
      * @param packageDoc the package to check.
      * @return the file name of the given package.
      */
@@ -572,7 +588,7 @@
     }
 
     /**
-     * Given a string, replace all occurraces of 'newStr' with 'oldStr'.
+     * Given a string, replace all occurrences of 'newStr' with 'oldStr'.
      * @param originalStr the string to modify.
      * @param oldStr the string to replace.
      * @param newStr the string to insert in place of the old string.
@@ -637,22 +653,15 @@
      * @see java.io.FileOutputStream
      * @see java.io.OutputStreamWriter
      */
-    public static Writer genWriter(Configuration configuration,
-            String path, String filename,
-            String docencoding)
-        throws IOException, UnsupportedEncodingException {
-        FileOutputStream fos;
-        if (path != null) {
-            DirectoryManager.createDirectory(configuration, path);
-            fos = new FileOutputStream(((path.length() > 0)?
-                                                  path + File.separator: "") + filename);
-        } else {
-            fos = new FileOutputStream(filename);
-        }
-        if (docencoding == null) {
+    public static Writer genWriter(Configuration configuration, DocPath path)
+            throws IOException, UnsupportedEncodingException {
+        File file = path.resolveAgainst(configuration.destDirName);
+        createDirectory(configuration, file.getParentFile());
+        FileOutputStream fos = new FileOutputStream(file);
+        if (configuration.docencoding == null) {
             return new BufferedWriter(new OutputStreamWriter(fos));
         } else {
-            return new BufferedWriter(new OutputStreamWriter(fos, docencoding));
+            return new BufferedWriter(new OutputStreamWriter(fos, configuration.docencoding));
         }
     }
 
--- a/langtools/src/share/classes/com/sun/tools/javadoc/SerializedForm.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/SerializedForm.java	Tue Oct 23 13:20:37 2012 -0700
@@ -237,6 +237,9 @@
 
         SerialFieldTag[] sfTag = spfDoc.serialFieldTags();
         for (int i = 0; i < sfTag.length; i++) {
+            if (sfTag[i].fieldName() == null || sfTag[i].fieldType() == null) // ignore malformed @serialField tags
+                continue;
+
             Name fieldName = names.fromString(sfTag[i].fieldName());
 
             // Look for a FieldDocImpl that is documented by serialFieldTagImpl.
--- a/langtools/test/com/sun/javadoc/testIndex/TestIndex.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/test/com/sun/javadoc/testIndex/TestIndex.java	Tue Oct 23 13:20:37 2012 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -53,28 +53,28 @@
 
         //Test index-all.html
         {BUG_ID + FS + "index-all.html",
-            "<a href=\"./pkg/C.html\" title=\"class in pkg\"><span class=\"strong\">C</span></a>" +
-            " - Class in <a href=\"./pkg/package-summary.html\">pkg</a>"},
+            "<a href=\"pkg/C.html\" title=\"class in pkg\"><span class=\"strong\">C</span></a>" +
+            " - Class in <a href=\"pkg/package-summary.html\">pkg</a>"},
         {BUG_ID + FS + "index-all.html",
-            "<a href=\"./pkg/Interface.html\" title=\"interface in pkg\">" +
+            "<a href=\"pkg/Interface.html\" title=\"interface in pkg\">" +
             "<span class=\"strong\">Interface</span></a> - Interface in " +
-            "<a href=\"./pkg/package-summary.html\">pkg</a>"},
+            "<a href=\"pkg/package-summary.html\">pkg</a>"},
         {BUG_ID + FS + "index-all.html",
-            "<a href=\"./pkg/AnnotationType.html\" title=\"annotation in pkg\">" +
+            "<a href=\"pkg/AnnotationType.html\" title=\"annotation in pkg\">" +
             "<span class=\"strong\">AnnotationType</span></a> - Annotation Type in " +
-            "<a href=\"./pkg/package-summary.html\">pkg</a>"},
+            "<a href=\"pkg/package-summary.html\">pkg</a>"},
         {BUG_ID + FS + "index-all.html",
-            "<a href=\"./pkg/Coin.html\" title=\"enum in pkg\">" +
+            "<a href=\"pkg/Coin.html\" title=\"enum in pkg\">" +
             "<span class=\"strong\">Coin</span></a> - Enum in " +
-            "<a href=\"./pkg/package-summary.html\">pkg</a>"},
+            "<a href=\"pkg/package-summary.html\">pkg</a>"},
         {BUG_ID + FS + "index-all.html",
-            "Class in <a href=\"./package-summary.html\">&lt;Unnamed&gt;</a>"},
+            "Class in <a href=\"package-summary.html\">&lt;Unnamed&gt;</a>"},
         {BUG_ID + FS + "index-all.html",
-            "<dl>" + NL + "<dt><span class=\"strong\"><a href=\"./pkg/C.html#Java\">" +
-            "Java</a></span> - Static variable in class pkg.<a href=\"./pkg/C.html\" " +
+            "<dl>" + NL + "<dt><span class=\"strong\"><a href=\"pkg/C.html#Java\">" +
+            "Java</a></span> - Static variable in class pkg.<a href=\"pkg/C.html\" " +
             "title=\"class in pkg\">C</a></dt>" + NL + "<dd>&nbsp;</dd>" + NL +
-            "<dt><span class=\"strong\"><a href=\"./pkg/C.html#JDK\">JDK</a></span> " +
-            "- Static variable in class pkg.<a href=\"./pkg/C.html\" title=\"class in pkg\">" +
+            "<dt><span class=\"strong\"><a href=\"pkg/C.html#JDK\">JDK</a></span> " +
+            "- Static variable in class pkg.<a href=\"pkg/C.html\" title=\"class in pkg\">" +
             "C</a></dt>" + NL + "<dd>&nbsp;</dd>" + NL + "</dl>"},
     };
     private static final String[][] NEGATED_TEST = NO_TEST;
--- a/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java	Tue Oct 23 13:20:37 2012 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -663,14 +663,14 @@
             // TYPE PARAMETER IN INDEX
             //=================================
             {BUG_ID + FS + "index-all.html",
-                "<span class=\"strong\"><a href=\"./pkg2/Foo.html#method(java.util.Vector)\">" +
+                "<span class=\"strong\"><a href=\"pkg2/Foo.html#method(java.util.Vector)\">" +
                 "method(Vector&lt;Object&gt;)</a></span>"
             },
             //=================================
             // TYPE PARAMETER IN INDEX
             //=================================
             {BUG_ID + FS + "index-all.html",
-                "<span class=\"strong\"><a href=\"./pkg2/Foo.html#method(java.util.Vector)\">" +
+                "<span class=\"strong\"><a href=\"pkg2/Foo.html#method(java.util.Vector)\">" +
                 "method(Vector&lt;Object&gt;)</a></span>"
             },
         };
--- a/langtools/test/com/sun/javadoc/testPackagePage/TestPackagePage.java	Wed Oct 17 16:43:26 2012 +0100
+++ b/langtools/test/com/sun/javadoc/testPackagePage/TestPackagePage.java	Tue Oct 23 13:20:37 2012 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -52,7 +52,7 @@
             "<li><a href=\"com/pkg/package-summary.html\">Package</a></li>"
         },
         {BUG_ID + "-1" + FS + "index-all.html",
-            "<li><a href=\"./com/pkg/package-summary.html\">Package</a></li>"
+            "<li><a href=\"com/pkg/package-summary.html\">Package</a></li>"
         },
         {BUG_ID + "-1" + FS + "help-doc.html",
             "<li><a href=\"com/pkg/package-summary.html\">Package</a></li>"