Ranides Atterwim %!s(int64=5) %!d(string=hai) anos
pai
achega
c03e2a1e9a

+ 2 - 1
assira/src/main/java/net/ranides/assira/io/uri/impl/CHTTPHandler.java

@@ -12,6 +12,7 @@ import net.ranides.assira.io.IOHandle;
 import net.ranides.assira.io.IOStreams;
 import net.ranides.assira.io.uri.*;
 import net.ranides.assira.text.Charsets;
+import net.ranides.assira.text.FormatBase64;
 import net.ranides.assira.text.StringTraits;
 import net.ranides.assira.trace.LoggerUtils;
 import org.slf4j.Logger;
@@ -220,7 +221,7 @@ public class CHTTPHandler implements URIHandler {
 
     private static void setAuthorizationHeader(HttpURLConnection connection, GenericMap<String> user) {
         String passphrase = user.get(UserProperty.LOGIN) + ":" + user.get(UserProperty.PASSWORD);
-        String header = "Basic " + FormatBase64.printBase64Binary(passphrase.getBytes());
+        String header = "Basic " + FormatBase64.format(passphrase.getBytes());
         connection.setRequestProperty("Authorization", header);
     }
 }

+ 0 - 121
assira/src/main/java/net/ranides/assira/io/uri/impl/FormatBase64.java

@@ -1,121 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright (c) 2007-2017 Oracle and/or its affiliates. All rights reserved.
- *
- * The contents of this file are subject to the terms of either the GNU
- * General Public License Version 2 only ("GPL") or the Common Development
- * and Distribution License("CDDL") (collectively, the "License").  You
- * may not use this file except in compliance with the License.  You can
- * obtain a copy of the License at
- * https://oss.oracle.com/licenses/CDDL+GPL-1.1
- * or LICENSE.txt.  See the License for the specific
- * language governing permissions and limitations under the License.
- *
- * When distributing the software, include this License Header Notice in each
- * file and include the License file at LICENSE.txt.
- *
- * GPL Classpath Exception:
- * Oracle designates this particular file as subject to the "Classpath"
- * exception as provided by Oracle in the GPL Version 2 section of the License
- * file that accompanied this code.
- *
- * Modifications:
- * If applicable, add the following below the License Header, with the fields
- * enclosed by brackets [] replaced by your own identifying information:
- * "Portions Copyright [year] [name of copyright owner]"
- *
- * Contributor(s):
- * If you wish your version of this file to be governed by only the CDDL or
- * only the GPL Version 2, indicate your decision by adding "[Contributor]
- * elects to include this software in this distribution under the [CDDL or GPL
- * Version 2] license."  If you don't indicate a single choice of license, a
- * recipient has the option to distribute your version of this file under
- * either the CDDL, the GPL Version 2 or to extend the choice of license to
- * its licensees as provided above.  However, if you add GPL Version 2 code
- * and therefore, elected the GPL Version 2 license, then the option applies
- * only if the new code is made subject to such option by the copyright
- * holder.
- */
-
-package net.ranides.assira.io.uri.impl;
-
-class FormatBase64 {
-
-    private static final char[] encodeMap = initEncodeMap();
-
-    private static char[] initEncodeMap() {
-        char[] map = new char[64];
-        int i;
-        for (i = 0; i < 26; i++) {
-            map[i] = (char) ('A' + i);
-        }
-        for (i = 26; i < 52; i++) {
-            map[i] = (char) ('a' + (i - 26));
-        }
-        for (i = 52; i < 62; i++) {
-            map[i] = (char) ('0' + (i - 52));
-        }
-        map[62] = '+';
-        map[63] = '/';
-
-        return map;
-    }
-
-    static String printBase64Binary(byte[] input) {
-        return printBase64Binary(input, 0, input.length);
-    }
-
-    static String printBase64Binary(byte[] input, int offset, int len) {
-        char[] buf = new char[((len + 2) / 3) * 4];
-        int ptr = _printBase64Binary(input, offset, len, buf, 0);
-        assert ptr == buf.length;
-        return new String(buf);
-    }
-
-    /**
-     * Encodes a byte array into a char array by doing base64 encoding.
-     *
-     * The caller must supply a big enough buffer.
-     *
-     * @return
-     *      the value of {@code ptr+((len+2)/3)*4}, which is the new offset
-     *      in the output buffer where the further bytes should be placed.
-     */
-    private static int _printBase64Binary(byte[] input, int offset, int len, char[] buf, int ptr) {
-        // encode elements until only 1 or 2 elements are left to encode
-        int remaining = len;
-        int i;
-        for (i = offset;remaining >= 3; remaining -= 3, i += 3) {
-            buf[ptr++] = encode(input[i] >> 2);
-            buf[ptr++] = encode(
-                    ((input[i] & 0x3) << 4)
-                            | ((input[i + 1] >> 4) & 0xF));
-            buf[ptr++] = encode(
-                    ((input[i + 1] & 0xF) << 2)
-                            | ((input[i + 2] >> 6) & 0x3));
-            buf[ptr++] = encode(input[i + 2] & 0x3F);
-        }
-        // encode when exactly 1 element (left) to encode
-        if (remaining == 1) {
-            buf[ptr++] = encode(input[i] >> 2);
-            buf[ptr++] = encode(((input[i]) & 0x3) << 4);
-            buf[ptr++] = '=';
-            buf[ptr++] = '=';
-        }
-        // encode when exactly 2 elements (left) to encode
-        if (remaining == 2) {
-            buf[ptr++] = encode(input[i] >> 2);
-            buf[ptr++] = encode(((input[i] & 0x3) << 4)
-                    | ((input[i + 1] >> 4) & 0xF));
-            buf[ptr++] = encode((input[i + 1] & 0xF) << 2);
-            buf[ptr++] = '=';
-        }
-        return ptr;
-    }
-
-    private static char encode(int i) {
-        return encodeMap[i & 0x3F];
-    }
-
-}

