de.metas.ui.web.handlingunits.report.HUReportProcessInstance.java Source code

Java tutorial

Introduction

Here is the source code for de.metas.ui.web.handlingunits.report.HUReportProcessInstance.java

Source

package de.metas.ui.web.handlingunits.report;

import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;

import org.adempiere.exceptions.AdempiereException;
import org.adempiere.util.lang.IAutoCloseable;

import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;

import de.metas.handlingunits.report.HUReportExecutor;
import de.metas.handlingunits.report.HUReportExecutorResult;
import de.metas.handlingunits.report.HUReportService;
import de.metas.handlingunits.report.HUToReport;
import de.metas.printing.esb.base.util.Check;
import de.metas.ui.web.handlingunits.HUEditorRow;
import de.metas.ui.web.handlingunits.HUEditorView;
import de.metas.ui.web.process.IProcessInstanceController;
import de.metas.ui.web.process.IProcessInstanceParameter;
import de.metas.ui.web.process.ProcessExecutionContext;
import de.metas.ui.web.process.ProcessInstanceResult;
import de.metas.ui.web.process.adprocess.ADProcessPostProcessRequest;
import de.metas.ui.web.process.adprocess.ADProcessPostProcessService;
import de.metas.ui.web.process.adprocess.DocumentFieldAsProcessInstanceParameter;
import de.metas.ui.web.view.IViewsRepository;
import de.metas.ui.web.view.ViewId;
import de.metas.ui.web.view.ViewRowIdsSelection;
import de.metas.ui.web.window.datatypes.DocumentId;
import de.metas.ui.web.window.datatypes.LookupValuesList;
import de.metas.ui.web.window.datatypes.json.JSONDocumentChangedEvent;
import de.metas.ui.web.window.model.Document;
import de.metas.ui.web.window.model.Document.CopyMode;
import de.metas.ui.web.window.model.DocumentCollection;
import de.metas.ui.web.window.model.IDocumentChangesCollector;
import de.metas.ui.web.window.model.IDocumentChangesCollector.ReasonSupplier;
import de.metas.ui.web.window.model.NullDocumentChangesCollector;
import lombok.Builder;
import lombok.NonNull;

/*
 * #%L
 * metasfresh-webui-api
 * %%
 * Copyright (C) 2018 metas GmbH
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public
 * License along with this program. If not, see
 * <http://www.gnu.org/licenses/gpl-2.0.html>.
 * #L%
 */

final class HUReportProcessInstance implements IProcessInstanceController {
    public static final String PARAM_Copies = "Copies";

    private final DocumentId instanceId;
    private final ViewRowIdsSelection viewRowIdsSelection;
    private final int reportADProcessId;
    private final Document parameters;

    private ProcessInstanceResult lastExecutionResult;

    private final ReentrantReadWriteLock readwriteLock;

    @Builder
    private HUReportProcessInstance(@NonNull final DocumentId instanceId,
            @NonNull final ViewRowIdsSelection viewRowIdsSelection, final int reportADProcessId,
            @NonNull final Document parameters) {
        Check.assume(reportADProcessId > 0, "reportADProcessId > 0");

        this.instanceId = instanceId;
        this.viewRowIdsSelection = viewRowIdsSelection;
        this.reportADProcessId = reportADProcessId;
        this.parameters = parameters;

        lastExecutionResult = null;

        readwriteLock = new ReentrantReadWriteLock();
    }

    private HUReportProcessInstance(final HUReportProcessInstance from, final CopyMode copyMode,
            final IDocumentChangesCollector changesCollector) {
        instanceId = from.instanceId;
        viewRowIdsSelection = from.viewRowIdsSelection;
        reportADProcessId = from.reportADProcessId;
        parameters = from.parameters.copy(copyMode, changesCollector);

        lastExecutionResult = from.lastExecutionResult;

        readwriteLock = from.readwriteLock; // always share
    }

    public HUReportProcessInstance copyReadonly() {
        return new HUReportProcessInstance(this, CopyMode.CheckInReadonly, NullDocumentChangesCollector.instance);
    }

    public HUReportProcessInstance copyReadWrite(final IDocumentChangesCollector changesCollector) {
        return new HUReportProcessInstance(this, CopyMode.CheckOutWritable, changesCollector);
    }

    /* package */ final IAutoCloseable lockForReading() {
        final ReadLock readLock = readwriteLock.readLock();
        readLock.lock();
        return readLock::unlock;
    }

    /* package */ final IAutoCloseable lockForWriting() {
        final WriteLock writeLock = readwriteLock.writeLock();
        writeLock.lock();
        return writeLock::unlock;
    }

    @Override
    public DocumentId getInstanceId() {
        return instanceId;
    }

    @Override
    public synchronized ProcessInstanceResult startProcess(@NonNull final ProcessExecutionContext context) {
        final int numberOfCopies = getCopies();
        if (numberOfCopies <= 0) {
            throw new AdempiereException("@" + PARAM_Copies + "@ > 0");
        }

        final IViewsRepository viewsRepo = context.getViewsRepo();
        final DocumentCollection documentsCollection = context.getDocumentsCollection();

        final ViewId viewId = viewRowIdsSelection.getViewId();
        final HUEditorView view = HUEditorView.cast(viewsRepo.getView(viewId));
        final HUReportExecutorResult reportExecutorResult = HUReportExecutor.newInstance(context.getCtx())
                .numberOfCopies(numberOfCopies).printPreview(true)
                .executeNow(reportADProcessId, extractHUsToReport(view));

        final ADProcessPostProcessService postProcessService = ADProcessPostProcessService.builder()
                .viewsRepo(viewsRepo).documentsCollection(documentsCollection).build();
        final ProcessInstanceResult result = postProcessService.postProcess(ADProcessPostProcessRequest.builder()
                .viewId(viewId).processInfo(reportExecutorResult.getProcessInfo())
                .processExecutionResult(reportExecutorResult.getProcessExecutionResult())
                .instanceIdOverride(instanceId).build());

        return lastExecutionResult = result;
    }

    private List<HUToReport> extractHUsToReport(final HUEditorView view) {
        final Set<HUToReport> husToCheck = view.streamByIds(viewRowIdsSelection.getRowIds())
                .map(HUEditorRow::getAsHUToReportOrNull).filter(Predicates.notNull())
                .collect(ImmutableSet.toImmutableSet());

        return HUReportService.get().getHUsToProcess(husToCheck);
    }

    @Override
    public synchronized ProcessInstanceResult getExecutionResult() {
        return lastExecutionResult;
    }

    @Override
    public Collection<IProcessInstanceParameter> getParameters() {
        return parameters.getFieldViews().stream().map(DocumentFieldAsProcessInstanceParameter::of)
                .collect(ImmutableList.toImmutableList());
    }

    @Override
    public LookupValuesList getParameterLookupValues(final String parameterName) {
        return parameters.getFieldLookupValues(parameterName);
    }

    @Override
    public LookupValuesList getParameterLookupValuesForQuery(final String parameterName, final String query) {
        return parameters.getFieldLookupValuesForQuery(parameterName, query);
    }

    @Override
    public void processParameterValueChanges(final List<JSONDocumentChangedEvent> events,
            final ReasonSupplier reason) {
        parameters.processValueChanges(events, reason);
    }

    public void setCopies(final int copies) {
        parameters.processValueChange(PARAM_Copies, copies, ReasonSupplier.NONE);
    }

    public int getCopies() {
        return parameters.getFieldView(PARAM_Copies).getValueAsInt(0);
    }
}