/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.jooby.ehcache; import static java.util.Objects.requireNonNull; import java.util.HashMap; import java.util.Map; import javax.inject.Inject; import javax.inject.Named; import net.sf.ehcache.Ehcache; import net.sf.ehcache.Element; import org.jooby.Session; import org.jooby.Session.Builder; /** * {@link Session.Store} powered by an {@link Ehcache}. In order to use this store a * <code>session</code> cache is required. * * <pre> * ehcache.cache.session { * timeToIdle = 30m * } * </pre> * * In this example cache will expire after 30 minutes of inactivity. But of course, you can do * whatever you want/need. * * @author edgar * @since 0.6.0 */ public class EhSessionStore implements Session.Store { private Ehcache cache; @Inject public EhSessionStore(@Named("session") final Ehcache cache) { this.cache = requireNonNull(cache, "Sessions cache is required."); } @SuppressWarnings("unchecked") @Override public Session get(final Builder builder) { String sessionId = builder.sessionId(); Element element = cache.get(sessionId); if (element == null) { return null; } Map<String, String> attrs = new HashMap<>((Map<String, String>) element.getObjectValue()); return builder .accessedAt(Long.parseLong(attrs.remove("_accessedAt"))) .createdAt(Long.parseLong(attrs.remove("_createdAt"))) .savedAt(Long.parseLong(attrs.remove("_savedAt"))) .set(attrs) .build(); } @Override public void save(final Session session) { Map<String, String> attributes = new HashMap<>(session.attributes()); attributes.put("_accessedAt", Long.toString(session.accessedAt())); attributes.put("_createdAt", Long.toString(session.createdAt())); attributes.put("_savedAt", Long.toString(session.savedAt())); cache.put(new Element(session.id(), attributes)); } @Override public void create(final Session session) { save(session); } @Override public void delete(final String id) { cache.remove(id); } }