Skip to content

Commit

Permalink
#294 Refactor /process/start response
Browse files Browse the repository at this point in the history
  • Loading branch information
teosarca committed Apr 11, 2017
1 parent d72c3d9 commit b2832d3
Show file tree
Hide file tree
Showing 4 changed files with 251 additions and 150 deletions.
68 changes: 37 additions & 31 deletions src/main/java/de/metas/ui/web/process/ProcessInstance.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@
import de.metas.process.ProcessExecutionResult.RecordsToOpen;
import de.metas.process.ProcessExecutor;
import de.metas.process.ProcessInfo;
import de.metas.ui.web.process.ProcessInstanceResult.OpenReportAction;
import de.metas.ui.web.process.ProcessInstanceResult.OpenSingleDocument;
import de.metas.ui.web.process.ProcessInstanceResult.OpenViewAction;
import de.metas.ui.web.process.descriptor.ProcessDescriptor;
import de.metas.ui.web.process.exceptions.ProcessExecutionException;
import de.metas.ui.web.view.IDocumentViewSelection;
Expand Down Expand Up @@ -286,17 +289,43 @@ public ProcessInstanceResult startProcess()
.setAD_PInstance_ID(processExecutionResult.getAD_PInstance_ID())
.setSummary(summary)
.setError(processExecutionResult.isError());

//
// Result: report
final File reportTempFile = saveReportToDiskIfAny(processExecutionResult);
if (reportTempFile != null)
// Create result post process actions
{
resultBuilder.setReportData(processExecutionResult.getReportFilename(), processExecutionResult.getReportContentType(), reportTempFile);
}
final File reportTempFile = saveReportToDiskIfAny(processExecutionResult);
final RecordsToOpen recordsToOpen = processExecutionResult.getRecordsToOpen();

//
// Result: records to select
updateRecordsToOpen(resultBuilder, processExecutor.getProcessInfo(), processExecutionResult.getRecordsToOpen());
//
// Result: report
if (reportTempFile != null)
{
resultBuilder.setAction(OpenReportAction.builder()
.filename(processExecutionResult.getReportFilename())
.contentType(processExecutionResult.getReportContentType())
.tempFile(reportTempFile)
.build());
}
//
// View
else if (recordsToOpen != null && recordsToOpen.isGridView())
{
final IDocumentViewSelection view = createView(processExecutor.getProcessInfo(), recordsToOpen);
resultBuilder.setAction(OpenViewAction.builder()
.windowId(view.getAD_Window_ID())
.viewId(view.getViewId())
.build());
}
//
// Single document
else if (recordsToOpen != null && !recordsToOpen.isGridView())
{
final DocumentPath documentPath = extractSingleDocumentPath(recordsToOpen);
resultBuilder.setAction(OpenSingleDocument.builder()
.documentPath(documentPath)
.build());
}
}

//
final ProcessInstanceResult result = resultBuilder.build();
Expand Down Expand Up @@ -343,29 +372,6 @@ private static final File saveReportToDiskIfAny(final ProcessExecutionResult pro
return reportFile;
}

private void updateRecordsToOpen(final ProcessInstanceResult.Builder resultBuilder, final ProcessInfo processInfo, final RecordsToOpen recordsToOpen)
{
if (recordsToOpen == null)
{
return;
}
//
// View
else if (recordsToOpen.isGridView())
{
final IDocumentViewSelection view = createView(processInfo, recordsToOpen);
resultBuilder.openView(view.getAD_Window_ID(), view.getViewId());
}
//
// Single document
else
{
final DocumentPath documentPath = extractSingleDocumentPath(recordsToOpen);
resultBuilder.openSingleDocument(documentPath);
}

}

