Skip to content

Instantly share code, notes, and snippets.

public class CardValidatorImpl {
private static final Map<String, CardType> cardTypeRegex;
static {
cardTypeRegex = new HashMap<>();
cardTypeRegex.put("^(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$", CardType.MASTERCARD);
cardTypeRegex.put("^(5018|5020|5038|6304|6759|6761|6763)[0-9]{8,15}$", CardType.MAESTRO);
cardTypeRegex.put("^(4026|417500|4405|4508|4844|4913|4917)\\d+$", CardType.ELECTRON);
cardTypeRegex.put("^3(?:0[0-5]|[68][0-9])[0-9]{4,}$", CardType.DINERS);
@ts14ic
ts14ic / Notification.java
Created January 4, 2020 21:57
Just to remember how simple the design got over time
import lombok.Builder;
import lombok.Builder.Default;
import lombok.NonNull;
import lombok.Value;
import java.math.BigDecimal;
@Value
@Builder(toBuilder = true)
public class Notification {
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import lombok.Value;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.Nullable;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
/**
* A clock providing access to time stored in database as testing.current_time.
* <p>
* This clock is intended for testing builds only, as it may be slow - every time query performs a database query.
*/
public class ControlledClock extends Clock {
private static final Logger LOG = LoggerFactory.getLogger(ControlledClock.class.getSimpleName());
private final ZoneId zoneId;
private final DataSource db;
import lombok.EqualsAndHashCode;
import static java.util.Objects.requireNonNull;
@EqualsAndHashCode(callSuper = false)
public class Pan extends SensitiveId implements NaturalId {
private static final Pan EMPTY = Pan.of("");
private final String pan;
import java.util.*;
import static java.util.Objects.requireNonNull;
public class HttpRequest {
private final Method method;
private final String url;
private final Map<String, String> headers;
private String body;
@ts14ic
ts14ic / DatabaseTest.java
Created January 4, 2020 21:43
An nifty way to make a rule to work as both beforeEach and beforeAll
public class DatabaseTest {
public @ClassRule @Rule static DbTestRule dbRule = new DbTestRule();
public static FileConfig getFileConfig() {
return dbRule.getFileConfig();
}
public static Config getConfig() {
return dbRule.getConfig();
}
@ts14ic
ts14ic / ControllerRouter.java
Created January 4, 2020 21:42
Poorman route binder (spark+toothpick)
import com.google.protobuf.Message;
import md.maib.app.BindableController;
import md.maib.app.SparkRoute;
import md.maib.app.di.ComponentScanner;
import md.maib.app.di.stereo.RestController;
import md.maib.app.domain.auth.Principal;
import md.maib.app.presentation.auth.AuthenticationPrincipal;
import md.maib.app.presentation.auth.SecurityContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ts14ic
ts14ic / DtoMapper.java
Last active January 4, 2020 21:29
jdbc helpers (but there's a better library (https://jdbi.org/) for mappers in particular)
package md.ts14ic.test.data.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.Nullable;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
@ts14ic
ts14ic / ComponentScanModule.java
Created January 4, 2020 21:21
ComponentScan using toothpick
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import org.apache.commons.lang3.reflect.MethodUtils;
import toothpick.Scope;
import toothpick.config.Binding;
import toothpick.config.Module;
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;