All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.ontopia.topicmaps.db2tm.Execute Maven / Gradle / Ivy

The newest version!
/*
 * #!
 * Ontopia DB2TM
 * #-
 * Copyright (C) 2001 - 2013 The Ontopia Project
 * #-
 * 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 net.ontopia.topicmaps.db2tm;

import java.io.File;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import net.ontopia.infoset.core.LocatorIF;
import net.ontopia.infoset.impl.basic.URILocator;
import net.ontopia.topicmaps.core.TopicMapIF;
import net.ontopia.topicmaps.core.TopicMapReaderIF;
import net.ontopia.topicmaps.core.TopicMapStoreIF;
import net.ontopia.topicmaps.core.TopicMapWriterIF;
import net.ontopia.topicmaps.impl.basic.InMemoryTopicMapStore;
import net.ontopia.topicmaps.impl.rdbms.RDBMSTopicMapStore;
import net.ontopia.topicmaps.utils.ImportExportUtils;
import net.ontopia.utils.CmdlineOptions;
import net.ontopia.utils.CmdlineUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * INTERNAL: Command-line driver for DB2TM.
 */
public class Execute {
  
  // --- define a logging category.
  private static Logger log = LoggerFactory.getLogger(Execute.class);

  Execute() {
  }
  
  public static void main(String[] argv) throws Exception {

    // Initialize logging
    CmdlineUtils.initializeLogging();
      
    // Register logging options
    CmdlineOptions options = new CmdlineOptions("Execute", argv);
    CmdlineUtils.registerLoggingOptions(options);
    OptionsListener ohandler = new OptionsListener();
    options.addLong(ohandler, "tm", 't', true);
    options.addLong(ohandler, "baseuri", 'b', true);
    options.addLong(ohandler, "out", 'o', true);
    options.addLong(ohandler, "relations", 'r', true);
    options.addLong(ohandler, "force-rescan", 'f', true);
      
    // Parse command line options
    try {
      options.parse();
    } catch (CmdlineOptions.OptionsException e) {
      System.err.println("Error: " + e.getMessage());
      System.exit(1);      
    }

    // Get command line arguments
    String[] args = options.getArguments();

    if (args.length < 2) {
      usage();
      System.exit(3);
    }

    // Arguments
    String operation = args[0];
    String cfgfile = args[1];

    if (!"add".equals(operation) &&
        !"sync".equals(operation) &&
        !"remove".equals(operation)) {
      usage();
      System.err.println("Operation '" + operation + "' not supported.");
      System.exit(3);
    }

    try {
      // Read mapping file
      log.debug("Reading relation mapping file {}", cfgfile);
      RelationMapping mapping = RelationMapping.read(new File(cfgfile));
      
      // open topic map
      String tmurl = ohandler.tm;    
      log.debug("Opening topic map {}", tmurl);
      TopicMapIF topicmap;
      if (tmurl == null || "tm:in-memory:new".equals(tmurl)) {
        topicmap = new InMemoryTopicMapStore().getTopicMap();
      } else if ("tm:rdbms:new".equals(tmurl)) {
        topicmap = new RDBMSTopicMapStore().getTopicMap();
      } else {
        TopicMapReaderIF reader = ImportExportUtils.getReader(tmurl);
        topicmap = reader.read();
      }
      TopicMapStoreIF store = topicmap.getStore();

      // base locator
      String outfile = ohandler.out;
      LocatorIF baseloc = (outfile == null ? store.getBaseAddress() : new URILocator(new File(outfile)));
      if (baseloc == null && tmurl != null) {
        baseloc = (ohandler.baseuri == null ? new URILocator(tmurl) : new URILocator(ohandler.baseuri));
      }

      // figure out which relations to actually process
      Collection relations = null;
      if (ohandler.relations != null) {
        String[] relnames = StringUtils.split(ohandler.relations, ",");
        if (relnames.length > 0) {
          relations = new HashSet(relnames.length);
          relations.addAll(Arrays.asList(relnames));
        }
      }
      
      try {
        // Process data sources in mapping
        if ("add".equals(operation)) {
          Processor.addRelations(mapping, relations, topicmap, baseloc);
        } else if ("sync".equals(operation)) {
          boolean rescan = ohandler.forceRescan != null && Boolean.valueOf(ohandler.forceRescan).booleanValue();
          Processor.synchronizeRelations(mapping, relations, topicmap, baseloc, rescan);
        } else if ("remove".equals(operation)) {
          Processor.removeRelations(mapping, relations, topicmap, baseloc);
        } else {
          throw new UnsupportedOperationException("Unsupported operation: " + operation);
        }

        // export topicmap
        if (outfile != null) {
          log.debug("Exporting topic map to {}", outfile);
          TopicMapWriterIF writer = ImportExportUtils.getWriter(new File(outfile));
          writer.write(topicmap);
        }
        
        // commit transaction
        store.commit();
        log.debug("Transaction committed.");
      } catch (Exception t) {
        log.error("Error occurred while running operation '" + operation + "'", t);
        // abort transaction
        store.abort();
        log.debug("Transaction aborted.");
        throw t;
      } finally {
        if (store.isOpen()) {
          store.close();
        }
      }
      
    } catch (Exception e) {
      Throwable cause = e.getCause();
      if (cause instanceof DB2TMException) {
        System.err.println("Error: " + e.getMessage());
      } else {
        throw e;
      }
    }
  }
  
  private static void usage() {
    System.out.println("java net.ontopia.topicmaps.db2tm.Execute [options] (add|sync|remove) ");
    System.out.println("");
    System.out.println("  Runs a DB2TM process.");
    System.out.println("");
    System.out.println("  Options:");
    CmdlineUtils.printLoggingOptionsUsage(System.out);
    System.out.println("    --tm=: the topic map to update");
    System.out.println("    --baseuri=: the topic map base uri");
    System.out.println("    --out=: the resulting topic map file (optional)");
    System.out.println("    --relations=: list of the relations to actually process");
    System.out.println("    --force-rescan=: forces rescan instead of changelog on relations");
    System.out.println("");
    System.out.println("  (add|sync|remove): operation to perform");
    System.out.println("  : the configuration file to use");
    System.out.println("");
    System.out.println("  NOTE: to refer to RDBMS topic maps use:");
    System.out.println("    x-ontopia:tm-rdbms:");
  }

  private static class OptionsListener implements CmdlineOptions.ListenerIF {
    private String tm;
    private String baseuri;
    private String out;
    private String relations;
    private String forceRescan;
    @Override
    public void processOption(char option, String value) {
      if (option == 't') {
        tm = value;
      } else if (option == 'b') {
        baseuri = value;
      } else if (option == 'o') {
        out = value;
      } else if (option == 'r') {
        relations = value;
      } else if (option == 'f') {
        forceRescan = value;
      }
    }
  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy