org.csstudio.utility.adlconverter.ui.ADLDisplayImporter.java Source code

Java tutorial

Introduction

Here is the source code for org.csstudio.utility.adlconverter.ui.ADLDisplayImporter.java

Source

/*
 * Copyright (c) 2007 Stiftung Deutsches Elektronen-Synchrotron,
 * Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY.
 *
 * THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS.
 * WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
 * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND
 * NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
 * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
 * THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE
 * IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR
 * CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE.
 * NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
 * DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
 * OR MODIFICATIONS.
 * THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION,
 * USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS
 * PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY
 * AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM
 */
/*
 * $Id$
 */
package org.csstudio.utility.adlconverter.ui;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Formatter;

import org.csstudio.sds.importer.AbstractDisplayImporter;
import org.csstudio.sds.internal.model.Layer;
import org.csstudio.sds.internal.persistence.DisplayModelInputStream;
import org.csstudio.sds.internal.persistence.PersistenceUtil;
import org.csstudio.sds.model.AbstractWidgetModel;
import org.csstudio.sds.model.DisplayModel;
import org.csstudio.utility.adlconverter.internationalization.Messages;
import org.csstudio.utility.adlconverter.utility.ADLHelper;
import org.csstudio.utility.adlconverter.utility.ADLWidget;
import org.csstudio.utility.adlconverter.utility.ParserADL;
import org.csstudio.utility.adlconverter.utility.faceplate.FaceplateParser;
import org.csstudio.utility.adlconverter.utility.striptool.StripTool;
import org.csstudio.utility.adlconverter.utility.striptool.StripToolParser;
import org.csstudio.utility.adlconverter.utility.widgets.ADLDisplay;
import org.csstudio.utility.adlconverter.utility.widgets.ActionButton;
import org.csstudio.utility.adlconverter.utility.widgets.Arc;
import org.csstudio.utility.adlconverter.utility.widgets.Bargraph;
import org.csstudio.utility.adlconverter.utility.widgets.ChoiceButton;
import org.csstudio.utility.adlconverter.utility.widgets.Ellipse;
import org.csstudio.utility.adlconverter.utility.widgets.GroupingContainer;
import org.csstudio.utility.adlconverter.utility.widgets.Image;
import org.csstudio.utility.adlconverter.utility.widgets.Label;
import org.csstudio.utility.adlconverter.utility.widgets.Meter;
import org.csstudio.utility.adlconverter.utility.widgets.Polygon;
import org.csstudio.utility.adlconverter.utility.widgets.Polyline;
import org.csstudio.utility.adlconverter.utility.widgets.Rectangle;
import org.csstudio.utility.adlconverter.utility.widgets.RelatedDisplay;
import org.csstudio.utility.adlconverter.utility.widgets.SixteenBinaryBar;
import org.csstudio.utility.adlconverter.utility.widgets.StripChart;
import org.csstudio.utility.adlconverter.utility.widgets.Symbol;
import org.csstudio.utility.adlconverter.utility.widgets.Textinput;
import org.csstudio.utility.adlconverter.utility.widgets.Valuator;
import org.csstudio.utility.adlconverter.utility.widgets.Waveform;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author hrickens
 * @author $Author$
 * @version $Revision$
 * @since 22.10.2007
 */
public class ADLDisplayImporter extends AbstractDisplayImporter {

    private static final Logger LOG = LoggerFactory.getLogger(ADLDisplayImporter.class);
    /**
     * Store the Display to finalize if the colormap not finalize.
     */
    private ADLWidget _storDisplay;
    private int _status;
    private static boolean _createFolderNever = false;
    private static boolean _createFolderAllways = false;

    /**
     * Default Constructor.
     */
    public ADLDisplayImporter() {
        // Default Constructor.
    }

