| /** |
| * 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; |
| } |
| } |
| |
| } |