ca.phon.app.project.mergewizard.DeriveSessionWizard.java Source code

Java tutorial

Introduction

Here is the source code for ca.phon.app.project.mergewizard.DeriveSessionWizard.java

Source

/*
 * Phon - An open source tool for research in phonology.
 * Copyright (C) 2005 - 2015, Gregory Hedlund <ghedlund@mun.ca> and Yvan Rose <yrose@mun.ca>
 * Dept of Linguistics, Memorial University <https://phon.ca>
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * 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 ca.phon.app.project.mergewizard;

import java.awt.BorderLayout;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import org.joda.time.DateTime;

import ca.phon.app.log.BufferPanel;
import ca.phon.app.project.SessionMerger;
import ca.phon.project.Project;
import ca.phon.session.DateFormatter;
import ca.phon.session.RecordFilter;
import ca.phon.session.Session;
import ca.phon.session.SessionFactory;
import ca.phon.session.SessionPath;
import ca.phon.ui.decorations.DialogHeader;
import ca.phon.ui.wizard.WizardFrame;
import ca.phon.ui.wizard.WizardStep;
import ca.phon.worker.PhonWorker;

/**
 * Merge one or more session into a new session.
 *
 */
public class DeriveSessionWizard extends WizardFrame {

    private static final long serialVersionUID = -4619604190124079327L;

    private final static Logger LOGGER = Logger.getLogger(DeriveSessionWizard.class.getName());

    /*
     * Steps
     */
    private MergeSessionStep1 step1;

    private MergeSessionStep2 step2;

    private WizardStep mergeStep;

    private BufferPanel console;

    public DeriveSessionWizard(Project project) {
        super("Phon : " + project.getName() + " : Derive Session");
        setWindowName("Derive Session");

        super.putExtension(Project.class, project);

        init();
    }

    private Project getProject() {
        return getExtension(Project.class);
    }

    private void init() {
        btnCancel.setText("Close");
        btnFinish.setVisible(false);

        step1 = new MergeSessionStep1(getProject());
        step1.setNextStep(0);
        addWizardStep(step1);
    }

    private WizardStep createMergeStep() {
        JPanel importPanel = new JPanel(new BorderLayout());

        DialogHeader importHeader = new DialogHeader("Derive Session",
                "Merge data from one or more sessions into a new session.");
        importPanel.add(importHeader, BorderLayout.NORTH);

        JPanel consolePanel = new JPanel(new BorderLayout());

        console = new BufferPanel("Derive Session");
        consolePanel.add(console, BorderLayout.CENTER);

        importPanel.add(consolePanel, BorderLayout.CENTER);

        return super.addWizardStep(importPanel);
    }

    @Override
    protected void next() {
        if (super.getCurrentStep() == step1) {
            // setup step2
            if (step2 == null) {
                step2 = new MergeSessionStep2(getProject(), step1.getSelectedSessions());
                step2.setPrevStep(0);
                step2.setNextStep(2);
                addWizardStep(step2);

                mergeStep = createMergeStep();
                mergeStep.setPrevStep(1);
                mergeStep.setNextStep(-1);
            } else {
                step2.setSelectedSessions(step1.getSelectedSessions());
            }

            step1.setNextStep(1);
        } else if (super.getCurrentStep() == step2) {
            // start merge task
            startMerge();
        }
        super.next();
    }

    private void startMerge() {
        PhonWorker worker = PhonWorker.createWorker();
        worker.setName("Session Merger");
        worker.setFinishWhenQueueEmpty(true);

        Runnable toRun = new Runnable() {
            @Override
            public void run() {
                Runnable turnOffBack = new Runnable() {
                    @Override
                    public void run() {
                        btnBack.setEnabled(false);
                        btnCancel.setEnabled(false);
                    }
                };
                Runnable turnOnBack = new Runnable() {
                    @Override
                    public void run() {
                        btnBack.setEnabled(true);
                        btnCancel.setEnabled(true);
                    }
                };
                SwingUtilities.invokeLater(turnOffBack);

                doMerge();

                SwingUtilities.invokeLater(turnOnBack);
            }
        };
        worker.invokeLater(toRun);

        worker.start();
    }

    /**
     * Perform the merge.
     */
    private void doMerge() {

        String corpus = step1.getMergedCorpusName();
        String session = step1.getMergedSessionName();

        List<SessionPath> sessions = step1.getSelectedSessions();
        Collections.sort(sessions);

        final Project project = getProject();
        // first make sure we have a corpus
        if (!project.getCorpora().contains(step1.getMergedCorpusName())) {

            LOGGER.info("Creating corpus '" + corpus + "'");
            try {
                project.addCorpus(corpus, "");
            } catch (IOException e) {
                LOGGER.log(Level.SEVERE, e.getLocalizedMessage(), e);
                return;
            }

        }

        // check session name
        if (project.getCorpusSessions(corpus).contains(session)) {
            LOGGER.severe("A session with name '" + corpus + "." + session + "' already exists.");
            return;
        }

        // create the new session
        LOGGER.info("Creating session '" + corpus + "." + session + "'");
        final SessionFactory factory = SessionFactory.newFactory();
        try {
            final Session mergedSession = factory.createSession(corpus, session);

            final DateFormatter pdf = new DateFormatter();
            // merge sessions
            // keep track of session/media to see if we can sucessfully copy the data over
            String mergedDate = null;
            boolean checkDate = true;
            String mergedMedia = null;
            boolean checkMedia = true;
            for (SessionPath loc : sessions) {
                final Session t = step2.getSessionAtLocation(loc);
                final RecordFilter filter = step2.getFilterForLocation(loc);

                LOGGER.info("Merging data from session '" + loc.getCorpus() + "." + loc.getSession() + "'");
                if (checkDate) {
                    String tDate = pdf.format(t.getDate());
                    if (mergedDate == null) {
                        mergedDate = tDate;
                    } else {
                        if (!mergedDate.equals(tDate)) {
                            LOGGER.warning("Session dates do not match, setting merged session date to today.");
                            mergedDate = pdf.format(DateTime.now());
                            checkDate = false;
                        }
                    }
                }

                if (checkMedia) {
                    if (mergedMedia == null) {
                        mergedMedia = t.getMediaLocation();
                    } else {
                        if (!mergedMedia.equals(t.getMediaLocation())) {
                            LOGGER.warning("Session media locations do not match, leaving media field blank.");
                            mergedMedia = "";
                            checkMedia = false;
                        }
                    }
                }

                // merge this session info
                SessionMerger.mergeSession(mergedSession, t, filter);
            }

            if (mergedDate != null) {
                final DateTime dt = DateTime.now();
                mergedSession.setDate(dt);
            }

            if (mergedMedia != null) {
                mergedSession.setMediaLocation(mergedMedia);
            }

            // save
            final UUID writeLock = project.getSessionWriteLock(mergedSession);
            project.saveSession(mergedSession, writeLock);
            project.releaseSessionWriteLock(mergedSession, writeLock);
        } catch (IOException e) {
            LOGGER.log(Level.SEVERE, e.getLocalizedMessage(), e);
            return;
        }

    }

}