Skip to content

Commit

Permalink
Create camel infrastructure for external systems and invoke alberta API
Browse files Browse the repository at this point in the history
refs PR #10685

* move JSON-BPartner classes to de.metas.common and add stub camel project
* add first camel stuff + auto-generated alberta client code (UnLicence)
* add externalsystem module
* add constants for common external system parameters
* rearrange code and start implementing GetAlbertaPatientsRouteBuilder
* camel-externalsystems in the jenkins-build
  * add bannter.txt
* build the docker image
* add rudimentory endpoint for reporting errors

Co-authored-by: Tobias Schöneberg <tobias.schoeneberg@metasfresh.com>

* include AD_Pinstance_ID when calling camel
* prepare the code for the arrival of a second external-system-type
* bump up the swagger api-enum plugin "springfox-enum-plugin"

* Master camel services adissue (#10684)
* create endpoint for ad issue
* refs: #10683

Co-authored-by: cif-ps <ci-ps@pevesoft.ro>

* refs: #10676 (#10677)
* refs: #10676
- small location fix
- basic error handling
- avoid duplicates ( possible as we retrieve twice )
- send the type of the config as external-system-name - not its type
- fix NPE that occurs when we run from ad_scheduler
- guard against empty IDs

Co-authored-by: adi-stefan <60300682+adi-stefan@users.noreply.github.com>
Co-authored-by: cp-ps <77785468+cp-ps@users.noreply.github.com>
Co-authored-by: cif-ps <ci-ps@pevesoft.ro>
  • Loading branch information
4 people committed Feb 22, 2021
1 parent c87b3de commit 9061c9f
Show file tree
Hide file tree
Showing 298 changed files with 19,534 additions and 4,505 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,5 @@ private
misc/services/camel/de-metas-camel-shipping/tmp/

**/node_modules/

/misc/services/camel/de-metas-camel-externalsystems/alberta/de-metas-camel-alberta-camelroutes/src/test/java/de/metas/camel/alberta/GetAlbertaPatientsRouteBuilderTest_dont_commit.java
Original file line number Diff line number Diff line change
Expand Up @@ -81,4 +81,6 @@ public static boolean equals(final BPartnerBankAccountId id1, final BPartnerBank
{
return Objects.equals(id1, id2);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ public interface IErrorManager extends ISingletonService

AdIssueId createIssue(IssueCreateRequest request);

AdIssueId insertRemoteIssue(InsertRemoteIssueRequest request);

void markIssueAcknowledged(AdIssueId adIssueId);

IssueCountersByCategory getIssueCountersByCategory(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/*
* #%L
* de.metas.adempiere.adempiere.base
* %%
* Copyright (C) 2021 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%
*/

package de.metas.error;

import de.metas.organization.OrgId;
import de.metas.process.PInstanceId;
import lombok.Builder;
import lombok.NonNull;
import lombok.Value;

import javax.annotation.Nullable;

@Value
@Builder
public class InsertRemoteIssueRequest
{
@NonNull
OrgId orgId;

@NonNull
PInstanceId pInstance_ID;

@NonNull
String issueSummary;

@Nullable
String sourceClassName;

@Nullable
String sourceMethodName;

@Nullable
String issueCategory;

@Nullable
String stacktrace;
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import javax.annotation.Nullable;

import de.metas.common.util.EmptyUtil;
import de.metas.error.InsertRemoteIssueRequest;
import org.adempiere.ad.dao.IQueryBL;
import org.adempiere.ad.trx.api.ITrx;
import org.adempiere.ad.trx.api.ITrxManager;
Expand Down Expand Up @@ -67,6 +68,34 @@ public AdIssueId createIssue(@NonNull final Throwable t)
.build());
}


@Override
@NonNull
public AdIssueId insertRemoteIssue(@NonNull final InsertRemoteIssueRequest request)
{
return trxManager.callInNewTrx(() -> insertRemoteIssueInTrx(request));
}

@NonNull
private AdIssueId insertRemoteIssueInTrx(@NonNull final InsertRemoteIssueRequest request)
{
final I_AD_Issue issue = newInstance(I_AD_Issue.class);

final IssueCategory issueCategory = IssueCategory.ofNullableCodeOrOther(request.getIssueCategory());
issue.setIssueCategory(issueCategory.getCode());

issue.setIssueSummary(request.getIssueSummary());

issue.setSourceClassName(request.getSourceClassName());
issue.setSourceMethodName(request.getSourceMethodName());
issue.setStackTrace(request.getStacktrace());
issue.setAD_PInstance_ID(request.getPInstance_ID().getRepoId());
issue.setAD_Org_ID(request.getOrgId().getRepoId() );

saveRecord(issue);
return AdIssueId.ofRepoId(issue.getAD_Issue_ID());
}

@Override
public AdIssueId createIssue(@NonNull final IssueCreateRequest request)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,18 @@
* #L%
*/

import java.sql.Timestamp;
import java.util.List;
import java.util.Set;

import lombok.NonNull;
import org.adempiere.util.lang.impl.TableRecordReference;
import org.compiere.model.I_AD_PInstance;

import de.metas.util.ISingletonService;

import javax.annotation.Nullable;

public interface IADPInstanceDAO extends ISingletonService
{
/**
Expand All @@ -44,7 +48,7 @@ public interface IADPInstanceDAO extends ISingletonService
/**
* Saves {@link ProcessInfo} only, excluding depending records like process parameters.
*
* Also, in case the {@link ProcessInfo#getAD_PInstance_ID()} is missing, this method will create it and it will set it to {@link ProcessInfo}.
* Also, in case the {@link ProcessInfo#getAdProcessId()} is missing, this method will create it and it will set it to {@link ProcessInfo}.
*
* @param pi
*/
Expand All @@ -59,15 +63,15 @@ public interface IADPInstanceDAO extends ISingletonService
void saveParameterToDB(PInstanceId pinstanceId, List<ProcessInfoParameter> piParams);

/**
* @param adPInstanceId AD_PInstance_ID
* @param pinstanceId AD_PInstance_ID
* @return process parameters for given AD_PInstance_ID
*/
List<ProcessInfoParameter> retrieveProcessInfoParameters(PInstanceId pinstanceId);

/**
* Locks underlying AD_PInstance.
*
* @param adPInstanceId
* @param pinstanceId
*/
void lock(PInstanceId pinstanceId);

Expand Down Expand Up @@ -108,4 +112,6 @@ public interface IADPInstanceDAO extends ISingletonService
void saveSelectedIncludedRecords(PInstanceId pinstanceId, Set<TableRecordReference> recordRefs);

PInstanceId createADPinstanceAndADPInstancePara(PInstanceRequest pinstanceRequest);

Timestamp getLastRunDate(@NonNull AdProcessId adProcessId, @Nullable PInstanceId pinstanceToExclude);
}
Original file line number Diff line number Diff line change
@@ -1,63 +1,8 @@
package de.metas.process.impl;

import static org.adempiere.model.InterfaceWrapperHelper.isNull;
import static org.adempiere.model.InterfaceWrapperHelper.loadOutOfTrx;
import static org.adempiere.model.InterfaceWrapperHelper.newInstanceOutOfTrx;
import static org.adempiere.model.InterfaceWrapperHelper.saveRecord;
import static org.adempiere.model.InterfaceWrapperHelper.setValue;

/*
* #%L
* de.metas.adempiere.adempiere.base
* %%
* Copyright (C) 2015 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%
*/

import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.stream.Collectors;

import org.adempiere.ad.dao.IQueryBL;
import org.adempiere.ad.trx.api.ITrx;
import org.adempiere.exceptions.AdempiereException;
import org.adempiere.exceptions.DBException;
import org.adempiere.util.lang.impl.TableRecordReference;
import org.compiere.Adempiere;
import org.compiere.model.I_AD_PInstance;
import org.compiere.model.I_AD_PInstance_Log;
import org.compiere.model.I_AD_PInstance_Para;
import org.compiere.util.DB;
import org.compiere.util.DisplayType;
import org.compiere.util.Env;
import org.compiere.util.TimeUtil;
import org.slf4j.Logger;

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

import de.metas.common.util.CoalesceUtil;
import de.metas.i18n.Language;
import de.metas.logging.LogManager;
import de.metas.process.AdProcessId;
Expand All @@ -74,8 +19,41 @@
import de.metas.util.GuavaCollectors;
import de.metas.util.NumberUtils;
import de.metas.util.Services;
import de.metas.common.util.CoalesceUtil;
import lombok.NonNull;
import org.adempiere.ad.dao.IQueryBL;
import org.adempiere.ad.dao.IQueryBuilder;
import org.adempiere.ad.trx.api.ITrx;
import org.adempiere.exceptions.AdempiereException;
import org.adempiere.exceptions.DBException;
import org.adempiere.util.lang.impl.TableRecordReference;
import org.compiere.Adempiere;
import org.compiere.model.I_AD_PInstance;
import org.compiere.model.I_AD_PInstance_Log;
import org.compiere.model.I_AD_PInstance_Para;
import org.compiere.util.DB;
import org.compiere.util.DisplayType;
import org.compiere.util.Env;
import org.compiere.util.TimeUtil;
import org.slf4j.Logger;

import javax.annotation.Nullable;
import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.stream.Collectors;

import static org.adempiere.model.InterfaceWrapperHelper.isNull;
import static org.adempiere.model.InterfaceWrapperHelper.loadOutOfTrx;
import static org.adempiere.model.InterfaceWrapperHelper.newInstanceOutOfTrx;
import static org.adempiere.model.InterfaceWrapperHelper.saveRecord;
import static org.adempiere.model.InterfaceWrapperHelper.setValue;

public class ADPInstanceDAO implements IADPInstanceDAO
{
Expand All @@ -85,6 +63,7 @@ public class ADPInstanceDAO implements IADPInstanceDAO
public static final int RESULT_OK = 1;
/** Result FALSE = 0 */
public static final int RESULT_ERROR = 0;
private final IQueryBL queryBL = Services.get(IQueryBL.class);

private List<I_AD_PInstance_Para> retrieveAD_PInstance_Params(final PInstanceId pinstanceId)
{
Expand All @@ -93,7 +72,7 @@ private List<I_AD_PInstance_Para> retrieveAD_PInstance_Params(final PInstanceId
return ImmutableList.of();
}

return Services.get(IQueryBL.class)
return queryBL
.createQueryBuilderOutOfTrx(I_AD_PInstance_Para.class)
.addOnlyActiveRecordsFilter()
.addEqualsFilter(I_AD_PInstance_Para.COLUMNNAME_AD_PInstance_ID, pinstanceId)
Expand All @@ -112,7 +91,8 @@ public List<ProcessInfoParameter> retrieveProcessInfoParameters(final PInstanceI
}

// package level for testing
/* package */final ProcessInfoParameter createProcessInfoParameter(final I_AD_PInstance_Para adPInstancePara)
/* package */
final ProcessInfoParameter createProcessInfoParameter(final I_AD_PInstance_Para adPInstancePara)
{
final String ParameterName = adPInstancePara.getParameterName();
// Info
Expand All @@ -137,7 +117,7 @@ public List<ProcessInfoParameter> retrieveProcessInfoParameters(final PInstanceI
// NOTE: keep this one last because getP_Number() is always returning not null
if (Parameter == null && Parameter_To == null
&& (!isNull(adPInstancePara, I_AD_PInstance_Para.COLUMNNAME_P_Number)
|| !isNull(adPInstancePara, I_AD_PInstance_Para.COLUMNNAME_P_Number_To)))
|| !isNull(adPInstancePara, I_AD_PInstance_Para.COLUMNNAME_P_Number_To)))
{
Parameter = adPInstancePara.getP_Number();
if (isNull(adPInstancePara, I_AD_PInstance_Para.COLUMNNAME_P_Number_To))
Expand All @@ -161,8 +141,8 @@ public void saveParameterToDB(@NonNull final PInstanceId pinstanceId, final List
try
{
DB.getConstraints() // 02625
.setOnlyAllowedTrxNamePrefixes(true)
.addAllowedTrxNamePrefix(ITrx.TRXNAME_PREFIX_LOCAL);
.setOnlyAllowedTrxNamePrefixes(true)
.addAllowedTrxNamePrefix(ITrx.TRXNAME_PREFIX_LOCAL);

saveParametersToDB0(pinstanceId, piParams);
}
Expand All @@ -173,8 +153,7 @@ public void saveParameterToDB(@NonNull final PInstanceId pinstanceId, final List
}

/**
*
* Called by {@link #saveParameterToDB(ProcessInfo)} to do the actual work.
* Called by {@link #saveParameterToDB(PInstanceId, List)} to do the actual work.
*/
private void saveParametersToDB0(@NonNull final PInstanceId pinstanceId, final List<ProcessInfoParameter> piParams)
{
Expand Down Expand Up @@ -404,7 +383,7 @@ private void saveProcessInfoLogs(final PInstanceId pinstanceId, final List<Proce
public void loadResultSummary(final ProcessExecutionResult result)
{
//
final int sleepTime = 1000; // 1 seconds
final int sleepTime = 1000; // 1 seconds
final int noRetry = 5; // 10 seconds total
//
final String sql = "SELECT Result, ErrorMsg FROM AD_PInstance "
Expand Down Expand Up @@ -474,13 +453,13 @@ public void loadResultSummary(final ProcessExecutionResult result)
@Override
public void lock(final PInstanceId pinstanceId)
{
Services.get(IQueryBL.class)
.createQueryBuilderOutOfTrx(I_AD_PInstance.class)
.addEqualsFilter(I_AD_PInstance.COLUMN_AD_PInstance_ID, pinstanceId)
.create()
.updateDirectly()
.addSetColumnValue(I_AD_PInstance.COLUMNNAME_IsProcessing, true)
.execute();
queryBL
.createQueryBuilderOutOfTrx(I_AD_PInstance.class)
.addEqualsFilter(I_AD_PInstance.COLUMN_AD_PInstance_ID, pinstanceId)
.create()
.updateDirectly()
.addSetColumnValue(I_AD_PInstance.COLUMNNAME_IsProcessing, true)
.execute();
}

@Override
Expand Down Expand Up @@ -594,7 +573,19 @@ public PInstanceId createADPinstanceAndADPInstancePara(final @NonNull PInstanceR
return adPInstance;
}


@Override
@Nullable
public Timestamp getLastRunDate(@NonNull final AdProcessId adProcessId, @Nullable final PInstanceId pinstanceToExclude)
{
final IQueryBuilder<I_AD_PInstance> queryBuilder = queryBL.createQueryBuilder(I_AD_PInstance.class)
.addEqualsFilter(I_AD_PInstance.COLUMN_AD_Process_ID, adProcessId)
.orderByDescending(I_AD_PInstance.COLUMN_Created);
if (pinstanceToExclude != null)
{
queryBuilder.addNotEqualsFilter(I_AD_PInstance.COLUMN_AD_PInstance_ID, pinstanceToExclude);
}
return queryBuilder.create().first().getCreated();
}

@Override
public I_AD_PInstance getById(@NonNull final PInstanceId pinstanceId)
Expand Down

0 comments on commit 9061c9f

Please sign in to comment.