Skip to content

Commit 4cd761c

Browse files
author
Joe Alphonso
committed
add back needed methods
1 parent fcb9ba0 commit 4cd761c

3 files changed

Lines changed: 111 additions & 1 deletion

File tree

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package datawave.marking;
2+
3+
import java.util.Collections;
4+
import java.util.Map;
5+
6+
import org.apache.accumulo.core.data.ByteSequence;
7+
import org.apache.accumulo.core.security.ColumnVisibility;
8+
import org.apache.commons.collections4.map.LRUMap;
9+
10+
public class ColumnVisibilityCache {
11+
@SuppressWarnings("unchecked")
12+
private static Map<ByteSequence,ColumnVisibility> cache = Collections.synchronizedMap(new LRUMap(256));
13+
14+
public static ColumnVisibility get(ByteSequence bytes) {
15+
ColumnVisibility vis = cache.get(bytes);
16+
if (vis == null) {
17+
vis = new ColumnVisibility(bytes.toArray());
18+
cache.put(bytes, vis);
19+
}
20+
return vis;
21+
}
22+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package datawave.marking;
2+
3+
import java.util.Arrays;
4+
import java.util.Collections;
5+
import java.util.HashMap;
6+
import java.util.Map;
7+
8+
import org.apache.accumulo.core.data.ByteSequence;
9+
import org.apache.accumulo.core.security.ColumnVisibility;
10+
11+
/**
12+
* This is a cache that can be used per process to save flattened visibility calculations.
13+
*
14+
*/
15+
public class FlattenedVisibilityCache {
16+
private static Map<ColumnVisibility,byte[]> flattenedVisCache = Collections.synchronizedMap(new HashMap<>());
17+
18+
/**
19+
* Create a flattened visibility, using the cache if possible
20+
*
21+
* @param vis
22+
* the visibility to flatten
23+
* @return the flattened visibility
24+
*/
25+
public static byte[] flatten(ColumnVisibility vis) {
26+
byte[] visBytes = flattenedVisCache.get(vis);
27+
if (visBytes == null) {
28+
visBytes = vis.flatten();
29+
flattenedVisCache.put(vis, visBytes);
30+
}
31+
return visBytes;
32+
}
33+
34+
public static byte[] flatten(ByteSequence bytes) {
35+
return flatten(ColumnVisibilityCache.get(bytes));
36+
}
37+
38+
public static boolean equals(ColumnVisibility left, ColumnVisibility right) {
39+
return Arrays.equals(flatten(left), flatten(right));
40+
}
41+
}

core/utils/accumulo-utils/src/main/java/datawave/marking/MarkingFunctions.java

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
22

33
import static datawave.marking.AccessExpressionMarkings.ACCESS;
44

5+
import java.nio.charset.StandardCharsets;
56
import java.util.Collection;
67
import java.util.HashSet;
78
import java.util.Set;
89
import java.util.stream.Collectors;
910

1011
import org.apache.accumulo.access.AccessExpression;
1112
import org.apache.accumulo.access.ParsedAccessExpression;
13+
import org.apache.accumulo.core.security.Authorizations;
14+
import org.apache.accumulo.core.security.ColumnVisibility;
1215
import org.slf4j.Logger;
1316
import org.slf4j.LoggerFactory;
1417
import org.springframework.context.support.ClassPathXmlApplicationContext;
@@ -22,8 +25,21 @@
2225

2326
public interface MarkingFunctions<T extends Markings<?>> {
2427

28+
ColumnVisibility combineVisibilities(Collection<ColumnVisibility> visibilities) throws MarkingFunctions.Exception;
29+
2530
T combine(Collection<T> markings) throws MarkingFunctions.Exception;
2631

32+
ColumnVisibility translateToColumnVisibility(Markings<?> markings) throws MarkingFunctions.Exception;
33+
34+
Markings<?> translateFromColumnVisibility(ColumnVisibility columnVisibility) throws MarkingFunctions.Exception;
35+
36+
Markings<?> translateFromColumnVisibilityForAuths(ColumnVisibility columnVisibility, Collection<Authorizations> authorizations)
37+
throws MarkingFunctions.Exception;
38+
39+
Markings<?> translateFromColumnVisibilityForAuths(ColumnVisibility columnVisibility, Authorizations authorizations) throws MarkingFunctions.Exception;
40+
41+
byte[] flatten(ColumnVisibility vis);
42+
2743
class Exception extends java.lang.Exception {
2844

2945
public Exception() {
@@ -51,6 +67,11 @@ class Default implements MarkingFunctions<AccessExpressionMarkings> {
5167

5268
private static final AccessExpressionMarkings EMPTY_MARKINGS = AccessExpressionMarkings.builder().accessExpression(ACCESS.newExpression("")).build();
5369

70+
@Override
71+
public ColumnVisibility combineVisibilities(Collection<ColumnVisibility> visibilities) {
72+
throw new UnsupportedOperationException();
73+
}
74+
5475
@Override
5576
public AccessExpressionMarkings combine(Collection<AccessExpressionMarkings> markings) {
5677

@@ -78,9 +99,35 @@ public AccessExpressionMarkings combine(Collection<AccessExpressionMarkings> mar
7899
// @formatter:on
79100

80101
// normalize the Parsed Expression and then return a copy without the parse tree
81-
// FIXME: Using a beta of the accumulo-access API so temporarily using the normalize function from the example code
82102
return AccessExpressionMarkings.builder().accessExpression(ACCESS.newExpression(AccessExpressionUtil.normalize(expression).expression)).build();
83103
}
104+
105+
@Override
106+
public ColumnVisibility translateToColumnVisibility(Markings<?> markings) {
107+
AccessExpression accessExpression = AccessExpressionUtil.toAccessExpression(markings);
108+
return AccessExpressionUtil.toColumnVisibility(AccessExpressionUtil.normalize(accessExpression));
109+
}
110+
111+
@Override
112+
public Markings<?> translateFromColumnVisibility(ColumnVisibility expression) {
113+
AccessExpression accessExpression = ACCESS.newExpression(new String(expression.getExpression(), StandardCharsets.UTF_8));
114+
return AccessExpressionMarkings.builder().accessExpression(AccessExpressionUtil.normalize(accessExpression)).build();
115+
}
116+
117+
@Override
118+
public Markings<?> translateFromColumnVisibilityForAuths(ColumnVisibility columnVisibility, Collection<Authorizations> authorizations) {
119+
return translateFromColumnVisibility(columnVisibility);
120+
}
121+
122+
@Override
123+
public Markings<?> translateFromColumnVisibilityForAuths(ColumnVisibility columnVisibility, Authorizations authorizations) {
124+
return translateFromColumnVisibility(columnVisibility);
125+
}
126+
127+
@Override
128+
public byte[] flatten(ColumnVisibility vis) {
129+
return FlattenedVisibilityCache.flatten(vis);
130+
}
84131
}
85132

86133
/**

0 commit comments

Comments
 (0)