diff --git a/maven/pom.xml b/maven/pom.xml index 5a802c3e9b..10bf3a97cc 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -6,13 +6,13 @@ sonia.scm scm - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.maven scm-maven-plugins pom - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT scm-maven-plugins @@ -24,7 +24,7 @@ sonia.scm scm-core - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT diff --git a/maven/scm-plugin-archetype/pom.xml b/maven/scm-plugin-archetype/pom.xml index 21c440dc97..1b91f0b137 100644 --- a/maven/scm-plugin-archetype/pom.xml +++ b/maven/scm-plugin-archetype/pom.xml @@ -7,12 +7,12 @@ scm-maven-plugins sonia.scm.maven - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.maven scm-plugin-archetype - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT scm-plugin-archetype diff --git a/maven/scm-plugin-archetype/src/main/resources/archetype-resources/pom.xml b/maven/scm-plugin-archetype/src/main/resources/archetype-resources/pom.xml index 97f5e991f8..edeb3f16d4 100644 --- a/maven/scm-plugin-archetype/src/main/resources/archetype-resources/pom.xml +++ b/maven/scm-plugin-archetype/src/main/resources/archetype-resources/pom.xml @@ -7,7 +7,7 @@ scm-plugins sonia.scm.plugins - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT ${groupId} @@ -31,7 +31,7 @@ sonia.scm scm-test - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT test diff --git a/plugins/pom.xml b/plugins/pom.xml index b633839dcb..3062665774 100644 --- a/plugins/pom.xml +++ b/plugins/pom.xml @@ -6,13 +6,13 @@ sonia.scm scm - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.plugins scm-plugins pom - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT scm-plugins @@ -31,7 +31,7 @@ sonia.scm scm-core - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT diff --git a/plugins/scm-activedirectory-auth-plugin/pom.xml b/plugins/scm-activedirectory-auth-plugin/pom.xml index f7cd9227c9..cebd3b1226 100644 --- a/plugins/scm-activedirectory-auth-plugin/pom.xml +++ b/plugins/scm-activedirectory-auth-plugin/pom.xml @@ -7,12 +7,12 @@ scm-plugins sonia.scm.plugins - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.plugins scm-activedirectory-auth-plugin - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT scm-activedirectory-auth-plugin https://bitbucket.org/sdorra/scm-manager @@ -32,7 +32,7 @@ sonia.scm scm-core - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT diff --git a/plugins/scm-auth-ldap-plugin/pom.xml b/plugins/scm-auth-ldap-plugin/pom.xml index 65e4420914..a87456d8cd 100644 --- a/plugins/scm-auth-ldap-plugin/pom.xml +++ b/plugins/scm-auth-ldap-plugin/pom.xml @@ -6,13 +6,13 @@ scm-plugins sonia.scm.plugins - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.plugins scm-auth-ldap-plugin jar - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT ${project.artifactId} plugin description @@ -30,7 +30,7 @@ sonia.scm scm-test - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT test diff --git a/plugins/scm-auth-ldap-plugin/src/main/java/sonia/scm/auth/ldap/LDAPAuthenticationHandler.java b/plugins/scm-auth-ldap-plugin/src/main/java/sonia/scm/auth/ldap/LDAPAuthenticationHandler.java index 32311a3b64..57f141c1bd 100644 --- a/plugins/scm-auth-ldap-plugin/src/main/java/sonia/scm/auth/ldap/LDAPAuthenticationHandler.java +++ b/plugins/scm-auth-ldap-plugin/src/main/java/sonia/scm/auth/ldap/LDAPAuthenticationHandler.java @@ -49,6 +49,7 @@ import sonia.scm.user.User; import sonia.scm.util.AssertUtil; import sonia.scm.web.security.AuthenticationHandler; import sonia.scm.web.security.AuthenticationResult; +import sonia.scm.web.security.AuthenticationState; //~--- JDK imports ------------------------------------------------------------ @@ -57,8 +58,10 @@ import java.io.IOException; import java.text.MessageFormat; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Properties; +import java.util.Set; import javax.naming.Context; import javax.naming.NamingEnumeration; @@ -136,7 +139,8 @@ public class LDAPAuthenticationHandler implements AuthenticationHandler searchControls.setCountLimit(1); searchControls.setReturningAttributes(new String[] { config.getAttributeNameId(), - config.getAttributeNameFullname(), config.getAttributeNameMail() }); + config.getAttributeNameFullname(), config.getAttributeNameMail(), + config.getAttributeNameGroup() }); String filter = MessageFormat.format(config.getSearchFilter(), username); String baseDn = config.getUnitPeople() + "," + config.getBaseDn(); @@ -177,7 +181,7 @@ public class LDAPAuthenticationHandler implements AuthenticationHandler user.setType(TYPE); // - ArrayList groups = new ArrayList(); + HashSet groups = new HashSet(); searchControls = new SearchControls(); searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE); @@ -190,7 +194,6 @@ public class LDAPAuthenticationHandler implements AuthenticationHandler + userDn + "))", searchControls); // - while (searchResult2.hasMore()) { SearchResult sr2 = searchResult2.next(); @@ -209,9 +212,9 @@ public class LDAPAuthenticationHandler implements AuthenticationHandler } // + result = new AuthenticationResult(user, groups); + getGroups(userAttributes, groups); user.setAdmin(isAdmin(user.getName(), groups)); - - // result = new AuthenticationResult(user, groups); } catch (NamingException ex) @@ -370,6 +373,39 @@ public class LDAPAuthenticationHandler implements AuthenticationHandler //~--- get methods ---------------------------------------------------------- + /** + * Method description + * + * + * @param userAttributes + * @param groups + * + * @throws NamingException + */ + private void getGroups(Attributes userAttributes, HashSet groups) + throws NamingException + { + Attribute groupsAttribute = + userAttributes.get(config.getAttributeNameGroup()); + + if (groupsAttribute != null) + { + NamingEnumeration userGroups = + (NamingEnumeration) groupsAttribute.getAll(); + + while (userGroups.hasMore()) + { + groups.add((String) userGroups.next()); + } + + userGroups.close(); + } + else + { + logger.info("user has no groups assigned"); + } + } + /** * Method description * @@ -379,7 +415,7 @@ public class LDAPAuthenticationHandler implements AuthenticationHandler * * @return */ - private boolean isAdmin(String userName, List groups) + private boolean isAdmin(String userName, Set groups) { boolean admin = false; diff --git a/plugins/scm-auth-ldap-plugin/src/main/java/sonia/scm/auth/ldap/LDAPConfig.java b/plugins/scm-auth-ldap-plugin/src/main/java/sonia/scm/auth/ldap/LDAPConfig.java index bd914ade2c..1ddf1c7900 100644 --- a/plugins/scm-auth-ldap-plugin/src/main/java/sonia/scm/auth/ldap/LDAPConfig.java +++ b/plugins/scm-auth-ldap-plugin/src/main/java/sonia/scm/auth/ldap/LDAPConfig.java @@ -118,6 +118,10 @@ public class LDAPConfig return attributeNameMail; } + public String getAttributeNameGroup() { + return attributeNameGroup; + } + /** * Method description * @@ -306,6 +310,9 @@ public class LDAPConfig /** Field description */ @XmlElement(name = "attribute-name-mail") private String attributeNameMail = "mail"; + + @XmlElement(name = "attribute-name-group") + private String attributeNameGroup = "group"; /** Field description */ @XmlElement(name = "base-dn") diff --git a/plugins/scm-auth-ldap-plugin/src/main/resources/sonia/scm/auth/ldap/sonia.ldap.js b/plugins/scm-auth-ldap-plugin/src/main/resources/sonia/scm/auth/ldap/sonia.ldap.js index 5dc6021193..b8c6ba633d 100644 --- a/plugins/scm-auth-ldap-plugin/src/main/resources/sonia/scm/auth/ldap/sonia.ldap.js +++ b/plugins/scm-auth-ldap-plugin/src/main/resources/sonia/scm/auth/ldap/sonia.ldap.js @@ -69,6 +69,12 @@ registerGeneralConfigPanel({ name : 'attribute-name-mail', allowBlank : true } + ,{ + xtype : 'textfield', + fieldLabel : 'Group Attribute Name', + name : 'attribute-name-group', + allowBlank : true + } ,{ xtype : 'textfield', fieldLabel : 'Base DN', diff --git a/plugins/scm-bzr-plugin/pom.xml b/plugins/scm-bzr-plugin/pom.xml index d8d6b7dd76..1969825f3f 100644 --- a/plugins/scm-bzr-plugin/pom.xml +++ b/plugins/scm-bzr-plugin/pom.xml @@ -7,12 +7,12 @@ scm-plugins sonia.scm.plugins - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.plugins scm-bzr-plugin - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT scm-bzr-plugin https://bitbucket.org/sdorra/scm-manager Plugin for the version control system Bazaar diff --git a/plugins/scm-bzr-plugin/src/main/java/sonia/scm/repository/BzrRepositoryHandler.java b/plugins/scm-bzr-plugin/src/main/java/sonia/scm/repository/BzrRepositoryHandler.java index efdba8e56f..23c53a745c 100644 --- a/plugins/scm-bzr-plugin/src/main/java/sonia/scm/repository/BzrRepositoryHandler.java +++ b/plugins/scm-bzr-plugin/src/main/java/sonia/scm/repository/BzrRepositoryHandler.java @@ -36,15 +36,16 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- import com.google.inject.Inject; +import com.google.inject.Provider; import com.google.inject.Singleton; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import sonia.scm.Type; import sonia.scm.io.ExtendedCommand; +import sonia.scm.io.FileSystem; import sonia.scm.plugin.ext.Extension; import sonia.scm.store.StoreFactory; +import sonia.scm.util.SecurityUtil; +import sonia.scm.web.security.WebSecurityContext; //~--- JDK imports ------------------------------------------------------------ @@ -60,6 +61,9 @@ public class BzrRepositoryHandler extends AbstractSimpleRepositoryHandler { + /** Field description */ + public static final String PUBLIC_RESOURCEPATH_BASE = "/public/bzr/"; + /** Field description */ public static final String TYPE_DISPLAYNAME = "Bazaar"; @@ -69,10 +73,6 @@ public class BzrRepositoryHandler /** Field description */ public static final Type TYPE = new Type(TYPE_NAME, TYPE_DISPLAYNAME); - /** the logger for BzrRepositoryHandler */ - private static final Logger logger = - LoggerFactory.getLogger(BzrRepositoryHandler.class); - //~--- constructors --------------------------------------------------------- /** @@ -80,11 +80,43 @@ public class BzrRepositoryHandler * * * @param storeFactory + * @param fileSystem + * @param securityContextProvider */ @Inject - public BzrRepositoryHandler(StoreFactory storeFactory) + public BzrRepositoryHandler( + StoreFactory storeFactory, FileSystem fileSystem, + Provider securityContextProvider) { - super(storeFactory); + super(storeFactory, fileSystem); + this.securityContextProvider = securityContextProvider; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param repository + * + * @return + */ + @Override + public String createResourcePath(Repository repository) + { + String resourcePath = null; + + if (SecurityUtil.isAnonymous(securityContextProvider)) + { + resourcePath = PUBLIC_RESOURCEPATH_BASE.concat(repository.getName()); + } + else + { + resourcePath = super.createResourcePath(repository); + } + + return resourcePath; } //~--- get methods ---------------------------------------------------------- @@ -145,4 +177,9 @@ public class BzrRepositoryHandler { return BzrConfig.class; } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private Provider securityContextProvider; } diff --git a/plugins/scm-bzr-plugin/src/main/java/sonia/scm/web/BzrPublicFilter.java b/plugins/scm-bzr-plugin/src/main/java/sonia/scm/web/BzrPublicFilter.java new file mode 100644 index 0000000000..0abc13c21b --- /dev/null +++ b/plugins/scm-bzr-plugin/src/main/java/sonia/scm/web/BzrPublicFilter.java @@ -0,0 +1,131 @@ +/** + * 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.web; + +//~--- non-JDK imports -------------------------------------------------------- + +import com.google.inject.Inject; +import com.google.inject.Singleton; + +import sonia.scm.repository.BzrRepositoryHandler; +import sonia.scm.repository.Repository; +import sonia.scm.repository.RepositoryManager; +import sonia.scm.util.HttpUtil; +import sonia.scm.web.filter.HttpFilter; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.IOException; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * + * @author Sebastian Sdorra + */ +@Singleton +public class BzrPublicFilter extends HttpFilter +{ + + /** Field description */ + private static final Pattern REGEX_REPOSITORYNAME = + Pattern.compile("/public/bzr/([^/]+)"); + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + * + * @param repositoryManager + */ + @Inject + public BzrPublicFilter(RepositoryManager repositoryManager) + { + this.repositoryManager = repositoryManager; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param request + * @param response + * @param chain + * + * @throws IOException + * @throws ServletException + */ + @Override + protected void doFilter(HttpServletRequest request, + HttpServletResponse response, FilterChain chain) + throws IOException, ServletException + { + String requestURI = HttpUtil.getStrippedURI(request); + Matcher m = REGEX_REPOSITORYNAME.matcher(requestURI); + + if (m.find()) + { + String name = m.group(1); + Repository repository = + repositoryManager.get(BzrRepositoryHandler.TYPE_NAME, name); + + if ((repository != null) && repository.isPublicReadable()) + { + chain.doFilter(request, response); + } + else + { + response.setStatus(HttpServletResponse.SC_NOT_FOUND); + } + } + else + { + response.setStatus(HttpServletResponse.SC_NOT_FOUND); + } + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private RepositoryManager repositoryManager; +} diff --git a/plugins/scm-bzr-plugin/src/main/java/sonia/scm/web/BzrServletModule.java b/plugins/scm-bzr-plugin/src/main/java/sonia/scm/web/BzrServletModule.java index 086a81cafc..e9491f19b8 100644 --- a/plugins/scm-bzr-plugin/src/main/java/sonia/scm/web/BzrServletModule.java +++ b/plugins/scm-bzr-plugin/src/main/java/sonia/scm/web/BzrServletModule.java @@ -51,6 +51,9 @@ public class BzrServletModule extends ServletModule /** Field description */ public static final String MAPPING_BZR = "/bzr/*"; + /** Field description */ + public static final String MAPPING_PUBLICBZR = "/public/bzr/*"; + //~--- methods -------------------------------------------------------------- /** @@ -60,8 +63,10 @@ public class BzrServletModule extends ServletModule @Override protected void configureServlets() { - filter(MAPPING_BZR).through(BasicAuthenticationFilter.class); + filter(MAPPING_BZR, + MAPPING_PUBLICBZR).through(BasicAuthenticationFilter.class); filter(MAPPING_BZR).through(BzrPermissionFilter.class); - serve(MAPPING_BZR).with(BzrCGIServlet.class); + filter(MAPPING_PUBLICBZR).through(BzrPublicFilter.class); + serve(MAPPING_BZR, MAPPING_PUBLICBZR).with(BzrCGIServlet.class); } } diff --git a/plugins/scm-git-plugin/pom.xml b/plugins/scm-git-plugin/pom.xml index 6aa87c9280..bafc8c2b56 100644 --- a/plugins/scm-git-plugin/pom.xml +++ b/plugins/scm-git-plugin/pom.xml @@ -7,12 +7,12 @@ scm-plugins sonia.scm.plugins - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.plugins scm-git-plugin - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT scm-git-plugin https://bitbucket.org/sdorra/scm-manager Plugin for the version control system Git @@ -50,7 +50,7 @@ sonia.scm scm-test - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT test diff --git a/plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryHandler.java b/plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryHandler.java index 8a91f50b24..2a21f3b7de 100644 --- a/plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryHandler.java +++ b/plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryHandler.java @@ -41,6 +41,7 @@ import com.google.inject.Singleton; import org.eclipse.jgit.storage.file.FileRepositoryBuilder; import sonia.scm.Type; +import sonia.scm.io.FileSystem; import sonia.scm.plugin.ext.Extension; import sonia.scm.store.StoreFactory; @@ -75,11 +76,12 @@ public class GitRepositoryHandler * * * @param storeFactory + * @param fileSystem */ @Inject - public GitRepositoryHandler(StoreFactory storeFactory) + public GitRepositoryHandler(StoreFactory storeFactory, FileSystem fileSystem) { - super(storeFactory); + super(storeFactory, fileSystem); } //~--- get methods ---------------------------------------------------------- diff --git a/plugins/scm-git-plugin/src/test/java/sonia/scm/repository/GitRepositoryHandlerTest.java b/plugins/scm-git-plugin/src/test/java/sonia/scm/repository/GitRepositoryHandlerTest.java index 534ed94f07..eb9646ffe8 100644 --- a/plugins/scm-git-plugin/src/test/java/sonia/scm/repository/GitRepositoryHandlerTest.java +++ b/plugins/scm-git-plugin/src/test/java/sonia/scm/repository/GitRepositoryHandlerTest.java @@ -35,6 +35,7 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import sonia.scm.io.DefaultFileSystem; import sonia.scm.store.StoreFactory; import static org.junit.Assert.*; @@ -88,7 +89,8 @@ public class GitRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase protected RepositoryHandler createRepositoryHandler(StoreFactory factory, File directory) { - GitRepositoryHandler repositoryHandler = new GitRepositoryHandler(factory); + GitRepositoryHandler repositoryHandler = new GitRepositoryHandler(factory, + new DefaultFileSystem()); repositoryHandler.init(contextProvider); diff --git a/plugins/scm-graph-plugin/pom.xml b/plugins/scm-graph-plugin/pom.xml index 352544b356..98308b314d 100644 --- a/plugins/scm-graph-plugin/pom.xml +++ b/plugins/scm-graph-plugin/pom.xml @@ -7,12 +7,12 @@ scm-plugins sonia.scm.plugins - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.plugins scm-graph-plugin - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT scm-graph-plugin Creates an Google Guice injection graph https://bitbucket.org/sdorra/scm-manager diff --git a/plugins/scm-hg-plugin/pom.xml b/plugins/scm-hg-plugin/pom.xml index f573a55056..cb5d7278ce 100644 --- a/plugins/scm-hg-plugin/pom.xml +++ b/plugins/scm-hg-plugin/pom.xml @@ -7,12 +7,12 @@ sonia.scm.plugins scm-plugins - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.plugins scm-hg-plugin - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT scm-hg-plugin https://bitbucket.org/sdorra/scm-manager Plugin for the version control system Mercurial @@ -37,7 +37,7 @@ sonia.scm scm-test - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT test diff --git a/plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java b/plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java index aebaabdaf7..a71278c9fc 100644 --- a/plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java +++ b/plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java @@ -57,6 +57,7 @@ import sonia.scm.web.HgWebConfigWriter; import java.io.File; import java.io.IOException; +import sonia.scm.io.FileSystem; /** * @@ -90,9 +91,9 @@ public class HgRepositoryHandler * @param storeFactory */ @Inject - public HgRepositoryHandler(StoreFactory storeFactory) + public HgRepositoryHandler(StoreFactory storeFactory, FileSystem fileSystem) { - super(storeFactory); + super(storeFactory, fileSystem); } //~--- methods -------------------------------------------------------------- diff --git a/plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgRepositoryHandlerTest.java b/plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgRepositoryHandlerTest.java index a233b30353..cb3ed09d74 100644 --- a/plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgRepositoryHandlerTest.java +++ b/plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/HgRepositoryHandlerTest.java @@ -35,6 +35,7 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import sonia.scm.io.DefaultFileSystem; import sonia.scm.store.StoreFactory; import sonia.scm.util.Util; @@ -86,7 +87,8 @@ public class HgRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase protected RepositoryHandler createRepositoryHandler(StoreFactory factory, File directory) { - HgRepositoryHandler handler = new HgRepositoryHandler(factory); + HgRepositoryHandler handler = new HgRepositoryHandler(factory, + new DefaultFileSystem()); handler.init(contextProvider); handler.getConfig().setRepositoryDirectory(directory); diff --git a/plugins/scm-pam-plugin/pom.xml b/plugins/scm-pam-plugin/pom.xml index 62d1dd1470..59a0020fdd 100644 --- a/plugins/scm-pam-plugin/pom.xml +++ b/plugins/scm-pam-plugin/pom.xml @@ -7,12 +7,12 @@ scm-plugins sonia.scm.plugins - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.plugins scm-pam-plugin - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT scm-pam-plugin https://bitbucket.org/sdorra/scm-manager Using pam as an authentication handler. diff --git a/plugins/scm-svn-plugin/pom.xml b/plugins/scm-svn-plugin/pom.xml index b96cf290cb..5e18860803 100644 --- a/plugins/scm-svn-plugin/pom.xml +++ b/plugins/scm-svn-plugin/pom.xml @@ -7,12 +7,12 @@ scm-plugins sonia.scm.plugins - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.plugins scm-svn-plugin - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT scm-svn-plugin https://bitbucket.org/sdorra/scm-manager Plugin for the version control system Subversion @@ -47,7 +47,7 @@ sonia.scm scm-test - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT test diff --git a/plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnConfig.java b/plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnConfig.java index 0aedb39fac..829f11d5db 100644 --- a/plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnConfig.java +++ b/plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnConfig.java @@ -42,35 +42,4 @@ import javax.xml.bind.annotation.XmlRootElement; * @author Sebastian Sdorra */ @XmlRootElement(name = "config") -public class SvnConfig extends SimpleRepositoryConfig -{ - - /** - * Method description - * - * - * @return - */ - public String getSvnAccessFile() - { - return svnAccessFile; - } - - //~--- set methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @param svnAccessFile - */ - public void setSvnAccessFile(String svnAccessFile) - { - this.svnAccessFile = svnAccessFile; - } - - //~--- fields --------------------------------------------------------------- - - /** Field description */ - private String svnAccessFile; -} +public class SvnConfig extends SimpleRepositoryConfig {} diff --git a/plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java b/plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java index 4afbce9bac..4198310eec 100644 --- a/plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java +++ b/plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java @@ -42,6 +42,7 @@ import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.io.SVNRepositoryFactory; import sonia.scm.Type; +import sonia.scm.io.FileSystem; import sonia.scm.plugin.ext.Extension; import sonia.scm.store.StoreFactory; @@ -76,11 +77,12 @@ public class SvnRepositoryHandler * * * @param storeFactory + * @param fileSystem */ @Inject - public SvnRepositoryHandler(StoreFactory storeFactory) + public SvnRepositoryHandler(StoreFactory storeFactory, FileSystem fileSystem) { - super(storeFactory); + super(storeFactory, fileSystem); } //~--- get methods ---------------------------------------------------------- diff --git a/plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/SvnRepositoryHandlerTest.java b/plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/SvnRepositoryHandlerTest.java index 41dcbe403a..ab26da171f 100644 --- a/plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/SvnRepositoryHandlerTest.java +++ b/plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/SvnRepositoryHandlerTest.java @@ -35,6 +35,7 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import sonia.scm.io.DefaultFileSystem; import sonia.scm.store.StoreFactory; import static org.junit.Assert.*; @@ -83,7 +84,8 @@ public class SvnRepositoryHandlerTest extends SimpleRepositoryHandlerTestBase protected RepositoryHandler createRepositoryHandler(StoreFactory factory, File directory) { - SvnRepositoryHandler handler = new SvnRepositoryHandler(factory); + SvnRepositoryHandler handler = new SvnRepositoryHandler(factory, + new DefaultFileSystem()); handler.init(contextProvider); diff --git a/pom.xml b/pom.xml index a610b1a090..dc4bbb6dc0 100644 --- a/pom.xml +++ b/pom.xml @@ -6,11 +6,23 @@ sonia.scm scm pom - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT + + The easiest way to share your Git, Mercurial + and Subversion repositories over http. + scm http://bitbucket.org/sdorra/scm-manager + + + + BSD + http://www.opensource.org/licenses/bsd-license.php + + + sdorra @@ -66,12 +78,6 @@ - - slf4j-api - org.slf4j - ${slf4j.version} - - junit junit diff --git a/samples/pom.xml b/samples/pom.xml index 59ba3607d3..598d7e3cbb 100644 --- a/samples/pom.xml +++ b/samples/pom.xml @@ -6,13 +6,13 @@ sonia.scm scm - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.samples scm-samples pom - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT scm-samples diff --git a/samples/scm-sample-auth/pom.xml b/samples/scm-sample-auth/pom.xml index 2ec3b8fdc8..6b2f8233fb 100644 --- a/samples/scm-sample-auth/pom.xml +++ b/samples/scm-sample-auth/pom.xml @@ -7,12 +7,12 @@ scm-samples sonia.scm.samples - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.sample scm-sample-auth - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT scm-sample-auth Sample Authentication Plugin https://bitbucket.org/sdorra/scm-manager @@ -29,7 +29,7 @@ sonia.scm scm-core - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT diff --git a/samples/scm-sample-hello/pom.xml b/samples/scm-sample-hello/pom.xml index 9e4415ab2f..fa6231636e 100644 --- a/samples/scm-sample-hello/pom.xml +++ b/samples/scm-sample-hello/pom.xml @@ -7,12 +7,12 @@ scm-samples sonia.scm.samples - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.sample scm-sample-hello - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT scm-sample-hello A simple hello world plugin https://bitbucket.org/sdorra/scm-manager @@ -29,7 +29,7 @@ sonia.scm scm-core - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT diff --git a/scm-core/pom.xml b/scm-core/pom.xml index d87329b5ef..0c2a6a7e6b 100644 --- a/scm-core/pom.xml +++ b/scm-core/pom.xml @@ -7,12 +7,12 @@ scm sonia.scm - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm scm-core - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT scm-core @@ -24,6 +24,12 @@ provided + + slf4j-api + org.slf4j + ${slf4j.version} + + com.google.inject guice diff --git a/scm-webapp/src/main/java/sonia/scm/config/ScmConfiguration.java b/scm-core/src/main/java/sonia/scm/config/ScmConfiguration.java similarity index 100% rename from scm-webapp/src/main/java/sonia/scm/config/ScmConfiguration.java rename to scm-core/src/main/java/sonia/scm/config/ScmConfiguration.java diff --git a/scm-core/src/main/java/sonia/scm/io/DefaultFileSystem.java b/scm-core/src/main/java/sonia/scm/io/DefaultFileSystem.java new file mode 100644 index 0000000000..24f702b7d6 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/io/DefaultFileSystem.java @@ -0,0 +1,98 @@ +/** + * 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.io; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import sonia.scm.util.IOUtil; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.File; +import java.io.IOException; + +/** + * + * @author Sebastian Sdorra + */ +public class DefaultFileSystem implements FileSystem +{ + + /** the logger for DefaultFileSystem */ + private static final Logger logger = + LoggerFactory.getLogger(DefaultFileSystem.class); + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param directory + * + * @throws IOException + */ + @Override + public void create(File directory) throws IOException + { + if (logger.isInfoEnabled()) + { + logger.info("create directory {}", directory.getPath()); + } + + IOUtil.mkdirs(directory); + } + + /** + * Method description + * + * + * @param directory + * + * @throws IOException + */ + @Override + public void destroy(File directory) throws IOException + { + if (logger.isInfoEnabled()) + { + logger.info("destroy directory {}", directory.getPath()); + } + + IOUtil.delete(directory); + } +} diff --git a/scm-core/src/main/java/sonia/scm/io/FileSystem.java b/scm-core/src/main/java/sonia/scm/io/FileSystem.java new file mode 100644 index 0000000000..39c366a512 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/io/FileSystem.java @@ -0,0 +1,74 @@ +/** + * 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.io; + +//~--- non-JDK imports -------------------------------------------------------- + +import sonia.scm.plugin.ExtensionPoint; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.File; +import java.io.IOException; + +/** + * + * @author Sebastian Sdorra + */ +@ExtensionPoint +public interface FileSystem +{ + + /** + * Method description + * + * + * + * @param directory + * + * @throws IOException + */ + public void create(File directory) throws IOException; + + /** + * Method description + * + * + * + * @param directory + * + * @throws IOException + */ + public void destroy(File directory) throws IOException; +} diff --git a/scm-core/src/main/java/sonia/scm/plugin/PluginState.java b/scm-core/src/main/java/sonia/scm/plugin/PluginState.java index f451c34a75..566537e275 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/PluginState.java +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginState.java @@ -39,5 +39,5 @@ package sonia.scm.plugin; */ public enum PluginState { - CORE, AVAILABLE, INSTALLED, UPDATE_AVAILABLE; + CORE, AVAILABLE, INSTALLED, NEWER_VERSION_INSTALLED, UPDATE_AVAILABLE; } diff --git a/scm-core/src/main/java/sonia/scm/plugin/PluginVersion.java b/scm-core/src/main/java/sonia/scm/plugin/PluginVersion.java new file mode 100644 index 0000000000..78d81e24c7 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginVersion.java @@ -0,0 +1,585 @@ +/** + * 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.plugin; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import sonia.scm.util.AssertUtil; + +/** + * + * @author Sebastian Sdorra + */ +public class PluginVersion implements Comparable +{ + + /** the logger for PluginVersion */ + private static final Logger logger = + LoggerFactory.getLogger(PluginVersion.class); + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + * + * @param versionString + */ + public PluginVersion(String versionString) + { + this.unparsedVersion = versionString; + + int index = versionString.indexOf("-"); + String versionPart = null; + String qualifierPart = null; + + if (index > 0) + { + versionPart = versionString.substring(0, index); + qualifierPart = versionString.substring(index); + } + else + { + versionPart = versionString; + } + + parseVersionPart(versionPart); + type = PluginVersionType.RELEASE; + + if (qualifierPart != null) + { + parseQualifierPart(qualifierPart); + } + + parsedVersion = createParsedVersion(); + } + + //~--- methods -------------------------------------------------------------- + + /** + * Enum description + * + * + * @param versionString + * + * @return + */ + + /** + * Method description + * + * + * @param versionString + * + * @return + */ + public static PluginVersion createVersion(String versionString) + { + PluginVersion version = null; + + try + { + version = new PluginVersion(versionString); + } + catch (NumberFormatException ex) + { + if (logger.isWarnEnabled()) + { + logger.warn("could not parse version ".concat(versionString), ex); + } + } + + return version; + } + + /** + * Method description + * + * + * @param o + * + * @return + */ + @Override + public int compareTo(PluginVersion o) + { + AssertUtil.assertIsNotNull(o); + + int result = o.major - major; + + if (result == 0) + { + result = o.minor - minor; + + if (result == 0) + { + result = o.maintenance - maintenance; + + if (result == 0) + { + result = o.type.getValue() - type.getValue(); + + if (result == 0) + { + result = o.typeVersion - typeVersion; + + if (result == 0) + { + if (o.snapshot &&!snapshot) + { + result = 0; + } + else if (!o.snapshot && snapshot) + { + result = 1; + } + } + } + } + } + } + + return result; + } + + /** + * Method description + * + * + * @param obj + * + * @return + */ + @Override + public boolean equals(Object obj) + { + if (obj == null) + { + return false; + } + + if (getClass() != obj.getClass()) + { + return false; + } + + final PluginVersion other = (PluginVersion) obj; + + if (this.maintenance != other.maintenance) + { + return false; + } + + if (this.major != other.major) + { + return false; + } + + if (this.minor != other.minor) + { + return false; + } + + if ((this.parsedVersion == null) + ? (other.parsedVersion != null) + : !this.parsedVersion.equals(other.parsedVersion)) + { + return false; + } + + if (this.snapshot != other.snapshot) + { + return false; + } + + if (this.type != other.type) + { + return false; + } + + if (this.typeVersion != other.typeVersion) + { + return false; + } + + return true; + } + + /** + * Method description + * + * + * @return + */ + @Override + public int hashCode() + { + int hash = 5; + + hash = 61 * hash + this.maintenance; + hash = 61 * hash + this.major; + hash = 61 * hash + this.minor; + hash = 61 * hash + ((this.parsedVersion != null) + ? this.parsedVersion.hashCode() + : 0); + hash = 61 * hash + (this.snapshot + ? 1 + : 0); + hash = 61 * hash + ((this.type != null) + ? this.type.hashCode() + : 0); + hash = 61 * hash + this.typeVersion; + + return hash; + } + + /** + * Method description + * + * + * @return + */ + @Override + public String toString() + { + return parsedVersion; + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @return + */ + public int getMaintenance() + { + return maintenance; + } + + /** + * Method description + * + * + * @return + */ + public int getMajor() + { + return major; + } + + /** + * Method description + * + * + * @return + */ + public int getMinor() + { + return minor; + } + + /** + * Method description + * + * + * @return + */ + public String getParsedVersion() + { + return parsedVersion; + } + + /** + * Method description + * + * + * @return + */ + public PluginVersionType getType() + { + return type; + } + + /** + * Method description + * + * + * @return + */ + public int getTypeVersion() + { + return typeVersion; + } + + /** + * Method description + * + * + * @return + */ + public String getUnparsedVersion() + { + return unparsedVersion; + } + + /** + * Method description + * + * + * @param o + * + * @return + */ + public boolean isNewer(PluginVersion o) + { + return compareTo(o) < 0; + } + + /** + * Method description + * + * + * @param versionString + * + * @return + */ + public boolean isNewer(String versionString) + { + PluginVersion o = PluginVersion.createVersion(versionString); + + return (o != null) && isNewer(o); + } + + /** + * Method description + * + * + * @param o + * + * @return + */ + public boolean isOlder(PluginVersion o) + { + return compareTo(o) > 0; + } + + /** + * Method description + * + * + * @param versionString + * + * @return + */ + public boolean isOlder(String versionString) + { + PluginVersion o = PluginVersion.createVersion(versionString); + + return (o != null) && isOlder(o); + } + + /** + * Method description + * + * + * @return + */ + public boolean isSnapshot() + { + return snapshot; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @return + */ + private String createParsedVersion() + { + StringBuilder v = new StringBuilder(); + + v.append(major).append(".").append(minor).append(".").append(maintenance); + + String typeId = type.getId(); + + if (typeId != null) + { + v.append("-").append(typeId).append(typeVersion); + } + + if (snapshot) + { + v.append("-").append("SNAPSHOT"); + } + + return v.toString(); + } + + /** + * Method description + * + * + * @param qualifierPart + */ + private void parseQualifierPart(String qualifierPart) + { + String qualifier = qualifierPart.trim().toLowerCase(); + + if (qualifier.contains("snapshot")) + { + snapshot = true; + qualifier = qualifier.replace("snapshot", ""); + } + + if (qualifier.length() > 0) + { + for (PluginVersionType versionType : PluginVersionType.values()) + { + for (String name : versionType.getNames()) + { + name = name.toLowerCase(); + + int index = qualifier.indexOf(name); + + if (index > 0) + { + type = versionType; + qualifier = qualifier.substring(index + name.length()); + parseTypeVersion(qualifier); + + break; + } + } + } + } + } + + /** + * Method description + * + * + * @param qualifier + */ + private void parseTypeVersion(String qualifier) + { + String version = null; + StringBuilder vb = new StringBuilder(); + + for (char c : qualifier.toCharArray()) + { + if (version != null) + { + break; + } + else if (Character.isDigit(c)) + { + vb.append(c); + } + else if (vb.length() > 0) + { + version = vb.toString(); + } + } + + if (vb.length() > 0) + { + version = vb.toString(); + } + + if (version != null) + { + typeVersion = Integer.parseInt(version); + } + } + + /** + * Method description + * + * + * @param versionPart + */ + private void parseVersionPart(String versionPart) + { + String[] parts = versionPart.split("\\."); + + if (parts.length > 0) + { + major = Integer.parseInt(parts[0]); + + if (parts.length > 1) + { + minor = Integer.parseInt(parts[1]); + + if (parts.length > 2) + { + maintenance = Integer.parseInt(parts[2]); + } + } + } + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private int maintenance = 0; + + /** Field description */ + private int major = 0; + + /** Field description */ + private int minor = 0; + + /** Field description */ + private String parsedVersion; + + /** Field description */ + private boolean snapshot; + + /** Field description */ + private PluginVersionType type; + + /** Field description */ + private int typeVersion = 1; + + /** Field description */ + private String unparsedVersion; +} diff --git a/scm-server-api/src/main/java/sonia/scm/server/ServerConfig.java b/scm-core/src/main/java/sonia/scm/plugin/PluginVersionType.java similarity index 58% rename from scm-server-api/src/main/java/sonia/scm/server/ServerConfig.java rename to scm-core/src/main/java/sonia/scm/plugin/PluginVersionType.java index 027bdcea0c..bddf88f5b3 100644 --- a/scm-server-api/src/main/java/sonia/scm/server/ServerConfig.java +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginVersionType.java @@ -29,24 +29,53 @@ * */ -package sonia.scm.server; -//~--- non-JDK imports -------------------------------------------------------- -import sonia.scm.cli.Argument; +package sonia.scm.plugin; + +//~--- JDK imports ------------------------------------------------------------ + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; /** * * @author Sebastian Sdorra */ -public class ServerConfig +public enum PluginVersionType { + EARLY_ACESS("ea", 0, "early", "earlyaccess"), MILESTONE("M", 1, "milestone"), + ALPHA("alpha", 2), BETA("beta", 3), + RELEASE_CANDIDAT("RC", 4, "releasecandidate"), RELEASE(10); /** * Constructs ... * + * + * @param value */ - public ServerConfig() {} + private PluginVersionType(int value) + { + this(null, value); + } + + /** + * Constructs ... + * + * + * + * @param id + * @param value + * @param aliases + */ + private PluginVersionType(String id, int value, String... aliases) + { + this.id = id; + this.value = value; + this.aliases = aliases; + } //~--- get methods ---------------------------------------------------------- @@ -56,9 +85,9 @@ public class ServerConfig * * @return */ - public String getContextPath() + public String[] getAliases() { - return contextPath; + return aliases; } /** @@ -67,9 +96,9 @@ public class ServerConfig * * @return */ - public Integer getPort() + public String getId() { - return port; + return id; } /** @@ -78,9 +107,21 @@ public class ServerConfig * * @return */ - public String getResourcePath() + public Collection getNames() { - return resourcePath; + List names = new ArrayList(); + + if (id != null) + { + names.add(id); + } + + if (aliases != null) + { + names.addAll(Arrays.asList(aliases)); + } + + return names; } /** @@ -89,88 +130,19 @@ public class ServerConfig * * @return */ - public Boolean getShowHelp() + public int getValue() { - return showHelp; - } - - //~--- set methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @param contextPath - */ - public void setContextPath(String contextPath) - { - this.contextPath = contextPath; - } - - /** - * Method description - * - * - * @param port - */ - public void setPort(Integer port) - { - this.port = port; - } - - /** - * Method description - * - * - * @param resourcePath - */ - public void setResourcePath(String resourcePath) - { - this.resourcePath = resourcePath; - } - - /** - * Method description - * - * - * @param showHelp - */ - public void setShowHelp(Boolean showHelp) - { - this.showHelp = showHelp; + return value; } //~--- fields --------------------------------------------------------------- /** Field description */ - @Argument( - value = "c", - longName = "context-path", - description = "The Context-Path of the Jab-WebApp" - ) - private String contextPath = "/"; + public String[] aliases; /** Field description */ - @Argument( - value = "p", - longName = "port", - description = "The port for the listener" - ) - private Integer port = Integer.valueOf(8080); + private String id; /** Field description */ - @Argument( - value = "r", - longName = "resource-path", - description = "Path to the server resource directory" - ) - private String resourcePath; - - /** Field description */ - @Argument( - value = "h", - longName = "help", - description = "Shows this help" - ) - private Boolean showHelp = Boolean.FALSE; + private int value; } diff --git a/scm-core/src/main/java/sonia/scm/repository/AbstractSimpleRepositoryHandler.java b/scm-core/src/main/java/sonia/scm/repository/AbstractSimpleRepositoryHandler.java index 410d16ac33..9feabcbc84 100644 --- a/scm-core/src/main/java/sonia/scm/repository/AbstractSimpleRepositoryHandler.java +++ b/scm-core/src/main/java/sonia/scm/repository/AbstractSimpleRepositoryHandler.java @@ -39,9 +39,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.ConfigurationException; -import sonia.scm.SCMContextProvider; import sonia.scm.io.CommandResult; import sonia.scm.io.ExtendedCommand; +import sonia.scm.io.FileSystem; import sonia.scm.store.StoreFactory; import sonia.scm.util.IOUtil; @@ -75,10 +75,13 @@ public abstract class AbstractSimpleRepositoryHandler= pt.getValue())) + if (((name != null) && (p.getType().getValue() >= pt.getValue())) + && (name.equals(username) + || (p.isGroupPermission() && groups.contains(p.getName())))) { - if (name.equals(username) - || (p.isGroupPermission() && groups.contains(p.getName()))) - { - result = true; + result = true; - break; - } + break; } } diff --git a/scm-core/src/main/java/sonia/scm/resources/ResourceHandlerComparator.java b/scm-core/src/main/java/sonia/scm/resources/ResourceHandlerComparator.java index d1e30f0780..c818eb6c73 100644 --- a/scm-core/src/main/java/sonia/scm/resources/ResourceHandlerComparator.java +++ b/scm-core/src/main/java/sonia/scm/resources/ResourceHandlerComparator.java @@ -39,15 +39,23 @@ import sonia.scm.util.Util; //~--- JDK imports ------------------------------------------------------------ +import java.io.Serializable; + import java.util.Comparator; /** * * @author Sebastian Sdorra */ -public class ResourceHandlerComparator implements Comparator +public class ResourceHandlerComparator + implements Comparator, Serializable { + /** Field description */ + private static final long serialVersionUID = -1760229246326556762L; + + //~--- methods -------------------------------------------------------------- + /** * Method description * diff --git a/scm-core/src/main/java/sonia/scm/util/IOUtil.java b/scm-core/src/main/java/sonia/scm/util/IOUtil.java index 5805d8c9e4..9c9afa55bb 100644 --- a/scm-core/src/main/java/sonia/scm/util/IOUtil.java +++ b/scm-core/src/main/java/sonia/scm/util/IOUtil.java @@ -66,10 +66,10 @@ public class IOUtil { /** Field description */ - public static final String DEFAULT_CHECKPARAMETER = "--version"; + private static final String DEFAULT_CHECKPARAMETER = "--version"; /** Field description */ - public static final String[] DEFAULT_PATH = new String[] + private static final String[] DEFAULT_PATH = new String[] { // default path @@ -336,7 +336,13 @@ public class IOUtil cmdPath = cmd; } } - catch (IOException ex) {} + catch (IOException ex) + { + if (logger.isTraceEnabled()) + { + logger.trace("could not execute command", ex); + } + } if (cmdPath == null) { diff --git a/scm-core/src/main/java/sonia/scm/util/SecurityUtil.java b/scm-core/src/main/java/sonia/scm/util/SecurityUtil.java index 30c03bc951..c753f57fd4 100644 --- a/scm-core/src/main/java/sonia/scm/util/SecurityUtil.java +++ b/scm-core/src/main/java/sonia/scm/util/SecurityUtil.java @@ -37,6 +37,7 @@ package sonia.scm.util; import com.google.inject.Provider; +import sonia.scm.SCMContext; import sonia.scm.security.ScmSecurityException; import sonia.scm.security.SecurityContext; import sonia.scm.user.User; @@ -111,4 +112,31 @@ public class SecurityUtil return user; } + + /** + * Method description + * + * + * @param contextProvider + * + * @return + */ + public static boolean isAnonymous( + Provider contextProvider) + { + return isAnonymous(contextProvider.get()); + } + + /** + * Method description + * + * + * @param context + * + * @return + */ + public static boolean isAnonymous(SecurityContext context) + { + return SCMContext.USER_ANONYMOUS.equals(context.getUser().getName()); + } } diff --git a/scm-core/src/main/java/sonia/scm/web/cgi/CGIRunner.java b/scm-core/src/main/java/sonia/scm/web/cgi/CGIRunner.java index 9aabdf7a85..3a113fda7e 100644 --- a/scm-core/src/main/java/sonia/scm/web/cgi/CGIRunner.java +++ b/scm-core/src/main/java/sonia/scm/web/cgi/CGIRunner.java @@ -47,9 +47,7 @@ import sonia.scm.util.Util; import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; import java.io.OutputStream; -import java.io.OutputStreamWriter; import java.util.Enumeration; diff --git a/scm-core/src/test/java/sonia/scm/plugin/PluginVersionTest.java b/scm-core/src/test/java/sonia/scm/plugin/PluginVersionTest.java new file mode 100644 index 0000000000..9f59b5fa72 --- /dev/null +++ b/scm-core/src/test/java/sonia/scm/plugin/PluginVersionTest.java @@ -0,0 +1,169 @@ +/** + * 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.plugin; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.junit.Test; + +import static org.junit.Assert.*; + +//~--- JDK imports ------------------------------------------------------------ + +import java.util.Arrays; + +/** + * + * @author Sebastian Sdorra + */ +public class PluginVersionTest +{ + + /** + * Method description + * + */ + @Test + public void parseSimpleVersion() + { + PluginVersion v = new PluginVersion("1.0"); + + assertTrue(v.getMajor() == 1); + assertTrue(v.getMinor() == 0); + assertTrue(v.getMaintenance() == 0); + assertFalse(v.isSnapshot()); + assertTrue(v.getType() == PluginVersionType.RELEASE); + assertEquals(v.getParsedVersion(), "1.0.0"); + + // test with snapshot + v = new PluginVersion("1.1-SNAPSHOT"); + assertTrue(v.getMajor() == 1); + assertTrue(v.getMinor() == 1); + assertTrue(v.getMaintenance() == 0); + assertTrue(v.isSnapshot()); + assertTrue(v.getType() == PluginVersionType.RELEASE); + assertEquals(v.getParsedVersion(), "1.1.0-SNAPSHOT"); + + // test with maintenance + v = new PluginVersion("2.3.14"); + assertTrue(v.getMajor() == 2); + assertTrue(v.getMinor() == 3); + assertTrue(v.getMaintenance() == 14); + assertFalse(v.isSnapshot()); + assertTrue(v.getType() == PluginVersionType.RELEASE); + assertEquals(v.getParsedVersion(), "2.3.14"); + } + + /** + * Method description + * + */ + @Test + public void parseTypeVersions() + { + PluginVersion v = new PluginVersion("1.0-alpha"); + + assertTrue(v.getMajor() == 1); + assertTrue(v.getMinor() == 0); + assertTrue(v.getMaintenance() == 0); + assertFalse(v.isSnapshot()); + assertTrue(v.getType() == PluginVersionType.ALPHA); + assertTrue(v.getTypeVersion() == 1); + assertEquals(v.getParsedVersion(), "1.0.0-alpha1"); + + // Test release candidate + v = new PluginVersion("2.1.2-RC3"); + assertTrue(v.getMajor() == 2); + assertTrue(v.getMinor() == 1); + assertTrue(v.getMaintenance() == 2); + assertFalse(v.isSnapshot()); + assertTrue(v.getType() == PluginVersionType.RELEASE_CANDIDAT); + assertTrue(v.getTypeVersion() == 3); + assertEquals(v.getParsedVersion(), "2.1.2-RC3"); + } + + /** + * Method description + * + */ + @Test + public void testCompareTo() + { + PluginVersion[] versions = new PluginVersion[9]; + + versions[0] = PluginVersion.createVersion("2.3.1-SNAPSHOT"); + versions[1] = PluginVersion.createVersion("2.3.1-beta1"); + versions[2] = PluginVersion.createVersion("2.3.1-beta2"); + versions[3] = PluginVersion.createVersion("2.3.1-M1"); + versions[4] = PluginVersion.createVersion("2.3.1-alpha2"); + versions[5] = PluginVersion.createVersion("2.3.1-RC1"); + versions[6] = PluginVersion.createVersion("2.3.1"); + versions[7] = PluginVersion.createVersion("2.3"); + versions[8] = PluginVersion.createVersion("2.4.6"); + Arrays.sort(versions); + assertEquals(versions[0].getParsedVersion(), "2.4.6"); + assertEquals(versions[1].getParsedVersion(), "2.3.1"); + assertEquals(versions[2].getParsedVersion(), "2.3.1-SNAPSHOT"); + assertEquals(versions[3].getParsedVersion(), "2.3.1-RC1"); + assertEquals(versions[4].getParsedVersion(), "2.3.1-beta2"); + assertEquals(versions[5].getParsedVersion(), "2.3.1-beta1"); + assertEquals(versions[6].getParsedVersion(), "2.3.1-alpha2"); + assertEquals(versions[7].getParsedVersion(), "2.3.1-M1"); + assertEquals(versions[8].getParsedVersion(), "2.3.0"); + } + + /** + * Method description + * + */ + @Test + public void testIsNewer() + { + assertFalse(PluginVersion.createVersion("1.0").isNewer("1.0.1")); + assertTrue(PluginVersion.createVersion("1.1").isNewer("1.1-alpha1")); + assertTrue(PluginVersion.createVersion("1.1").isNewer("1.1-RC5")); + } + + /** + * Method description + * + */ + @Test + public void testIsOlder() + { + assertFalse(PluginVersion.createVersion("1.0.1").isOlder("1.0")); + assertTrue(PluginVersion.createVersion("1.1-alpha1").isOlder("1.1")); + assertTrue(PluginVersion.createVersion("1.1-RC5").isOlder("1.1")); + } +} diff --git a/scm-server-api/pom.xml b/scm-server-api/pom.xml index 17b6b7a5c0..fdc01269f4 100644 --- a/scm-server-api/pom.xml +++ b/scm-server-api/pom.xml @@ -7,22 +7,12 @@ scm sonia.scm - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm scm-server-api - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT scm-server-api - - - - sonia.scm - scm-core - 1.0-M7-SNAPSHOT - - - - diff --git a/scm-server-api/src/main/java/sonia/scm/server/Server.java b/scm-server-api/src/main/java/sonia/scm/server/Server.java index e2bc900368..eae0a657b9 100644 --- a/scm-server-api/src/main/java/sonia/scm/server/Server.java +++ b/scm-server-api/src/main/java/sonia/scm/server/Server.java @@ -29,6 +29,8 @@ * */ + + package sonia.scm.server; //~--- JDK imports ------------------------------------------------------------ @@ -63,14 +65,12 @@ public interface Server * Method description * * - * @param config * @param webapp * * @throws IOException * @throws ServerException */ - public void start(ServerConfig config, File webapp) - throws ServerException, IOException; + public void start(File webapp) throws ServerException, IOException; /** * Method description diff --git a/scm-server-api/src/main/java/sonia/scm/server/ServerApplication.java b/scm-server-api/src/main/java/sonia/scm/server/ServerApplication.java index fb7a5e3ebd..0ef85f19f1 100644 --- a/scm-server-api/src/main/java/sonia/scm/server/ServerApplication.java +++ b/scm-server-api/src/main/java/sonia/scm/server/ServerApplication.java @@ -33,23 +33,15 @@ package sonia.scm.server; -//~--- non-JDK imports -------------------------------------------------------- - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import sonia.scm.cli.CliException; -import sonia.scm.cli.CliParser; -import sonia.scm.cli.DefaultCliHelpBuilder; -import sonia.scm.util.IOUtil; -import sonia.scm.util.ServiceUtil; - //~--- JDK imports ------------------------------------------------------------ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.util.NoSuchElementException; +import java.util.ServiceLoader; + import javax.xml.bind.JAXB; /** @@ -74,48 +66,6 @@ public class ServerApplication /** Field description */ public static final String SERVERCONFIG = "/config.xml"; - /** Field description */ - private static final Logger logger = - LoggerFactory.getLogger(ServerApplication.class.getName()); - - //~--- get methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @return - */ - private static ServerConfig getServerConfig() - { - ServerConfig config = null; - InputStream input = - ServerApplication.class.getResourceAsStream(SERVERCONFIG); - - if (input != null) - { - try - { - config = JAXB.unmarshal(input, ServerConfig.class); - } - catch (Exception ex) - { - logger.error(ex.getMessage(), ex); - } - finally - { - IOUtil.close(input); - } - } - - if (config == null) - { - config = new ServerConfig(); - } - - return config; - } - //~--- methods -------------------------------------------------------------- /** @@ -124,12 +74,10 @@ public class ServerApplication * * @param args * - * @throws CliException * @throws IOException * @throws ServerException */ - public static void main(String[] args) - throws CliException, ServerException, IOException + public static void main(String[] args) throws ServerException, IOException { InputStream input = ServerApplication.class.getResourceAsStream(APPINFO); @@ -141,76 +89,68 @@ public class ServerApplication ApplicationInformation appInfo = JAXB.unmarshal(input, ApplicationInformation.class); - ServerConfig config = getServerConfig(); - CliParser parser = new CliParser(); + final Server server = getServer(); - parser.parse(config, args); - - if (config.getShowHelp()) + if (server == null) { - printHelp(appInfo, parser, config); + System.err.println("could not find an server implementation"); + System.exit(RETURNCODE_MISSING_SERVER_IMPLEMENTATION); } - else + + File webapp = new File("webapp", appInfo.getAppName()); + + server.start(webapp); + Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { - final Server server = ServiceUtil.getService(Server.class); - - if (server == null) + @Override + public void run() { - System.err.println("could not find an server implementation"); - System.exit(RETURNCODE_MISSING_SERVER_IMPLEMENTATION); - } - - File webapp = new File("webapp", appInfo.getAppName()); - - server.start(config, webapp); - Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() - { - @Override - public void run() + if (server.isRunning()) { - if (server.isRunning()) + try { - try - { - server.stop(); - } - catch (ServerException ex) - { - logger.error(ex.getMessage(), ex); - } - catch (IOException ex) - { - logger.error(ex.getMessage(), ex); - } + server.stop(); + } + catch (ServerException ex) + { + ex.printStackTrace(System.err); + } + catch (IOException ex) + { + ex.printStackTrace(System.err); } } - })); - } + } + })); } + //~--- get methods ---------------------------------------------------------- + /** * Method description * * - * - * @param appInfo - * @param parser - * @param config + * @return */ - private static void printHelp(ApplicationInformation appInfo, - CliParser parser, ServerConfig config) + private static Server getServer() { - String s = System.getProperty("line.separator"); - StringBuilder prefix = new StringBuilder(appInfo.getName()); + Server server = null; - prefix.append(" ").append(appInfo.getVersion()); - prefix.append(s).append("usage: "); - prefix.append(s); + try + { + ServiceLoader loader = ServiceLoader.load(Server.class); - DefaultCliHelpBuilder helpBuilder = - new DefaultCliHelpBuilder(prefix.toString(), null); + if (loader != null) + { + server = loader.iterator().next(); + } + } + catch (NoSuchElementException ex) + { - System.err.println(parser.createHelp(helpBuilder, config)); - System.exit(RETURNCODE_CLI_ERROR); + // no server available + } + + return server; } } diff --git a/scm-server-jetty/pom.xml b/scm-server-jetty/pom.xml index f5afddbc99..c6f573b608 100644 --- a/scm-server-jetty/pom.xml +++ b/scm-server-jetty/pom.xml @@ -7,12 +7,12 @@ scm sonia.scm - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm scm-server-jetty - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT scm-server-jetty @@ -20,7 +20,7 @@ sonia.scm scm-server-api - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT @@ -38,7 +38,7 @@ - 7.1.6.v20100715 + 7.2.2.v20101205 diff --git a/scm-server-jetty/src/main/java/sonia/scm/server/jetty/JettyServer.java b/scm-server-jetty/src/main/java/sonia/scm/server/jetty/JettyServer.java index 0a3b0783c0..d339118604 100644 --- a/scm-server-jetty/src/main/java/sonia/scm/server/jetty/JettyServer.java +++ b/scm-server-jetty/src/main/java/sonia/scm/server/jetty/JettyServer.java @@ -29,17 +29,17 @@ * */ + + package sonia.scm.server.jetty; //~--- non-JDK imports -------------------------------------------------------- -import org.eclipse.jetty.server.Connector; -import org.eclipse.jetty.server.nio.SelectChannelConnector; import org.eclipse.jetty.webapp.WebAppContext; +import org.eclipse.jetty.xml.XmlConfiguration; import sonia.scm.server.Server; import sonia.scm.server.ServerAllreadyRunningException; -import sonia.scm.server.ServerConfig; import sonia.scm.server.ServerException; import sonia.scm.server.ServerListener; @@ -48,6 +48,8 @@ import sonia.scm.server.ServerListener; import java.io.File; import java.io.IOException; +import java.net.URL; + import java.util.HashSet; import java.util.Set; @@ -58,6 +60,11 @@ import java.util.Set; public class JettyServer implements Server { + /** Field description */ + public static final String CONFIGURATION = "/server-config.xml"; + + //~--- methods -------------------------------------------------------------- + /** * Method description * @@ -86,44 +93,46 @@ public class JettyServer implements Server * Method description * * - * @param config * @param webapp * * @throws IOException * @throws ServerException */ @Override - public void start(ServerConfig config, File webapp) - throws ServerException, IOException + public void start(File webapp) throws ServerException, IOException { if (isRunning()) { throw new ServerAllreadyRunningException(); } - server = new org.eclipse.jetty.server.Server(); + URL configURL = JettyServer.class.getResource(CONFIGURATION); - Connector connector = new SelectChannelConnector(); - - for (ServerListener listener : listeners) + if (configURL == null) { - connector.addLifeCycleListener(new JettyServerListenerAdapter(listener)); + throw new ServerException("could not find server-config.xml"); } - connector.setPort(config.getPort()); - server.addConnector(connector); - - WebAppContext wac = new WebAppContext(); - - wac.setContextPath(config.getContextPath()); - wac.setWar(webapp.getAbsolutePath()); - wac.setExtractWAR(true); - server.setHandler(wac); - - // server.setStopAtShutdown(true); - try { + server = new org.eclipse.jetty.server.Server(); + + XmlConfiguration config = new XmlConfiguration(configURL); + + config.configure(server); + + for (ServerListener listener : listeners) + { + server.addLifeCycleListener(new JettyServerListenerAdapter(listener)); + } + + WebAppContext wac = new WebAppContext(); + + wac.setWar(webapp.getAbsolutePath()); + wac.setExtractWAR(true); + server.setHandler(wac); + + // server.setStopAtShutdown(true); server.start(); server.join(); } diff --git a/scm-server/pom.xml b/scm-server/pom.xml index 0a685971e0..ad247a833f 100644 --- a/scm-server/pom.xml +++ b/scm-server/pom.xml @@ -7,33 +7,27 @@ scm sonia.scm - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm scm-server - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT scm-server pom - - sonia.scm - scm-core - 1.0-M7-SNAPSHOT - - sonia.scm scm-server-api - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm scm-server-jetty - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT @@ -76,6 +70,15 @@ jsw + + linux-x86-32 + linux-x86-64 + macosx-x86-universal-32 + solaris-sparc-32 + solaris-sparc-64 + solaris-x86-32 + windows-x86-32 + configuration.directory.in.classpath.first diff --git a/scm-server/src/main/assembly/scm-server-jsw.xml b/scm-server/src/main/assembly/scm-server-jsw.xml index 1f4699452b..97c0cf9deb 100644 --- a/scm-server/src/main/assembly/scm-server-jsw.xml +++ b/scm-server/src/main/assembly/scm-server-jsw.xml @@ -92,6 +92,11 @@ true conf + + src/main/conf/server-config.xml + true + conf + \ No newline at end of file diff --git a/scm-server/src/main/conf/server-config.xml b/scm-server/src/main/conf/server-config.xml new file mode 100644 index 0000000000..3d49d04963 --- /dev/null +++ b/scm-server/src/main/conf/server-config.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scm-test/pom.xml b/scm-test/pom.xml index cb58d9fe39..12e562c1a2 100644 --- a/scm-test/pom.xml +++ b/scm-test/pom.xml @@ -7,12 +7,12 @@ scm sonia.scm - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm scm-test - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT scm-test @@ -26,7 +26,7 @@ sonia.scm scm-core - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT diff --git a/scm-test/src/main/java/sonia/scm/ManagerTestBase.java b/scm-test/src/main/java/sonia/scm/ManagerTestBase.java index 516e44b1bf..5499bc4526 100644 --- a/scm-test/src/main/java/sonia/scm/ManagerTestBase.java +++ b/scm-test/src/main/java/sonia/scm/ManagerTestBase.java @@ -33,28 +33,6 @@ package sonia.scm; -//~--- non-JDK imports -------------------------------------------------------- - -import com.google.inject.Provider; - -import org.junit.After; -import org.junit.Before; - -import sonia.scm.security.SecurityContext; -import sonia.scm.user.User; -import sonia.scm.util.IOUtil; - -import static org.junit.Assert.*; - -import static org.mockito.Mockito.*; - -//~--- JDK imports ------------------------------------------------------------ - -import java.io.File; -import java.io.IOException; - -import java.util.UUID; - /** * * @author Sebastian Sdorra diff --git a/scm-test/src/main/java/sonia/scm/repository/DummyRepositoryHandler.java b/scm-test/src/main/java/sonia/scm/repository/DummyRepositoryHandler.java index fa27959341..34632e370f 100644 --- a/scm-test/src/main/java/sonia/scm/repository/DummyRepositoryHandler.java +++ b/scm-test/src/main/java/sonia/scm/repository/DummyRepositoryHandler.java @@ -36,6 +36,7 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- import sonia.scm.Type; +import sonia.scm.io.DefaultFileSystem; import sonia.scm.store.StoreFactory; //~--- JDK imports ------------------------------------------------------------ @@ -70,7 +71,7 @@ public class DummyRepositoryHandler */ public DummyRepositoryHandler(StoreFactory storeFactory) { - super(storeFactory); + super(storeFactory, new DefaultFileSystem()); } //~--- get methods ---------------------------------------------------------- diff --git a/scm-webapp/pom.xml b/scm-webapp/pom.xml index ba5a653123..b3d87da38c 100644 --- a/scm-webapp/pom.xml +++ b/scm-webapp/pom.xml @@ -7,13 +7,13 @@ sonia.scm scm - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm scm-webapp war - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT scm-webapp @@ -28,25 +28,25 @@ sonia.scm scm-core - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.plugins scm-hg-plugin - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.plugins scm-svn-plugin - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.plugins scm-git-plugin - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT @@ -86,7 +86,7 @@ ch.qos.logback logback-classic - 0.9.27 + 0.9.28 @@ -164,7 +164,7 @@ sonia.scm scm-test - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT test @@ -288,43 +288,43 @@ sonia.scm.plugins scm-graph-plugin - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.sample scm-sample-auth - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.sample scm-sample-hello - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.plugins scm-activedirectory-auth-plugin - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.plugins scm-pam-plugin - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.plugins scm-bzr-plugin - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.plugins scm-auth-ldap-plugin - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT diff --git a/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java b/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java index fe9fcc8988..e702940776 100644 --- a/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java +++ b/scm-webapp/src/main/java/sonia/scm/BindingExtensionProcessor.java @@ -43,6 +43,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.group.GroupListener; +import sonia.scm.io.FileSystem; import sonia.scm.plugin.ext.Extension; import sonia.scm.plugin.ext.ExtensionProcessor; import sonia.scm.repository.RepositoryHandler; @@ -188,6 +189,15 @@ public class BindingExtensionProcessor implements ExtensionProcessor resourceHandler.addBinding().to(extensionClass); } + else if (FileSystem.class.isAssignableFrom(extensionClass)) + { + if (logger.isInfoEnabled()) + { + logger.info("bind FileSystem {}", extensionClass.getName()); + } + + fileSystemClass = extensionClass; + } else { if (logger.isInfoEnabled()) @@ -198,7 +208,11 @@ public class BindingExtensionProcessor implements ExtensionProcessor binder.bind(extensionClass); } } - catch (Exception ex) + catch (IllegalAccessException ex) + { + logger.error(ex.getMessage(), ex); + } + catch (InstantiationException ex) { logger.error(ex.getMessage(), ex); } @@ -243,6 +257,17 @@ public class BindingExtensionProcessor implements ExtensionProcessor return authenticationListeners; } + /** + * Method description + * + * + * @return + */ + public Class getFileSystemClass() + { + return fileSystemClass; + } + /** * Method description * @@ -337,6 +362,9 @@ public class BindingExtensionProcessor implements ExtensionProcessor /** Field description */ private Set> extensions; + /** Field description */ + private Class fileSystemClass; + /** Field description */ private Set moduleSet; diff --git a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java index 8b8845ae77..0be05e5821 100644 --- a/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java +++ b/scm-webapp/src/main/java/sonia/scm/ScmServletModule.java @@ -49,6 +49,8 @@ import sonia.scm.filter.SSLFilter; import sonia.scm.filter.SecurityFilter; import sonia.scm.group.GroupManager; import sonia.scm.group.xml.XmlGroupManager; +import sonia.scm.io.DefaultFileSystem; +import sonia.scm.io.FileSystem; import sonia.scm.plugin.DefaultPluginManager; import sonia.scm.plugin.Plugin; import sonia.scm.plugin.PluginLoader; @@ -175,6 +177,16 @@ public class ScmServletModule extends ServletModule bind(EncryptionHandler.class).to(MessageDigestEncryptionHandler.class); bindExtProcessor.bindExtensions(binder()); + Class fileSystem = + bindExtProcessor.getFileSystemClass(); + + if (fileSystem == null) + { + fileSystem = DefaultFileSystem.class; + } + + bind(FileSystem.class).to(fileSystem); + // bind security stuff bind(AuthenticationManager.class).to(ChainAuthenticatonManager.class); bind(SecurityContext.class).to(BasicSecurityContext.class); diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AuthenticationResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AuthenticationResource.java index 3fc33f20c7..fe1eb95dc7 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AuthenticationResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AuthenticationResource.java @@ -43,7 +43,6 @@ import org.slf4j.LoggerFactory; import sonia.scm.SCMContext; import sonia.scm.ScmState; -import sonia.scm.Type; import sonia.scm.repository.RepositoryManager; import sonia.scm.user.User; import sonia.scm.web.security.WebSecurityContext; diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/PluginResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/PluginResource.java index 6eb71cbd33..f021f1b057 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/PluginResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/PluginResource.java @@ -39,6 +39,7 @@ import com.google.inject.Inject; import com.google.inject.Singleton; import sonia.scm.plugin.DefaultPluginManager; +import sonia.scm.plugin.OverviewPluginFilter; import sonia.scm.plugin.PluginInformation; //~--- JDK imports ------------------------------------------------------------ @@ -137,9 +138,9 @@ public class PluginResource */ @GET @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) - public PluginInformation[] getAll() + public Collection getAll() { - return getArray(pluginManager.getAll()); + return pluginManager.getAll(); } /** @@ -151,9 +152,9 @@ public class PluginResource @GET @Path("available") @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) - public PluginInformation[] getAvailable() + public Collection getAvailable() { - return getArray(pluginManager.getAvailable()); + return pluginManager.getAvailable(); } /** @@ -165,9 +166,9 @@ public class PluginResource @GET @Path("updates") @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) - public PluginInformation[] getAvailableUpdates() + public Collection getAvailableUpdates() { - return getArray(pluginManager.getAvailableUpdates()); + return pluginManager.getAvailableUpdates(); } /** @@ -179,34 +180,23 @@ public class PluginResource @GET @Path("installed") @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) - public PluginInformation[] getInstalled() + public Collection getInstalled() { - return getArray(pluginManager.getInstalled()); + return pluginManager.getInstalled(); } /** * Method description * * - * @param pluginCollection - * * @return */ - private PluginInformation[] getArray( - Collection pluginCollection) + @GET + @Path("overview") + @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) + public Collection getOverview() { - PluginInformation[] plugins = null; - - if (pluginCollection != null) - { - plugins = pluginCollection.toArray(new PluginInformation[0]); - } - else - { - plugins = new PluginInformation[0]; - } - - return plugins; + return pluginManager.get(OverviewPluginFilter.INSTANCE); } //~--- fields --------------------------------------------------------------- diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryResource.java index 10f2356df8..923102bd44 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryResource.java @@ -36,24 +36,29 @@ package sonia.scm.api.rest.resources; //~--- non-JDK imports -------------------------------------------------------- import com.google.inject.Inject; +import com.google.inject.Provider; import com.google.inject.Singleton; import sonia.scm.config.ScmConfiguration; +import sonia.scm.repository.Permission; +import sonia.scm.repository.PermissionType; +import sonia.scm.repository.PermissionUtil; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RepositoryHandler; import sonia.scm.repository.RepositoryManager; +import sonia.scm.web.security.WebSecurityContext; //~--- JDK imports ------------------------------------------------------------ import java.io.IOException; +import java.util.ArrayList; import java.util.Collection; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Path; -import javax.ws.rs.core.Context; /** * @@ -75,13 +80,19 @@ public class RepositoryResource extends AbstractResource * * @param configuration * @param repositoryManager + * @param securityContextProvider + * @param requestProvider */ @Inject - public RepositoryResource(ScmConfiguration configuration, - RepositoryManager repositoryManager) + public RepositoryResource( + ScmConfiguration configuration, RepositoryManager repositoryManager, + Provider securityContextProvider, + Provider requestProvider) { this.configuration = configuration; this.repositoryManager = repositoryManager; + this.securityContextProvider = securityContextProvider; + this.requestProvider = requestProvider; } //~--- methods -------------------------------------------------------------- @@ -151,6 +162,7 @@ public class RepositoryResource extends AbstractResource for (Repository repository : repositories) { appendUrl(repository); + prepareRepository(repository); } return repositories; @@ -185,6 +197,7 @@ public class RepositoryResource extends AbstractResource Repository repository = repositoryManager.get(id); appendUrl(repository); + prepareRepository(repository); return repository; } @@ -216,6 +229,7 @@ public class RepositoryResource extends AbstractResource if (handler != null) { + HttpServletRequest request = requestProvider.get(); StringBuilder url = new StringBuilder(request.getScheme()); url.append("://").append(configuration.getServername()); @@ -234,6 +248,43 @@ public class RepositoryResource extends AbstractResource } } + /** + * Method description + * + * + * @param repository + */ + private void prepareRepository(Repository repository) + { + if (isOwner(repository)) + { + if (repository.getPermissions() == null) + { + repository.setPermissions(new ArrayList()); + } + } + else + { + repository.setPermissions(null); + } + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param repository + * + * @return + */ + private boolean isOwner(Repository repository) + { + return PermissionUtil.hasPermission(repository, securityContextProvider, + PermissionType.OWNER); + } + //~--- fields --------------------------------------------------------------- /** Field description */ @@ -242,7 +293,9 @@ public class RepositoryResource extends AbstractResource /** Field description */ private RepositoryManager repositoryManager; - /** TODO path request direct to method */ - @Context - private HttpServletRequest request; + /** Field description */ + private Provider requestProvider; + + /** Field description */ + private Provider securityContextProvider; } diff --git a/scm-webapp/src/main/java/sonia/scm/filter/GZipResponseWrapper.java b/scm-webapp/src/main/java/sonia/scm/filter/GZipResponseWrapper.java index f42d25ff17..8c1878a8c3 100644 --- a/scm-webapp/src/main/java/sonia/scm/filter/GZipResponseWrapper.java +++ b/scm-webapp/src/main/java/sonia/scm/filter/GZipResponseWrapper.java @@ -91,7 +91,10 @@ public class GZipResponseWrapper extends HttpServletResponseWrapper @Override public void flushBuffer() throws IOException { - stream.flush(); + if (stream != null) + { + stream.flush(); + } } //~--- get methods ---------------------------------------------------------- diff --git a/scm-webapp/src/main/java/sonia/scm/group/xml/XmlGroupManager.java b/scm-webapp/src/main/java/sonia/scm/group/xml/XmlGroupManager.java index 9a6a747e12..f83b69a03c 100644 --- a/scm-webapp/src/main/java/sonia/scm/group/xml/XmlGroupManager.java +++ b/scm-webapp/src/main/java/sonia/scm/group/xml/XmlGroupManager.java @@ -60,7 +60,6 @@ import java.io.IOException; import java.util.Collection; import java.util.LinkedList; -import java.util.Set; /** * diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/AetherPluginHandler.java b/scm-webapp/src/main/java/sonia/scm/plugin/AetherPluginHandler.java index fb54acdc3b..a30e5f64ec 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/AetherPluginHandler.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/AetherPluginHandler.java @@ -167,8 +167,6 @@ public class AetherPluginHandler List dependencies = getInstalledDependencies(null); collectDependencies(dependency, dependencies); - - } /** @@ -364,13 +362,10 @@ public class AetherPluginHandler { String id = plugin.getId(); - if ((skipId == null) ||!id.equals(skipId)) + if (Util.isNotEmpty(id) && ((skipId == null) ||!id.equals(skipId))) { - if (Util.isNotEmpty(id)) - { - dependencies.add(new Dependency(new DefaultArtifact(id), - PLUGIN_SCOPE)); - } + dependencies.add(new Dependency(new DefaultArtifact(id), + PLUGIN_SCOPE)); } } } diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java index 10bff0a95d..d69c75fde3 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java @@ -418,10 +418,14 @@ public class DefaultPluginManager implements PluginManager { state = PluginState.INSTALLED; } - else + else if (isNewer(available, installed)) { state = PluginState.UPDATE_AVAILABLE; } + else + { + state = PluginState.NEWER_VERSION_INSTALLED; + } break; } @@ -513,6 +517,29 @@ public class DefaultPluginManager implements PluginManager return center; } + /** + * Method description + * + * + * @param available + * @param installed + * + * @return + */ + private boolean isNewer(PluginInformation available, + PluginInformation installed) + { + boolean result = false; + PluginVersion version = PluginVersion.createVersion(installed.getVersion()); + + if (version != null) + { + result = version.isNewer(available.getVersion()); + } + + return result; + } + /** * Method description * diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/OverviewPluginFilter.java b/scm-webapp/src/main/java/sonia/scm/plugin/OverviewPluginFilter.java new file mode 100644 index 0000000000..bd9c8d9732 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/plugin/OverviewPluginFilter.java @@ -0,0 +1,62 @@ +/** + * 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.plugin; + +/** + * + * @author Sebastian Sdorra + */ +public class OverviewPluginFilter implements PluginFilter +{ + + /** Field description */ + public static final OverviewPluginFilter INSTANCE = + new OverviewPluginFilter(); + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param plugin + * + * @return + */ + @Override + public boolean accept(PluginInformation plugin) + { + return plugin.getState() != PluginState.NEWER_VERSION_INSTALLED; + } +} diff --git a/scm-webapp/src/main/java/sonia/scm/repository/xml/XmlRepositoryManager.java b/scm-webapp/src/main/java/sonia/scm/repository/xml/XmlRepositoryManager.java index 565d8d7c00..2c8f42708b 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/xml/XmlRepositoryManager.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/xml/XmlRepositoryManager.java @@ -44,7 +44,6 @@ import org.slf4j.LoggerFactory; import sonia.scm.ConfigurationException; import sonia.scm.HandlerEvent; -import sonia.scm.SCMContext; import sonia.scm.SCMContextProvider; import sonia.scm.Type; import sonia.scm.repository.AbstractRepositoryManager; @@ -98,12 +97,15 @@ public class XmlRepositoryManager extends AbstractRepositoryManager * * * + * + * @param contextProvider * @param securityContextProvider * @param storeFactory * @param handlerSet */ @Inject public XmlRepositoryManager( + SCMContextProvider contextProvider, Provider securityContextProvider, StoreFactory storeFactory, Set handlerSet) { @@ -114,7 +116,7 @@ public class XmlRepositoryManager extends AbstractRepositoryManager for (RepositoryHandler handler : handlerSet) { - addHandler(handler); + addHandler(contextProvider, handler); } } @@ -382,7 +384,9 @@ public class XmlRepositoryManager extends AbstractRepositoryManager { if (handlerMap.containsKey(repository.getType()) && isReader(repository)) { - repositories.add(repository.clone()); + Repository r = repository.clone(); + + repositories.add(r); } } @@ -421,9 +425,12 @@ public class XmlRepositoryManager extends AbstractRepositoryManager * Method description * * + * + * @param contextProvider * @param handler */ - private void addHandler(RepositoryHandler handler) + private void addHandler(SCMContextProvider contextProvider, + RepositoryHandler handler) { AssertUtil.assertIsNotNull(handler); @@ -444,7 +451,7 @@ public class XmlRepositoryManager extends AbstractRepositoryManager } handlerMap.put(type.getName(), handler); - handler.init(SCMContext.getContext()); + handler.init(contextProvider); types.add(type); } diff --git a/scm-webapp/src/main/webapp/resources/js/sonia.plugin.js b/scm-webapp/src/main/webapp/resources/js/sonia.plugin.js index 65c614925d..a69e6c59d6 100644 --- a/scm-webapp/src/main/webapp/resources/js/sonia.plugin.js +++ b/scm-webapp/src/main/webapp/resources/js/sonia.plugin.js @@ -198,7 +198,7 @@ Sonia.plugin.Grid = Ext.extend(Sonia.rest.Grid, { initComponent: function(){ Sonia.plugin.StoreInstance = new Sonia.plugin.Store({ - url: restUrl + 'plugins.json' + url: restUrl + 'plugins/overview.json' }); diff --git a/scm-webapp/src/main/webapp/resources/js/sonia.repository.js b/scm-webapp/src/main/webapp/resources/js/sonia.repository.js index ea7e46e9b9..ae976e81fa 100644 --- a/scm-webapp/src/main/webapp/resources/js/sonia.repository.js +++ b/scm-webapp/src/main/webapp/resources/js/sonia.repository.js @@ -46,65 +46,8 @@ Ext.ns('Sonia.repository'); // functions -Sonia.repository.getPermissionValue = function(type){ - var value = 0; - switch (type){ - case "READ": - value = 0; - break; - case "WRITE": - value = 10; - break; - case "OWNER": - value = 100; - break; - } - return value; -} - -Sonia.repository.isMember = function(group){ - var result = false; - if ( Ext.isDefined(state.groups) ){ - for ( var i=0; i= value ){ - if ( p.groupPermission ){ - if ( Sonia.repository.isMember( p.name ) ){ - result = true; - break; - } - } else if ( p.name == state.user.name ) { - result = true; - break; - } - } - } - } - } - return result; -} - Sonia.repository.isOwner = function(repository){ - return Sonia.repository.hasPermission(repository, 'OWNER'); + return repository.permissions != null; } Sonia.repository.setEditPanel = function(panel){ diff --git a/scm-webapp/src/main/webapp/resources/js/sonia.scm.js b/scm-webapp/src/main/webapp/resources/js/sonia.scm.js index 93bb1ce07b..8b682f2e86 100644 --- a/scm-webapp/src/main/webapp/resources/js/sonia.scm.js +++ b/scm-webapp/src/main/webapp/resources/js/sonia.scm.js @@ -118,7 +118,7 @@ Ext.onReady(function(){ items: [{ label: 'Repositories', fn: function(){ - addTabPanel('repositories', 'repositoryPanel', 'Repositories'); + mainTabPanel.setActiveTab('repositories'); } }] }); @@ -209,20 +209,18 @@ Ext.onReady(function(){ panel.doLayout(); } - function createWelcomePanel(){ + function createRepositoryPanel(){ if ( debug ){ - console.debug('create welcome tab'); + console.debug('create repository panel'); } mainTabPanel.add({ - id: 'welcomeTab', - xtype: 'panel', - title: 'Welcome', - hideMode: 'offsets', - bodyCssClass: 'x-panel-mc', - enableTabScroll: true, + id: 'repositories', + xtype: 'repositoryPanel', + title: 'Repositories', + closeable: false, autoScroll: true }); - mainTabPanel.setActiveTab('welcomeTab'); + mainTabPanel.setActiveTab('repositories'); } // register login callbacks @@ -230,6 +228,6 @@ Ext.onReady(function(){ // create menu loginCallbacks.splice(0, 0, createMainMenu ); // add welcome tab - loginCallbacks.push( createWelcomePanel ); + loginCallbacks.push( createRepositoryPanel ); }); \ No newline at end of file diff --git a/scm-webapp/src/test/java/sonia/scm/repository/XmlRepositoryManagerTest.java b/scm-webapp/src/test/java/sonia/scm/repository/XmlRepositoryManagerTest.java index 98046267fe..16ad325518 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/XmlRepositoryManagerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/XmlRepositoryManagerTest.java @@ -36,10 +36,10 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- import sonia.scm.Manager; -import sonia.scm.util.MockUtil; import sonia.scm.repository.xml.XmlRepositoryManager; import sonia.scm.store.JAXBStoreFactory; import sonia.scm.store.StoreFactory; +import sonia.scm.util.MockUtil; //~--- JDK imports ------------------------------------------------------------ @@ -68,7 +68,8 @@ public class XmlRepositoryManagerTest extends RepositoryManagerTestBase factory.init(contextProvider); handlerSet.add(new DummyRepositoryHandler(factory)); - return new XmlRepositoryManager(MockUtil.getAdminSecurityContextProvider(), + return new XmlRepositoryManager(contextProvider, + MockUtil.getAdminSecurityContextProvider(), factory, handlerSet); } } diff --git a/third-party/pom.xml b/third-party/pom.xml index f72dd7eb27..ec5d022314 100644 --- a/third-party/pom.xml +++ b/third-party/pom.xml @@ -6,13 +6,13 @@ sonia.scm scm - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.third-party sonia.scm.third-party pom - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT third-party diff --git a/third-party/shared-libs/pom.xml b/third-party/shared-libs/pom.xml index 120d7b2924..59134295b3 100644 --- a/third-party/shared-libs/pom.xml +++ b/third-party/shared-libs/pom.xml @@ -6,13 +6,13 @@ sonia.scm.third-party sonia.scm.third-party - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT sonia.scm.third-party shared-libs pom - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT shared-libs diff --git a/third-party/svnkit-dav/pom.xml b/third-party/svnkit-dav/pom.xml index 0867adf1b4..2213ac2103 100644 --- a/third-party/svnkit-dav/pom.xml +++ b/third-party/svnkit-dav/pom.xml @@ -6,7 +6,7 @@ sonia.scm.third-party sonia.scm.third-party - 1.0-M7-SNAPSHOT + 1.0-RC1-SNAPSHOT org.tmatesoft.svnkit