/******************************************************************************* * Copyright 2013 EMBL-EBI * * 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.sf.cram; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Map; import java.util.TreeMap; import com.beust.jcommander.IStringConverter; import com.beust.jcommander.JCommander; import com.beust.jcommander.Parameter; import com.beust.jcommander.Parameters; import htsjdk.samtools.ValidationStringency; import htsjdk.samtools.util.Log; import net.sf.cram.common.Utils; import net.sf.cram.index.CramIndexer; public class CramTools { private static Log log = Log.getInstance(CramTools.class); private static Map<String, Class<?>> classes = new TreeMap<String, Class<?>>(); private static Field findStaticField(String name, Class<?> klass) { Field[] declaredFields = klass.getDeclaredFields(); Field field = null; for (Field f : declaredFields) { if (java.lang.reflect.Modifier.isStatic(f.getModifiers()) && f.getName().equals(name)) { field = f; break; } } return field; } private static Method findStaticMainMethod(Class<?> klass) { Method[] declaredFields = klass.getDeclaredMethods(); Method mainMethod = null; for (Method m : declaredFields) { if (java.lang.reflect.Modifier.isStatic(m.getModifiers()) && m.getName().equals("main")) { mainMethod = m; break; } } return mainMethod; } private static Class<?> findParamsClass(Class<?> klass) { Class<?> paramsClass = null; for (Class<?> subClass : klass.getDeclaredClasses()) { if ("Params".equals(subClass.getSimpleName())) { paramsClass = subClass; break; } } return paramsClass; } private static void addProgram(JCommander jc, Class<?> klass) throws ClassNotFoundException, InstantiationException, IllegalAccessException { Class<?> paramsClass = findParamsClass(klass); Object instance = paramsClass.newInstance(); Field commandField = findStaticField("COMMAND", klass); String command = commandField.get(null).toString(); jc.addCommand(command, instance); classes.put(command, klass); } private static void invoke(String command, String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { Method mainMethod = findStaticMainMethod(classes.get(command)); mainMethod.invoke(null, (Object) args); } public static void main(String[] args) throws Exception { Params params = new Params(); JCommander jc = new JCommander(params); jc.setProgramName("cramtools"); addProgram(jc, Cram2Bam.class); addProgram(jc, Bam2Cram.class); addProgram(jc, CramIndexer.class); addProgram(jc, Merge.class); addProgram(jc, Cram2Fastq.class); addProgram(jc, CramFixHeader.class); addProgram(jc, DownloadReferences.class); addProgram(jc, QualityScoreStats.class); jc.parse(args); String command = jc.getParsedCommand(); if (command == null || params.help) { Utils.printUsage(jc); return; } String[] commandArgs = new String[args.length - 1]; System.arraycopy(args, 1, commandArgs, 0, commandArgs.length); invoke(command, commandArgs); } @Parameters(commandDescription = "CRAM tools. ") private static class Params { @Parameter(names = { "-h", "--help" }, description = "Print help and quit") private boolean help = false; } public static class LevelConverter implements IStringConverter<Log.LogLevel> { @Override public Log.LogLevel convert(String s) { return Log.LogLevel.valueOf(s.toUpperCase()); } } public static class ValidationStringencyConverter implements IStringConverter<ValidationStringency> { @Override public ValidationStringency convert(String s) { return ValidationStringency.valueOf(s.toUpperCase()); } } }