package org.pentaho.platform.dataaccess.datasource.wizard.sources.csv; import java.util.ArrayList; import java.util.List; import org.pentaho.metadata.model.Domain; import org.pentaho.platform.dataaccess.datasource.beans.BogoPojo; import org.pentaho.platform.dataaccess.datasource.wizard.IDatasourceSummary; import org.pentaho.platform.dataaccess.datasource.wizard.IWizardDatasource; import org.pentaho.platform.dataaccess.datasource.wizard.IWizardStep; import org.pentaho.platform.dataaccess.datasource.wizard.controllers.MessageHandler; import org.pentaho.platform.dataaccess.datasource.wizard.models.ColumnInfo; import org.pentaho.platform.dataaccess.datasource.wizard.models.CsvTransformGeneratorException; import org.pentaho.platform.dataaccess.datasource.wizard.models.DatasourceDTO; import org.pentaho.platform.dataaccess.datasource.wizard.models.DatasourceDTOUtil; import org.pentaho.platform.dataaccess.datasource.wizard.models.DatasourceModel; import org.pentaho.platform.dataaccess.datasource.wizard.models.IWizardModel; import org.pentaho.platform.dataaccess.datasource.wizard.service.IXulAsyncDatasourceService; import org.pentaho.platform.dataaccess.datasource.wizard.service.gwt.ICsvDatasourceServiceAsync; import org.pentaho.ui.xul.XulDomContainer; import org.pentaho.ui.xul.XulException; import org.pentaho.ui.xul.XulServiceCallback; import org.pentaho.ui.xul.binding.BindingFactory; import org.pentaho.ui.xul.gwt.binding.GwtBindingFactory; import org.pentaho.ui.xul.impl.AbstractXulEventHandler; import org.pentaho.ui.xul.stereotype.Bindable; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.rpc.ServiceDefTarget; /** * User: nbaker * Date: 3/22/11 */ public class CsvDatasource extends AbstractXulEventHandler implements IWizardDatasource { private ICsvDatasourceServiceAsync csvDatasourceService; private DatasourceModel datasourceModel; private MessageHandler handler; public FileTransformStats stats; private StageDataStep stageStep; private CsvPhysicalStep csvStep; private DatasourceModel model; private BindingFactory bindingFactory; private XulDomContainer container; private boolean finishable; private IXulAsyncDatasourceService datasourceService; private IWizardModel wizardModel; public CsvDatasource(DatasourceModel datasourceModel, IXulAsyncDatasourceService datasourceService, ICsvDatasourceServiceAsync csvDatasourceService){ this.datasourceModel = datasourceModel; this.datasourceService = datasourceService; this.csvDatasourceService = csvDatasourceService; ServiceDefTarget endpoint = (ServiceDefTarget) this.csvDatasourceService; endpoint.setServiceEntryPoint(getDatasourceURL()); csvStep = new CsvPhysicalStep(datasourceModel, this, csvDatasourceService); stageStep = new StageDataStep(datasourceModel, this, csvDatasourceService); csvDatasourceService.gwtWorkaround(new BogoPojo(), new AsyncCallback<BogoPojo>(){ @Override public void onFailure(Throwable throwable) { } @Override public void onSuccess(BogoPojo bogoPojo) { bogoPojo.getAggType(); } }); } public String getDatasourceURL(){ String moduleUrl = GWT.getModuleBaseURL(); if (moduleUrl.indexOf("content") > -1) {//$NON-NLS-1$ //we are running the client in the context of a BI Server plugin, so //point the request to the GWT rpc proxy servlet String baseUrl = moduleUrl.substring(0, moduleUrl.indexOf("content"));//$NON-NLS-1$ //NOTE: the dispatch URL ("connectionService") must match the bean id for //this service object in your plugin.xml. "gwtrpc" is the servlet //that handles plugin gwt rpc requests in the BI Server. return baseUrl + "gwtrpc/CsvDatasourceService";//$NON-NLS-1$ } //we are running this client in hosted mode, so point to the servlet //defined in war/WEB-INF/web.xml return moduleUrl + "CsvDatasourceService";//$NON-NLS-1$ } @Override public void activating() throws XulException { csvStep.activating(); stageStep.activating(); } @Override public void deactivating() { csvStep.deactivate(); stageStep.deactivate(); } @Override public void init(XulDomContainer container, IWizardModel wizardModel) throws XulException { this.wizardModel = wizardModel; bindingFactory = new GwtBindingFactory(document); container.addEventHandler(csvStep); container.addEventHandler(stageStep); csvStep.init(wizardModel); stageStep.init(wizardModel); } @Override @Bindable public String getName() { return "CSV File"; //TODO: i18n } @Override public List<IWizardStep> getSteps() { List<IWizardStep> steps = new ArrayList<IWizardStep>(); steps.add(csvStep); steps.add(stageStep); return steps; } @Override public void onFinish(final XulServiceCallback<IDatasourceSummary> callback) { datasourceModel.getGuiStateModel().setDataStagingComplete(false); setColumnIdsToColumnNames(); String name = datasourceModel.getDatasourceName().replace(".", "_").replace(" ", "_"); // set the modelInfo.stageTableName to the database table name generated from the datasourceName datasourceModel.getModelInfo().setStageTableName(datasourceModel.generateTableName()); String tmpFileName = datasourceModel.getModelInfo().getFileInfo().getTmpFilename(); String fileName = datasourceModel.getModelInfo().getFileInfo().getFilename(); if(fileName == null && tmpFileName != null && tmpFileName.endsWith(".tmp")) { tmpFileName = tmpFileName.substring(0, tmpFileName.lastIndexOf(".tmp")); datasourceModel.getModelInfo().getFileInfo().setFilename(tmpFileName); } datasourceModel.getModelInfo().setDatasourceName(datasourceModel.getDatasourceName()); csvDatasourceService.generateDomain(DatasourceDTOUtil.generateDTO(datasourceModel), new AsyncCallback<IDatasourceSummary>(){ public void onFailure(Throwable th) { MessageHandler.getInstance().closeWaitingDialog(); if (th instanceof CsvTransformGeneratorException) { MessageHandler.getInstance().showErrorDetailsDialog(MessageHandler.getString("ERROR"), th.getMessage(), ((CsvTransformGeneratorException)th).getCauseMessage() + ((CsvTransformGeneratorException)th).getCauseStackTrace()); } else { MessageHandler.getInstance().showErrorDialog(MessageHandler.getString("ERROR"), th.getMessage()); } th.printStackTrace(); } public void onSuccess(IDatasourceSummary stats) { CsvDatasource.this.stats = (FileTransformStats) stats; MessageHandler.getInstance().closeWaitingDialog(); callback.success(stats); } }); } private void setColumnIdsToColumnNames() { for (ColumnInfo ci : datasourceModel.getModelInfo().getColumns()) { ci.setId(ci.getTitle()); } } @Override public String getId() { return "CSV"; } @Override public boolean isFinishable() { return finishable; } public void setFinishable(boolean finishable){ boolean prevFinishable = this.finishable; this.finishable = finishable; firePropertyChange("finishable", prevFinishable, finishable); } @Override public void restoreSavedDatasource(Domain previousDomain, final XulServiceCallback<Void> callback) { String serializedDatasource = (String) previousDomain.getLogicalModels().get(0).getProperty("datasourceModel"); datasourceService.deSerializeModelState(serializedDatasource, new XulServiceCallback<DatasourceDTO>() { public void success(DatasourceDTO datasourceDTO) { DatasourceDTO.populateModel(datasourceDTO, datasourceModel); datasourceModel.getGuiStateModel().setDirty(false); wizardModel.setEditing(true); callback.success(null); } public void error(String s, Throwable throwable) { MessageHandler.getInstance().showErrorDialog(MessageHandler.getString("ERROR"), MessageHandler.getString( "DatasourceEditor.ERROR_0002_UNABLE_TO_SHOW_DIALOG", throwable.getLocalizedMessage())); callback.error(s, throwable); } }); } @Override public void reset() { datasourceModel.clearModel(); } }