Commit 1e15a6b0 authored by Brian Long's avatar Brian Long
Browse files

CLI changes for MyStocksPortfolio

parent 4b09675b
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -35,6 +35,16 @@
			<version>1.0-SNAPSHOT</version>
			<classifier>jersey</classifier>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.dataformat</groupId>
			<artifactId>jackson-dataformat-csv</artifactId>
			<version>2.12.2</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.datatype</groupId>
			<artifactId>jackson-datatype-jsr310</artifactId>
			<version>2.12.2</version>
		</dependency>
		<dependency>
			<groupId>org.glassfish.jersey.core</groupId>
			<artifactId>jersey-client</artifactId>
+38 −3
Original line number Diff line number Diff line
@@ -3,19 +3,54 @@ package com.inteligr8.buxfer;
import java.io.IOException;
import java.io.OutputStream;

import com.fasterxml.jackson.dataformat.csv.CsvMapper;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.inteligr8.buxfer.model.Transaction;
import com.inteligr8.buxfer.msp.MyStocksPortfolioTransaction;

public class CsvTransactionWriter implements Observer<Transaction> {
public abstract class CsvTransactionWriter<T> implements Observer<Transaction> {
	
	private final OutputStream ostream;
	private final CsvMapper mapper;
	private final CsvSchema schema;
	
	public CsvTransactionWriter(OutputStream ostream) {
	public CsvTransactionWriter(OutputStream ostream, Class<T> txClass) {
		this.ostream = ostream;
		
		this.mapper = CsvMapper.builder().build();
		this.mapper.registerModule(new JavaTimeModule());
		
		if (txClass == null) {
			this.schema = this.mapper.schema().withHeader();
		} else {
			this.schema = this.mapper.schemaFor(txClass).withHeader();
		}
	}
	
	@Override
	public int observed(Transaction tx) throws IOException {
		try {
			ParsedTransaction ptx = NormalizedParser.getInstance().parse(tx);
			return this.observed(ptx);
		} catch (IllegalArgumentException iae) {
			return 0;
		}
	}

	public int observed(ParsedTransaction ptx) throws IOException {
		if (ptx.getContractType() != null)
			return 0;
		
		Object otx = this.mapTransaction(ptx);
		
		this.mapper.writerFor(MyStocksPortfolioTransaction.class)
				.with(this.schema)
				.writeValue(this.ostream, otx);
		
		return 1;
	}
	
	protected abstract Object mapTransaction(ParsedTransaction ptx);

}
+0 −11
Original line number Diff line number Diff line
package com.inteligr8.buxfer;

import java.io.OutputStream;

public class MyStockPortfolioCsvTransactionWriter extends CsvTransactionWriter {
	
	public MyStockPortfolioCsvTransactionWriter(OutputStream ostream) {
		super(ostream);
	}

}
+14 −12
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ import org.slf4j.LoggerFactory;
import com.inteligr8.buxfer.api.CommandApi;
import com.inteligr8.buxfer.model.Transaction;
import com.inteligr8.buxfer.model.TransactionsResponse;
import com.inteligr8.buxfer.msp.MyStocksPortfolioCsvTransactionWriter;

public class WriterCLI {
	
@@ -27,8 +28,7 @@ public class WriterCLI {
	private enum Format {
		
		Json,
		Csv,
		MyStockPortfolioCsv("my-stock-portfolio-csv");
		MyStocksPortfolioCsv("my-stocks-portfolio-csv");
		
		private final String key;
		private Format() {
@@ -91,13 +91,15 @@ public class WriterCLI {
			
			for (Transaction tx : response.getItems())
				observer.observed(tx);
			
			break;
		}
	}
	
	private static Options buildOptions() {
		return new Options()
				.addOption(new Option("u", "email", true, "A Buxfer email for authentication"))
				.addOption(new Option("p", "password", true, "A Buxfer password for authentication"))
				.addOption(new Option("bu", "buxfer-email", true, "A Buxfer email for authentication"))
				.addOption(new Option("bp", "buxfer-password", true, "A Buxfer password for authentication"))
				.addOption(new Option("t", "format", true, "The output format [json | csv | my-stock-portfolio-csv]"))
				.addOption(new Option("f", "file", true, "The output filename"))
				.addOption(new Option(null, "portfolio-name", true, "The portfolio name where applicable"));
@@ -110,7 +112,7 @@ public class WriterCLI {
	private static File determineFile(CommandLine cli) {
		Format format = Format.valueByKey(cli.getOptionValue("format", "json"));
		
		String filename = cli.hasOption("file") ? cli.getOptionValue("file") : "portfolio";
		String filename = cli.hasOption("file") ? cli.getOptionValue("file") : cli.getOptionValue("portfolio-name", "portfolio");
		if (filename.lastIndexOf('.') < 0) {
			switch (format) {
				case Json:
@@ -129,10 +131,10 @@ public class WriterCLI {
		switch (format) {
			case Json:
				return new JsonTransactionWriter(ostream);
			case MyStockPortfolioCsv:
				return new MyStockPortfolioCsvTransactionWriter(ostream);
			case MyStocksPortfolioCsv:
				return new MyStocksPortfolioCsvTransactionWriter(ostream, cli.getOptionValue("portfolio-name"));
			default:
				return new CsvTransactionWriter(ostream);
				throw new IllegalArgumentException();
		}
	}
	
@@ -140,10 +142,10 @@ public class WriterCLI {
		BuxferClientConfiguration config = new BuxferClientConfiguration();
		config.setBaseUrl("https://www.buxfer.com");

		if (cli.hasOption("email"))
			config.setAuthEmail(cli.getOptionValue("email"));
		if (cli.hasOption("password"))
			config.setAuthPassword(cli.getOptionValue("password"));
		if (cli.hasOption("buxfer-email"))
			config.setAuthEmail(cli.getOptionValue("buxfer-email"));
		if (cli.hasOption("buxfer-password"))
			config.setAuthPassword(cli.getOptionValue("buxfer-password"));

		BuxferClientJerseyImpl client = new BuxferClientJerseyImpl(config);
		return client.getApi().getCommandApi();
+30 −0
Original line number Diff line number Diff line
package com.inteligr8.buxfer.msp;

import java.io.OutputStream;
import java.time.ZoneId;

import com.inteligr8.buxfer.CsvTransactionWriter;
import com.inteligr8.buxfer.ParsedTransaction;

public class MyStocksPortfolioCsvTransactionWriter extends CsvTransactionWriter<MyStocksPortfolioTransaction> {

	private long nextId;
	
	public MyStocksPortfolioCsvTransactionWriter(OutputStream ostream, String portfolioName) {
		super(ostream, MyStocksPortfolioTransaction.class);
		this.nextId = 1L;
	}
	
	@Override
	protected Object mapTransaction(ParsedTransaction ptx) {
		MyStocksPortfolioTransaction msptx = new MyStocksPortfolioTransaction();
		msptx.setId(this.nextId++);
		msptx.setDatetime(ptx.getTransaction().getDate().atStartOfDay(ZoneId.systemDefault()).toOffsetDateTime());
		msptx.setCurrency("USD");
		msptx.setSymbol(ptx.getSecuritySymbol());
		msptx.setQuantity((int)ptx.getSecurities());
		msptx.setPricePerShare(ptx.getPricePerSecurity());
		return msptx;
	}

}
Loading