private final IDocumentViewSelection createView(final ProcessInfo processInfo, final RecordsToOpen recordsToOpen)
{
final List<TableRecordReference> recordRefs = recordsToOpen.getRecords();
Expand Down
149 changes: 63 additions & 86 deletions src/main/java/de/metas/ui/web/process/ProcessInstanceResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,11 @@

import com.google.common.base.MoreObjects;

import de.metas.printing.esb.base.util.Check;
import de.metas.ui.web.window.datatypes.DocumentPath;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;

/*
* #%L
Expand Down Expand Up @@ -46,17 +49,7 @@ public static final Builder builder()
private final int adPInstanceId;
private final String summary;
private final boolean error;

// Report to open (optional)
private final String reportFilename;
private final String reportContentType;
private final File reportTempFile;

// View or single document to open (optional)
private final int openViewWindowId;
private final String openViewId;
//
private final DocumentPath openSingleDocumentPath;
private final ResultAction action;

private ProcessInstanceResult(final Builder builder)
{
Expand All @@ -65,13 +58,7 @@ private ProcessInstanceResult(final Builder builder)
summary = builder.summary;
error = builder.error;

reportFilename = builder.reportFilename;
reportContentType = builder.reportContentType;
reportTempFile = builder.reportTempFile;

openViewWindowId = builder.openViewWindowId;
openViewId = builder.openViewId;
openSingleDocumentPath = builder.openSingleDocumentPath;
action = builder.action;
}

@Override
Expand All @@ -82,15 +69,7 @@ public String toString()
.add("adPInstanceId", adPInstanceId)
.add("summary", summary)
.add("error", error)
//
.add("reportFilename", reportFilename)
.add("reportContentType", reportContentType)
.add("reportTempFile", reportTempFile)
//
.add("openViewWindowId", openViewWindowId > 0 ? openViewWindowId : null)
.add("openViewId", openViewId)
.add("openSingleDocumentPath", openSingleDocumentPath)
//
.add("action", action)
.toString();
}

Expand All @@ -114,34 +93,75 @@ public boolean isError()
return error;
}

public String getReportFilename()
/** @return action or null */
public ResultAction getAction()
{
return reportFilename;
return action;
}

public String getReportContentType()
/** @return action of given type; never returns null */
public <T extends ResultAction> T getAction(final Class<T> actionType)
{
return reportContentType;
final ResultAction action = getAction();
if (action == null)
{
throw new IllegalStateException("No action defined");
}
if (!actionType.isAssignableFrom(action.getClass()))
{
throw new IllegalStateException("Action is not of type " + actionType + " but " + action.getClass());
}
@SuppressWarnings("unchecked")
final T actionCasted = (T)action;
return actionCasted;
}

public byte[] getReportData()
//
//
//
//
//

/** Base interface for all post-process actions */
public static interface ResultAction
{
return Util.readBytes(reportTempFile);
}

public int getOpenViewWindowId()
@lombok.Value
@lombok.Builder
public static final class OpenReportAction implements ResultAction
{
return openViewWindowId;
@NonNull
private final String filename;
@NonNull
private final String contentType;
@NonNull
@Setter(AccessLevel.NONE)
@Getter(AccessLevel.NONE)
private final File tempFile;

public byte[] getReportData()
{
return Util.readBytes(tempFile);
}

}

public String getOpenViewId()
@lombok.Value
@lombok.Builder
public static final class OpenViewAction implements ResultAction
{
return openViewId;
private final int windowId;
@NonNull
private final String viewId;
}

public DocumentPath getOpenSingleDocumentPath()
@lombok.Value
@lombok.Builder
public static final class OpenSingleDocument implements ResultAction
{
return openSingleDocumentPath;
@NonNull
private final DocumentPath documentPath;
}

public static final class Builder
Expand All @@ -150,16 +170,7 @@ public static final class Builder
private String summary;
private boolean error;

// Report to open (optional)
private String reportFilename;
private String reportContentType;
private File reportTempFile;

// View or single document to open (optional)
private int openViewWindowId;
private String openViewId;
//
private DocumentPath openSingleDocumentPath;
private ResultAction action;

private Builder()
{
Expand Down Expand Up @@ -189,43 +200,9 @@ public Builder setError(final boolean error)
return this;
}

public Builder setReportData(final String reportFileName, final String reportContentType, final File reportTempFile)
{
reportFilename = reportFileName;
this.reportContentType = reportContentType;
this.reportTempFile = reportTempFile;
return this;
}

public Builder openView(final int viewWindowId, final String viewId)
public Builder setAction(final ResultAction action)
{
if (viewWindowId > 0)
{
openViewWindowId = viewWindowId;

Check.assumeNotEmpty(viewId, "viewId is not empty");
openViewId = viewId;
}
else
{
openViewWindowId = -1;
openViewId = null;
}

// reset the single document to open
openSingleDocumentPath = null;

return this;
}

public Builder openSingleDocument(final DocumentPath documentPath)
{
openSingleDocumentPath = documentPath;

// reset the view to open
openViewWindowId = -1;
openViewId = null;

this.action = action;
return this;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import org.springframework.web.bind.annotation.RestController;

import de.metas.ui.web.config.WebConfig;
import de.metas.ui.web.process.ProcessInstanceResult.OpenReportAction;
import de.metas.ui.web.process.descriptor.ProcessLayout;
import de.metas.ui.web.process.json.JSONCreateProcessInstanceRequest;
import de.metas.ui.web.process.json.JSONProcessInstance;
Expand Down Expand Up @@ -159,9 +160,10 @@ public ResponseEntity<byte[]> getReport(
{
final ProcessInstanceResult executionResult = instancesRepository.forProcessInstanceReadonly(pinstanceId, processInstance -> processInstance.getExecutionResult());

final String reportFilename = executionResult.getReportFilename();
final String reportContentType = executionResult.getReportContentType();
final byte[] reportData = executionResult.getReportData();
final OpenReportAction action = executionResult.getAction(OpenReportAction.class);
final String reportFilename = action.getFilename();
final String reportContentType = action.getContentType();
final byte[] reportData = action.getReportData();

final String reportFilenameEffective = Util.coalesce(filename, reportFilename, "");

Expand Down
Loading

0 comments on commit b2832d3

Please sign in to comment.