net.fatlenny.datacitation.webapp.pages.DatasetCreationPage.java Source code

Java tutorial

Introduction

Here is the source code for net.fatlenny.datacitation.webapp.pages.DatasetCreationPage.java

Source

/**
 *    Licensed 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 net.fatlenny.datacitation.webapp.pages;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
import org.apache.wicket.extensions.markup.html.repeater.data.table.HeadersToolbar;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.NavigationToolbar;
import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.markup.repeater.data.ListDataProvider;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.string.StringValue;

import com.google.inject.Inject;

import net.fatlenny.datacitation.api.CitationDBException;
import net.fatlenny.datacitation.api.CitationDBService;
import net.fatlenny.datacitation.api.PID;
import net.fatlenny.datacitation.api.Query;
import net.fatlenny.datacitation.api.Revision;
import net.fatlenny.datacitation.api.TableModel;
import net.fatlenny.datacitation.service.DefaultPID;
import net.fatlenny.datacitation.service.DefaultQuery;
import net.fatlenny.datacitation.service.DefaultRevision;
import net.fatlenny.datacitation.webapp.config.Constants;

public class DatasetCreationPage extends WebPage {
    private static final long serialVersionUID = 1L;

    private static final String FEEDBACK = "No %s passed as parameter";

    private String revision;

    @Inject
    private CitationDBService citationDBService;

    public DatasetCreationPage(final PageParameters parameters) {
        super(parameters);

        StringValue datasetParameter = parameters.get(Constants.DATASET_PARAM);
        StringValue queryParameter = parameters.get(Constants.QUERY_PARAM);

        add(new BookmarkablePageLink<Void>("home", HomePage.class));

        add(new FeedbackPanel("feedback"));

        if (datasetParameter.isEmpty()) {
            error("No dataset selected.");
        }

        final Label selectedDataset = new Label("selectedDataset", datasetParameter.toString("No dataset chosen!"));
        add(selectedDataset);

        initializeQueryForm(datasetParameter.toString(), queryParameter.toString(""));
        initializeDatatable(datasetParameter.toString(), queryParameter.toString(""));
    }

    private void initializeQueryForm(String datasetName, String query) {
        final TextArea<String> queryField = new TextArea<String>("queryInput", Model.of(query));

        Form<?> form = new Form<Void>("parameterForm");

        form.add(queryField);

        Button tryButton = new Button("try") {
            private static final long serialVersionUID = 1L;

            @Override
            public void onSubmit() {
                String queryValue = queryField.getModelObject();
                if (queryValue == null) {
                    queryValue = "";
                }

                PageParameters pageParameters = new PageParameters();
                pageParameters.add(Constants.QUERY_PARAM, queryValue);
                pageParameters.add(Constants.DATASET_PARAM, datasetName);
                getRequestCycle().setResponsePage(DatasetCreationPage.class, pageParameters);
            }
        };

        form.add(tryButton);

        Button saveButton = new Button("save") {
            private static final long serialVersionUID = 1L;

            @Override
            public void onSubmit() {
                String queryValue = queryField.getModelObject();
                if (queryValue == null) {
                    queryValue = "";
                }

                PageParameters pageParameters = new PageParameters();
                pageParameters.add(Constants.QUERY_PARAM, queryValue);
                pageParameters.add(Constants.DATASET_PARAM, datasetName);
                pageParameters.add(Constants.REV_PARAM, revision);
                getRequestCycle().setResponsePage(DatasetSavePage.class, pageParameters);
            }
        };

        form.add(saveButton);

        add(form);
    }

    private void initializeDatatable(String selectedFile, String queryString) {
        if (selectedFile == null) {
            add(new Label("datatable", "Error populating data table."));
            return;
        }

        try {
            TableModel tableModel;
            if (queryString.isEmpty()) {
                tableModel = citationDBService.loadDataset(selectedFile.toString());
            } else {
                String pidIdentifier = UUID.randomUUID().toString();
                PID pid = new DefaultPID.PIDBuilder(pidIdentifier).setName(pidIdentifier).build();

                Revision revision = new DefaultRevision("HEAD");

                Query query = new DefaultQuery.QueryBuilder(pid, queryString, selectedFile, revision).build();

                tableModel = citationDBService.getQueryResult(query);
            }

            revision = tableModel.getMetaData().getRevision().getRevisionId();

            List<IColumn> header = new ArrayList<>();
            List<String> headerData = tableModel.getHeaderData();

            for (int i = 0; i < headerData.size(); i++) {
                header.add(new PropertyColumn<>(new Model<>(headerData.get(i)), String.format("%s", i)));
            }
            List<String[]> rows = tableModel.getRowData();

            ListDataProvider<String[]> dataProvider = new ListDataProvider<>(rows);

            DataTable<String, String> table = new DataTable("datatable", header, dataProvider, 15);
            table.addBottomToolbar(new NavigationToolbar(table));
            table.addTopToolbar(new HeadersToolbar(table, null));
            add(table);
        } catch (CitationDBException e) {
            error(e.getMessage());
            add(new Label("datatable", "Error populating data table."));
        }
    }
}