au.gov.ansto.bragg.quokka.ui.internal.DataSourceView.java Source code

Java tutorial

Introduction

Here is the source code for au.gov.ansto.bragg.quokka.ui.internal.DataSourceView.java

Source

/*******************************************************************************
 * Copyright (c) 2007 Australian Nuclear Science and Technology Organisation.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Norman Xiong (Bragg Institute) - initial API and implementation
 *******************************************************************************/
package au.gov.ansto.bragg.quokka.ui.internal;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URI;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import org.gumtree.core.object.ObjectConfigException;
import org.gumtree.core.service.ServiceUtils;
import org.gumtree.service.directory.IDirectoryService;
import org.gumtree.ui.util.SafeUIRunner;
import org.gumtree.util.messaging.EventHandler;
import org.osgi.service.event.Event;

import au.gov.ansto.bragg.datastructures.util.ConverterLib;
import au.gov.ansto.bragg.kakadu.core.AlgorithmTask;
import au.gov.ansto.bragg.kakadu.core.DataSourceManager;
import au.gov.ansto.bragg.kakadu.core.data.DataItem;
import au.gov.ansto.bragg.kakadu.core.data.DataSourceFile;
import au.gov.ansto.bragg.kakadu.core.data.Operation;
import au.gov.ansto.bragg.kakadu.ui.ProjectManager;
import au.gov.ansto.bragg.kakadu.ui.util.Util;
import au.gov.ansto.bragg.process.agent.ProcessorAgent;
import au.gov.ansto.bragg.process.port.Tuner;
import au.gov.ansto.bragg.process.port.TunerPortListener;
import au.gov.ansto.bragg.quokka.dra.online.util.ScatteringResult;
import au.gov.ansto.bragg.quokka.experiment.report.ExperimentUserReport;
import au.gov.ansto.bragg.quokka.experiment.report.ExperimentUserReportUtils;
import au.gov.ansto.bragg.quokka.experiment.report.SampleResult;

public class DataSourceView extends ViewPart {

    public static final String TRANSMISSION_OPERATOR_NAME = "transmission.op";
    public static final String TRANSMISSIONURI_TUNER_NAME = "frame.txSampleUri";
    public static final String MASTERREPORT_TUNER_NAME = "frame.masterReport.uri";
    public static final String EMPTY_CELL_TRANSMISSION_URI_TUNER_NAME = "frame.txEmptyUri";
    public static final String EMPTY_CELL_SCATTERING_RI_TUNER_NAME = "frame.scatterEmptyUri";
    public static final String BACKGROUND_SCATTERING_URI_TUNER_NAME = "frame.scatterBackgroundUri";
    public static final String BEAM_CENTER_TUNER_NAME = "frame.centroidUri";
    public static final String EFFICIENCY_OPERATOR_NAME = "efficiency.op";
    public static final String SENSITIVITY_URI_TUNER_NAME = "frame.efficiency.mapUri";
    public static final String SCALER_OPERATOR_NAME = "scaler.op";
    public static final String DIRECT_EMPTY_BEAM_TRANSMISSION_URI_TUNER_NAME = "frame.txDirectUri";

    private QuokkaDataSourceComposite dataSourceComposite;
    private EventHandler eventHandler;
    private SelectionListener dataSelectionListener;
    private List<ExperimentUserReport> modelList = new ArrayList<ExperimentUserReport>();
    protected Action loadModelAction;

    //   private ExperimentUserReport modelList;

    public DataSourceView() {
    } //empty constructor

    /**
     * Creates all UI controls for the view.
     */
    public void createPartControl(Composite parent) {
        ProjectManager.init();

        parent.setLayout(new FillLayout());
        dataSourceComposite = new QuokkaDataSourceComposite(parent, SWT.NONE);

        PlatformUI.getWorkbench().getHelpSystem().setHelp(dataSourceComposite,
                "au.gov.ansto.bragg.kakadu.dataSourceView");

        contributeToActionBars();
        initListeners();
    }

