/**
* Copyright 2012 Universitat Pompeu Fabra.
*
* 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 org.onexus.website.api.pages.search.figures.table;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.NoRecordsToolbar;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.util.string.Strings;
import org.onexus.collection.api.IEntityTable;
import org.onexus.collection.api.query.Filter;
import org.onexus.collection.api.query.IQueryParser;
import org.onexus.collection.api.query.OrderBy;
import org.onexus.collection.api.query.Query;
import org.onexus.collection.api.utils.QueryUtils;
import org.onexus.resource.api.ORI;
import org.onexus.website.api.pages.browser.IEntitySelection;
import org.onexus.website.api.widgets.tableviewer.EntitiesRowProvider;
import org.onexus.website.api.widgets.tableviewer.HeadersToolbar;
import org.onexus.website.api.widgets.tableviewer.TableViewerStatus;
import org.onexus.website.api.widgets.tableviewer.columns.IColumnConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class TableFigurePanel extends Panel {
private static final Logger LOGGER = LoggerFactory.getLogger(TableFigurePanel.class);
private transient EntitiesRowProvider dataProvider;
private DataTable<IEntityTable, String> resultTable;
private static final IModel<TableViewerStatus> STATUS = new Model<TableViewerStatus>(new TableViewerStatus());
@Inject
private IQueryParser queryParser;
public TableFigurePanel(String id, ORI parentOri, IEntitySelection selection, TableFigureConfig config) {
super(id);
int limit = config.getLimit() == null ? Integer.MAX_VALUE : config.getLimit();
// Create data provider
dataProvider = new EntitiesRowProvider(
createQuery(parentOri, config, selection),
STATUS,
limit
);
// Create columns
List<IColumn<IEntityTable, String>> columns = new ArrayList<IColumn<IEntityTable, String>>();
for (IColumnConfig columnConfig : config.getColumns()) {
if (!Strings.isEqual("false", columnConfig.getVisible())) {
columnConfig.addColumns(columns, parentOri, false);
}
}
// Create table
resultTable = new DataTable<IEntityTable, String>("datatable", columns, dataProvider, limit) {
@Override
public boolean isVisible() {
//return (dataProvider == null ? false : dataProvider.getKnownSize() != 0);
return getItemCount() != 0;
}
};
resultTable.setOutputMarkupId(true);
resultTable.setVersioned(false);
resultTable.addTopToolbar(new HeadersToolbar(resultTable, dataProvider));
resultTable.addBottomToolbar(new NoRecordsToolbar(resultTable));
add(resultTable);
add(new Label("empty", config.getEmpty()) {
@Override
public boolean isVisible() {
//return (dataProvider == null ? false : dataProvider.getKnownSize() == 0);
return resultTable.getItemCount() == 0;
}
});
}
private Query createQuery(ORI parentOri, TableFigureConfig config, IEntitySelection selection) {
Query query = new Query();
query.setOn(parentOri);
if (config.getLimit() != null) {
query.setCount(config.getLimit());
}
String collectionAlias = QueryUtils.newCollectionAlias(query, config.getCollection());
query.setFrom(collectionAlias);
for (IColumnConfig column : config.getColumns()) {
column.buildQuery(query);
}
String oqlDefine = config.getDefine();
String oqlWhere = config.getWhere();
if (oqlDefine != null && oqlWhere != null) {
Map<String, ORI> define = queryParser.parseDefine(oqlDefine);
if (define == null) {
LOGGER.error("Malformed filter definition\n DEFINE: " + config.getDefine() + "\n");
} else {
for (Map.Entry<String, ORI> entry : define.entrySet()) {
String whereAlias = QueryUtils.newCollectionAlias(query, entry.getValue());
oqlWhere = oqlWhere.replaceAll(entry.getKey() + ".", whereAlias + ".");
}
Filter where = queryParser.parseWhere(oqlWhere);
QueryUtils.and(query, where);
if (where == null) {
LOGGER.error("Malformed figure-table WHERE: " + oqlWhere + "\n");
}
}
}
if (selection != null) {
Filter filter = selection.buildFilter(query);
QueryUtils.and(query, filter);
}
OrderBy orderWithCollection = config.getOrder();
if (orderWithCollection != null) {
ORI collectionUri = new ORI(orderWithCollection.getCollection()).toAbsolute(query.getOn());
collectionAlias = QueryUtils.newCollectionAlias(query, collectionUri);
OrderBy orderWithAlias = new OrderBy(collectionAlias, orderWithCollection.getField(), orderWithCollection.isAscendent());
query.addOrderBy(orderWithAlias);
}
return query;
}
@Override
protected void onAfterRender() {
super.onAfterRender();
if (dataProvider != null) {
dataProvider.close();
}
}
}