implementation and use of user and group dao

This commit is contained in:
Sebastian Sdorra
2012-03-15 21:38:47 +01:00
parent 72a00e8371
commit 326612e00a
12 changed files with 702 additions and 130 deletions

View File

@@ -0,0 +1,97 @@
/**
* Copyright (c) 2010, Sebastian Sdorra All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer. 2. Redistributions in
* binary form must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution. 3. Neither the name of SCM-Manager;
* nor the names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.group.xml;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.Inject;
import com.google.inject.Singleton;
import sonia.scm.group.Group;
import sonia.scm.group.GroupDAO;
import sonia.scm.store.StoreFactory;
import sonia.scm.xml.AbstractXmlDAO;
/**
*
* @author Sebastian Sdorra
*/
@Singleton
public class XmlGroupDAO extends AbstractXmlDAO<Group, XmlGroupDatabase>
implements GroupDAO
{
/** Field description */
public static final String STORE_NAME = "groups";
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param storeFactory
*/
@Inject
public XmlGroupDAO(StoreFactory storeFactory)
{
super(storeFactory.getStore(XmlGroupDatabase.class, STORE_NAME));
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param group
*
* @return
*/
@Override
protected Group clone(Group group)
{
return group.clone();
}
/**
* Method description
*
*
* @return
*/
@Override
protected XmlGroupDatabase createNewDatabase()
{
return new XmlGroupDatabase();
}
}

View File

@@ -36,6 +36,7 @@ package sonia.scm.group.xml;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.group.Group;
import sonia.scm.xml.XmlDatabase;
//~--- JDK imports ------------------------------------------------------------
@@ -55,7 +56,7 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
*/
@XmlRootElement(name = "group-db")
@XmlAccessorType(XmlAccessType.FIELD)
public class XmlGroupDatabase
public class XmlGroupDatabase implements XmlDatabase<Group>
{
/**
@@ -78,6 +79,7 @@ public class XmlGroupDatabase
*
* @param group
*/
@Override
public void add(Group group)
{
groupMap.put(group.getName(), group);
@@ -91,6 +93,7 @@ public class XmlGroupDatabase
*
* @return
*/
@Override
public boolean contains(String groupname)
{
return groupMap.containsKey(groupname);
@@ -104,6 +107,7 @@ public class XmlGroupDatabase
*
* @return
*/
@Override
public Group remove(String groupname)
{
return groupMap.remove(groupname);
@@ -115,6 +119,7 @@ public class XmlGroupDatabase
*
* @return
*/
@Override
public Collection<Group> values()
{
return groupMap.values();
@@ -130,6 +135,7 @@ public class XmlGroupDatabase
*
* @return
*/
@Override
public Group get(String groupname)
{
return groupMap.get(groupname);
@@ -141,6 +147,7 @@ public class XmlGroupDatabase
*
* @return
*/
@Override
public long getCreationTime()
{
return creationTime;
@@ -152,6 +159,7 @@ public class XmlGroupDatabase
*
* @return
*/
@Override
public long getLastModified()
{
return lastModified;
@@ -165,6 +173,7 @@ public class XmlGroupDatabase
*
* @param creationTime
*/
@Override
public void setCreationTime(long creationTime)
{
this.creationTime = creationTime;
@@ -176,6 +185,7 @@ public class XmlGroupDatabase
*
* @param lastModified
*/
@Override
public void setLastModified(long lastModified)
{
this.lastModified = lastModified;

View File

@@ -48,13 +48,12 @@ import sonia.scm.TransformFilter;
import sonia.scm.group.AbstractGroupManager;
import sonia.scm.group.Group;
import sonia.scm.group.GroupAllreadyExistExeption;
import sonia.scm.group.GroupDAO;
import sonia.scm.group.GroupException;
import sonia.scm.group.GroupListener;
import sonia.scm.search.SearchRequest;
import sonia.scm.search.SearchUtil;
import sonia.scm.security.SecurityContext;
import sonia.scm.store.Store;
import sonia.scm.store.StoreFactory;
import sonia.scm.util.CollectionAppender;
import sonia.scm.util.SecurityUtil;
import sonia.scm.util.Util;
@@ -79,12 +78,6 @@ import java.util.Set;
public class XmlGroupManager extends AbstractGroupManager
{
/** Field description */
public static final String STORE_NAME = "groups";
/** Field description */
public static final String TYPE = "xml";
/** the logger for XmlGroupManager */
private static final Logger logger =
LoggerFactory.getLogger(XmlGroupManager.class);
@@ -96,16 +89,16 @@ public class XmlGroupManager extends AbstractGroupManager
*
*
* @param securityContextProvider
* @param storeFactory
* @param groupDAO
* @param groupListenerProvider
*/
@Inject
public XmlGroupManager(Provider<SecurityContext> securityContextProvider,
StoreFactory storeFactory,
GroupDAO groupDAO,
Provider<Set<GroupListener>> groupListenerProvider)
{
this.securityContextProvider = securityContextProvider;
this.store = storeFactory.getStore(XmlGroupDatabase.class, STORE_NAME);
this.groupDAO = groupDAO;
this.groupListenerProvider = groupListenerProvider;
}
@@ -144,7 +137,7 @@ public class XmlGroupManager extends AbstractGroupManager
SecurityUtil.assertIsAdmin(securityContextProvider);
if (groupDB.contains(group.getName()))
if (groupDAO.contains(group.getName()))
{
throw new GroupAllreadyExistExeption();
}
@@ -153,17 +146,11 @@ public class XmlGroupManager extends AbstractGroupManager
if (Util.isEmpty(type))
{
group.setType(TYPE);
group.setType(groupDAO.getType());
}
group.setCreationDate(System.currentTimeMillis());
synchronized (XmlGroupManager.class)
{
groupDB.add(group.clone());
storeDB();
}
groupDAO.add(group);
fireEvent(group, HandlerEvent.CREATE);
}
@@ -189,14 +176,9 @@ public class XmlGroupManager extends AbstractGroupManager
String name = group.getName();
if (groupDB.contains(name))
if (groupDAO.contains(name))
{
synchronized (XmlGroupManager.class)
{
groupDB.remove(name);
storeDB();
}
groupDAO.delete(group);
fireEvent(group, HandlerEvent.DELETE);
}
else
@@ -214,13 +196,6 @@ public class XmlGroupManager extends AbstractGroupManager
@Override
public void init(SCMContextProvider context)
{
groupDB = store.get();
if (groupDB == null)
{
groupDB = new XmlGroupDatabase();
}
Set<GroupListener> listeners = groupListenerProvider.get();
if (Util.isNotEmpty(listeners))
@@ -251,17 +226,10 @@ public class XmlGroupManager extends AbstractGroupManager
String name = group.getName();
if (groupDB.contains(name))
if (groupDAO.contains(name))
{
group.setLastModified(System.currentTimeMillis());
synchronized (XmlGroupManager.class)
{
groupDB.remove(name);
groupDB.add(group.clone());
storeDB();
}
groupDAO.modify(group);
fireEvent(group, HandlerEvent.MODIFY);
}
else
@@ -290,7 +258,7 @@ public class XmlGroupManager extends AbstractGroupManager
SecurityUtil.assertIsAdmin(securityContextProvider);
Group fresh = groupDB.get(group.getName());
Group fresh = groupDAO.get(group.getName());
if (fresh == null)
{
@@ -316,7 +284,7 @@ public class XmlGroupManager extends AbstractGroupManager
logger.debug("search group with query {}", searchRequest.getQuery());
}
return SearchUtil.search(searchRequest, groupDB.values(),
return SearchUtil.search(searchRequest, groupDAO.getAll(),
new TransformFilter<Group>()
{
@Override
@@ -348,7 +316,7 @@ public class XmlGroupManager extends AbstractGroupManager
@Override
public Group get(String id)
{
Group group = groupDB.get(id);
Group group = groupDAO.get(id);
if (group != null)
{
@@ -385,7 +353,7 @@ public class XmlGroupManager extends AbstractGroupManager
List<Group> groups = new ArrayList<Group>();
for (Group group : groupDB.values())
for (Group group : groupDAO.getAll())
{
groups.add(group.clone());
}
@@ -415,7 +383,7 @@ public class XmlGroupManager extends AbstractGroupManager
{
SecurityUtil.assertIsAdmin(securityContextProvider);
return Util.createSubCollection(groupDB.values(), comparator,
return Util.createSubCollection(groupDAO.getAll(), comparator,
new CollectionAppender<Group>()
{
@Override
@@ -454,7 +422,7 @@ public class XmlGroupManager extends AbstractGroupManager
{
LinkedList<Group> groups = new LinkedList<Group>();
for (Group group : groupDB.values())
for (Group group : groupDAO.getAll())
{
if (group.isMember(member))
{
@@ -474,32 +442,17 @@ public class XmlGroupManager extends AbstractGroupManager
@Override
public Long getLastModified()
{
return groupDB.getLastModified();
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*/
private void storeDB()
{
groupDB.setLastModified(System.currentTimeMillis());
store.set(groupDB);
return groupDAO.getLastModified();
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private XmlGroupDatabase groupDB;
private GroupDAO groupDAO;
/** Field description */
private Provider<Set<GroupListener>> groupListenerProvider;
/** Field description */
private Provider<SecurityContext> securityContextProvider;
/** Field description */
private Store<XmlGroupDatabase> store;
}

View File

@@ -0,0 +1,97 @@
/**
* Copyright (c) 2010, Sebastian Sdorra All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer. 2. Redistributions in
* binary form must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution. 3. Neither the name of SCM-Manager;
* nor the names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.user.xml;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.Inject;
import com.google.inject.Singleton;
import sonia.scm.store.StoreFactory;
import sonia.scm.user.User;
import sonia.scm.user.UserDAO;
import sonia.scm.xml.AbstractXmlDAO;
/**
*
* @author Sebastian Sdorra
*/
@Singleton
public class XmlUserDAO extends AbstractXmlDAO<User, XmlUserDatabase>
implements UserDAO
{
/** Field description */
public static final String STORE_NAME = "users";
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param storeFactory
*/
@Inject
public XmlUserDAO(StoreFactory storeFactory)
{
super(storeFactory.getStore(XmlUserDatabase.class, STORE_NAME));
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param user
*
* @return
*/
@Override
protected User clone(User user)
{
return user.clone();
}
/**
* Method description
*
*
* @return
*/
@Override
protected XmlUserDatabase createNewDatabase()
{
return new XmlUserDatabase();
}
}

View File

@@ -36,6 +36,7 @@ package sonia.scm.user.xml;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.user.User;
import sonia.scm.xml.XmlDatabase;
//~--- JDK imports ------------------------------------------------------------
@@ -55,7 +56,7 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
*/
@XmlRootElement(name = "user-db")
@XmlAccessorType(XmlAccessType.FIELD)
public class XmlUserDatabase
public class XmlUserDatabase implements XmlDatabase<User>
{
/**
@@ -78,6 +79,7 @@ public class XmlUserDatabase
*
* @param user
*/
@Override
public void add(User user)
{
userMap.put(user.getName(), user);
@@ -91,6 +93,7 @@ public class XmlUserDatabase
*
* @return
*/
@Override
public boolean contains(String username)
{
return userMap.containsKey(username);
@@ -104,6 +107,7 @@ public class XmlUserDatabase
*
* @return
*/
@Override
public User remove(String username)
{
return userMap.remove(username);
@@ -115,6 +119,7 @@ public class XmlUserDatabase
*
* @return
*/
@Override
public Collection<User> values()
{
return userMap.values();
@@ -130,6 +135,7 @@ public class XmlUserDatabase
*
* @return
*/
@Override
public User get(String username)
{
return userMap.get(username);
@@ -141,6 +147,7 @@ public class XmlUserDatabase
*
* @return
*/
@Override
public long getCreationTime()
{
return creationTime;
@@ -152,6 +159,7 @@ public class XmlUserDatabase
*
* @return
*/
@Override
public long getLastModified()
{
return lastModified;
@@ -165,6 +173,7 @@ public class XmlUserDatabase
*
* @param creationTime
*/
@Override
public void setCreationTime(long creationTime)
{
this.creationTime = creationTime;
@@ -176,6 +185,7 @@ public class XmlUserDatabase
*
* @param lastModified
*/
@Override
public void setLastModified(long lastModified)
{
this.lastModified = lastModified;

View File

@@ -48,11 +48,10 @@ import sonia.scm.TransformFilter;
import sonia.scm.search.SearchRequest;
import sonia.scm.search.SearchUtil;
import sonia.scm.security.ScmSecurityException;
import sonia.scm.store.Store;
import sonia.scm.store.StoreFactory;
import sonia.scm.user.AbstractUserManager;
import sonia.scm.user.User;
import sonia.scm.user.UserAllreadyExistException;
import sonia.scm.user.UserDAO;
import sonia.scm.user.UserException;
import sonia.scm.user.UserListener;
import sonia.scm.util.AssertUtil;
@@ -96,9 +95,6 @@ public class XmlUserManager extends AbstractUserManager
/** Field description */
public static final String STORE_NAME = "users";
/** Field description */
public static final String TYPE = "xml";
/** the logger for XmlUserManager */
private static final Logger logger =
LoggerFactory.getLogger(XmlUserManager.class);
@@ -110,16 +106,16 @@ public class XmlUserManager extends AbstractUserManager
*
*
* @param scurityContextProvider
* @param storeFactory
* @param userDAO
* @param userListenerProvider
*/
@Inject
public XmlUserManager(Provider<WebSecurityContext> scurityContextProvider,
StoreFactory storeFactory,
UserDAO userDAO,
Provider<Set<UserListener>> userListenerProvider)
{
this.scurityContextProvider = scurityContextProvider;
this.store = storeFactory.getStore(XmlUserDatabase.class, STORE_NAME);
this.userDAO = userDAO;
this.userListenerProvider = userListenerProvider;
}
@@ -149,7 +145,7 @@ public class XmlUserManager extends AbstractUserManager
@Override
public boolean contains(String username)
{
return userDB.contains(username);
return userDAO.contains(username);
}
/**
@@ -176,7 +172,7 @@ public class XmlUserManager extends AbstractUserManager
throw new ScmSecurityException("admin account is required");
}
if (userDB.contains(user.getName()))
if (userDAO.contains(user.getName()))
{
throw new UserAllreadyExistException(user.getName());
}
@@ -185,18 +181,12 @@ public class XmlUserManager extends AbstractUserManager
if (Util.isEmpty(type))
{
user.setType(TYPE);
user.setType(userDAO.getType());
}
AssertUtil.assertIsValid(user);
user.setCreationDate(System.currentTimeMillis());
synchronized (XmlUserManager.class)
{
userDB.add(user.clone());
storeDB();
}
userDAO.add(user);
fireEvent(user, HandlerEvent.CREATE);
}
@@ -221,14 +211,9 @@ public class XmlUserManager extends AbstractUserManager
String name = user.getName();
if (userDB.contains(name))
if (userDAO.contains(name))
{
synchronized (XmlUserManager.class)
{
userDB.remove(name);
storeDB();
}
userDAO.delete(user);
fireEvent(user, HandlerEvent.DELETE);
}
else
@@ -246,11 +231,10 @@ public class XmlUserManager extends AbstractUserManager
@Override
public void init(SCMContextProvider context)
{
userDB = store.get();
if (userDB == null)
// TODO improve
if (!userDAO.contains("scmadmin") &&!userDAO.contains("anonymous"))
{
userDB = new XmlUserDatabase();
createDefaultAccounts();
}
@@ -288,18 +272,11 @@ public class XmlUserManager extends AbstractUserManager
String name = user.getName();
if (userDB.contains(name))
if (userDAO.contains(name))
{
AssertUtil.assertIsValid(user);
user.setLastModified(System.currentTimeMillis());
synchronized (XmlUserManager.class)
{
userDB.remove(name);
userDB.add(user.clone());
storeDB();
}
userDAO.modify(user);
fireEvent(user, HandlerEvent.MODIFY);
}
else
@@ -327,7 +304,7 @@ public class XmlUserManager extends AbstractUserManager
SecurityUtil.assertIsAdmin(scurityContextProvider);
User fresh = userDB.get(user.getName());
User fresh = userDAO.get(user.getName());
if (fresh == null)
{
@@ -353,7 +330,7 @@ public class XmlUserManager extends AbstractUserManager
logger.debug("search user with query {}", searchRequest.getQuery());
}
return SearchUtil.search(searchRequest, userDB.values(),
return SearchUtil.search(searchRequest, userDAO.getAll(),
new TransformFilter<User>()
{
@Override
@@ -387,7 +364,7 @@ public class XmlUserManager extends AbstractUserManager
{
// SecurityUtil.assertIsAdmin(scurityContextProvider);
User user = userDB.get(id);
User user = userDAO.get(id);
if (user != null)
{
@@ -424,7 +401,7 @@ public class XmlUserManager extends AbstractUserManager
List<User> users = new ArrayList<User>();
for (User user : userDB.values())
for (User user : userDAO.getAll())
{
users.add(user.clone());
}
@@ -454,7 +431,7 @@ public class XmlUserManager extends AbstractUserManager
{
SecurityUtil.assertIsAdmin(scurityContextProvider);
return Util.createSubCollection(userDB.values(), comaparator,
return Util.createSubCollection(userDAO.getAll(), comaparator,
new CollectionAppender<User>()
{
@Override
@@ -489,7 +466,7 @@ public class XmlUserManager extends AbstractUserManager
@Override
public Long getLastModified()
{
return userDB.getLastModified();
return userDAO.getLastModified();
}
//~--- methods --------------------------------------------------------------
@@ -510,8 +487,7 @@ public class XmlUserManager extends AbstractUserManager
User user = (User) unmarshaller.unmarshal(input);
user.setCreationDate(System.currentTimeMillis());
userDB.add(user);
storeDB();
userDAO.add(user);
}
catch (Exception ex)
{
@@ -543,26 +519,13 @@ public class XmlUserManager extends AbstractUserManager
}
}
/**
* Method description
*
*/
private void storeDB()
{
userDB.setLastModified(System.currentTimeMillis());
store.set(userDB);
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private Provider<WebSecurityContext> scurityContextProvider;
/** Field description */
private Store<XmlUserDatabase> store;
/** Field description */
private XmlUserDatabase userDB;
private UserDAO userDAO;
/** Field description */
private Provider<Set<UserListener>> userListenerProvider;

View File

@@ -0,0 +1,294 @@
/**
* Copyright (c) 2010, Sebastian Sdorra All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer. 2. Redistributions in
* binary form must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution. 3. Neither the name of SCM-Manager;
* nor the names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.xml;
//~--- non-JDK imports --------------------------------------------------------
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.GenericDAO;
import sonia.scm.ModelObject;
import sonia.scm.group.xml.XmlGroupDAO;
import sonia.scm.store.Store;
//~--- JDK imports ------------------------------------------------------------
import java.util.Collection;
/**
*
* @author Sebastian Sdorra
*
* @param <I>
* @param <T>
*/
public abstract class AbstractXmlDAO<I extends ModelObject,
T extends XmlDatabase<I>> implements GenericDAO<I>
{
/** Field description */
public static final String TYPE = "xml";
/**
* the logger for XmlGroupDAO
*/
private static final Logger logger =
LoggerFactory.getLogger(XmlGroupDAO.class);
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
*
* @param store
*/
public AbstractXmlDAO(Store<T> store)
{
this.store = store;
db = store.get();
if (db == null)
{
db = createNewDatabase();
}
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param item
*
* @return
*/
protected abstract I clone(I item);
/**
* Method description
*
*
* @return
*/
protected abstract T createNewDatabase();
/**
* Method description
*
*
*
* @param item
*/
@Override
public void add(I item)
{
if (logger.isTraceEnabled())
{
logger.trace("add item {} to xml backend", item.getId());
}
synchronized (store)
{
db.add(clone(item));
storeDB();
}
}
/**
* Method description
*
*
*
* @param item
*
* @return
*/
@Override
public boolean contains(I item)
{
return contains(item.getId());
}
/**
* Method description
*
*
*
* @param id
*
* @return
*/
@Override
public boolean contains(String id)
{
return db.contains(id);
}
/**
* Method description
*
*
*
* @param item
*/
@Override
public void delete(I item)
{
if (logger.isTraceEnabled())
{
logger.trace("delete item {} from xml backend", item.getId());
}
synchronized (store)
{
db.remove(item.getId());
storeDB();
}
}
/**
* Method description
*
*
*
* @param item
*/
@Override
public void modify(I item)
{
if (logger.isTraceEnabled())
{
logger.trace("modify xml backend item {}", item.getId());
}
synchronized (store)
{
db.remove(item.getId());
db.add(clone(item));
storeDB();
}
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
*
* @param id
*
* @return
*/
@Override
public I get(String id)
{
return db.get(id);
}
/**
* Method description
*
*
* @return
*/
@Override
public Collection<I> getAll()
{
return db.values();
}
/**
* Method description
*
*
* @return
*/
@Override
public Long getCreationTime()
{
return db.getCreationTime();
}
/**
* Method description
*
*
* @return
*/
@Override
public Long getLastModified()
{
return db.getLastModified();
}
/**
* Method description
*
*
* @return
*/
@Override
public String getType()
{
return TYPE;
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*/
private void storeDB()
{
if (logger.isTraceEnabled())
{
logger.trace("store xml database");
}
db.setLastModified(System.currentTimeMillis());
store.set(db);
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private final Store<T> store;
/** Field description */
private T db;
}

View File

@@ -0,0 +1,132 @@
/**
* Copyright (c) 2010, Sebastian Sdorra All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer. 2. Redistributions in
* binary form must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution. 3. Neither the name of SCM-Manager;
* nor the names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.xml;
//~--- JDK imports ------------------------------------------------------------
import java.util.Collection;
/**
*
* @author Sebastian Sdorra
*
* @param <T>
*/
public interface XmlDatabase<T>
{
/**
* Method description
*
*
*
* @param item
*/
public void add(T item);
/**
* Method description
*
*
*
* @param id
*
* @return
*/
public boolean contains(String id);
/**
* Method description
*
*
*
* @param id
*
* @return
*/
public T remove(String id);
/**
* Method description
*
*
* @return
*/
public Collection<T> values();
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
*
* @param id
*
* @return
*/
public T get(String id);
/**
* Method description
*
*
* @return
*/
public long getCreationTime();
/**
* Method description
*
*
* @return
*/
public long getLastModified();
//~--- set methods ----------------------------------------------------------
/**
* Method description
*
*
* @param creationTime
*/
public void setCreationTime(long creationTime);
/**
* Method description
*
*
* @param lastModified
*/
public void setLastModified(long lastModified);
}

View File

@@ -39,6 +39,7 @@ import com.google.inject.Provider;
import sonia.scm.store.JAXBStoreFactory;
import sonia.scm.store.StoreFactory;
import sonia.scm.user.xml.XmlUserDAO;
import sonia.scm.user.xml.XmlUserManager;
import sonia.scm.util.MockUtil;
@@ -73,7 +74,9 @@ public class XmlUserManagerTest extends UserManagerTestBase
when(listenerProvider.get()).thenReturn(new HashSet<UserListener>());
XmlUserDAO userDAO = new XmlUserDAO(factory);
return new XmlUserManager(MockUtil.getAdminSecurityContextProvider(),
factory, listenerProvider);
userDAO, listenerProvider);
}
}

View File

@@ -118,6 +118,10 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import sonia.scm.group.GroupDAO;
import sonia.scm.group.xml.XmlGroupDAO;
import sonia.scm.user.UserDAO;
import sonia.scm.user.xml.XmlUserDAO;
/**
*
@@ -251,6 +255,10 @@ public class ScmServletModule extends ServletModule
// bind security cache
bind(CacheManager.class, EhCacheManager.class);
// bind dao
bind(GroupDAO.class, XmlGroupDAO.class);
bind(UserDAO.class, XmlUserDAO.class);
// bind(RepositoryManager.class).annotatedWith(Undecorated.class).to(
// BasicRepositoryManager.class);
bind(RepositoryManager.class, XmlRepositoryManager.class);

View File

@@ -64,6 +64,7 @@ import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import sonia.scm.user.xml.XmlUserDAO;
/**
*
@@ -144,7 +145,8 @@ public class ChangePasswordResource
logger.info("password change for user {}", currentUser.getName());
}
if (currentUser.getType().equals(XmlUserManager.TYPE))
// TODO remove dependency to xml implementation
if (currentUser.getType().equals(XmlUserDAO.TYPE))
{
User dbUser = userManager.get(currentUser.getName());

View File

@@ -61,6 +61,7 @@ import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sonia.scm.user.xml.XmlUserDAO;
/**
*
@@ -139,9 +140,11 @@ public class XmlAuthenticationHandlerTest extends AbstractTestBase
when(listenerProvider.get()).thenReturn(new HashSet<UserListener>());
XmlUserDAO userDAO = new XmlUserDAO(storeFactory);
XmlUserManager userManager =
new XmlUserManager(MockUtil.getAdminSecurityContextProvider(),
storeFactory, listenerProvider);
userDAO, listenerProvider);
userManager.init(contextProvider);
userManager.create(slarti);