+ 28 - 0
assira/src/main/java/net/ranides/assira/reflection/util/ClassUtils.java

@@ -14,6 +14,8 @@ import java.net.URL;
 import java.net.URLClassLoader;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.util.Optional;
+import java.util.function.Function;
 
 import net.ranides.assira.reflection.IAttribute;
 import net.ranides.assira.reflection.IClass;
@@ -30,6 +32,32 @@ public final class ClassUtils {
     private ClassUtils() {
         // utility class
     }
+
+    @SuppressWarnings("unchecked")
+    public static <T> Optional<T> cast(IClass<T> type, Object value) {
+        if(type.isInstance(value)) {
+            return Optional.of((T)value);
+        } else {
+            return Optional.empty();
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    public static <T> Optional<T> cast(Class<T> type, Object value) {
+        if(type.isInstance(value)) {
+            return Optional.of((T)value);
+        } else {
+            return Optional.empty();
+        }
+    }
+
+    public static <T> Function<Object, Optional<T>> cast(IClass<T> type) {
+        return value -> cast(type, value);
+    }
+
+    public static <T> Function<Object, Optional<T>> cast(Class<T> type) {
+        return value -> cast(type, value);
+    }
     
     public static IClass<?> box(IClass<?> ic) {
         return ic.attributes().has(IAttribute.PRIMITIVE) ? IClass.typeinfo(box(ic.raw())) : ic;

+ 18 - 0
assira/src/main/java/net/ranides/assira/text/FormatBase64.java

@@ -0,0 +1,18 @@
+package net.ranides.assira.text;
+
+import lombok.experimental.UtilityClass;
+
+import java.util.Base64;
+
+@UtilityClass
+public class FormatBase64 {
+
+    public static String format(byte[] data) {
+        return Base64.getEncoder().encodeToString(data);
+    }
+
+    public static byte[] parse(String data) {
+        return Base64.getDecoder().decode(data);
+    }
+
+}