I am trying to set authorizations in code, but the scanner is always returning
the previous fetch of data using the previous authorizations. I am setting the
Authorizations on the Connector, and then I get a new Scanner after setting the
Authorizations.
public Authorizations setAuthorizations(SecurityGroup[] authorizations)
{
List<byte[]> authorizationList = new ArrayList<byte[]>();
for (SecurityGroup auth : authorizations) {
String groupString = Security.getName(auth);
byte[] groupBytes = groupString.getBytes();
authorizationList.add(groupBytes);
}
Authorizations auths = new Authorizations(authorizationList);
try {
connector.securityOperations().changeUserAuthorizations(_loggedInUser, auths);
return auths;
} catch (AccumuloException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (AccumuloSecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public Scanner getScanner() {
try {
Authorizations auths = this.getAuthorizations();
return connector.createScanner(TABLE, auths);
} catch (TableNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
public Collection<Plate> filter(SecurityGroup[] authorizations, String
regEx) {
_db.setAuthorizations(authorizations);
Scanner scanner = _db.getScanner();
String valueRegex = (regEx.equals("")) ? ".*" : regEx + ".*";
scanner.fetchColumn(Plate.COLUMN_FAMILY, new
Text(Plate.PLATE_QUALIFIER));
IteratorSetting iter = new IteratorSetting(1, "regexfilter",
RegExFilter.class);
iter.addOption(RegExFilter.VALUE_REGEX, valueRegex);
scanner.addScanIterator(iter);
Iterator<Entry<Key, Value>> it = scanner.iterator();
Map<Text, Plate> map = new HashMap<Text, Plate>();
while (it.hasNext()) {
Entry<Key,Value> entry = it.next();
Text rowId = entry.getKey().getRow();
if (map.containsKey(rowId)) {
continue;
}
Plate plate = new Plate(Plate.getMap(rowId, scanner));
map.put(rowId, plate);
}
return map.values();
}