1 import static java.nio.file.FileVisitResult.CONTINUE;
   2 
   3 import java.io.IOException;
   4 import java.nio.file.FileSystems;
   5 import java.nio.file.FileVisitResult;
   6 import java.nio.file.Files;
   7 import java.nio.file.Path;
   8 import java.nio.file.attribute.BasicFileAttributes;
   9 import java.util.Stack;
  10 import java.util.Vector;
  11 
  12 public class FileTreeCreatorVC10 extends FileTreeCreator {
  13 
  14       public FileTreeCreatorVC10(Path startDir, Vector<BuildConfig> allConfigs, WinGammaPlatformVC10 wg) {
  15          super(startDir, allConfigs, wg);
  16       }
  17 
  18       @Override
  19       public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {
  20          DirAttributes currentFileAttr = attributes.peek().clone();
  21          boolean usePch = false;
  22          boolean disablePch = false;
  23          boolean useIgnore = false;
  24          String fileName = file.getFileName().toString();
  25 
  26          // TODO hideFile
  27 
  28          // usePch applies to all configs for a file.
  29          if (fileName.equals(BuildConfig.getFieldString(null, "UseToGeneratePch"))) {
  30             usePch = true;
  31          }
  32 
  33          for (BuildConfig cfg : allConfigs) {
  34             if (cfg.lookupHashFieldInContext("IgnoreFile", fileName) != null) {
  35                useIgnore = true;
  36                currentFileAttr.setIgnore(cfg);
  37             } else if (cfg.matchesIgnoredPath(file.toAbsolutePath().toString())) {
  38                useIgnore = true;
  39                currentFileAttr.setIgnore(cfg);
  40             }
  41 
  42             if (cfg.lookupHashFieldInContext("DisablePch", fileName) != null) {
  43                disablePch = true;
  44                currentFileAttr.setDisablePch(cfg);
  45             }
  46 
  47             Vector<String> rv = new Vector<String>();
  48             cfg.collectRelevantVectors(rv, "AdditionalFile");
  49             for(String addFile : rv) {
  50                if (addFile.equals(fileName)) {
  51                   // supress any ignore
  52                   // TODO - may need some adjustments
  53                   if (file.toAbsolutePath().toString().contains(cfg.get("Flavour"))) {
  54                      currentFileAttr.removeFromIgnored(cfg);
  55                   }
  56                }
  57             }
  58          }
  59 
  60          String tagName = wg.getFileTagFromSuffix(fileName);
  61          String fileLoc = vcProjLocation.relativize(file).toString();
  62 
  63          if (!useIgnore && !disablePch && !usePch) {
  64             wg.tag(tagName, new String[] { "Include", fileLoc});
  65          } else {
  66             wg.startTag(
  67                   tagName,
  68                   new String[] { "Include", fileLoc});
  69 
  70             for (BuildConfig cfg : allConfigs) {
  71                boolean ignore = currentFileAttr.hasIgnore(cfg);
  72                if (ignore) {
  73                   wg.tagData("ExcludedFromBuild", "true", "Condition", "'$(Configuration)|$(Platform)'=='" + cfg.get("Name") + "'");
  74                }
  75                if (usePch) {
  76                   wg.tagData("PrecompiledHeader", "Create", "Condition", "'$(Configuration)|$(Platform)'=='" + cfg.get("Name") + "'");
  77                }
  78                if (disablePch) {
  79                   wg.tag("PrecompiledHeader", "Condition", "'$(Configuration)|$(Platform)'=='" + cfg.get("Name") + "'");
  80                }
  81             }
  82             wg.endTag();
  83          }
  84 
  85          String filter = startDir.relativize(file.getParent().toAbsolutePath()).toString();
  86          wg.addFilterDependency(fileLoc, filter);
  87 
  88          return CONTINUE;
  89       }
  90 
  91       @Override
  92       public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes attrs)
  93             throws IOException {
  94          Boolean hide = false;
  95          // TODO remove attrs, if path is matched in this dir, then it is too in every subdir.
  96          // And we will check anyway
  97          DirAttributes newAttr = attributes.peek().clone();
  98 
  99          // check per config ignorePaths!
 100          for (BuildConfig cfg : allConfigs) {
 101             if (cfg.matchesIgnoredPath(path.toAbsolutePath().toString())) {
 102                newAttr.setIgnore(cfg);
 103             }
 104 
 105             // Hide is always on all configs. And additional files are never hiddden
 106             if (cfg.matchesHidePath(path.toAbsolutePath().toString())) {
 107                hide = true;
 108                break;
 109             }
 110          }
 111 
 112          if (!hide) {
 113             String name = startDir.relativize(path.toAbsolutePath()).toString();
 114             if (!"".equals(name)) {
 115                wg.addFilter(name);
 116             }
 117 
 118             attributes.push(newAttr);
 119             return super.preVisitDirectory(path, attrs);
 120          } else {
 121             return FileVisitResult.SKIP_SUBTREE;
 122          }
 123       }
 124 
 125       @Override
 126       public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
 127          //end matching attributes set by ignorepath
 128          attributes.pop();
 129          return CONTINUE;
 130       }
 131 
 132       @Override
 133       public FileVisitResult visitFileFailed(Path file, IOException exc) {
 134          return CONTINUE;
 135       }
 136 
 137       public void writeFileTree() throws IOException {
 138          Files.walkFileTree(this.startDir, this);
 139       }
 140 
 141