SampleCode.java revision 187b985f817b4a0181c5127270a2aab9915cf60a
1920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson/*
2920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Copyright (C) 2010 Google Inc.
3920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson *
4920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Licensed under the Apache License, Version 2.0 (the "License");
5920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * you may not use this file except in compliance with the License.
6920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * You may obtain a copy of the License at
7920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson *
8920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * http://www.apache.org/licenses/LICENSE-2.0
9920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson *
10920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Unless required by applicable law or agreed to in writing, software
11920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * distributed under the License is distributed on an "AS IS" BASIS,
12920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * See the License for the specific language governing permissions and
14920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * limitations under the License.
15920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */
16920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
17920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpackage com.google.doclava;
18920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport com.google.clearsilver.jsilver.data.Data;
19920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
20920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.util.*;
21920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonimport java.io.*;
22e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Doughertyimport java.util.regex.Pattern;
23e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Doughertyimport java.util.regex.Matcher;
24920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
25920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpublic class SampleCode {
26920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  String mSource;
27920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  String mDest;
28920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  String mTitle;
29c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  String mProjectDir;
3025586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  String mTags;
31920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
32920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public SampleCode(String source, String dest, String title) {
33920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    mSource = source;
34920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    mTitle = title;
3525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    mTags = null;
361b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
37815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    if (dest != null) {
38815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      int len = dest.length();
39815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      if (len > 1 && dest.charAt(len - 1) != '/') {
40815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty        mDest = dest + '/';
41815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      } else {
42815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty        mDest = dest;
43815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      }
44920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
451b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //System.out.println("SampleCode init: source: " + mSource);
461b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //System.out.println("SampleCode init: dest: " + mDest);
471b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //System.out.println("SampleCode init: title: " + mTitle);
481b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
49920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
50920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
511b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  public Node write(boolean offlineMode) {
521b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    List<Node> filelist = new ArrayList<Node>();
53920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    File f = new File(mSource);
54c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    mProjectDir = f.getName();
55c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String name = mProjectDir;
561b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String startname = name;
571b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String subdir = mDest;
581b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String mOut = subdir + name;
59920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    if (!f.isDirectory()) {
60920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      System.out.println("-samplecode not a directory: " + mSource);
611b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      return null;
62920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
631b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
641b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    if (offlineMode)
651b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      writeIndexOnly(f, mDest, offlineMode);
661b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    else {
671b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      Data hdf = Doclava.makeHDF();
681b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      hdf.setValue("samples", "true");
69c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("projectDir", mProjectDir);
701b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      writeProjectDirectory(filelist, f, mDest, false, hdf, "Files.");
71c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      writeProjectStructure(name, hdf);
721b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      hdf.removeTree("parentdirs");
731b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      hdf.setValue("parentdirs.0.Name", name);
74e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //Write root _index.jd to out and add metadata to Node.
75f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      Node rootNode = writeProjectIndexCs(hdf, f, null,
76f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty          new Node.Builder().setLabel(mProjectDir).setLink("samples/"
77f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty          + startname + "/index.html").setChildren(filelist).build());
781b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      // return a root SC node for the sample with children appended
79e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      return rootNode;
801b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
811b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    return null;
82920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
83920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
84920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static String convertExtension(String s, String ext) {
85920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return s.substring(0, s.lastIndexOf('.')) + ext;
86920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
87920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
88920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static String[] IMAGES = {".png", ".jpg", ".gif"};
893542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty  public static String[] VIDEOS = {".mp4", ".ogv", ".webm"};
901b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  public static String[] TEMPLATED = {".java", ".xml", ".aidl", ".rs",".txt", ".TXT"};
91920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
92920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public static boolean inList(String s, String[] list) {
93920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    for (String t : list) {
94920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      if (s.endsWith(t)) {
95920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson        return true;
96920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson      }
97920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
98920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return false;
99920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
1001b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
1011b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  public static String mapTypes(String name) {
1021b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String type = name.substring(name.lastIndexOf('.') + 1, name.length());
103187b985f817b4a0181c5127270a2aab9915cf60aDirk Dougherty    if ("xml".equals(type) || "java".equals(type)) {
104187b985f817b4a0181c5127270a2aab9915cf60aDirk Dougherty      if ("AndroidManifest.xml".equals(name)) type = "manifest";
1051b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      return type;
1061b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    } else {
1071b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      return type = "file";
1081b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
1091b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  }
1101b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
1111b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  public void writeProjectDirectory(List<Node> parent, File dir, String relative, Boolean recursed, Data hdf, String newkey) {
1121b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    TreeSet<String> dirs = new TreeSet<String>(); //dirs for project structure and breadcrumb
1131b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    TreeSet<String> files = new TreeSet<String>(); //files for project structure and breadcrumb
1141b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
1151b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String subdir = relative;
1161b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String name = "";
1171b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String label = "";
1181b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String link = "";
1191b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String type = "";
1201b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    int i = 0;
1211b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String expansion = ".Sub.";
1221b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String key = newkey;
1233542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    double maxFileSizeBytes = 2097152; //Max size for browseable images/video
1241b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
1251b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    if (recursed) {
1261b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      key = (key + expansion);
1271b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    } else {
1281b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      expansion = "";
1291b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
1301b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
131c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    File[] dirContents = dir.listFiles();
132c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    Arrays.sort(dirContents, byTypeAndName);
133c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    for (File f: dirContents) {
1341b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      name = f.getName();
1351b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      // don't process certain types of files
1361b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      if (name.startsWith(".") ||
1371b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          name.startsWith("_") ||
138187b985f817b4a0181c5127270a2aab9915cf60aDirk Dougherty          "default.properties".equals(name) ||
139187b985f817b4a0181c5127270a2aab9915cf60aDirk Dougherty          "build.properties".equals(name) ||
1401b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          name.endsWith(".ttf") ||
141e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          name.endsWith(".gradle") ||
142e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          name.endsWith(".bat") ||
143187b985f817b4a0181c5127270a2aab9915cf60aDirk Dougherty          "Android.mk".equals(name)) {
1441b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         //System.out.println("Invalid File Type, bypassing: " + name);
1451b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         continue;
1461b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty       }
1471b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty       if (f.isFile() && name.contains(".")){
1481b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         String path = relative + name;
1491b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         type = mapTypes(name);
1501b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         link = convertExtension(path, ".html");
1511b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         hdf.setValue("samples", "true");//dd needed?
1521b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         if (inList(path, IMAGES)) {
1531b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           // copy these files to output directly
1541b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           type = "img";
1553542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           if (f.length() < maxFileSizeBytes) {
1563542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty             ClearPage.copyFile(false, f, path);
1573542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty             writeImageVideoPage(f, convertExtension(path, Doclava.htmlExtension),
1583542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty                relative, type, true);
1593542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           } else {
1603542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty             //too large for browsing, skip copying and show generic icon
1613542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty             writeImageVideoPage(f, convertExtension(path, Doclava.htmlExtension),
1623542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty                relative, type, false);
1633542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           }
1641b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           files.add(name);
1651b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Type", "img");
1661b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Name", name);
1671b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Href", link);
16825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty           hdf.setValue(key + i + ".RelPath", relative);
1691b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         }
1703542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty         if (inList(path, VIDEOS)) {
1713542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           // copy these files to output directly
1723542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           type = "video";
1733542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           if (f.length() < maxFileSizeBytes) {
1743542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty             ClearPage.copyFile(false, f, path);
1753542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty             writeImageVideoPage(f, convertExtension(path, Doclava.htmlExtension),
1763542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty                relative, type, true);
1773542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           } else {
1783542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty             //too large for browsing, skip copying and show generic icon
1793542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty             writeImageVideoPage(f, convertExtension(path, Doclava.htmlExtension),
1803542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty                relative, type, false);
1813542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           }
1823542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           files.add(name);
1833542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           hdf.setValue(key + i + ".Type", "video");
1843542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           hdf.setValue(key + i + ".Name", name);
1853542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           hdf.setValue(key + i + ".Href", link);
1863542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty           hdf.setValue(key + i + ".RelPath", relative);
1873542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty         }
1881b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         if (inList(path, TEMPLATED)) {
1891b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           // copied and goes through the template
1901b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           ClearPage.copyFile(false, f, path);
1911b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           writePage(f, convertExtension(path, Doclava.htmlExtension), relative);
1921b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           files.add(name);
1931b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Type", type);
1941b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Name", name);
1951b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           hdf.setValue(key + i + ".Href", link);
19625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty           hdf.setValue(key + i + ".RelPath", relative);
1971b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         }
1981b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         // add file to the navtree
199f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty         parent.add(new Node.Builder().setLabel(name).setLink(link).setType(type).build());
2001b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         i++;
2011b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty       } else if (f.isDirectory()) {
2021b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         List<Node> mchildren = new ArrayList<Node>();
2031b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         type = "dir";
2041b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         String dirpath = relative + name;
2051b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         link = dirpath + "/index.html";
2061b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         String hdfkeyName = (key + i + ".Name");
2071b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         String hdfkeyType = (key + i + ".Type");
2081b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         String hdfkeyHref = (key + i + ".Href");
2091b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         hdf.setValue(hdfkeyName, name);
2101b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         hdf.setValue(hdfkeyType, type);
2111b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         hdf.setValue(hdfkeyHref, relative + name + "/" + "index.html");
2121b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         //System.out.println("Found directory, recursing. Current key: " + hdfkeyName);
2131b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         writeProjectDirectory(mchildren, f, relative + name + "/", true, hdf, (key + i));
2141b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         if (mchildren.size() > 0) {
2151b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty           //dir is processed, now add it to the navtree
216c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty           //don't link sidenav subdirs at this point (but can use "link" to do so)
217f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty          parent.add(new Node.Builder().setLabel(name).setChildren(mchildren).setType(type).build());
2181b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         }
219c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty         dirs.add(name);
2201b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty         i++;
2211b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty       }
22225586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
2231b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
2241b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //If this is an index for the project root (assumed root if split length is 3 (development/samples/nn)),
2251b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //then remove the root dir so that it won't appear in the breadcrumb. Else just pass it through to
2261b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    //setParentDirs as usual.
2271b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String mpath = dir + "";
2281b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String sdir[] = mpath.split("/");
2291b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    setParentDirs(hdf, relative, name, false);
230e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //Generate an index.html page for each dir being processed
231e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    ClearPage.write(hdf, "sampleindex.cs", relative + "/index" + Doclava.htmlExtension);
232e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //concatenate dirs in the navtree. Comment out or remove to restore normal navtree
23325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    squashNodes(parent);
234e27c950134c99151d1d9914eaaf28848327e4f63Scott Main  }
235e27c950134c99151d1d9914eaaf28848327e4f63Scott Main
236c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  public void writeProjectStructure(String dir, Data hdf) {
237c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      //System.out.println(">>-- writing project structure for " + dir );
238c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("projectStructure", "true");
239c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("projectDir", mProjectDir);
240c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("page.title", mProjectDir + " Structure");
241c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("projectTitle", mTitle);
242e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //write the project.html file
243e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      ClearPage.write(hdf, "sampleindex.cs", mDest + "project" + Doclava.htmlExtension);
244c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("projectStructure", "");
245920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
246920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
247c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
248e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * Processes a templated project index page from _index.jd in a project root.
249e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * Each sample project must have an index, and each index locally defines it's own
250e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * page.tags and sample.group cs vars. This method takes a SC node on input, reads
251e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * any local vars from the _index.jd, generates an html file to out, then updates
252e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * the SC node with the page vars and returns it to the caller.
253e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  *
254c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
255e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  public Node writeProjectIndexCs(Data hdf, File dir, String key, Node tnode) {
256e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //hdf.setValue("summary", "");
257e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //hdf.setValue("summaryFlag", "");
258e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    String filename = dir.getAbsolutePath() + "/_index.jd";
259e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    File f = new File(filename);
260e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    String rel = dir.getPath();
261e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    String mGroup = "";
262e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("samples", "true");
263e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //set any default page variables for root index
264e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("page.title", mProjectDir);
26525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    hdf.setValue("projectDir", mProjectDir);
26625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    hdf.setValue("projectTitle", mTitle);
2673542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    //add the download/project links to the landing pages.
2683542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("samplesProjectIndex", "true");
2691b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
270e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    if (!f.isFile()) {
271e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //The sample didn't have any _index.jd, so create a stub.
272e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      ClearPage.write(hdf, "sampleindex.cs", mDest + "index" + Doclava.htmlExtension);
273e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //Errors.error(Errors.INVALID_SAMPLE_INDEX, null, "Sample " + mProjectDir
274e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //          + ": Root _index.jd must be present and must define sample.group"
275e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //          + " tag. Please see ... for details.");
276e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    } else {
277e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      DocFile.writePage(filename, rel, mDest + "index" + Doclava.htmlExtension, hdf);
278f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      PageMetadata.setPageMetadata(f, rel, mDest + "index" + Doclava.htmlExtension, hdf, Doclava.sTaglist);
279e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      tnode.setTags(hdf.getValue("page.tags", ""));
280e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      mGroup = hdf.getValue("sample.group", "");
281e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      if (mGroup.equals("")) {
282e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        //Errors.error(Errors.INVALID_SAMPLE_INDEX, null, "Sample " + mProjectDir
283e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        //          + ": Root _index.jd must be present and must define sample.group"
284e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        //          + " tag. Please see ... for details.");
285e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      } else {
286e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      tnode.setGroup(hdf.getValue("sample.group", ""));
287e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      }
288e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    }
289e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    return tnode;
290c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  }
291920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
292c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
293c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * Keep track of file parents
294c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
295c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  Data setParentDirs(Data hdf, String subdir, String name, Boolean isFile) {
296e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //set whether to linkify the crumb dirs on each sample code page
297e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("pathCrumbLinks", "");
298e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        //isFile = false;
299c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    int iter;
300c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.removeTree("parentdirs");
301c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String s = subdir;
302c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String urlParts[] = s.split("/");
303e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //int n, l = (isFile)?1:0;
304e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    int n, l = 1;
305e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //System.out.println("setParentDirs for " + subdir + name);
306e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    for (iter=1; iter < urlParts.length; iter++) {
307e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      n = iter-1;
308c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      //System.out.println("parentdirs." + n + ".Name == " + urlParts[iter]);
309c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("parentdirs." + n + ".Name", urlParts[iter]);
310e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      hdf.setValue("parentdirs." + n + ".Link", subdir + "index" + Doclava.htmlExtension);
311920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    }
312920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    return hdf;
313920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
314920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
315c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
316c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * Write a templated source code file to out.
317c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
318920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  public void writePage(File f, String out, String subdir) {
319920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String name = f.getName();
3201b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    String path = f.getPath();
321920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    String data =
3221b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        SampleTagInfo.readFile(new SourcePositionInfo(path, -1, -1), path, "sample code",
3231b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            true, true, true, true);
324920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    data = Doclava.escape(data);
325920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
326920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Data hdf = Doclava.makeHDF();
32725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
32825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    String relative = subdir.replaceFirst("samples/", "");
3291b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("samples", "true");
3301b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    setParentDirs(hdf, subdir, name, true);
3311b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("projectTitle", mTitle);
332c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("projectDir", mProjectDir);
333920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("page.title", name);
334920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("subdir", subdir);
33525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    hdf.setValue("relative", relative);
336920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("realFile", name);
337920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("fileContents", data);
3381b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("resTag", "sample");
3391b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("resType", "Sample Code");
340920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
341920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClearPage.write(hdf, "sample.cs", out);
342920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
343920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson
344c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
3453542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty  * Write a templated image or video file to out.
346c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
3473542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty  public void writeImageVideoPage(File f, String out, String subdir,
3483542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty      String resourceType, boolean browsable) {
349920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    Data hdf = Doclava.makeHDF();
3503542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    String name = f.getName();
3513542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    if (!browsable) {
3523542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty      hdf.setValue("noDisplay", "true");
3533542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    }
3541b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    setParentDirs(hdf, subdir, name, true);
3553542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("samples", "true");
356920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("page.title", name);
3571b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    hdf.setValue("projectTitle", mTitle);
358c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("projectDir", mProjectDir);
359920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("subdir", subdir);
3603542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("resType", resourceType);
361920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    hdf.setValue("realFile", name);
362920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson    ClearPage.write(hdf, "sample.cs", out);
363920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson  }
3641b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
3651b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  /**
366f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty  * Render a SC node tree to a navtree js file.
3671b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  */
368815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty  public static void writeSamplesNavTree(List<Node> tnode, List<Node> groupnodes) {
369815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty
370f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty    Node node = new
371f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty        Node.Builder().setLabel("Reference").setLink("packages.html").setChildren(tnode).build();
3721b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
373815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    if (groupnodes != null) {
374815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      for (int i = 0; i < tnode.size(); i++) {
375187b985f817b4a0181c5127270a2aab9915cf60aDirk Dougherty        if (tnode.get(i) != null) {
376187b985f817b4a0181c5127270a2aab9915cf60aDirk Dougherty          groupnodes = appendNodeGroups(tnode.get(i), groupnodes);
377187b985f817b4a0181c5127270a2aab9915cf60aDirk Dougherty        }
378815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      }
3791d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty      for (int n = 0; n < groupnodes.size(); n++) {
3801d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty        if (groupnodes.get(n).getChildren() == null) {
3811d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty          groupnodes.remove(n);
3821d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty          n--;
3831d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty        }
3841d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty      }
385815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      node.setChildren(groupnodes);
386815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    }
387815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty
3881b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    StringBuilder buf = new StringBuilder();
3891b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    if (false) {
3901b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    // if you want a root node
3911b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append("[");
3921b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      node.render(buf);
3931b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append("]");
3941b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    } else {
3951b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      // if you don't want a root node
3961b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      node.renderChildren(buf);
3971b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
3981b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
3991b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    Data data = Doclava.makeHDF();
4001b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    data.setValue("reference_tree", buf.toString());
4011b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    ClearPage.write(data, "samples_navtree_data.cs", "samples_navtree_data.js");
4021b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  }
4031b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
40425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  /**
4051d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty  * For a given project root node, get the group and then iterate the list of valid
4061d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty  * groups looking for a match. If found, append the project to that group node.
407f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty  * Samples that reference a valid sample group tag are added to a list for that
4081d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty  * group. Samples declare a sample.group tag in their _index.jd files.
409815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty  */
410815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty  private static List<Node> appendNodeGroups(Node gNode, List<Node> groupnodes) {
411815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    List<Node> mgrouplist = new ArrayList<Node>();
4121d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty    for (int i = 0; i < groupnodes.size(); i++) {
413187b985f817b4a0181c5127270a2aab9915cf60aDirk Dougherty      if (gNode.getGroup().equals(groupnodes.get(i).getLabel())) {
414815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty        if (groupnodes.get(i).getChildren() == null) {
4151d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty          mgrouplist.add(gNode);
416815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty          groupnodes.get(i).setChildren(mgrouplist);
4171d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty        } else {
4181d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty          groupnodes.get(i).getChildren().add(gNode);
419815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty        }
420815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty        break;
4211d8fa8ddfef0080a63faf8ec09c69bd5f00ee601Dirk Dougherty      }
422815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    }
423815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    return groupnodes;
424815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty  }
425815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty
426815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty  /**
42725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  * Sort by type and name (alpha), with manifest and src always at top.
42825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  */
429c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  Comparator<File> byTypeAndName = new Comparator<File>() {
430c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    public int compare (File one, File other) {
431c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      if (one.isDirectory() && !other.isDirectory()) {
432c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        return 1;
433c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      } else if (!one.isDirectory() && other.isDirectory()) {
434c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        return -1;
435187b985f817b4a0181c5127270a2aab9915cf60aDirk Dougherty      } else if ("AndroidManifest.xml".equals(one.getName())) {
43625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        return -1;
437c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      } else {
438c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        return one.compareTo(other);
439c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      }
440c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    }
441c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  };
442c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
4431b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  /**
44425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  * Concatenate dirs that only hold dirs to simplify nav tree
44525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  */
446815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty  public static List<Node> squashNodes(List<Node> tnode) {
44725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    List<Node> list = tnode;
44825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
44925586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    for(int i = 0; i < list.size(); ++i) {
45025586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      //only squash dirs that contain another dir whose list size is 1 and
45125586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      //that don't contain endpoints
452187b985f817b4a0181c5127270a2aab9915cf60aDirk Dougherty      if (("dir".equals(list.get(i).getType())) &&
45325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty          (list.size() == 1) &&
45425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty          (list.get(i).getChildren().get(0).getChildren() != null)) {
45525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        String thisLabel = list.get(i).getLabel();
45625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        String childLabel =  list.get(i).getChildren().get(0).getLabel();
45725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        String newLabel = thisLabel + "/" + childLabel;
45825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        //Set label of parent and mChildren to those of child-child, skipping
45925586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        //squashed dir
46025586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        list.get(i).setLabel(newLabel);
46125586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        list.get(i).setChildren(list.get(i).getChildren().get(0).getChildren());
46225586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      } else {
46325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        continue;
46425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      }
46525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
46625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    return list;
46725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  }
46825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
46925586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty  /**
4701b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  * SampleCode variant of NavTree node.
4711b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  */
4721b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  public static class Node {
4731b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    private String mLabel;
4741b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    private String mLink;
475e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    private String mGroup; // from sample.group in _index.jd
476e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    private List<String> mTags; // from page.tags in _index.jd
47725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    private List<Node> mChildren;
47825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    private String mType;
4791b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
480f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty    private Node(Builder builder) {
481f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      mLabel = builder.mLabel;
482f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      mLink = builder.mLink;
483f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      mGroup = builder.mGroup;
484f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      mTags = builder.mTags;
485f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      mChildren = builder.mChildren;
486f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      mType = builder.mType;
4871b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
488f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty
489f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty    public static class Builder {
490f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      private String mLabel, mLink, mGroup, mType;
491f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      private List<String> mTags = null;
492f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      private List<Node> mChildren = null;
493f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      public Builder setLabel(String mLabel) { this.mLabel = mLabel; return this;}
494f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      public Builder setLink(String mLink) { this.mLink = mLink; return this;}
495f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      public Builder setGroup(String mGroup) { this.mGroup = mGroup; return this;}
496f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      public Builder setTags(List<String> mTags) { this.mTags = mTags; return this;}
497f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      public Builder setChildren(List<Node> mChildren) { this.mChildren = mChildren; return this;}
498f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      public Builder setType(String mType) { this.mType = mType; return this;}
499f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      public Node build() {return new Node(this);}
500f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty    }
501f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty
502f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty    public Node(String mLabel,
503f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      String mLink,
504f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      String mGroup,
505f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      List<String> mTags,
506f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      List<Node> mChildren,
507f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      String mType) {
508f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      this.mLabel = mLabel;
509f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      this.mLink = mLink;
510f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      this.mGroup = mGroup;
511f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      this.mTags = mTags;
512f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      this.mChildren = mChildren;
513f9d9cb045339e902b36391d19be3c665b1585ab8Dirk Dougherty      this.mType = mType; }
514582c1d6e605c968147f3e2058ec31b47c09e19e3Dirk Dougherty
5151b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    static void renderString(StringBuilder buf, String s) {
5161b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      if (s == null) {
5171b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append("null");
5181b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      } else {
5191b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append('"');
5201b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        final int N = s.length();
5211b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        for (int i = 0; i < N; i++) {
5221b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          char c = s.charAt(i);
5231b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          if (c >= ' ' && c <= '~' && c != '"' && c != '\\') {
5241b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            buf.append(c);
5251b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          } else {
5261b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            buf.append("\\u");
5271b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            for (int j = 0; i < 4; i++) {
5281b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              char x = (char) (c & 0x000f);
5291b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              if (x > 10) {
5301b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty                x = (char) (x - 10 + 'a');
5311b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              } else {
5321b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty                x = (char) (x + '0');
5331b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              }
5341b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              buf.append(x);
5351b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty              c >>= 4;
5361b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            }
5371b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          }
5381b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        }
5391b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append('"');
5401b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      }
5411b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
5421b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
5431b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    void renderChildren(StringBuilder buf) {
5441b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      List<Node> list = mChildren;
5451b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      if (list == null || list.size() == 0) {
5461b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        // We output null for no children. That way empty lists here can just
5471b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        // be a byproduct of how we generate the lists.
5481b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append("null");
5491b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      } else {
5501b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append("[ ");
5511b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        final int N = list.size();
5521b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        for (int i = 0; i < N; i++) {
5531b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          list.get(i).render(buf);
5541b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          if (i != N - 1) {
5551b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty            buf.append(", ");
5561b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty          }
5571b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        }
5581b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty        buf.append(" ]\n");
5591b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      }
5601b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
5611b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
562e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    void renderTags(StringBuilder buf) {
563e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      List<String> list = mTags;
564e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      if (list == null || list.size() == 0) {
565e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        buf.append("null");
566e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      } else {
567e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        buf.append("[ ");
568e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        final int N = list.size();
569e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        for (int i = 0; i < N; i++) {
570e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          String tagval = list.get(i).toString();
571e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          buf.append('"');
572e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          final int L = tagval.length();
573e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          for (int t = 0; t < L; t++) {
574e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty            char c = tagval.charAt(t);
575e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty            if (c >= ' ' && c <= '~' && c != '"' && c != '\\') {
576e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty              buf.append(c);
577e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty            } else {
578e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty              buf.append("\\u");
579e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty              for (int m = 0; m < 4; m++) {
580e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                char x = (char) (c & 0x000f);
581e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                if (x > 10) {
582e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                  x = (char) (x - 10 + 'a');
583e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                } else {
584e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                  x = (char) (x + '0');
585e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                }
586e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                buf.append(x);
587e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                c >>= 4;
588e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty              }
589e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty            }
590e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          }
591e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          buf.append('"');
592e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          if (i != N - 1) {
593e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty            buf.append(", ");
594e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty          }
595e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        }
596e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        buf.append(" ]");
597e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      }
598e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    }
599e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty
6001b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    void render(StringBuilder buf) {
6011b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append("[ ");
6021b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      renderString(buf, mLabel);
6031b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append(", ");
6041b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      renderString(buf, mLink);
6051b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append(", ");
606e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      renderString(buf, mGroup);
607e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      buf.append(", ");
608e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      renderTags(buf);
609e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      buf.append(", ");
6101b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      renderChildren(buf);
6111b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append(", ");
6121b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      renderString(buf, mType);
6131b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty      buf.append(" ]");
6141b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty    }
61525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
61625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    public List<Node> getChildren() {
61725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      if (mChildren != null) {
61825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        return mChildren;
61925586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      } else {
62025586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        return null;
62125586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      }
62225586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
62325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
62425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    public void setChildren(List<Node> node) {
62525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty        mChildren = node;
62625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
62725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
62825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    public String getLabel() {
62925586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      return mLabel;
63025586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
63125586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
63225586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    public void setLabel(String label) {
63325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty       mLabel = label;
63425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
63525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
63625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    public String getType() {
63725586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      return mType.toString();
63825586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
63925586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
64025586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    public String getHref() {
64125586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      return mLink;
64225586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
64325586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty
64425586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    public void setHref(String link) {
64525586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty      mLink = link;
64625586c08d0a5068159d1c9482f0eaec0d8cc3d50Dirk Dougherty    }
647e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty
648815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    public String getGroup() {
649815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      return mGroup;
650e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    }
651e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty
652815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty    public void setGroup(String group) {
653815f9342d2b82cf61e56e64cbea46079215041beDirk Dougherty      mGroup = group;
654e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    }
655e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty
656e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    public void setTags(String tags) {
657e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      List<String> tagList = new ArrayList();
658e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      String[] tagParts = tags.split(",");
659e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty
660e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      for (int iter = 0; iter < tagParts.length; iter++) {
661e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        String item = tagParts[iter].replaceAll("\"", "").trim();
662e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty        tagList.add(item);
663e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      }
664e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      mTags = tagList;
665e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    }
666e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  }
667e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty
668e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  /**
669e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * Write the project's templated _index.html
670e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * @deprecated
671e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  *
672e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  */
673e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  public void writeProjectIndex(Data hdf) {
674e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //System.out.println(">>-- writing project index for " + mDest );
675e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("projectDir", mProjectDir);
676e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("page.title", mProjectDir + " Sample");
677e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("projectTitle", mTitle);
678e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    ClearPage.write(hdf, "sampleindex.cs", mDest + "index" + Doclava.htmlExtension);
679e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  }
680e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty
681e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  /**
682e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * Grab the contents of an _index.html summary from a dir.
683e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  * @deprecated
684e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  */
685e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty  public void getSummaryFromDir(Data hdf, File dir, String key) {
686e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    //System.out.println("Getting summary for " + dir + "/_index.html");
687e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("summary", "");
688e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    hdf.setValue("summaryFlag", "");
689e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    String filename = dir.getPath() + "/_index.html";
690e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    String summary = SampleTagInfo.readFile(new SourcePositionInfo(filename,
691e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty                          -1,-1), filename, "sample code", true, false, false, true);
692e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    if (summary != null) {
693e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      hdf.setValue(key + "SummaryFlag", "true");
694e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      hdf.setValue("summary", summary);
695e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //set the target for [info] link
696e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //hdf.setValue(key + "Href", dir + "/index.html");
697e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty      //return true;
698e52f6d819e7d95e19e9b315f358bb7ac293413d8Dirk Dougherty    }
6991b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty  }
7001b45d1d08a4ff984e1d0741dd13f0759f6527ebfDirk Dougherty
701c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
702c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * @deprecated
703c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
704c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  public void writeDirectory(File dir, String relative, boolean offline) {
705c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    TreeSet<String> dirs = new TreeSet<String>();
706c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    TreeSet<String> files = new TreeSet<String>();
707c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
708c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String subdir = relative; // .substring(mDest.length());
709c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
710c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    for (File f : dir.listFiles()) {
711c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      String name = f.getName();
712c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      if (name.startsWith(".") || name.startsWith("_")) {
713c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        continue;
714c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      }
715c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      if (f.isFile()) {
716c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        String out = relative + name;
717c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        if (inList(out, IMAGES)) {
718c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          // copied directly
719c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          ClearPage.copyFile(false, f, out);
720c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          writeImagePage(f, convertExtension(out, Doclava.htmlExtension), subdir);
721c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          files.add(name);
722c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        }
723c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        if (inList(out, TEMPLATED)) {
724c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          // copied and goes through the template
725c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          ClearPage.copyFile(false, f, out);
726c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          writePage(f, convertExtension(out, Doclava.htmlExtension), subdir);
727c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty          files.add(name);
728c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
729c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        }
730c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        // else ignored
731c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      } else if (f.isDirectory()) {
732c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        writeDirectory(f, relative + name + "/", offline);
733c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        dirs.add(name);
734c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      }
735c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    }
736c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
737c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    // write the index page
738c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    int i;
739c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
740c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    Data hdf = writeIndex(dir);
741c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("subdir", subdir);
742c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    i = 0;
743c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    for (String d : dirs) {
744c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("subdirs." + i + ".Name", d);
745c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("files." + i + ".Href", convertExtension(d, ".html"));
746c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      i++;
747c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    }
748c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    i = 0;
749c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    for (String f : files) {
750c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("files." + i + ".Name", f);
751c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      hdf.setValue("files." + i + ".Href", convertExtension(f, ".html"));
752c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      i++;
753c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    }
754c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
755c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    if (!offline) relative = "/" + relative;
756c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    ClearPage.write(hdf, "sampleindex.cs", relative + "index" + Doclava.htmlExtension);
757c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  }
758c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
759c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
760c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * @deprecated
761c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
762c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  public void writeIndexOnly(File dir, String relative, Boolean offline) {
763c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    Data hdf = writeIndex(dir);
764c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    if (!offline) relative = "/" + relative;
765c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
766c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      System.out.println("writing indexonly at " + relative + "/index" + Doclava.htmlExtension);
767c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      ClearPage.write(hdf, "sampleindex.cs", relative + "index" + Doclava.htmlExtension);
768c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  }
769c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
770c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  /**
771c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  * @deprecated
772c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  */
773c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  public Data writeIndex(File dir) {
774c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    Data hdf = Doclava.makeHDF();
775c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("page.title", dir.getName() + " - " + mTitle);
776c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("projectTitle", mTitle);
777c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
778c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String filename = dir.getPath() + "/_index.html";
779c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    String summary =
780c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty        SampleTagInfo.readFile(new SourcePositionInfo(filename, -1, -1), filename, "sample code",
781c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty            true, false, false, true);
782c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
783c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    if (summary == null) {
784c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty      summary = "";
785c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    }
786c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    hdf.setValue("summary", summary);
787c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
788c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty    return hdf;
789c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty  }
790c11a467135f9118604f31fadc99d2edd494edb0bDirk Dougherty
7913542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty  /**
7923542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty  * @deprecated
7933542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty  */
7943542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty  public void writeImagePage(File f, String out, String subdir) {
7953542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    Data hdf = Doclava.makeHDF();
7963542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    String name = f.getName();
7973542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty
7983542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("samples", "true");
7993542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    setParentDirs(hdf, subdir, name, true);
8003542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("page.title", name);
8013542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("projectTitle", mTitle);
8023542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("projectDir", mProjectDir);
8033542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("subdir", subdir);
8043542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("realFile", name);
8053542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("resTag", "sample");
8063542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    hdf.setValue("resType", "sampleImage");
8073542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty    ClearPage.write(hdf, "sample.cs", out);
8083542770e7b9e121d1a3107300af1aac1b2555128Dirk Dougherty  }
809920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson}
810