Added retrieving API token from a local property or environment variable.

This commit is contained in:
Erik C. Thauvin 2017-11-08 01:03:22 -08:00
parent 87357f5127
commit e857d3d3aa
5 changed files with 139 additions and 39 deletions

View file

@ -31,15 +31,52 @@
*/
package net.thauvin.erik.pinboard;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Properties;
import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
public class JavaExample {
public static void main(String[] args) {
final String url = "http://www.example.com/pinboard";
final PinboardPoster poster = new PinboardPoster(args[0]);
final Path properties = Paths.get("local.properties");
final PinboardPoster poster;
if (args.length == 1) {
// API Token is an argument
poster = new PinboardPoster(args[0]);
} else if (Files.exists(properties)) {
// API Token is in local.properties (PINBOARD_API_TOKEN)
final Properties p = new Properties();
try (final InputStream stream = Files.newInputStream(properties)) {
p.load(stream);
} catch (IOException ignore) {
;
}
poster = new PinboardPoster(p);
} else {
// API Token is an environment variable (PINBOARD_API_TOKEN) or empty
poster = new PinboardPoster();
}
// Set logging levels
final ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.FINE);
final Logger logger = poster.getLogger();
logger.addHandler(consoleHandler);
logger.setLevel(Level.FINE);
// Add Pin
if (poster.addPin(url, "Testing", "Extended test", "test kotlin")) {
System.out.println("Added: " + url);
}
// Delete Pin
if (poster.deletePin(url)) {
System.out.println("Deleted: " + url);
}

View file

@ -31,12 +31,16 @@
*/
package net.thauvin.erik.pinboard
import net.thauvin.erik.pinboard.Constants.ENV_API_TOKEN
import okhttp3.HttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import org.xml.sax.InputSource
import java.io.StringReader
import java.net.URL
import java.nio.file.Files
import java.nio.file.Paths
import java.util.*
import java.util.logging.ConsoleHandler
import java.util.logging.Level
import java.util.logging.Logger
@ -46,9 +50,21 @@ object Constants {
const val API_ENDPOINT = "https://api.pinboard.in/v1/"
const val AUTH_TOKEN = "auth_token"
const val DONE = "done"
const val ENV_API_TOKEN = "PINBOARD_API_TOKEN"
}
open class PinboardPoster(var apiToken: String) {
open class PinboardPoster() {
constructor(apiToken: String) : this() {
this.apiToken = apiToken
}
@JvmOverloads
constructor(properties: Properties, key: String = ENV_API_TOKEN) : this() {
this.apiToken = properties.getProperty(key, "")
}
var apiToken: String = if (System.getenv(ENV_API_TOKEN).isNullOrBlank()) "" else System.getenv(ENV_API_TOKEN)
var apiEndPoint: String = Constants.API_ENDPOINT
val logger: Logger by lazy { Logger.getLogger(PinboardPoster::class.java.simpleName) }
@ -201,23 +217,37 @@ open class PinboardPoster(var apiToken: String) {
}
fun main(args: Array<String>) {
if (args.size == 1) {
val url = "http://www.example.com/pinboard"
val poster = PinboardPoster(args[0])
val url = "http://www.example.com/pinboard"
val properties = Paths.get("local.properties")
val poster = when {
args.size == 1 ->
// API Token is an argument
PinboardPoster(args[0])
Files.exists(properties) ->
// API Token is in a local.properties (PINBOARD_API_TOKEN)
PinboardPoster(
Properties().apply {
Files.newInputStream(properties).use { fis -> load(fis) }
}.getProperty(ENV_API_TOKEN, "")
)
else ->
// API Token is an environment variable (PINBOARD_API_TOKEN) or empty;
PinboardPoster()
}
with(poster.logger) {
addHandler(ConsoleHandler().apply { level = Level.FINE })
level = Level.FINE
}
// Set logging levels
with(poster.logger) {
addHandler(ConsoleHandler().apply { level = Level.FINE })
level = Level.FINE
}
if (poster.addPin(url, "Testing", "Extended test", "test kotlin")) {
println("Added: $url")
}
// Add Pin
if (poster.addPin(url, "Testing", "Extended test", "test kotlin")) {
println("Added: $url")
}
if (poster.deletePin(url)) {
println("Deleted: $url")
}
} else {
println("Please specify a valid API token. (eg. user:TOKEN)")
// Delete Pin
if (poster.deletePin(url)) {
println("Deleted: $url")
}
}

View file

@ -41,16 +41,10 @@ class PinboardPosterTest {
private val url = "http://www.foo.com/"
private val desc = "This is a test."
private val localProps = Paths.get("local.properties")
private val apiToken = if (Files.exists(localProps)) {
val p = Properties().apply { Files.newInputStream(localProps).use { fis -> load(fis) } }
p.getProperty("pinboard-api-token", "")
} else {
System.getenv("PINBOARD_API_TOKEN")
}
@Test
fun testAddPin() {
val poster = PinboardPoster("")
var poster = PinboardPoster("")
Assert.assertFalse(poster.addPin(url, desc), "apiToken: <blank>")
@ -60,13 +54,13 @@ class PinboardPosterTest {
//poster.apiToken = "foo:TESTING"
//Assert.assertFalse(poster.addPin(url, desc), "apiToken: ${poster.apiToken}")
poster.apiToken = apiToken
Assert.assertTrue(poster.addPin(url, desc), "apiToken: $apiToken")
poster = pinboardPosterInstance()
Assert.assertTrue(poster.addPin(url, desc), "apiToken: ${Constants.ENV_API_TOKEN}")
}
@Test
fun testDeletePin() {
val poster = PinboardPoster(apiToken)
val poster = pinboardPosterInstance()
poster.apiEndPoint = ""
Assert.assertFalse(poster.deletePin(url), "apiEndPoint: <blank>")
@ -76,4 +70,12 @@ class PinboardPosterTest {
Assert.assertFalse(poster.deletePin("foo.com"), "url: foo.com")
}
private fun pinboardPosterInstance(): PinboardPoster {
return if (Files.exists(localProps)) {
PinboardPoster(Properties().apply { Files.newInputStream(localProps).use { fis -> load(fis) } })
} else {
PinboardPoster()
}
}
}