package me.moodcat.api.filters; import java.io.IOException; import java.lang.annotation.Annotation; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseFilter; import me.moodcat.database.controllers.UserDAO; import me.moodcat.database.entities.User; import org.jboss.resteasy.core.interception.ContainerResponseContextImpl; import org.jboss.resteasy.specimpl.BuiltResponse; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.name.Named; /** * This Filter adds points for some requests. */ @javax.ws.rs.ext.Provider @AwardPoints public class AwardPointsFilter implements ContainerResponseFilter { private final Provider<User> currentUserProvider; private final Provider<UserDAO> userDAOProvider; @Inject public AwardPointsFilter(@Named("current.user") final Provider<User> currentUserProvider, final Provider<UserDAO> userDAOProvider) { this.currentUserProvider = currentUserProvider; this.userDAOProvider = userDAOProvider; } @Override public void filter(final ContainerRequestContext containerRequestContext, final ContainerResponseContext containerResponseContext) throws IOException { final ContainerResponseContextImpl impl = (ContainerResponseContextImpl) containerResponseContext; final BuiltResponse buildResponse = impl.getJaxrsResponse(); final Annotation[] annotations = buildResponse.getAnnotations(); final UserDAO userDAO = userDAOProvider.get(); final AwardPoints awardPoints = getFromArray(annotations, AwardPoints.class); if (awardPoints != null) { userDAO.incrementPoints(currentUserProvider.get(), awardPoints.value()); } } @SuppressWarnings("unchecked") private static <T extends V, V> T getFromArray(final V[] contents, final Class<T> type) { if (contents != null) { for (V value : contents) { if (type.isInstance(value)) { return (T) value; } } } return null; } }