[jOOQ/jOOQ#9985] Refactor GrantImpl and RevokeImpl's privileges rendering

This commit is contained in:
Lukas Eder 2020-03-24 12:08:10 +01:00
parent 006615ab2b
commit 8e22487f23
3 changed files with 30 additions and 147 deletions

View File

@ -47,6 +47,7 @@ import static org.jooq.impl.Keywords.K_ON;
import static org.jooq.impl.Keywords.K_PUBLIC;
import static org.jooq.impl.Keywords.K_TO;
import static org.jooq.impl.Keywords.K_WITH_GRANT_OPTION;
import static org.jooq.impl.QueryPartCollectionView.wrap;
import java.util.Collection;
@ -98,17 +99,9 @@ final class GrantImpl extends AbstractRowCountQuery implements
@Override
public final void accept(Context<?> ctx) {
ctx.start(GRANT_PRIVILEGE)
.visit(K_GRANT).sql(' ');
String separator = "";
for (Privilege privilege : privileges) {
ctx.sql(separator)
.visit(privilege);
separator = ", ";
}
ctx.end(GRANT_PRIVILEGE).sql(' ')
.visit(K_GRANT).sql(' ')
.visit(wrap(privileges).indentSize(0))
.end(GRANT_PRIVILEGE).sql(' ')
.start(GRANT_ON)
.visit(K_ON).sql(' ')
.visit(table)

View File

@ -42,9 +42,7 @@ import static java.lang.Boolean.TRUE;
import static java.util.Arrays.asList;
import static org.jooq.impl.Tools.BooleanDataKey.DATA_LIST_ALREADY_INDENTED;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
@ -58,11 +56,9 @@ import org.jooq.Statement;
*
* @author Lukas Eder
*/
class QueryPartListView<T extends QueryPart> extends AbstractQueryPart implements List<T> {
class QueryPartListView<T extends QueryPart> extends QueryPartCollectionView<T> implements List<T> {
private static final long serialVersionUID = -2936922742534009564L;
private final List<T> wrappedList;
private int indentSize = 2;
static <T extends QueryPart> QueryPartListView<T> wrap(T[] wrappedList) {
return new QueryPartListView<>(wrappedList);
@ -77,15 +73,17 @@ class QueryPartListView<T extends QueryPart> extends AbstractQueryPart implement
}
QueryPartListView(List<T> wrappedList) {
this.wrappedList = wrappedList;
super(wrappedList);
}
/**
* Whether to indent this list, and after what size indentation is applied.
*/
@Override
QueryPartListView<T> indentSize(int newIndentSize) {
this.indentSize = newIndentSize;
return this;
return (QueryPartListView<T>) super.indentSize(newIndentSize);
}
@Override
List<T> wrapped() {
return (List<T>) super.wrapped();
}
@Override
@ -134,166 +132,64 @@ class QueryPartListView<T extends QueryPart> extends AbstractQueryPart implement
/**
* Subclasses may override this method
*/
@SuppressWarnings("unused")
protected void toSQLEmptyList(Context<?> context) {
}
@Override
protected void toSQLEmptyList(Context<?> context) {}
// -------------------------------------------------------------------------
// Implementations from the List API
// -------------------------------------------------------------------------
@Override
public final int size() {
return wrappedList.size();
}
@Override
public final boolean isEmpty() {
return wrappedList.isEmpty();
}
@Override
public final boolean contains(Object o) {
return wrappedList.contains(o);
}
@Override
public final Iterator<T> iterator() {
return wrappedList.iterator();
}
@Override
public final Object[] toArray() {
return wrappedList.toArray();
}
@Override
public final <E> E[] toArray(E[] a) {
return wrappedList.toArray(a);
}
@Override
public final boolean add(T e) {
if (e != null) {
return wrappedList.add(e);
}
return false;
}
@Override
public final boolean remove(Object o) {
return wrappedList.remove(o);
}
@Override
public final boolean containsAll(Collection<?> c) {
return wrappedList.containsAll(c);
}
@Override
public final boolean addAll(Collection<? extends T> c) {
return wrappedList.addAll(removeNulls(c));
}
@Override
public final boolean addAll(int index, Collection<? extends T> c) {
return wrappedList.addAll(index, removeNulls(c));
}
private final Collection<? extends T> removeNulls(Collection<? extends T> c) {
// [#2145] Collections that contain nulls are quite rare, so it is wise
// to add a relatively cheap defender check to avoid unnecessary loops
boolean containsNulls;
try {
containsNulls = c.contains(null);
}
// [#7991] Some immutable collections do not allow for nulls to be contained
catch (NullPointerException ignore) {
containsNulls = false;
}
if (containsNulls) {
List<T> list = new ArrayList<>(c);
Iterator<T> it = list.iterator();
while (it.hasNext())
if (it.next() == null)
it.remove();
return list;
}
else {
return c;
}
}
@Override
public final boolean removeAll(Collection<?> c) {
return wrappedList.removeAll(c);
}
@Override
public final boolean retainAll(Collection<?> c) {
return wrappedList.retainAll(c);
}
@Override
public final void clear() {
wrappedList.clear();
return wrapped().addAll(index, removeNulls(c));
}
@Override
public final T get(int index) {
return wrappedList.get(index);
return wrapped().get(index);
}
@Override
public final T set(int index, T element) {
if (element != null) {
return wrappedList.set(index, element);
}
if (element != null)
return wrapped().set(index, element);
return null;
}
@Override
public final void add(int index, T element) {
if (element != null) {
wrappedList.add(index, element);
}
if (element != null)
wrapped().add(index, element);
}
@Override
public final T remove(int index) {
return wrappedList.remove(index);
return wrapped().remove(index);
}
@Override
public final int indexOf(Object o) {
return wrappedList.indexOf(o);
return wrapped().indexOf(o);
}
@Override
public final int lastIndexOf(Object o) {
return wrappedList.lastIndexOf(o);
return wrapped().lastIndexOf(o);
}
@Override
public final ListIterator<T> listIterator() {
return wrappedList.listIterator();
return wrapped().listIterator();
}
@Override
public final ListIterator<T> listIterator(int index) {
return wrappedList.listIterator(index);
return wrapped().listIterator(index);
}
@Override
public final List<T> subList(int fromIndex, int toIndex) {
return wrappedList.subList(fromIndex, toIndex);
return wrapped().subList(fromIndex, toIndex);
}
}

View File

@ -49,6 +49,7 @@ import static org.jooq.impl.Keywords.K_ON;
import static org.jooq.impl.Keywords.K_PUBLIC;
import static org.jooq.impl.Keywords.K_RESTRICT;
import static org.jooq.impl.Keywords.K_REVOKE;
import static org.jooq.impl.QueryPartCollectionView.wrap;
import java.util.Collection;
@ -110,15 +111,8 @@ final class RevokeImpl extends AbstractRowCountQuery implements
ctx.visit(K_GRANT_OPTION_FOR)
.sql(' ');
String separator = "";
for (Privilege privilege : privileges) {
ctx.sql(separator)
.visit(privilege);
separator = ", ";
}
ctx.end(REVOKE_PRIVILEGE).sql(' ')
ctx.visit(wrap(privileges).indentSize(0))
.end(REVOKE_PRIVILEGE).sql(' ')
.start(REVOKE_ON)
.visit(K_ON).sql(' ')
.visit(table)