Package com.google.jstestdriver

Source Code of com.google.jstestdriver.ConfigurationParser

/*
* Copyright 2009 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.jstestdriver;

import com.google.common.collect.Lists;
import com.google.jstestdriver.config.ConfigurationException;
import com.google.jstestdriver.hooks.FileParsePostProcessor;
import com.google.jstestdriver.model.BasePaths;
import com.google.jstestdriver.util.DisplayPathSanitizer;

import org.apache.oro.io.GlobFilenameFilter;
import org.apache.oro.text.GlobCompiler;
import org.jvyaml.YAML;

import java.io.File;
import java.io.Reader;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
* TODO: needs to give more feedback when something goes wrong...
*
* @author jeremiele@google.com (Jeremie Lenfant-Engelmann)
*/
@Deprecated
public class ConfigurationParser {

  private static final List<String> EMPTY_LIST = Lists.newArrayList();

  private final Set<FileInfo> filesList = new LinkedHashSet<FileInfo>();
  private final File basePath;
  private final Reader configReader;
  private final PathRewriter pathRewriter;

  private String server = "";
  private List<Plugin> plugins = new LinkedList<Plugin>();

  private PathResolver pathResolver;

  public ConfigurationParser(File basePath, Reader configReader, PathRewriter pathRewriter) {
    this.basePath = basePath;
    this.configReader = configReader;
    this.pathRewriter = pathRewriter;
    pathResolver =
        new PathResolver(new BasePaths(basePath), Collections.<FileParsePostProcessor>emptySet(), new DisplayPathSanitizer());
  }

  @SuppressWarnings("unchecked")
  public void parse() {
    Map<Object, Object> data = (Map<Object, Object>) YAML.load(configReader);
    Set<FileInfo> resolvedFilesLoad = new LinkedHashSet<FileInfo>();
    Set<FileInfo> resolvedFilesExclude = new LinkedHashSet<FileInfo>();

    if (data.containsKey("load")) {
      resolvedFilesLoad.addAll(resolveFiles((List<String>) data.get("load"), false));
    }
    if (data.containsKey("exclude")) {
      resolvedFilesExclude.addAll(resolveFiles((List<String>) data.get("exclude"), false));
    }
    if (data.containsKey("server")) {
      this.server = (String) data.get("server");
    }
    if (data.containsKey("plugin")) {
      for (Map<String, String> value: (List<Map<String, String>>) data.get("plugin")) {
        plugins.add(new Plugin(value.get("name"), value.get("jar"), value.get("module"),
            createArgsList(value.get("args"))));
      }
    }
    if (data.containsKey("serve")) {
      Set<FileInfo> resolvedServeFiles = resolveFiles((List<String>) data.get("serve"), true);
      resolvedFilesLoad.addAll(resolvedServeFiles);
    }
    filesList.addAll(consolidatePatches(resolvedFilesLoad));
    filesList.removeAll(resolvedFilesExclude);
  }

  private List<String> createArgsList(String args) {
    if (args == null) {
      return EMPTY_LIST;
    }
    List<String> argsList = Lists.newLinkedList();
    String[] splittedArgs = args.split(",");

    for (String arg : splittedArgs) {
      argsList.add(arg.trim());
    }
    return argsList;
  }

  private Set<FileInfo> consolidatePatches(Set<FileInfo> resolvedFilesLoad) {
    Set<FileInfo> consolidated = new LinkedHashSet<FileInfo>(resolvedFilesLoad.size());
    FileInfo currentNonPatch = null;
    for (FileInfo fileInfo : resolvedFilesLoad) {
      if (fileInfo.isPatch()) {
        if (currentNonPatch == null) {
          throw new IllegalStateException("Patch " + fileInfo + " without a core file to patch");
        }
        currentNonPatch.addPatch(fileInfo);
      } else {
        consolidated.add(fileInfo);
        currentNonPatch = fileInfo;
      }
    }
    return consolidated;
  }

  private Set<FileInfo> resolveFiles(List<String> files, boolean serveOnly) {
    if (files != null) {
      Set<FileInfo> resolvedFiles = new LinkedHashSet<FileInfo>();

      for (String f : files) {
        f = pathRewriter.rewrite(f);
        boolean isPatch = f.startsWith("patch");

        if (isPatch) {
          String[] tokens = f.split(" ", 2);

          f = tokens[1].trim();
        }
        if (f.startsWith("http://") || f.startsWith("https://")) {
          resolvedFiles.add(new FileInfo(f, -1, -1, false, false, null, f));
        } else {
          File file = basePath != null ? new File(basePath.getAbsoluteFile(), f) : new File(f);
          File testFile = file.getAbsoluteFile();
          File dir = testFile.getParentFile().getAbsoluteFile();
          final String pattern = file.getName();
          String[] filteredFiles = dir.list(new GlobFilenameFilter(pattern,
              GlobCompiler.DEFAULT_MASK | GlobCompiler.CASE_INSENSITIVE_MASK));

          if (filteredFiles == null || filteredFiles.length == 0) {
            String error = "The patterns/paths " + f  + " used in the configuration"
                + " file didn't match any file, the files patterns/paths need to be relative to"
                + " the configuration file.";
            throw new ConfigurationException(error);
          }
          Arrays.sort(filteredFiles, String.CASE_INSENSITIVE_ORDER);

          for (String filteredFile : filteredFiles) {
            FileInfo resolvedFile =
                pathResolver.resolvePathToFileInfo(dir.getPath() + File.separator + filteredFile,
                    isPatch, serveOnly);
            resolvedFiles.add(resolvedFile);
          }
        }
      }
      return resolvedFiles;
    }
    return Collections.emptySet();
  }

  public Set<FileInfo> getFilesList() {
    return filesList;
  }

  public String getServer() {
    return server;
  }

  public String getCaptureAddress() {
    return server;
  }

  public List<Plugin> getPlugins() {
    return plugins;
  }
}
TOP

Related Classes of com.google.jstestdriver.ConfigurationParser

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.