X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=security%2Fimpl%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fsecurity%2Fauthentication%2Fjpa%2FJpaGroupSet.java;fp=security%2Fimpl%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fsecurity%2Fauthentication%2Fjpa%2FJpaGroupSet.java;h=5c076d72083a33d8651e3c7ae0379211b83fbdc3;hb=0adf8fb6e00f08a022379cff5edb43fcde30184c;hp=0000000000000000000000000000000000000000;hpb=225f5d67c047f25de6bd53ae24f120fbc7fee620;p=utils diff --git a/security/impl/src/main/java/org/wamblee/security/authentication/jpa/JpaGroupSet.java b/security/impl/src/main/java/org/wamblee/security/authentication/jpa/JpaGroupSet.java new file mode 100644 index 00000000..5c076d72 --- /dev/null +++ b/security/impl/src/main/java/org/wamblee/security/authentication/jpa/JpaGroupSet.java @@ -0,0 +1,112 @@ +/* + * Copyright 2005-2010 the original author or authors. + * + * Licensed 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.wamblee.security.authentication.jpa; + +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; + +import org.wamblee.persistence.JpaMergeSupport; +import org.wamblee.security.authentication.Group; +import org.wamblee.security.authentication.GroupSet; + +/** + * Group set backed by the database. + * + * @author Erik Brakkee + */ +public class JpaGroupSet implements GroupSet { + + private EntityManager em; + + public JpaGroupSet(EntityManager aEm) { + em = aEm; + } + + @Override + public boolean add(Group aGroup) { + assert aGroup.getPrimaryKey() == null; + if (contains(aGroup)) { + return false; + } + em.persist(aGroup); + em.flush(); // to make sure the version is updated. + return true; + } + + @Override + public boolean contains(Group aGroup) { + return find(aGroup.getName()) != null; + } + + @Override + public Group find(String aName) { + TypedQuery query = em.createNamedQuery(Group.QUERY_FIND_BY_NAME, + Group.class); + query.setParameter(Group.NAME_PARAM, aName); + List groups = query.getResultList(); + if (groups.size() > 1) { + throw new RuntimeException( + "More than one group with the same name '" + aName + "'"); + } + + if (groups.size() == 0) { + return null; + } + return groups.get(0); + } + + @Override + public void groupModified(Group aGroup) { + assert aGroup.getPrimaryKey() != null; + Group merged = em.merge(aGroup); + // Need to flush so that version of the merged instance is updated so we + // can use + // the updated version in the original group passed in. That allows the + // same + // group object to continue to be used as a detached object. + em.flush(); + JpaMergeSupport.merge(merged, aGroup); + } + + @Override + public Set list() { + List groups = em.createNamedQuery(Group.QUERY_ALL_GROUPS, + Group.class).getResultList(); + Set res = new TreeSet(groups); + return res; + } + + @Override + public boolean remove(Group aGroup) { + Group group = find(aGroup.getName()); + if (group == null) { + return false; + } + em.remove(group); + return true; + } + + @Override + public int size() { + Long res = (Long) em.createNamedQuery(Group.QUERY_COUNT_GROUPS) + .getSingleResult(); + return res.intValue(); + } +}