/*
* Copyright 2014 Red Hat, Inc. and/or its affiliates.
*
* 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.guvnor.m2repo.client.widgets;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.enterprise.context.Dependent;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import com.google.gwt.user.cellview.client.ColumnSortList;
import com.google.gwt.view.client.AsyncDataProvider;
import com.google.gwt.view.client.HasData;
import com.google.gwt.view.client.Range;
import org.guvnor.m2repo.model.JarListPageRequest;
import org.guvnor.m2repo.model.JarListPageRow;
import org.guvnor.m2repo.service.M2RepoService;
import org.jboss.errai.common.client.api.Caller;
import org.jboss.errai.common.client.api.RemoteCallback;
import org.uberfire.commons.validation.PortablePreconditions;
import org.uberfire.paging.PageResponse;
import org.uberfire.workbench.events.NotificationEvent;
@Dependent
public class ArtifactListPresenterImpl
implements ArtifactListPresenter {
static final boolean DEFAULT_ORDER_ASCENDING = true;
private final ArtifactListView view;
private final Caller<M2RepoService> m2RepoService;
private final Event<NotificationEvent> notification;
RefreshableAsyncDataProvider dataProvider;
private boolean notify = true;
@Inject
public ArtifactListPresenterImpl( ArtifactListView view,
Caller<M2RepoService> m2RepoService,
Event<NotificationEvent> notification ) {
this.view = view;
this.m2RepoService = m2RepoService;
this.notification = notification;
}
@PostConstruct
public void init() {
view.init( this );
dataProvider = new RefreshableAsyncDataProvider( view, m2RepoService );
}
@Override
public ArtifactListView getView() {
return view;
}
@Override
public void setup( final ColumnType... columns ) {
view.setup( columns );
}
@Override
public void notifyOnRefresh( final boolean notify ) {
this.notify = notify;
}
@Override
public void refresh() {
dataProvider.refresh();
if ( notify ) {
notification.fire( new NotificationEvent( view.getRefreshNotificationMessage() ) );
}
}
@Override
public void search( final String filter ) {
search( filter, null );
}
@Override
public void search( final String filter,
final List<String> fileFormats ) {
dataProvider.setFilter( filter );
dataProvider.setFileFormats( fileFormats );
if ( dataProvider.getDataDisplays().isEmpty() ) {
dataProvider.addDataDisplay( view.getDisplay() );
} else {
dataProvider.goToFirstPage();
}
if ( notify ) {
notification.fire( new NotificationEvent( view.getRefreshNotificationMessage() ) );
}
}
@Override
public void onOpenPom( String path ) {
m2RepoService.call( new RemoteCallback<String>() {
@Override
public void callback( final String response ) {
view.showPom( response );
}
} ).getPomText( path );
}
/**
* Extension to AsyncDataProvider that supports refreshing the table.
*/
static class RefreshableAsyncDataProvider extends AsyncDataProvider<JarListPageRow> {
private final ArtifactListView view;
private final Caller<M2RepoService> m2RepoService;
private String filter;
private List<String> fileFormats;
protected RefreshableAsyncDataProvider( final ArtifactListView view,
final Caller<M2RepoService> m2RepoService ) {
this.view = PortablePreconditions.checkNotNull( "view",
view );
this.m2RepoService = PortablePreconditions.checkNotNull( "m2RepoService",
m2RepoService );
}
protected void setFilter( String filter ) {
this.filter = filter;
}
protected void setFileFormats( List<String> fileFormats ) {
this.fileFormats = fileFormats;
}
protected void goToFirstPage() {
for ( HasData<JarListPageRow> display : getDataDisplays() ) {
boolean wasOnFirstPage = ( display.getVisibleRange().getStart() == 0 );
display.setVisibleRange( 0, display.getVisibleRange().getLength() );
if ( wasOnFirstPage ) {
onRangeChanged( display );
}
}
}
protected void refresh() {
for ( HasData<JarListPageRow> display : getDataDisplays() ) {
onRangeChanged( display );
}
}
@Override
protected void onRangeChanged( HasData<JarListPageRow> display ) {
final Range range = display.getVisibleRange();
JarListPageRequest request = new JarListPageRequest( range.getStart(),
range.getLength(),
filter,
fileFormats,
getSortColumnDataStoreName(),
isSortColumnAscending() );
m2RepoService.call( new RemoteCallback<PageResponse<JarListPageRow>>() {
@Override
public void callback( final PageResponse<JarListPageRow> response ) {
updateRowCount( response.getTotalRowSize(),
response.isTotalRowSizeExact() );
updateRowData( response.getStartRowIndex(),
response.getPageRowList() );
}
} ).listArtifacts( request );
}
private String getSortColumnDataStoreName() {
final ColumnSortList columnSortList = view.getColumnSortList();
return ( columnSortList == null || columnSortList.size() == 0 ) ? null : columnSortList.get( 0 ).getColumn().getDataStoreName();
}
private boolean isSortColumnAscending() {
final ColumnSortList columnSortList = view.getColumnSortList();
return ( columnSortList == null || columnSortList.size() == 0 ) ? DEFAULT_ORDER_ASCENDING : columnSortList.get( 0 ).isAscending();
}
}
}