use of com.github.robozonky.api.notifications.Event in project robozonky by RoboZonky.
the class JmxListenerService method newListener.
private static <T extends Event> EventListener<T> newListener(final Class<T> eventType) {
if (Objects.equals(eventType, ExecutionStartedEvent.class)) {
return (event, sessionInfo) -> callOnPortfolio(bean -> bean.handle((ExecutionStartedEvent) event));
} else if (Objects.equals(eventType, ExecutionCompletedEvent.class)) {
return (event, sessionInfo) -> {
final ExecutionCompletedEvent evt = (ExecutionCompletedEvent) event;
callOnRuntime(bean -> bean.handle(evt, sessionInfo));
callOnPortfolio(bean -> bean.handle(evt));
};
} else if (Objects.equals(eventType, SellingStartedEvent.class)) {
return (event, sessionInfo) -> callOnPortfolio(bean -> bean.handle((SellingStartedEvent) event));
} else if (Objects.equals(eventType, SellingCompletedEvent.class)) {
return (event, sessionInfo) -> callOnPortfolio(bean -> bean.handle((SellingCompletedEvent) event));
} else if (Objects.equals(eventType, PurchasingStartedEvent.class)) {
return (event, sessionInfo) -> callOnPortfolio(bean -> bean.handle((PurchasingStartedEvent) event));
} else if (Objects.equals(eventType, PurchasingCompletedEvent.class)) {
return (event, sessionInfo) -> callOnPortfolio(bean -> bean.handle((PurchasingCompletedEvent) event));
} else if (Objects.equals(eventType, InvestmentDelegatedEvent.class)) {
return (event, sessionInfo) -> callOnOperations(bean -> bean.handle((InvestmentDelegatedEvent) event));
} else if (Objects.equals(eventType, InvestmentRejectedEvent.class)) {
return (event, sessionInfo) -> callOnOperations(bean -> bean.handle((InvestmentRejectedEvent) event));
} else if (Objects.equals(eventType, InvestmentMadeEvent.class)) {
return (event, sessionInfo) -> callOnOperations(bean -> bean.handle((InvestmentMadeEvent) event));
} else if (Objects.equals(eventType, SaleOfferedEvent.class)) {
return (event, sessionInfo) -> callOnOperations(bean -> bean.handle((SaleOfferedEvent) event));
} else if (Objects.equals(eventType, InvestmentPurchasedEvent.class)) {
return (event, sessionInfo) -> callOnOperations(bean -> bean.handle((InvestmentPurchasedEvent) event));
} else {
return null;
}
}
use of com.github.robozonky.api.notifications.Event in project robozonky by RoboZonky.
the class Session method invest.
/**
* Request {@link ControlApi} to invest in a given loan, leveraging the {@link ConfirmationProvider}.
* @param recommendation Loan to invest into.
* @return True if investment successful. The investment is reflected in {@link #getResult()}.
*/
public boolean invest(final RecommendedLoan recommendation) {
final LoanDescriptor loan = recommendation.descriptor();
final int loanId = loan.item().getId();
if (portfolioOverview.getCzkAvailable() < recommendation.amount().intValue()) {
// should not be allowed by the calling code
return false;
}
Events.fire(new InvestmentRequestedEvent(recommendation));
final boolean seenBefore = state.getSeenLoans().stream().anyMatch(l -> isSameLoan(l, loanId));
final ZonkyResponse response = investor.invest(recommendation, seenBefore);
Session.LOGGER.debug("Response for loan {}: {}.", loanId, response);
final String providerId = investor.getConfirmationProviderId().orElse("-");
switch(response.getType()) {
case REJECTED:
return investor.getConfirmationProviderId().map(c -> {
Events.fire(new InvestmentRejectedEvent(recommendation, providerId));
// rejected through a confirmation provider => forget
discard(loan);
return false;
}).orElseGet(() -> {
// rejected due to no confirmation provider => make available for direct investment later
Events.fire(new InvestmentSkippedEvent(recommendation));
Session.LOGGER.debug("Loan #{} protected by CAPTCHA, will check back later.", loanId);
skip(loan);
return false;
});
case DELEGATED:
final Event e = new InvestmentDelegatedEvent(recommendation, providerId);
Events.fire(e);
if (recommendation.isConfirmationRequired()) {
// confirmation required, delegation successful => forget
discard(loan);
} else {
// confirmation not required, delegation successful => make available for direct investment later
skip(loan);
}
return false;
case INVESTED:
final int confirmedAmount = response.getConfirmedAmount().getAsInt();
final Investment i = Investment.fresh(recommendation.descriptor().item(), confirmedAmount);
markSuccessfulInvestment(i);
Events.fire(new InvestmentMadeEvent(i, loan.item(), portfolioOverview));
return true;
case // still protected by CAPTCHA
SEEN_BEFORE:
return false;
default:
throw new IllegalStateException("Not possible.");
}
}
use of com.github.robozonky.api.notifications.Event in project robozonky by RoboZonky.
the class JmxListenerServiceTest method getParametersForInvestmentMade.
private DynamicTest getParametersForInvestmentMade() {
final Loan l = mockLoan();
final Investment i = Investment.fresh((MarketplaceLoan) l, 200);
final PortfolioOverview po = PortfolioOverview.calculate(BigDecimal.valueOf(1000), Stream::empty);
final Event evt = new InvestmentMadeEvent(i, l, po);
final Consumer<SoftAssertions> before = (softly) -> {
final OperationsMBean mbean = getOperationsMBean();
softly.assertThat(mbean.getSuccessfulInvestments()).isEmpty();
};
final Consumer<SoftAssertions> after = (softly) -> {
final OperationsMBean mbean = getOperationsMBean();
softly.assertThat(mbean.getSuccessfulInvestments()).containsOnlyKeys(l.getId());
softly.assertThat(mbean.getLatestUpdatedDateTime()).isEqualTo(evt.getCreatedOn());
};
return getParameters(evt, before, after);
}
use of com.github.robozonky.api.notifications.Event in project robozonky by RoboZonky.
the class JmxListenerServiceTest method getParametersForInvestmentPurchased.
private DynamicTest getParametersForInvestmentPurchased() {
final Loan l = mockLoan();
final Investment i = Investment.fresh((MarketplaceLoan) l, 200);
final Event evt = new InvestmentPurchasedEvent(i, l, PortfolioOverview.calculate(BigDecimal.valueOf(2000), Stream::empty));
final Consumer<SoftAssertions> before = (softly) -> {
final OperationsMBean mbean = getOperationsMBean();
softly.assertThat(mbean.getPurchasedInvestments()).isEmpty();
};
final Consumer<SoftAssertions> after = (softly) -> {
final OperationsMBean mbean = getOperationsMBean();
softly.assertThat(mbean.getPurchasedInvestments()).containsOnlyKeys(i.getLoanId());
softly.assertThat(mbean.getLatestUpdatedDateTime()).isEqualTo(evt.getCreatedOn());
};
return getParameters(evt, before, after);
}
use of com.github.robozonky.api.notifications.Event in project robozonky by RoboZonky.
the class SellingTest method saleMade.
private void saleMade(final boolean isDryRun) {
final Investment i = mockInvestment();
final Zonky zonky = mockApi();
final Portfolio portfolio = new Portfolio(Collections.singleton(i), mockBalance(zonky));
new Selling(ALL_ACCEPTING, isDryRun).accept(portfolio, mockAuthentication(zonky));
final List<Event> e = getNewEvents();
assertThat(e).hasSize(5);
assertSoftly(softly -> {
softly.assertThat(e.get(0)).isInstanceOf(SellingStartedEvent.class);
softly.assertThat(e.get(1)).isInstanceOf(SaleRecommendedEvent.class);
softly.assertThat(e.get(2)).isInstanceOf(SaleRequestedEvent.class);
softly.assertThat(e.get(3)).isInstanceOf(SaleOfferedEvent.class);
softly.assertThat(e.get(4)).isInstanceOf(SellingCompletedEvent.class);
});
final VerificationMode m = isDryRun ? never() : times(1);
assertThat(i.isOnSmp()).isTrue();
verify(zonky, m).sell(argThat(inv -> i.getLoanId() == inv.getLoanId()));
}
Aggregations