net.sourceforge.sqlexplorer.preview.XmlPreviewer.java Source code

Java tutorial

Introduction

Here is the source code for net.sourceforge.sqlexplorer.preview.XmlPreviewer.java

Source

/*
 * Copyright (C) 2007 SQL Explorer Development Team
 * http://sourceforge.net/projects/eclipsesql
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
package net.sourceforge.sqlexplorer.preview;

import java.io.StringReader;
import java.util.List;

import net.sourceforge.sqlexplorer.ExplorerException;
import net.sourceforge.sqlexplorer.dataset.XmlDataType;

import org.dom4j.Attribute;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;

/**
 * Previewer for XmlDataType objects
 * 
 * @author John Spackman
 */
public class XmlPreviewer implements Previewer {

    public void createControls(Composite parent, final Object data) throws ExplorerException {
        Element rootElem = getXml(data);
        if (rootElem == null)
            return;
        final Object[] root = new Object[] { rootElem };

        TreeViewer tree = new TreeViewer(parent, SWT.SINGLE);
        tree.setContentProvider(new ITreeContentProvider() {
            public void dispose() {
            }

            /**
             * Called to get the top level items
             */
            public Object[] getChildren(Object parentElement) {
                return root;
            }

            /**
             * Called to get the item's children
             */
            public Object[] getElements(Object inputElement) {
                Element elem = (Element) inputElement;
                return elem.elements().toArray();
            }

            public boolean hasChildren(Object element) {
                Element elem = (Element) element;
                List<Element> list = elem.elements();
                return list != null && list.size() > 0;
            }

            public Object getParent(Object element) {
                Element elem = (Element) element;
                return elem.getParent();
            }

            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
                // Nothing
            }
        });

        tree.setLabelProvider(new LabelProvider() {
            public String getText(Object obj) {
                Element elem = (Element) obj;
                StringBuffer result = new StringBuffer();
                result.append('<');
                result.append(elem.getName());

                for (Attribute attr : elem.attributes()) {
                    result.append(' ').append(attr.getName()).append('=').append('\"').append(attr.getValue())
                            .append('\"');
                }
                if (!elem.hasContent())
                    result.append('/');
                result.append('>');
                return result.toString();
            }
        });

        tree.expandToLevel(1);
    }

    public void dispose() {
    }

    private Element getXml(Object data) throws ExplorerException {
        try {
            if (data == null)
                return null;

            if (data instanceof XmlDataType)
                return ((XmlDataType) data).getRootElement();

            String text = data.toString();
            if (text == null)
                return null;

            SAXReader reader = new SAXReader();
            return reader.read(new StringReader(text)).getRootElement();
        } catch (DocumentException e) {
            throw new ExplorerException(e);
        }
    }

    /**
     * Registers this previewer type with the factory
     */
    public static void register() {
        PreviewerFactory.getInstance().registerClass(new PreviewerFactory.Resolver() {

            /* (non-JavaDoc)
             * @see net.sourceforge.sqlexplorer.preview.PreviewerFactory.Resolver#canAcceptMimeType(java.lang.String)
             */
            public boolean canAcceptMimeType(String mimeType) {
                return mimeType.equals("text/xml");
            }

            /* (non-JavaDoc)
             * @see net.sourceforge.sqlexplorer.preview.PreviewerFactory.Resolver#canAcceptObject(java.lang.Object)
             */
            public boolean canAcceptObject(Object data) {
                return data instanceof XmlDataType;
            }

            /* (non-JavaDoc)
             * @see net.sourceforge.sqlexplorer.preview.PreviewerFactory.Resolver#getPreviewerClass()
             */
            public Class<? extends Previewer> getPreviewerClass() {
                return XmlPreviewer.class;
            }
        });
    }

}