org.jboss.as.console.client.teiid.runtime.VDBCachingTab.java Source code

Java tutorial

Introduction

Here is the source code for org.jboss.as.console.client.teiid.runtime.VDBCachingTab.java

Source

/* 
 * JBoss, Home of Professional Open Source 
 * Copyright 2011 Red Hat Inc. and/or its affiliates and other contributors
 * as indicated by the @author tags. All rights reserved. 
 * See the copyright.txt in the distribution for a 
 * full listing of individual contributors.
 *
 * This copyrighted material is made available to anyone wishing to use, 
 * modify, copy, or redistribute it subject to the terms and conditions 
 * of the GNU Lesser General Public License, v. 2.1. 
 * This program is distributed in the hope that it will be useful, but WITHOUT A 
 * 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, 
 * v.2.1 along with this distribution; if not, write to the Free Software 
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
 * MA  02110-1301, USA.
 */
package org.jboss.as.console.client.teiid.runtime;

import java.util.List;

import org.jboss.as.console.client.teiid.model.CacheStatistics;
import org.jboss.as.console.client.teiid.model.MaterializedView;
import org.jboss.as.console.client.teiid.model.VDB;
import org.jboss.as.console.client.teiid.runtime.VDBView.TableSelectionCallback;
import org.jboss.ballroom.client.widgets.common.DefaultButton;
import org.jboss.ballroom.client.widgets.tables.DefaultCellTable;
import org.jboss.ballroom.client.widgets.tables.DefaultPager;

import com.google.gwt.cell.client.ButtonCell;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.ui.CaptionPanel;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.NumberLabel;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.ProvidesKey;
import com.google.gwt.view.client.SingleSelectionModel;

@SuppressWarnings("nls")
public class VDBCachingTab extends VDBProvider {
    private static final String INVALIDATE = "Invalidate";
    private VDBPresenter presenter;
    static DateTimeFormat dtf = DateTimeFormat.getFormat("MM/dd/yy HH:mm:ss");
    private ListDataProvider<MaterializedView> matviewProvider = new ListDataProvider<MaterializedView>();
    private DefaultCellTable matviewTable;
    NumberLabel<Double> hitRatio = new NumberLabel();
    NumberLabel<Integer> totalEntries = new NumberLabel();
    NumberLabel<Integer> requestCount = new NumberLabel();

    public VDBCachingTab(VDBPresenter presenter) {
        this.presenter = presenter;
    }

    @Override
    public VerticalPanel getPanel(DefaultCellTable vdbTable) {

        Label hitRatioLabel = new Label("Hit Ratio:");
        hitRatioLabel.getElement().setAttribute("style", "margin-right:5px;");
        hitRatio.getElement().setAttribute("style", "margin-right:20px;");

        Label totalEntriesLabel = new Label("Total Entries:");
        totalEntriesLabel.getElement().setAttribute("style", "margin-right:5px;");
        totalEntries.getElement().setAttribute("style", "margin-right:20px;");

        Label requestCountLabel = new Label("Request Count:");
        requestCountLabel.getElement().setAttribute("style", "margin-right:5px;");
        requestCount.getElement().setAttribute("style", "margin-right:20px;");

        HorizontalPanel statsPanel = new HorizontalPanel();
        statsPanel.add(hitRatioLabel);
        statsPanel.add(hitRatio);
        statsPanel.add(totalEntriesLabel);
        statsPanel.add(totalEntries);
        statsPanel.add(requestCountLabel);
        statsPanel.add(requestCount);
        statsPanel.getElement().setAttribute("style", "margin-top:5px;margin-bottom:5px;");
        CaptionPanel cacheStatsPanel = new CaptionPanel("Cache Statistics");
        cacheStatsPanel.add(statsPanel);

        DefaultButton refreshBtn = new DefaultButton("Refresh", new ClickHandler() {
            @Override
            public void onClick(ClickEvent arg0) {
                refresh();
            }
        });

        // Materilized Tables
        Label matviewLabel = new Label("Materialized Tables");
        matviewLabel.getElement().setAttribute("style", "margin-top:10px;margin-bottom:5px;font-weight:bold;");

        this.matviewTable = getMaterializedTable();
        this.matviewProvider.addDataDisplay(matviewTable);
        VDBView.onTableSectionChange(vdbTable, new TableSelectionCallback<VDB>() {
            @Override
            public void onSelectionChange(VDB vdb) {
                if (vdb != null && isActive(vdb)) {
                    setVdbName(vdb.getName());
                    setVdbVersion(vdb.getVersion());
                    refresh();
                } else {
                    setQueryResults(null, MaterializedView.class.getName());
                }
            }
        });
        DefaultPager propertiesTablePager = new DefaultPager();
        propertiesTablePager.setDisplay(matviewTable);

        DefaultButton invalidateAllBtn = new DefaultButton("Invalidate All", new ClickHandler() {
            @Override
            public void onClick(ClickEvent arg0) {
                invalidateAll();
            }
        });
        invalidateAllBtn.getElement().setAttribute("style", "margin-top:5px;margin-bottom:5px;");

        //clear cache option.
        CaptionPanel clearCacheCaptionPanel = new CaptionPanel("Clear Cache");
        VerticalPanel clearCachePanel = new VerticalPanel();
        final RadioButton resultSetBtn = new RadioButton("clearcache", "ResultSet");
        final RadioButton preparedPlanBtn = new RadioButton("clearcache", "Prepared Plan");
        DefaultButton clearBtn = new DefaultButton("Clear", new ClickHandler() {
            @Override
            public void onClick(ClickEvent arg0) {
                if (resultSetBtn.getValue()) {
                    clearCache("QUERY_SERVICE_RESULT_SET_CACHE");
                } else {
                    clearCache("PREPARED_PLAN_CACHE");
                }
            }
        });
        resultSetBtn.setEnabled(true);
        resultSetBtn.setValue(true);
        preparedPlanBtn.setEnabled(true);
        clearCachePanel.add(resultSetBtn);
        clearCachePanel.add(preparedPlanBtn);
        clearCachePanel.add(clearBtn);
        clearCacheCaptionPanel.add(clearCachePanel);

        VerticalPanel formPanel = new VerticalPanel();
        formPanel.add(cacheStatsPanel);
        formPanel.add(matviewLabel.asWidget());
        formPanel.add(refreshBtn);
        formPanel.add(matviewTable.asWidget());
        formPanel.add(propertiesTablePager);
        formPanel.add(invalidateAllBtn);
        formPanel.add(clearCacheCaptionPanel);
        formPanel.setCellHorizontalAlignment(refreshBtn, HasHorizontalAlignment.ALIGN_RIGHT);
        formPanel.setCellHorizontalAlignment(invalidateAllBtn, HasHorizontalAlignment.ALIGN_RIGHT);

        return formPanel;
    }

    private DefaultCellTable getMaterializedTable() {
        ProvidesKey keyProvider = new ProvidesKey<MaterializedView>() {
            @Override
            public Object getKey(MaterializedView item) {
                return getVdbName() + "." + getVdbVersion() + "." + item.getModelName() + "." + item.getTableName();
            }
        };

        final DefaultCellTable table = new DefaultCellTable<MaterializedView>(10, keyProvider);

        TextColumn<MaterializedView> nameColumn = new TextColumn<MaterializedView>() {
            @Override
            public String getValue(MaterializedView record) {
                return record.getTableName();
            }
        };
        nameColumn.setSortable(true);

        TextColumn<MaterializedView> modelNameColumn = new TextColumn<MaterializedView>() {
            @Override
            public String getValue(MaterializedView record) {
                return String.valueOf(record.getModelName());
            }
        };
        modelNameColumn.setSortable(true);

        TextColumn<MaterializedView> validColumn = new TextColumn<MaterializedView>() {
            @Override
            public String getValue(MaterializedView record) {
                return String.valueOf(record.isValid());
            }
        };
        validColumn.setSortable(true);

        TextColumn<MaterializedView> lastUpdatedTime = new TextColumn<MaterializedView>() {
            @Override
            public String getValue(MaterializedView record) {
                //return dtf.format(dtf.parse(record.getLastUpdatedTime()), TimeZone.createTimeZone(0));
                return record.getLastUpdatedTime();
            }
        };
        lastUpdatedTime.setSortable(true);

        TextColumn<MaterializedView> loadStateColumn = new TextColumn<MaterializedView>() {
            @Override
            public String getValue(MaterializedView record) {
                return record.getLoadState();
            }
        };
        loadStateColumn.setSortable(true);

        TextColumn<MaterializedView> cardinalityColumn = new TextColumn<MaterializedView>() {
            @Override
            public String getValue(MaterializedView record) {
                return String.valueOf(record.getCardinality());
            }
        };
        loadStateColumn.setSortable(true);

        Column<MaterializedView, String> invalidateBtn = new Column<MaterializedView, String>(new ButtonCell()) {
            @Override
            public String getValue(MaterializedView record) {
                return "Reload";
            }
        };
        invalidateBtn.setFieldUpdater(new FieldUpdater<MaterializedView, String>() {
            @Override
            public void update(int index, MaterializedView table, String value) {
                invalidate(table, "Reload");
            }
        });

        table.setSelectionModel(new SingleSelectionModel<MaterializedView>(keyProvider));

        table.setTitle("Mateiralized Tables");
        table.addColumn(nameColumn, "View");
        table.addColumn(modelNameColumn, "Model Name");
        table.addColumn(validColumn, "Valid");
        table.addColumn(lastUpdatedTime, "Last Updated");
        table.addColumn(loadStateColumn, "State");
        table.addColumn(cardinalityColumn, "# Rows");
        table.addColumn(invalidateBtn, INVALIDATE);
        return table;
    }

    private void invalidate(MaterializedView view, String queryId) {
        String viewName = view.getModelName() + "." + view.getTableName();
        String sql = "CALL SYSADMIN.refreshMatView(viewname=>'" + viewName + "', invalidate=>true)";
        this.presenter.executeQuery(getVdbName(), getVdbVersion(), sql, queryId);
    }

    public <T> void setQueryResults(List<T> results, String clazz) {
        if (clazz.equals(MaterializedView.class.getName())) {
            if (results != null) {
                this.matviewProvider.getList().clear();
                this.matviewProvider.getList().addAll((List<MaterializedView>) results);
                if (!results.isEmpty()) {
                    this.matviewTable.getSelectionModel().setSelected(results.get(0), true);
                }
            } else {
                this.matviewProvider.getList().clear();
            }
        } else if (clazz.equals(INVALIDATE)) {
            refresh();
        }
    }

    private void refresh() {
        this.presenter.executeQuery(getVdbName(), getVdbVersion(), "select * from sysadmin.matviews",
                MaterializedView.class.getName());
        this.presenter.getCacheStatistics();
    }

    private void invalidateAll() {
        List<MaterializedView> views = this.matviewProvider.getList();
        int i = 0;
        for (i = 0; i < views.size() - 1; i++) {
            invalidate(views.get(i), "NoRefresh");
        }
        invalidate(views.get(i), INVALIDATE);
    }

    private void clearCache(String cacheType) {
        this.presenter.clearCache(getVdbName(), getVdbVersion(), cacheType);
    }

    public void setCacheStatistics(CacheStatistics cache) {
        if (cache != null) {
            this.hitRatio.setValue(cache.getHitRatio());
            this.totalEntries.setValue(cache.getTotalEntries());
            this.requestCount.setValue(cache.getRequestCount());
        } else {
            this.hitRatio.setValue(0.0);
            this.totalEntries.setValue(0);
            this.requestCount.setValue(0);
        }
    }
}