org.obiba.opal.shell.web.ExportCommandOptionsDtoImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.obiba.opal.shell.web.ExportCommandOptionsDtoImpl.java

Source

/*
 * Copyright (c) 2013 OBiBa. All rights reserved.
 *
 * This program and the accompanying materials
 * are made available under the terms of the GNU Public License v3.0.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.obiba.opal.shell.web;

import java.util.List;

import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystemException;
import org.apache.commons.vfs2.FileType;
import org.obiba.opal.core.runtime.OpalRuntime;
import org.obiba.opal.shell.commands.options.CopyCommandOptions;
import org.obiba.opal.web.model.Commands;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.base.Strings;

/**
 * Implementation of {@link org.obiba.opal.shell.commands.options.CopyCommandOptions} based on an instance of {@link org.obiba.opal.web.model.Commands.CopyCommandOptionsDto}.
 */
public class ExportCommandOptionsDtoImpl implements CopyCommandOptions {
    //
    // Constants
    //

    private static final Logger log = LoggerFactory.getLogger(ExportCommandOptionsDtoImpl.class);

    //
    // Instance Variables
    //

    protected final Commands.ExportCommandOptionsDto dto;

    private final OpalRuntime opalRuntime;

    private String pathWithExtension;

    //
    // Constructors
    //

    public ExportCommandOptionsDtoImpl(OpalRuntime opalRuntime, Commands.ExportCommandOptionsDto dto) {
        this.opalRuntime = opalRuntime;
        this.dto = dto;

        if (dto.hasOut() && dto.hasFormat()) {
            pathWithExtension = addFileExtensionIfMissing(dto.getOut(), dto.getFormat());
        }
    }

    //
    // CopyCommandOptions Methods
    //

    @Override
    public boolean isHelp() {
        return false;
    }

    @Override
    public boolean isUnit() {
        return dto.hasIdConfig();
    }

    @Override
    public String getUnit() {
        return dto.getIdConfig().getName();
    }

    @Override
    public boolean isSource() {
        return dto.hasSource();
    }

    @Override
    public String getSource() {
        return dto.getSource();
    }

    @Override
    public boolean isDestination() {
        return dto.hasDestination();
    }

    @Override
    public String getDestination() {
        return dto.getDestination();
    }

    @Override
    public boolean isOut() {
        return dto.hasOut();
    }

    @Override
    public String getOut() {
        return pathWithExtension != null ? pathWithExtension : dto.getOut();
    }

    @Override
    public String getName() {
        return dto.getDestinationTableName();
    }

    @Override
    public boolean isName() {
        return dto.hasDestinationTableName();
    }

    @Override
    public String getQuery() {
        return dto.getQuery();
    }

    @Override
    public boolean isQuery() {
        return dto.hasQuery() && !Strings.isNullOrEmpty(dto.getQuery()) && !"*".equals(dto.getQuery());
    }

    @Override
    public boolean getNonIncremental() {
        return dto.getNonIncremental();
    }

    @Override
    public boolean getNoValues() {
        return dto.getNoValues();
    }

    @Override
    public boolean getNoVariables() {
        return dto.getNoVariables();
    }

    @Override
    public boolean getCopyNullValues() {
        return dto.getCopyNullValues();
    }

    @Override
    public boolean isMultiplex() {
        return false;
    }

    @Override
    public String getMultiplex() {
        return null;
    }

    @Override
    public boolean isTransform() {
        return false;
    }

    @Override
    public String getTransform() {
        return null;
    }

    @Override
    public List<String> getTables() {
        return dto.getTablesList();
    }

    //
    // Methods
    //

    FileObject resolveFileInFileSystem(String path) throws FileSystemException {
        return opalRuntime.getFileSystem().getRoot().resolveFile(path);
    }

    private String addFileExtensionIfMissing(String outputFilePath, String outputFileFormat) {
        String modifiedPath = outputFilePath;

        FileObject file = null;
        try {
            file = resolveFileInFileSystem(outputFilePath);

            // Add the extension if the file object is an existing file (FileType.FILE)
            // or a new file (FileType.IMAGINARY). We assume here that any "imaginary" file object
            // is a non-existent folder.
            if (file.getType() == FileType.FILE) {
                modifiedPath = addExtension(outputFileFormat, outputFilePath);

            } else if (file.getType() == FileType.IMAGINARY) {
                if ("xml".equals(outputFileFormat) && !outputFilePath.endsWith(".zip")) {
                    modifiedPath = addExtension(outputFileFormat, outputFilePath);
                } else if ("csv".equals(outputFileFormat)) {
                    // Create the directory
                    file.createFolder();
                }
            }

        } catch (FileSystemException ex) {
            log.error("Unexpected file system exception in addFileExtensionIfMissing", ex);
        }

        return modifiedPath;
    }

    private String addExtension(String outputFileFormat, String outputFilePath) {
        if ("csv".equals(outputFileFormat) && !outputFilePath.endsWith(".csv")) {
            return outputFilePath + ".csv";
        }
        if ("excel".equals(outputFileFormat) && !outputFilePath.endsWith(".xls")
                && !outputFilePath.endsWith(".xlsx")) {
            return outputFilePath + ".xlsx"; // prefer .xlsx over .xls
        }
        if ("xml".equals(outputFileFormat) && !outputFilePath.endsWith(".zip")) {
            return outputFilePath + ".zip";
        }
        return outputFilePath;
    }
}