package com.psddev.cms.db; import java.io.Closeable; import java.io.IOException; import java.util.Iterator; import java.util.List; import javax.servlet.http.HttpServletRequest; import com.psddev.cms.tool.AuthenticationFilter; import com.psddev.dari.db.ForwardingDatabase; import com.psddev.dari.db.Query; import com.psddev.dari.util.PaginatedResult; // CHECKSTYLE:OFF /** * Database wrapper that applies all profile-specific variations * automatically. * * @deprecated No replacement. */ @Deprecated public class VaryingDatabase extends ForwardingDatabase { private HttpServletRequest request; private Profile profile; public HttpServletRequest getRequest() { return request; } public void setRequest(HttpServletRequest request) { this.request = request; } /** Returns the profile. */ public Profile getProfile() { HttpServletRequest request = getRequest(); if (request != null && !AuthenticationFilter.Static.isAuthenticated(request)) { return profile; } else { return null; } } /** Sets the profile. */ public void setProfile(Profile profile) { this.profile = profile; } // --- ForwardingDatabase support --- @Override public <T> List<T> readAll(Query<T> query) { List<T> all = super.readAll(query); Profile profile = getProfile(); if (profile != null) { for (T item : all) { Variation.Static.applyAll(item, profile); } } return all; } @Override public <T> T readFirst(Query<T> query) { T first = super.readFirst(query); if (first != null) { Profile profile = getProfile(); if (profile != null) { Variation.Static.applyAll(first, getProfile()); } } return first; } @Override public <T> Iterable<T> readIterable(Query<T> query, int fetchSize) { return new FilteringIterable<T>(super.readIterable(query, fetchSize)); } private class FilteringIterable<E> implements Iterable<E> { private final Iterable<E> delegate; public FilteringIterable(Iterable<E> delegate) { this.delegate = delegate; } @Override public Iterator<E> iterator() { return new FilteringIterator<E>(delegate.iterator()); } } private class FilteringIterator<E> implements Closeable, Iterator<E> { private final Iterator<E> delegate; public FilteringIterator(Iterator<E> delegate) { this.delegate = delegate; } @Override public void close() throws IOException { if (delegate instanceof Closeable) { ((Closeable) delegate).close(); } } @Override public boolean hasNext() { return delegate.hasNext(); } @Override public E next() { E item = delegate.next(); if (item != null) { Profile profile = getProfile(); if (profile != null) { Variation.Static.applyAll(item, profile); } } return item; } @Override public void remove() { throw new UnsupportedOperationException(); } } @Override public <T> PaginatedResult<T> readPartial(Query<T> query, long offset, int limit) { PaginatedResult<T> result = super.readPartial(query, offset, limit); Profile profile = getProfile(); if (profile != null) { for (T item : result.getItems()) { Variation.Static.applyAll(item, profile); } } return result; } // --- Deprecated --- @Deprecated @Override public <T> List<T> readList(Query<T> query) { List<T> list = super.readList(query); Profile profile = getProfile(); if (profile != null) { for (T item : list) { Variation.Static.applyAll(item, profile); } } return list; } }