From: David ‘Bombe’ Roden Date: Wed, 18 Sep 2019 19:23:32 +0000 (+0200) Subject: 🔀 Merge other “next” branch into this “next” X-Git-Tag: v81^2~127 X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=commitdiff_plain;h=b1f3c46e6c76d216b70733c334642f87187676a9;hp=5086e7768ee59962909c0297860953f75132d28a 🔀 Merge other “next” branch into this “next” --- diff --git a/src/main/java/net/pterodactylus/sone/core/FreenetInterface.java b/src/main/java/net/pterodactylus/sone/core/FreenetInterface.java index b3b32b3..28c8e22 100644 --- a/src/main/java/net/pterodactylus/sone/core/FreenetInterface.java +++ b/src/main/java/net/pterodactylus/sone/core/FreenetInterface.java @@ -21,7 +21,6 @@ import static freenet.keys.USK.create; import static java.lang.String.format; import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; -import static net.pterodactylus.sone.freenet.Key.routingKey; import java.io.IOException; import java.net.MalformedURLException; @@ -75,6 +74,7 @@ import freenet.support.api.Bucket; import freenet.support.api.RandomAccessBucket; import freenet.support.io.ArrayBucket; import freenet.support.io.ResumeFailedException; +import net.pterodactylus.sone.freenet.*; /** * Contains all necessary functionality for interacting with the Freenet node. @@ -255,7 +255,7 @@ public class FreenetInterface { public void registerActiveUsk(FreenetURI requestUri, USKCallback uskCallback) { try { - soneUskCallbacks.put(routingKey(requestUri), uskCallback); + soneUskCallbacks.put(FreenetURIsKt.getRoutingKeyString(requestUri), uskCallback); node.clientCore.uskManager.subscribe(create(requestUri), uskCallback, true, requestClient); } catch (MalformedURLException mue1) { @@ -267,7 +267,7 @@ public class FreenetInterface { public void registerPassiveUsk(FreenetURI requestUri, USKCallback uskCallback) { try { - soneUskCallbacks.put(routingKey(requestUri), uskCallback); + soneUskCallbacks.put(FreenetURIsKt.getRoutingKeyString(requestUri), uskCallback); node.clientCore .uskManager .subscribe(create(requestUri), uskCallback, false, requestClient); diff --git a/src/main/java/net/pterodactylus/sone/freenet/Key.java b/src/main/java/net/pterodactylus/sone/freenet/Key.java deleted file mode 100644 index 6811642..0000000 --- a/src/main/java/net/pterodactylus/sone/freenet/Key.java +++ /dev/null @@ -1,65 +0,0 @@ -package net.pterodactylus.sone.freenet; - -import static freenet.support.Base64.encode; -import static java.lang.String.format; - -import freenet.keys.FreenetURI; - -import com.google.common.annotations.VisibleForTesting; - -/** - * Encapsulates the parts of a {@link FreenetURI} that do not change while - * being converted from SSK to USK and/or back. - */ -public class Key { - - private final byte[] routingKey; - private final byte[] cryptoKey; - private final byte[] extra; - - private Key(byte[] routingKey, byte[] cryptoKey, byte[] extra) { - this.routingKey = routingKey; - this.cryptoKey = cryptoKey; - this.extra = extra; - } - - @VisibleForTesting - public String getRoutingKey() { - return encode(routingKey); - } - - @VisibleForTesting - public String getCryptoKey() { - return encode(cryptoKey); - } - - @VisibleForTesting - public String getExtra() { - return encode(extra); - } - - public FreenetURI toUsk(String docName, long edition, String... paths) { - return new FreenetURI("USK", docName, paths, routingKey, cryptoKey, - extra, edition); - } - - public FreenetURI toSsk(String docName, String... paths) { - return new FreenetURI("SSK", docName, paths, routingKey, cryptoKey, - extra); - } - - public FreenetURI toSsk(String docName, long edition, String... paths) { - return new FreenetURI("SSK", format("%s-%d", docName, edition), paths, - routingKey, cryptoKey, extra, edition); - } - - public static Key from(FreenetURI freenetURI) { - return new Key(freenetURI.getRoutingKey(), freenetURI.getCryptoKey(), - freenetURI.getExtra()); - } - - public static String routingKey(FreenetURI freenetURI) { - return from(freenetURI).getRoutingKey(); - } - -} diff --git a/src/main/java/net/pterodactylus/sone/freenet/L10nFilter.java b/src/main/java/net/pterodactylus/sone/freenet/L10nFilter.java deleted file mode 100644 index d667811..0000000 --- a/src/main/java/net/pterodactylus/sone/freenet/L10nFilter.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Sone - L10nFilter.java - Copyright © 2010–2019 David Roden - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.pterodactylus.sone.freenet; - -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.Map; - -import javax.annotation.Nonnull; - -import net.pterodactylus.util.template.Filter; -import net.pterodactylus.util.template.TemplateContext; - -import freenet.l10n.BaseL10n; - -/** - * {@link Filter} implementation replaces {@link String} values with their - * translated equivalents. - */ -public class L10nFilter implements Filter { - - private final BaseL10n l10n; - - public L10nFilter(BaseL10n l10n) { - this.l10n = l10n; - } - - /** - * {@inheritDoc} - */ - @Override - public String format(TemplateContext templateContext, Object data, Map parameters) { - List parameterValues = getParameters(data, parameters); - String text = getText(data); - if (parameterValues.isEmpty()) { - return l10n.getString(text); - } - return new MessageFormat(l10n.getString(text), new Locale(l10n.getSelectedLanguage().shortCode)).format(parameterValues.toArray()); - } - - @Nonnull - private String getText(Object data) { - return (data instanceof L10nText) ? ((L10nText) data).getText() : String.valueOf(data); - } - - @Nonnull - private List getParameters(Object data, Map parameters) { - if (data instanceof L10nText) { - return ((L10nText) data).getParameters(); - } - List parameterValues = new ArrayList<>(); - int parameterIndex = 0; - while (parameters.containsKey(String.valueOf(parameterIndex))) { - Object value = parameters.get(String.valueOf(parameterIndex)); - parameterValues.add(value); - ++parameterIndex; - } - return parameterValues; - } - -} diff --git a/src/main/kotlin/net/pterodactylus/sone/freenet/FreenetURIs.kt b/src/main/kotlin/net/pterodactylus/sone/freenet/FreenetURIs.kt new file mode 100644 index 0000000..3a6d43c --- /dev/null +++ b/src/main/kotlin/net/pterodactylus/sone/freenet/FreenetURIs.kt @@ -0,0 +1,6 @@ +package net.pterodactylus.sone.freenet + +import freenet.keys.* +import freenet.support.Base64.* + +val FreenetURI.routingKeyString: String get() = encode(routingKey) diff --git a/src/main/kotlin/net/pterodactylus/sone/freenet/L10nFilter.kt b/src/main/kotlin/net/pterodactylus/sone/freenet/L10nFilter.kt new file mode 100644 index 0000000..4b0d90f --- /dev/null +++ b/src/main/kotlin/net/pterodactylus/sone/freenet/L10nFilter.kt @@ -0,0 +1,53 @@ +/* + * Sone - L10nFilter.java - Copyright © 2010–2019 David Roden + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.pterodactylus.sone.freenet + +import freenet.l10n.* +import net.pterodactylus.util.template.* +import java.text.* +import java.util.* + +/** + * [Filter] implementation replaces [String] values with their + * translated equivalents. + */ +class L10nFilter(private val l10n: BaseL10n) : Filter { + + override fun format(templateContext: TemplateContext?, data: Any?, parameters: Map?): String { + val parameterValues = getParameters(data, parameters) + val text = getText(data) + return if (parameterValues.isEmpty()) { + l10n.getString(text) + } else + MessageFormat(l10n.getString(text), Locale(l10n.selectedLanguage.shortCode)).format(parameterValues.toTypedArray()) + } + + private fun getText(data: Any?) = (data as? L10nText)?.text ?: data.toString() + + private fun getParameters(data: Any?, parameters: Map?) = + if (data is L10nText) + data.parameters + else + (parameters ?: emptyMap()).let { params -> + generateSequence(0) { it + 1 } + .takeWhile { it.toString() in params } + .map { params[it.toString()] } + .toList() + } + +} diff --git a/src/test/java/net/pterodactylus/sone/freenet/KeyTest.java b/src/test/java/net/pterodactylus/sone/freenet/KeyTest.java deleted file mode 100644 index 80e1e45..0000000 --- a/src/test/java/net/pterodactylus/sone/freenet/KeyTest.java +++ /dev/null @@ -1,67 +0,0 @@ -package net.pterodactylus.sone.freenet; - -import static freenet.support.Base64.encode; -import static net.pterodactylus.sone.freenet.Key.from; -import static net.pterodactylus.sone.freenet.Key.routingKey; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; - -import java.net.MalformedURLException; - -import freenet.keys.FreenetURI; - -import org.junit.Test; - -/** - * Unit test for {@link Key}. - */ -public class KeyTest { - - private final FreenetURI uri; - private final Key key; - - public KeyTest() throws MalformedURLException { - uri = new FreenetURI( - "SSK@NfUYvxDwU9vqb2mh-qdT~DYJ6U0XNbxMGGoLe0aCHJs,Miglsgix0VR56ZiPl4NgjnUd~UdrnHqIvXJ3KKHmxmI,AQACAAE/some-site-12/foo/bar.html"); - key = from(uri); - } - - @Test - public void keyCanBeCreatedFromFreenetUri() throws MalformedURLException { - assertThat(key.getRoutingKey(), - is("NfUYvxDwU9vqb2mh-qdT~DYJ6U0XNbxMGGoLe0aCHJs")); - assertThat(key.getCryptoKey(), - is("Miglsgix0VR56ZiPl4NgjnUd~UdrnHqIvXJ3KKHmxmI")); - assertThat(key.getExtra(), is("AQACAAE")); - } - - @Test - public void keyCanBeConvertedToUsk() throws MalformedURLException { - FreenetURI uskUri = key.toUsk("other-site", 15, "some", "path.html"); - assertThat(uskUri.toString(), - is("USK@NfUYvxDwU9vqb2mh-qdT~DYJ6U0XNbxMGGoLe0aCHJs,Miglsgix0VR56ZiPl4NgjnUd~UdrnHqIvXJ3KKHmxmI,AQACAAE/other-site/15/some/path.html")); - } - - @Test - public void keyCanBeConvertedToSskWithoutEdition() - throws MalformedURLException { - FreenetURI uskUri = key.toSsk("other-site", "some", "path.html"); - assertThat(uskUri.toString(), - is("SSK@NfUYvxDwU9vqb2mh-qdT~DYJ6U0XNbxMGGoLe0aCHJs,Miglsgix0VR56ZiPl4NgjnUd~UdrnHqIvXJ3KKHmxmI,AQACAAE/other-site/some/path.html")); - } - - @Test - public void keyCanBeConvertedToSskWithEdition() - throws MalformedURLException { - FreenetURI uskUri = key.toSsk("other-site", 15, "some", "path.html"); - assertThat(uskUri.toString(), - is("SSK@NfUYvxDwU9vqb2mh-qdT~DYJ6U0XNbxMGGoLe0aCHJs,Miglsgix0VR56ZiPl4NgjnUd~UdrnHqIvXJ3KKHmxmI,AQACAAE/other-site-15/some/path.html")); - } - - @Test - public void routingKeyIsExtractCorrectly() { - assertThat(routingKey(uri), - is("NfUYvxDwU9vqb2mh-qdT~DYJ6U0XNbxMGGoLe0aCHJs")); - } - -} diff --git a/src/test/kotlin/net/pterodactylus/sone/freenet/FreenetURIsTest.kt b/src/test/kotlin/net/pterodactylus/sone/freenet/FreenetURIsTest.kt new file mode 100644 index 0000000..ca1fc6e --- /dev/null +++ b/src/test/kotlin/net/pterodactylus/sone/freenet/FreenetURIsTest.kt @@ -0,0 +1,24 @@ +package net.pterodactylus.sone.freenet + +import freenet.keys.* +import org.hamcrest.MatcherAssert.* +import org.hamcrest.Matchers.* +import org.junit.* + +/** + * Unit test for [Key]. + */ +class FreenetURIsTest { + + private val uri = FreenetURI("SSK@$routingKey,$cryptoKey,$extra/some-site-12/foo/bar.html") + + @Test + fun routingKeyIsExtractCorrectly() { + assertThat(uri.routingKeyString, equalTo(routingKey)) + } + +} + +private const val routingKey = "NfUYvxDwU9vqb2mh-qdT~DYJ6U0XNbxMGGoLe0aCHJs" +private const val cryptoKey = "Miglsgix0VR56ZiPl4NgjnUd~UdrnHqIvXJ3KKHmxmI" +private const val extra = "AQACAAE" diff --git a/src/test/kotlin/net/pterodactylus/sone/freenet/L10nFilterTest.kt b/src/test/kotlin/net/pterodactylus/sone/freenet/L10nFilterTest.kt index 66b1ab1..7024171 100644 --- a/src/test/kotlin/net/pterodactylus/sone/freenet/L10nFilterTest.kt +++ b/src/test/kotlin/net/pterodactylus/sone/freenet/L10nFilterTest.kt @@ -1,15 +1,12 @@ package net.pterodactylus.sone.freenet -import freenet.l10n.BaseL10n -import freenet.l10n.BaseL10n.LANGUAGE.ENGLISH -import net.pterodactylus.sone.test.mock -import net.pterodactylus.sone.test.whenever -import net.pterodactylus.util.template.TemplateContext -import org.hamcrest.MatcherAssert.assertThat -import org.hamcrest.Matchers.equalTo -import org.junit.Before -import org.junit.Test -import org.mockito.ArgumentMatchers.anyString +import freenet.l10n.* +import freenet.l10n.BaseL10n.LANGUAGE.* +import net.pterodactylus.sone.test.* +import org.hamcrest.MatcherAssert.* +import org.hamcrest.Matchers.* +import org.junit.* +import org.mockito.ArgumentMatchers.* /** * Unit test for [L10nFilter]. @@ -18,7 +15,6 @@ class L10nFilterTest { private val l10n = mock() private val filter = L10nFilter(l10n) - private val templateContext = mock() private val translations = mutableMapOf() @Before @@ -30,31 +26,31 @@ class L10nFilterTest { @Test fun `translation without parameters returns translated string`() { translations["data"] = "translated data" - assertThat(filter.format(templateContext, "data", emptyMap()), equalTo("translated data")) + assertThat(filter.format(null, "data", emptyMap()), equalTo("translated data")) } @Test fun `translation with parameters returned translated string`() { translations["data"] = "translated {0,number} {1}" - assertThat(filter.format(templateContext, "data", mapOf("0" to 4.5, "1" to "data")), equalTo("translated 4.5 data")) + assertThat(filter.format(null, "data", mapOf("0" to 4.5, "1" to "data")), equalTo("translated 4.5 data")) } @Test fun `filter processes l10n text without parameters correctly`() { translations["data"] = "translated data" - assertThat(filter.format(templateContext, L10nText("data"), emptyMap()), equalTo("translated data")) + assertThat(filter.format(null, L10nText("data"), emptyMap()), equalTo("translated data")) } @Test fun `filter processes l10n text with parameters correctly`() { translations["data"] = "translated {0,number} {1}" - assertThat(filter.format(templateContext, L10nText("data", listOf(4.5, "data")), emptyMap()), equalTo("translated 4.5 data")) + assertThat(filter.format(null, L10nText("data", listOf(4.5, "data")), emptyMap()), equalTo("translated 4.5 data")) } @Test fun `filter does not replace values if there are no parameters`() { translations["data"] = "{link}" - assertThat(filter.format(templateContext, "data", emptyMap()), equalTo("{link}")) + assertThat(filter.format(null, "data", emptyMap()), equalTo("{link}")) } }