org.cyclop.web.panels.queryeditor.result.vertical.QueryResultVerticalPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.cyclop.web.panels.queryeditor.result.vertical.QueryResultVerticalPanel.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.cyclop.web.panels.queryeditor.result.vertical;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;

import javax.inject.Inject;

import org.apache.wicket.Component;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.navigation.paging.IPageableItems;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.cyclop.model.CqlExtendedColumnName;
import org.cyclop.model.CqlPartitionKey;
import org.cyclop.model.CqlPartitionKeyValue;
import org.cyclop.model.CqlQueryResult;
import org.cyclop.model.CqlRowMetadata;
import org.cyclop.service.converter.DataExtractor;
import org.cyclop.web.components.iterablegrid.IterableGridView;
import org.cyclop.web.panels.queryeditor.result.QueryResultPanel;

import com.datastax.driver.core.Row;

/** @author Maciej Miklas */
public final class QueryResultVerticalPanel extends QueryResultPanel {

    protected final IModel<List<? extends Row>> rowsModel;

    @Inject
    private DataExtractor extractor;

    public QueryResultVerticalPanel(String id, IModel<CqlQueryResult> model,
            Optional<RowDataProvider> rowDataProvider) {
        super(id, model, rowDataProvider);
        rowsModel = Model.ofList(Collections.emptyList());
    }

    public QueryResultVerticalPanel(String id, IModel<CqlQueryResult> model) {
        super(id, model);
        rowsModel = Model.ofList(Collections.emptyList());
    }

    @Override
    protected void hideResultsTable() {
        super.hideResultsTable();
        rowsModel.getObject().clear();
    }

    @Override
    protected IPageableItems initTableHeader(WebMarkupContainer resultTable, ColumnsModel columnsModel,
            RowDataProvider rowDataProvider, IModel<CqlRowMetadata> metadataModel) {

        IPageableItems rowNamesList = initRowNamesList(resultTable, metadataModel, rowDataProvider);
        initColumnList(columnsModel, resultTable);
        return rowNamesList;
    }

    protected IPageableItems initRowNamesList(WebMarkupContainer resultTable, IModel<CqlRowMetadata> metadataModel,
            RowDataProvider rowDataProvider) {

        final List<Row> displayedRows = new ArrayList<>();
        IterableGridView<Row> rowNamesList = new IterableGridView<Row>("rowNamesList", rowDataProvider) {

            @Override
            protected void onBeforeRender() {
                displayedRows.clear();
                super.onBeforeRender();
            }

            @Override
            protected void populateEmptyItem(Item<Row> item) {
                item.add(new Label("rowName", EMPTYVAL));
            }

            @Override
            protected void populateItem(Item<Row> item) {
                Row row = item.getModel().getObject();
                displayedRows.add(row);
                Component component = createRowKeyColumn("rowName", row, metadataModel);
                item.add(component);
            }
        };
        resultTable.add(rowNamesList);
        rowNamesList.setColumns(1);

        rowsModel.setObject(displayedRows);
        return rowNamesList;
    }

    private void initColumnList(ColumnsModel columnsModel, WebMarkupContainer resultTable) {

        ListView<CqlExtendedColumnName> columnList = new ListView<CqlExtendedColumnName>("columnList",
                columnsModel) {
            @Override
            protected void populateItem(ListItem<CqlExtendedColumnName> item) {
                final CqlExtendedColumnName columnName = item.getModelObject();

                WebMarkupContainer columnListRow = new WebMarkupContainer("columnListRow");
                item.add(columnListRow);

                Label columnNameLabel = new Label("columnName", columnName.part);
                columnListRow.add(columnNameLabel);

                ColumnsModel model = (ColumnsModel) getModel();
                CqlRowMetadata result = model.getResult();
                final Optional<CqlPartitionKey> partitionKey = Optional
                        .ofNullable(result == null ? null : result.partitionKey);

                ListView<Row> columnValueList = new ListView<Row>("columnValueList", rowsModel) {

                    @Override
                    protected void populateItem(ListItem<Row> item) {
                        Row row = item.getModelObject();

                        Component component = widgetFactory.createColumnValue(row, partitionKey, columnName,
                                "columnValue");
                        item.add(component);
                        component.setRenderBodyOnly(true);

                        Optional<CqlPartitionKeyValue> cqlPartitionKeyValue = partitionKey.isPresent()
                                ? Optional.of(extractor.extractPartitionKey(row, partitionKey.get()))
                                : Optional.empty();
                        widgetFactory.addColumnTitle(item, cqlPartitionKeyValue, columnName);

                    }
                };
                columnListRow.add(columnValueList);
            }
        };
        resultTable.add(columnList);

    }

}