diff --git a/jOOQ/src/main/java/org/jooq/impl/GrantImpl.java b/jOOQ/src/main/java/org/jooq/impl/GrantImpl.java index 978872cfb1..91e0b702ab 100644 --- a/jOOQ/src/main/java/org/jooq/impl/GrantImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/GrantImpl.java @@ -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) diff --git a/jOOQ/src/main/java/org/jooq/impl/QueryPartListView.java b/jOOQ/src/main/java/org/jooq/impl/QueryPartListView.java index 960726ab51..6689c1051c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QueryPartListView.java +++ b/jOOQ/src/main/java/org/jooq/impl/QueryPartListView.java @@ -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 extends AbstractQueryPart implements List { +class QueryPartListView extends QueryPartCollectionView implements List { private static final long serialVersionUID = -2936922742534009564L; - private final List wrappedList; - private int indentSize = 2; static QueryPartListView wrap(T[] wrappedList) { return new QueryPartListView<>(wrappedList); @@ -77,15 +73,17 @@ class QueryPartListView extends AbstractQueryPart implement } QueryPartListView(List wrappedList) { - this.wrappedList = wrappedList; + super(wrappedList); } - /** - * Whether to indent this list, and after what size indentation is applied. - */ + @Override QueryPartListView indentSize(int newIndentSize) { - this.indentSize = newIndentSize; - return this; + return (QueryPartListView) super.indentSize(newIndentSize); + } + + @Override + List wrapped() { + return (List) super.wrapped(); } @Override @@ -134,166 +132,64 @@ class QueryPartListView 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 iterator() { - return wrappedList.iterator(); - } - - @Override - public final Object[] toArray() { - return wrappedList.toArray(); - } - - @Override - public final 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 c) { - return wrappedList.addAll(removeNulls(c)); - } - @Override public final boolean addAll(int index, Collection c) { - return wrappedList.addAll(index, removeNulls(c)); - } - - private final Collection removeNulls(Collection 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 list = new ArrayList<>(c); - Iterator 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 listIterator() { - return wrappedList.listIterator(); + return wrapped().listIterator(); } @Override public final ListIterator listIterator(int index) { - return wrappedList.listIterator(index); + return wrapped().listIterator(index); } @Override public final List subList(int fromIndex, int toIndex) { - return wrappedList.subList(fromIndex, toIndex); + return wrapped().subList(fromIndex, toIndex); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/RevokeImpl.java b/jOOQ/src/main/java/org/jooq/impl/RevokeImpl.java index 8a5211b780..88e0f8bd4a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RevokeImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/RevokeImpl.java @@ -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)