package org.pentaho.platform.dataaccess.datasource.modeler;
import com.google.gwt.core.client.GWT;
import org.pentaho.agilebi.modeler.*;
import org.pentaho.agilebi.modeler.gwt.BogoPojo;
import org.pentaho.agilebi.modeler.gwt.GwtModelerMessages;
import org.pentaho.agilebi.modeler.gwt.GwtModelerWorkspaceHelper;
import org.pentaho.agilebi.modeler.services.IModelerServiceAsync;
import org.pentaho.agilebi.modeler.services.impl.GwtModelerServiceImpl;
import org.pentaho.gwt.widgets.client.utils.i18n.ResourceBundle;
import org.pentaho.metadata.model.Domain;
import org.pentaho.platform.dataaccess.datasource.wizard.EmbeddedWizard;
import org.pentaho.platform.dataaccess.datasource.wizard.service.IXulAsyncConnectionService;
import org.pentaho.platform.dataaccess.datasource.wizard.service.IXulAsyncDatasourceService;
import org.pentaho.platform.dataaccess.datasource.wizard.service.gwt.ICsvDatasourceService;
import org.pentaho.platform.dataaccess.datasource.wizard.service.gwt.ICsvDatasourceServiceAsync;
import org.pentaho.platform.dataaccess.datasource.wizard.service.impl.ConnectionServiceGwtImpl;
import org.pentaho.platform.dataaccess.datasource.wizard.service.impl.DatasourceServiceGwtImpl;
import org.pentaho.ui.xul.XulDomContainer;
import org.pentaho.ui.xul.XulServiceCallback;
import org.pentaho.ui.xul.binding.Binding;
import org.pentaho.ui.xul.binding.BindingConvertor;
import org.pentaho.ui.xul.binding.BindingFactory;
import org.pentaho.ui.xul.components.XulLabel;
import org.pentaho.ui.xul.containers.XulDialog;
import org.pentaho.ui.xul.gwt.GwtXulRunner;
import org.pentaho.ui.xul.gwt.binding.GwtBindingFactory;
import org.pentaho.ui.xul.gwt.util.AsyncConstructorListener;
import org.pentaho.ui.xul.gwt.util.AsyncXulLoader;
import org.pentaho.ui.xul.gwt.util.IXulLoaderCallback;
import org.pentaho.ui.xul.stereotype.Bindable;
import org.pentaho.ui.xul.util.AbstractXulDialogController;
/**
* User: nbaker
* Date: Aug 10, 2010
*/
public class ModelerDialog extends AbstractXulDialogController<Domain> implements IXulLoaderCallback {
private XulDomContainer container;
private DialogListener<Domain> listener;
private IModelerServiceAsync service = new GwtModelerServiceImpl();
private ModelerWorkspace model = new ModelerWorkspace(new GwtModelerWorkspaceHelper());
private ModelerController controller;
private IModelerMessages messages;
private XulDialog errorDialog;
private XulDialog waitDialog;
private EmbeddedWizard wizard;
private ModelerDialog modeler;
private IXulAsyncConnectionService connectionService;
private IXulAsyncDatasourceService datasourceService;
private ICsvDatasourceServiceAsync csvService;
private AsyncConstructorListener constructorListener;
private static ModelerDialog instance;
private ModelerDialog(final AsyncConstructorListener<ModelerDialog> constructorListener){
this(null, constructorListener);
}
private ModelerDialog(EmbeddedWizard wizard, final AsyncConstructorListener<ModelerDialog> constructorListener){
this.wizard = wizard;
this.constructorListener = constructorListener;
AsyncXulLoader.loadXulFromUrl("modeler.xul", "modeler", this);
}
public static ModelerDialog getInstance(final AsyncConstructorListener<ModelerDialog> constructorListener){
if(instance != null){
constructorListener.asyncConstructorDone(instance);
return instance;
}
instance = new ModelerDialog(constructorListener);
return instance;
}
public static ModelerDialog getInstance(EmbeddedWizard wizard, final AsyncConstructorListener<ModelerDialog> constructorListener){
if(instance != null){
constructorListener.asyncConstructorDone(instance);
return instance;
}
instance = new ModelerDialog(wizard, constructorListener);
return instance;
}
@Override
protected XulDialog getDialog() {
return (XulDialog) container.getDocumentRoot().getElementById("modeler_dialog");
}
@Override
protected Domain getDialogResult() {
return null;
}
@Bindable
public void onAccept(){
enableWaitCursor(true);
try {
model.getWorkspaceHelper().populateDomain(model);
} catch (ModelerException e) {
e.printStackTrace();
showErrorDialog(messages.getString("ModelEditor.ERROR"),
messages.getString("ModelEditor.ERROR_0001_SAVING_MODELS"));
}
boolean doOlap = true;
if(model.getDomain().getLogicalModels().get(0).getProperty("MondrianCatalogRef") == null){
doOlap = false;
}
service.serializeModels(model.getDomain(), model.getModelName(), doOlap, new XulServiceCallback<String>(){
public void success(String retVal) {
enableWaitCursor(false);
hideDialog();
model.getDomain().setId(retVal);
ModelerDialog.this.listener.onDialogAccept(model.getDomain());
}
public void error(String message, Throwable error) {
enableWaitCursor(false);
showErrorDialog(messages.getString("ModelEditor.ERROR"),
messages.getString("ModelEditor.ERROR_0001_SAVING_MODELS"));
}
});
}
protected void showErrorDialog(String title, String message) {
errorDialog = (XulDialog) container.getDocumentRoot().getElementById("errorDialog");
XulLabel errorLabel = (XulLabel) container.getDocumentRoot().getElementById("errorLabel");
errorDialog.setTitle(title);
errorLabel.setValue(message);
errorDialog.show();
}
@Bindable
public void onLoad(){
}
public void xulLoaded(GwtXulRunner gwtXulRunner) {
container = gwtXulRunner.getXulDomContainers().get(0);
container.addEventHandler(this);
BogoPojo bogo = new BogoPojo();
service.gwtWorkaround(bogo, new XulServiceCallback<BogoPojo>(){
public void success(BogoPojo retVal) {
}
public void error(String message, Throwable error) {
}
});
datasourceService = new DatasourceServiceGwtImpl();
connectionService = new ConnectionServiceGwtImpl();
csvService = (ICsvDatasourceServiceAsync) GWT.create(ICsvDatasourceService.class);
if(wizard == null){
wizard = new EmbeddedWizard(false);
wizard.setDatasourceService(datasourceService);
wizard.setConnectionService(connectionService);
wizard.setCsvDatasourceService(csvService);
wizard.init(null);
}
messages = new GwtModelerMessages((ResourceBundle) container.getResourceBundles().get(0));
try{
ModelerMessagesHolder.setMessages(messages);
} catch(Exception ignored){
// Messages may have been set earlier, ignore.
}
IModelerWorkspaceHelper workspacehelper = model.getWorkspaceHelper();
controller = new ModelerController(model);
controller.setWorkspaceHelper(workspacehelper);
// controller.setMessages(messages);
BindingFactory bf = new GwtBindingFactory(container.getDocumentRoot());
controller.setBindingFactory(bf);
container.addEventHandler(controller);
try{
controller.init();
} catch(ModelerException e){
e.printStackTrace();
}
bf.setBindingType(Binding.Type.ONE_WAY);
bf.createBinding(model, "valid", "modeler_dialog_accept", "disabled", new BindingConvertor<Boolean, Boolean>(){
@Override
public Boolean sourceToTarget(Boolean value) {
return !value;
}
@Override
public Boolean targetToSource(Boolean value) {
return !value;
}
});
bf.setBindingType(Binding.Type.BI_DIRECTIONAL);
ModelerUiHelper.configureControllers(container, model, bf, controller, new ColResolverController());
waitDialog = (XulDialog) document.getElementById("waitingDialog");
this.constructorListener.asyncConstructorDone(this);
}
public void overlayLoaded() {
}
public void overlayRemoved() {
}
public void showDialog(Domain domain) {
enableWaitCursor(true);
model.setDomain(domain);
controller.setModelerPerspective(ModelerPerspective.REPORTING);
controller.resetPropertyForm();
showDialog();
enableWaitCursor(false);
}
public void showDialog(String domainId, String modelId) {
showDialog(domainId, modelId, ModelerPerspective.REPORTING);
}
public void showDialog(String domainId, String modelId, final ModelerPerspective modelerPerspective) {
enableWaitCursor(true);
service.loadDomain(domainId, new XulServiceCallback<Domain>(){
public void success(Domain retVal) {
model.setDomain(retVal);
controller.setModelerPerspective(modelerPerspective);
controller.resetPropertyForm();
enableWaitCursor(false);
showDialog();
}
public void error(String message, Throwable error) {
enableWaitCursor(false);
showErrorDialog(messages.getString("ModelEditor.ERROR"),
messages.getString("ModelEditor.ERROR_0002_LOADING_DOMAIN"));
}
});
}
private void enableWaitCursor(final boolean enable) {
if (enable) {
waitDialog.show();
} else {
waitDialog.hide();
}
}
@Override
public String getName() {
return "modelerDialogController";
}
@Bindable
public void closeErrorDialog(){
errorDialog.hide();
}
@Bindable
public void onCancel(){
hideDialog();
ModelerDialog.this.listener.onDialogAccept(model.getDomain());
}
@Bindable
public void onEditSource() {
showEditSourceDialog();
}
public void showEditSourceDialog() {
wizard.showEditDialog(model.getDomain(), new DialogListener<Domain>() {
@Override
public void onDialogAccept(Domain domain) {
try {
model.refresh(domain);
} catch (ModelerException e) {
showErrorDialog("Error", e.getMessage());
}
}
@Override
public void onDialogCancel() {
//To change body of implemented methods use File | Settings | File Templates.
}
@Override
public void onDialogReady() {
}
});
}
/**
* Specified by <code>DialogController</code>.
*/
public void addDialogListener(org.pentaho.ui.xul.util.DialogController.DialogListener<Domain> listener) {
// checkInitialized();
super.addDialogListener(listener);
this.listener = listener;
listener.onDialogReady();
}
}