fr.sanofi.fcl4transmart.controllers.listeners.clinicalData.SelectCMFListener.java Source code

Java tutorial

Introduction

Here is the source code for fr.sanofi.fcl4transmart.controllers.listeners.clinicalData.SelectCMFListener.java

Source

/*******************************************************************************
 * Copyright (c) 2012 Sanofi-Aventis Recherche et Dveloppement.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Public License v3.0
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/gpl.html
 * 
 * Contributors:
 *    Sanofi-Aventis Recherche et Dveloppement - initial API and implementation
 ******************************************************************************/
package fr.sanofi.fcl4transmart.controllers.listeners.clinicalData;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;

import fr.sanofi.fcl4transmart.model.classes.dataType.ClinicalData;
import fr.sanofi.fcl4transmart.model.classes.workUI.clinicalData.SelectCMFUI;
import fr.sanofi.fcl4transmart.model.interfaces.DataTypeItf;
import fr.sanofi.fcl4transmart.ui.parts.UsedFilesPart;
import fr.sanofi.fcl4transmart.ui.parts.WorkPart;

import org.apache.commons.io.FileUtils;

public class SelectCMFListener implements Listener {
    private SelectCMFUI selectCMFUI;
    private DataTypeItf dataType;

    public SelectCMFListener(SelectCMFUI selectCMFUI, DataTypeItf dataType) {
        this.selectCMFUI = selectCMFUI;
        this.dataType = dataType;
    }

    @Override
    public void handleEvent(Event event) {
        // TODO Auto-generated method stub
        String path = this.selectCMFUI.getPath();
        if (path == null)
            return;
        if (path.contains("%")) {
            this.selectCMFUI.displayMessage("File name can not contain percent ('%') symbol.");
            return;
        }
        File file = new File(path);
        if (file.exists()) {
            if (file.isFile()) {
                if (!this.checkFormat(file))
                    return;
                String newPath;
                if (file.getName().endsWith(".columns")) {
                    newPath = this.dataType.getPath().getAbsolutePath() + File.separator + file.getName();
                } else {
                    newPath = this.dataType.getPath().getAbsolutePath() + File.separator + file.getName()
                            + ".columns";
                }

                File copiedFile = new File(newPath);
                try {
                    FileUtils.copyFile(file, copiedFile);
                    ((ClinicalData) this.dataType).setCMF(copiedFile);

                    this.selectCMFUI.displayMessage("File has been added");
                    WorkPart.updateSteps();
                    //to do: update files list
                    UsedFilesPart.sendFilesChanged(dataType);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    this.selectCMFUI.displayMessage("File error: " + e.getLocalizedMessage());
                    e.printStackTrace();
                }
            } else {
                this.selectCMFUI.displayMessage("This is a directory");
            }
        } else {
            this.selectCMFUI.displayMessage("This path does no exist");
        }
    }

    public boolean checkFormat(File file) {
        boolean isSubjectIdSet = false;
        try {
            BufferedReader br = new BufferedReader(new FileReader(file));
            String line = br.readLine();
            while ((line = br.readLine()) != null) {
                if (line.compareTo("") != 0) {
                    String[] fields = line.split("\t", -1);
                    //check columns number
                    if (fields.length != 6) {
                        this.selectCMFUI.displayMessage("Error:\nLines have not the right number of columns");
                        br.close();
                        return false;
                    }
                    //check raw file names
                    if (!((ClinicalData) this.dataType).getRawFilesNames().contains(fields[0])) {
                        this.selectCMFUI.displayMessage("Error:\nData file '" + fields[0] + "' does not exist");
                        br.close();
                        return false;
                    }
                    //check that subject identifier is set
                    if (fields[3].compareTo("SUBJ_ID") == 0) {
                        isSubjectIdSet = true;
                    }
                    //check that column number is set and is a number
                    if (fields[2].compareTo("") == 0) {
                        this.selectCMFUI.displayMessage("Error:\nColumns numbers have to be set");
                        br.close();
                        return false;
                    }
                    try {
                        Integer.parseInt(fields[2]);
                    } catch (NumberFormatException e) {
                        this.selectCMFUI.displayMessage("Error:\nColumns numbers have to be numbers");
                        br.close();
                        return false;
                    }
                    //check that datalabel is set
                    if (fields[3].compareTo("") == 0) {
                        this.selectCMFUI.displayMessage("Error:\nData labels have to be set");
                        br.close();
                        return false;
                    }
                    //check that category code is set, except for reserved words
                    if (!(fields[3].compareTo("SUBJ_ID") == 0 || fields[3].compareTo("OMIT") == 0
                            || fields[3].compareTo("SITE_ID") == 0 || fields[3].compareTo("VISIT_NAME") == 0)
                            && fields[1].compareTo("") == 0) {
                        this.selectCMFUI.displayMessage("Error:\nCategory codes have to be set");
                        br.close();
                        return false;
                    }
                    //check that data label source is set if the data label is '\'
                    if (fields[3].compareTo("\\") == 0 && fields[4].compareTo("") == 0) {
                        this.selectCMFUI.displayMessage("Error:\nData label sources have to be set");
                        br.close();
                        return false;
                    }
                }
            }
            br.close();
        } catch (Exception e) {
            this.selectCMFUI.displayMessage("File error: " + e.getLocalizedMessage());
            e.printStackTrace();
            return false;
        }
        if (!isSubjectIdSet) {
            this.selectCMFUI.displayMessage("Error:\nSubject identifiers have to be set");
            return false;
        }
        return true;
    }
}