com.hangum.tadpole.mongodb.core.dialogs.resultview.FindOneDetailComposite.java Source code

Java tutorial

Introduction

Here is the source code for com.hangum.tadpole.mongodb.core.dialogs.resultview.FindOneDetailComposite.java

Source

/*******************************************************************************
 * Copyright (c) 2013 hangum.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Lesser Public License v2.1
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * 
 * Contributors:
 *     hangum - initial API and implementation
 ******************************************************************************/
package com.hangum.tadpole.mongodb.core.dialogs.resultview;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;

import com.hangum.tadpole.commons.google.analytics.AnalyticCaller;
import com.hangum.tadpole.mongodb.core.composite.result.TreeMongoContentProvider;
import com.hangum.tadpole.mongodb.core.composite.result.TreeMongoLabelProvider;
import com.hangum.tadpole.mongodb.core.dialogs.msg.TadpoleSimpleMessageDialog;
import com.hangum.tadpole.mongodb.core.dto.MongodbTreeViewDTO;
import com.hangum.tadpole.mongodb.core.utils.MongoDBTableColumn;
import com.hangum.tadpole.sql.util.tables.TreeUtil;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;

/**
 * collection detail composite
 * 
 * @author hangum
 *
 */
public class FindOneDetailComposite extends Composite {
    /**
     * Logger for this class
     */
    private static final Logger logger = Logger.getLogger(FindOneDetailComposite.class);

    private String collectionName;
    private DBObject dbResultObject;
    private boolean isTypeShowing;

    private List<MongodbTreeViewDTO> listTrees;
    private TreeViewer treeViewerMongo;

    /**
     * @wbp.parser.constructor
     */
    public FindOneDetailComposite(Composite parent, String collectionName, DBObject dbResultObject) {
        this(parent, collectionName, dbResultObject, true);
    }

