diff --git a/scm-backend-xml/src/main/java/sonia/scm/group/xml/XmlGroupDAO.java b/scm-backend-xml/src/main/java/sonia/scm/group/xml/XmlGroupDAO.java new file mode 100644 index 0000000000..baf96d8991 --- /dev/null +++ b/scm-backend-xml/src/main/java/sonia/scm/group/xml/XmlGroupDAO.java @@ -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 + 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(); + } +} diff --git a/scm-backend-xml/src/main/java/sonia/scm/group/xml/XmlGroupDatabase.java b/scm-backend-xml/src/main/java/sonia/scm/group/xml/XmlGroupDatabase.java index e7bbe0de9e..431d53594a 100644 --- a/scm-backend-xml/src/main/java/sonia/scm/group/xml/XmlGroupDatabase.java +++ b/scm-backend-xml/src/main/java/sonia/scm/group/xml/XmlGroupDatabase.java @@ -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 { /** @@ -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 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; diff --git a/scm-backend-xml/src/main/java/sonia/scm/group/xml/XmlGroupManager.java b/scm-backend-xml/src/main/java/sonia/scm/group/xml/XmlGroupManager.java index 7550953461..e23e3ee514 100644 --- a/scm-backend-xml/src/main/java/sonia/scm/group/xml/XmlGroupManager.java +++ b/scm-backend-xml/src/main/java/sonia/scm/group/xml/XmlGroupManager.java @@ -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 securityContextProvider, - StoreFactory storeFactory, + GroupDAO groupDAO, Provider> 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 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() { @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 groups = new ArrayList(); - 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() { @Override @@ -454,7 +422,7 @@ public class XmlGroupManager extends AbstractGroupManager { LinkedList groups = new LinkedList(); - 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> groupListenerProvider; /** Field description */ private Provider securityContextProvider; - - /** Field description */ - private Store store; } diff --git a/scm-backend-xml/src/main/java/sonia/scm/user/xml/XmlUserDAO.java b/scm-backend-xml/src/main/java/sonia/scm/user/xml/XmlUserDAO.java new file mode 100644 index 0000000000..d4264e66d7 --- /dev/null +++ b/scm-backend-xml/src/main/java/sonia/scm/user/xml/XmlUserDAO.java @@ -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 + 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(); + } +} diff --git a/scm-backend-xml/src/main/java/sonia/scm/user/xml/XmlUserDatabase.java b/scm-backend-xml/src/main/java/sonia/scm/user/xml/XmlUserDatabase.java index ab90f79e5a..579856fce7 100644 --- a/scm-backend-xml/src/main/java/sonia/scm/user/xml/XmlUserDatabase.java +++ b/scm-backend-xml/src/main/java/sonia/scm/user/xml/XmlUserDatabase.java @@ -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 { /** @@ -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 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; diff --git a/scm-backend-xml/src/main/java/sonia/scm/user/xml/XmlUserManager.java b/scm-backend-xml/src/main/java/sonia/scm/user/xml/XmlUserManager.java index f5d15cae62..b33d8e5aa5 100644 --- a/scm-backend-xml/src/main/java/sonia/scm/user/xml/XmlUserManager.java +++ b/scm-backend-xml/src/main/java/sonia/scm/user/xml/XmlUserManager.java @@ -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 scurityContextProvider, - StoreFactory storeFactory, + UserDAO userDAO, Provider> 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() { @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 users = new ArrayList(); - 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() { @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 scurityContextProvider; /** Field description */ - private Store store; - - /** Field description */ - private XmlUserDatabase userDB; + private UserDAO userDAO; /** Field description */ private Provider> userListenerProvider; diff --git a/scm-backend-xml/src/main/java/sonia/scm/xml/AbstractXmlDAO.java b/scm-backend-xml/src/main/java/sonia/scm/xml/AbstractXmlDAO.java new file mode 100644 index 0000000000..e53571efba --- /dev/null +++ b/scm-backend-xml/src/main/java/sonia/scm/xml/AbstractXmlDAO.java @@ -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 + * @param + */ +public abstract class AbstractXmlDAO> implements GenericDAO +{ + + /** 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 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 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 store; + + /** Field description */ + private T db; +} diff --git a/scm-backend-xml/src/main/java/sonia/scm/xml/XmlDatabase.java b/scm-backend-xml/src/main/java/sonia/scm/xml/XmlDatabase.java new file mode 100644 index 0000000000..db1e0f985c --- /dev/null +++ b/scm-backend-xml/src/main/java/sonia/scm/xml/XmlDatabase.java @@ -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 + */ +public interface XmlDatabase +{ + + /** + * 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 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); +} diff --git a/scm-backend-xml/src/test/java/sonia/scm/user/XmlUserManagerTest.java b/scm-backend-xml/src/test/java/sonia/scm/user/XmlUserManagerTest.java index 301bb3bd6f..eadfc1a672 100644 --- a/scm-backend-xml/src/test/java/sonia/scm/user/XmlUserManagerTest.java +++ b/scm-backend-xml/src/test/java/sonia/scm/user/XmlUserManagerTest.java @@ -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()); + XmlUserDAO userDAO = new XmlUserDAO(factory); + return new XmlUserManager(MockUtil.getAdminSecurityContextProvider(), - factory, listenerProvider); + userDAO, listenerProvider); } } diff --git a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java index 3d56d3f963..b4edd68282 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java @@ -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); diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/ChangePasswordResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/ChangePasswordResource.java index 471deceac9..ad7957174d 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/ChangePasswordResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/ChangePasswordResource.java @@ -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()); diff --git a/scm-webapp/src/test/java/sonia/scm/web/security/XmlAuthenticationHandlerTest.java b/scm-webapp/src/test/java/sonia/scm/web/security/XmlAuthenticationHandlerTest.java index e952958d72..eb88aff91c 100644 --- a/scm-webapp/src/test/java/sonia/scm/web/security/XmlAuthenticationHandlerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/web/security/XmlAuthenticationHandlerTest.java @@ -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()); + XmlUserDAO userDAO = new XmlUserDAO(storeFactory); + XmlUserManager userManager = new XmlUserManager(MockUtil.getAdminSecurityContextProvider(), - storeFactory, listenerProvider); + userDAO, listenerProvider); userManager.init(contextProvider); userManager.create(slarti);