Package org.apache.oodt.cas.filemgr.tools

Source Code of org.apache.oodt.cas.filemgr.tools.SolrIndexer$IndexerConfig

/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.oodt.cas.filemgr.tools;

//JDK imports
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.logging.Logger;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.OptionGroup;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.oodt.cas.filemgr.metadata.CoreMetKeys;
import org.apache.oodt.cas.filemgr.structs.Product;
import org.apache.oodt.cas.filemgr.structs.ProductPage;
import org.apache.oodt.cas.filemgr.structs.ProductType;
import org.apache.oodt.cas.filemgr.structs.exceptions.CatalogException;
import org.apache.oodt.cas.filemgr.structs.exceptions.ConnectionException;
import org.apache.oodt.cas.filemgr.structs.exceptions.RepositoryManagerException;
import org.apache.oodt.cas.filemgr.system.XmlRpcFileManagerClient;
import org.apache.oodt.cas.metadata.Metadata;
import org.apache.oodt.cas.metadata.SerializableMetadata;
import org.apache.oodt.cas.metadata.util.PathUtils;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.util.StringUtils;

/**
* Indexes products from the File Manager catalog to a Solr instance. Uses an
* associated config file, indexer.properties to specify how to perform the
* indexing. See indexer.properties in the src/main/resources directory for
* specific documentation.
*/
public class SolrIndexer {
  private final static String SOLR_INDEXER_CONFIG = "SOLR_INDEXER_CONFIG";
  private final static String SOLR_URL = "solr.url";
  private final static String FILEMGR_URL = "filemgr.url";
  private final static String ACCESS_KEY = "access.key";
  private final static String ACCESS_URL = "access.url";
  private final static String PRODUCT_NAME = "CAS.ProductName";
  private IndexerConfig config = null;
  private final SolrServer server;
  private String fmUrl;
  private String solrUrl;
  private static Logger LOG = Logger.getLogger(SolrIndexer.class.getName());
  private final static SimpleDateFormat solrFormat = new SimpleDateFormat(
      "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

  /**
   * Constructor reads in the configuration and initiates the connection to the
   * Solr instance.
   *
   * @param solrUrl
   *          URL for the Solr instance.
   * @param fmUrl
   *          URL for the File Manager instance.
   */
  public SolrIndexer(String solrUrl, String fmUrl)
      throws InstantiationException {
    InputStream input = null;
    String filename = null;

    try {
      LOG.info("System property " + SOLR_INDEXER_CONFIG + " set to "
          + System.getProperty(SOLR_INDEXER_CONFIG));
      filename = System.getProperty(SOLR_INDEXER_CONFIG);
      if (filename != null) {
        LOG.info("Reading config from " + filename);
        input = new FileInputStream(filename);
      } else {
        LOG.info("Config file not found, reading config from classpath");
        input = SolrIndexer.class.getResourceAsStream("/indexer.properties");
      }
      config = new IndexerConfig(input);
    } catch (IOException e) {
      LOG
          .severe("Could not read in configuration for indexer from classpath or file");
      throw new InstantiationException(e.getMessage());
    } finally {
      if (input != null) {
        try {
          input.close();
        } catch (IOException e) {
          // no op
        }
      }
    }

    this.solrUrl = solrUrl;
    if (this.solrUrl == null) {
      this.solrUrl = config.getProperty(SOLR_URL);
    }

    this.fmUrl = fmUrl;
    if (this.fmUrl == null) {
      this.fmUrl = config.getProperty(FILEMGR_URL);
    }

    LOG.info("Using Solr: " + this.solrUrl + " FileManager: " + this.fmUrl);

    try {
      server = new CommonsHttpSolrServer(this.solrUrl);
    } catch (MalformedURLException e) {
      LOG.severe("Could not connect to Solr server " + this.solrUrl);
      throw new InstantiationException(e.getMessage());
    }

  }

  /**
   * This method deletes all entries from the Solr index.
   */
  public void delete() throws SolrServerException, IOException {
    server.deleteByQuery("*:*");
  }

  /**
   * This method commits all of the modifications to the Solr index.
   */
  public void commit() throws SolrServerException, IOException {
    server.commit();
  }

  /**
   * This method optimizes the Solr index.
   */
  public void optimize() throws SolrServerException, IOException {
    server.optimize();
  }

  /**
   * This method transforms the product metadata into a Solr document.
   *
   * @param metadata
   *          The metadata object for the product to index.
   * @return Returns the SolrInputDocument containing product metadata.
   */
  private SolrInputDocument getSolrDocument(Metadata metadata) {
    SolrInputDocument doc = new SolrInputDocument();
    // Only grab metadata which have a mapping in the indexer.properties
    for (Object objKey : config.getMapProperties().keySet()) {
      // The key in the metadata object
      String key = (String) objKey;
      // The solr field name this metadata key will be mapped to
      String fieldName = config.getMapProperties().getProperty(key);
      List<String> values = metadata.getAllMetadata(key);
      if (values != null) {
        for (String value : values) {
          // Add each metadata value into the
          if (value != null && !config.getIgnoreValues().contains(value.trim())) {
            LOG.fine("Adding field: " + fieldName + " value: " + value);
            doc.addField(fieldName, value);
          }
        }
      }
    }
    return doc;
  }

  /**
   * This method adds a single product extracted from a metadata file to the
   * Solr index.
   *
   * @param file
   *          The file containing product metadata.
   * @param delete
   *          Flag indicating whether the entry should be deleted from the
   *          index.
   * @throws SolrServerException
   *           When an error occurs communicating with the Solr server instance.
   */
  public void indexMetFile(File file, boolean delete)
      throws InstantiationException, FileNotFoundException, IOException,
      SolrServerException {
    LOG.info("Attempting to index product from metadata file.");
    try {
      SerializableMetadata metadata = new SerializableMetadata("UTF-8", false);
      metadata.loadMetadataFromXmlStream(new FileInputStream(file));
      metadata.addMetadata("id", metadata.getMetadata("CAS."
          + CoreMetKeys.PRODUCT_ID));
      metadata.addMetadata(config.getProperty(ACCESS_KEY), config
          .getProperty(ACCESS_URL)
          + metadata.getMetadata("CAS." + CoreMetKeys.PRODUCT_ID));
      if (delete) {
        server
            .deleteById(metadata.getMetadata("CAS." + CoreMetKeys.PRODUCT_ID));
      }
      server.add(this.getSolrDocument(metadata));
      LOG.info("Indexed product: "
          + metadata.getMetadata("CAS." + CoreMetKeys.PRODUCT_ID));
    } catch (InstantiationException e) {
      LOG.severe("Could not instantiate metadata object: " + e.getMessage());
    } catch (FileNotFoundException e) {
      LOG.severe("Could not find metadata file: " + e.getMessage());
    } catch (IOException e) {
      LOG.severe("Could not delete product from index: " + e.getMessage());
    }
  }

  /**
   * This method indexes all product types retrieved from the File Manager to
   * the Solr index.
   *
   * @param delete
   *          Flag indicating whether each product type retrieved from the File
   *          Manager should be deleted from the index.
   * @throws SolrServerException
   *           When an error occurs communicating with the Solr server instance.
   */
  public void indexProductTypes(boolean delete) {
    LOG.info("Indexing product types...");
    try {
      XmlRpcFileManagerClient fmClient = new XmlRpcFileManagerClient(new URL(
          this.fmUrl));
      LOG.info("Retrieving list of product types.");
      List<ProductType> types = fmClient.getProductTypes();
      for (ProductType type : types) {
        if (!config.getIgnoreTypes().contains(type.getName().trim())) {
          Metadata metadata = new Metadata();
          metadata.addMetadata("id", type.getProductTypeId());
          metadata.addMetadata("CAS.ProductTypeId", type.getProductTypeId());
          metadata.addMetadata("CAS.ProductTypeDescription", type
              .getDescription());
          metadata.addMetadata("CAS.ProductTypeRepositoryPath", type
              .getProductRepositoryPath());
          metadata.addMetadata("CAS.ProductTypeVersioner", type.getVersioner());
          metadata.addMetadata("CAS.ProductTypeName", type.getName());
          metadata.addMetadata("ProductType", "ProductType");
          metadata.replaceMetadata(type.getTypeMetadata());
          if (delete) {
            try {
              server.deleteById(type.getProductTypeId());
            } catch (Exception e) {
              LOG.severe("Could not delete product type " + type.getName()
                  + " from index: " + e.getMessage());
            }
          }
          try {
            performSubstitution(metadata);
            server.add(this.getSolrDocument(metadata));
            LOG.info("Indexed product type: " + type.getName());
          } catch (Exception e) {
            LOG.severe("Could not index " + type.getName() + ": "
                + e.getMessage());
          }
        } else {
          LOG.info("Ignoring product type: " + type.getName());
        }
      }
    } catch (MalformedURLException e) {
      LOG.severe("File Manager URL is malformed: " + e.getMessage());
    } catch (ConnectionException e) {
      LOG.severe("Could not connect to File Manager: " + e.getMessage());
    } catch (RepositoryManagerException e) {
      LOG.severe("Could not retrieve product types from File Manager: "
          + e.getMessage());
    }
    LOG.info("Finished indexing product types.");
  }
 
  /**
   * Suppresses exception that occurred with older file managers.
   */
  private ProductPage safeFirstPage(XmlRpcFileManagerClient fmClient, ProductType type) {
    ProductPage page = null;
    try {
      page = fmClient.getFirstPage(type);
    } catch (Exception e) {
      LOG.info("No products found for: " + type.getName());
    }
    return page;
  }

  /**
   * This method indexes all products retrieved from the File Manager to the
   * Solr index. Metadata from the product's associated ProductType is also
   * included.
   *
   * @param delete
   *          Flag indicating whether each product retrieved from the File
   *          Manager should be deleted from the index.
   * @throws SolrServerException
   *           When an error occurs communicating with the Solr server instance.
   */
  public void indexAll(boolean delete) {
    LOG.info("Indexing products...");
    try {
      XmlRpcFileManagerClient fmClient = new XmlRpcFileManagerClient(new URL(
          this.fmUrl));
      LOG.info("Retrieving list of product types.");
      List<ProductType> types = fmClient.getProductTypes();
      for (ProductType type : types) {
        if (!config.getIgnoreTypes().contains(type.getName().trim())) {
          LOG.info("Paging through products for product type: "
              + type.getName());
          for (ProductPage page = safeFirstPage(fmClient, type); page != null && !page
              .isLastPage(); page = fmClient.getNextPage(type, page)) {
            for (Product product : page.getPageProducts()) {
              try {
                this.indexProduct(product.getProductId(), fmClient
                    .getMetadata(product), type.getTypeMetadata());
              } catch (Exception e) {
                LOG.severe("Could not index " + product.getProductId() + ": "
                    + e.getMessage());
              }
            }
          }
        }
      }
      LOG.info("Finished indexing products.");
    } catch (MalformedURLException e) {
      LOG.severe("File Manager URL is malformed: " + e.getMessage());
    } catch (ConnectionException e) {
      LOG.severe("Could not connect to File Manager: " + e.getMessage());
    } catch (CatalogException e) {
      LOG.severe("Could not retrieve products from File Manager: "
          + e.getMessage());
    } catch (RepositoryManagerException e) {
      LOG.severe("Could not retrieve product types from File Manager: "
          + e.getMessage());
    }
  }

  /**
   * This method adds a single product retrieved from the File Manager by its
   * product identifier to the Solr index. Metadata from the ProductType is also
   * included.
   *
   * @param productId
   *          The identifier of the product (CAS.ProductId).
   * @throws SolrServerException
   *           When an error occurs communicating with the Solr server instance.
   */
  public void indexProduct(String productId)
      throws SolrServerException {
    LOG.info("Attempting to index product: " + productId);
    try {
      XmlRpcFileManagerClient fmClient = new XmlRpcFileManagerClient(new URL(
          this.fmUrl));
      Product product = fmClient.getProductById(productId);
      Metadata productMetadata = fmClient.getMetadata(product);
      indexProduct(product.getProductId(), productMetadata, product
          .getProductType().getTypeMetadata());
    } catch (MalformedURLException e) {
      LOG.severe("File Manager URL is malformed: " + e.getMessage());
    } catch (ConnectionException e) {
      LOG.severe("Could not connect to File Manager: " + e.getMessage());
    } catch (CatalogException e) {
      LOG.severe("Could not retrieve product from File Manager: "
          + e.getMessage());
    } catch (java.text.ParseException e) {
      LOG.severe("Could not format date: " + e.getMessage());
    }
  }
 
  /**
   * This method adds a single product retrieved from the File Manager by its
   * product name to the Solr index. Metadata from the ProductType is also
   * included.
   *
   * @param productName
   *          The identifier of the product (CAS.ProductId).
   * @param delete
   *          Flag indicating whether the entry should be deleted from the
   *          index.
   * @throws SolrServerException
   *           When an error occurs communicating with the Solr server instance.
   */
  public void indexProductByName(String productName, boolean delete) throws SolrServerException {
   
    LOG.info("Attempting to index product: " + productName);
    try {

      // Try to delete product by name
      // Note: the standard field "CAS.ProductName" must be mapped to some Solr field in file indexer.properties
      if (delete) {
        try {
          String productNameField = config.mapProperties.getProperty(PRODUCT_NAME);
          if (StringUtils.hasText(productNameField)) {
            server.deleteByQuery(productNameField+":"+productName);
          } else {
            LOG.warning("Metadata field "+PRODUCT_NAME+" is not mapped to any Solr field, cannot delete product by name");
          }
        } catch(Exception e) {
          LOG.warning("Could not delete product: "+productName+" from Solr index");
        }
      }

      XmlRpcFileManagerClient fmClient = new XmlRpcFileManagerClient(new URL(
          this.fmUrl));
      Product product = fmClient.getProductByName(productName);
      Metadata productMetadata = fmClient.getMetadata(product);
      // NOTE: delete (by id) is now false
      indexProduct(product.getProductId(), productMetadata, product.getProductType().getTypeMetadata());
     
    } catch (MalformedURLException e) {
      LOG.severe("File Manager URL is malformed: " + e.getMessage());
    } catch (ConnectionException e) {
      LOG.severe("Could not connect to File Manager: " + e.getMessage());
    } catch (CatalogException e) {
      LOG.severe("Could not retrieve product from File Manager: "
          + e.getMessage());
    } catch (java.text.ParseException e) {
      LOG.severe("Could not format date: " + e.getMessage());
    }
  }

  private void indexProduct(String productId, Metadata productMetadata,
      Metadata typeMetadata) throws SolrServerException,
      java.text.ParseException {
    Metadata metadata = new Metadata();
    metadata.addMetadata("id", productId);
    // Add in product type metadata
    if (typeMetadata != null) {
      metadata.addMetadata(typeMetadata);
    }
    if (productMetadata != null) {
      String accessKey = config.getProperty(ACCESS_KEY);
      // Product metadata takes precedence
      metadata.replaceMetadata(productMetadata);
      // If there is an access url configured add it to the metadata
      if (config.getProperty(ACCESS_URL) != null) {
        metadata.addMetadata(accessKey, config.getProperty(ACCESS_URL));
      }
      // Replace values for metadata keys specified in config. This allows
      // for metadata substitution. For instance, if a key named "product_url"
      // has a value of
      // http://localhost:8080/cas-product/data?productID=[CAS.ProductId]
      // the value in brakets will be updated with the value from the
      // CAS.ProductId.
      performSubstitution(metadata);
      try {
        server.add(this.getSolrDocument(metadata));
        LOG.info("Indexed product: " + productId);
      } catch (IOException e) {
        LOG.severe("Could not index product: " + productId);
      }
    } else {
      LOG.info("Could not find metadata for product: " + productId);
    }
  }

  /**
   * This method deletes a single product identified by a productID from the Solr index
   *
   * @param productId
   * @throws IOException
   * @throws SolrServerException
   */
  public void deleteProduct(String productId) throws IOException, SolrServerException {
    LOG.info("Attempting to delete product: " + productId);
    this.deleteProductFromIndex(productId);
  }

  /**
   * This method deletes a product(s) from the Solr index identified by a given name
   *
   * @param productName
   * @throws IOException
   * @throws SolrServerException
   */
  public void deleteProductByName(String productName) throws IOException, SolrServerException {
    LOG.info("Attempting to delete product: " + productName);

    try {
      String productNameField = config.mapProperties.getProperty(PRODUCT_NAME);
      if (StringUtils.hasText(productNameField)) {
        server.deleteByQuery(productNameField+":"+productName);
      } else {
        LOG.warning("Metadata field "+PRODUCT_NAME+" is not mapped to any Solr field, cannot delete product by name");
      }
    } catch(Exception e) {
      LOG.warning("Could not delete product: "+productName+" from Solr index");
    }

  }

  private void deleteProductFromIndex(String productId) throws IOException, SolrServerException {
    server.deleteById(productId);
  }
 
  /**
   * Quick helper method to do substitution on the keys specified in the config
   *
   * @param metadata
   *          to substitute on
   * @throws java.text.ParseException
   */
  private void performSubstitution(Metadata metadata)
      throws java.text.ParseException {
    // Do metadata replacement
    for (String key : config.getReplacementKeys()) {
      List<String> values = metadata.getAllMetadata(key);
      if (values != null) {
        List<String> newValues = new ArrayList<String>();
        for (String value : values) {
          newValues.add(PathUtils.replaceEnvVariables(value, metadata));
        }
        metadata.removeMetadata(key);
        metadata.addMetadata(key, newValues);
      }
    }
    // Format dates
    for (Object key : config.getFormatProperties().keySet()) {
      String keyString = (String) key;
      if (metadata.containsKey(keyString)) {
        List<String> values = metadata.getAllMetadata(keyString);
        if (values != null) {
          List<String> newValues = new ArrayList<String>();
          SimpleDateFormat format = new SimpleDateFormat(config
              .getFormatProperties().getProperty(keyString).trim());
          for (String value : values) {
            newValues.add(formatDate(format, value));
          }
          metadata.removeMetadata(keyString);
          metadata.addMetadata(keyString, newValues);
        }
      }
    }
  }

  private String formatDate(SimpleDateFormat format, String value)
      throws java.text.ParseException {
    // Ignore formating if its an ignore value
    if (config.getIgnoreValues().contains(value.trim()))
      return value;
    return solrFormat.format(format.parse(value));
  }

  /**
   * This method builds the command-line options.
   *
   * @return Returns the supported Options.
   */
  @SuppressWarnings("static-access")
  public static Options buildCommandLine() {
    Options options = new Options();

    options.addOption(new Option("h", "help", false, "Print this message"));
    options.addOption(new Option("o", "optimize", false,
        "Optimize the Solr index"));
    options.addOption(new Option("d", "delete", false,
        "Delete item before indexing"));
    options.addOption(OptionBuilder.withArgName("Solr URL").hasArg()
        .withDescription("URL to the Solr instance").withLongOpt("solrUrl")
        .create("su"));
    options.addOption(OptionBuilder.withArgName("Filemgr URL").hasArg()
        .withDescription("URL to the File Manager").withLongOpt("fmUrl")
        .create("fmu"));

    OptionGroup group = new OptionGroup();
    Option all = new Option("a", "all", false,
        "Index all products from the File Manager");
    Option product = OptionBuilder.withArgName("productId").hasArg()
        .withDescription("Index the product from the File Manager")
        .withLongOpt("product").create("p");
    Option met = OptionBuilder.withArgName("file").hasArg().withDescription(
        "Index the product from a metadata file").withLongOpt("metFile")
        .create("mf");
    Option read = new Option("r", "read", false,
        "Index all products based on a list of product identifiers passed in");
    Option types = new Option("t", "types", false,
        "Index all product types from the File Manager");
    Option deleteAll = new Option("da", "deleteAll", false,
        "Delete all products/types from the Solr index");

    group.addOption(all);
    group.addOption(product);
    group.addOption(met);
    group.addOption(read);
    group.addOption(types);
    group.addOption(deleteAll);
    options.addOptionGroup(group);

    return options;
  }

  /**
   * The main method. Execution without argument displays help message.
   *
   * @param args
   *          Command-line arguments.
   */
  public static void main(String[] args) throws Exception {
    Options options = SolrIndexer.buildCommandLine();
    CommandLineParser parser = new GnuParser();
    CommandLine line = null;

    try {
      line = parser.parse(options, args);
    } catch (ParseException e) {
      LOG.severe("Could not parse command line: " + e.getMessage());
    }

    if (line == null || line.hasOption("help") || line.getOptions().length == 0) {
      HelpFormatter formatter = new HelpFormatter();
      formatter.printHelp("java " + SolrIndexer.class.getName(), options);
    } else if (line.hasOption("all") || line.hasOption("product")
        || line.hasOption("metFile") || line.hasOption("read")
        || line.hasOption("types") || line.hasOption("deleteAll")) {
      SolrIndexer indexer = null;
      String solrUrl = null;
      String fmUrl = null;
      if (line.hasOption("solrUrl")) {
        solrUrl = line.getOptionValue("solrUrl");
      }
      if (line.hasOption("fmUrl")) {
        fmUrl = line.getOptionValue("fmUrl");
      }
      try {
        indexer = new SolrIndexer(solrUrl, fmUrl);
        if (line.hasOption("all")) {
          indexer.indexAll(line.hasOption("delete"));
        } else if (line.hasOption("product")) {
          indexer.indexProduct(line.getOptionValue("product"));
        } else if (line.hasOption("metFile")) {
          indexer.indexMetFile(new File(line.getOptionValue("metFile")), line
              .hasOption("delete"));
        } else if (line.hasOption("read")) {
          for (String productId : readProductIdsFromStdin()) {
            indexer.indexProduct(productId);
          }
        } else if (line.hasOption("types")) {
          indexer.indexProductTypes(line.hasOption("delete"));
        } else if (line.hasOption("deleteAll")) {
          indexer.delete();
        } else {
          LOG.severe("Option not supported.");
        }
        indexer.commit();
        if (line.hasOption("optimize")) {
          indexer.optimize();
        }
      } catch (Exception e) {
        LOG.severe("An error occurred indexing: " + e.getMessage());
        LOG
            .severe("If the above message is related to accessing the Solr instance, see the Application Server's log for additional information.");
      }
    }
  }

  /**
   * This method reads product identifiers from the standard input.
   *
   * @return Returns a List of product identifiers.
   */
  private static List<String> readProductIdsFromStdin() {
    List<String> productIds = new ArrayList<String>();
    BufferedReader br = null;

    br = new BufferedReader(new InputStreamReader(System.in));
    String line = null;

    try {
      while ((line = br.readLine()) != null) {
        productIds.add(line);
      }
    } catch (IOException e) {
      LOG.severe("Error reading product id: line: [" + line + "]: Message: "
          + e.getMessage());
    } finally {
      if (br != null) {
        try {
          br.close();
        } catch (Exception ignore) {
        }
        br = null;
      }
    }
    return productIds;
  }

  /**
   * This class manages the Indexer configuration.
   */
  public class IndexerConfig {
    private final static String PREFIX_CONFIG = "config.";
    private final static String PREFIX_MET = "map.";
    private final static String PREFIX_FORMAT = "format.";
    private final static String IGNORE_TYPES = "ignore.types";
    private final static String IGNORE_VALUES = "ignore.values";
    private final static String REPLACEMENT_KEYS = "replacement.keys";
    // Used to hold general properties for indexer configuration
    private Properties properties = new Properties();
    // Used to hold mappings for filemanager -> solr for keys
    private Properties mapProperties = new Properties();
    // Used to define the date format for a field
    private Properties formatProperties = new Properties();
    private List<String> ignoreTypes = new ArrayList<String>();
    private List<String> ignoreValues = new ArrayList<String>();
    private List<String> replacementKeys = new ArrayList<String>();

    public IndexerConfig(InputStream inputStream) throws IOException {
      Properties props = new Properties();
      props.load(inputStream);
      for (Object objKey : props.keySet()) {
        String key = (String) objKey;
        if (key.startsWith(PREFIX_CONFIG)) {
          properties.put(key.substring(PREFIX_CONFIG.length()), props
              .getProperty(key));
        } else if (key.startsWith(PREFIX_MET)) {
          mapProperties.put(key.substring(PREFIX_MET.length()), props
              .getProperty(key));
        } else if (key.startsWith(PREFIX_FORMAT)) {
          formatProperties.put(key.substring(PREFIX_FORMAT.length()), props
              .getProperty(key));
        }
      }

      if (properties.getProperty(IGNORE_TYPES) != null) {
        String[] values = properties.getProperty(IGNORE_TYPES).trim()
            .split(",");
        for (String value : values) {
          ignoreTypes.add(value);
        }
      }

      if (properties.getProperty(IGNORE_VALUES) != null) {
        String[] values = properties.getProperty(IGNORE_VALUES).trim().split(
            ",");
        for (String value : values) {
          ignoreValues.add(value);
        }
      }

      if (properties.getProperty(REPLACEMENT_KEYS) != null) {
        String[] values = properties.getProperty(REPLACEMENT_KEYS).trim()
            .split(",");
        for (String value : values) {
          replacementKeys.add(value);
        }
      }
    }

    public String getProperty(String key) {
      return properties.getProperty(key);
    }

    public String getProperty(String key, String defaultValue) {
      return properties.getProperty(key, defaultValue);
    }

    public Properties getMapProperties() {
      return mapProperties;
    }

    public Properties getFormatProperties() {
      return formatProperties;
    }

    public List<String> getIgnoreTypes() {
      return this.ignoreTypes;
    }

    public List<String> getIgnoreValues() {
      return this.ignoreValues;
    }

    public List<String> getReplacementKeys() {
      return this.replacementKeys;
    }
  }

}
TOP

Related Classes of org.apache.oodt.cas.filemgr.tools.SolrIndexer$IndexerConfig

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.