    /**
     * Create the composite.
     * 
     * @param parent
     * @param collectionName
     * @param dbResultObject 
     */
    public FindOneDetailComposite(Composite parent, String collectionName, DBObject dbResultObject,
            boolean isTypeShowing) {
        super(parent, SWT.NONE);
        GridLayout gridLayout = new GridLayout(1, false);
        gridLayout.verticalSpacing = 1;
        gridLayout.horizontalSpacing = 1;
        gridLayout.marginHeight = 1;
        gridLayout.marginWidth = 1;
        setLayout(gridLayout);

        this.collectionName = collectionName;
        this.dbResultObject = dbResultObject;
        this.isTypeShowing = isTypeShowing;

        treeViewerMongo = new TreeViewer(this, SWT.BORDER | SWT.VIRTUAL | SWT.FULL_SELECTION);
        Tree tree = treeViewerMongo.getTree();
        tree.setHeaderVisible(true);
        tree.setLinesVisible(true);
        tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

        Button btnViewSource = new Button(this, SWT.NONE);
        btnViewSource.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
        btnViewSource.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                showViewSource();
            }
        });
        btnViewSource.setText("View Source");

        createTreeColumn();

        treeViewerMongo.setContentProvider(new TreeMongoContentProvider());
        treeViewerMongo.setLabelProvider(new TreeMongoLabelProvider());

        initData();

        // google analytic
        AnalyticCaller.track(this.getClass().getName());
    }

    /**
     * show view source 
     */
    private void showViewSource() {
        TadpoleSimpleMessageDialog dialog = new TadpoleSimpleMessageDialog(getShell(), collectionName,
                this.dbResultObject == null ? "" : this.dbResultObject.toString());
        dialog.open();
    }

    /**
     * Rrefresh data
     * 
     * @param collectionName
     * @param dbResultObject
     * @param isTypeShowing
     */
    public void refresh(String collectionName, DBObject dbResultObject, boolean isTypeShowing) {
        this.collectionName = collectionName;
        this.dbResultObject = dbResultObject;
        this.isTypeShowing = isTypeShowing;

        initData();
    }

    /**
     * init composite
     */
    private void initData() {
        listTrees = new ArrayList<MongodbTreeViewDTO>();
        try {
            MongodbTreeViewDTO treeDto = new MongodbTreeViewDTO(dbResultObject, collectionName, "", "Document"); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
            parserTreeObject(dbResultObject, treeDto, dbResultObject);
            listTrees.add(treeDto);

            treeViewerMongo.setInput(listTrees);
            treeViewerMongo.expandToLevel(3);

            TreeUtil.packTree(treeViewerMongo.getTree());
        } catch (Exception e) {
            logger.error("Refresh mongo tree data", e);
        }
    }

    /**
     * parser tree obejct
     * 
     * @param rootDbObject
     * @param treeDto
     * @param dbObject
     */
    private void parserTreeObject(final DBObject rootDbObject, final MongodbTreeViewDTO treeDto,
            final DBObject dbObject) throws Exception {
        List<MongodbTreeViewDTO> listTrees = new ArrayList<MongodbTreeViewDTO>();

        Map<Integer, String> tmpMapColumns = MongoDBTableColumn.getTabelColumnView(dbObject);
        for (int i = 0; i < tmpMapColumns.size(); i++) {
            MongodbTreeViewDTO tmpTreeDto = new MongodbTreeViewDTO();
            tmpTreeDto.setDbObject(rootDbObject);

            String keyName = tmpMapColumns.get(i);
            Object keyVal = dbObject.get(keyName);

            tmpTreeDto.setRealKey(keyName);
            // is sub document
            if (keyVal instanceof BasicDBObject) {
                tmpTreeDto.setKey(tmpMapColumns.get(i) + " {..}"); //$NON-NLS-1$
                tmpTreeDto.setType("Document"); //$NON-NLS-1$

                parserTreeObject(rootDbObject, tmpTreeDto, (DBObject) keyVal);
            } else if (keyVal instanceof BasicDBList) {
                BasicDBList dbObjectList = (BasicDBList) keyVal;

                tmpTreeDto.setKey(tmpMapColumns.get(i) + " [" + dbObjectList.size() + "]"); //$NON-NLS-1$ //$NON-NLS-2$
                tmpTreeDto.setType("Array"); //$NON-NLS-1$
                parseObjectArray(rootDbObject, tmpTreeDto, dbObjectList);
            } else {
                tmpTreeDto.setKey(tmpMapColumns.get(i));
                tmpTreeDto.setType(keyVal != null ? keyVal.getClass().getName() : "Unknow"); //$NON-NLS-1$

                if (keyVal == null)
                    tmpTreeDto.setValue(""); //$NON-NLS-1$
                else
                    tmpTreeDto.setValue(keyVal.toString());
            }

            // ? ?? .
            listTrees.add(tmpTreeDto);
        }

        treeDto.setChildren(listTrees);
    }

    /**
     * object array
     * 
     * @param rootDbObject
     * @param treeDto
     * @param dbObject
     * @throws Exception
     */
    private void parseObjectArray(final DBObject rootDbObject, final MongodbTreeViewDTO treeDto,
            final BasicDBList dbObjectList) throws Exception {
        List<MongodbTreeViewDTO> listTrees = new ArrayList<MongodbTreeViewDTO>();

        for (int i = 0; i < dbObjectList.size(); i++) {
            MongodbTreeViewDTO mongodbDto = new MongodbTreeViewDTO();

            mongodbDto.setRealKey("" + i); //$NON-NLS-1$
            mongodbDto.setKey("(" + i + ")"); //$NON-NLS-1$ //$NON-NLS-2$
            mongodbDto.setDbObject(rootDbObject);

            Object keyVal = dbObjectList.get(i);
            if (keyVal instanceof BasicDBObject) {
                mongodbDto.setType("Document"); //$NON-NLS-1$

                parserTreeObject(rootDbObject, mongodbDto, (DBObject) keyVal);
            } else if (keyVal instanceof BasicDBList) {
                BasicDBList tmpDbObjectList = (BasicDBList) keyVal;

                mongodbDto.setType("Array"); //$NON-NLS-1$
                parseObjectArray(rootDbObject, mongodbDto, tmpDbObjectList);
            } else {
                mongodbDto.setType(keyVal != null ? keyVal.getClass().getName() : "Unknow"); //$NON-NLS-1$

                if (keyVal == null)
                    mongodbDto.setValue(""); //$NON-NLS-1$
                else
                    mongodbDto.setValue(keyVal.toString());
            }

            listTrees.add(mongodbDto);
        }

        treeDto.setChildren(listTrees);
    }

    /**
     * treeview create
     */
    private void createTreeColumn() {
        String[] columnName = { "Key", "Value", "Type" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
        int[] columnSize = { 170, 200, 140 };

        try {
            int columnViewCnt = 2;
            if (isTypeShowing)
                columnViewCnt = 3;
            for (int i = 0; i < columnViewCnt; i++) {
                int columnAlign = SWT.LEFT;
                if (i == 1)
                    columnAlign = SWT.RIGHT;

                final TreeViewerColumn tableColumn = new TreeViewerColumn(treeViewerMongo, columnAlign);
                tableColumn.getColumn().setText(columnName[i]);
                tableColumn.getColumn().setWidth(columnSize[i]);
                tableColumn.getColumn().setResizable(true);
                tableColumn.getColumn().setMoveable(false);
            } // end for

        } catch (Exception e) {
            logger.error("MongoDB Tree view Editor", e); //$NON-NLS-1$
        }
    }

    @Override
    protected void checkSubclass() {
    }

}