/*
* Copyright 2013 State University of New York at Oswego
*
* 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 edu.oswego.csc480_hci521_2013.client.presenters;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.web.bindery.event.shared.EventBus;
import com.google.web.bindery.event.shared.HandlerRegistration;
import edu.oswego.csc480_hci521_2013.client.events.RFGenerateEvent;
import edu.oswego.csc480_hci521_2013.client.events.RFParameterEvent;
import edu.oswego.csc480_hci521_2013.client.events.RFParameterEventHandler;
import edu.oswego.csc480_hci521_2013.client.events.RFProgressEvent;
import edu.oswego.csc480_hci521_2013.client.events.RFProgressEventHandler;
import edu.oswego.csc480_hci521_2013.client.events.TreeVisEvent;
import edu.oswego.csc480_hci521_2013.client.services.H2OServiceAsync;
import edu.oswego.csc480_hci521_2013.client.services.RFViewPoller;
import edu.oswego.csc480_hci521_2013.client.ui.DataPanelView;
import edu.oswego.csc480_hci521_2013.client.ui.RfParametersViewImpl;
import edu.oswego.csc480_hci521_2013.shared.h2o.json.Inspect;
import edu.oswego.csc480_hci521_2013.shared.h2o.json.RF;
import edu.oswego.csc480_hci521_2013.shared.h2o.json.RFView;
import edu.oswego.csc480_hci521_2013.shared.h2o.json.ResponseStatus;
import edu.oswego.csc480_hci521_2013.shared.h2o.urlbuilders.InspectBuilder;
import edu.oswego.csc480_hci521_2013.shared.h2o.urlbuilders.RFBuilder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
public class DataPanelPresenterImpl implements DataPanelPresenter, TabPanelPresenter {
static final Logger logger = Logger.getLogger(DataPanelPresenterImpl.class.getName());
EventBus eventbus;
DataPanelView view;
H2OServiceAsync h2oService;
String datakey;
RF randomForest;
Inspect data;
RfParametersPresenter popUp;
RFBuilder builder;
private List<HandlerRegistration> handlers = new ArrayList<HandlerRegistration>();
public DataPanelPresenterImpl(H2OServiceAsync service,
DataPanelView panelView, EventBus eventBus, String datakey,
Inspect data) {
this.eventbus = eventBus;
this.view = panelView;
this.h2oService = service;
this.datakey = datakey;
this.data = data;
view.setGenerateCommand(getGenerateCommand());
Set<String> colNames = new HashSet<String>();
for (Inspect.Column col : data.getCols()) {
colNames.add(col.getName());
}
view.setColumns(colNames);
// FIXME: This most likely will not return all rows, we need to implement paging
List<Map<String, String>> rowData = new ArrayList<Map<String, String>>();
for (Inspect.Row row : data.getRows()) {
Map<String, String> rowMap = new HashMap<String, String>();
rowData.add(rowMap);
for (Inspect.Column column : data.getCols()) {
rowMap.put(column.getName(), row.getData(column.getName()).toString());
}
}
view.setData(rowData);
bind();
}
@Override
public String getDataKey() {
return datakey;
}
@Override
public void added()
{
bind();
}
@Override
public void removed()
{
for (HandlerRegistration h: handlers) {
h.removeHandler();
}
handlers.clear();
}
private void bind() {
handlers.add(eventbus.addHandler(RFParameterEvent.TYPE, new RFParameterEventHandler() {
@Override
public void onParams(RFParameterEvent event) {
if (!event.getSource().equals(popUp)) {
return;
}
final RFBuilder builder = event.getBuilder();
h2oService.generateRandomForest(builder, new AsyncCallback<RF>() {
@Override
public void onFailure(Throwable thrwbl) {
logger.log(Level.SEVERE, thrwbl.toString());
popUp.getView().setError(thrwbl.getMessage());
}
@Override
public void onSuccess(RF rf) {
// TODO: this needs some sort of source to know it can from this presenter
// or we just get all events from all dialogs...
logger.log(Level.INFO, "Forest Started");
randomForest = rf;
eventbus.fireEvent(new RFGenerateEvent(rf, builder));
view.forestStarted();
new RFViewPoller(eventbus, h2oService, randomForest)
.start();
popUp.getView().hidePopup();
}
});
}
}));
}
ScheduledCommand getGenerateCommand() {
return new ScheduledCommand() {
@Override
public void execute() {
logger.log(Level.INFO, "Generating Forest");
popUp = new RfParametersPresenterImpl(datakey,
new RfParametersViewImpl(), eventbus, h2oService);
h2oService.getData(new InspectBuilder(datakey).setOffset(-1L),
new AsyncCallback<Inspect>() {
@Override
public void onFailure(final Throwable caught) {
logger.log(Level.SEVERE, caught.toString());
// FIXME: do a message box or something...
}
@Override
public void onSuccess(final Inspect result) {
logger.log(Level.INFO, "Headers received");
popUp.getView().setColumnInfo(result.getCols());
}
});
popUp.getView().showPopUp();
}
};
}
@Override
public DataPanelView getView() {
return view;
}
}