Added retrieving API token from a local property or environment variable.
This commit is contained in:
parent
87357f5127
commit
e857d3d3aa
5 changed files with 139 additions and 39 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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")
|
||||
}
|
||||
}
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue