From d122b0bae6517c18dcea6d796e80f30f086fa994 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Fri, 16 Mar 2012 08:37:36 +0100 Subject: [PATCH] implementation and use of repository dao --- .../scm/repository/xml/XmlRepositoryDAO.java | 132 ++++++++++++++++++ .../repository/xml/XmlRepositoryDatabase.java | 29 +++- .../repository/xml/XmlRepositoryManager.java | 80 +++-------- .../java/sonia/scm/xml/AbstractXmlDAO.java | 4 +- .../repository/XmlRepositoryManagerTest.java | 7 +- .../main/java/sonia/scm/ScmServletModule.java | 13 +- 6 files changed, 195 insertions(+), 70 deletions(-) create mode 100644 scm-backend-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDAO.java diff --git a/scm-backend-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDAO.java b/scm-backend-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDAO.java new file mode 100644 index 0000000000..27a9c40c43 --- /dev/null +++ b/scm-backend-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDAO.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.repository.xml; + +//~--- non-JDK imports -------------------------------------------------------- + +import com.google.inject.Inject; +import com.google.inject.Singleton; + +import sonia.scm.repository.Repository; +import sonia.scm.repository.RepositoryDAO; +import sonia.scm.store.StoreFactory; +import sonia.scm.xml.AbstractXmlDAO; + +/** + * + * @author Sebastian Sdorra + */ +@Singleton +public class XmlRepositoryDAO + extends AbstractXmlDAO + implements RepositoryDAO +{ + + /** Field description */ + public static final String STORE_NAME = "repositories"; + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + * + * @param storeFactory + */ + @Inject + public XmlRepositoryDAO(StoreFactory storeFactory) + { + super(storeFactory.getStore(XmlRepositoryDatabase.class, STORE_NAME)); + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param type + * @param name + * + * @return + */ + @Override + public boolean contains(String type, String name) + { + return db.contains(type, name); + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param type + * @param name + * + * @return + */ + @Override + public Repository get(String type, String name) + { + return db.get(type, name); + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param repository + * + * @return + */ + @Override + protected Repository clone(Repository repository) + { + return repository.clone(); + } + + /** + * Method description + * + * + * @return + */ + @Override + protected XmlRepositoryDatabase createNewDatabase() + { + return new XmlRepositoryDatabase(); + } +} diff --git a/scm-backend-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDatabase.java b/scm-backend-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDatabase.java index d0993a73ba..a5c599c291 100644 --- a/scm-backend-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDatabase.java +++ b/scm-backend-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryDatabase.java @@ -36,6 +36,7 @@ package sonia.scm.repository.xml; //~--- non-JDK imports -------------------------------------------------------- import sonia.scm.repository.Repository; +import sonia.scm.xml.XmlDatabase; //~--- JDK imports ------------------------------------------------------------ @@ -55,7 +56,7 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; */ @XmlRootElement(name = "repository-db") @XmlAccessorType(XmlAccessType.FIELD) -public class XmlRepositoryDatabase +public class XmlRepositoryDatabase implements XmlDatabase { /** @@ -105,6 +106,7 @@ public class XmlRepositoryDatabase * * @param repository */ + @Override public void add(Repository repository) { repositoryMap.put(createKey(repository), repository); @@ -133,6 +135,7 @@ public class XmlRepositoryDatabase * * @return */ + @Override public boolean contains(String id) { return get(id) != null; @@ -166,8 +169,27 @@ public class XmlRepositoryDatabase * Method description * * + * @param id + * * @return */ + @Override + public Repository remove(String id) + { + Repository r = get(id); + + remove(r); + + return r; + } + + /** + * Method description + * + * + * @return + */ + @Override public Collection values() { return repositoryMap.values(); @@ -197,6 +219,7 @@ public class XmlRepositoryDatabase * * @return */ + @Override public Repository get(String id) { Repository repository = null; @@ -220,6 +243,7 @@ public class XmlRepositoryDatabase * * @return */ + @Override public long getCreationTime() { return creationTime; @@ -231,6 +255,7 @@ public class XmlRepositoryDatabase * * @return */ + @Override public long getLastModified() { return lastModified; @@ -244,6 +269,7 @@ public class XmlRepositoryDatabase * * @param creationTime */ + @Override public void setCreationTime(long creationTime) { this.creationTime = creationTime; @@ -255,6 +281,7 @@ public class XmlRepositoryDatabase * * @param lastModified */ + @Override public void setLastModified(long lastModified) { this.lastModified = lastModified; diff --git a/scm-backend-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryManager.java b/scm-backend-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryManager.java index f12b74e863..f7e018b51e 100644 --- a/scm-backend-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryManager.java +++ b/scm-backend-xml/src/main/java/sonia/scm/repository/xml/XmlRepositoryManager.java @@ -55,6 +55,7 @@ import sonia.scm.repository.PermissionUtil; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryAllreadyExistExeption; import sonia.scm.repository.RepositoryBrowser; +import sonia.scm.repository.RepositoryDAO; import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RepositoryHandler; import sonia.scm.repository.RepositoryHandlerNotFoundException; @@ -64,8 +65,6 @@ import sonia.scm.repository.RepositoryHookTask; import sonia.scm.repository.RepositoryListener; import sonia.scm.repository.RepositoryNotFoundException; import sonia.scm.security.ScmSecurityException; -import sonia.scm.store.Store; -import sonia.scm.store.StoreFactory; import sonia.scm.util.AssertUtil; import sonia.scm.util.CollectionAppender; import sonia.scm.util.HttpUtil; @@ -99,9 +98,6 @@ import javax.servlet.http.HttpServletRequest; public class XmlRepositoryManager extends AbstractRepositoryManager { - /** Field description */ - public static final String STORE_NAME = "repositories"; - /** Field description */ private static final Logger logger = LoggerFactory.getLogger(XmlRepositoryManager.class); @@ -116,7 +112,7 @@ public class XmlRepositoryManager extends AbstractRepositoryManager * * @param contextProvider * @param securityContextProvider - * @param storeFactory + * @param repositoryDAO * @param handlerSet * @param repositoryListenersProvider * @param repositoryHooksProvider @@ -125,12 +121,12 @@ public class XmlRepositoryManager extends AbstractRepositoryManager public XmlRepositoryManager( SCMContextProvider contextProvider, Provider securityContextProvider, - StoreFactory storeFactory, Set handlerSet, + RepositoryDAO repositoryDAO, Set handlerSet, Provider> repositoryListenersProvider, Provider> repositoryHooksProvider) { this.securityContextProvider = securityContextProvider; - this.store = storeFactory.getStore(XmlRepositoryDatabase.class, STORE_NAME); + this.repositoryDAO = repositoryDAO; this.repositoryListenersProvider = repositoryListenersProvider; this.repositoryHooksProvider = repositoryHooksProvider; handlerMap = new HashMap(); @@ -181,7 +177,7 @@ public class XmlRepositoryManager extends AbstractRepositoryManager SecurityUtil.assertIsAdmin(securityContextProvider); AssertUtil.assertIsValid(repository); - if (repositoryDB.contains(repository)) + if (repositoryDAO.contains(repository)) { throw new RepositoryAllreadyExistExeption(); } @@ -194,12 +190,7 @@ public class XmlRepositoryManager extends AbstractRepositoryManager getHandler(repository).create(repository); } - synchronized (XmlRepositoryDatabase.class) - { - repositoryDB.add(repository.clone()); - storeDB(); - } - + repositoryDAO.add(repository); fireEvent(repository, HandlerEvent.CREATE); } @@ -240,15 +231,10 @@ public class XmlRepositoryManager extends AbstractRepositoryManager assertIsOwner(repository); - if (repositoryDB.contains(repository)) + if (repositoryDAO.contains(repository)) { getHandler(repository).delete(repository); - - synchronized (XmlRepositoryDatabase.class) - { - repositoryDB.remove(repository); - storeDB(); - } + repositoryDAO.delete(repository); } else { @@ -273,7 +259,7 @@ public class XmlRepositoryManager extends AbstractRepositoryManager public void fireHookEvent(String type, String name, RepositoryHookEvent event) throws RepositoryNotFoundException { - Repository repository = repositoryDB.get(type, name); + Repository repository = repositoryDAO.get(type, name); if (repository == null) { @@ -296,7 +282,7 @@ public class XmlRepositoryManager extends AbstractRepositoryManager public void fireHookEvent(String id, RepositoryHookEvent event) throws RepositoryNotFoundException { - Repository repository = repositoryDB.get(id); + Repository repository = repositoryDAO.get(id); if (repository == null) { @@ -331,13 +317,6 @@ public class XmlRepositoryManager extends AbstractRepositoryManager @Override public void init(SCMContextProvider context) { - repositoryDB = store.get(); - - if (repositoryDB == null) - { - repositoryDB = new XmlRepositoryDatabase(); - } - Set listeners = repositoryListenersProvider.get(); if (Util.isNotEmpty(listeners)) @@ -374,7 +353,7 @@ public class XmlRepositoryManager extends AbstractRepositoryManager AssertUtil.assertIsValid(repository); - Repository notModifiedRepository = repositoryDB.get(repository.getType(), + Repository notModifiedRepository = repositoryDAO.get(repository.getType(), repository.getName()); if (notModifiedRepository != null) @@ -382,13 +361,7 @@ public class XmlRepositoryManager extends AbstractRepositoryManager assertIsOwner(notModifiedRepository); getHandler(repository).modify(repository); repository.setLastModified(System.currentTimeMillis()); - - synchronized (XmlRepositoryDatabase.class) - { - repositoryDB.remove(repository); - repositoryDB.add(repository.clone()); - storeDB(); - } + repositoryDAO.modify(repository); } else { @@ -415,7 +388,7 @@ public class XmlRepositoryManager extends AbstractRepositoryManager AssertUtil.assertIsNotNull(repository); assertIsReader(repository); - Repository fresh = repositoryDB.get(repository.getType(), + Repository fresh = repositoryDAO.get(repository.getType(), repository.getName()); if (fresh != null) @@ -444,7 +417,7 @@ public class XmlRepositoryManager extends AbstractRepositoryManager { AssertUtil.assertIsNotEmpty(id); - Repository repository = repositoryDB.get(id); + Repository repository = repositoryDAO.get(id); if (repository != null) { @@ -470,7 +443,7 @@ public class XmlRepositoryManager extends AbstractRepositoryManager AssertUtil.assertIsNotEmpty(type); AssertUtil.assertIsNotEmpty(name); - Repository repository = repositoryDB.get(type, name); + Repository repository = repositoryDAO.get(type, name); if (repository != null) { @@ -500,7 +473,7 @@ public class XmlRepositoryManager extends AbstractRepositoryManager { List repositories = new ArrayList(); - for (Repository repository : repositoryDB.values()) + for (Repository repository : repositoryDAO.getAll()) { if (handlerMap.containsKey(repository.getType()) && isReader(repository)) { @@ -545,7 +518,7 @@ public class XmlRepositoryManager extends AbstractRepositoryManager public Collection getAll(Comparator comparator, int start, int limit) { - return Util.createSubCollection(repositoryDB.values(), comparator, + return Util.createSubCollection(repositoryDAO.getAll(), comparator, new CollectionAppender() { @Override @@ -703,7 +676,7 @@ public class XmlRepositoryManager extends AbstractRepositoryManager if (handlerMap.containsKey(type)) { - Collection repositories = repositoryDB.values(); + Collection repositories = repositoryDAO.getAll(); for (Repository r : repositories) { @@ -781,7 +754,7 @@ public class XmlRepositoryManager extends AbstractRepositoryManager @Override public Long getLastModified() { - return repositoryDB.getLastModified(); + return repositoryDAO.getLastModified(); } /** @@ -905,16 +878,6 @@ public class XmlRepositoryManager extends AbstractRepositoryManager PermissionType.READ); } - /** - * Method description - * - */ - private void storeDB() - { - repositoryDB.setLastModified(System.currentTimeMillis()); - store.set(repositoryDB); - } - //~--- get methods ---------------------------------------------------------- /** @@ -987,14 +950,11 @@ public class XmlRepositoryManager extends AbstractRepositoryManager //~--- fields --------------------------------------------------------------- - /** Field description */ - private final Store store; - /** Field description */ private Map handlerMap; /** Field description */ - private XmlRepositoryDatabase repositoryDB; + private RepositoryDAO repositoryDAO; /** Field description */ private Provider> repositoryHooksProvider; 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 index e53571efba..53a31c7fdd 100644 --- a/scm-backend-xml/src/main/java/sonia/scm/xml/AbstractXmlDAO.java +++ b/scm-backend-xml/src/main/java/sonia/scm/xml/AbstractXmlDAO.java @@ -273,7 +273,7 @@ public abstract class AbstractXmlDAO store; /** Field description */ - private T db; + protected T db; } diff --git a/scm-backend-xml/src/test/java/sonia/scm/repository/XmlRepositoryManagerTest.java b/scm-backend-xml/src/test/java/sonia/scm/repository/XmlRepositoryManagerTest.java index dd501461c9..a64f5b2f6a 100644 --- a/scm-backend-xml/src/test/java/sonia/scm/repository/XmlRepositoryManagerTest.java +++ b/scm-backend-xml/src/test/java/sonia/scm/repository/XmlRepositoryManagerTest.java @@ -40,6 +40,7 @@ import com.google.inject.Provider; import org.junit.Test; import sonia.scm.Type; +import sonia.scm.repository.xml.XmlRepositoryDAO; import sonia.scm.repository.xml.XmlRepositoryManager; import sonia.scm.store.JAXBStoreFactory; import sonia.scm.store.StoreFactory; @@ -132,10 +133,12 @@ public class XmlRepositoryManagerTest extends RepositoryManagerTestBase when(hookProvider.get()).thenReturn(new HashSet()); + XmlRepositoryDAO repositoryDAO = new XmlRepositoryDAO(factory); + return new XmlRepositoryManager(contextProvider, MockUtil.getAdminSecurityContextProvider(), - factory, handlerSet, listenerProvider, - hookProvider); + repositoryDAO, handlerSet, + listenerProvider, hookProvider); } /** diff --git a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java index b4edd68282..b8f2c3db9f 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java @@ -51,7 +51,9 @@ import sonia.scm.filter.AdminSecurityFilter; import sonia.scm.filter.BaseUrlFilter; import sonia.scm.filter.GZipFilter; import sonia.scm.filter.SecurityFilter; +import sonia.scm.group.GroupDAO; import sonia.scm.group.GroupManager; +import sonia.scm.group.xml.XmlGroupDAO; import sonia.scm.group.xml.XmlGroupManager; import sonia.scm.io.DefaultFileSystem; import sonia.scm.io.FileSystem; @@ -65,8 +67,10 @@ import sonia.scm.repository.ChangesetViewerUtil; import sonia.scm.repository.DefaultRepositoryProvider; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryBrowserUtil; +import sonia.scm.repository.RepositoryDAO; import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryProvider; +import sonia.scm.repository.xml.XmlRepositoryDAO; import sonia.scm.repository.xml.XmlRepositoryManager; import sonia.scm.resources.DefaultResourceManager; import sonia.scm.resources.DevelopmentResourceManager; @@ -88,7 +92,9 @@ import sonia.scm.url.RestXmlUrlProvider; import sonia.scm.url.UrlProvider; import sonia.scm.url.UrlProviderFactory; import sonia.scm.url.WebUIUrlProvider; +import sonia.scm.user.UserDAO; import sonia.scm.user.UserManager; +import sonia.scm.user.xml.XmlUserDAO; import sonia.scm.user.xml.XmlUserManager; import sonia.scm.util.DebugServlet; import sonia.scm.util.ScmConfigurationUtil; @@ -118,10 +124,6 @@ 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; /** * @@ -258,7 +260,8 @@ public class ScmServletModule extends ServletModule // bind dao bind(GroupDAO.class, XmlGroupDAO.class); bind(UserDAO.class, XmlUserDAO.class); - + bind(RepositoryDAO.class, XmlRepositoryDAO.class); + // bind(RepositoryManager.class).annotatedWith(Undecorated.class).to( // BasicRepositoryManager.class); bind(RepositoryManager.class, XmlRepositoryManager.class);