    /**
     * {@inheritDoc}
     *
     * @throws CoreException
     */
    @Override
    public final boolean importDisplay(final String sourceFile, final IPath targetProject,
            final String targetFileName) throws CoreException {

        _status = 0;
        ADLWidget storedBasicAttribute = null;
        ADLWidget storedDynamicAttribute = null;
        ADLWidget root = ParserADL.getNextElement(new File(sourceFile));

        // this is the target display model
        DisplayModel displayModel = new DisplayModel();
        _storDisplay = null;
        displayModel.getLayerSupport().addLayer(new Layer(Messages.ADLDisplayImporter_ADLBackgroundLayerName,
                Messages.ADLDisplayImporter_ADLBackgroundLayerDes), 0);
        displayModel.getLayerSupport().addLayer(new Layer(Messages.ADLDisplayImporter_ADLDynamicLayerName,
                Messages.ADLDisplayImporter_ADLDynamicLayerDes), 2);
        displayModel.getLayerSupport().addLayer(new Layer(Messages.ADLDisplayImporter_ADLBargraphLayerName,
                Messages.ADLDisplayImporter_ADLBargraphLayerDes), 3);
        displayModel.getLayerSupport().addLayer(new Layer(Messages.ADLDisplayImporter_ADLActionLayerName,
                Messages.ADLDisplayImporter_ADLActionLayerDes), 4);

        // search and set the color map
        for (ADLWidget adlWidget : root.getObjects()) {
            if (adlWidget.getType().equals("color map")) { //$NON-NLS-1$
                try {
                    ADLHelper.setColorMap(adlWidget);
                    display(adlWidget, displayModel);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            }
        }
        for (ADLWidget adlWidget : root.getObjects()) {
            try {
                if (adlWidget.getType().equals("arc")) { //$NON-NLS-1$
                    AbstractWidgetModel element = new Arc(adlWidget, displayModel, storedBasicAttribute,
                            storedDynamicAttribute).getElement();
                    displayModel.addWidget(element);
                } else if (adlWidget.getType().equals("bar")) { //$NON-NLS-1$
                    AbstractWidgetModel element = new Bargraph(adlWidget, storedBasicAttribute,
                            storedDynamicAttribute).getElement();
                    displayModel.addWidget(element);
                } else if (adlWidget.getType().equals("byte")) { //$NON-NLS-1$
                    displayModel
                            .addWidget(new SixteenBinaryBar(adlWidget, storedBasicAttribute, storedDynamicAttribute)
                                    .getElement());
                } else if (adlWidget.getType().equals("cartesian plot")) { //$NON-NLS-1$
                    displayModel.addWidget(
                            new Waveform(adlWidget, storedBasicAttribute, storedDynamicAttribute).getElement());
                } else if (adlWidget.getType().equals("choice button")) { //$NON-NLS-1$
                    displayModel.addWidget(
                            new ChoiceButton(adlWidget, storedBasicAttribute, storedDynamicAttribute).getElement());
                } else if (adlWidget.getType().equals("color map")) { //$NON-NLS-1$
                    // do nothing
                    // ADLHelper.setColorMap(adlWidget);
                    // display(adlWidget, displayModel);
                } else if (adlWidget.getType().equals("composite")) { //$NON-NLS-1$
                    displayModel.addWidget(new GroupingContainer(adlWidget, storedBasicAttribute,
                            storedDynamicAttribute, targetProject).getElement());
                } else if (adlWidget.getType().startsWith("display")) { //$NON-NLS-1$
                    display(adlWidget, displayModel);
                } else if (adlWidget.getType().equals("dynamic symbol")) { //$NON-NLS-1$
                    displayModel.addWidget(
                            new Symbol(adlWidget, storedBasicAttribute, storedDynamicAttribute).getElement());
                } else if (adlWidget.getType().equals("file")) { //$NON-NLS-1$
                    // TODO: FILE --> Name and Version
                    ADLHelper.setPath(adlWidget);
                } else if (adlWidget.getType().equals("image")) { //$NON-NLS-1$
                    displayModel.addWidget(new Image(adlWidget, displayModel, storedBasicAttribute,
                            storedDynamicAttribute, targetProject).getElement());
                } else if (adlWidget.getType().equals("indicator")) { //$NON-NLS-1$
                    displayModel.addWidget(
                            new Bargraph(adlWidget, storedBasicAttribute, storedDynamicAttribute).getElement());
                } else if (adlWidget.getType().equals("menu")) { //$NON-NLS-1$
                    displayModel
                            .addWidget(new RelatedDisplay(adlWidget, storedBasicAttribute, storedDynamicAttribute)
                                    .getElement());
                } else if (adlWidget.getType().equals("message button")
                        || adlWidget.getType().equals("toggle button")) { //$NON-NLS-1$
                    displayModel.addWidget(
                            new ActionButton(adlWidget, storedBasicAttribute, storedDynamicAttribute).getElement());
                } else if (adlWidget.getType().equals("meter")) { //$NON-NLS-1$
                    displayModel.addWidget(
                            new Meter(adlWidget, storedBasicAttribute, storedDynamicAttribute).getElement());
                } else if (adlWidget.getType().equals("oval")) { //$NON-NLS-1$
                    displayModel.addWidget(
                            new Ellipse(adlWidget, displayModel, storedBasicAttribute, storedDynamicAttribute)
                                    .getElement());
                } else if (adlWidget.getType().equals("polygon")) { //$NON-NLS-1$
                    displayModel.addWidget(
                            new Polygon(adlWidget, displayModel, storedBasicAttribute, storedDynamicAttribute)
                                    .getElement());
                } else if (adlWidget.getType().endsWith("line")) { //$NON-NLS-1$
                    Polyline polyline = new Polyline(adlWidget, displayModel, storedBasicAttribute,
                            storedDynamicAttribute);
                    displayModel.addWidget(polyline.getElement());
                    polyline = null;
                } else if (adlWidget.getType().equals("rectangle")) { //$NON-NLS-1$
                    displayModel.addWidget(
                            new Rectangle(adlWidget, displayModel, storedBasicAttribute, storedDynamicAttribute)
                                    .getElement());
                } else if (adlWidget.getType().equals("related display")) { //$NON-NLS-1$
                    displayModel
                            .addWidget(new RelatedDisplay(adlWidget, storedBasicAttribute, storedDynamicAttribute)
                                    .getElement());
                } else if (adlWidget.getType().equals("strip chart")) { //$NON-NLS-1$
                    displayModel.addWidget(
                            new StripChart(adlWidget, storedBasicAttribute, storedDynamicAttribute).getElement());
                } else if (adlWidget.getType().equals("text")) { //$NON-NLS-1$
                    displayModel.addWidget(
                            new Label(adlWidget, displayModel, storedBasicAttribute, storedDynamicAttribute)
                                    .getElement());
                } else if (adlWidget.getType().equals("text update")) { //$NON-NLS-1$
                    displayModel.addWidget(
                            new Label(adlWidget, displayModel, storedBasicAttribute, storedDynamicAttribute)
                                    .getElement());
                } else if (adlWidget.getType().equals("text entry")) { //$NON-NLS-1$
                    displayModel.addWidget(
                            new Textinput(adlWidget, storedBasicAttribute, storedDynamicAttribute).getElement());
                } else if (adlWidget.getType().equals("valuator")) { //$NON-NLS-1$
                    displayModel.addWidget(
                            new Valuator(adlWidget, storedBasicAttribute, storedDynamicAttribute).getElement());
                } else if (adlWidget.getType().contains("basic attribute")) { //$NON-NLS-1$
                    storedBasicAttribute = adlWidget;
                } else if (adlWidget.getType().contains("dynamic attribute")) { //$NON-NLS-1$
                    storedDynamicAttribute = adlWidget;
                } else {
                    int lineNr = adlWidget.getBody().get(0).getLineNumber();
                    Object[] args = new Object[] { adlWidget.getType(), lineNr, adlWidget.getObjectNr(),
                            sourceFile };
                    LOG.info(Messages.ADLDisplayImporter_WARN_UNHANDLED_TYPE
                            + "{} Line: {} (ObjectNo: {})in File: {}", args);
                }
            } catch (Exception e) {
                LOG.error("Error:_", e);
            }
        }

        // create the target file in the workspace
        return createFile(targetProject, targetFileName, displayModel);
    }

    public boolean importFaceplate(final String sourceFile, final IPath targetProject, final String targetFileName)
            throws CoreException {
        ADLWidget root = ParserADL.getNextElement(new File(sourceFile));
        DisplayModel displayModel = new DisplayModel();
        FaceplateParser.parse(root, displayModel);
        return createFile(targetProject, targetFileName, displayModel);
    }

    public boolean importStripTool(final String sourceFile, final IPath targetProject, final String targetFileName)
            throws CoreException, IOException {
        // ADLWidget root = ParserS.getNextElement(new File(sourceFile));
        StripTool stripTool = new StripTool();
        StripToolParser.parse(sourceFile, stripTool);
        return createFile(targetProject, targetFileName, stripTool);
    }

    private boolean createFile(IPath targetProject, String targetFileName, DisplayModel displayModel)
            throws CoreException {
        DisplayModelInputStream.setXMLHeader("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"); //$NON-NLS-1$
        DisplayModelInputStream modelInputStream = (DisplayModelInputStream) PersistenceUtil
                .createStream(displayModel);
        IFile fileOut = handelPathAndFile(targetProject, targetFileName);
        if (fileOut == null) {
            return false;
        } else if (fileOut.exists()) {
            fileOut.setContents(modelInputStream, true, false, null);
        } else {
            fileOut.create(modelInputStream, true, null);
        }
        return true;
    }

    private boolean createFile(IPath targetProject, String targetFileName, StripTool stripTool)
            throws CoreException, IOException {
        IFile fileOut = handelPathAndFile(targetProject, targetFileName);
        if (fileOut == null) {
            return false;
        } else if (fileOut.exists()) {
            InputStream xmlFileInputStream = stripTool.getXmlFileInputStream();
            fileOut.setContents(xmlFileInputStream, true, false, null);
        } else {
            InputStream xmlFileInputStream = stripTool.getXmlFileInputStream();
            fileOut.create(xmlFileInputStream, true, null);
        }
        return true;
    }

    private IFile handelPathAndFile(IPath targetProject, String targetFileName) throws CoreException {
        IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
        IPath filePath = targetProject.append(targetFileName.trim());
        if (!workspaceRoot.exists(targetProject)) {
            if (_createFolderAllways) {
                IFolder folder = workspaceRoot.getFolder(targetProject);
                createFolder(folder);
            } else if (_createFolderNever) {
                return null;
            } else {
                String[] dialogButtonsText = new String[] { Messages.ADLDisplayImporter_Dialog_Yes_Button,
                        Messages.ADLDisplayImporter_Dialog_Yes2All_Button,
                        Messages.ADLDisplayImporter_Dialog_No_Button,
                        Messages.ADLDisplayImporter_Dialog_No2All_Button, "cancel" };
                Formatter f = new Formatter();
                f.format("Dir \"%s\" not exist!\r\nCreat this Folder?", targetProject);

                MessageDialog md = new MessageDialog(Display.getCurrent().getActiveShell(),
                        Messages.ADLDisplayImporter_Dialog_Header_Directory_not_exist, null, f.toString(),
                        MessageDialog.WARNING, dialogButtonsText, 0);

                switch (md.open()) {
                case 1:
                    _createFolderAllways = true;
                    //$FALL-THROUGH$
                case 0:
                    IFolder folder = workspaceRoot.getFolder(targetProject);
                    createFolder(folder);
                    break;
                case 3:
                    _createFolderNever = true;
                    //$FALL-THROUGH$
                case 2:
                    _status = 2;
                    return null;
                default:
                    _status = 5;
                    return null;
                }
            }
        }
        return workspaceRoot.getFile(filePath);
    }

    /**
     * Generate a Folder and parent folder.
     *
     * @param folder
     *            the lowest folder in the tree to generated
     * @throws CoreException
     *             is a OperationCanceledException if the operation is canceled. Cancelation can
     *             occur even if no progress monitor is provided.
     * @see IFolder#create(int,boolean,IProgressMonitor)
     */
    private void createFolder(final IFolder folder) throws CoreException {
        if (!folder.getParent().exists()) {
            if (folder.getParent() instanceof IFolder) {
                createFolder((IFolder) folder.getParent());
            }
        }
        folder.create(true, true, null);

    }

    /**
     * @param adlWidget
     *            the Main display widget.
     * @param root
     *            the root Element of css-sds file.
     */
    private void display(final ADLWidget adlWidget, final DisplayModel root) {
        try {
            if (adlWidget.getType().startsWith("display")) {
                if (ADLHelper.getRGB("0") == null) { //$NON-NLS-1$
                    _storDisplay = adlWidget;
                } else {
                    new ADLDisplay(adlWidget, root);
                }
            } else if (adlWidget.getType().equals("\"color map\"") && _storDisplay != null) { //$NON-NLS-1$
                new ADLDisplay(_storDisplay, root);
                _storDisplay = null;
            }
        } catch (Exception e) {
            LOG.error("Error: ", e);
        }
    }

    /**
     * @return
     */
    public int getStatus() {
        return _status;
    }

    public static void reset() {
        _createFolderAllways = false;
        _createFolderNever = false;
    }

}