com.mmkarton.mx7.reportgenerator.util.RootNode.java Source code

Java tutorial

Introduction

Here is the source code for com.mmkarton.mx7.reportgenerator.util.RootNode.java

Source

/*******************************************************************************
 * Copyright (c) 2008 Actuate Corporation.
 * 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:
 *  Actuate Corporation  - initial API and implementation
 *  Ing. Gerd Stockner (Mayr-Melnhof Karton Gesellschaft m.b.H.) - modifications
 *  Christian Voller (Mayr-Melnhof Karton Gesellschaft m.b.H.) - modifications
 *  CoSMIT GmbH - publishing, maintenance
 *******************************************************************************/

package com.mmkarton.mx7.reportgenerator.util;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.graphics.Image;

import com.mmkarton.mx7.reportgenerator.Activator;
import com.mmkarton.mx7.reportgenerator.provider.JdbcMetaDataProvider;

public class RootNode extends ChildrenAllowedNode {
    private static Logger logger = Logger.getLogger(RootNode.class.getName());
    private static String ROOT_ICON = RootNode.class.getName() + ".RootIcon";
    static {
        ImageRegistry reg = JFaceResources.getImageRegistry();
        reg.put(ROOT_ICON, Activator.getImageDescriptor("icons/data_source.gif"));//$NON-NLS-1$
    }

    private String dataSourceName;
    private String[] prefetechedSchemas;

    public RootNode(String dataSourceName) {
        this(dataSourceName, null);
    }

    public RootNode(String dataSourceName, String[] allSchemaNames) {
        assert dataSourceName != null;
        this.dataSourceName = dataSourceName;
        this.prefetechedSchemas = allSchemaNames;
    }

    @Override
    protected IDBNode[] refetchChildren(FilterConfig fc) {
        String namePattern = fc.getNamePattern();
        boolean supportsSchema = true;
        boolean supportsProcedure = true;
        if (namePattern.equals("%")) {
            if (supportsSchema) {
                // just list schemas
                if (fc.getSchemaName() != null) {
                    IDBNode node = fetchSpecifiedSchema(fc.getSchemaName());
                    return node == null ? new IDBNode[0] : new IDBNode[] { node };
                } else {
                    if (prefetechedSchemas == null) {
                        return fetchChildrenFromSchema(fc.getMaxSchemaCount());
                    } else {
                        //already know all schema names
                        List<SchemaNode> schemas = new ArrayList<SchemaNode>();
                        int count = 0;
                        for (String name : prefetechedSchemas) {
                            if (count >= fc.getMaxSchemaCount()) {
                                break;
                            }
                            schemas.add(new SchemaNode(name));
                            count++;
                        }
                        return schemas.toArray(new IDBNode[0]);
                    }
                }
            } else //not support schema
            {
                //create a dummy schema node and reuse its refetchChildren() method
                return new SchemaNode(null).refetchChildren(fc);
            }
        } else //user input a filter string
        {
            Map<String, TablesAndProcedures> schemas = generateSchemaToTablesAndProceduresMap(fc,
                    supportsProcedure);
            return fetchChildrenFromMap(schemas, fc.getMaxSchemaCount());
        }
    }

    private Map<String, TablesAndProcedures> generateSchemaToTablesAndProceduresMap(FilterConfig fc,
            boolean supportsProcedure) {
        Map<String, TablesAndProcedures> schemas = new HashMap<String, TablesAndProcedures>();
        String[] tableTypes = fc.getTableTypesForJDBC();
        if (tableTypes != null) {
            ResultSet rs = JdbcMetaDataProvider.getInstance().getAlltables(fc.getSchemaName(), fc.getNamePattern(),
                    fc.getTableTypesForJDBC());
            if (rs != null) {
                try {
                    while (rs.next()) {
                        String schemaName = rs.getString("TABLE_SCHEM");
                        String tableName = rs.getString("TABLE_NAME");
                        String type = rs.getString("TABLE_TYPE");//$NON-NLS-1$
                        TableNode table = new TableNode(null, tableName, "VIEW".equalsIgnoreCase(type));
                        TablesAndProcedures tap = schemas.get(schemaName);
                        if (tap == null) {
                            tap = new TablesAndProcedures();
                            schemas.put(schemaName, tap);
                        }
                        if (tap.getTableCount() < fc.getMaxTableCountPerSchema()) {
                            tap.addTable(table);
                        }
                    }
                } catch (SQLException e) {
                    logger.log(Level.WARNING, e.getLocalizedMessage(), e);
                }
            }
        }
        if (supportsProcedure
                && (fc.getType() == FilterConfig.Type.ALL || fc.getType() == FilterConfig.Type.PROCEDURE)) {
            ResultSet rs = JdbcMetaDataProvider.getInstance().getProcedures(fc.getSchemaName(),
                    fc.getNamePattern());
            if (rs != null) {
                try {
                    while (rs.next()) {
                        String schemaName = rs.getString("PROCEDURE_SCHEM");
                        String procedureName = rs.getString("PROCEDURE_NAME");
                        ProcedureNode procedure = new ProcedureNode(schemaName, procedureName);
                        TablesAndProcedures tap = schemas.get(schemaName);
                        if (tap == null) {
                            tap = new TablesAndProcedures();
                            schemas.put(schemaName, tap);
                        }
                        tap.addProcedure(procedure);
                    }
                } catch (SQLException e) {
                    logger.log(Level.WARNING, e.getLocalizedMessage(), e);
                }
            }
        }
        return schemas;
    }

