edu.harvard.med.lincs.screensaver.io.libraries.ReagentAttachmentImporter.java Source code

Java tutorial

Introduction

Here is the source code for edu.harvard.med.lincs.screensaver.io.libraries.ReagentAttachmentImporter.java

Source

// $HeadURL$
// $Id$
//
// Copyright  2010 by the President and Fellows of Harvard College.
//
// Screensaver is an open-source project developed by the ICCB-L and NSRB labs
// at Harvard Medical School. This software is distributed under the terms of
// the GNU General Public License.

package edu.harvard.med.lincs.screensaver.io.libraries;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Set;

import com.google.common.collect.Sets;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.ParseException;
import org.apache.log4j.Logger;

import edu.harvard.med.screensaver.db.DAOTransaction;
import edu.harvard.med.screensaver.db.DAOTransactionRollbackException;
import edu.harvard.med.screensaver.db.GenericEntityDAO;
import edu.harvard.med.screensaver.db.LibrariesDAO;
import edu.harvard.med.screensaver.io.CommandLineApplication;
import edu.harvard.med.screensaver.model.AttachedFile;
import edu.harvard.med.screensaver.model.libraries.ReagentAttachedFileType;
import edu.harvard.med.screensaver.model.libraries.SmallMoleculeReagent;

/**
 * LINCS-only import attachments for reagents
 * 
 * @author sde4
 */
public class ReagentAttachmentImporter extends CommandLineApplication {
    private static Logger log = Logger.getLogger(ReagentAttachmentImporter.class);

    public static final int SHORT_OPTION_INDEX = 0;
    public static final int ARG_INDEX = 1;
    public static final int LONG_OPTION_INDEX = 2;
    public static final int DESCRIPTION_INDEX = 3;
    public static final String[] OPTION_INPUT_FILE = { "f", "file", "input-file",
            "Input file, to be converted to an sdf file (molfile not supported at this time)" };
    public static final String[] OPTION_INPUT_FACILITY_ID = { "i", "facilityId", "facility-id",
            "facility id of the reagent to import the attachement for" };
    public static final String[] OPTION_INPUT_SALT_ID = { "sid", "salt-id", "salt-id",
            "salt id the reagent to import the attachement for" };
    public static final String[] OPTION_INPUT_BATCH_ID = { "bid", "batch-id", "batch-id",
            "batch id of the reagent to import the attachement for" };

    public static final Set attachmentTypes = Sets
            .newHashSet(new String[] { "QC-NMR", "QC-LCMS", "QC-HPLC", "Data-File" });

    public static final String[] OPTION_INPUT_QC_ATTACMENT_TYPE = { "type", "qc-type", "qc-type",
            "QC attachment type, one of: " + attachmentTypes };

    @SuppressWarnings("static-access")
    public ReagentAttachmentImporter(String[] cmdLineArgs) {
        super(cmdLineArgs);

        String[] option = OPTION_INPUT_FILE;
        addCommandLineOption(OptionBuilder.hasArg().isRequired().withArgName(option[ARG_INDEX])
                .withDescription(option[DESCRIPTION_INDEX]).withLongOpt(option[LONG_OPTION_INDEX])
                .create(option[SHORT_OPTION_INDEX]));
        option = OPTION_INPUT_FACILITY_ID;
        addCommandLineOption(OptionBuilder.hasArg().isRequired().withArgName(option[ARG_INDEX])
                .withDescription(option[DESCRIPTION_INDEX]).withLongOpt(option[LONG_OPTION_INDEX])
                .create(option[SHORT_OPTION_INDEX]));
        option = OPTION_INPUT_SALT_ID;
        addCommandLineOption(OptionBuilder.hasArg().isRequired().withArgName(option[ARG_INDEX])
                .withDescription(option[DESCRIPTION_INDEX]).withLongOpt(option[LONG_OPTION_INDEX])
                .create(option[SHORT_OPTION_INDEX]));
        option = OPTION_INPUT_BATCH_ID;
        addCommandLineOption(OptionBuilder.hasArg().isRequired().withArgName(option[ARG_INDEX])
                .withDescription(option[DESCRIPTION_INDEX]).withLongOpt(option[LONG_OPTION_INDEX])
                .create(option[SHORT_OPTION_INDEX]));
        option = OPTION_INPUT_QC_ATTACMENT_TYPE;
        addCommandLineOption(OptionBuilder.hasArg().isRequired().withArgName(option[ARG_INDEX])
                .withDescription(option[DESCRIPTION_INDEX]).withLongOpt(option[LONG_OPTION_INDEX])
                .create(option[SHORT_OPTION_INDEX]));
    }

