Fix collisions due to ignoring outer class names.
am: 35e0d1defa

Change-Id: Id5483a849b7b561079f36470711c87f98785d2e2
diff --git a/src/com/google/doclava/Doclava.java b/src/com/google/doclava/Doclava.java
index 48d8ddb..385b2f7 100644
--- a/src/com/google/doclava/Doclava.java
+++ b/src/com/google/doclava/Doclava.java
@@ -452,9 +452,13 @@
           writeSdkValues(sdkValuePath);
         }
       }
-      // Write metadata for all processed files to jd_lists_unified.js in out dir
+      // Write metadata for all processed files to jd_lists_unified in out dir
       if (!sTaglist.isEmpty()) {
         PageMetadata.WriteListByLang(sTaglist);
+        // For devsite (ds) reference only, write samples_metadata to out dir
+        if ((USE_DEVSITE_LOCALE_OUTPUT_PATHS) && (!DEVSITE_STATIC_ONLY)) {
+          PageMetadata.WriteSamplesListByLang(sTaglist);
+        }
       }
     }
 
diff --git a/src/com/google/doclava/PageMetadata.java b/src/com/google/doclava/PageMetadata.java
index 1096f1d..8774d48 100644
--- a/src/com/google/doclava/PageMetadata.java
+++ b/src/com/google/doclava/PageMetadata.java
@@ -92,9 +92,9 @@
   *
   * @param rootTypeNodesList A list of root metadata nodes, each
   *        representing a type and it's member child pages.
+  * @deprecated
   */
   public static void WriteList(List<Node> rootTypeNodesList) {
-
     Collections.sort(rootTypeNodesList, BY_TYPE_NAME);
     Node pageMeta = new Node.Builder().setLabel("TOP").setChildren(rootTypeNodesList).build();
 
@@ -105,7 +105,7 @@
     // write the taglist to js file
     Data data = Doclava.makeHDF();
     data.setValue("reference_tree", buf.toString());
-    ClearPage.write(data, "jd_lists_unified.cs", "jd_lists_unified.js");
+    ClearPage.write(data, "jd_lists_unified.cs",  "jd_lists_unified.js");
   }
 
   /**
@@ -143,6 +143,42 @@
   }
 
   /**
+  * Given a list of metadata nodes organized by lang, sort the
+  * root nodes by type name and render the types and their child
+  * samples metadata nodes only to separate lang-specific json files
+  * in the out dir. Only used by devsite (ds) builds.
+  *
+  * @param rootNodesList A list of root metadata nodes, each
+  *        representing a type and it's member child pages.
+  */
+  public static void WriteSamplesListByLang(List<Node> rootNodesList) {
+    Collections.sort(rootNodesList, BY_LANG_NAME);
+    for (Node n : rootNodesList) {
+      boolean langHasSamples = false;
+      String langFilename = "";
+      String langname = n.getLang();
+      langFilename = "_" + langname;
+      Collections.sort(n.getChildren(), BY_TYPE_NAME);
+      Node pageMeta = new Node.Builder().setLabel("TOP").setChildren(n.getChildren()).build();
+
+      StringBuilder buf = new StringBuilder();
+      // write the taglist to string format
+      langHasSamples = pageMeta.renderSamplesResources(buf,langname);
+      // write the taglist to js file
+      Data data = Doclava.makeHDF();
+      data.setValue("reference_tree", buf.toString());
+      data.setValue("metadata.lang", langname);
+
+      if (langHasSamples) {
+        data.setValue("samples_only", "1");
+        // write out jd_lists_unified for each lang
+        String unifiedFilename = "android_samples_metadata" + langFilename + ".js";
+        ClearPage.write(data, "jd_lists_unified.cs", unifiedFilename);
+      }
+    }
+  }
+
+  /**
   * Extract supported metadata values from a page and add them as
   * a child node of a root node based on type. Some metadata values
   * are normalized. Unsupported metadata fields are ignored. See
@@ -745,6 +781,31 @@
         }
       }
     }
+
+    /**
+    * Render a tree of metadata nodes of type 'develop' to extract
+    * samples metadata. Only used by devsite (ds) builds.
+    * @param buf Output buffer to render to.
+    * @return true if samples were rendered to buf
+    */
+    boolean renderSamplesResources(StringBuilder buf, String langname) {
+      boolean langHasSamples = false;
+      List<Node> list = mChildren; //list of type rootnodes
+      if (list == null || list.size() == 0) {
+        buf.append("null");
+      } else {
+        final int n = list.size();
+        for (int i = 0; i < n; i++) {
+          //samples are always in type 'develop', so restrict
+          if ("develop".equals(list.get(i).mType)) {
+            //render this type's children
+            langHasSamples = list.get(i).renderTypeForSamples(buf);
+          }
+        }
+      }
+      return langHasSamples;
+    }
+
     /**
     * Render all metadata nodes for a specific type.
     * @param buf Output buffer to render to.
@@ -793,6 +854,61 @@
     }
 
     /**
+    * Render all metadata nodes for samples only.
+    * Only used by devsite (ds) builds.
+    * @param buf Output buffer to render to.
+    * @return whether any samples were rendered to buf
+    */
+    boolean renderTypeForSamples(StringBuilder buf) {
+      boolean typeHasSamples = false;
+      List<Node> list = mChildren;
+      if (list == null || list.size() == 0) {
+        buf.append("nulltype");
+      } else {
+        final int n = list.size();
+        for (int i = 0; i < n; i++) {
+          // valid samples must have category 'samples'
+          if ("samples".equals(list.get(i).mCategory)) {
+            typeHasSamples = true;
+            buf.append("\n      {\n");
+            buf.append("        \"title\":\"");
+            renderStrWithUcs(buf, list.get(i).mLabel);
+            buf.append("\",\n" );
+            buf.append("        \"summary\":\"");
+            renderStrWithUcs(buf, list.get(i).mSummary);
+            buf.append("\",\n" );
+            buf.append("        \"url\":\"" + list.get(i).mLink + "\",\n" );
+            if (!"".equals(list.get(i).mImage)) {
+              buf.append("        \"image\":\"" + list.get(i).mImage + "\",\n" );
+            }
+            if (!"".equals(list.get(i).mGroup)) {
+              buf.append("        \"group\":\"");
+              renderStrWithUcs(buf, list.get(i).mGroup);
+              buf.append("\",\n" );
+            }
+            if (!"".equals(list.get(i).mCategory)) {
+              buf.append("        \"category\":\"" + list.get(i).mCategory + "\",\n" );
+            }
+            if ((list.get(i).mType != null) && (list.get(i).mType != "")) {
+              buf.append("        \"type\":\"" + list.get(i).mType + "\",\n");
+            }
+            list.get(i).renderArrayType(buf, list.get(i).mKeywords, "keywords");
+            list.get(i).renderArrayType(buf, list.get(i).mTags, "tags");
+            if (!"".equals(list.get(i).mTimestamp)) {
+              buf.append("        \"timestamp\":\"" + list.get(i).mTimestamp + "\",\n");
+            }
+            buf.append("        \"lang\":\"" + list.get(i).mLang + "\"" );
+            buf.append("\n      }");
+            if (i != n - 1) {
+              buf.append(", ");
+            }
+          }
+        }
+      }
+      return typeHasSamples;
+    }
+
+    /**
     * Build and render a list of tags associated with each type.
     * @param buf Output buffer to render to.
     */