/**
* Copyright 2014 IHTSDO
* 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 org.ihtsdo.otf.snomed.loader;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.UnrecognizedOptionException;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.thinkaurelius.titan.core.TitanFactory;
import com.thinkaurelius.titan.core.TitanGraph;
/**
*Loads SNOMED data in graph db.
*Initially it just load rf2 in graph. But it is intended to
*load RF1, RF2 format as well as delta releases. Once this is done
*this note can be removed
*/
public class GraphLoader {
private static final Logger LOGGER = LoggerFactory.getLogger(GraphLoader.class);
private static final String USAGE = "\n Usages are \n" + DefaultParser.options.toString();
public static void main(String[] args) throws ParseException {
DefaultParser p = new DefaultParser();
CommandLine cli = null;
try {
cli = p.parse(DefaultParser.options, args);
} catch (UnrecognizedOptionException e) {
System.out.println(USAGE);
}
String dbConfig = cli.getOptionValue("config");
validate(dbConfig, "Titan db configuration is required to initialize database");
String type = cli.getOptionValue("type");
validateType(type, "Data load type is required. Specify either SNAPSHOT or FULL or RDF or DELTA");
//validate file format and type
//validateFiles(cli, "No data file specified");
TitanGraph g = null;
try {
g = openGraph(dbConfig);
if (g == null) {
throw new IllegalArgumentException("Could not get graph instance");
}
switch (LoadType.valueOf(type)) {
case snapshot:
Rf2SnapshotLoader loader = new Rf2SnapshotLoader(g);
if (!StringUtils.isBlank(cli.getOptionValue("bSize"))) {
loader.setBufferSize(Integer.parseInt(cli.getOptionValue("bSize")));
}
if (!StringUtils.isBlank(cli.getOptionValue("reload"))) {
loader.setReload(Boolean.parseBoolean(cli.getOptionValue("reload")));
}
FileType[] fTypes = FileType.values();
for (int i = 0; i < fTypes.length; i++) {
if (!fTypes[i].equals(FileType.nt)) {
FileType fType = fTypes[i];
LOGGER.info("Loading file type {}", fType.toString());
String file = cli.getOptionValue(fType.toString());
LOGGER.info("Loading file {}", file);
if (!StringUtils.isBlank(file)) {
loader.load(file);
}
}
}
break;
case audit:
Rf2SnapshotAuditor auditor = new Rf2SnapshotAuditor(g);
if (!StringUtils.isBlank(cli.getOptionValue("bSize"))) {
auditor.setBufferSize(Integer.parseInt(cli.getOptionValue("bSize")));
}
if (!StringUtils.isBlank(cli.getOptionValue("reload"))) {
auditor.setReload(Boolean.parseBoolean(cli.getOptionValue("reload")));
}
FileType[] afTypes = FileType.values();
for (int i = 0; i < afTypes.length; i++) {
if (!afTypes[i].equals(FileType.nt)) {
FileType fType = afTypes[i];
LOGGER.info("Auditing file type {}", fType.toString());
String file = cli.getOptionValue(fType.toString());
LOGGER.info("Auditing file {}", file);
if (!StringUtils.isBlank(file)) {
auditor.setSubType(cli.getOptionValue("subType"));
auditor.audit(file);
}
}
}
break;
default:
LOGGER.info("Nothing to load");
break;
}
LOGGER.info("Finished loading");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (g != null) {
g.shutdown();
}
}
}
/**
* @param type
* @param string
*/
private static void validateType(String type, String message) {
validate(type, message);
if (!type.equalsIgnoreCase(LoadType.snapshot.toString()) && !type.equalsIgnoreCase(LoadType.audit.toString())) {
message = type + " data load is not supported yet";
throw new UnsupportedOperationException(message + USAGE);
}
}
private static TitanGraph openGraph(String dbConfig) {
return TitanFactory.open(dbConfig);
}
private static void validate(String input, String message) {
if (StringUtils.isBlank(input)) {
message = StringUtils.isBlank(message) ? "Some of the required input missing" : message;
throw new IllegalArgumentException(message + USAGE);
}
}
}