From f0ac0d1722daa02b522d28ce20efb49a4808ff7d Mon Sep 17 00:00:00 2001 From: Athou Date: Sat, 23 Mar 2013 19:46:09 +0100 Subject: [PATCH] handle session expiration --- .../backend/dao/FeedEntryStatusService.java | 2 +- .../com/commafeed/backend/dao/GenericDAO.java | 12 ++++++- .../backend/dao/UserSettingsService.java | 29 +++++++++++++++ .../frontend/CommaFeedApplication.java | 6 ++++ .../commafeed/frontend/model/Settings.java | 17 +++++++++ .../frontend/rest/RESTApplication.java | 7 ++-- .../frontend/rest/resources/AbstractREST.java | 27 +++++++++++--- .../frontend/rest/resources/EntriesREST.java | 10 ++---- .../frontend/rest/resources/SettingsREST.java | 35 +++++++++++++++++++ 9 files changed, 128 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/commafeed/backend/dao/UserSettingsService.java create mode 100644 src/main/java/com/commafeed/frontend/model/Settings.java create mode 100644 src/main/java/com/commafeed/frontend/rest/resources/SettingsREST.java diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusService.java b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusService.java index a7e81e39..6d08040c 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusService.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusService.java @@ -21,7 +21,7 @@ public class FeedEntryStatusService extends GenericDAO { FeedEntryStatus status = null; try { - criteria.getSingleResult(); + status = criteria.getSingleResult(); } catch (NoResultException e) { status = null; } diff --git a/src/main/java/com/commafeed/backend/dao/GenericDAO.java b/src/main/java/com/commafeed/backend/dao/GenericDAO.java index 205b3409..a8487d09 100644 --- a/src/main/java/com/commafeed/backend/dao/GenericDAO.java +++ b/src/main/java/com/commafeed/backend/dao/GenericDAO.java @@ -10,13 +10,15 @@ import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; +import com.commafeed.backend.model.AbstractModel; import com.commafeed.frontend.utils.ModelFactory.MF; import com.google.common.reflect.TypeToken; import com.uaihebert.factory.EasyCriteriaFactory; import com.uaihebert.model.EasyCriteria; @SuppressWarnings("serial") -public abstract class GenericDAO implements Serializable { +public abstract class GenericDAO implements + Serializable { private TypeToken type = new TypeToken(getClass()) { }; @@ -41,6 +43,14 @@ public abstract class GenericDAO implements Serializable { } } + public void saveOrUpdate(AbstractModel m) { + if (m.getId() == null) { + em.persist(m); + } else { + em.merge(m); + } + } + public void delete(T object) { object = em.merge(object); em.remove(object); diff --git a/src/main/java/com/commafeed/backend/dao/UserSettingsService.java b/src/main/java/com/commafeed/backend/dao/UserSettingsService.java new file mode 100644 index 00000000..6cca0a77 --- /dev/null +++ b/src/main/java/com/commafeed/backend/dao/UserSettingsService.java @@ -0,0 +1,29 @@ +package com.commafeed.backend.dao; + +import javax.ejb.Stateless; +import javax.persistence.NoResultException; + +import com.commafeed.backend.model.User; +import com.commafeed.backend.model.UserSettings; +import com.commafeed.frontend.utils.ModelFactory.MF; +import com.uaihebert.factory.EasyCriteriaFactory; +import com.uaihebert.model.EasyCriteria; + +@Stateless +public class UserSettingsService extends GenericDAO { + + public UserSettings findByUser(User user) { + + EasyCriteria criteria = EasyCriteriaFactory + .createQueryCriteria(em, getType()); + criteria.andEquals(MF.i(proxy().getUser()), user); + + UserSettings settings = null; + try { + settings = criteria.getSingleResult(); + } catch (NoResultException e) { + settings = null; + } + return settings; + } +} diff --git a/src/main/java/com/commafeed/frontend/CommaFeedApplication.java b/src/main/java/com/commafeed/frontend/CommaFeedApplication.java index 3ad74c85..d029f48e 100644 --- a/src/main/java/com/commafeed/frontend/CommaFeedApplication.java +++ b/src/main/java/com/commafeed/frontend/CommaFeedApplication.java @@ -4,6 +4,7 @@ import javax.enterprise.inject.spi.BeanManager; import javax.naming.InitialContext; import javax.naming.NamingException; +import org.apache.wicket.Application; import org.apache.wicket.Page; import org.apache.wicket.Session; import org.apache.wicket.ajax.AjaxRequestTarget; @@ -105,4 +106,9 @@ public class CommaFeedApplication extends AuthenticatedWebApplication { return CommaFeedSession.class; } + public static CommaFeedApplication get() { + + return (CommaFeedApplication) Application.get(); + } + } diff --git a/src/main/java/com/commafeed/frontend/model/Settings.java b/src/main/java/com/commafeed/frontend/model/Settings.java new file mode 100644 index 00000000..b83a0604 --- /dev/null +++ b/src/main/java/com/commafeed/frontend/model/Settings.java @@ -0,0 +1,17 @@ +package com.commafeed.frontend.model; + +import java.io.Serializable; + +public class Settings implements Serializable { + + private String readingMode; + + public String getReadingMode() { + return readingMode; + } + + public void setReadingMode(String readingMode) { + this.readingMode = readingMode; + } + +} diff --git a/src/main/java/com/commafeed/frontend/rest/RESTApplication.java b/src/main/java/com/commafeed/frontend/rest/RESTApplication.java index 4bde4227..35332c76 100644 --- a/src/main/java/com/commafeed/frontend/rest/RESTApplication.java +++ b/src/main/java/com/commafeed/frontend/rest/RESTApplication.java @@ -5,8 +5,8 @@ import java.util.Set; import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; -import com.commafeed.frontend.rest.resources.AbstractREST; import com.commafeed.frontend.rest.resources.EntriesREST; +import com.commafeed.frontend.rest.resources.SettingsREST; import com.commafeed.frontend.rest.resources.SubscriptionsREST; import com.google.common.collect.Sets; @@ -17,10 +17,11 @@ public class RESTApplication extends Application { public Set> getClasses() { Set> set = Sets.newHashSet(); set.add(JSONMessageBodyWriter.class); - - set.add(AbstractREST.class); + set.add(SubscriptionsREST.class); set.add(EntriesREST.class); + set.add(SettingsREST.class); + return set; } } diff --git a/src/main/java/com/commafeed/frontend/rest/resources/AbstractREST.java b/src/main/java/com/commafeed/frontend/rest/resources/AbstractREST.java index f7609ffb..1b20e184 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/AbstractREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/AbstractREST.java @@ -10,8 +10,8 @@ import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import org.apache.wicket.Application; import org.apache.wicket.ThreadContext; +import org.apache.wicket.authentication.IAuthenticationStrategy; import org.apache.wicket.protocol.http.servlet.ServletWebRequest; import org.apache.wicket.protocol.http.servlet.ServletWebResponse; import org.apache.wicket.request.cycle.RequestCycle; @@ -20,7 +20,10 @@ import com.commafeed.backend.dao.FeedCategoryService; import com.commafeed.backend.dao.FeedEntryService; import com.commafeed.backend.dao.FeedEntryStatusService; import com.commafeed.backend.dao.FeedSubscriptionService; +import com.commafeed.backend.dao.UserService; +import com.commafeed.backend.dao.UserSettingsService; import com.commafeed.backend.model.User; +import com.commafeed.frontend.CommaFeedApplication; import com.commafeed.frontend.CommaFeedSession; @Produces(MediaType.APPLICATION_JSON) @@ -44,19 +47,33 @@ public abstract class AbstractREST { @Inject FeedEntryStatusService feedEntryStatusService; + @Inject + UserService userService; + + @Inject + UserSettingsService userSettingsService; + @PostConstruct public void init() { + CommaFeedApplication app = CommaFeedApplication.get(); ServletWebRequest swreq = new ServletWebRequest(request, ""); ServletWebResponse swresp = new ServletWebResponse(swreq, response); - RequestCycle cycle = Application.get() - .createRequestCycle(swreq, swresp); + RequestCycle cycle = app.createRequestCycle(swreq, swresp); ThreadContext.setRequestCycle(cycle); - Application.get().fetchCreateAndSetSession( - Application.get().createRequestCycle(swreq, swresp)); + CommaFeedSession session = (CommaFeedSession) app + .fetchCreateAndSetSession(cycle); + + IAuthenticationStrategy authenticationStrategy = app + .getSecuritySettings().getAuthenticationStrategy(); + String[] data = authenticationStrategy.load(); + if (data != null && data.length > 1) { + session.signIn(data[0], data[1]); + } if (getUser() == null) { throw new WebApplicationException(Response.Status.UNAUTHORIZED); } + } protected User getUser() { diff --git a/src/main/java/com/commafeed/frontend/rest/resources/EntriesREST.java b/src/main/java/com/commafeed/frontend/rest/resources/EntriesREST.java index 9cb153b6..efb4db23 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/EntriesREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/EntriesREST.java @@ -70,8 +70,8 @@ public class EntriesREST extends AbstractREST { feedEntries = feedEntryService.getUnreadEntries( subscription.getFeed(), getUser()); } else { - feedEntries = feedEntryService.getAllEntries( - subscription.getFeed()); + feedEntries = feedEntryService + .getAllEntries(subscription.getFeed()); } List entries = Lists.newArrayList(); @@ -118,11 +118,7 @@ public class EntriesREST extends AbstractREST { status.setEntry(entry); } status.setRead(read); - if (status.getId() == null) { - feedEntryStatusService.save(status); - } else { - feedEntryStatusService.update(status); - } + feedEntryStatusService.saveOrUpdate(status); } } diff --git a/src/main/java/com/commafeed/frontend/rest/resources/SettingsREST.java b/src/main/java/com/commafeed/frontend/rest/resources/SettingsREST.java new file mode 100644 index 00000000..118ca1fc --- /dev/null +++ b/src/main/java/com/commafeed/frontend/rest/resources/SettingsREST.java @@ -0,0 +1,35 @@ +package com.commafeed.frontend.rest.resources; + +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; + +import com.commafeed.backend.model.UserSettings; +import com.commafeed.backend.model.UserSettings.ReadingMode; +import com.commafeed.frontend.model.Settings; + +@Path("settings") +public class SettingsREST extends AbstractREST { + + @Path("get") + @GET + public Settings get() { + UserSettings settings = userSettingsService.findByUser(getUser()); + Settings s = new Settings(); + s.setReadingMode(settings.getReadingMode().name().toLowerCase()); + return s; + } + + @Path("save") + @POST + public void save(Settings settings) { + UserSettings s = userSettingsService.findByUser(getUser()); + if (s == null) { + s = new UserSettings(); + s.setUser(getUser()); + } + s.setReadingMode(ReadingMode.valueOf(settings.getReadingMode())); + userSettingsService.saveOrUpdate(s); + + } +}