    private IDBNode[] fetchChildrenFromMap(Map<String, TablesAndProcedures> schemas, int maxSchemaCount) {
        List<SchemaNode> result = new ArrayList<SchemaNode>();
        int count = 0;
        for (Entry<String, TablesAndProcedures> entry : schemas.entrySet()) {
            if (count >= maxSchemaCount) {
                break;
            }
            SchemaNode schema = new SchemaNode(entry.getKey());
            TablesAndProcedures tap = entry.getValue();
            List<IDBNode> children = new ArrayList<IDBNode>();
            children.addAll(Arrays.asList(tap.getTables()));
            if (tap.getProcedureCount() > 0) {
                ProcedureFlagNode procedureFlagNode = new ProcedureFlagNode(entry.getKey());
                procedureFlagNode.setChildren(tap.getProcedures());
                children.add(procedureFlagNode);
            }
            schema.setChildren(children.toArray(new IDBNode[0]));
            result.add(schema);

            ++count;
        }
        if (result.size() == 1 && result.get(0).getDisplayName() == null) {
            //not support schema;
            return result.get(0).getChildren();
        } else {
            Collections.sort(result);
            return result.toArray(new IDBNode[0]);
        }
    }

    private IDBNode[] fetchChildrenFromSchema(int maxSchemaCount) {
        List<SchemaNode> schemas = new ArrayList<SchemaNode>();
        ResultSet rs = JdbcMetaDataProvider.getInstance().getAllSchemas();
        if (rs != null) {
            int count = 0;

            try {
                while (rs.next() && count < maxSchemaCount) {
                    String name = rs.getString("TABLE_SCHEM");
                    SchemaNode schema = new SchemaNode(name);
                    schemas.add(schema);
                    count++;
                }
            } catch (SQLException e) {
                logger.log(Level.WARNING, e.getLocalizedMessage(), e);
            }
        }
        return schemas.toArray(new SchemaNode[0]);
    }

    private IDBNode fetchSpecifiedSchema(String schemaName) {
        assert schemaName != null;
        IDBNode result = null;
        ResultSet rs = JdbcMetaDataProvider.getInstance().getAllSchemas();
        if (rs != null) {
            try {
                while (rs.next()) {
                    String name = rs.getString("TABLE_SCHEM");
                    if (name.equals(schemaName)) {
                        return new SchemaNode(name);
                    }
                }
            } catch (SQLException e) {
                logger.log(Level.WARNING, e.getLocalizedMessage(), e);
            }
        }
        return result;
    }

    public String getDisplayName() {
        return dataSourceName;
    }

    public Image getImage() {
        return JFaceResources.getImageRegistry().get(ROOT_ICON);
    }

    /**
     * Can't be a part of SQL text
     */
    public String getQualifiedNameInSQL(boolean includeSchema) {
        return null;
    }

    private static class TablesAndProcedures {
        private List<TableNode> tables = new ArrayList<TableNode>();
        private List<ProcedureNode> procedures = new ArrayList<ProcedureNode>();

        public void addTable(TableNode table) {
            assert table != null;
            tables.add(table);
        }

        public void addProcedure(ProcedureNode procedure) {
            assert procedure != null;
            procedures.add(procedure);
        }

        public int getTableCount() {
            return tables.size();
        }

        public int getProcedureCount() {
            return procedures.size();
        }

        public TableNode[] getTables() {
            return tables.toArray(new TableNode[0]);
        }

        public ProcedureNode[] getProcedures() {
            return procedures.toArray(new ProcedureNode[0]);
        }
    }
}