    @SuppressWarnings("static-access")
    public static void main(String[] args) {
        final ReagentAttachmentImporter app = new ReagentAttachmentImporter(args);

        app.processOptions(/* acceptDatabaseOptions= */false, /* acceptAdminUserOptions= */false);

        try {
            execute(app);
        } catch (Exception e) {
            log.error("application exception", e);
            System.exit(1);
        }
    }

    private static void execute(final ReagentAttachmentImporter app) {
        final GenericEntityDAO dao = (GenericEntityDAO) app.getSpringBean("genericEntityDao");
        final LibrariesDAO librariesDao = (LibrariesDAO) app.getSpringBean("librariesDao");

        dao.doInTransaction(new DAOTransaction() {

            @Override
            public void runTransaction() {
                String fileName = app.getCommandLineOptionValue(OPTION_INPUT_FILE[SHORT_OPTION_INDEX]);
                String facilityId = app.getCommandLineOptionValue(OPTION_INPUT_FACILITY_ID[SHORT_OPTION_INDEX]);
                Integer saltId = app.getCommandLineOptionValue(OPTION_INPUT_SALT_ID[SHORT_OPTION_INDEX],
                        Integer.class);
                Integer batchId = app.getCommandLineOptionValue(OPTION_INPUT_BATCH_ID[SHORT_OPTION_INDEX],
                        Integer.class);
                String attachmentType = app.getCommandLineOptionValue(
                        OPTION_INPUT_QC_ATTACMENT_TYPE[SHORT_OPTION_INDEX], String.class);

                if (!attachmentTypes.contains(attachmentType)) {
                    log.error(
                            "unknown attachment type: " + attachmentType + ", must be one of: " + attachmentTypes);
                    System.exit(1);
                }

                File file = new File(fileName);
                if (!file.exists()) {
                    log.error("file does not exist: " + fileName);
                    System.exit(1);
                }
                Set<SmallMoleculeReagent> reagents = librariesDao.findReagents(facilityId, saltId, batchId, true);

                if (reagents.isEmpty()) {
                    log.error("no reagents found!");
                    System.exit(1);
                }

                ReagentAttachedFileType attachedFileType = dao.findEntityByProperty(ReagentAttachedFileType.class,
                        "value", attachmentType);

                if (attachedFileType == null) {
                    log.error("Could not find the attached file type: " + attachmentType
                            + ", make sure that this value has been created in the database table.");
                    System.exit(1);
                }

                for (SmallMoleculeReagent reagent : reagents) {
                    try {
                        AttachedFile attachedFile1 = reagent.createAttachedFile(file.getName(), attachedFileType,
                                null, new FileInputStream(fileName));
                        dao.saveOrUpdateEntity(attachedFile1);
                        dao.saveOrUpdateEntity(reagent);
                    } catch (IOException e) {
                        throw new DAOTransactionRollbackException("File not found: " + fileName, e);
                    }
                }

                log.info("saved attachment for reagent(s): ");
                for (SmallMoleculeReagent reagent : reagents) {
                    log.info("\tattached to:" + reagent.getWell().getWellKey() + ": "
                            + reagent.getWell().getFacilityId() + "-" + reagent.getSaltFormId() + "-"
                            + reagent.getFacilityBatchId());
                }
            }
        });
    }
}