/** * */ package org.minnal.security.session; import java.sql.Timestamp; import java.util.HashMap; import java.util.Map; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Transient; import org.activejpa.entity.Model; import org.minnal.utils.serializer.Serializer; import com.google.common.base.Charsets; import com.google.common.io.BaseEncoding; /** * @author ganeshs * */ @Entity @Table(name="sessions") public class JpaSession extends Model implements Session { private static final long serialVersionUID = 1L; private String id; private Map<String, Object> attributes = new HashMap<String, Object>(); private String data; private String serviceTicket; private Timestamp createdAt; public JpaSession() { } /** * @param id */ public JpaSession(String id) { this.id = id; this.createdAt = new Timestamp(System.currentTimeMillis()); } @Override @Id public String getId() { return id; } @Column(length=2000) String getData() { return data; } void setData(String data) { this.data = data; decodeData(data); } @Transient public Map<String, Object> getAttributes() { return attributes; } void setAttributes(Map<String, Object> attributes) { this.attributes = attributes; } void setId(String id) { this.id = id; } @SuppressWarnings("unchecked") public <T> T getAttribute(String name) { return (T) attributes.get(name); } public boolean containsAttribute(String name) { return attributes.containsKey(name); } public void removeAttribute(String name) { attributes.remove(name); } public void addAttribute(String name, Object value) { attributes.put(name, value); } public Timestamp getCreatedAt() { return createdAt != null ? new Timestamp(createdAt.getTime()) : null; } public void setCreatedAt(Timestamp createdAt) { this.createdAt = createdAt != null ? new Timestamp(createdAt.getTime()) : null; } void encodeData() { String content = Serializer.DEFAULT_JSON_SERIALIZER.serialize(attributes); data = BaseEncoding.base64().encode(content.getBytes(Charsets.UTF_8)); } void decodeData(String data) { byte[] bytes = BaseEncoding.base64().decode(data); setAttributes(Serializer.DEFAULT_JSON_SERIALIZER.deserialize(new String(bytes, Charsets.UTF_8), Map.class)); } public boolean hasExpired(long timeoutInSecs) { return new Timestamp(System.currentTimeMillis() - timeoutInSecs * 1000).after(createdAt); } /** * @return the serviceTicket */ public String getServiceTicket() { return serviceTicket; } /** * @param serviceTicket the serviceTicket to set */ public void setServiceTicket(String serviceTicket) { this.serviceTicket = serviceTicket; } @Override public void persist() { encodeData(); super.persist(); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; JpaSession other = (JpaSession) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } }