1 package org
.argeo
.api
.acr
;
3 import java
.io
.PrintStream
;
5 import java
.net
.URISyntaxException
;
6 import java
.util
.Arrays
;
7 import java
.util
.Base64
;
9 import java
.util
.function
.BiConsumer
;
11 import javax
.xml
.namespace
.QName
;
13 public class ContentUtils
{
14 public static void traverse(Content content
, BiConsumer
<Content
, Integer
> doIt
) {
15 traverse(content
, doIt
, 0);
18 public static void traverse(Content content
, BiConsumer
<Content
, Integer
> doIt
, int currentDepth
) {
19 doIt
.accept(content
, currentDepth
);
20 int nextDepth
= currentDepth
+ 1;
21 for (Content child
: content
) {
22 traverse(child
, doIt
, nextDepth
);
26 public static void print(Content content
, PrintStream out
, int depth
, boolean printText
) {
27 StringBuilder sb
= new StringBuilder();
28 for (int i
= 0; i
< depth
; i
++) {
31 String prefix
= sb
.toString();
32 out
.println(prefix
+ content
.getName());
33 for (QName key
: content
.keySet()) {
34 out
.println(prefix
+ " " + key
+ "=" + content
.get(key
));
37 if (content
.hasText()) {
38 out
.println("<![CDATA[" + content
.getText().trim() + "]]>");
43 public static URI
bytesToDataURI(byte[] arr
) {
44 String base64Str
= Base64
.getEncoder().encodeToString(arr
);
46 final String PREFIX
= "data:application/octet-stream;base64,";
47 return new URI(PREFIX
+ base64Str
);
48 } catch (URISyntaxException e
) {
49 throw new IllegalStateException("Cannot serialize bytes a Base64 data URI", e
);
54 public static byte[] bytesFromDataURI(URI uri
) {
55 if (!"data".equals(uri
.getScheme()))
56 throw new IllegalArgumentException("URI must have 'data' as a scheme");
57 String schemeSpecificPart
= uri
.getSchemeSpecificPart();
58 int commaIndex
= schemeSpecificPart
.indexOf(',');
59 String prefix
= schemeSpecificPart
.substring(0, commaIndex
);
60 List
<String
> info
= Arrays
.asList(prefix
.split(";"));
61 if (!info
.contains("base64"))
62 throw new IllegalArgumentException("URI must specify base64");
64 String base64Str
= schemeSpecificPart
.substring(commaIndex
+ 1);
65 return Base64
.getDecoder().decode(base64Str
);
69 // public static <T> boolean isString(T t) {
70 // return t instanceof String;
74 * Split a path (with '/' separator) in an array of length 2, the first part
75 * being the parent path (which could be either absolute or relative), the
76 * second one being the last segment, (guaranteed to be with '/').
78 public static String
[] getParentPath(String path
) {
79 int parentIndex
= path
.lastIndexOf('/');
80 // TODO make it more robust
81 return new String
[] { parentIndex
!= 0 ? path
.substring(0, parentIndex
) : "/",
82 path
.substring(parentIndex
+ 1) };
86 private ContentUtils() {