    private void initListeners() {
        eventHandler = new EventHandler(IDirectoryService.EVENT_TOPIC_BIND) {
            @Override
            public void handleEvent(Event event) {
                if (!event.getProperty(IDirectoryService.EVENT_PROP_NAME)
                        .equals(ExperimentUserReport.class.getName())) {
                    return;
                }
                Object object = event.getProperty(IDirectoryService.EVENT_PROP_OBJECT);
                if (object instanceof ExperimentUserReport) {
                    if (ProjectManager.getCurrentAlgorithmTask() == null)
                        return;
                    final ExperimentUserReport model = (ExperimentUserReport) object;
                    //               System.out.println(ExperimentResultUtils.getXStream().toXML(model));
                    updateModel(model);
                    //               final String filePath = model.getSensitivityFile();
                    boolean isAnalysisForced = true;
                    SampleResult sampleScattering = ExperimentUserReportUtils.getScatteringForAnalysis(model);
                    if (sampleScattering == null || sampleScattering.getRunId() == null
                            || sampleScattering.getRunId().trim().length() == 0) {
                        sampleScattering = ExperimentUserReportUtils.getScatteringAOL(model);
                        if (sampleScattering == null || sampleScattering.getRunId() == null
                                || sampleScattering.getRunId().trim().length() == 0)
                            return;
                        isAnalysisForced = false;
                    }
                    final SampleResult sample = sampleScattering;
                    final boolean doAnalysisAnyway = isAnalysisForced;
                    System.err.println("**************" + sampleScattering.getRunId());
                    //               Display.getDefault().asyncExec(new Runnable() {
                    SafeUIRunner.asyncExec(new SafeRunnable() {

                        public void run() {
                            ScatteringResult scatteringResult = new ScatteringResult(model, sample);
                            String filePath = scatteringResult.getSampleScatteringFilename();
                            if (filePath == null)
                                return;
                            File file = new File(filePath);
                            if (!file.exists()) {
                                System.err.println("can not find file " + filePath);
                                return;
                            }
                            if (!doAnalysisAnyway
                                    && DataSourceManager.getInstance().getDataSourceFile(filePath) != null) {
                                return;
                            }
                            setAlgorithmParameters(scatteringResult);
                            //                     boolean isFileSelected = DataSourceManager.getSelectedFile() 
                            //                        == DataSourceManager.getInstance().getDataSourceFile(getDataFolder() + "/" + filePath);
                            //                     modelMap.remove(file.getAbsolutePath());
                            dataSourceComposite.removeFile(filePath);
                            dataSourceComposite.addFile(filePath, true, 0);
                            dataSourceComposite.refresh();
                            //                     modelMap.put(file.getAbsolutePath(), model);
                        }
                    });
                }
            }
        };
        eventHandler.activate();

        AlgorithmTask task = ProjectManager.getCurrentAlgorithmTask();
        final Operation transmissionOperation = task.getOperationManager(0)
                .getOperation(TRANSMISSION_OPERATOR_NAME);
        final Tuner masterReportTuner = ((ProcessorAgent) transmissionOperation.getAgent())
                .getTuner(MASTERREPORT_TUNER_NAME);

        dataSelectionListener = new SelectionListener() {

            @Override
            public void widgetSelected(SelectionEvent arg0) {
                Object data = arg0.data;
                if (data instanceof DataSourceFile) {
                    DataSourceFile dataSourceFile = (DataSourceFile) data;
                    String filename = dataSourceFile.getLocalName();
                    filename = filename.replace("QKK", "");
                    filename = filename.replace(".nx.hdf", "").trim();
                    for (ExperimentUserReport model : modelList) {
                        SampleResult sampleScattering = ExperimentUserReportUtils.getSampleScatteringResult(model,
                                filename);
                        if (sampleScattering != null) {
                            ScatteringResult scatteringResult = new ScatteringResult(model, sampleScattering,
                                    dataSourceFile.getName());
                            try {
                                URI reportUri = (URI) masterReportTuner.getSignal();
                                if (reportUri != null) {
                                    File file = new File(reportUri);
                                    if (file.exists()) {
                                        Object object = null;
                                        try {
                                            InputStream input = new FileInputStream(file);
                                            object = ExperimentUserReportUtils.getXStream().fromXML(input);
                                        } catch (Throwable t) {
                                            throw new ObjectConfigException(
                                                    "Invalid experiment report file: " + filename, t);
                                        }
                                        if (object instanceof ExperimentUserReport) {
                                            final ExperimentUserReport masterModel = (ExperimentUserReport) object;
                                            updateModel(model);
                                            scatteringResult.setMasterReport(masterModel);
                                        }
                                    }
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            setAlgorithmParameters(scatteringResult);
                            return;
                        }
                    }
                    //               ScatteringResult emptyReport = new ScatteringResult();
                    //               setAlgorithmParameters(emptyReport);
                }
            }

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {

            }
        };
        dataSourceComposite.addSelectionChangedListener(dataSelectionListener);

        TunerPortListener tunerListener = new TunerPortListener(masterReportTuner) {

            @Override
            public void updateUIValue(Object value) {
                DataSourceFile dataSourceFile = DataSourceManager.getSelectedFile();
                if (dataSourceFile != null) {
                    String filename = dataSourceFile.getLocalName();
                    filename = filename.replace("QKK", "");
                    filename = filename.replace(".nx.hdf", "").trim();
                    for (ExperimentUserReport model : modelList) {
                        SampleResult sampleScattering = ExperimentUserReportUtils.getSampleScatteringResult(model,
                                filename);
                        if (sampleScattering != null) {
                            ScatteringResult scatteringResult = new ScatteringResult(model, sampleScattering,
                                    dataSourceFile.getName());
                            try {
                                URI reportUri = (URI) masterReportTuner.getSignal();
                                if (reportUri != null) {
                                    File file = new File(reportUri);
                                    if (file.exists()) {
                                        Object object = null;
                                        try {
                                            InputStream input = new FileInputStream(file);
                                            object = ExperimentUserReportUtils.getXStream().fromXML(input);
                                        } catch (Throwable t) {
                                            throw new ObjectConfigException(
                                                    "Invalid experiment report file: " + filename, t);
                                        }
                                        if (object instanceof ExperimentUserReport) {
                                            final ExperimentUserReport masterModel = (ExperimentUserReport) object;
                                            updateModel(model);
                                            scatteringResult.setMasterReport(masterModel);
                                        }
                                    }
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            setAlgorithmParameters(scatteringResult);
                            return;
                        }
                    }
                }
            }

            @Override
            public void updateUIOptions(List<?> options) {
            }

            @Override
            public void updateUIMin(Object min) {
            }

            @Override
            public void updateUIMax(Object max) {
            }
        };
        masterReportTuner.addChangeListener(tunerListener);
    }

    protected void updateModel(ExperimentUserReport model) {
        List<ExperimentUserReport> toRemoveList = new ArrayList<ExperimentUserReport>();
        for (ExperimentUserReport report : modelList) {
            if (report.getStartTime() == null)
                continue;
            if (report.getStartTime().equals(model.getStartTime())) {
                toRemoveList.add(report);
            }
        }
        modelList.removeAll(toRemoveList);
        modelList.add(model);
    }

    protected void setAlgorithmParameters(ScatteringResult scatteringResult) {
        AlgorithmTask task = ProjectManager.getCurrentAlgorithmTask();
        String sampleTransmission = scatteringResult.getTransmissionFilename();
        //      if (sampleTransmission != null){
        final Operation transmissionOperation = task.getOperationManager(0)
                .getOperation(TRANSMISSION_OPERATOR_NAME);
        final Tuner sampleTransmissionTuner = ((ProcessorAgent) transmissionOperation.getAgent())
                .getTuner(TRANSMISSIONURI_TUNER_NAME);
        final Tuner emptyCellTransmissionTuner = ((ProcessorAgent) transmissionOperation.getAgent())
                .getTuner(EMPTY_CELL_TRANSMISSION_URI_TUNER_NAME);
        final Tuner emptyCellScatteringTuner = ((ProcessorAgent) transmissionOperation.getAgent())
                .getTuner(EMPTY_CELL_SCATTERING_RI_TUNER_NAME);
        final Tuner backgroundScatteringTuner = ((ProcessorAgent) transmissionOperation.getAgent())
                .getTuner(BACKGROUND_SCATTERING_URI_TUNER_NAME);
        final Tuner beamCenterUriTuner = ((ProcessorAgent) transmissionOperation.getAgent())
                .getTuner(BEAM_CENTER_TUNER_NAME);
        final Operation efficiencyOperation = task.getOperationManager(0).getOperation(EFFICIENCY_OPERATOR_NAME);
        final Tuner sensitivityTuner = ((ProcessorAgent) efficiencyOperation.getAgent())
                .getTuner(SENSITIVITY_URI_TUNER_NAME);
        final Operation scalerOperation = task.getOperationManager(0).getOperation(SCALER_OPERATOR_NAME);
        final Tuner emptyBeamTransmissionTuner = ((ProcessorAgent) scalerOperation.getAgent())
                .getTuner(DIRECT_EMPTY_BEAM_TRANSMISSION_URI_TUNER_NAME);
        try {
            sampleTransmissionTuner.setSignal(ConverterLib.path2URI(sampleTransmission));
            emptyCellTransmissionTuner
                    .setSignal(ConverterLib.path2URI(scatteringResult.getEmptyCellTransmissionFilename()));
            emptyCellScatteringTuner
                    .setSignal(ConverterLib.path2URI(scatteringResult.getEmptyCellScatteringFilename()));
            backgroundScatteringTuner
                    .setSignal(ConverterLib.path2URI(scatteringResult.getDarkCurrentScatteringFilename()));
            beamCenterUriTuner
                    .setSignal(ConverterLib.path2URI(scatteringResult.getEmptyBeamTransmissionFilename()));
            sensitivityTuner.setSignal(ConverterLib.path2URI(scatteringResult.getSensitivityFilename()));
            emptyBeamTransmissionTuner
                    .setSignal(ConverterLib.path2URI(scatteringResult.getEmptyBeamTransmissionFilename()));
        } catch (Exception e) {
            e.printStackTrace();
        }
        //      }

    }

    private void contributeToActionBars() {
        IActionBars bars = getViewSite().getActionBars();
        final IMenuManager menuManager = bars.getMenuManager();
        final IToolBarManager toolBarManager = bars.getToolBarManager();

        loadModelAction = new Action() {
            public void run() {
                String[] selectedFiles = Util.selectFilesFromShell(dataSourceComposite.getShell(), "*.xml",
                        "Workflow Model Report");
                if (selectedFiles == null || selectedFiles.length == 0)
                    return;
                for (int i = 0; i < selectedFiles.length; i++) {
                    addModel(selectedFiles[i]);
                }
                dataSourceComposite.refresh();
                //            adjustColumnSize();;
            }
        };
        loadModelAction.setText("Load Experiment Report");
        loadModelAction.setToolTipText("Load data from an experiment report");
        loadModelAction.setImageDescriptor(
                Activator.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/table_add_16x16.gif"));

        final List<Object> actionList = dataSourceComposite.getActionList();
        if (actionList != null)
            actionList.add(0, loadModelAction);
        for (Iterator<?> iterator = actionList.iterator(); iterator.hasNext();) {
            Object action = (Object) iterator.next();
            if (action instanceof Action) {
                Action a = (Action) action;
                menuManager.add(a);
                toolBarManager.add(a);
            } else if (action instanceof Separator) {
                Separator s = (Separator) action;
                menuManager.add(s);
                toolBarManager.add(s);
            }
        }

    }

    protected void addModel(String filename) {
        Object object = null;
        try {
            InputStream input = new FileInputStream(filename);
            object = ExperimentUserReportUtils.getXStream().fromXML(input);
        } catch (Throwable t) {
            throw new ObjectConfigException("Invalid experiment report file: " + filename, t);
        }
        String warningMessage = "";
        if (object instanceof ExperimentUserReport) {
            final ExperimentUserReport model = (ExperimentUserReport) object;
            updateModel(model);
            //         final String filePath = model.getSensitivityFile();
            List<SampleResult> sampleScatterings = ExperimentUserReportUtils.getAllSampleScatterings(model);
            List<String> missingFiles = new ArrayList<String>();
            for (SampleResult scattering : sampleScatterings) {
                if (scattering.getRunId() == null || scattering.getRunId().trim().length() == 0)
                    continue;
                final SampleResult sample = scattering;
                System.err.println("**************" + sample.getRunId());
                ScatteringResult scatteringResult = new ScatteringResult(model, sample, filename);
                String filePath = scatteringResult.getSampleScatteringFilename();
                if (filePath == null)
                    continue;
                File file = new File(filePath);
                if (!file.exists()) {
                    System.err.println("can not find file " + filePath);
                    missingFiles.add(filePath);
                    continue;
                }
                dataSourceComposite.removeFile(filePath);
                dataSourceComposite.addFile(filePath, false);
            }
            if (missingFiles.size() > 0) {
                warningMessage = "Can not find the following files: \n";
                for (String missingFilename : missingFiles) {
                    warningMessage += "\t" + missingFilename + "\n";
                }
                throw new ObjectConfigException(warningMessage);
            }
        } else {
            throw new ObjectConfigException("Invalid experiment report file: " + filename);
        }
    }

    /**
     * Adds data file to the list of source files. 
     * @param filePath absolute file path to the file.
     */
    public List<DataItem> addDataSourceFile(String filePath) {
        DataSourceFile sourceFile = dataSourceComposite.addFile(filePath);
        if (sourceFile == null)
            return new ArrayList<DataItem>();
        return sourceFile.getDataItems();
    }

    /**
     * Removes all data files previously added to the view. 
     */
    public void removeAllDataSourceFiles() {
        dataSourceComposite.removeAll();
        modelList.clear();
    }

    /**
     * Passing the focus request to the viewer's control.
     */
    public void setFocus() {
        dataSourceComposite.setFocus();
    }

    public void setSelectionAll(boolean flag) {
        dataSourceComposite.setSelectionAll(flag);
    }

    public void selectDataSourceItem(final URI fileUri, String entryName) {
        dataSourceComposite.selectDataSourceItem(fileUri, entryName);
        //      dataSourceComposite.selectDataSourceItem(fileUri, entryName);
    }

    public void addSelectionChangedListener(SelectionListener listener) {
        dataSourceComposite.addSelectionChangedListener(listener);
    }

    public void removeSelectionChangedListener(SelectionListener listener) {
        dataSourceComposite.removeSelectionChangedListener(listener);
    }

    public static String getDataFolder() {
        String folder = System.getProperty("sics.data.path");
        if (folder == null || folder.trim().length() == 0)
            folder = "W:/commissioning";
        return folder;
    }

    @Override
    public void dispose() {
        super.dispose();
        dataSourceComposite.removeSelectionChangedListener(dataSelectionListener);
        if (eventHandler != null) {
            eventHandler.deactivate();
            eventHandler = null;
        }
        modelList.clear();
    }

}