diff --git a/pom.xml b/pom.xml index 1c08c334f5..cb9ff0530c 100644 --- a/pom.xml +++ b/pom.xml @@ -765,7 +765,7 @@ 1.8.15-scm1 - 16.0.1 + 26.0-jre 2.2.3 diff --git a/scm-core/src/main/java/sonia/scm/AlreadyExistsException.java b/scm-core/src/main/java/sonia/scm/AlreadyExistsException.java new file mode 100644 index 0000000000..36052d99e9 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/AlreadyExistsException.java @@ -0,0 +1,4 @@ +package sonia.scm; + +public class AlreadyExistsException extends Exception { +} diff --git a/scm-core/src/main/java/sonia/scm/BasicPropertiesAware.java b/scm-core/src/main/java/sonia/scm/BasicPropertiesAware.java index f0b7772a77..cfd4284fae 100644 --- a/scm-core/src/main/java/sonia/scm/BasicPropertiesAware.java +++ b/scm-core/src/main/java/sonia/scm/BasicPropertiesAware.java @@ -37,18 +37,15 @@ package sonia.scm; import com.google.common.base.Objects; import com.google.common.collect.Maps; - import sonia.scm.xml.XmlMapStringAdapter; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; - -import java.util.Map; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import java.io.Serializable; +import java.util.Map; + +//~--- JDK imports ------------------------------------------------------------ /** * Default implementation of {@link PropertiesAware} interface. diff --git a/scm-core/src/main/java/sonia/scm/ConcurrentModificationException.java b/scm-core/src/main/java/sonia/scm/ConcurrentModificationException.java new file mode 100644 index 0000000000..f0340a6a59 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/ConcurrentModificationException.java @@ -0,0 +1,4 @@ +package sonia.scm; + +public class ConcurrentModificationException extends Exception { +} diff --git a/scm-core/src/main/java/sonia/scm/Handler.java b/scm-core/src/main/java/sonia/scm/Handler.java index 67ec039fba..a4e927ed7b 100644 --- a/scm-core/src/main/java/sonia/scm/Handler.java +++ b/scm-core/src/main/java/sonia/scm/Handler.java @@ -39,11 +39,8 @@ package sonia.scm; * @author Sebastian Sdorra * * @param a typed object - * @param */ -public interface Handler - extends HandlerBase -{ +public interface Handler extends HandlerBase { /** * Returns the type object of the handler. @@ -51,7 +48,7 @@ public interface Handler * * @return type object of the handler */ - public Type getType(); + Type getType(); /** * Returns true if the hanlder is configured. @@ -59,5 +56,5 @@ public interface Handler * * @return true if the hanlder is configured */ - public boolean isConfigured(); + boolean isConfigured(); } diff --git a/scm-core/src/main/java/sonia/scm/HandlerBase.java b/scm-core/src/main/java/sonia/scm/HandlerBase.java index 6ce7d9a6a6..bbe78c8cf7 100644 --- a/scm-core/src/main/java/sonia/scm/HandlerBase.java +++ b/scm-core/src/main/java/sonia/scm/HandlerBase.java @@ -44,9 +44,8 @@ import java.io.IOException; * @author Sebastian Sdorra * * @param type object of the handler - * @param exception type of the handler */ -public interface HandlerBase +public interface HandlerBase extends Initable, Closeable { @@ -55,7 +54,7 @@ public interface HandlerBase * * @return The persisted object. */ - public T create(T object) throws E; + T create(T object) throws AlreadyExistsException; /** * Removes a persistent object. @@ -63,10 +62,9 @@ public interface HandlerBase * * @param object to delete * - * @throws E * @throws IOException */ - public void delete(T object) throws E; + void delete(T object) throws NotFoundException; /** * Modifies a persistent object. @@ -74,8 +72,7 @@ public interface HandlerBase * * @param object to modify * - * @throws E * @throws IOException */ - public void modify(T object) throws E; + void modify(T object) throws NotFoundException; } diff --git a/scm-core/src/main/java/sonia/scm/Manager.java b/scm-core/src/main/java/sonia/scm/Manager.java index c0d074520a..2925b5b6b4 100644 --- a/scm-core/src/main/java/sonia/scm/Manager.java +++ b/scm-core/src/main/java/sonia/scm/Manager.java @@ -42,10 +42,9 @@ import java.util.Comparator; * @author Sebastian Sdorra * * @param type of the model object - * @param type of the exception */ -public interface Manager - extends HandlerBase, LastModifiedAware +public interface Manager + extends HandlerBase, LastModifiedAware { /** @@ -54,9 +53,9 @@ public interface Manager * * @param object to refresh * - * @throws E + * @throws NotFoundException */ - void refresh(T object) throws E; + void refresh(T object) throws NotFoundException; //~--- get methods ---------------------------------------------------------- diff --git a/scm-core/src/main/java/sonia/scm/ManagerDecorator.java b/scm-core/src/main/java/sonia/scm/ManagerDecorator.java index 3b90002d13..7b3f03ee8c 100644 --- a/scm-core/src/main/java/sonia/scm/ManagerDecorator.java +++ b/scm-core/src/main/java/sonia/scm/ManagerDecorator.java @@ -45,11 +45,8 @@ import java.util.Comparator; * @since 1.23 * * @param model type - * @param exception type */ -public class ManagerDecorator - implements Manager -{ +public class ManagerDecorator implements Manager { /** * Constructs a new ManagerDecorator. @@ -57,125 +54,78 @@ public class ManagerDecorator * * @param decorated manager implementation */ - public ManagerDecorator(Manager decorated) + public ManagerDecorator(Manager decorated) { this.decorated = decorated; } - //~--- methods -------------------------------------------------------------- - - /** - * {@inheritDoc} - */ @Override public void close() throws IOException { decorated.close(); } - /** - * {@inheritDoc} - */ @Override - public T create(T object) throws E - { + public T create(T object) throws AlreadyExistsException { return decorated.create(object); } - /** - * {@inheritDoc} - */ @Override - public void delete(T object) throws E - { + public void delete(T object) throws NotFoundException { decorated.delete(object); } - /** - * {@inheritDoc} - */ @Override public void init(SCMContextProvider context) { decorated.init(context); } - /** - * {@inheritDoc} - */ @Override - public void modify(T object) throws E - { + public void modify(T object) throws NotFoundException { decorated.modify(object); } - /** - * {@inheritDoc} - */ @Override - public void refresh(T object) throws E - { + public void refresh(T object) throws NotFoundException { decorated.refresh(object); } - //~--- get methods ---------------------------------------------------------- - - /** - * {@inheritDoc} - */ @Override public T get(String id) { return decorated.get(id); } - /** - * {@inheritDoc} - */ @Override public Collection getAll() { return decorated.getAll(); } - /** - * {@inheritDoc} - */ @Override public Collection getAll(Comparator comparator) { return decorated.getAll(comparator); } - /** - * {@inheritDoc} - */ @Override public Collection getAll(int start, int limit) { return decorated.getAll(start, limit); } - /** - * {@inheritDoc} - */ @Override public Collection getAll(Comparator comparator, int start, int limit) { return decorated.getAll(comparator, start, limit); } - /** - * {@inheritDoc} - */ @Override public Long getLastModified() { return decorated.getLastModified(); } - //~--- fields --------------------------------------------------------------- - - /** manager implementation */ - private Manager decorated; + private Manager decorated; } diff --git a/scm-core/src/main/java/sonia/scm/NotFoundException.java b/scm-core/src/main/java/sonia/scm/NotFoundException.java new file mode 100644 index 0000000000..8a7ae642bd --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/NotFoundException.java @@ -0,0 +1,10 @@ +package sonia.scm; + +public class NotFoundException extends Exception { + public NotFoundException(String type, String id) { + super(type + " with id '" + id + "' not found"); + } + + public NotFoundException() { + } +} diff --git a/scm-core/src/main/java/sonia/scm/TypeManager.java b/scm-core/src/main/java/sonia/scm/TypeManager.java index 52a43e5593..6f13cb82d8 100644 --- a/scm-core/src/main/java/sonia/scm/TypeManager.java +++ b/scm-core/src/main/java/sonia/scm/TypeManager.java @@ -44,10 +44,8 @@ import java.util.Collection; * * @param type of the model object * @param type of the handler - * @param type of the exception */ -public interface TypeManager, - E extends Exception> extends Manager +public interface TypeManager> extends Manager { /** @@ -58,7 +56,7 @@ public interface TypeManager, * * @return the handler for given type */ - public H getHandler(String type); + H getHandler(String type); /** * Returns a {@link java.util.Collection} of all @@ -66,5 +64,5 @@ public interface TypeManager, * * @return all available types */ - public Collection getTypes(); + Collection getTypes(); } diff --git a/scm-core/src/main/java/sonia/scm/api/v2/resources/BaseDtoMapper.java b/scm-core/src/main/java/sonia/scm/api/v2/resources/BaseDtoMapper.java new file mode 100644 index 0000000000..8d67822c1b --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/api/v2/resources/BaseDtoMapper.java @@ -0,0 +1,12 @@ +package sonia.scm.api.v2.resources; + +import java.time.Instant; + +class BaseDtoMapper { + Long mapDate(Instant value) { + if (value != null) { + return value.toEpochMilli(); + } + return null; + } +} diff --git a/scm-core/src/main/java/sonia/scm/cache/CacheStatistics.java b/scm-core/src/main/java/sonia/scm/cache/CacheStatistics.java index 067e623e6d..cc791ff91f 100644 --- a/scm-core/src/main/java/sonia/scm/cache/CacheStatistics.java +++ b/scm-core/src/main/java/sonia/scm/cache/CacheStatistics.java @@ -33,6 +33,7 @@ package sonia.scm.cache; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; /** @@ -101,7 +102,7 @@ public final class CacheStatistics public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("name", name) .add("hitCount", hitCount) .add("missCount", missCount) diff --git a/scm-core/src/main/java/sonia/scm/event/AbstractHandlerEvent.java b/scm-core/src/main/java/sonia/scm/event/AbstractHandlerEvent.java index 5efbf118ba..1582247f35 100644 --- a/scm-core/src/main/java/sonia/scm/event/AbstractHandlerEvent.java +++ b/scm-core/src/main/java/sonia/scm/event/AbstractHandlerEvent.java @@ -33,8 +33,8 @@ package sonia.scm.event; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; - import sonia.scm.HandlerEventType; /** @@ -127,7 +127,7 @@ public class AbstractHandlerEvent implements HandlerEvent public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("eventType", eventType) .add("item", item) .add("oldItem", oldItem) diff --git a/scm-core/src/main/java/sonia/scm/group/Group.java b/scm-core/src/main/java/sonia/scm/group/Group.java index 5341024203..98d9dcc7a3 100644 --- a/scm-core/src/main/java/sonia/scm/group/Group.java +++ b/scm-core/src/main/java/sonia/scm/group/Group.java @@ -37,6 +37,7 @@ package sonia.scm.group; import com.github.sdorra.ssp.PermissionObject; import com.github.sdorra.ssp.StaticPermissions; +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.collect.Lists; import sonia.scm.BasicPropertiesAware; @@ -259,7 +260,7 @@ public class Group extends BasicPropertiesAware public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("name", name) .add("description", description) .add("members", members) diff --git a/scm-core/src/main/java/sonia/scm/group/GroupAlreadyExistsException.java b/scm-core/src/main/java/sonia/scm/group/GroupAlreadyExistsException.java deleted file mode 100644 index 2b3c73535e..0000000000 --- a/scm-core/src/main/java/sonia/scm/group/GroupAlreadyExistsException.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright (c) 2010, Sebastian Sdorra - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of SCM-Manager; nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * http://bitbucket.org/sdorra/scm-manager - * - */ - - - -package sonia.scm.group; - -/** - * This {@link Exception} is thrown when trying to create a group - * that already exists. - * - * @author Sebastian Sdorra - */ -public class GroupAlreadyExistsException extends GroupException -{ - - private static final long serialVersionUID = 4042878550219750430L; - - public GroupAlreadyExistsException(Group group) { - super(group.getName() + " group already exists"); - } -} diff --git a/scm-core/src/main/java/sonia/scm/group/GroupException.java b/scm-core/src/main/java/sonia/scm/group/GroupException.java deleted file mode 100644 index e0dc799e92..0000000000 --- a/scm-core/src/main/java/sonia/scm/group/GroupException.java +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Copyright (c) 2010, Sebastian Sdorra - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of SCM-Manager; nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * http://bitbucket.org/sdorra/scm-manager - * - */ - - - -package sonia.scm.group; - -/** - * General {@link Exception} for group errors. - * - * @author Sebastian Sdorra - */ -public class GroupException extends Exception -{ - - /** Field description */ - private static final long serialVersionUID = 5191341492098994225L; - - //~--- constructors --------------------------------------------------------- - - /** - * Constructs a {@link GroupException} object. - * - */ - public GroupException() - { - super(); - } - - /** - * Constructs a {@link GroupException} object. - * - * - * @param message for the exception - */ - public GroupException(String message) - { - super(message); - } - - /** - * Constructs a {@link GroupException} object. - * - * - * @param cause of the exception - */ - public GroupException(Throwable cause) - { - super(cause); - } - - /** - * Constructs a {@link GroupException} object. - * - * - * @param message of the exception - * @param cause of the exception - */ - public GroupException(String message, Throwable cause) - { - super(message, cause); - } -} diff --git a/scm-core/src/main/java/sonia/scm/group/GroupManager.java b/scm-core/src/main/java/sonia/scm/group/GroupManager.java index 428559edef..288196894d 100644 --- a/scm-core/src/main/java/sonia/scm/group/GroupManager.java +++ b/scm-core/src/main/java/sonia/scm/group/GroupManager.java @@ -38,10 +38,10 @@ package sonia.scm.group; import sonia.scm.Manager; import sonia.scm.search.Searchable; -//~--- JDK imports ------------------------------------------------------------ - import java.util.Collection; +//~--- JDK imports ------------------------------------------------------------ + /** * The central class for managing {@link Group}s. * This class is a singleton and is available via injection. @@ -49,7 +49,7 @@ import java.util.Collection; * @author Sebastian Sdorra */ public interface GroupManager - extends Manager, Searchable + extends Manager, Searchable { /** diff --git a/scm-core/src/main/java/sonia/scm/group/GroupManagerDecorator.java b/scm-core/src/main/java/sonia/scm/group/GroupManagerDecorator.java index 955e218b43..e2367d863c 100644 --- a/scm-core/src/main/java/sonia/scm/group/GroupManagerDecorator.java +++ b/scm-core/src/main/java/sonia/scm/group/GroupManagerDecorator.java @@ -38,10 +38,10 @@ package sonia.scm.group; import sonia.scm.ManagerDecorator; import sonia.scm.search.SearchRequest; -//~--- JDK imports ------------------------------------------------------------ - import java.util.Collection; +//~--- JDK imports ------------------------------------------------------------ + /** * Decorator for {@link GroupManager}. * @@ -49,7 +49,7 @@ import java.util.Collection; * @since 1.23 */ public class GroupManagerDecorator - extends ManagerDecorator implements GroupManager + extends ManagerDecorator implements GroupManager { /** diff --git a/scm-core/src/main/java/sonia/scm/group/GroupNames.java b/scm-core/src/main/java/sonia/scm/group/GroupNames.java index 43ca462d32..24d32972b6 100644 --- a/scm-core/src/main/java/sonia/scm/group/GroupNames.java +++ b/scm-core/src/main/java/sonia/scm/group/GroupNames.java @@ -39,14 +39,13 @@ import com.google.common.base.Joiner; import com.google.common.base.Objects; import com.google.common.collect.Lists; -//~--- JDK imports ------------------------------------------------------------ - import java.io.Serializable; - import java.util.Collection; import java.util.Collections; import java.util.Iterator; +//~--- JDK imports ------------------------------------------------------------ + /** * This class represents all associated groups for a user. * diff --git a/scm-core/src/main/java/sonia/scm/group/GroupNotFoundException.java b/scm-core/src/main/java/sonia/scm/group/GroupNotFoundException.java deleted file mode 100644 index 2ea5d16cf0..0000000000 --- a/scm-core/src/main/java/sonia/scm/group/GroupNotFoundException.java +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (c) 2010, Sebastian Sdorra - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of SCM-Manager; nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * http://bitbucket.org/sdorra/scm-manager - * - */ - - -package sonia.scm.group; - -/** - * The GroupNotFoundException is thrown e.g. from the - * modify method of the {@link GroupManager}, if the group does not exists. - * - * @author Sebastian Sdorra - * - * @since 1.28 - */ -public class GroupNotFoundException extends GroupException -{ - - /** Field description */ - private static final long serialVersionUID = -1617037899954718001L; - - //~--- constructors --------------------------------------------------------- - - /** - * Constructs a new GroupNotFoundException. - * - */ - public GroupNotFoundException(Group group) { - super("group " + group.getName() + " does not exist"); - } -} diff --git a/scm-core/src/main/java/sonia/scm/i18n/I18nMessages.java b/scm-core/src/main/java/sonia/scm/i18n/I18nMessages.java index 9c4a9353be..0af1cef895 100644 --- a/scm-core/src/main/java/sonia/scm/i18n/I18nMessages.java +++ b/scm-core/src/main/java/sonia/scm/i18n/I18nMessages.java @@ -36,16 +36,13 @@ package sonia.scm.i18n; import com.google.common.base.Objects; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; - import sonia.scm.util.ClassLoaders; -//~--- JDK imports ------------------------------------------------------------ - +import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Field; - import java.util.Locale; -import javax.servlet.http.HttpServletRequest; +//~--- JDK imports ------------------------------------------------------------ /** * The I18nMessages class instantiates a class and initializes all {@link String} diff --git a/scm-core/src/main/java/sonia/scm/plugin/ClassElement.java b/scm-core/src/main/java/sonia/scm/plugin/ClassElement.java index 8f931e5599..813a5a850f 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/ClassElement.java +++ b/scm-core/src/main/java/sonia/scm/plugin/ClassElement.java @@ -33,12 +33,13 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - import javax.xml.bind.annotation.XmlElement; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -117,7 +118,7 @@ public final class ClassElement public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("clazz", clazz) .add("description", description) .toString(); diff --git a/scm-core/src/main/java/sonia/scm/plugin/ExtensionPointElement.java b/scm-core/src/main/java/sonia/scm/plugin/ExtensionPointElement.java index 25b8fe303a..7f6f1efe07 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/ExtensionPointElement.java +++ b/scm-core/src/main/java/sonia/scm/plugin/ExtensionPointElement.java @@ -33,15 +33,16 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -129,7 +130,7 @@ public final class ExtensionPointElement public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("class", clazz) .add("description", description) .add("multiple", multiple) diff --git a/scm-core/src/main/java/sonia/scm/plugin/Plugin.java b/scm-core/src/main/java/sonia/scm/plugin/Plugin.java index d55555e747..e8fd166e78 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/Plugin.java +++ b/scm-core/src/main/java/sonia/scm/plugin/Plugin.java @@ -35,18 +35,18 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.collect.ImmutableSet; -//~--- JDK imports ------------------------------------------------------------ - -import java.util.Set; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; +import java.util.Set; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -142,7 +142,7 @@ public final class Plugin extends ScmModule public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("scmVersion", scmVersion) .add("condition", condition) .add("information", information) diff --git a/scm-core/src/main/java/sonia/scm/plugin/PluginCondition.java b/scm-core/src/main/java/sonia/scm/plugin/PluginCondition.java index ad6ba84875..e70821d0df 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/PluginCondition.java +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginCondition.java @@ -35,27 +35,25 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; - import sonia.scm.PlatformType; import sonia.scm.SCMContext; import sonia.scm.util.SystemUtil; import sonia.scm.util.Util; import sonia.scm.version.Version; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; - -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -164,7 +162,7 @@ public class PluginCondition implements Cloneable, Serializable public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("arch", arch) .add("minVersion", minVersion) .add("os", os) diff --git a/scm-core/src/main/java/sonia/scm/plugin/PluginInformation.java b/scm-core/src/main/java/sonia/scm/plugin/PluginInformation.java index 1cf23fd3d9..3ae359ceb7 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/PluginInformation.java +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginInformation.java @@ -37,24 +37,21 @@ package sonia.scm.plugin; import com.github.sdorra.ssp.PermissionObject; import com.github.sdorra.ssp.StaticPermissions; - +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; - import sonia.scm.Validateable; import sonia.scm.util.Util; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; - -import java.util.ArrayList; -import java.util.List; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -180,7 +177,7 @@ public class PluginInformation public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("artifactId", artifactId) .add("author", author) .add("category", category) diff --git a/scm-core/src/main/java/sonia/scm/plugin/PluginRepository.java b/scm-core/src/main/java/sonia/scm/plugin/PluginRepository.java index c546788d09..1d4cc07338 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/PluginRepository.java +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginRepository.java @@ -35,12 +35,13 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - import java.io.Serializable; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -121,7 +122,7 @@ public class PluginRepository implements Serializable @Override public String toString() { - return Objects.toStringHelper(this).add("id", id).add("url", + return MoreObjects.toStringHelper(this).add("id", id).add("url", url).toString(); } diff --git a/scm-core/src/main/java/sonia/scm/plugin/PluginResources.java b/scm-core/src/main/java/sonia/scm/plugin/PluginResources.java index b039c291f5..07e35e0e4f 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/PluginResources.java +++ b/scm-core/src/main/java/sonia/scm/plugin/PluginResources.java @@ -35,15 +35,15 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - -import java.util.Set; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; +import java.util.Set; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -124,7 +124,7 @@ public class PluginResources public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("scriptResources", scriptResources) .add("stylesheetResources", stylesheetResources) .toString(); diff --git a/scm-core/src/main/java/sonia/scm/plugin/SubscriberElement.java b/scm-core/src/main/java/sonia/scm/plugin/SubscriberElement.java index 44c3d6edd2..5cc98d0bf9 100644 --- a/scm-core/src/main/java/sonia/scm/plugin/SubscriberElement.java +++ b/scm-core/src/main/java/sonia/scm/plugin/SubscriberElement.java @@ -33,15 +33,16 @@ package sonia.scm.plugin; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -126,7 +127,7 @@ public final class SubscriberElement public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("eventClass", eventClass) .add("subscriberClass", subscriberClass) .add("description", description) diff --git a/scm-core/src/main/java/sonia/scm/repository/AbstactImportHandler.java b/scm-core/src/main/java/sonia/scm/repository/AbstactImportHandler.java index 6e0827af4a..2195e87730 100644 --- a/scm-core/src/main/java/sonia/scm/repository/AbstactImportHandler.java +++ b/scm-core/src/main/java/sonia/scm/repository/AbstactImportHandler.java @@ -35,9 +35,9 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.base.Throwables; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import sonia.scm.AlreadyExistsException; import sonia.scm.repository.ImportResult.Builder; import java.io.File; @@ -86,9 +86,7 @@ public abstract class AbstactImportHandler implements AdvancedImportHandler * {@inheritDoc} */ @Override - public List importRepositories(RepositoryManager manager) - throws IOException, RepositoryException - { + public List importRepositories(RepositoryManager manager) throws IOException { return doRepositoryImport(manager, true).getImportedDirectories(); } @@ -98,22 +96,7 @@ public abstract class AbstactImportHandler implements AdvancedImportHandler @Override public ImportResult importRepositoriesFromDirectory(RepositoryManager manager) { - try - { - return doRepositoryImport(manager, false); - } - catch (IOException ex) - { - - // should never happen - throw Throwables.propagate(ex); - } - catch (RepositoryException ex) - { - - // should never happen - throw Throwables.propagate(ex); - } + return doRepositoryImport(manager, false); } /** @@ -126,12 +109,8 @@ public abstract class AbstactImportHandler implements AdvancedImportHandler * @return repository * * @throws IOException - * @throws RepositoryException */ - protected Repository createRepository(File repositoryDirectory, - String repositoryName) - throws IOException, RepositoryException - { + protected Repository createRepository(File repositoryDirectory, String repositoryName) throws IOException { Repository repository = new Repository(); repository.setName(repositoryName); @@ -151,12 +130,8 @@ public abstract class AbstactImportHandler implements AdvancedImportHandler * @return import result * * @throws IOException - * @throws RepositoryException */ - private ImportResult doRepositoryImport(RepositoryManager manager, - boolean throwExceptions) - throws IOException, RepositoryException - { + private ImportResult doRepositoryImport(RepositoryManager manager, boolean throwExceptions) { Builder builder = ImportResult.builder(); logger.trace("search for repositories to import"); @@ -215,11 +190,10 @@ public abstract class AbstactImportHandler implements AdvancedImportHandler * @param directoryName * * @throws IOException - * @throws RepositoryException */ private void importRepository(RepositoryManager manager, Builder builder, boolean throwExceptions, String directoryName) - throws IOException, RepositoryException + throws IOException { logger.trace("check repository {} for import", directoryName); @@ -266,12 +240,10 @@ public abstract class AbstactImportHandler implements AdvancedImportHandler * * @return * @throws IOException - * @throws RepositoryException */ private void importRepository(RepositoryManager manager, String repositoryName) - throws IOException, RepositoryException - { + throws IOException, AlreadyExistsException { Repository repository = createRepository(getRepositoryDirectory(repositoryName), repositoryName); 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 536b7bd9e9..a717cdf05b 100644 --- a/scm-core/src/main/java/sonia/scm/repository/AbstractSimpleRepositoryHandler.java +++ b/scm-core/src/main/java/sonia/scm/repository/AbstractSimpleRepositoryHandler.java @@ -38,6 +38,7 @@ import com.google.common.base.Throwables; import com.google.common.io.Resources; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import sonia.scm.AlreadyExistsException; import sonia.scm.ConfigurationException; import sonia.scm.io.CommandResult; import sonia.scm.io.ExtendedCommand; @@ -80,12 +81,11 @@ public abstract class AbstractSimpleRepositoryHandler public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("total", total) .add("blameLines", blameLines) .toString(); diff --git a/scm-core/src/main/java/sonia/scm/repository/Branch.java b/scm-core/src/main/java/sonia/scm/repository/Branch.java index 3e610812ff..ce1d43c82b 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Branch.java +++ b/scm-core/src/main/java/sonia/scm/repository/Branch.java @@ -35,15 +35,15 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; + +//~--- JDK imports ------------------------------------------------------------ /** * Represents a branch in a repository. @@ -132,7 +132,7 @@ public final class Branch implements Serializable public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("name", name) .add("revision", revision) .toString(); diff --git a/scm-core/src/main/java/sonia/scm/repository/Branches.java b/scm-core/src/main/java/sonia/scm/repository/Branches.java index f2f7de1a2a..1eb679908e 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Branches.java +++ b/scm-core/src/main/java/sonia/scm/repository/Branches.java @@ -34,17 +34,18 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.collect.Lists; -//~--- JDK imports ------------------------------------------------------------ - -import java.util.Iterator; -import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import java.util.Iterator; +import java.util.List; + +//~--- JDK imports ------------------------------------------------------------ /** * Represents all branches of a repository. @@ -148,7 +149,7 @@ public final class Branches implements Iterable public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("branches", branches) .toString(); //J+ diff --git a/scm-core/src/main/java/sonia/scm/repository/BrowserResult.java b/scm-core/src/main/java/sonia/scm/repository/BrowserResult.java index 7880b58f11..212ce45f81 100644 --- a/scm-core/src/main/java/sonia/scm/repository/BrowserResult.java +++ b/scm-core/src/main/java/sonia/scm/repository/BrowserResult.java @@ -35,20 +35,19 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; - -import java.util.Iterator; -import java.util.List; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; +import java.util.Iterator; +import java.util.List; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -161,7 +160,7 @@ public class BrowserResult implements Iterable, Serializable public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("revision", revision) .add("tag", tag) .add("branch", branch) diff --git a/scm-core/src/main/java/sonia/scm/repository/Changeset.java b/scm-core/src/main/java/sonia/scm/repository/Changeset.java index fecfd74cc9..422611e4e8 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Changeset.java +++ b/scm-core/src/main/java/sonia/scm/repository/Changeset.java @@ -36,24 +36,21 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.base.Objects; - import sonia.scm.BasicPropertiesAware; import sonia.scm.Validateable; import sonia.scm.util.Util; import sonia.scm.util.ValidationUtil; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +//~--- JDK imports ------------------------------------------------------------ /** * Represents a changeset/commit of a repository. diff --git a/scm-core/src/main/java/sonia/scm/repository/ChangesetPagingResult.java b/scm-core/src/main/java/sonia/scm/repository/ChangesetPagingResult.java index 0712ed40af..59a705e36a 100644 --- a/scm-core/src/main/java/sonia/scm/repository/ChangesetPagingResult.java +++ b/scm-core/src/main/java/sonia/scm/repository/ChangesetPagingResult.java @@ -35,20 +35,19 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; - -import java.util.Iterator; -import java.util.List; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; +import java.util.Iterator; +import java.util.List; + +//~--- JDK imports ------------------------------------------------------------ /** * The changeset paging result is used to do a paging over the @@ -156,7 +155,7 @@ public class ChangesetPagingResult implements Iterable, Serializable public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("changesets", changesets) .add("total", total) .toString(); diff --git a/scm-core/src/main/java/sonia/scm/repository/FileObject.java b/scm-core/src/main/java/sonia/scm/repository/FileObject.java index c5c4366a0e..5279921257 100644 --- a/scm-core/src/main/java/sonia/scm/repository/FileObject.java +++ b/scm-core/src/main/java/sonia/scm/repository/FileObject.java @@ -35,18 +35,17 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; - import sonia.scm.LastModifiedAware; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; + +//~--- JDK imports ------------------------------------------------------------ /** * The FileObject represents a file or a directory in a repository. @@ -110,7 +109,7 @@ public class FileObject implements LastModifiedAware, Serializable public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("name", name) .add("path", path) .add("directory", directory) diff --git a/scm-core/src/main/java/sonia/scm/repository/HealthCheckFailure.java b/scm-core/src/main/java/sonia/scm/repository/HealthCheckFailure.java index 8bac16de8d..55f1abbaa6 100644 --- a/scm-core/src/main/java/sonia/scm/repository/HealthCheckFailure.java +++ b/scm-core/src/main/java/sonia/scm/repository/HealthCheckFailure.java @@ -33,14 +33,15 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; +//~--- JDK imports ------------------------------------------------------------ + /** * Single failure of a {@link HealthCheck}. * @@ -132,7 +133,7 @@ public final class HealthCheckFailure public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("id", id) .add("summary", summary) .add("url", url) diff --git a/scm-core/src/main/java/sonia/scm/repository/HealthCheckResult.java b/scm-core/src/main/java/sonia/scm/repository/HealthCheckResult.java index f5cb690533..9ff902e3cd 100644 --- a/scm-core/src/main/java/sonia/scm/repository/HealthCheckResult.java +++ b/scm-core/src/main/java/sonia/scm/repository/HealthCheckResult.java @@ -33,13 +33,14 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.collect.ImmutableSet; -//~--- JDK imports ------------------------------------------------------------ - import java.util.Set; +//~--- JDK imports ------------------------------------------------------------ + /** * Result of {@link HealthCheck}. * @@ -182,7 +183,7 @@ public final class HealthCheckResult @Override public String toString() { - return Objects.toStringHelper(this).add("failures", failures).toString(); + return MoreObjects.toStringHelper(this).add("failures", failures).toString(); } //~--- get methods ---------------------------------------------------------- diff --git a/scm-core/src/main/java/sonia/scm/repository/ImportHandler.java b/scm-core/src/main/java/sonia/scm/repository/ImportHandler.java index a3c567c930..cee142b48e 100644 --- a/scm-core/src/main/java/sonia/scm/repository/ImportHandler.java +++ b/scm-core/src/main/java/sonia/scm/repository/ImportHandler.java @@ -35,7 +35,6 @@ package sonia.scm.repository; //~--- JDK imports ------------------------------------------------------------ import java.io.IOException; - import java.util.List; /** @@ -56,8 +55,6 @@ public interface ImportHandler * * @return a {@link List} names of imported repositories * @throws IOException - * @throws RepositoryException */ - public List importRepositories(RepositoryManager manager) - throws IOException, RepositoryException; + public List importRepositories(RepositoryManager manager) throws IOException; } diff --git a/scm-core/src/main/java/sonia/scm/repository/ImportResult.java b/scm-core/src/main/java/sonia/scm/repository/ImportResult.java index a7d242abc4..e834a7ec6c 100644 --- a/scm-core/src/main/java/sonia/scm/repository/ImportResult.java +++ b/scm-core/src/main/java/sonia/scm/repository/ImportResult.java @@ -33,18 +33,19 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; -import static com.google.common.base.Preconditions.*; - -//~--- JDK imports ------------------------------------------------------------ - -import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; +import java.util.List; + +import static com.google.common.base.Preconditions.checkNotNull; + +//~--- JDK imports ------------------------------------------------------------ /** * Import result of the {@link AdvancedImportHandler}. @@ -130,7 +131,7 @@ public final class ImportResult public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("importedDirectories", importedDirectories) .add("failedDirectories", failedDirectories) .toString(); diff --git a/scm-core/src/main/java/sonia/scm/repository/InternalRepositoryException.java b/scm-core/src/main/java/sonia/scm/repository/InternalRepositoryException.java new file mode 100644 index 0000000000..d397028d7e --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/InternalRepositoryException.java @@ -0,0 +1,15 @@ +package sonia.scm.repository; + +public class InternalRepositoryException extends RuntimeException { + public InternalRepositoryException(Throwable ex) { + super(ex); + } + + public InternalRepositoryException(String msg, Exception ex) { + super(msg, ex); + } + + public InternalRepositoryException(String message) { + super(message); + } +} diff --git a/scm-core/src/main/java/sonia/scm/repository/Modifications.java b/scm-core/src/main/java/sonia/scm/repository/Modifications.java index 26804c91a6..4079d8f574 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Modifications.java +++ b/scm-core/src/main/java/sonia/scm/repository/Modifications.java @@ -37,20 +37,17 @@ package sonia.scm.repository; import com.google.common.base.Objects; import com.google.common.collect.Lists; - import sonia.scm.util.Util; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; - -import java.util.List; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; +import java.util.List; + +//~--- JDK imports ------------------------------------------------------------ /** * diff --git a/scm-core/src/main/java/sonia/scm/repository/PathNotFoundException.java b/scm-core/src/main/java/sonia/scm/repository/PathNotFoundException.java index 7048dc2cf7..ed62a5967c 100644 --- a/scm-core/src/main/java/sonia/scm/repository/PathNotFoundException.java +++ b/scm-core/src/main/java/sonia/scm/repository/PathNotFoundException.java @@ -35,6 +35,7 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import sonia.scm.NotFoundException; import sonia.scm.util.Util; /** @@ -42,7 +43,7 @@ import sonia.scm.util.Util; * * @author Sebastian Sdorra */ -public class PathNotFoundException extends RepositoryException +public class PathNotFoundException extends NotFoundException { /** Field description */ @@ -59,7 +60,7 @@ public class PathNotFoundException extends RepositoryException */ public PathNotFoundException(String path) { - super("path \"".concat(Util.nonNull(path)).concat("\" not found")); + super("path", Util.nonNull(path)); this.path = Util.nonNull(path); } diff --git a/scm-core/src/main/java/sonia/scm/repository/Permission.java b/scm-core/src/main/java/sonia/scm/repository/Permission.java index 0632795648..20cdc83cef 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Permission.java +++ b/scm-core/src/main/java/sonia/scm/repository/Permission.java @@ -35,6 +35,7 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import sonia.scm.security.PermissionObject; @@ -135,7 +136,7 @@ public class Permission implements PermissionObject, Serializable final Permission other = (Permission) obj; - return Objects.equal(name, other.name) + return Objects.equal(name, other.name) && Objects.equal(type, other.type) && Objects.equal(groupPermission, other.groupPermission); } @@ -157,7 +158,7 @@ public class Permission implements PermissionObject, Serializable public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("name", name) .add("type", type) .add("groupPermission", groupPermission) diff --git a/scm-core/src/main/java/sonia/scm/repository/PermissionAlreadyExistsException.java b/scm-core/src/main/java/sonia/scm/repository/PermissionAlreadyExistsException.java deleted file mode 100644 index 43ad0a5e1d..0000000000 --- a/scm-core/src/main/java/sonia/scm/repository/PermissionAlreadyExistsException.java +++ /dev/null @@ -1,11 +0,0 @@ -package sonia.scm.repository; - -import java.text.MessageFormat; - -public class PermissionAlreadyExistsException extends RepositoryException { - - public PermissionAlreadyExistsException(Repository repository, String permissionName) { - super(MessageFormat.format("the permission {0} of the repository {1}/{2} already exists", permissionName, repository.getNamespace(), repository.getName())); - } - -} diff --git a/scm-core/src/main/java/sonia/scm/repository/PermissionNotFoundException.java b/scm-core/src/main/java/sonia/scm/repository/PermissionNotFoundException.java deleted file mode 100644 index 9e1b644faa..0000000000 --- a/scm-core/src/main/java/sonia/scm/repository/PermissionNotFoundException.java +++ /dev/null @@ -1,12 +0,0 @@ -package sonia.scm.repository; - -import java.text.MessageFormat; - -public class PermissionNotFoundException extends RepositoryException{ - - - public PermissionNotFoundException(Repository repository, String permissionName) { - super(MessageFormat.format("the permission {0} of the repository {1}/{2} does not exists", permissionName,repository.getNamespace(), repository.getName() )); - } - -} diff --git a/scm-core/src/main/java/sonia/scm/repository/Person.java b/scm-core/src/main/java/sonia/scm/repository/Person.java index b3bf15c49a..d5674e7ad0 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Person.java +++ b/scm-core/src/main/java/sonia/scm/repository/Person.java @@ -36,18 +36,16 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.base.Objects; - import sonia.scm.Validateable; import sonia.scm.util.Util; import sonia.scm.util.ValidationUtil; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; + +//~--- JDK imports ------------------------------------------------------------ /** * The {@link Person} (author) of a changeset. diff --git a/scm-core/src/main/java/sonia/scm/repository/Repository.java b/scm-core/src/main/java/sonia/scm/repository/Repository.java index 190f252a9f..0d8c6a6af8 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Repository.java +++ b/scm-core/src/main/java/sonia/scm/repository/Repository.java @@ -35,6 +35,7 @@ package sonia.scm.repository; import com.github.sdorra.ssp.PermissionObject; import com.github.sdorra.ssp.StaticPermissions; +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.collect.Lists; import sonia.scm.BasicPropertiesAware; @@ -401,7 +402,7 @@ public class Repository extends BasicPropertiesAware implements ModelObject, Per @Override public String toString() { - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("id", id) .add("namespace", namespace) .add("name", name) diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryAlreadyExistsException.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryAlreadyExistsException.java deleted file mode 100644 index c439b2d0f4..0000000000 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryAlreadyExistsException.java +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright (c) 2010, Sebastian Sdorra - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of SCM-Manager; nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * http://bitbucket.org/sdorra/scm-manager - * - */ - - - -package sonia.scm.repository; - -/** - * This {@link Exception} is thrown when trying to create a repository with - * the same name and type already exists. - * - * @author Sebastian Sdorra - */ -public class RepositoryAlreadyExistsException extends RepositoryException -{ - private static final long serialVersionUID = -774929917214137675L; - - /** - * Creates a new instance. - * - * @param message exception message - */ - public RepositoryAlreadyExistsException(String message) { - super(message); - } - - /** - * Creates a new {@link RepositoryAlreadyExistsException} with an appropriate message. - * - * @param repository repository that already exists - * - * @return new exception with appropriate message - */ - public static RepositoryAlreadyExistsException create(Repository repository){ - StringBuilder buffer = new StringBuilder("repository with name "); - buffer.append(repository.getName()).append(" of type "); - buffer.append(repository.getType()).append("already exists"); - return new RepositoryAlreadyExistsException(buffer.toString()); - } -} diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryException.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryException.java deleted file mode 100644 index 63538d08e3..0000000000 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryException.java +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Copyright (c) 2010, Sebastian Sdorra - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of SCM-Manager; nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * http://bitbucket.org/sdorra/scm-manager - * - */ - - - -package sonia.scm.repository; - -/** - * Base class for all repository exceptions. - * - * @author Sebastian Sdorra - */ -public class RepositoryException extends Exception -{ - - /** Field description */ - private static final long serialVersionUID = -4939196278070910058L; - - //~--- constructors --------------------------------------------------------- - - /** - * Constructs a new {@link RepositoryException} with null as its - * error detail message. - * - */ - public RepositoryException() - { - super(); - } - - /** - * Constructs a new {@link RepositoryException} with the specified - * detail message. - * - * - * @param message detail message - */ - public RepositoryException(String message) - { - super(message); - } - - /** - * Constructs a new {@link RepositoryException} with the specified - * detail message and cause. - * - * - * @param cause the cause for the exception - */ - public RepositoryException(Throwable cause) - { - super(cause); - } - - /** - * Constructs a new {@link RepositoryException} with the specified - * detail message and cause. - * - * - * @param message detail message - * @param cause the cause for the exception - */ - public RepositoryException(String message, Throwable cause) - { - super(message, cause); - } -} diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryHandler.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryHandler.java index 739d0d0177..445fc22ab8 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryHandler.java +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryHandler.java @@ -47,7 +47,7 @@ import sonia.scm.plugin.ExtensionPoint; */ @ExtensionPoint public interface RepositoryHandler - extends Handler + extends Handler { /** diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryHandlerNotFoundException.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryHandlerNotFoundException.java deleted file mode 100644 index 4583902ef8..0000000000 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryHandlerNotFoundException.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Copyright (c) 2010, Sebastian Sdorra - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of SCM-Manager; nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * http://bitbucket.org/sdorra/scm-manager - * - */ - - - -package sonia.scm.repository; - -/** - * - * @author Sebastian Sdorra - */ -public class RepositoryHandlerNotFoundException extends RepositoryException -{ - - /** Field description */ - private static final long serialVersionUID = 5270463060802850944L; - - //~--- constructors --------------------------------------------------------- - - /** - * Constructs ... - * - */ - public RepositoryHandlerNotFoundException() {} - - /** - * Constructs ... - * - * - * @param message - */ - public RepositoryHandlerNotFoundException(String message) - { - super(message); - } -} diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryIsNotArchivedException.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryIsNotArchivedException.java index 3742512622..a427050633 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryIsNotArchivedException.java +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryIsNotArchivedException.java @@ -38,7 +38,7 @@ package sonia.scm.repository; * * @since 1.14 */ -public class RepositoryIsNotArchivedException extends RepositoryException { +public class RepositoryIsNotArchivedException extends RuntimeException { private static final long serialVersionUID = 7728748133123987511L; diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryManager.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryManager.java index 4fc9db5c32..2c4d958d8d 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryManager.java +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryManager.java @@ -35,6 +35,7 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import sonia.scm.AlreadyExistsException; import sonia.scm.TypeManager; import javax.servlet.http.HttpServletRequest; @@ -52,7 +53,7 @@ import java.util.Collection; * @apiviz.uses sonia.scm.repository.RepositoryHandler */ public interface RepositoryManager - extends TypeManager + extends TypeManager { /** @@ -72,10 +73,8 @@ public interface RepositoryManager * @param repository {@link Repository} to import * * @throws IOException - * @throws RepositoryException */ - public void importRepository(Repository repository) - throws IOException, RepositoryException; + public void importRepository(Repository repository) throws IOException, AlreadyExistsException; //~--- get methods ---------------------------------------------------------- diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryManagerDecorator.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryManagerDecorator.java index b504359bc0..aa4117af34 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryManagerDecorator.java +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryManagerDecorator.java @@ -35,6 +35,7 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import sonia.scm.AlreadyExistsException; import sonia.scm.ManagerDecorator; import sonia.scm.Type; @@ -51,7 +52,7 @@ import java.util.Collection; * @since 1.23 */ public class RepositoryManagerDecorator - extends ManagerDecorator + extends ManagerDecorator implements RepositoryManager { @@ -82,9 +83,7 @@ public class RepositoryManagerDecorator * {@inheritDoc} */ @Override - public void importRepository(Repository repository) - throws IOException, RepositoryException - { + public void importRepository(Repository repository) throws IOException, AlreadyExistsException { decorated.importRepository(repository); } diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryNotFoundException.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryNotFoundException.java index 11f1a98bfd..070221117a 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryNotFoundException.java +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryNotFoundException.java @@ -33,13 +33,15 @@ package sonia.scm.repository; +import sonia.scm.NotFoundException; + /** * Signals that the specified {@link Repository} could be found. * * @author Sebastian Sdorra * @since 1.6 */ -public class RepositoryNotFoundException extends RepositoryException +public class RepositoryNotFoundException extends NotFoundException { /** Field description */ @@ -53,10 +55,10 @@ public class RepositoryNotFoundException extends RepositoryException * */ public RepositoryNotFoundException(Repository repository) { - super("repository " + repository.getName() + "/" + repository.getNamespace() + " does not exist"); + super("repository", repository.getName() + "/" + repository.getNamespace()); } public RepositoryNotFoundException(String repositoryId) { - super("repository with id " + repositoryId + " does not exist"); + super("repository", repositoryId); } } diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryRequestListener.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryRequestListener.java index 219aa9cee2..409052fe19 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryRequestListener.java +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryRequestListener.java @@ -37,12 +37,11 @@ package sonia.scm.repository; import sonia.scm.plugin.ExtensionPoint; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.IOException; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +//~--- JDK imports ------------------------------------------------------------ /** * Listener before a repository request is executed. Repository request are @@ -68,10 +67,6 @@ public interface RepositoryRequestListener * * @return false to abort the request * @throws IOException - * @throws RepositoryException */ - public boolean handleRequest(HttpServletRequest request, - HttpServletResponse response, - Repository repository) - throws IOException, RepositoryException; + boolean handleRequest(HttpServletRequest request, HttpServletResponse response, Repository repository) throws IOException; } diff --git a/scm-core/src/main/java/sonia/scm/repository/RevisionNotFoundException.java b/scm-core/src/main/java/sonia/scm/repository/RevisionNotFoundException.java index a0fbd3f6a4..4185e3223d 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RevisionNotFoundException.java +++ b/scm-core/src/main/java/sonia/scm/repository/RevisionNotFoundException.java @@ -35,6 +35,7 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import sonia.scm.NotFoundException; import sonia.scm.util.Util; /** @@ -42,8 +43,7 @@ import sonia.scm.util.Util; * * @author Sebastian Sdorra */ -public class RevisionNotFoundException extends RepositoryException -{ +public class RevisionNotFoundException extends NotFoundException { /** Field description */ private static final long serialVersionUID = -5594008535358811998L; @@ -59,7 +59,7 @@ public class RevisionNotFoundException extends RepositoryException */ public RevisionNotFoundException(String revision) { - super("revision \"".concat(Util.nonNull(revision)).concat("\" not found")); + super("revision", revision); this.revision = Util.nonNull(revision); } diff --git a/scm-core/src/main/java/sonia/scm/repository/SubRepository.java b/scm-core/src/main/java/sonia/scm/repository/SubRepository.java index 3c8acc4831..55ff0e2269 100644 --- a/scm-core/src/main/java/sonia/scm/repository/SubRepository.java +++ b/scm-core/src/main/java/sonia/scm/repository/SubRepository.java @@ -35,16 +35,16 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; + +//~--- JDK imports ------------------------------------------------------------ /** * @since 1.10 @@ -157,7 +157,7 @@ public class SubRepository implements Serializable public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("repositoryUrl", repositoryUrl) .add("browserUrl", browserUrl) .add("revision", revision) diff --git a/scm-core/src/main/java/sonia/scm/repository/Tag.java b/scm-core/src/main/java/sonia/scm/repository/Tag.java index 4fc246e0c5..ae436c1a7a 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Tag.java +++ b/scm-core/src/main/java/sonia/scm/repository/Tag.java @@ -34,14 +34,15 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; +//~--- JDK imports ------------------------------------------------------------ + /** * Represents a tag in a repository. * @@ -124,7 +125,7 @@ public final class Tag public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("name", name) .add("revision", revision) .toString(); diff --git a/scm-core/src/main/java/sonia/scm/repository/Tags.java b/scm-core/src/main/java/sonia/scm/repository/Tags.java index fd38b421a5..e89ed314ea 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Tags.java +++ b/scm-core/src/main/java/sonia/scm/repository/Tags.java @@ -34,18 +34,18 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.collect.Lists; -//~--- JDK imports ------------------------------------------------------------ - -import java.util.Iterator; -import java.util.List; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import java.util.Iterator; +import java.util.List; + +//~--- JDK imports ------------------------------------------------------------ /** * Represents all tags of a repository. @@ -138,7 +138,7 @@ public final class Tags implements Iterable public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("tags", tags) .toString(); //J+ diff --git a/scm-core/src/main/java/sonia/scm/repository/api/AbstractBundleOrUnbundleCommandResponse.java b/scm-core/src/main/java/sonia/scm/repository/api/AbstractBundleOrUnbundleCommandResponse.java index 36ae6f89ad..d1d7ef5045 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/AbstractBundleOrUnbundleCommandResponse.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/AbstractBundleOrUnbundleCommandResponse.java @@ -33,8 +33,8 @@ package sonia.scm.repository.api; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; - /** * Abstract class for bundle or unbundle command. * @@ -95,7 +95,7 @@ public abstract class AbstractBundleOrUnbundleCommandResponse public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("changesetCount", changesetCount) .toString(); //J+ diff --git a/scm-core/src/main/java/sonia/scm/repository/api/BlameCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/BlameCommandBuilder.java index 203a01b331..5a34345dce 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/BlameCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/BlameCommandBuilder.java @@ -38,25 +38,22 @@ package sonia.scm.repository.api; import com.google.common.base.Objects; import com.google.common.base.Preconditions; import com.google.common.base.Strings; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.cache.Cache; import sonia.scm.cache.CacheManager; import sonia.scm.repository.BlameResult; import sonia.scm.repository.PreProcessorUtil; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryCacheKey; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.spi.BlameCommand; import sonia.scm.repository.spi.BlameCommandRequest; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; import java.io.Serializable; +//~--- JDK imports ------------------------------------------------------------ + /** * Shows changeset information by line for a given file. * Blame is also known as annotate in some SCM systems.
@@ -138,10 +135,9 @@ public final class BlameCommandBuilder * @throws IllegalArgumentException if the path is null or empty * * @throws IOException - * @throws RepositoryException */ public BlameResult getBlameResult(String path) - throws IOException, RepositoryException + throws IOException { Preconditions.checkArgument(!Strings.isNullOrEmpty(path), "path is required"); diff --git a/scm-core/src/main/java/sonia/scm/repository/api/BranchesCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/BranchesCommandBuilder.java index 5a456de936..968f9ba39d 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/BranchesCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/BranchesCommandBuilder.java @@ -40,8 +40,6 @@ import sonia.scm.repository.Branch; import sonia.scm.repository.Branches; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryCacheKey; -import sonia.scm.repository.RepositoryException; -import sonia.scm.repository.spi.BlameCommand; import sonia.scm.repository.spi.BranchesCommand; import java.io.IOException; @@ -80,10 +78,8 @@ public final class BranchesCommandBuilder * only be called from the {@link RepositoryService}. * * @param cacheManager cache manager - * @param blameCommand implementation of the {@link BlameCommand} - * @param branchesCommand + * @param branchesCommand implementation of the {@link BranchesCommand} * @param repository repository to query - * @param preProcessorUtil */ BranchesCommandBuilder(CacheManager cacheManager, BranchesCommand branchesCommand, Repository repository) @@ -102,9 +98,8 @@ public final class BranchesCommandBuilder * @return branches from the repository * * @throws IOException - * @throws RepositoryException */ - public Branches getBranches() throws RepositoryException, IOException + public Branches getBranches() throws IOException { Branches branches; @@ -173,10 +168,9 @@ public final class BranchesCommandBuilder * @return * * @throws IOException - * @throws RepositoryException */ private Branches getBranchesFromCommand() - throws RepositoryException, IOException + throws IOException { return new Branches(branchesCommand.getBranches()); } diff --git a/scm-core/src/main/java/sonia/scm/repository/api/BrowseCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/BrowseCommandBuilder.java index 655b7d4816..eeae45b893 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/BrowseCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/BrowseCommandBuilder.java @@ -36,10 +36,8 @@ package sonia.scm.repository.api; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.base.Objects; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.cache.Cache; import sonia.scm.cache.CacheManager; import sonia.scm.repository.BrowserResult; @@ -48,18 +46,17 @@ import sonia.scm.repository.FileObjectNameComparator; import sonia.scm.repository.PreProcessorUtil; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryCacheKey; -import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.RevisionNotFoundException; import sonia.scm.repository.spi.BrowseCommand; import sonia.scm.repository.spi.BrowseCommandRequest; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; import java.io.Serializable; - import java.util.Collections; import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * BrowseCommandBuilder is able to browse the files of a {@link Repository}. *

@@ -100,7 +97,7 @@ public final class BrowseCommandBuilder * only be called from the {@link RepositoryService}. * * @param cacheManager cache manager - * @param logCommand implementation of the {@link LogCommand} + * @param browseCommand implementation of the {@link BrowseCommand} * @param browseCommand * @param repository repository to query * @param preProcessorUtil @@ -140,11 +137,8 @@ public final class BrowseCommandBuilder * @return files for the given parameters * * @throws IOException - * @throws RepositoryException */ - public BrowserResult getBrowserResult() - throws IOException, RepositoryException - { + public BrowserResult getBrowserResult() throws IOException, RevisionNotFoundException { BrowserResult result = null; if (disableCache) diff --git a/scm-core/src/main/java/sonia/scm/repository/api/BundleCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/BundleCommandBuilder.java index 4a25c0df50..4fed0a7b60 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/BundleCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/BundleCommandBuilder.java @@ -37,23 +37,21 @@ package sonia.scm.repository.api; import com.google.common.io.ByteSink; import com.google.common.io.Files; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.spi.BundleCommand; import sonia.scm.repository.spi.BundleCommandRequest; -import static com.google.common.base.Preconditions.*; - -//~--- JDK imports ------------------------------------------------------------ - import java.io.File; import java.io.IOException; import java.io.OutputStream; +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; + +//~--- JDK imports ------------------------------------------------------------ + /** * The bundle command dumps a repository to a byte source such as a file. The * created bundle can be restored to an empty repository with the @@ -94,11 +92,8 @@ public final class BundleCommandBuilder * @return bundle response * * @throws IOException - * @throws RepositoryException */ - public BundleResponse bundle(File outputFile) - throws IOException, RepositoryException - { + public BundleResponse bundle(File outputFile) throws IOException { checkArgument((outputFile != null) &&!outputFile.exists(), "file is null or exists already"); @@ -120,10 +115,9 @@ public final class BundleCommandBuilder * @return bundle response * * @throws IOException - * @throws RepositoryException */ public BundleResponse bundle(OutputStream outputStream) - throws IOException, RepositoryException + throws IOException { checkNotNull(outputStream, "output stream is required"); @@ -141,10 +135,9 @@ public final class BundleCommandBuilder * @return bundle response * * @throws IOException - * @throws RepositoryException */ public BundleResponse bundle(ByteSink sink) - throws IOException, RepositoryException + throws IOException { checkNotNull(sink, "byte sink is required"); logger.info("bundle {} to byte sink"); diff --git a/scm-core/src/main/java/sonia/scm/repository/api/CatCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/CatCommandBuilder.java index 270b996635..bf896efed8 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/CatCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/CatCommandBuilder.java @@ -37,8 +37,9 @@ import com.google.common.base.Preconditions; import com.google.common.base.Strings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import sonia.scm.repository.PathNotFoundException; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.RevisionNotFoundException; import sonia.scm.repository.spi.CatCommand; import sonia.scm.repository.spi.CatCommandRequest; import sonia.scm.util.IOUtil; @@ -106,7 +107,7 @@ public final class CatCommandBuilder * @param outputStream output stream for the content * @param path file path */ - public void retriveContent(OutputStream outputStream, String path) throws IOException, RepositoryException { + public void retriveContent(OutputStream outputStream, String path) throws IOException, PathNotFoundException, RevisionNotFoundException { getCatResult(outputStream, path); } @@ -115,7 +116,7 @@ public final class CatCommandBuilder * * @param path file path */ - public InputStream getStream(String path) throws IOException, RepositoryException { + public InputStream getStream(String path) throws IOException, PathNotFoundException, RevisionNotFoundException { Preconditions.checkArgument(!Strings.isNullOrEmpty(path), "path is required"); @@ -137,10 +138,8 @@ public final class CatCommandBuilder * @return content of the file * * @throws IOException - * @throws RepositoryException */ - public String getContent(String path) throws IOException, RepositoryException - { + public String getContent(String path) throws IOException, PathNotFoundException, RevisionNotFoundException { String content = null; ByteArrayOutputStream baos = null; @@ -185,11 +184,9 @@ public final class CatCommandBuilder * @param path path of the file * * @throws IOException - * @throws RepositoryException */ private void getCatResult(OutputStream outputStream, String path) - throws IOException, RepositoryException - { + throws IOException, PathNotFoundException, RevisionNotFoundException { Preconditions.checkNotNull(outputStream, "OutputStream is required"); Preconditions.checkArgument(!Strings.isNullOrEmpty(path), "path is required"); diff --git a/scm-core/src/main/java/sonia/scm/repository/api/DiffCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/DiffCommandBuilder.java index e1d7ba5f1a..c0e9e3f622 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/DiffCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/DiffCommandBuilder.java @@ -36,21 +36,19 @@ package sonia.scm.repository.api; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.base.Preconditions; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.RevisionNotFoundException; import sonia.scm.repository.spi.DiffCommand; import sonia.scm.repository.spi.DiffCommandRequest; import sonia.scm.util.IOUtil; -//~--- JDK imports ------------------------------------------------------------ - import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; +//~--- JDK imports ------------------------------------------------------------ + /** * Shows differences between revisions for a specified file or * the entire revision.
@@ -87,9 +85,7 @@ public final class DiffCommandBuilder * Constructs a new {@link DiffCommandBuilder}, this constructor should * only be called from the {@link RepositoryService}. * - * @param implementation of {@link DiffCommand} - * - * @param diffCommand + * @param diffCommand implementation of {@link DiffCommand} */ DiffCommandBuilder(DiffCommand diffCommand) { @@ -107,11 +103,8 @@ public final class DiffCommandBuilder * @return {@code this} * * @throws IOException - * @throws RepositoryException */ - public DiffCommandBuilder retriveContent(OutputStream outputStream) - throws IOException, RepositoryException - { + public DiffCommandBuilder retriveContent(OutputStream outputStream) throws IOException, RevisionNotFoundException { getDiffResult(outputStream); return this; @@ -125,10 +118,8 @@ public final class DiffCommandBuilder * @return content of the difference * * @throws IOException - * @throws RepositoryException */ - public String getContent() throws IOException, RepositoryException - { + public String getContent() throws IOException, RevisionNotFoundException { String content = null; ByteArrayOutputStream baos = null; @@ -205,14 +196,10 @@ public final class DiffCommandBuilder * * * @param outputStream - * @param path * * @throws IOException - * @throws RepositoryException */ - private void getDiffResult(OutputStream outputStream) - throws IOException, RepositoryException - { + private void getDiffResult(OutputStream outputStream) throws IOException, RevisionNotFoundException { Preconditions.checkNotNull(outputStream, "OutputStream is required"); Preconditions.checkArgument(request.isValid(), "path and/or revision is required"); diff --git a/scm-core/src/main/java/sonia/scm/repository/api/IncomingCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/IncomingCommandBuilder.java index 747cb837a0..6c7c620fa4 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/IncomingCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/IncomingCommandBuilder.java @@ -36,22 +36,20 @@ package sonia.scm.repository.api; import org.apache.shiro.SecurityUtils; import org.apache.shiro.subject.Subject; - import sonia.scm.cache.CacheManager; import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.PermissionType; import sonia.scm.repository.PreProcessorUtil; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.spi.IncomingCommand; import sonia.scm.repository.spi.IncomingCommandRequest; import sonia.scm.security.RepositoryPermission; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; +//~--- JDK imports ------------------------------------------------------------ + /** * The incoming command shows new {@link Changeset}s found in a different * repository location. @@ -66,8 +64,6 @@ public final class IncomingCommandBuilder * Constructs a new {@link IncomingCommandBuilder}, this constructor should * only be called from the {@link RepositoryService}. * - * @param cacheManager cache manager - * * @param cacheManger * @param command implementation of the {@link IncomingCommand} * @param repository repository to query @@ -91,11 +87,10 @@ public final class IncomingCommandBuilder * @return incoming changesets * * @throws IOException - * @throws RepositoryException */ public ChangesetPagingResult getIncomingChangesets( Repository remoteRepository) - throws IOException, RepositoryException + throws IOException { Subject subject = SecurityUtils.getSubject(); diff --git a/scm-core/src/main/java/sonia/scm/repository/api/LogCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/LogCommandBuilder.java index de5e2b1b9f..1450cf687a 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/LogCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/LogCommandBuilder.java @@ -37,10 +37,8 @@ package sonia.scm.repository.api; import com.google.common.base.Objects; import com.google.common.collect.ImmutableList; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.cache.Cache; import sonia.scm.cache.CacheManager; import sonia.scm.repository.Changeset; @@ -48,15 +46,15 @@ import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.PreProcessorUtil; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryCacheKey; -import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.RevisionNotFoundException; import sonia.scm.repository.spi.LogCommand; import sonia.scm.repository.spi.LogCommandRequest; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; import java.io.Serializable; +//~--- JDK imports ------------------------------------------------------------ + /** * LogCommandBuilder is able to show the history of a file in a * {@link Repository} or the entire history of a {@link Repository}. @@ -166,11 +164,8 @@ public final class LogCommandBuilder * @return the {@link Changeset} with the given id or null * * @throws IOException - * @throws RepositoryException */ - public Changeset getChangeset(String id) - throws IOException, RepositoryException - { + public Changeset getChangeset(String id) throws IOException, RevisionNotFoundException { Changeset changeset; if (disableCache) @@ -228,11 +223,8 @@ public final class LogCommandBuilder * @return all changesets with the given parameters * * @throws IOException - * @throws RepositoryException */ - public ChangesetPagingResult getChangesets() - throws IOException, RepositoryException - { + public ChangesetPagingResult getChangesets() throws IOException, RevisionNotFoundException { ChangesetPagingResult cpr; if (disableCache) diff --git a/scm-core/src/main/java/sonia/scm/repository/api/OutgoingCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/OutgoingCommandBuilder.java index def8c3ae7f..2753128eac 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/OutgoingCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/OutgoingCommandBuilder.java @@ -30,7 +30,6 @@ */ package sonia.scm.repository.api; -import java.io.IOException; import org.apache.shiro.SecurityUtils; import org.apache.shiro.subject.Subject; import sonia.scm.cache.CacheManager; @@ -38,11 +37,12 @@ import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.PermissionType; import sonia.scm.repository.PreProcessorUtil; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.spi.OutgoingCommand; import sonia.scm.repository.spi.OutgoingCommandRequest; import sonia.scm.security.RepositoryPermission; +import java.io.IOException; + /** * Show changesets not found in a remote repository. * @@ -62,7 +62,7 @@ public final class OutgoingCommandBuilder * @param repository repository to query * @param preProcessorUtil pre processor util */ - OutgoingCommandBuilder(CacheManager cacheManger, OutgoingCommand command, + OutgoingCommandBuilder(CacheManager cacheManager, OutgoingCommand command, Repository repository, PreProcessorUtil preProcessorUtil) { this.command = command; @@ -80,7 +80,7 @@ public final class OutgoingCommandBuilder * @return outgoing changesets */ public ChangesetPagingResult getOutgoingChangesets( - Repository remoteRepository) throws IOException, RepositoryException + Repository remoteRepository) throws IOException { Subject subject = SecurityUtils.getSubject(); diff --git a/scm-core/src/main/java/sonia/scm/repository/api/PullCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/PullCommandBuilder.java index 528c93eef9..a0f5ff4115 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/PullCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/PullCommandBuilder.java @@ -36,22 +36,19 @@ package sonia.scm.repository.api; import org.apache.shiro.SecurityUtils; import org.apache.shiro.subject.Subject; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.repository.PermissionType; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.spi.PullCommand; import sonia.scm.repository.spi.PullCommandRequest; import sonia.scm.security.RepositoryPermission; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; import java.net.URL; +//~--- JDK imports ------------------------------------------------------------ + /** * The pull command pull changes from a other repository. * @@ -93,13 +90,10 @@ public final class PullCommandBuilder * @return informations over the executed pull command * * @throws IOException - * @throws RepositoryException - * + * * @since 1.43 */ - public PullResponse pull(String url) - throws IOException, RepositoryException - { + public PullResponse pull(String url) throws IOException { Subject subject = SecurityUtils.getSubject(); //J- subject.checkPermission( @@ -125,11 +119,8 @@ public final class PullCommandBuilder * @return informations over the executed pull command * * @throws IOException - * @throws RepositoryException */ - public PullResponse pull(Repository remoteRepository) - throws IOException, RepositoryException - { + public PullResponse pull(Repository remoteRepository) throws IOException { Subject subject = SecurityUtils.getSubject(); //J- diff --git a/scm-core/src/main/java/sonia/scm/repository/api/PushCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/PushCommandBuilder.java index fabe938ff7..7b318e49ec 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/PushCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/PushCommandBuilder.java @@ -37,23 +37,19 @@ package sonia.scm.repository.api; import org.apache.shiro.SecurityUtils; import org.apache.shiro.subject.Subject; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.repository.PermissionType; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.spi.PushCommand; import sonia.scm.repository.spi.PushCommandRequest; import sonia.scm.security.RepositoryPermission; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; - import java.net.URL; +//~--- JDK imports ------------------------------------------------------------ + /** * The push command push changes to a other repository. * @@ -91,11 +87,8 @@ public final class PushCommandBuilder * @return informations of the executed push command * * @throws IOException - * @throws RepositoryException */ - public PushResponse push(Repository remoteRepository) - throws IOException, RepositoryException - { + public PushResponse push(Repository remoteRepository) throws IOException { Subject subject = SecurityUtils.getSubject(); //J- @@ -120,12 +113,10 @@ public final class PushCommandBuilder * @return informations of the executed push command * * @throws IOException - * @throws RepositoryException * * @since 1.43 */ - public PushResponse push(String url) throws IOException, RepositoryException - { + public PushResponse push(String url) throws IOException { URL remoteUrl = new URL(url); diff --git a/scm-core/src/main/java/sonia/scm/repository/api/RepositoryServiceFactory.java b/scm-core/src/main/java/sonia/scm/repository/api/RepositoryServiceFactory.java index 2e4ff644f4..627e57a797 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/RepositoryServiceFactory.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/RepositoryServiceFactory.java @@ -167,9 +167,7 @@ public final class RepositoryServiceFactory * @throws ScmSecurityException if current user has not read permissions * for that repository */ - public RepositoryService create(String repositoryId) - throws RepositoryNotFoundException - { + public RepositoryService create(String repositoryId) throws RepositoryNotFoundException { Preconditions.checkArgument(!Strings.isNullOrEmpty(repositoryId), "a non empty repositoryId is required"); @@ -328,7 +326,6 @@ public final class RepositoryServiceFactory /** * Clear caches on repository delete event. * - * @param repository changed repository * @param event repository event */ @Subscribe(referenceType = ReferenceType.STRONG) diff --git a/scm-core/src/main/java/sonia/scm/repository/api/TagsCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/TagsCommandBuilder.java index 65ceef0828..3a6ea16b10 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/TagsCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/TagsCommandBuilder.java @@ -36,25 +36,21 @@ package sonia.scm.repository.api; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.base.Objects; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.cache.Cache; import sonia.scm.cache.CacheManager; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryCacheKey; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.Tag; import sonia.scm.repository.Tags; import sonia.scm.repository.spi.TagsCommand; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; - import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * The tags command list all repository tags.
*
@@ -88,8 +84,7 @@ public final class TagsCommandBuilder * only be called from the {@link RepositoryService}. * * @param cacheManager cache manager - * @param logCommand implementation of the {@link TagsCommand} - * @param command + * @param command implementation of the {@link TagsCommand} * @param repository repository */ TagsCommandBuilder(CacheManager cacheManager, TagsCommand command, @@ -109,10 +104,8 @@ public final class TagsCommandBuilder * @return tags from the repository * * @throws IOException - * @throws RepositoryException */ - public Tags getTags() throws RepositoryException, IOException - { + public Tags getTags() throws IOException { Tags tags; if (disableCache) @@ -183,9 +176,8 @@ public final class TagsCommandBuilder * @return * * @throws IOException - * @throws RepositoryException */ - private Tags getTagsFromCommand() throws RepositoryException, IOException + private Tags getTagsFromCommand() throws IOException { List tagList = command.getTags(); diff --git a/scm-core/src/main/java/sonia/scm/repository/api/UnbundleCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/UnbundleCommandBuilder.java index ff28e5c668..bfb998c6fe 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/UnbundleCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/UnbundleCommandBuilder.java @@ -37,25 +37,22 @@ package sonia.scm.repository.api; import com.google.common.io.ByteSource; import com.google.common.io.Files; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.spi.UnbundleCommand; import sonia.scm.repository.spi.UnbundleCommandRequest; -import static com.google.common.base.Preconditions.*; - -//~--- JDK imports ------------------------------------------------------------ - import java.io.File; import java.io.IOException; import java.io.InputStream; - import java.util.zip.GZIPInputStream; +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; + +//~--- JDK imports ------------------------------------------------------------ + /** * The unbundle command can restore an empty repository from a bundle. The * bundle can be created with the {@link BundleCommandBuilder}. @@ -97,10 +94,9 @@ public final class UnbundleCommandBuilder * @return unbundle response * * @throws IOException - * @throws RepositoryException */ public UnbundleResponse unbundle(File inputFile) - throws IOException, RepositoryException + throws IOException { checkArgument((inputFile != null) && inputFile.exists(), "existing file is required"); @@ -122,10 +118,9 @@ public final class UnbundleCommandBuilder * @return unbundle response * * @throws IOException - * @throws RepositoryException */ public UnbundleResponse unbundle(InputStream inputStream) - throws IOException, RepositoryException + throws IOException { checkNotNull(inputStream, "input stream is required"); logger.info("unbundle archive from stream"); @@ -142,10 +137,9 @@ public final class UnbundleCommandBuilder * @return unbundle response * * @throws IOException - * @throws RepositoryException */ public UnbundleResponse unbundle(ByteSource byteSource) - throws IOException, RepositoryException + throws IOException { checkNotNull(byteSource, "byte source is required"); logger.info("unbundle from byte source"); @@ -186,7 +180,7 @@ public final class UnbundleCommandBuilder { @Override - public InputStream openStream() throws IOException + public InputStream openStream() { return inputStream; } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/BlameCommand.java b/scm-core/src/main/java/sonia/scm/repository/spi/BlameCommand.java index 80c155a534..9953746fd1 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/BlameCommand.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/BlameCommand.java @@ -36,12 +36,11 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import sonia.scm.repository.BlameResult; -import sonia.scm.repository.RepositoryException; - -//~--- JDK imports ------------------------------------------------------------ import java.io.IOException; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -59,8 +58,6 @@ public interface BlameCommand * @return * * @throws IOException - * @throws RepositoryException */ - public BlameResult getBlameResult(BlameCommandRequest request) - throws IOException, RepositoryException; + BlameResult getBlameResult(BlameCommandRequest request) throws IOException; } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/BranchesCommand.java b/scm-core/src/main/java/sonia/scm/repository/spi/BranchesCommand.java index a5659a8ffc..ba512ed4d2 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/BranchesCommand.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/BranchesCommand.java @@ -35,14 +35,12 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import sonia.scm.repository.Branch; -import sonia.scm.repository.RepositoryException; - -//~--- JDK imports ------------------------------------------------------------ import java.io.IOException; - import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -58,7 +56,6 @@ public interface BranchesCommand * @return * * @throws IOException - * @throws RepositoryException */ - public List getBranches() throws RepositoryException, IOException; + List getBranches() throws IOException; } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/BrowseCommand.java b/scm-core/src/main/java/sonia/scm/repository/spi/BrowseCommand.java index 4afc02b125..2c9fff589c 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/BrowseCommand.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/BrowseCommand.java @@ -36,12 +36,12 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import sonia.scm.repository.BrowserResult; -import sonia.scm.repository.RepositoryException; - -//~--- JDK imports ------------------------------------------------------------ +import sonia.scm.repository.RevisionNotFoundException; import java.io.IOException; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -59,8 +59,5 @@ public interface BrowseCommand * @return * * @throws IOException - * @throws RepositoryException */ - public BrowserResult getBrowserResult(BrowseCommandRequest request) - throws IOException, RepositoryException; -} + BrowserResult getBrowserResult(BrowseCommandRequest request) throws IOException, RevisionNotFoundException;} diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/BrowseCommandRequest.java b/scm-core/src/main/java/sonia/scm/repository/spi/BrowseCommandRequest.java index 2f7c007959..39da9a9ace 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/BrowseCommandRequest.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/BrowseCommandRequest.java @@ -35,8 +35,8 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; - /** * * @author Sebastian Sdorra @@ -127,7 +127,7 @@ public final class BrowseCommandRequest extends FileBaseCommandRequest public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("path", getPath()) .add("revision", getRevision()) .add("recursive", recursive) diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/BundleCommand.java b/scm-core/src/main/java/sonia/scm/repository/spi/BundleCommand.java index 8a0f21a714..7b6404c556 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/BundleCommand.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/BundleCommand.java @@ -35,13 +35,12 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.api.BundleResponse; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; +//~--- JDK imports ------------------------------------------------------------ + /** * Service provider implementation for the bundle command. * @@ -60,8 +59,7 @@ public interface BundleCommand * @return bundle response * * @throws IOException - * @throws RepositoryException */ public BundleResponse bundle(BundleCommandRequest request) - throws IOException, RepositoryException; + throws IOException; } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/CatCommand.java b/scm-core/src/main/java/sonia/scm/repository/spi/CatCommand.java index e0e336f2ff..06f242783b 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/CatCommand.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/CatCommand.java @@ -33,7 +33,8 @@ package sonia.scm.repository.spi; -import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.PathNotFoundException; +import sonia.scm.repository.RevisionNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -46,7 +47,7 @@ import java.io.OutputStream; */ public interface CatCommand { - void getCatResult(CatCommandRequest request, OutputStream output) throws IOException, RepositoryException; + void getCatResult(CatCommandRequest request, OutputStream output) throws IOException, RevisionNotFoundException, PathNotFoundException; - InputStream getCatResultStream(CatCommandRequest request) throws IOException, RepositoryException; + InputStream getCatResultStream(CatCommandRequest request) throws IOException, RevisionNotFoundException, PathNotFoundException; } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/DiffCommand.java b/scm-core/src/main/java/sonia/scm/repository/spi/DiffCommand.java index a4d0c24444..105f4e48e1 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/DiffCommand.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/DiffCommand.java @@ -33,11 +33,7 @@ package sonia.scm.repository.spi; -//~--- non-JDK imports -------------------------------------------------------- - -import sonia.scm.repository.RepositoryException; - -//~--- JDK imports ------------------------------------------------------------ +import sonia.scm.repository.RevisionNotFoundException; import java.io.IOException; import java.io.OutputStream; @@ -59,8 +55,6 @@ public interface DiffCommand * * @throws IOException * @throws RuntimeException - * @throws RepositoryException */ - public void getDiffResult(DiffCommandRequest request, OutputStream output) - throws IOException, RepositoryException; + public void getDiffResult(DiffCommandRequest request, OutputStream output) throws IOException, RevisionNotFoundException; } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/FileBaseCommandRequest.java b/scm-core/src/main/java/sonia/scm/repository/spi/FileBaseCommandRequest.java index aec2b7087a..9f563345fd 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/FileBaseCommandRequest.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/FileBaseCommandRequest.java @@ -35,12 +35,13 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - import java.io.Serializable; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -115,7 +116,7 @@ public abstract class FileBaseCommandRequest public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("path", path) .add("revision", revision) .toString(); diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/HookEventFacade.java b/scm-core/src/main/java/sonia/scm/repository/spi/HookEventFacade.java index 93ed5f1111..52ef68f272 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/HookEventFacade.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/HookEventFacade.java @@ -37,7 +37,6 @@ import com.google.inject.Inject; import com.google.inject.Provider; import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RepositoryHookEvent; import sonia.scm.repository.RepositoryHookType; import sonia.scm.repository.RepositoryManager; @@ -72,19 +71,18 @@ public final class HookEventFacade //~--- methods -------------------------------------------------------------- - public HookEventHandler handle(String id) throws RepositoryException { + public HookEventHandler handle(String id) throws RepositoryNotFoundException { return handle(repositoryManagerProvider.get().get(id)); } - public HookEventHandler handle(NamespaceAndName namespaceAndName) throws RepositoryException { + public HookEventHandler handle(NamespaceAndName namespaceAndName) throws RepositoryNotFoundException { return handle(repositoryManagerProvider.get().get(namespaceAndName)); } - public HookEventHandler handle(Repository repository) throws RepositoryException - { + public HookEventHandler handle(Repository repository) throws RepositoryNotFoundException { if (repository == null) { - throw new RepositoryNotFoundException("could not find repository"); + throw new RepositoryNotFoundException(repository); } return new HookEventHandler(repositoryManagerProvider.get(), diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/IncomingCommand.java b/scm-core/src/main/java/sonia/scm/repository/spi/IncomingCommand.java index 8b3341f77b..669f307acd 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/IncomingCommand.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/IncomingCommand.java @@ -35,12 +35,11 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import sonia.scm.repository.ChangesetPagingResult; -import sonia.scm.repository.RepositoryException; - -//~--- JDK imports ------------------------------------------------------------ import java.io.IOException; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -49,18 +48,5 @@ import java.io.IOException; public interface IncomingCommand { - /** - * Method description - * - * - * @param request - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ - public ChangesetPagingResult getIncomingChangesets( - IncomingCommandRequest request) - throws IOException, RepositoryException; + ChangesetPagingResult getIncomingChangesets(IncomingCommandRequest request) throws IOException; } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/LogCommand.java b/scm-core/src/main/java/sonia/scm/repository/spi/LogCommand.java index 168c279c19..e4a7f3437b 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/LogCommand.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/LogCommand.java @@ -37,45 +37,20 @@ package sonia.scm.repository.spi; import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; -import sonia.scm.repository.RepositoryException; - -//~--- JDK imports ------------------------------------------------------------ +import sonia.scm.repository.RevisionNotFoundException; import java.io.IOException; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra * @since 1.17 */ -public interface LogCommand -{ +public interface LogCommand { - /** - * Method description - * - * - * @param id - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ - public Changeset getChangeset(String id) - throws IOException, RepositoryException; + Changeset getChangeset(String id) throws IOException, RevisionNotFoundException; - /** - * Method description - * - * - * @param request - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ - public ChangesetPagingResult getChangesets(LogCommandRequest request) - throws IOException, RepositoryException; + ChangesetPagingResult getChangesets(LogCommandRequest request) throws IOException, RevisionNotFoundException; } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/LogCommandRequest.java b/scm-core/src/main/java/sonia/scm/repository/spi/LogCommandRequest.java index 1637a92c16..9356bb212a 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/LogCommandRequest.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/LogCommandRequest.java @@ -35,12 +35,13 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - import java.io.Serializable; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -125,7 +126,7 @@ public final class LogCommandRequest implements Serializable, Resetable public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("startChangeset", startChangeset) .add("endChangeset", endChangeset) .add("pagingStart", pagingStart) diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/OutgoingCommand.java b/scm-core/src/main/java/sonia/scm/repository/spi/OutgoingCommand.java index 9e5509e945..c37950abe2 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/OutgoingCommand.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/OutgoingCommand.java @@ -35,12 +35,11 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import sonia.scm.repository.ChangesetPagingResult; -import sonia.scm.repository.RepositoryException; - -//~--- JDK imports ------------------------------------------------------------ import java.io.IOException; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -58,9 +57,6 @@ public interface OutgoingCommand * @return * * @throws IOException - * @throws RepositoryException */ - public ChangesetPagingResult getOutgoingChangesets( - OutgoingCommandRequest request) - throws IOException, RepositoryException; + ChangesetPagingResult getOutgoingChangesets(OutgoingCommandRequest request) throws IOException; } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/PagedRemoteCommandRequest.java b/scm-core/src/main/java/sonia/scm/repository/spi/PagedRemoteCommandRequest.java index c07ddb54ef..b6545bdc4d 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/PagedRemoteCommandRequest.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/PagedRemoteCommandRequest.java @@ -34,8 +34,8 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; - /** * * @author Sebastian Sdorra @@ -84,7 +84,7 @@ public abstract class PagedRemoteCommandRequest extends RemoteCommandRequest { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("remoteURL", remoteRepository) .add("pagingStart", pagingStart) .add("pagingLimit", pagingLimit) diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/PullCommand.java b/scm-core/src/main/java/sonia/scm/repository/spi/PullCommand.java index 533f8e1351..e7aa044353 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/PullCommand.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/PullCommand.java @@ -34,13 +34,12 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.api.PullResponse; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -58,8 +57,6 @@ public interface PullCommand * @return * * @throws IOException - * @throws RepositoryException */ - public PullResponse pull(PullCommandRequest request) - throws IOException, RepositoryException; + PullResponse pull(PullCommandRequest request) throws IOException; } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/PushCommand.java b/scm-core/src/main/java/sonia/scm/repository/spi/PushCommand.java index c77947937a..9530add4f8 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/PushCommand.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/PushCommand.java @@ -34,13 +34,12 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.api.PushResponse; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -58,8 +57,6 @@ public interface PushCommand * @return * * @throws IOException - * @throws RepositoryException */ - public PushResponse push(PushCommandRequest request) - throws IOException, RepositoryException; + PushResponse push(PushCommandRequest request) throws IOException; } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/RemoteCommandRequest.java b/scm-core/src/main/java/sonia/scm/repository/spi/RemoteCommandRequest.java index 0f3cd909d9..bbc902cd2a 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/RemoteCommandRequest.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/RemoteCommandRequest.java @@ -35,14 +35,14 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; - import sonia.scm.repository.Repository; -//~--- JDK imports ------------------------------------------------------------ - import java.net.URL; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -101,7 +101,7 @@ public abstract class RemoteCommandRequest implements Resetable public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("remoteRepository", remoteRepository) .add("remoteUrl", remoteUrl) .toString(); diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/TagsCommand.java b/scm-core/src/main/java/sonia/scm/repository/spi/TagsCommand.java index 5de358d94f..c2e6c9092d 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/TagsCommand.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/TagsCommand.java @@ -34,15 +34,13 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.Tag; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; - import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -57,7 +55,6 @@ public interface TagsCommand * @return * * @throws IOException - * @throws RepositoryException */ - public List getTags() throws RepositoryException, IOException; + public List getTags() throws IOException; } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/UnbundleCommand.java b/scm-core/src/main/java/sonia/scm/repository/spi/UnbundleCommand.java index 4777e0c11b..07e35e2715 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/UnbundleCommand.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/UnbundleCommand.java @@ -35,13 +35,12 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.api.UnbundleResponse; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; +//~--- JDK imports ------------------------------------------------------------ + /** * Service provider implementation for the unbundle command. * @@ -60,8 +59,7 @@ public interface UnbundleCommand * @return unbundle response * * @throws IOException - * @throws RepositoryException */ public UnbundleResponse unbundle(UnbundleCommandRequest request) - throws IOException, RepositoryException; + throws IOException; } diff --git a/scm-core/src/main/java/sonia/scm/security/AssignedPermission.java b/scm-core/src/main/java/sonia/scm/security/AssignedPermission.java index fc9083d13a..56b8d04a41 100644 --- a/scm-core/src/main/java/sonia/scm/security/AssignedPermission.java +++ b/scm-core/src/main/java/sonia/scm/security/AssignedPermission.java @@ -34,16 +34,16 @@ package sonia.scm.security; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; + +//~--- JDK imports ------------------------------------------------------------ /** * Permission object which is assigned to a specific user or group. @@ -150,7 +150,7 @@ public class AssignedPermission implements PermissionObject, Serializable public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("name", name) .add("groupPermisison", groupPermission) .add("permission", permission) diff --git a/scm-core/src/main/java/sonia/scm/security/DAORealmHelper.java b/scm-core/src/main/java/sonia/scm/security/DAORealmHelper.java index 87ccfaf4cc..3fcab8762c 100644 --- a/scm-core/src/main/java/sonia/scm/security/DAORealmHelper.java +++ b/scm-core/src/main/java/sonia/scm/security/DAORealmHelper.java @@ -33,11 +33,10 @@ package sonia.scm.security; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.base.Objects; +import com.google.common.base.MoreObjects; import com.google.common.base.Strings; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet.Builder; - import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; @@ -47,10 +46,8 @@ import org.apache.shiro.authc.UnknownAccountException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.authc.credential.CredentialsMatcher; import org.apache.shiro.subject.SimplePrincipalCollection; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.group.Group; import sonia.scm.group.GroupDAO; import sonia.scm.group.GroupNames; @@ -161,7 +158,7 @@ public final class DAORealmHelper collection.add(principal, realm); collection.add(user, realm); collection.add(collectGroups(principal), realm); - collection.add(Objects.firstNonNull(scope, Scope.empty()), realm); + collection.add(MoreObjects.firstNonNull(scope, Scope.empty()), realm); String creds = credentials; diff --git a/scm-core/src/main/java/sonia/scm/security/PermissionDescriptor.java b/scm-core/src/main/java/sonia/scm/security/PermissionDescriptor.java index 5cd5520d61..20d95958a1 100644 --- a/scm-core/src/main/java/sonia/scm/security/PermissionDescriptor.java +++ b/scm-core/src/main/java/sonia/scm/security/PermissionDescriptor.java @@ -34,16 +34,16 @@ package sonia.scm.security; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; + +//~--- JDK imports ------------------------------------------------------------ /** * Descriptor for available permission objects. @@ -125,7 +125,7 @@ public class PermissionDescriptor implements Serializable { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("displayName", displayName) .add("description", description) .add("value", value) diff --git a/scm-core/src/main/java/sonia/scm/security/RepositoryPermission.java b/scm-core/src/main/java/sonia/scm/security/RepositoryPermission.java index f697e82dfd..1b0229d6f5 100644 --- a/scm-core/src/main/java/sonia/scm/security/RepositoryPermission.java +++ b/scm-core/src/main/java/sonia/scm/security/RepositoryPermission.java @@ -35,17 +35,16 @@ package sonia.scm.security; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; - import org.apache.shiro.authz.Permission; - import sonia.scm.repository.PermissionType; import sonia.scm.repository.Repository; -//~--- JDK imports ------------------------------------------------------------ - import java.io.Serializable; +//~--- JDK imports ------------------------------------------------------------ + /** * This class represents the permission to a repository of a user. * @@ -174,7 +173,7 @@ public final class RepositoryPermission public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("repositoryId", repositoryId) .add("permissionType", permissionType) .toString(); diff --git a/scm-core/src/main/java/sonia/scm/security/StoredAssignedPermissionEvent.java b/scm-core/src/main/java/sonia/scm/security/StoredAssignedPermissionEvent.java index acd7d62052..ad93bf25a9 100644 --- a/scm-core/src/main/java/sonia/scm/security/StoredAssignedPermissionEvent.java +++ b/scm-core/src/main/java/sonia/scm/security/StoredAssignedPermissionEvent.java @@ -34,14 +34,14 @@ package sonia.scm.security; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; - import sonia.scm.HandlerEventType; - -//~--- JDK imports ------------------------------------------------------------ +import sonia.scm.event.Event; import java.io.Serializable; -import sonia.scm.event.Event; + +//~--- JDK imports ------------------------------------------------------------ /** * Event which is fired after a {@link StoredAssignedPermission} was added, @@ -114,7 +114,7 @@ public final class StoredAssignedPermissionEvent implements Serializable public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("type", type) .add("permission", permission) .toString(); diff --git a/scm-core/src/main/java/sonia/scm/security/SyncingRealmHelper.java b/scm-core/src/main/java/sonia/scm/security/SyncingRealmHelper.java index 9e0c97f234..0e3c06e32d 100644 --- a/scm-core/src/main/java/sonia/scm/security/SyncingRealmHelper.java +++ b/scm-core/src/main/java/sonia/scm/security/SyncingRealmHelper.java @@ -30,17 +30,18 @@ package sonia.scm.security; import com.google.common.collect.ImmutableList; import com.google.inject.Inject; -import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.SimpleAuthenticationInfo; import org.apache.shiro.subject.SimplePrincipalCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import sonia.scm.AlreadyExistsException; +import sonia.scm.NotFoundException; import sonia.scm.group.Group; -import sonia.scm.group.GroupException; import sonia.scm.group.GroupManager; import sonia.scm.group.GroupNames; import sonia.scm.plugin.Extension; import sonia.scm.user.User; -import sonia.scm.user.UserException; import sonia.scm.user.UserManager; import sonia.scm.web.security.AdministrationContext; @@ -56,6 +57,8 @@ import java.util.Collection; @Extension public final class SyncingRealmHelper { + private static final Logger LOG = LoggerFactory.getLogger(SyncingRealmHelper.class); + private final AdministrationContext ctx; private final GroupManager groupManager; @@ -121,17 +124,19 @@ public final class SyncingRealmHelper { */ public void store(final Group group) { ctx.runAsAdmin(() -> { - try { - if (groupManager.get(group.getId()) != null) { + if (groupManager.get(group.getId()) != null) { + try { groupManager.modify(group); + } catch (NotFoundException e) { + throw new IllegalStateException("got NotFoundException though group " + group.getName() + " could be loaded", e); } - else { + } else { + try { groupManager.create(group); + } catch (AlreadyExistsException e) { + throw new IllegalStateException("got AlreadyExistsException though group " + group.getName() + " could not be loaded", e); } } - catch (GroupException ex) { - throw new AuthenticationException("could not store group", ex); - } }); } @@ -142,17 +147,20 @@ public final class SyncingRealmHelper { */ public void store(final User user) { ctx.runAsAdmin(() -> { - try { - if (userManager.contains(user.getName())) { + if (userManager.contains(user.getName())) { + try { userManager.modify(user); + } catch (NotFoundException e) { + throw new IllegalStateException("got NotFoundException though user " + user.getName() + " could be loaded", e); } - else { + } else { + try { userManager.create(user); + } catch (AlreadyExistsException e) { + throw new IllegalStateException("got AlreadyExistsException though user " + user.getName() + " could not be loaded", e); + } } - catch (UserException ex) { - throw new AuthenticationException("could not store user", ex); - } - }); + }); + } } -} diff --git a/scm-core/src/main/java/sonia/scm/template/Viewable.java b/scm-core/src/main/java/sonia/scm/template/Viewable.java index 8344d2820e..47fd8af57b 100644 --- a/scm-core/src/main/java/sonia/scm/template/Viewable.java +++ b/scm-core/src/main/java/sonia/scm/template/Viewable.java @@ -30,9 +30,9 @@ */ package sonia.scm.template; +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; - /** * A viewable holds the path to a template and the context object which is used to render the template. Viewables can * be used as return type of jax-rs resources. @@ -81,7 +81,7 @@ public final class Viewable { @Override public String toString() { - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("path", path) .add("context", context) .toString(); diff --git a/scm-core/src/main/java/sonia/scm/user/User.java b/scm-core/src/main/java/sonia/scm/user/User.java index 69c5a5732f..778e573c14 100644 --- a/scm-core/src/main/java/sonia/scm/user/User.java +++ b/scm-core/src/main/java/sonia/scm/user/User.java @@ -37,20 +37,19 @@ package sonia.scm.user; import com.github.sdorra.ssp.PermissionObject; import com.github.sdorra.ssp.StaticPermissions; +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; - import sonia.scm.BasicPropertiesAware; import sonia.scm.ModelObject; import sonia.scm.util.Util; import sonia.scm.util.ValidationUtil; -//~--- JDK imports ------------------------------------------------------------ - -import java.security.Principal; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; +import java.security.Principal; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -59,7 +58,8 @@ import javax.xml.bind.annotation.XmlRootElement; @StaticPermissions("user") @XmlRootElement(name = "users") @XmlAccessorType(XmlAccessType.FIELD) -public class User extends BasicPropertiesAware implements Principal, ModelObject, PermissionObject +public class +User extends BasicPropertiesAware implements Principal, ModelObject, PermissionObject { /** Field description */ @@ -259,7 +259,7 @@ public class User extends BasicPropertiesAware implements Principal, ModelObject : "(not set)"; //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("name", name) .add("displayName",displayName) .add("mail", mail) diff --git a/scm-core/src/main/java/sonia/scm/user/UserAlreadyExistsException.java b/scm-core/src/main/java/sonia/scm/user/UserAlreadyExistsException.java deleted file mode 100644 index 1c77cb4f86..0000000000 --- a/scm-core/src/main/java/sonia/scm/user/UserAlreadyExistsException.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (c) 2010, Sebastian Sdorra - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of SCM-Manager; nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * http://bitbucket.org/sdorra/scm-manager - * - */ - - - -package sonia.scm.user; - -/** - * This {@link Exception} is thrown when trying to create a user that already exists. - * - * @author Sebastian Sdorra - */ -public class UserAlreadyExistsException extends UserException -{ - - private static final long serialVersionUID = 9182294539718090814L; - - //~--- constructors --------------------------------------------------------- - - public UserAlreadyExistsException(User user) { - super(user.getName() + " user already exists"); - } -} diff --git a/scm-core/src/main/java/sonia/scm/user/UserException.java b/scm-core/src/main/java/sonia/scm/user/UserException.java deleted file mode 100644 index b8587d5299..0000000000 --- a/scm-core/src/main/java/sonia/scm/user/UserException.java +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Copyright (c) 2010, Sebastian Sdorra - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of SCM-Manager; nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * http://bitbucket.org/sdorra/scm-manager - * - */ - - - -package sonia.scm.user; - -/** - * - * @author Sebastian Sdorra - */ -public class UserException extends Exception -{ - - /** Field description */ - private static final long serialVersionUID = 4147943028529739021L; - - //~--- constructors --------------------------------------------------------- - - /** - * Constructs ... - * - */ - public UserException() {} - - /** - * Constructs ... - * - * - * @param message - */ - public UserException(String message) - { - super(message); - } - - /** - * Constructs ... - * - * - * @param throwable - */ - public UserException(Throwable throwable) - { - super(throwable); - } - - /** - * Constructs ... - * - * - * @param message - * @param throwable - */ - public UserException(String message, Throwable throwable) - { - super(message, throwable); - } -} diff --git a/scm-core/src/main/java/sonia/scm/user/UserManager.java b/scm-core/src/main/java/sonia/scm/user/UserManager.java index e21eb761dc..0a705c8d60 100644 --- a/scm-core/src/main/java/sonia/scm/user/UserManager.java +++ b/scm-core/src/main/java/sonia/scm/user/UserManager.java @@ -45,7 +45,7 @@ import sonia.scm.search.Searchable; * @author Sebastian Sdorra */ public interface UserManager - extends Manager, Searchable + extends Manager, Searchable { /** diff --git a/scm-core/src/main/java/sonia/scm/user/UserManagerDecorator.java b/scm-core/src/main/java/sonia/scm/user/UserManagerDecorator.java index 5ea14ca14e..225681f9e6 100644 --- a/scm-core/src/main/java/sonia/scm/user/UserManagerDecorator.java +++ b/scm-core/src/main/java/sonia/scm/user/UserManagerDecorator.java @@ -38,17 +38,17 @@ package sonia.scm.user; import sonia.scm.ManagerDecorator; import sonia.scm.search.SearchRequest; -//~--- JDK imports ------------------------------------------------------------ - import java.util.Collection; +//~--- JDK imports ------------------------------------------------------------ + /** * Decorator for {@link UserManager}. * * @author Sebastian Sdorra * @since 1.23 */ -public class UserManagerDecorator extends ManagerDecorator +public class UserManagerDecorator extends ManagerDecorator implements UserManager { diff --git a/scm-core/src/main/java/sonia/scm/user/UserNotFoundException.java b/scm-core/src/main/java/sonia/scm/user/UserNotFoundException.java deleted file mode 100644 index 82b1c2abb8..0000000000 --- a/scm-core/src/main/java/sonia/scm/user/UserNotFoundException.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (c) 2010, Sebastian Sdorra - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of SCM-Manager; nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * http://bitbucket.org/sdorra/scm-manager - * - */ - - -package sonia.scm.user; - -/** - * The UserNotFoundException is thrown e.g. from the - * modify method of the {@link UserManager}, if the user does not exists. - * - * @author Sebastian Sdorra - * @since 1.28 - */ -public class UserNotFoundException extends UserException -{ - - /** Field description */ - private static final long serialVersionUID = 2560311805598995047L; - - //~--- constructors --------------------------------------------------------- - - /** - * Constructs a new UserNotFoundException. - * - */ - public UserNotFoundException(User user) { - super("user " + user.getName() + " does not exist"); - } -} diff --git a/scm-core/src/main/java/sonia/scm/util/HttpUtil.java b/scm-core/src/main/java/sonia/scm/util/HttpUtil.java index 30995a0b3c..bc3f4e74cd 100644 --- a/scm-core/src/main/java/sonia/scm/util/HttpUtil.java +++ b/scm-core/src/main/java/sonia/scm/util/HttpUtil.java @@ -37,7 +37,7 @@ package sonia.scm.util; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.CharMatcher; -import com.google.common.base.Objects; +import com.google.common.base.MoreObjects; import com.google.common.base.Strings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -700,7 +700,7 @@ public final class HttpUtil { String value = request.getHeader(header); - return Objects.firstNonNull(value, defaultValue); + return MoreObjects.firstNonNull(value, defaultValue); } /** diff --git a/scm-core/src/main/java/sonia/scm/version/Version.java b/scm-core/src/main/java/sonia/scm/version/Version.java index 96f7a9ff07..cdc1a222c0 100644 --- a/scm-core/src/main/java/sonia/scm/version/Version.java +++ b/scm-core/src/main/java/sonia/scm/version/Version.java @@ -39,10 +39,10 @@ import com.google.common.base.Objects; import com.google.common.base.Preconditions; import com.google.common.collect.ComparisonChain; -//~--- JDK imports ------------------------------------------------------------ - import java.util.Locale; +//~--- JDK imports ------------------------------------------------------------ + /** * Version object for comparing and parsing versions. * diff --git a/scm-core/src/main/java/sonia/scm/web/UserAgent.java b/scm-core/src/main/java/sonia/scm/web/UserAgent.java index 7efd1bd1c2..e501ac8bdf 100644 --- a/scm-core/src/main/java/sonia/scm/web/UserAgent.java +++ b/scm-core/src/main/java/sonia/scm/web/UserAgent.java @@ -36,14 +36,15 @@ package sonia.scm.web; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.base.Charsets; +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -import static com.google.common.base.Preconditions.*; +import java.nio.charset.Charset; + +import static com.google.common.base.Preconditions.checkNotNull; //~--- JDK imports ------------------------------------------------------------ -import java.nio.charset.Charset; - /** * The software agent that is acting on behalf of a user. The user agent * represents a browser or one of the repository client (svn, git or hg). @@ -124,7 +125,7 @@ public final class UserAgent public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("name", name) .add("browser", browser) .add("basicAuthenticationCharset", basicAuthenticationCharset) diff --git a/scm-core/src/main/java/sonia/scm/web/proxy/ProxyConfiguration.java b/scm-core/src/main/java/sonia/scm/web/proxy/ProxyConfiguration.java index 71e39e13dd..bc30142052 100644 --- a/scm-core/src/main/java/sonia/scm/web/proxy/ProxyConfiguration.java +++ b/scm-core/src/main/java/sonia/scm/web/proxy/ProxyConfiguration.java @@ -34,20 +34,19 @@ package sonia.scm.web.proxy; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - -import java.net.URL; - -import java.util.Collections; -import java.util.Set; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; +import java.net.URL; +import java.util.Collections; +import java.util.Set; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -144,7 +143,7 @@ public class ProxyConfiguration public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("url", url) .add("copyRequestHeaders", copyRequestHeaders) .add("requestHeaderExcludes", requestHeaderExcludes) diff --git a/scm-core/src/test/java/sonia/scm/io/DeepCopyTest.java b/scm-core/src/test/java/sonia/scm/io/DeepCopyTest.java index 31a6185182..0f42e87b0c 100644 --- a/scm-core/src/test/java/sonia/scm/io/DeepCopyTest.java +++ b/scm-core/src/test/java/sonia/scm/io/DeepCopyTest.java @@ -34,16 +34,16 @@ package sonia.scm.io; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.base.Objects; - import org.junit.Test; -import static org.junit.Assert.*; - -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; import java.io.Serializable; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotSame; + +//~--- JDK imports ------------------------------------------------------------ + /** * Unit tests for {@link DeepCopy}. * diff --git a/scm-core/src/test/java/sonia/scm/security/SyncingRealmHelperTest.java b/scm-core/src/test/java/sonia/scm/security/SyncingRealmHelperTest.java index 3679a1870b..27ca923902 100644 --- a/scm-core/src/test/java/sonia/scm/security/SyncingRealmHelperTest.java +++ b/scm-core/src/test/java/sonia/scm/security/SyncingRealmHelperTest.java @@ -36,37 +36,35 @@ package sonia.scm.security; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.base.Throwables; - -import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; - import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; - +import sonia.scm.AlreadyExistsException; +import sonia.scm.NotFoundException; import sonia.scm.group.Group; -import sonia.scm.group.GroupException; import sonia.scm.group.GroupManager; import sonia.scm.group.GroupNames; import sonia.scm.user.User; -import sonia.scm.user.UserException; import sonia.scm.user.UserManager; import sonia.scm.web.security.AdministrationContext; import sonia.scm.web.security.PrivilegedAction; -import static org.hamcrest.Matchers.*; +import java.io.IOException; -import static org.junit.Assert.*; - -import static org.mockito.Mockito.*; +import static org.hamcrest.Matchers.hasItem; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; //~--- JDK imports ------------------------------------------------------------ -import java.io.IOException; - /** * Unit tests for {@link SyncingRealmHelper}. * @@ -131,11 +129,10 @@ public class SyncingRealmHelperTest { /** * Tests {@link SyncingRealmHelper#store(Group)}. * - * @throws GroupException * @throws IOException */ @Test - public void testStoreGroupCreate() throws GroupException, IOException { + public void testStoreGroupCreate() throws AlreadyExistsException { Group group = new Group("unit-test", "heartOfGold"); helper.store(group); @@ -143,27 +140,21 @@ public class SyncingRealmHelperTest { } /** - * Tests {@link SyncingRealmHelper#store(Group)} with thrown {@link GroupException}. - * - * @throws GroupException - * @throws IOException + * Tests {@link SyncingRealmHelper#store(Group)}. */ - @Test(expected = AuthenticationException.class) - public void testStoreGroupFailure() throws GroupException, IOException { + @Test(expected = IllegalStateException.class) + public void testStoreGroupFailure() throws AlreadyExistsException { Group group = new Group("unit-test", "heartOfGold"); - doThrow(GroupException.class).when(groupManager).create(group); + doThrow(AlreadyExistsException.class).when(groupManager).create(group); helper.store(group); } /** * Tests {@link SyncingRealmHelper#store(Group)} with an existing group. - * - * @throws GroupException - * @throws IOException */ @Test - public void testStoreGroupModify() throws GroupException, IOException { + public void testStoreGroupModify() throws NotFoundException { Group group = new Group("unit-test", "heartOfGold"); when(groupManager.get("heartOfGold")).thenReturn(group); @@ -175,11 +166,10 @@ public class SyncingRealmHelperTest { /** * Tests {@link SyncingRealmHelper#store(User)}. * - * @throws UserException * @throws IOException */ @Test - public void testStoreUserCreate() throws UserException, IOException { + public void testStoreUserCreate() throws AlreadyExistsException { User user = new User("tricia"); helper.store(user); @@ -187,27 +177,21 @@ public class SyncingRealmHelperTest { } /** - * Tests {@link SyncingRealmHelper#store(User)} with a thrown {@link UserException}. - * - * @throws UserException - * @throws IOException + * Tests {@link SyncingRealmHelper#store(User)} with a thrown {@link AlreadyExistsException}. */ - @Test(expected = AuthenticationException.class) - public void testStoreUserFailure() throws UserException, IOException { + @Test(expected = IllegalStateException.class) + public void testStoreUserFailure() throws AlreadyExistsException { User user = new User("tricia"); - doThrow(UserException.class).when(userManager).create(user); + doThrow(AlreadyExistsException.class).when(userManager).create(user); helper.store(user); } /** * Tests {@link SyncingRealmHelper#store(User)} with an existing user. - * - * @throws UserException - * @throws IOException */ @Test - public void testStoreUserModify() throws UserException, IOException { + public void testStoreUserModify() throws NotFoundException { when(userManager.contains("tricia")).thenReturn(Boolean.TRUE); User user = new User("tricia"); diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryHandler.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryHandler.java index 87f96f850f..c3436c2395 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryHandler.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitRepositoryHandler.java @@ -38,25 +38,21 @@ package sonia.scm.repository; import com.google.common.base.Strings; import com.google.inject.Inject; import com.google.inject.Singleton; - import org.eclipse.jgit.storage.file.FileRepositoryBuilder; - +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import sonia.scm.SCMContextProvider; import sonia.scm.io.FileSystem; import sonia.scm.plugin.Extension; import sonia.scm.repository.spi.GitRepositoryServiceProvider; - -//~--- JDK imports ------------------------------------------------------------ +import sonia.scm.schedule.Scheduler; +import sonia.scm.schedule.Task; +import sonia.scm.store.ConfigurationStoreFactory; import java.io.File; import java.io.IOException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import sonia.scm.SCMContextProvider; -import sonia.scm.schedule.Scheduler; -import sonia.scm.schedule.Task; -import sonia.scm.store.ConfigurationStoreFactory; +//~--- JDK imports ------------------------------------------------------------ /** * @@ -185,20 +181,8 @@ public class GitRepositoryHandler //~--- methods -------------------------------------------------------------- - /** - * Method description - * - * - * @param repository - * @param directory - * - * @throws IOException - * @throws RepositoryException - */ @Override - protected void create(Repository repository, File directory) - throws RepositoryException, IOException - { + protected void create(Repository repository, File directory) throws IOException { try (org.eclipse.jgit.lib.Repository gitRepository = build(directory)) { gitRepository.create(true); } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitUtil.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitUtil.java index 1538269ee1..7e145f2dd9 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitUtil.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitUtil.java @@ -39,7 +39,6 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Strings; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; - import org.eclipse.jgit.api.FetchCommand; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; @@ -54,23 +53,19 @@ import org.eclipse.jgit.transport.FetchResult; import org.eclipse.jgit.transport.RefSpec; import org.eclipse.jgit.treewalk.TreeWalk; import org.eclipse.jgit.util.FS; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.util.HttpUtil; import sonia.scm.util.Util; +import sonia.scm.web.GitUserAgentProvider; -//~--- JDK imports ------------------------------------------------------------ - +import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; - import java.util.Map; import java.util.concurrent.TimeUnit; -import javax.servlet.http.HttpServletRequest; -import sonia.scm.web.GitUserAgentProvider; +//~--- JDK imports ------------------------------------------------------------ /** * @@ -192,22 +187,7 @@ public final class GitUtil return tags; } - /** - * Method description - * - * - * @param git - * @param directory - * @param remoteRepository - * - * @return - * - * @throws RepositoryException - */ - public static FetchResult fetch(Git git, File directory, - Repository remoteRepository) - throws RepositoryException - { + public static FetchResult fetch(Git git, File directory, Repository remoteRepository) { try { FetchCommand fetch = git.fetch(); @@ -220,7 +200,7 @@ public final class GitUtil } catch (GitAPIException ex) { - throw new RepositoryException("could not fetch", ex); + throw new InternalRepositoryException("could not fetch", ex); } } @@ -294,7 +274,7 @@ public final class GitUtil { if (walk != null) { - walk.close();; + walk.close(); } } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitIncomingOutgoingCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitIncomingOutgoingCommand.java index aed1917110..e90a1c11ed 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitIncomingOutgoingCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitIncomingOutgoingCommand.java @@ -36,28 +36,25 @@ package sonia.scm.repository.spi; import com.google.common.collect.Lists; import com.google.common.io.Closeables; - import org.eclipse.jgit.api.Git; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; - import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.GitChangesetConverter; import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.GitUtil; +import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; - -//~--- JDK imports ------------------------------------------------------------ import java.io.IOException; - import java.util.List; import java.util.Map.Entry; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -117,21 +114,7 @@ public abstract class AbstractGitIncomingOutgoingCommand //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @param request - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ - protected ChangesetPagingResult getIncomingOrOutgoingChangesets( - PagedRemoteCommandRequest request) - throws IOException, RepositoryException - { + protected ChangesetPagingResult getIncomingOrOutgoingChangesets(PagedRemoteCommandRequest request) throws IOException { Repository remoteRepository = request.getRemoteRepository(); Git git = Git.wrap(open()); @@ -141,8 +124,7 @@ public abstract class AbstractGitIncomingOutgoingCommand ObjectId localId = getDefaultBranch(git.getRepository()); ObjectId remoteId = null; - Ref remoteBranch = getRemoteBranch(git.getRepository(), localId, - remoteRepository); + Ref remoteBranch = getRemoteBranch(git.getRepository(), localId, remoteRepository); if (remoteBranch != null) { @@ -178,7 +160,7 @@ public abstract class AbstractGitIncomingOutgoingCommand } catch (Exception ex) { - throw new RepositoryException("could not execute incoming command", ex); + throw new InternalRepositoryException("could not execute incoming command", ex); } finally { @@ -191,23 +173,7 @@ public abstract class AbstractGitIncomingOutgoingCommand return new ChangesetPagingResult(changesets.size(), changesets); } - /** - * Method description - * - * - * @param repository - * @param local - * @param remoteRepository - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ - private Ref getRemoteBranch(org.eclipse.jgit.lib.Repository repository, - ObjectId local, Repository remoteRepository) - throws IOException, RepositoryException - { + private Ref getRemoteBranch(org.eclipse.jgit.lib.Repository repository, ObjectId local, Repository remoteRepository) throws IOException { Ref ref = null; if (local != null) @@ -236,7 +202,7 @@ public abstract class AbstractGitIncomingOutgoingCommand { if (ref != null) { - throw new RepositoryException("could not find remote branch"); + throw new InternalRepositoryException("could not find remote branch"); } ref = e.getValue(); diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitPushOrPullCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitPushOrPullCommand.java index 764dde47f3..75050c26ea 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitPushOrPullCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/AbstractGitPushOrPullCommand.java @@ -37,28 +37,23 @@ package sonia.scm.repository.spi; import com.google.common.base.Preconditions; import com.google.common.collect.Iterables; - import org.eclipse.jgit.api.Git; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.transport.PushResult; import org.eclipse.jgit.transport.RemoteRefUpdate; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.GitUtil; -import sonia.scm.repository.RepositoryException; - -//~--- JDK imports ------------------------------------------------------------ +import sonia.scm.repository.InternalRepositoryException; import java.io.File; -import java.io.IOException; - import java.util.Collection; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -94,20 +89,7 @@ public abstract class AbstractGitPushOrPullCommand extends AbstractGitCommand //~--- methods -------------------------------------------------------------- - /** - * Method description - * - * @param source - * @param remoteUrl - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ - protected long push(Repository source, String remoteUrl) - throws IOException, RepositoryException - { + protected long push(Repository source, String remoteUrl) { Git git = Git.wrap(source); org.eclipse.jgit.api.PushCommand push = git.push(); @@ -132,7 +114,7 @@ public abstract class AbstractGitPushOrPullCommand extends AbstractGitCommand } catch (Exception ex) { - throw new RepositoryException("could not execute push/pull command", ex); + throw new InternalRepositoryException("could not execute push/pull command", ex); } return counter; diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBlameCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBlameCommand.java index c797fd70eb..f50f245963 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBlameCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBlameCommand.java @@ -37,30 +37,26 @@ package sonia.scm.repository.spi; import com.google.common.base.Preconditions; import com.google.common.base.Strings; - import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.revwalk.RevCommit; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.repository.BlameLine; import sonia.scm.repository.BlameResult; import sonia.scm.repository.GitUtil; +import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.Person; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; - -//~--- JDK imports ------------------------------------------------------------ import java.io.IOException; - import java.util.ArrayList; import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -76,15 +72,6 @@ public class GitBlameCommand extends AbstractGitCommand implements BlameCommand //~--- constructors --------------------------------------------------------- - /** - * Constructs ... - * - * - * - * @param context - * @param repository - * @param repositoryDirectory - */ public GitBlameCommand(GitContext context, Repository repository) { super(context, repository); @@ -92,20 +79,9 @@ public class GitBlameCommand extends AbstractGitCommand implements BlameCommand //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @param request - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ @Override public BlameResult getBlameResult(BlameCommandRequest request) - throws IOException, RepositoryException + throws IOException { if (logger.isDebugEnabled()) { @@ -132,7 +108,7 @@ public class GitBlameCommand extends AbstractGitCommand implements BlameCommand if (gitBlameResult == null) { - throw new RepositoryException( + throw new InternalRepositoryException( "could not create blame result for path ".concat( request.getPath())); } @@ -174,7 +150,7 @@ public class GitBlameCommand extends AbstractGitCommand implements BlameCommand } catch (GitAPIException ex) { - throw new RepositoryException("could not create blame view", ex); + throw new InternalRepositoryException("could not create blame view", ex); } return result; diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBranchesCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBranchesCommand.java index df32c2b5eb..0cc47100de 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBranchesCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBranchesCommand.java @@ -36,22 +36,19 @@ package sonia.scm.repository.spi; import com.google.common.base.Function; import com.google.common.collect.Lists; - import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.Ref; - import sonia.scm.repository.Branch; import sonia.scm.repository.GitUtil; +import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; - -//~--- JDK imports ------------------------------------------------------------ import java.io.IOException; - import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -74,18 +71,8 @@ public class GitBranchesCommand extends AbstractGitCommand //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ @Override - public List getBranches() throws RepositoryException, IOException - { + public List getBranches() throws IOException { List branches = null; Git git = new Git(open()); @@ -115,7 +102,7 @@ public class GitBranchesCommand extends AbstractGitCommand } catch (GitAPIException ex) { - throw new RepositoryException("could not read branches", ex); + throw new InternalRepositoryException("could not read branches", ex); } return branches; diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java index 72ec3f73e7..f194796bdc 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java @@ -37,7 +37,6 @@ package sonia.scm.repository.spi; import com.google.common.collect.Lists; import com.google.common.collect.Maps; - import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; @@ -49,29 +48,25 @@ import org.eclipse.jgit.treewalk.TreeWalk; import org.eclipse.jgit.treewalk.filter.AndTreeFilter; import org.eclipse.jgit.treewalk.filter.PathFilter; import org.eclipse.jgit.treewalk.filter.TreeFilter; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.repository.BrowserResult; import sonia.scm.repository.FileObject; import sonia.scm.repository.GitSubModuleParser; import sonia.scm.repository.GitUtil; import sonia.scm.repository.PathNotFoundException; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.RevisionNotFoundException; import sonia.scm.repository.SubRepository; import sonia.scm.util.Util; -//~--- JDK imports ------------------------------------------------------------ - import java.io.ByteArrayOutputStream; import java.io.IOException; - import java.util.Collections; import java.util.List; import java.util.Map; -import sonia.scm.util.IOUtil; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -105,22 +100,10 @@ public class GitBrowseCommand extends AbstractGitCommand //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @param request - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ @Override @SuppressWarnings("unchecked") public BrowserResult getBrowserResult(BrowseCommandRequest request) - throws IOException, RepositoryException - { + throws IOException, RevisionNotFoundException { logger.debug("try to create browse result for {}", request); BrowserResult result; @@ -174,8 +157,7 @@ public class GitBrowseCommand extends AbstractGitCommand */ private FileObject createFileObject(org.eclipse.jgit.lib.Repository repo, BrowseCommandRequest request, ObjectId revId, TreeWalk treeWalk) - throws IOException, RepositoryException - { + throws IOException, RevisionNotFoundException { FileObject file; try @@ -283,24 +265,9 @@ public class GitBrowseCommand extends AbstractGitCommand return result; } - /** - * Method description - * - * - * @param repo - * @param request - * @param revId - * @param path - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ private BrowserResult getResult(org.eclipse.jgit.lib.Repository repo, BrowseCommandRequest request, ObjectId revId) - throws IOException, RepositoryException - { + throws IOException, RevisionNotFoundException { BrowserResult result = null; RevWalk revWalk = null; TreeWalk treeWalk = null; @@ -393,24 +360,11 @@ public class GitBrowseCommand extends AbstractGitCommand return result; } - /** - * Method description - * - * - * @param repo - * @param revision - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ @SuppressWarnings("unchecked") private Map getSubRepositories(org.eclipse.jgit.lib.Repository repo, ObjectId revision) - throws IOException, RepositoryException - { + throws IOException, RevisionNotFoundException { if (logger.isDebugEnabled()) { logger.debug("read submodules of {} at {}", repository.getName(), @@ -435,8 +389,7 @@ public class GitBrowseCommand extends AbstractGitCommand private SubRepository getSubRepository(org.eclipse.jgit.lib.Repository repo, ObjectId revId, String path) - throws IOException, RepositoryException - { + throws IOException, RevisionNotFoundException { Map subRepositories = subrepositoryCache.get(revId); if (subRepositories == null) diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitCatCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitCatCommand.java index c451dd8614..4b05098d03 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitCatCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitCatCommand.java @@ -46,7 +46,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.repository.GitUtil; import sonia.scm.repository.PathNotFoundException; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RevisionNotFoundException; import sonia.scm.util.Util; @@ -66,7 +65,7 @@ public class GitCatCommand extends AbstractGitCommand implements CatCommand { } @Override - public void getCatResult(CatCommandRequest request, OutputStream output) throws IOException, RepositoryException { + public void getCatResult(CatCommandRequest request, OutputStream output) throws IOException, PathNotFoundException, RevisionNotFoundException { logger.debug("try to read content for {}", request); try (ClosableObjectLoaderContainer closableObjectLoaderContainer = getLoader(request)) { closableObjectLoaderContainer.objectLoader.copyTo(output); @@ -74,24 +73,24 @@ public class GitCatCommand extends AbstractGitCommand implements CatCommand { } @Override - public InputStream getCatResultStream(CatCommandRequest request) throws IOException, RepositoryException { + public InputStream getCatResultStream(CatCommandRequest request) throws IOException, PathNotFoundException, RevisionNotFoundException { logger.debug("try to read content for {}", request); return new InputStreamWrapper(getLoader(request)); } - void getContent(org.eclipse.jgit.lib.Repository repo, ObjectId revId, String path, OutputStream output) throws IOException, RepositoryException { + void getContent(org.eclipse.jgit.lib.Repository repo, ObjectId revId, String path, OutputStream output) throws IOException, PathNotFoundException, RevisionNotFoundException { try (ClosableObjectLoaderContainer closableObjectLoaderContainer = getLoader(repo, revId, path)) { closableObjectLoaderContainer.objectLoader.copyTo(output); } } - private ClosableObjectLoaderContainer getLoader(CatCommandRequest request) throws IOException, RepositoryException { + private ClosableObjectLoaderContainer getLoader(CatCommandRequest request) throws IOException, PathNotFoundException, RevisionNotFoundException { org.eclipse.jgit.lib.Repository repo = open(); ObjectId revId = getCommitOrDefault(repo, request.getRevision()); return getLoader(repo, revId, request.getPath()); } - private ClosableObjectLoaderContainer getLoader(Repository repo, ObjectId revId, String path) throws IOException, RepositoryException { + private ClosableObjectLoaderContainer getLoader(Repository repo, ObjectId revId, String path) throws IOException, PathNotFoundException, RevisionNotFoundException { TreeWalk treeWalk = new TreeWalk(repo); treeWalk.setRecursive(Util.nonNull(path).contains("/")); diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitIncomingCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitIncomingCommand.java index 9bd982a909..a1c1a7e652 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitIncomingCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitIncomingCommand.java @@ -36,16 +36,14 @@ package sonia.scm.repository.spi; import org.eclipse.jgit.api.LogCommand; import org.eclipse.jgit.lib.ObjectId; - import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; - -//~--- JDK imports ------------------------------------------------------------ import java.io.IOException; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -70,22 +68,8 @@ public class GitIncomingCommand extends AbstractGitIncomingOutgoingCommand //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @param request - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ @Override - public ChangesetPagingResult getIncomingChangesets( - IncomingCommandRequest request) - throws IOException, RepositoryException - { + public ChangesetPagingResult getIncomingChangesets(IncomingCommandRequest request) throws IOException { return getIncomingOrOutgoingChangesets(request); } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java index 0643035e7a..52625ff6c4 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java @@ -37,7 +37,6 @@ package sonia.scm.repository.spi; import com.google.common.base.Strings; import com.google.common.collect.Lists; - import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; @@ -45,25 +44,22 @@ import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.treewalk.filter.AndTreeFilter; import org.eclipse.jgit.treewalk.filter.PathFilter; import org.eclipse.jgit.treewalk.filter.TreeFilter; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.GitChangesetConverter; import sonia.scm.repository.GitUtil; -import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.InternalRepositoryException; import sonia.scm.util.IOUtil; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; - import java.util.Collections; import java.util.Iterator; import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -165,7 +161,7 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand @Override @SuppressWarnings("unchecked") public ChangesetPagingResult getChangesets(LogCommandRequest request) - throws IOException, RepositoryException + throws IOException { if (logger.isDebugEnabled()) { @@ -268,7 +264,7 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand } catch (Exception ex) { - throw new RepositoryException("could not create change log", ex); + throw new InternalRepositoryException("could not create change log", ex); } finally { diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitOutgoingCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitOutgoingCommand.java index 7b40a60a08..2a1f805cf6 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitOutgoingCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitOutgoingCommand.java @@ -36,16 +36,14 @@ package sonia.scm.repository.spi; import org.eclipse.jgit.api.LogCommand; import org.eclipse.jgit.lib.ObjectId; - import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; - -//~--- JDK imports ------------------------------------------------------------ import java.io.IOException; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -84,7 +82,7 @@ public class GitOutgoingCommand extends AbstractGitIncomingOutgoingCommand @Override public ChangesetPagingResult getOutgoingChangesets( OutgoingCommandRequest request) - throws IOException, RepositoryException + throws IOException { return getIncomingOrOutgoingChangesets(request); } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitPullCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitPullCommand.java index ec0f468a57..a7b341ff5d 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitPullCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitPullCommand.java @@ -37,7 +37,6 @@ package sonia.scm.repository.spi; import com.google.common.base.Preconditions; import com.google.common.collect.Iterables; - import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.ObjectId; @@ -46,23 +45,20 @@ import org.eclipse.jgit.transport.FetchResult; import org.eclipse.jgit.transport.RefSpec; import org.eclipse.jgit.transport.TagOpt; import org.eclipse.jgit.transport.TrackingRefUpdate; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.GitUtil; +import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.api.PullResponse; -//~--- JDK imports ------------------------------------------------------------ - import java.io.File; import java.io.IOException; - import java.net.URL; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -109,7 +105,7 @@ public class GitPullCommand extends AbstractGitPushOrPullCommand */ @Override public PullResponse pull(PullCommandRequest request) - throws IOException, RepositoryException + throws IOException { PullResponse response; Repository sourceRepository = request.getRemoteRepository(); @@ -130,21 +126,7 @@ public class GitPullCommand extends AbstractGitPushOrPullCommand return response; } - /** - * Method description - * - * - * @param git - * @param result - * @param fetch - * - * @return - * - * @throws RepositoryException - */ - private PullResponse convert(Git git, FetchResult fetch) - throws RepositoryException - { + private PullResponse convert(Git git, FetchResult fetch) { long counter = 0l; for (TrackingRefUpdate tru : fetch.getTrackingRefUpdates()) @@ -212,19 +194,8 @@ public class GitPullCommand extends AbstractGitPushOrPullCommand return counter; } - /** - * Method description - * - * - * @param sourceRepository - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ private PullResponse pullFromScmRepository(Repository sourceRepository) - throws IOException, RepositoryException + throws IOException { File sourceDirectory = handler.getDirectory(sourceRepository); @@ -256,19 +227,8 @@ public class GitPullCommand extends AbstractGitPushOrPullCommand return response; } - /** - * Method description - * - * - * @param url - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ private PullResponse pullFromUrl(URL url) - throws IOException, RepositoryException + throws IOException { logger.debug("pull changes from {} to {}", url, repository.getId()); @@ -289,7 +249,7 @@ public class GitPullCommand extends AbstractGitPushOrPullCommand } catch (GitAPIException ex) { - throw new RepositoryException("error durring pull", ex); + throw new InternalRepositoryException("error durring pull", ex); } return response; diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitPushCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitPushCommand.java index c64465194a..193d68d7a5 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitPushCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitPushCommand.java @@ -37,16 +37,14 @@ package sonia.scm.repository.spi; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.repository.GitRepositoryHandler; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.api.PushResponse; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -91,7 +89,7 @@ public class GitPushCommand extends AbstractGitPushOrPullCommand */ @Override public PushResponse push(PushCommandRequest request) - throws IOException, RepositoryException + throws IOException { String remoteUrl = getRemoteUrl(request); diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitTagsCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitTagsCommand.java index 14583ac7dc..02fee3cef0 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitTagsCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitTagsCommand.java @@ -37,27 +37,23 @@ package sonia.scm.repository.spi; import com.google.common.base.Function; import com.google.common.collect.Lists; - import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.repository.GitUtil; +import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.Tag; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; - import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -79,17 +75,8 @@ public class GitTagsCommand extends AbstractGitCommand implements TagsCommand //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ @Override - public List getTags() throws IOException, RepositoryException + public List getTags() throws IOException { List tags = null; @@ -108,7 +95,7 @@ public class GitTagsCommand extends AbstractGitCommand implements TagsCommand } catch (GitAPIException ex) { - throw new RepositoryException("could not read tags from repository", ex); + throw new InternalRepositoryException("could not read tags from repository", ex); } finally { diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryViewer.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryViewer.java index f8fa5c8200..162e3db489 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryViewer.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryViewer.java @@ -40,17 +40,14 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.common.io.Closeables; import com.google.inject.Inject; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.repository.Branch; import sonia.scm.repository.Branches; import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.Person; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.api.RepositoryService; import sonia.scm.repository.api.RepositoryServiceFactory; import sonia.scm.template.Template; @@ -60,16 +57,14 @@ import sonia.scm.util.HttpUtil; import sonia.scm.util.IOUtil; import sonia.scm.util.Util; -//~--- JDK imports ------------------------------------------------------------ - +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.Writer; - import java.util.Date; import java.util.Iterator; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +//~--- JDK imports ------------------------------------------------------------ /** * @@ -113,21 +108,9 @@ public class GitRepositoryViewer //~--- methods -------------------------------------------------------------- - /** - * Method description - * - * - * - * @param request - * @param response - * @param repository - * - * @throws IOException - * @throws RepositoryException - */ public void handleRequest(HttpServletRequest request, HttpServletResponse response, Repository repository) - throws RepositoryException, IOException + throws IOException { String baseUrl = HttpUtil.getCompleteUrl(request); @@ -171,7 +154,7 @@ public class GitRepositoryViewer * @throws RepositoryException */ private BranchesModel createBranchesModel(Repository repository) - throws RepositoryException, IOException + throws IOException { BranchesModel model = null; RepositoryService service = null; diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/ScmGitServlet.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/ScmGitServlet.java index ebf4173ad5..5612a64652 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/ScmGitServlet.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/ScmGitServlet.java @@ -42,7 +42,6 @@ import org.eclipse.jgit.http.server.GitServlet; import org.eclipse.jgit.lfs.lib.Constants; import org.slf4j.Logger; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RepositoryProvider; import sonia.scm.repository.RepositoryRequestListenerUtil; import sonia.scm.util.HttpUtil; @@ -214,7 +213,7 @@ public class ScmGitServlet extends GitServlet private void handleBrowserRequest(HttpServletRequest request, HttpServletResponse response, Repository repository) throws ServletException, IOException { try { repositoryViewer.handleRequest(request, response, repository); - } catch (RepositoryException | IOException ex) { + } catch (IOException ex) { throw new ServletException("could not create repository view", ex); } } diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBlameCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBlameCommandTest.java index d049447d7f..d0fd627046 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBlameCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBlameCommandTest.java @@ -35,17 +35,16 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import org.junit.Test; - import sonia.scm.repository.BlameLine; import sonia.scm.repository.BlameResult; -import sonia.scm.repository.RepositoryException; - -import static org.junit.Assert.*; - -//~--- JDK imports ------------------------------------------------------------ +import sonia.scm.repository.GitConstants; import java.io.IOException; -import sonia.scm.repository.GitConstants; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +//~--- JDK imports ------------------------------------------------------------ /** * Unit tests for {@link GitBlameCommand}. @@ -59,10 +58,10 @@ public class GitBlameCommandTest extends AbstractGitCommandTestBase * Tests blame command with default branch. * * @throws IOException - * @throws RepositoryException + * @ */ @Test - public void testDefaultBranch() throws IOException, RepositoryException { + public void testDefaultBranch() throws IOException { // without default branch, the repository head should be used BlameCommandRequest request = new BlameCommandRequest(); request.setPath("a.txt"); @@ -89,7 +88,7 @@ public class GitBlameCommandTest extends AbstractGitCommandTestBase * @throws RepositoryException */ @Test - public void testGetBlameResult() throws IOException, RepositoryException + public void testGetBlameResult() throws IOException { BlameCommandRequest request = new BlameCommandRequest(); @@ -124,7 +123,7 @@ public class GitBlameCommandTest extends AbstractGitCommandTestBase */ @Test public void testGetBlameResultWithRevision() - throws IOException, RepositoryException + throws IOException { BlameCommandRequest request = new BlameCommandRequest(); diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBrowseCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBrowseCommandTest.java index 727034b9ca..d71c85a152 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBrowseCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBrowseCommandTest.java @@ -36,19 +36,20 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import org.junit.Test; - import sonia.scm.repository.BrowserResult; import sonia.scm.repository.FileObject; -import sonia.scm.repository.RepositoryException; - -import static org.junit.Assert.*; - -//~--- JDK imports ------------------------------------------------------------ +import sonia.scm.repository.GitConstants; +import sonia.scm.repository.RevisionNotFoundException; import java.io.IOException; - import java.util.List; -import sonia.scm.repository.GitConstants; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +//~--- JDK imports ------------------------------------------------------------ /** * Unit tests for {@link GitBrowseCommand}. @@ -60,12 +61,9 @@ public class GitBrowseCommandTest extends AbstractGitCommandTestBase /** * Test browse command with default branch. - * - * @throws IOException - * @throws RepositoryException */ @Test - public void testDefaultBranch() throws IOException, RepositoryException { + public void testDefaultBranch() throws IOException, RevisionNotFoundException { // without default branch, the repository head should be used BrowserResult result = createCommand().getBrowserResult(new BrowseCommandRequest()); assertNotNull(result); @@ -94,16 +92,8 @@ public class GitBrowseCommandTest extends AbstractGitCommandTestBase assertEquals("c", foList.get(1).getName()); } - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testBrowse() throws IOException, RepositoryException - { + public void testBrowse() throws IOException, RevisionNotFoundException { BrowserResult result = createCommand().getBrowserResult(new BrowseCommandRequest()); @@ -143,16 +133,8 @@ public class GitBrowseCommandTest extends AbstractGitCommandTestBase assertEquals("c", c.getPath()); } - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testBrowseSubDirectory() throws IOException, RepositoryException - { + public void testBrowseSubDirectory() throws IOException, RevisionNotFoundException { BrowseCommandRequest request = new BrowseCommandRequest(); request.setPath("c"); @@ -198,16 +180,8 @@ public class GitBrowseCommandTest extends AbstractGitCommandTestBase checkDate(e.getLastModified()); } - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testRecusive() throws IOException, RepositoryException - { + public void testRecusive() throws IOException, RevisionNotFoundException { BrowseCommandRequest request = new BrowseCommandRequest(); request.setRecursive(true); diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitCatCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitCatCommandTest.java index c23db0873b..3611c9c636 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitCatCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitCatCommandTest.java @@ -35,7 +35,6 @@ package sonia.scm.repository.spi; import org.junit.Test; import sonia.scm.repository.GitConstants; import sonia.scm.repository.PathNotFoundException; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RevisionNotFoundException; import java.io.ByteArrayOutputStream; @@ -54,7 +53,7 @@ import static org.junit.Assert.assertEquals; public class GitCatCommandTest extends AbstractGitCommandTestBase { @Test - public void testDefaultBranch() throws IOException, RepositoryException { + public void testDefaultBranch() throws IOException, PathNotFoundException, RevisionNotFoundException { // without default branch, the repository head should be used CatCommandRequest request = new CatCommandRequest(); request.setPath("a.txt"); @@ -67,7 +66,7 @@ public class GitCatCommandTest extends AbstractGitCommandTestBase { } @Test - public void testCat() throws IOException, RepositoryException { + public void testCat() throws IOException, PathNotFoundException, RevisionNotFoundException { CatCommandRequest request = new CatCommandRequest(); request.setPath("a.txt"); @@ -76,7 +75,7 @@ public class GitCatCommandTest extends AbstractGitCommandTestBase { } @Test - public void testSimpleCat() throws IOException, RepositoryException { + public void testSimpleCat() throws IOException, PathNotFoundException, RevisionNotFoundException { CatCommandRequest request = new CatCommandRequest(); request.setPath("b.txt"); @@ -84,7 +83,7 @@ public class GitCatCommandTest extends AbstractGitCommandTestBase { } @Test(expected = PathNotFoundException.class) - public void testUnknownFile() throws IOException, RepositoryException { + public void testUnknownFile() throws IOException, PathNotFoundException, RevisionNotFoundException { CatCommandRequest request = new CatCommandRequest(); request.setPath("unknown"); @@ -92,7 +91,7 @@ public class GitCatCommandTest extends AbstractGitCommandTestBase { } @Test(expected = RevisionNotFoundException.class) - public void testUnknownRevision() throws IOException, RepositoryException { + public void testUnknownRevision() throws IOException, PathNotFoundException, RevisionNotFoundException { CatCommandRequest request = new CatCommandRequest(); request.setRevision("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); @@ -101,7 +100,7 @@ public class GitCatCommandTest extends AbstractGitCommandTestBase { } @Test - public void testSimpleStream() throws IOException, RepositoryException { + public void testSimpleStream() throws IOException, PathNotFoundException, RevisionNotFoundException { CatCommandRequest request = new CatCommandRequest(); request.setPath("b.txt"); @@ -114,7 +113,7 @@ public class GitCatCommandTest extends AbstractGitCommandTestBase { catResultStream.close(); } - private String execute(CatCommandRequest request) throws IOException, RepositoryException { + private String execute(CatCommandRequest request) throws IOException, PathNotFoundException, RevisionNotFoundException { String content = null; ByteArrayOutputStream baos = new ByteArrayOutputStream(); diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitIncomingCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitIncomingCommandTest.java index 7cfe33f858..6aa852b12c 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitIncomingCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitIncomingCommandTest.java @@ -36,18 +36,16 @@ package sonia.scm.repository.spi; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.revwalk.RevCommit; - +import org.junit.Ignore; import org.junit.Test; - import sonia.scm.repository.ChangesetPagingResult; -import sonia.scm.repository.RepositoryException; - -import static org.junit.Assert.*; - -//~--- JDK imports ------------------------------------------------------------ import java.io.IOException; -import org.junit.Ignore; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -67,7 +65,7 @@ public class GitIncomingCommandTest */ @Test public void testGetIncomingChangesets() - throws IOException, GitAPIException, RepositoryException + throws IOException, GitAPIException { write(outgoing, outgoingDirectory, "a.txt", "content of a.txt"); @@ -101,7 +99,7 @@ public class GitIncomingCommandTest */ @Test public void testGetIncomingChangesetsWithAllreadyPullChangesets() - throws IOException, GitAPIException, RepositoryException + throws IOException, GitAPIException { write(outgoing, outgoingDirectory, "a.txt", "content of a.txt"); @@ -138,7 +136,7 @@ public class GitIncomingCommandTest */ @Test public void testGetIncomingChangesetsWithEmptyRepository() - throws IOException, RepositoryException + throws IOException { GitIncomingCommand cmd = createCommand(); IncomingCommandRequest request = new IncomingCommandRequest(); @@ -163,7 +161,7 @@ public class GitIncomingCommandTest @Test @Ignore public void testGetIncomingChangesetsWithUnrelatedRepository() - throws IOException, RepositoryException, GitAPIException + throws IOException, GitAPIException { write(outgoing, outgoingDirectory, "a.txt", "content of a.txt"); diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandTest.java index c5af70e3a9..1d78485ae3 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandTest.java @@ -35,22 +35,23 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- +import org.eclipse.jgit.api.errors.GitAPIException; import org.junit.Test; - import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; +import sonia.scm.repository.GitConstants; import sonia.scm.repository.Modifications; -import sonia.scm.repository.RepositoryException; - -import static org.hamcrest.Matchers.*; - -import static org.junit.Assert.*; - -//~--- JDK imports ------------------------------------------------------------ import java.io.IOException; -import org.eclipse.jgit.api.errors.GitAPIException; -import sonia.scm.repository.GitConstants; + +import static org.hamcrest.Matchers.contains; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +//~--- JDK imports ------------------------------------------------------------ /** * Unit tests for {@link GitLogCommand}. @@ -65,10 +66,10 @@ public class GitLogCommandTest extends AbstractGitCommandTestBase * * @throws IOException * @throws GitAPIException - * @throws RepositoryException + * @ */ @Test - public void testGetDefaultBranch() throws IOException, GitAPIException, RepositoryException { + public void testGetDefaultBranch() throws IOException, GitAPIException { // without default branch, the repository head should be used ChangesetPagingResult result = createCommand().getChangesets(new LogCommandRequest()); @@ -99,7 +100,7 @@ public class GitLogCommandTest extends AbstractGitCommandTestBase * @throws RepositoryException */ @Test - public void testGetAll() throws IOException, RepositoryException + public void testGetAll() throws IOException { ChangesetPagingResult result = createCommand().getChangesets(new LogCommandRequest()); @@ -117,7 +118,7 @@ public class GitLogCommandTest extends AbstractGitCommandTestBase * @throws RepositoryException */ @Test - public void testGetAllByPath() throws IOException, RepositoryException + public void testGetAllByPath() throws IOException { LogCommandRequest request = new LogCommandRequest(); @@ -140,7 +141,7 @@ public class GitLogCommandTest extends AbstractGitCommandTestBase * @throws RepositoryException */ @Test - public void testGetAllWithLimit() throws IOException, RepositoryException + public void testGetAllWithLimit() throws IOException { LogCommandRequest request = new LogCommandRequest(); @@ -171,7 +172,7 @@ public class GitLogCommandTest extends AbstractGitCommandTestBase * @throws RepositoryException */ @Test - public void testGetAllWithPaging() throws IOException, RepositoryException + public void testGetAllWithPaging() throws IOException { LogCommandRequest request = new LogCommandRequest(); @@ -231,7 +232,7 @@ public class GitLogCommandTest extends AbstractGitCommandTestBase * @throws RepositoryException */ @Test - public void testGetRange() throws IOException, RepositoryException + public void testGetRange() throws IOException { LogCommandRequest request = new LogCommandRequest(); diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitOutgoingCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitOutgoingCommandTest.java index 28be6f7df0..58f70109ef 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitOutgoingCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitOutgoingCommandTest.java @@ -37,19 +37,16 @@ package sonia.scm.repository.spi; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.revwalk.RevCommit; - import org.junit.Test; - import sonia.scm.repository.ChangesetPagingResult; -import sonia.scm.repository.RepositoryException; + +import java.io.IOException; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; //~--- JDK imports ------------------------------------------------------------ -import java.io.IOException; - /** * Unit tests for {@link OutgoingCommand}. * @@ -68,7 +65,7 @@ public class GitOutgoingCommandTest extends AbstractRemoteCommandTestBase */ @Test public void testGetOutgoingChangesets() - throws IOException, GitAPIException, RepositoryException + throws IOException, GitAPIException { write(outgoing, outgoingDirectory, "a.txt", "content of a.txt"); @@ -102,7 +99,7 @@ public class GitOutgoingCommandTest extends AbstractRemoteCommandTestBase */ @Test public void testGetOutgoingChangesetsWithAllreadyPushedChanges() - throws IOException, GitAPIException, RepositoryException + throws IOException, GitAPIException { write(outgoing, outgoingDirectory, "a.txt", "content of a.txt"); @@ -142,7 +139,7 @@ public class GitOutgoingCommandTest extends AbstractRemoteCommandTestBase */ @Test public void testGetOutgoingChangesetsWithEmptyRepository() - throws IOException, RepositoryException + throws IOException { GitOutgoingCommand cmd = createCommand(); OutgoingCommandRequest request = new OutgoingCommandRequest(); diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitPushCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitPushCommandTest.java index bf82193e84..91fad57880 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitPushCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitPushCommandTest.java @@ -37,20 +37,17 @@ package sonia.scm.repository.spi; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.revwalk.RevCommit; - import org.junit.Test; - -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.api.PushResponse; -import static org.junit.Assert.*; +import java.io.IOException; +import java.util.Iterator; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; //~--- JDK imports ------------------------------------------------------------ -import java.io.IOException; - -import java.util.Iterator; - /** * * @author Sebastian Sdorra @@ -68,7 +65,7 @@ public class GitPushCommandTest extends AbstractRemoteCommandTestBase */ @Test public void testPush() - throws IOException, GitAPIException, RepositoryException + throws IOException, GitAPIException { write(outgoing, outgoingDirectory, "a.txt", "content of a.txt"); diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/AbstractHgHandler.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/AbstractHgHandler.java index 22a64fe5b2..19cfd37665 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/AbstractHgHandler.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/AbstractHgHandler.java @@ -37,18 +37,15 @@ package sonia.scm.repository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.SCMContext; import sonia.scm.util.IOUtil; import sonia.scm.util.Util; import sonia.scm.web.HgUtil; -//~--- JDK imports ------------------------------------------------------------ - +import javax.xml.bind.JAXBException; import java.io.File; import java.io.IOException; import java.io.InputStream; - import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -56,7 +53,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import javax.xml.bind.JAXBException; +//~--- JDK imports ------------------------------------------------------------ /** * @@ -257,45 +254,15 @@ public class AbstractHgHandler //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @param resultType - * @param script - * @param - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ - protected T getResultFromScript(Class resultType, - HgPythonScript script) - throws IOException, RepositoryException - { + protected T getResultFromScript(Class resultType, HgPythonScript script) throws IOException { return getResultFromScript(resultType, script, new HashMap()); } - /** - * Method description - * - * - * @param resultType - * @param script - * @param extraEnv - * @param - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ @SuppressWarnings("unchecked") protected T getResultFromScript(Class resultType, HgPythonScript script, Map extraEnv) - throws IOException, RepositoryException + throws IOException { Process p = createScriptProcess(script, extraEnv); @@ -305,7 +272,7 @@ public class AbstractHgHandler } catch (JAXBException ex) { logger.error("could not parse result", ex); - throw new RepositoryException("could not parse result", ex); + throw new InternalRepositoryException("could not parse result", ex); } } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgHookManager.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgHookManager.java index aa0e4156ae..057bd173d9 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgHookManager.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgHookManager.java @@ -36,31 +36,25 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- import com.github.legman.Subscribe; - -import com.google.common.base.Objects; +import com.google.common.base.MoreObjects; import com.google.inject.Inject; import com.google.inject.OutOfScopeException; import com.google.inject.Provider; import com.google.inject.ProvisionException; import com.google.inject.Singleton; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.config.ScmConfiguration; - +import sonia.scm.config.ScmConfigurationChangedEvent; +import sonia.scm.net.ahc.AdvancedHttpClient; import sonia.scm.util.HttpUtil; import sonia.scm.util.Util; -//~--- JDK imports ------------------------------------------------------------ - +import javax.servlet.http.HttpServletRequest; import java.io.IOException; - import java.util.UUID; -import javax.servlet.http.HttpServletRequest; -import sonia.scm.config.ScmConfigurationChangedEvent; -import sonia.scm.net.ahc.AdvancedHttpClient; +//~--- JDK imports ------------------------------------------------------------ /** * @@ -273,7 +267,7 @@ public class HgHookManager { //J- return HttpUtil.getUriWithoutEndSeperator( - Objects.firstNonNull( + MoreObjects.firstNonNull( configuration.getBaseUrl(), "http://localhost:8080/scm" ) diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgImportHandler.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgImportHandler.java index 30b5063c11..ad61926eef 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgImportHandler.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgImportHandler.java @@ -37,18 +37,17 @@ package sonia.scm.repository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.io.INIConfiguration; import sonia.scm.io.INIConfigurationReader; import sonia.scm.io.INIConfigurationWriter; import sonia.scm.io.INISection; import sonia.scm.util.ValidationUtil; -//~--- JDK imports ------------------------------------------------------------ - import java.io.File; import java.io.IOException; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -80,22 +79,10 @@ public class HgImportHandler extends AbstactImportHandler //~--- methods -------------------------------------------------------------- - /** - * Method description - * - * - * @param repositoryDirectory - * @param repositoryName - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ @Override protected Repository createRepository(File repositoryDirectory, String repositoryName) - throws IOException, RepositoryException + throws IOException { Repository repository = super.createRepository(repositoryDirectory, repositoryName); diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java index aad546f651..39100b8cfa 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java @@ -38,10 +38,8 @@ package sonia.scm.repository; 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.ConfigurationException; import sonia.scm.SCMContextProvider; import sonia.scm.installer.HgInstaller; @@ -55,23 +53,21 @@ import sonia.scm.io.INIConfigurationWriter; import sonia.scm.io.INISection; import sonia.scm.plugin.Extension; import sonia.scm.repository.spi.HgRepositoryServiceProvider; +import sonia.scm.store.ConfigurationStoreFactory; import sonia.scm.util.IOUtil; import sonia.scm.util.SystemUtil; import sonia.scm.util.Util; -//~--- JDK imports ------------------------------------------------------------ - +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; - import java.text.MessageFormat; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import sonia.scm.store.ConfigurationStoreFactory; +//~--- JDK imports ------------------------------------------------------------ /** * @@ -430,11 +426,10 @@ public class HgRepositoryHandler * @param directory * * @throws IOException - * @throws RepositoryException */ @Override protected void postCreate(Repository repository, File directory) - throws IOException, RepositoryException + throws IOException { File hgrcFile = new File(directory, PATH_HGRC); INIConfiguration hgrc = new INIConfiguration(); diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgVersion.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgVersion.java index afe6a17ca1..097046e7f7 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgVersion.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgVersion.java @@ -34,14 +34,15 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -100,7 +101,7 @@ public class HgVersion public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("mercurial", mercurial) .add("python", python) .toString(); diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgVersionHandler.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgVersionHandler.java index e52eee2c8a..26c9095ead 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgVersionHandler.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgVersionHandler.java @@ -44,15 +44,6 @@ import java.io.IOException; public class HgVersionHandler extends AbstractHgHandler { - /** - * Constructs ... - * - * - * @param handler - * @param jaxbContext - * @param context - * @param directory - */ public HgVersionHandler(HgRepositoryHandler handler, HgContext context, File directory) { @@ -61,17 +52,7 @@ public class HgVersionHandler extends AbstractHgHandler //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ - public HgVersion getVersion() throws IOException, RepositoryException - { + public HgVersion getVersion() throws IOException { return getResultFromScript(HgVersion.class, HgPythonScript.VERSION); } } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgBlameCommand.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgBlameCommand.java index be5dbeda04..96a57ece65 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgBlameCommand.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgBlameCommand.java @@ -38,26 +38,21 @@ package sonia.scm.repository.spi; import com.aragost.javahg.Changeset; import com.aragost.javahg.commands.AnnotateCommand; import com.aragost.javahg.commands.AnnotateLine; - import com.google.common.base.Strings; import com.google.common.collect.Lists; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.repository.BlameLine; import sonia.scm.repository.BlameResult; import sonia.scm.repository.Person; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.web.HgUtil; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; - import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -87,20 +82,9 @@ public class HgBlameCommand extends AbstractCommand implements BlameCommand //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @param request - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ @Override public BlameResult getBlameResult(BlameCommandRequest request) - throws IOException, RepositoryException + throws IOException { if (logger.isDebugEnabled()) { diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgBranchesCommand.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgBranchesCommand.java index 64d544c5ed..5c38205393 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgBranchesCommand.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgBranchesCommand.java @@ -36,20 +36,15 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import com.aragost.javahg.Changeset; - import com.google.common.base.Function; import com.google.common.collect.Lists; - import sonia.scm.repository.Branch; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; - -//~--- JDK imports ------------------------------------------------------------ - -import java.io.IOException; import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -72,18 +67,8 @@ public class HgBranchesCommand extends AbstractCommand //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ @Override - public List getBranches() throws RepositoryException, IOException - { + public List getBranches() { List hgBranches = com.aragost.javahg.commands.BranchesCommand.on(open()).execute(); diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgBrowseCommand.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgBrowseCommand.java index 0119b6b315..4e4721ba14 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgBrowseCommand.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgBrowseCommand.java @@ -65,16 +65,6 @@ public class HgBrowseCommand extends AbstractCommand implements BrowseCommand //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @param request - * - * @return - * - * @throws IOException - */ @Override public BrowserResult getBrowserResult(BrowseCommandRequest request) throws IOException { HgFileviewCommand cmd = HgFileviewCommand.on(open()); diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgCatCommand.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgCatCommand.java index c0ae0b51b5..554d6aaf05 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgCatCommand.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgCatCommand.java @@ -36,8 +36,8 @@ package sonia.scm.repository.spi; import com.aragost.javahg.commands.ExecutionException; import com.google.common.io.ByteStreams; import com.google.common.io.Closeables; +import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.web.HgUtil; import java.io.IOException; @@ -51,7 +51,7 @@ public class HgCatCommand extends AbstractCommand implements CatCommand { } @Override - public void getCatResult(CatCommandRequest request, OutputStream output) throws IOException, RepositoryException { + public void getCatResult(CatCommandRequest request, OutputStream output) throws IOException { InputStream input = getCatResultStream(request); try { ByteStreams.copy(input, output); @@ -61,7 +61,7 @@ public class HgCatCommand extends AbstractCommand implements CatCommand { } @Override - public InputStream getCatResultStream(CatCommandRequest request) throws IOException, RepositoryException { + public InputStream getCatResultStream(CatCommandRequest request) throws IOException { com.aragost.javahg.commands.CatCommand cmd = com.aragost.javahg.commands.CatCommand.on(open()); @@ -70,7 +70,7 @@ public class HgCatCommand extends AbstractCommand implements CatCommand { try { return cmd.execute(request.getPath()); } catch (ExecutionException e) { - throw new RepositoryException(e); + throw new InternalRepositoryException(e); } } } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgDiffCommand.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgDiffCommand.java index dcdcdeec2f..d705f0ac14 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgDiffCommand.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgDiffCommand.java @@ -38,19 +38,17 @@ package sonia.scm.repository.spi; import com.google.common.base.Strings; import com.google.common.io.ByteStreams; import com.google.common.io.Closeables; - import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.api.DiffFormat; import sonia.scm.repository.spi.javahg.HgDiffInternalCommand; import sonia.scm.web.HgUtil; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -72,19 +70,9 @@ public class HgDiffCommand extends AbstractCommand implements DiffCommand //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @param request - * @param output - * - * @throws IOException - * @throws RepositoryException - */ @Override public void getDiffResult(DiffCommandRequest request, OutputStream output) - throws IOException, RepositoryException + throws IOException { com.aragost.javahg.Repository hgRepo = open(); diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgIncomingCommand.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgIncomingCommand.java index 73284d886a..55cf0fbe01 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgIncomingCommand.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgIncomingCommand.java @@ -35,21 +35,19 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import com.aragost.javahg.commands.ExecutionException; - import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.HgRepositoryHandler; +import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.spi.javahg.HgIncomingChangesetCommand; -//~--- JDK imports ------------------------------------------------------------ - import java.io.File; - import java.util.Collections; import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -80,22 +78,9 @@ public class HgIncomingCommand extends AbstractCommand //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @param request - * - * @return - * - * @throws RepositoryException - */ @Override @SuppressWarnings("unchecked") - public ChangesetPagingResult getIncomingChangesets( - IncomingCommandRequest request) - throws RepositoryException - { + public ChangesetPagingResult getIncomingChangesets(IncomingCommandRequest request) { File remoteRepository = handler.getDirectory(request.getRemoteRepository()); com.aragost.javahg.Repository repository = open(); @@ -118,7 +103,7 @@ public class HgIncomingCommand extends AbstractCommand } else { - throw new RepositoryException("could not execute incoming command", ex); + throw new InternalRepositoryException("could not execute incoming command", ex); } } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgLogCommand.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgLogCommand.java index af485d19df..68d6913962 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgLogCommand.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgLogCommand.java @@ -36,20 +36,16 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.base.Strings; - import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.spi.javahg.HgLogChangesetCommand; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.IOException; - import java.util.ArrayList; import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -71,42 +67,16 @@ public class HgLogCommand extends AbstractCommand implements LogCommand //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @param id - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ @Override - public Changeset getChangeset(String id) - throws IOException, RepositoryException - { + public Changeset getChangeset(String id) { com.aragost.javahg.Repository repository = open(); HgLogChangesetCommand cmd = on(repository); return cmd.rev(id).single(); } - /** - * Method description - * - * - * @param request - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ @Override - public ChangesetPagingResult getChangesets(LogCommandRequest request) - throws IOException, RepositoryException - { + public ChangesetPagingResult getChangesets(LogCommandRequest request) { ChangesetPagingResult result = null; com.aragost.javahg.Repository repository = open(); diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgOutgoingCommand.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgOutgoingCommand.java index 1322424198..b476b6c2ab 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgOutgoingCommand.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgOutgoingCommand.java @@ -35,21 +35,19 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import com.aragost.javahg.commands.ExecutionException; - import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.HgRepositoryHandler; +import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.spi.javahg.HgOutgoingChangesetCommand; -//~--- JDK imports ------------------------------------------------------------ - import java.io.File; - import java.util.Collections; import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -80,21 +78,10 @@ public class HgOutgoingCommand extends AbstractCommand //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @param request - * - * @return - * - * @throws RepositoryException - */ @Override @SuppressWarnings("unchecked") public ChangesetPagingResult getOutgoingChangesets( OutgoingCommandRequest request) - throws RepositoryException { File remoteRepository = handler.getDirectory(request.getRemoteRepository()); @@ -116,7 +103,7 @@ public class HgOutgoingCommand extends AbstractCommand } else { - throw new RepositoryException("could not execute outgoing command", ex); + throw new InternalRepositoryException("could not execute outgoing command", ex); } } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgPullCommand.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgPullCommand.java index 5243cbcc92..0eb23ef4e7 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgPullCommand.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgPullCommand.java @@ -37,22 +37,19 @@ package sonia.scm.repository.spi; import com.aragost.javahg.Changeset; import com.aragost.javahg.commands.ExecutionException; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.repository.HgRepositoryHandler; +import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.api.PullResponse; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; - import java.util.Collections; import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -83,21 +80,10 @@ public class HgPullCommand extends AbstractHgPushOrPullCommand //~--- methods -------------------------------------------------------------- - /** - * Method description - * - * - * @param request - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ @Override @SuppressWarnings("unchecked") public PullResponse pull(PullCommandRequest request) - throws RepositoryException, IOException + throws IOException { String url = getRemoteUrl(request); @@ -111,7 +97,7 @@ public class HgPullCommand extends AbstractHgPushOrPullCommand } catch (ExecutionException ex) { - throw new RepositoryException("could not execute push command", ex); + throw new InternalRepositoryException("could not execute push command", ex); } return new PullResponse(result.size()); diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgPushCommand.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgPushCommand.java index 10b4af002e..fb0a1a1c73 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgPushCommand.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgPushCommand.java @@ -37,22 +37,19 @@ package sonia.scm.repository.spi; import com.aragost.javahg.Changeset; import com.aragost.javahg.commands.ExecutionException; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import sonia.scm.repository.HgRepositoryHandler; +import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.api.PushResponse; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; - import java.util.Collections; import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -83,21 +80,10 @@ public class HgPushCommand extends AbstractHgPushOrPullCommand //~--- methods -------------------------------------------------------------- - /** - * Method description - * - * - * @param request - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ @Override @SuppressWarnings("unchecked") public PushResponse push(PushCommandRequest request) - throws RepositoryException, IOException + throws IOException { String url = getRemoteUrl(request); @@ -111,7 +97,7 @@ public class HgPushCommand extends AbstractHgPushOrPullCommand } catch (ExecutionException ex) { - throw new RepositoryException("could not execute push command", ex); + throw new InternalRepositoryException("could not execute push command", ex); } return new PushResponse(result.size()); diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgBlameCommandTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgBlameCommandTest.java index 0dea409589..8b46c5f290 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgBlameCommandTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgBlameCommandTest.java @@ -36,17 +36,16 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import org.junit.Test; - import sonia.scm.repository.BlameLine; import sonia.scm.repository.BlameResult; -import sonia.scm.repository.RepositoryException; - -import static org.junit.Assert.*; - -//~--- JDK imports ------------------------------------------------------------ import java.io.IOException; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -54,16 +53,8 @@ import java.io.IOException; public class HgBlameCommandTest extends AbstractHgCommandTestBase { - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testGetBlameResult() throws IOException, RepositoryException - { + public void testGetBlameResult() throws IOException { BlameCommandRequest request = new BlameCommandRequest(); request.setPath("a.txt"); @@ -87,17 +78,8 @@ public class HgBlameCommandTest extends AbstractHgCommandTestBase line.getAuthor().getMail()); } - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testGetBlameResultWithRevision() - throws IOException, RepositoryException - { + public void testGetBlameResultWithRevision() throws IOException { BlameCommandRequest request = new BlameCommandRequest(); request.setPath("a.txt"); diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgBrowseCommandTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgBrowseCommandTest.java index 0262dfc36b..c53aa8c607 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgBrowseCommandTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgBrowseCommandTest.java @@ -36,19 +36,20 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import org.junit.Test; - import sonia.scm.repository.BrowserResult; import sonia.scm.repository.FileObject; -import sonia.scm.repository.RepositoryException; - -import static org.junit.Assert.*; - -//~--- JDK imports ------------------------------------------------------------ import java.io.IOException; - import java.util.List; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -56,16 +57,8 @@ import java.util.List; public class HgBrowseCommandTest extends AbstractHgCommandTestBase { - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testBrowse() throws IOException, RepositoryException - { + public void testBrowse() throws IOException { List foList = getRootFromTip(new BrowseCommandRequest()); FileObject a = getFileObject(foList, "a.txt"); FileObject c = getFileObject(foList, "c"); @@ -81,16 +74,8 @@ public class HgBrowseCommandTest extends AbstractHgCommandTestBase assertEquals("c", c.getPath()); } - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testBrowseSubDirectory() throws IOException, RepositoryException - { + public void testBrowseSubDirectory() throws IOException { BrowseCommandRequest request = new BrowseCommandRequest(); request.setPath("c"); @@ -137,16 +122,8 @@ public class HgBrowseCommandTest extends AbstractHgCommandTestBase checkDate(e.getLastModified()); } - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testDisableLastCommit() throws IOException, RepositoryException - { + public void testDisableLastCommit() throws IOException { BrowseCommandRequest request = new BrowseCommandRequest(); request.setDisableLastCommit(true); @@ -159,16 +136,8 @@ public class HgBrowseCommandTest extends AbstractHgCommandTestBase assertNull(a.getLastModified()); } - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testRecursive() throws IOException, RepositoryException - { + public void testRecursive() throws IOException { BrowseCommandRequest request = new BrowseCommandRequest(); request.setRecursive(true); @@ -215,20 +184,7 @@ public class HgBrowseCommandTest extends AbstractHgCommandTestBase return a; } - /** - * Method description - * - * - * @param request - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ - private List getRootFromTip(BrowseCommandRequest request) - throws IOException, RepositoryException - { + private List getRootFromTip(BrowseCommandRequest request) throws IOException { BrowserResult result = new HgBrowseCommand(cmdContext, repository).getBrowserResult(request); diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgCatCommandTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgCatCommandTest.java index afb5249b25..9379fd42a8 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgCatCommandTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgCatCommandTest.java @@ -33,8 +33,10 @@ package sonia.scm.repository.spi; +import org.junit.Ignore; import org.junit.Test; -import sonia.scm.repository.RepositoryException; +import sonia.scm.NotFoundException; +import sonia.scm.repository.InternalRepositoryException; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -45,7 +47,7 @@ import static org.junit.Assert.assertEquals; public class HgCatCommandTest extends AbstractHgCommandTestBase { @Test - public void testCat() throws IOException, RepositoryException { + public void testCat() throws IOException { CatCommandRequest request = new CatCommandRequest(); request.setPath("a.txt"); @@ -54,23 +56,24 @@ public class HgCatCommandTest extends AbstractHgCommandTestBase { } @Test - public void testSimpleCat() throws IOException, RepositoryException { + public void testSimpleCat() throws IOException { CatCommandRequest request = new CatCommandRequest(); request.setPath("b.txt"); assertEquals("b", execute(request)); } - @Test(expected = RepositoryException.class) - public void testUnknownFile() throws IOException, RepositoryException { + @Test(expected = InternalRepositoryException.class) + public void testUnknownFile() throws IOException { CatCommandRequest request = new CatCommandRequest(); request.setPath("unknown"); execute(request); } - @Test(expected = RepositoryException.class) - public void testUnknownRevision() throws IOException, RepositoryException { + @Test(expected = NotFoundException.class) + @Ignore("detection of unknown revision in hg not yet implemented") + public void testUnknownRevision() throws IOException { CatCommandRequest request = new CatCommandRequest(); request.setRevision("abc"); @@ -79,7 +82,7 @@ public class HgCatCommandTest extends AbstractHgCommandTestBase { } @Test - public void testSimpleStream() throws IOException, RepositoryException { + public void testSimpleStream() throws IOException { CatCommandRequest request = new CatCommandRequest(); request.setPath("b.txt"); @@ -92,7 +95,7 @@ public class HgCatCommandTest extends AbstractHgCommandTestBase { catResultStream.close(); } - private String execute(CatCommandRequest request) throws IOException, RepositoryException { + private String execute(CatCommandRequest request) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); new HgCatCommand(cmdContext, repository).getCatResult(request, baos); return baos.toString().trim(); diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgIncomingCommandTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgIncomingCommandTest.java index a8a5de156b..4d7b7c75d9 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgIncomingCommandTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgIncomingCommandTest.java @@ -35,19 +35,18 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import com.aragost.javahg.Changeset; - import org.junit.Test; - import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.HgTestUtil; -import sonia.scm.repository.RepositoryException; - -import static org.junit.Assert.*; - -//~--- JDK imports ------------------------------------------------------------ +import sonia.scm.repository.InternalRepositoryException; import java.io.IOException; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -60,12 +59,9 @@ public class HgIncomingCommandTest extends IncomingOutgoingTestBase * * * @throws IOException - * @throws RepositoryException */ @Test - public void testGetIncomingChangesets() - throws IOException, RepositoryException - { + public void testGetIncomingChangesets() throws IOException { writeNewFile(outgoing, outgoingDirectory, "a.txt", "Content of file a.txt"); writeNewFile(outgoing, outgoingDirectory, "b.txt", "Content of file b.txt"); @@ -89,16 +85,8 @@ public class HgIncomingCommandTest extends IncomingOutgoingTestBase assertChangesetsEqual(c2, cpr.getChangesets().get(1)); } - /** - * Method description - * - * - * @throws RepositoryException - */ @Test - public void testGetIncomingChangesetsWithEmptyRepository() - throws RepositoryException - { + public void testGetIncomingChangesetsWithEmptyRepository() { HgIncomingCommand cmd = createIncomingCommand(); IncomingCommandRequest request = new IncomingCommandRequest(); @@ -110,17 +98,8 @@ public class HgIncomingCommandTest extends IncomingOutgoingTestBase assertEquals(0, cpr.getTotal()); } - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ - @Test(expected = RepositoryException.class) - public void testGetIncomingChangesetsWithUnrelatedRepository() - throws IOException, RepositoryException - { + @Test(expected = InternalRepositoryException.class) + public void testGetIncomingChangesetsWithUnrelatedRepository() throws IOException { writeNewFile(outgoing, outgoingDirectory, "a.txt", "Content of file a.txt"); writeNewFile(outgoing, outgoingDirectory, "b.txt", "Content of file b.txt"); diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgLogCommandTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgLogCommandTest.java index bae48180ce..c4d49ba8b5 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgLogCommandTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgLogCommandTest.java @@ -36,20 +36,19 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import org.junit.Test; - import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.Modifications; -import sonia.scm.repository.RepositoryException; -import static org.hamcrest.Matchers.*; - -import static org.junit.Assert.*; +import static org.hamcrest.Matchers.contains; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; //~--- JDK imports ------------------------------------------------------------ -import java.io.IOException; - /** * * @author Sebastian Sdorra @@ -57,16 +56,8 @@ import java.io.IOException; public class HgLogCommandTest extends AbstractHgCommandTestBase { - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testGetAll() throws IOException, RepositoryException - { + public void testGetAll() { ChangesetPagingResult result = createComamnd().getChangesets(new LogCommandRequest()); @@ -75,16 +66,8 @@ public class HgLogCommandTest extends AbstractHgCommandTestBase assertEquals(5, result.getChangesets().size()); } - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testGetAllByPath() throws IOException, RepositoryException - { + public void testGetAllByPath() { LogCommandRequest request = new LogCommandRequest(); request.setPath("a.txt"); @@ -102,16 +85,8 @@ public class HgLogCommandTest extends AbstractHgCommandTestBase result.getChangesets().get(2).getId()); } - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testGetAllWithLimit() throws IOException, RepositoryException - { + public void testGetAllWithLimit() { LogCommandRequest request = new LogCommandRequest(); request.setPagingLimit(2); @@ -133,16 +108,8 @@ public class HgLogCommandTest extends AbstractHgCommandTestBase assertEquals("542bf4893dd2ff58a0eb719551d75ddeb919608b", c2.getId()); } - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testGetAllWithPaging() throws IOException, RepositoryException - { + public void testGetAllWithPaging() { LogCommandRequest request = new LogCommandRequest(); request.setPagingStart(1); @@ -165,16 +132,8 @@ public class HgLogCommandTest extends AbstractHgCommandTestBase assertEquals("79b6baf49711ae675568e0698d730b97ef13e84a", c2.getId()); } - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testGetCommit() throws IOException, RepositoryException - { + public void testGetCommit() { HgLogCommand command = createComamnd(); Changeset c = command.getChangeset("a9bacaf1b7fa0cebfca71fed4e59ed69a6319427"); @@ -197,16 +156,8 @@ public class HgLogCommandTest extends AbstractHgCommandTestBase assertThat(mods.getAdded(), contains("a.txt", "b.txt")); } - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testGetRange() throws IOException, RepositoryException - { + public void testGetRange() { LogCommandRequest request = new LogCommandRequest(); request.setStartChangeset("3049df33fdbb"); diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgOutgoingCommandTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgOutgoingCommandTest.java index 7a43df98bc..354481b9b3 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgOutgoingCommandTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgOutgoingCommandTest.java @@ -35,20 +35,18 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import com.aragost.javahg.Changeset; - import org.junit.Test; - import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.HgTestUtil; -import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.InternalRepositoryException; + +import java.io.IOException; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; //~--- JDK imports ------------------------------------------------------------ -import java.io.IOException; - /** * * @author Sebastian Sdorra @@ -56,17 +54,8 @@ import java.io.IOException; public class HgOutgoingCommandTest extends IncomingOutgoingTestBase { - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testGetOutgoingChangesets() - throws IOException, RepositoryException - { + public void testGetOutgoingChangesets() throws IOException { writeNewFile(outgoing, outgoingDirectory, "a.txt", "Content of file a.txt"); writeNewFile(outgoing, outgoingDirectory, "b.txt", "Content of file b.txt"); @@ -90,16 +79,8 @@ public class HgOutgoingCommandTest extends IncomingOutgoingTestBase assertChangesetsEqual(c2, cpr.getChangesets().get(1)); } - /** - * Method description - * - * - * @throws RepositoryException - */ @Test - public void testGetOutgoingChangesetsWithEmptyRepository() - throws RepositoryException - { + public void testGetOutgoingChangesetsWithEmptyRepository() { HgOutgoingCommand cmd = createOutgoingCommand(); OutgoingCommandRequest request = new OutgoingCommandRequest(); @@ -111,17 +92,8 @@ public class HgOutgoingCommandTest extends IncomingOutgoingTestBase assertEquals(0, cpr.getTotal()); } - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ - @Test(expected = RepositoryException.class) - public void testGetOutgoingChangesetsWithUnrelatedRepository() - throws IOException, RepositoryException - { + @Test(expected = InternalRepositoryException.class) + public void testGetOutgoingChangesetsWithUnrelatedRepository() throws IOException { writeNewFile(outgoing, outgoingDirectory, "a.txt", "Content of file a.txt"); writeNewFile(outgoing, outgoingDirectory, "b.txt", "Content of file b.txt"); diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java index 58ada0738b..7d5c9695c9 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java @@ -37,10 +37,8 @@ package sonia.scm.repository; import com.google.inject.Inject; import com.google.inject.Singleton; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.io.fs.FSHooks; @@ -48,19 +46,17 @@ import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory; import org.tmatesoft.svn.core.io.SVNRepository; import org.tmatesoft.svn.core.io.SVNRepositoryFactory; import org.tmatesoft.svn.util.SVNDebugLog; - import sonia.scm.io.FileSystem; import sonia.scm.logging.SVNKitLogger; import sonia.scm.plugin.Extension; +import sonia.scm.repository.spi.HookEventFacade; import sonia.scm.repository.spi.SvnRepositoryServiceProvider; +import sonia.scm.store.ConfigurationStoreFactory; import sonia.scm.util.Util; -//~--- JDK imports ------------------------------------------------------------ - import java.io.File; -import java.io.IOException; -import sonia.scm.repository.spi.HookEventFacade; -import sonia.scm.store.ConfigurationStoreFactory; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -72,38 +68,21 @@ public class SvnRepositoryHandler extends AbstractSimpleRepositoryHandler { - /** Field description */ public static final String PROPERTY_UUID = "svn.uuid"; - /** Field description */ - public static final String RESOURCE_VERSION = - "sonia/scm/version/scm-svn-plugin"; + public static final String RESOURCE_VERSION = "sonia/scm/version/scm-svn-plugin"; - /** Field description */ public static final String TYPE_DISPLAYNAME = "Subversion"; - /** Field description */ public static final String TYPE_NAME = "svn"; - /** Field description */ public static final RepositoryType TYPE = new RepositoryType(TYPE_NAME, TYPE_DISPLAYNAME, SvnRepositoryServiceProvider.COMMANDS); - /** the logger for SvnRepositoryHandler */ private static final Logger logger = LoggerFactory.getLogger(SvnRepositoryHandler.class); - //~--- constructors --------------------------------------------------------- - - /** - * Constructs ... - * - * - * @param storeFactory - * @param fileSystem - * @param repositoryManager - */ @Inject public SvnRepositoryHandler(ConfigurationStoreFactory storeFactory, FileSystem fileSystem, HookEventFacade eventFacade) @@ -128,60 +107,26 @@ public class SvnRepositoryHandler } } - //~--- get methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @return - */ @Override public ImportHandler getImportHandler() { return new SvnImportHandler(this); } - /** - * Method description - * - * - * @return - */ @Override public RepositoryType getType() { return TYPE; } - /** - * Method description - * - * - * @return - */ @Override public String getVersionInformation() { return getStringFromResource(RESOURCE_VERSION, DEFAULT_VERSION_INFORMATION); } - //~--- methods -------------------------------------------------------------- - - /** - * Method description - * - * - * @param repository - * @param directory - * - * @throws IOException - * @throws RepositoryException - */ @Override - protected void create(Repository repository, File directory) - throws RepositoryException, IOException - { + protected void create(Repository repository, File directory) throws InternalRepositoryException { Compatibility comp = config.getCompatibility(); if (logger.isDebugEnabled()) @@ -228,7 +173,7 @@ public class SvnRepositoryHandler } catch (SVNException ex) { - throw new RepositoryException(ex); + throw new InternalRepositoryException(ex); } finally { diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnUtil.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnUtil.java index 63fabaf4e9..eb613e6144 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnUtil.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnUtil.java @@ -346,21 +346,7 @@ public final class SvnUtil } } - //~--- get methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @param revision - * - * @return - * - * @throws RepositoryException - */ - public static long getRevisionNumber(String revision) - throws RepositoryException - { + public static long getRevisionNumber(String revision) throws RevisionNotFoundException { // REVIEW Bei SVN wird ohne Revision die -1 genommen, was zu einem Fehler führt long revisionNumber = -1; @@ -372,7 +358,7 @@ public final class SvnUtil } catch (NumberFormatException ex) { - throw new RepositoryException("given revision is not a svnrevision"); + throw new RevisionNotFoundException(revision); } } diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBlameCommand.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBlameCommand.java index 9c059d0ea5..fe9a72ffce 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBlameCommand.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBlameCommand.java @@ -35,7 +35,6 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.collect.Lists; - import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager; @@ -43,21 +42,18 @@ import org.tmatesoft.svn.core.io.SVNRepository; import org.tmatesoft.svn.core.io.SVNRepositoryFactory; import org.tmatesoft.svn.core.wc.SVNLogClient; import org.tmatesoft.svn.core.wc.SVNRevision; - import sonia.scm.repository.BlameLine; import sonia.scm.repository.BlameResult; +import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.SvnBlameHandler; import sonia.scm.util.Util; -//~--- JDK imports ------------------------------------------------------------ - import java.io.File; -import java.io.IOException; - import java.util.List; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -65,37 +61,13 @@ import java.util.List; public class SvnBlameCommand extends AbstractSvnCommand implements BlameCommand { - /** - * Constructs ... - * - * - * - * @param context - * @param repository - * @param repositoryDirectory - */ public SvnBlameCommand(SvnContext context, Repository repository) { super(context, repository); } - //~--- get methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @param request - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ @Override - public BlameResult getBlameResult(BlameCommandRequest request) - throws IOException, RepositoryException - { + public BlameResult getBlameResult(BlameCommandRequest request) { String path = request.getPath(); String revision = request.getRevision(); List blameLines = Lists.newArrayList(); @@ -126,7 +98,7 @@ public class SvnBlameCommand extends AbstractSvnCommand implements BlameCommand } catch (SVNException ex) { - throw new RepositoryException("could not create blame result", ex); + throw new InternalRepositoryException("could not create blame result", ex); } return new BlameResult(blameLines.size(), blameLines); diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBrowseCommand.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBrowseCommand.java index 6d408c8f17..a75adf6b78 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBrowseCommand.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBrowseCommand.java @@ -47,12 +47,11 @@ import org.tmatesoft.svn.core.io.SVNRepository; import sonia.scm.repository.BrowserResult; import sonia.scm.repository.FileObject; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.RevisionNotFoundException; import sonia.scm.repository.SubRepository; import sonia.scm.repository.SvnUtil; import sonia.scm.util.Util; -import java.io.IOException; import java.util.Collection; import java.util.List; @@ -72,40 +71,14 @@ public class SvnBrowseCommand extends AbstractSvnCommand private static final Logger logger = LoggerFactory.getLogger(SvnBrowseCommand.class); - //~--- constructors --------------------------------------------------------- - - /** - * Constructs ... - * - * - * - * @param context - * @param repository - * @param repositoryDirectory - */ SvnBrowseCommand(SvnContext context, Repository repository) { super(context, repository); } - //~--- get methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @param request - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ @Override @SuppressWarnings("unchecked") - public BrowserResult getBrowserResult(BrowseCommandRequest request) - throws IOException, RepositoryException - { + public BrowserResult getBrowserResult(BrowseCommandRequest request) throws RevisionNotFoundException { String path = request.getPath(); long revisionNumber = SvnUtil.getRevisionNumber(request.getRevision()); @@ -293,7 +266,7 @@ public class SvnBrowseCommand extends AbstractSvnCommand } catch (SVNException ex) { - logger.error("could not fetch file properties"); + logger.error("could not fetch file properties", ex); } } } diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBundleCommand.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBundleCommand.java index af9dbe5fda..c3ce87decf 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBundleCommand.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBundleCommand.java @@ -37,25 +37,22 @@ package sonia.scm.repository.spi; import com.google.common.io.ByteSink; import com.google.common.io.Closeables; - import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.wc.SVNClientManager; import org.tmatesoft.svn.core.wc.SVNRevision; import org.tmatesoft.svn.core.wc.admin.SVNAdminClient; - import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.SvnUtil; import sonia.scm.repository.api.BundleResponse; -import static com.google.common.base.Preconditions.*; - -//~--- JDK imports ------------------------------------------------------------ - import java.io.File; import java.io.IOException; import java.io.OutputStream; +import static com.google.common.base.Preconditions.checkNotNull; + +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -64,31 +61,11 @@ public class SvnBundleCommand extends AbstractSvnCommand implements BundleCommand { - /** - * Constructs ... - * - * - * @param context - * @param repository - */ public SvnBundleCommand(SvnContext context, Repository repository) { super(context, repository); } - //~--- methods -------------------------------------------------------------- - - /** - * Method description - * - * - * @param adminClient - * @param repository - * @param target - * - * @throws IOException - * @throws SVNException - */ private static void dump(SVNAdminClient adminClient, File repository, ByteSink target) throws SVNException, IOException @@ -107,21 +84,8 @@ public class SvnBundleCommand extends AbstractSvnCommand } } - /** - * Method description - * - * - * @param request - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ @Override - public BundleResponse bundle(BundleCommandRequest request) - throws IOException, RepositoryException - { + public BundleResponse bundle(BundleCommandRequest request) throws IOException { ByteSink archive = checkNotNull(request.getArchive(), "archive is required"); diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnCatCommand.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnCatCommand.java index 4a8b907c29..4936a16a8c 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnCatCommand.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnCatCommand.java @@ -43,15 +43,14 @@ import org.tmatesoft.svn.core.SVNProperties; import org.tmatesoft.svn.core.io.SVNRepository; import org.tmatesoft.svn.core.wc.SVNClientManager; import org.tmatesoft.svn.core.wc.admin.SVNLookClient; +import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.PathNotFoundException; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RevisionNotFoundException; import sonia.scm.repository.SvnUtil; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -72,15 +71,6 @@ public class SvnCatCommand extends AbstractSvnCommand implements CatCommand //~--- constructors --------------------------------------------------------- - /** - * Constructs ... - * - * - * - * @param context - * @param repository - * @param repositoryDirectory - */ SvnCatCommand(SvnContext context, Repository repository) { super(context, repository); @@ -88,20 +78,8 @@ public class SvnCatCommand extends AbstractSvnCommand implements CatCommand //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @param request - * @param output - * - * @throws IOException - * @throws RepositoryException - */ @Override - public void getCatResult(CatCommandRequest request, OutputStream output) - throws IOException, RepositoryException - { + public void getCatResult(CatCommandRequest request, OutputStream output) throws RevisionNotFoundException, PathNotFoundException { if (logger.isDebugEnabled()) { logger.debug("try to get content for {}", request); @@ -125,7 +103,7 @@ public class SvnCatCommand extends AbstractSvnCommand implements CatCommand } @Override - public InputStream getCatResultStream(CatCommandRequest request) throws IOException, RepositoryException { + public InputStream getCatResultStream(CatCommandRequest request) throws RevisionNotFoundException, PathNotFoundException { // There seems to be no method creating an input stream as a result, so // we have no other possibility then to copy the content into a buffer and // stream it from there. @@ -134,20 +112,7 @@ public class SvnCatCommand extends AbstractSvnCommand implements CatCommand return new ByteArrayInputStream(output.toByteArray()); } - /** - * Method description - * - * - * @param request - * @param output - * @param revision - * - * @throws RepositoryException - */ - private void getCatFromRevision(CatCommandRequest request, - OutputStream output, long revision) - throws RepositoryException - { + private void getCatFromRevision(CatCommandRequest request, OutputStream output, long revision) throws PathNotFoundException, RevisionNotFoundException { logger.debug("try to read content from revision {} and path {}", revision, request.getPath()); @@ -164,31 +129,18 @@ public class SvnCatCommand extends AbstractSvnCommand implements CatCommand } } - private void handleSvnException(CatCommandRequest request, SVNException ex) throws RepositoryException { + private void handleSvnException(CatCommandRequest request, SVNException ex) throws PathNotFoundException, RevisionNotFoundException { int svnErrorCode = ex.getErrorMessage().getErrorCode().getCode(); if (SVNErrorCode.FS_NOT_FOUND.getCode() == svnErrorCode) { throw new PathNotFoundException(request.getPath()); } else if (SVNErrorCode.FS_NO_SUCH_REVISION.getCode() == svnErrorCode) { throw new RevisionNotFoundException(request.getRevision()); } else { - throw new RepositoryException("could not get content from revision", ex); + throw new InternalRepositoryException("could not get content from revision", ex); } } - /** - * Method description - * - * - * @param request - * @param output - * @param txn - * - * @throws RepositoryException - */ - private void getCatFromTransaction(CatCommandRequest request, - OutputStream output, String txn) - throws RepositoryException - { + private void getCatFromTransaction(CatCommandRequest request, OutputStream output, String txn) { logger.debug("try to read content from transaction {} and path {}", txn, request.getPath()); @@ -204,8 +156,7 @@ public class SvnCatCommand extends AbstractSvnCommand implements CatCommand } catch (SVNException ex) { - throw new RepositoryException("could not get content from transaction", - ex); + throw new InternalRepositoryException("could not get content from transaction", ex); } finally { diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnDiffCommand.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnDiffCommand.java index f7af17326d..0b65466a42 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnDiffCommand.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnDiffCommand.java @@ -36,10 +36,8 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.base.Preconditions; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import org.tmatesoft.svn.core.SVNDepth; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNURL; @@ -48,18 +46,17 @@ import org.tmatesoft.svn.core.wc.ISVNDiffGenerator; import org.tmatesoft.svn.core.wc.SVNClientManager; import org.tmatesoft.svn.core.wc.SVNDiffClient; import org.tmatesoft.svn.core.wc.SVNRevision; - +import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.RevisionNotFoundException; import sonia.scm.repository.SvnUtil; import sonia.scm.repository.api.DiffFormat; import sonia.scm.util.Util; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.IOException; import java.io.OutputStream; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -73,38 +70,13 @@ public class SvnDiffCommand extends AbstractSvnCommand implements DiffCommand private static final Logger logger = LoggerFactory.getLogger(SvnDiffCommand.class); - //~--- constructors --------------------------------------------------------- - - /** - * Constructs ... - * - * - * - * @param context - * @param repository - * @param repositoryDirectory - */ public SvnDiffCommand(SvnContext context, Repository repository) { super(context, repository); } - //~--- get methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @param request - * @param output - * - * @throws IOException - * @throws RepositoryException - */ @Override - public void getDiffResult(DiffCommandRequest request, OutputStream output) - throws IOException, RepositoryException - { + public void getDiffResult(DiffCommandRequest request, OutputStream output) throws RevisionNotFoundException { if (logger.isDebugEnabled()) { logger.debug("create diff for {}", request); @@ -149,7 +121,7 @@ public class SvnDiffCommand extends AbstractSvnCommand implements DiffCommand } catch (SVNException ex) { - throw new RepositoryException("could not create diff", ex); + throw new InternalRepositoryException("could not create diff", ex); } finally { diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnLogCommand.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnLogCommand.java index b1024ec5b4..ededb4e1f0 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnLogCommand.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnLogCommand.java @@ -37,33 +37,25 @@ package sonia.scm.repository.spi; import com.google.common.base.Strings; import com.google.common.collect.Lists; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import org.tmatesoft.svn.core.ISVNLogEntryHandler; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNLogEntry; import org.tmatesoft.svn.core.io.SVNRepository; - import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; +import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.RevisionNotFoundException; import sonia.scm.repository.SvnUtil; import sonia.scm.util.Util; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.IOException; - import java.util.Collection; import java.util.List; -/** - * - * @author Sebastian Sdorra - */ +//~--- JDK imports ------------------------------------------------------------ + public class SvnLogCommand extends AbstractSvnCommand implements LogCommand { @@ -73,17 +65,6 @@ public class SvnLogCommand extends AbstractSvnCommand implements LogCommand private static final Logger logger = LoggerFactory.getLogger(SvnLogCommand.class); - //~--- constructors --------------------------------------------------------- - - /** - * Constructs ... - * - * - * - * @param context - * @param repository - * @param repositoryDirectory - */ SvnLogCommand(SvnContext context, Repository repository) { super(context, repository); @@ -91,22 +72,9 @@ public class SvnLogCommand extends AbstractSvnCommand implements LogCommand //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @param revision - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ @Override @SuppressWarnings("unchecked") - public Changeset getChangeset(String revision) - throws IOException, RepositoryException - { + public Changeset getChangeset(String revision) throws RevisionNotFoundException { Changeset changeset = null; if (logger.isDebugEnabled()) @@ -128,28 +96,15 @@ public class SvnLogCommand extends AbstractSvnCommand implements LogCommand } catch (SVNException ex) { - throw new RepositoryException("could not open repository", ex); + throw new InternalRepositoryException("could not open repository", ex); } return changeset; } - /** - * Method description - * - * - * @param request - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ @Override @SuppressWarnings("unchecked") - public ChangesetPagingResult getChangesets(LogCommandRequest request) - throws IOException, RepositoryException - { + public ChangesetPagingResult getChangesets(LogCommandRequest request) throws RevisionNotFoundException { if (logger.isDebugEnabled()) { logger.debug("fetch changesets for {}", request); @@ -183,7 +138,7 @@ public class SvnLogCommand extends AbstractSvnCommand implements LogCommand } catch (SVNException ex) { - throw new RepositoryException("could not open repository", ex); + throw new InternalRepositoryException("could not open repository", ex); } return changesets; @@ -191,18 +146,7 @@ public class SvnLogCommand extends AbstractSvnCommand implements LogCommand //~--- methods -------------------------------------------------------------- - /** - * Method description - * - * - * @param v - * - * @return - * - * @throws RepositoryException - */ - private long parseRevision(String v) throws RepositoryException - { + private long parseRevision(String v) throws RevisionNotFoundException { long result = -1l; if (!Strings.isNullOrEmpty(v)) @@ -213,8 +157,7 @@ public class SvnLogCommand extends AbstractSvnCommand implements LogCommand } catch (NumberFormatException ex) { - throw new RepositoryException( - String.format("could not convert revision %s", v), ex); + throw new RevisionNotFoundException(v); } } diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBlameCommandTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBlameCommandTest.java index e320dd3251..ec4f375df4 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBlameCommandTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBlameCommandTest.java @@ -35,17 +35,15 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import org.junit.Test; - import sonia.scm.repository.BlameLine; import sonia.scm.repository.BlameResult; -import sonia.scm.repository.RepositoryException; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; //~--- JDK imports ------------------------------------------------------------ -import java.io.IOException; - /** * * @author Sebastian Sdorra @@ -53,15 +51,8 @@ import java.io.IOException; public class SvnBlameCommandTest extends AbstractSvnCommandTestBase { - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testGetBlameResult() throws IOException, RepositoryException + public void testGetBlameResult() { BlameCommandRequest request = new BlameCommandRequest(); @@ -85,17 +76,8 @@ public class SvnBlameCommandTest extends AbstractSvnCommandTestBase assertNull(line.getAuthor().getMail()); } - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testGetBlameResultWithRevision() - throws IOException, RepositoryException - { + public void testGetBlameResultWithRevision() { BlameCommandRequest request = new BlameCommandRequest(); request.setPath("a.txt"); diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBrowseCommandTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBrowseCommandTest.java index 369d179fed..c4c658ea7a 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBrowseCommandTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBrowseCommandTest.java @@ -36,19 +36,21 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import org.junit.Test; - import sonia.scm.repository.BrowserResult; import sonia.scm.repository.FileObject; -import sonia.scm.repository.RepositoryException; - -import static org.junit.Assert.*; - -//~--- JDK imports ------------------------------------------------------------ +import sonia.scm.repository.RevisionNotFoundException; import java.io.IOException; - import java.util.List; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -56,16 +58,8 @@ import java.util.List; public class SvnBrowseCommandTest extends AbstractSvnCommandTestBase { - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testBrowse() throws IOException, RepositoryException - { + public void testBrowse() throws RevisionNotFoundException { List foList = getRootFromTip(new BrowseCommandRequest()); FileObject a = getFileObject(foList, "a.txt"); @@ -87,11 +81,9 @@ public class SvnBrowseCommandTest extends AbstractSvnCommandTestBase * * * @throws IOException - * @throws RepositoryException */ @Test - public void testBrowseSubDirectory() throws IOException, RepositoryException - { + public void testBrowseSubDirectory() throws RevisionNotFoundException { BrowseCommandRequest request = new BrowseCommandRequest(); request.setPath("c"); @@ -137,16 +129,8 @@ public class SvnBrowseCommandTest extends AbstractSvnCommandTestBase checkDate(e.getLastModified()); } - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testDisableLastCommit() throws IOException, RepositoryException - { + public void testDisableLastCommit() throws RevisionNotFoundException { BrowseCommandRequest request = new BrowseCommandRequest(); request.setDisableLastCommit(true); @@ -160,8 +144,7 @@ public class SvnBrowseCommandTest extends AbstractSvnCommandTestBase } @Test - public void testRecursive() throws IOException, RepositoryException - { + public void testRecursive() throws RevisionNotFoundException { BrowseCommandRequest request = new BrowseCommandRequest(); request.setRecursive(true); BrowserResult result = createCommand().getBrowserResult(request); @@ -220,20 +203,7 @@ public class SvnBrowseCommandTest extends AbstractSvnCommandTestBase return a; } - /** - * Method description - * - * - * @param request - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ - private List getRootFromTip(BrowseCommandRequest request) - throws IOException, RepositoryException - { + private List getRootFromTip(BrowseCommandRequest request) throws RevisionNotFoundException { BrowserResult result = createCommand().getBrowserResult(request); assertNotNull(result); diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBundleCommandTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBundleCommandTest.java index 57fde186cf..9e7e40810c 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBundleCommandTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnBundleCommandTest.java @@ -37,23 +37,22 @@ package sonia.scm.repository.spi; import com.google.common.io.ByteSink; import com.google.common.io.Files; - import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; - -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.api.BundleResponse; -import static org.hamcrest.Matchers.*; - -import static org.junit.Assert.*; - -//~--- JDK imports ------------------------------------------------------------ - import java.io.File; import java.io.IOException; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -61,15 +60,8 @@ import java.io.IOException; public class SvnBundleCommandTest extends AbstractSvnCommandTestBase { - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testBundle() throws IOException, RepositoryException + public void testBundle() throws IOException { File file = temp.newFile(); ByteSink sink = Files.asByteSink(file); diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnCatCommandTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnCatCommandTest.java index f7e2123bad..3980b3e558 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnCatCommandTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnCatCommandTest.java @@ -34,7 +34,6 @@ package sonia.scm.repository.spi; import org.junit.Test; import sonia.scm.repository.PathNotFoundException; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RevisionNotFoundException; import java.io.ByteArrayOutputStream; @@ -48,7 +47,7 @@ import static org.junit.Assert.assertEquals; public class SvnCatCommandTest extends AbstractSvnCommandTestBase { @Test - public void testCat() throws IOException, RepositoryException { + public void testCat() throws PathNotFoundException, RevisionNotFoundException { CatCommandRequest request = new CatCommandRequest(); request.setPath("a.txt"); @@ -57,7 +56,7 @@ public class SvnCatCommandTest extends AbstractSvnCommandTestBase { } @Test - public void testSimpleCat() throws IOException, RepositoryException { + public void testSimpleCat() throws PathNotFoundException, RevisionNotFoundException { CatCommandRequest request = new CatCommandRequest(); request.setPath("c/d.txt"); @@ -65,7 +64,7 @@ public class SvnCatCommandTest extends AbstractSvnCommandTestBase { } @Test(expected = PathNotFoundException.class) - public void testUnknownFile() throws IOException, RepositoryException { + public void testUnknownFile() throws PathNotFoundException, RevisionNotFoundException { CatCommandRequest request = new CatCommandRequest(); request.setPath("unknown"); @@ -75,7 +74,7 @@ public class SvnCatCommandTest extends AbstractSvnCommandTestBase { } @Test(expected = RevisionNotFoundException.class) - public void testUnknownRevision() throws IOException, RepositoryException { + public void testUnknownRevision() throws PathNotFoundException, RevisionNotFoundException { CatCommandRequest request = new CatCommandRequest(); request.setPath("a.txt"); @@ -85,7 +84,7 @@ public class SvnCatCommandTest extends AbstractSvnCommandTestBase { } @Test - public void testSimpleStream() throws IOException, RepositoryException { + public void testSimpleStream() throws IOException, PathNotFoundException, RevisionNotFoundException { CatCommandRequest request = new CatCommandRequest(); request.setPath("a.txt"); request.setRevision("1"); @@ -99,7 +98,7 @@ public class SvnCatCommandTest extends AbstractSvnCommandTestBase { catResultStream.close(); } - private String execute(CatCommandRequest request) throws IOException, RepositoryException { + private String execute(CatCommandRequest request) throws PathNotFoundException, RevisionNotFoundException { String content = null; ByteArrayOutputStream baos = new ByteArrayOutputStream(); diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnLogCommandTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnLogCommandTest.java index a3942bd0f4..941687190c 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnLogCommandTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnLogCommandTest.java @@ -35,18 +35,18 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import org.junit.Test; - import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; import sonia.scm.repository.Modifications; -import sonia.scm.repository.RepositoryException; +import sonia.scm.repository.RevisionNotFoundException; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; //~--- JDK imports ------------------------------------------------------------ -import java.io.IOException; - /** * * @author Sebastian Sdorra @@ -54,16 +54,8 @@ import java.io.IOException; public class SvnLogCommandTest extends AbstractSvnCommandTestBase { - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testGetAll() throws IOException, RepositoryException - { + public void testGetAll() throws RevisionNotFoundException { ChangesetPagingResult result = createCommand().getChangesets(new LogCommandRequest()); @@ -72,16 +64,8 @@ public class SvnLogCommandTest extends AbstractSvnCommandTestBase assertEquals(6, result.getChangesets().size()); } - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testGetAllByPath() throws IOException, RepositoryException - { + public void testGetAllByPath() throws RevisionNotFoundException { LogCommandRequest request = new LogCommandRequest(); request.setPath("a.txt"); @@ -96,16 +80,8 @@ public class SvnLogCommandTest extends AbstractSvnCommandTestBase assertEquals("1", result.getChangesets().get(2).getId()); } - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testGetAllWithLimit() throws IOException, RepositoryException - { + public void testGetAllWithLimit() throws RevisionNotFoundException { LogCommandRequest request = new LogCommandRequest(); request.setPagingLimit(2); @@ -127,16 +103,8 @@ public class SvnLogCommandTest extends AbstractSvnCommandTestBase assertEquals("4", c2.getId()); } - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testGetAllWithPaging() throws IOException, RepositoryException - { + public void testGetAllWithPaging() throws RevisionNotFoundException { LogCommandRequest request = new LogCommandRequest(); request.setPagingStart(1); @@ -159,16 +127,8 @@ public class SvnLogCommandTest extends AbstractSvnCommandTestBase assertEquals("3", c2.getId()); } - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testGetCommit() throws IOException, RepositoryException - { + public void testGetCommit() throws RevisionNotFoundException { Changeset c = createCommand().getChangeset("3"); assertNotNull(c); @@ -188,16 +148,8 @@ public class SvnLogCommandTest extends AbstractSvnCommandTestBase assertEquals("b.txt", mods.getRemoved().get(0)); } - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - */ @Test - public void testGetRange() throws IOException, RepositoryException - { + public void testGetRange() throws RevisionNotFoundException { LogCommandRequest request = new LogCommandRequest(); request.setStartChangeset("2"); diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnUnbundleCommandTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnUnbundleCommandTest.java index 2c59797296..133518e8db 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnUnbundleCommandTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnUnbundleCommandTest.java @@ -34,26 +34,22 @@ package sonia.scm.repository.spi; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.io.Files; - import org.junit.Test; - import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.io.SVNRepository; import org.tmatesoft.svn.core.io.SVNRepositoryFactory; - -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.SvnUtil; import sonia.scm.repository.api.UnbundleResponse; -import static org.hamcrest.Matchers.*; - -import static org.junit.Assert.*; - -//~--- JDK imports ------------------------------------------------------------ - import java.io.File; import java.io.IOException; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertThat; + +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -61,17 +57,9 @@ import java.io.IOException; public class SvnUnbundleCommandTest extends AbstractSvnCommandTestBase { - /** - * Method description - * - * - * @throws IOException - * @throws RepositoryException - * @throws SVNException - */ @Test public void testUnbundle() - throws IOException, RepositoryException, SVNException + throws IOException, SVNException { File bundle = bundle(); SvnContext ctx = createEmptyContext(); @@ -95,16 +83,7 @@ public class SvnUnbundleCommandTest extends AbstractSvnCommandTestBase SvnUtil.closeSession(repo); } - /** - * Method description - * - * - * @return - * - * @throws IOException - * @throws RepositoryException - */ - private File bundle() throws IOException, RepositoryException + private File bundle() throws IOException { File file = tempFolder.newFile(); diff --git a/scm-test/src/main/java/sonia/scm/ManagerTestBase.java b/scm-test/src/main/java/sonia/scm/ManagerTestBase.java index 24bd2a0ebb..eda3182638 100644 --- a/scm-test/src/main/java/sonia/scm/ManagerTestBase.java +++ b/scm-test/src/main/java/sonia/scm/ManagerTestBase.java @@ -33,21 +33,21 @@ package sonia.scm; -import java.io.IOException; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.rules.TemporaryFolder; import sonia.scm.util.MockUtil; +import java.io.IOException; + /** * * @author Sebastian Sdorra * * @param - * @param */ -public abstract class ManagerTestBase +public abstract class ManagerTestBase { @Rule @@ -55,7 +55,7 @@ public abstract class ManagerTestBase manager; + protected Manager manager; @Before public void setUp() throws IOException { @@ -75,6 +75,6 @@ public abstract class ManagerTestBase createManager(); + protected abstract Manager createManager(); } 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 db4cfe0090..5a1dc605bb 100644 --- a/scm-test/src/main/java/sonia/scm/repository/DummyRepositoryHandler.java +++ b/scm-test/src/main/java/sonia/scm/repository/DummyRepositoryHandler.java @@ -34,6 +34,7 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.collect.Sets; +import sonia.scm.AlreadyExistsException; import sonia.scm.io.DefaultFileSystem; import sonia.scm.store.ConfigurationStoreFactory; @@ -70,10 +71,10 @@ public class DummyRepositoryHandler @Override - protected void create(Repository repository, File directory) throws RepositoryException { + protected void create(Repository repository, File directory) throws AlreadyExistsException { String key = repository.getNamespace() + "/" + repository.getName(); if (existingRepoNames.contains(key)) { - throw new RepositoryAlreadyExistsException("Repo exists"); + throw new AlreadyExistsException(); } else { existingRepoNames.add(key); } diff --git a/scm-test/src/main/java/sonia/scm/repository/SimpleRepositoryHandlerTestBase.java b/scm-test/src/main/java/sonia/scm/repository/SimpleRepositoryHandlerTestBase.java index 680ac83dd9..999ef1dc45 100644 --- a/scm-test/src/main/java/sonia/scm/repository/SimpleRepositoryHandlerTestBase.java +++ b/scm-test/src/main/java/sonia/scm/repository/SimpleRepositoryHandlerTestBase.java @@ -35,6 +35,7 @@ package sonia.scm.repository; import org.junit.Test; import sonia.scm.AbstractTestBase; +import sonia.scm.AlreadyExistsException; import sonia.scm.store.ConfigurationStoreFactory; import sonia.scm.store.InMemoryConfigurationStoreFactory; import sonia.scm.util.IOUtil; @@ -60,12 +61,12 @@ public abstract class SimpleRepositoryHandlerTestBase extends AbstractTestBase { ConfigurationStoreFactory factory, File directory); @Test - public void testCreate() throws RepositoryException { + public void testCreate() throws AlreadyExistsException { createRepository(); } @Test - public void testCreateResourcePath() throws RepositoryException { + public void testCreateResourcePath() throws AlreadyExistsException { Repository repository = createRepository(); String path = handler.createResourcePath(repository); @@ -75,7 +76,7 @@ public abstract class SimpleRepositoryHandlerTestBase extends AbstractTestBase { } @Test - public void testDelete() throws RepositoryException { + public void testDelete() throws Exception { Repository repository = createRepository(); handler.delete(repository); @@ -100,7 +101,7 @@ public abstract class SimpleRepositoryHandlerTestBase extends AbstractTestBase { } } - private Repository createRepository() throws RepositoryException { + private Repository createRepository() throws AlreadyExistsException { Repository repository = RepositoryTestData.createHeartOfGold(); handler.create(repository); diff --git a/scm-test/src/main/java/sonia/scm/repository/client/spi/CommitRequest.java b/scm-test/src/main/java/sonia/scm/repository/client/spi/CommitRequest.java index fd473300fa..2138fef5cc 100644 --- a/scm-test/src/main/java/sonia/scm/repository/client/spi/CommitRequest.java +++ b/scm-test/src/main/java/sonia/scm/repository/client/spi/CommitRequest.java @@ -34,8 +34,8 @@ package sonia.scm.repository.client.spi; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; - import sonia.scm.repository.Person; /** @@ -105,7 +105,7 @@ public final class CommitRequest public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("author", author) .add("message", message) .toString(); diff --git a/scm-test/src/main/java/sonia/scm/repository/client/spi/TagRequest.java b/scm-test/src/main/java/sonia/scm/repository/client/spi/TagRequest.java index fccf555c16..ff34309b6d 100644 --- a/scm-test/src/main/java/sonia/scm/repository/client/spi/TagRequest.java +++ b/scm-test/src/main/java/sonia/scm/repository/client/spi/TagRequest.java @@ -34,8 +34,8 @@ package sonia.scm.repository.client.spi; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; - /** * * @author Sebastian Sdorra @@ -103,7 +103,7 @@ public final class TagRequest public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("revision", revision) .add("name", name) .toString(); diff --git a/scm-test/src/main/java/sonia/scm/user/UserManagerTestBase.java b/scm-test/src/main/java/sonia/scm/user/UserManagerTestBase.java index 86b3de5615..9f1c50c797 100644 --- a/scm-test/src/main/java/sonia/scm/user/UserManagerTestBase.java +++ b/scm-test/src/main/java/sonia/scm/user/UserManagerTestBase.java @@ -37,46 +37,33 @@ package sonia.scm.user; import org.apache.shiro.SecurityUtils; import org.apache.shiro.subject.Subject; - import org.junit.Test; - +import sonia.scm.AlreadyExistsException; +import sonia.scm.ConcurrentModificationException; import sonia.scm.Manager; import sonia.scm.ManagerTestBase; - -import static org.junit.Assert.*; - -//~--- JDK imports ------------------------------------------------------------ +import sonia.scm.NotFoundException; import java.io.IOException; - import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.UUID; -/** - * - * @author Sebastian Sdorra - */ -public abstract class UserManagerTestBase - extends ManagerTestBase -{ +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +//~--- JDK imports ------------------------------------------------------------ + +public abstract class UserManagerTestBase extends ManagerTestBase { - /** Field description */ public static final int THREAD_COUNT = 10; - //~--- methods -------------------------------------------------------------- - - /** - * Method description - * - * - * @throws IOException - * @throws UserException - */ @Test - public void testCreate() throws UserException, IOException - { + public void testCreate() throws AlreadyExistsException { User zaphod = UserTestData.createZaphod(); manager.create(zaphod); @@ -87,16 +74,8 @@ public abstract class UserManagerTestBase assertUserEquals(zaphod, otherUser); } - /** - * Method description - * - * - * @throws IOException - * @throws UserException - */ - @Test(expected = UserAlreadyExistsException.class) - public void testCreateExisting() throws UserException, IOException - { + @Test(expected = AlreadyExistsException.class) + public void testCreateExisting() throws AlreadyExistsException { User zaphod = UserTestData.createZaphod(); manager.create(zaphod); @@ -107,16 +86,8 @@ public abstract class UserManagerTestBase manager.create(sameUser); } - /** - * Method description - * - * - * @throws IOException - * @throws UserException - */ @Test - public void testDelete() throws UserException, IOException - { + public void testDelete() throws Exception { User zaphod = UserTestData.createZaphod(); manager.create(zaphod); @@ -125,29 +96,13 @@ public abstract class UserManagerTestBase assertNull(manager.get("zaphod")); } - /** - * Method description - * - * - * @throws IOException - * @throws UserException - */ - @Test(expected = UserNotFoundException.class) - public void testDeleteNotFound() throws UserException, IOException - { + @Test(expected = NotFoundException.class) + public void testDeleteNotFound() throws Exception { manager.delete(UserTestData.createDent()); } - /** - * Method description - * - * - * @throws IOException - * @throws UserException - */ @Test - public void testGet() throws UserException, IOException - { + public void testGet() throws AlreadyExistsException { User zaphod = UserTestData.createZaphod(); manager.create(zaphod); @@ -160,16 +115,8 @@ public abstract class UserManagerTestBase assertEquals("Zaphod Beeblebrox", zaphod.getDisplayName()); } - /** - * Method description - * - * - * @throws IOException - * @throws UserException - */ @Test - public void testGetAll() throws UserException, IOException - { + public void testGetAll() throws AlreadyExistsException { User zaphod = UserTestData.createZaphod(); manager.create(zaphod); @@ -233,16 +180,8 @@ public abstract class UserManagerTestBase assertEquals(reference.getDisplayName(), "Tricia McMillan"); } - /** - * Method description - * - * - * @throws IOException - * @throws UserException - */ @Test - public void testModify() throws UserException, IOException - { + public void testModify() throws AlreadyExistsException, NotFoundException, ConcurrentModificationException { User zaphod = UserTestData.createZaphod(); manager.create(zaphod); @@ -256,31 +195,13 @@ public abstract class UserManagerTestBase assertEquals(otherUser.getDisplayName(), "Tricia McMillan"); } - /** - * Method description - * - * - * @throws IOException - * @throws UserException - */ - @Test(expected = UserException.class) - public void testModifyNotExisting() throws UserException, IOException - { + @Test(expected = NotFoundException.class) + public void testModifyNotExisting() throws NotFoundException, ConcurrentModificationException { manager.modify(UserTestData.createZaphod()); } - /** - * Method description - * - * - * @throws IOException - * @throws InterruptedException - * @throws UserException - */ @Test - public void testMultiThreaded() - throws UserException, IOException, InterruptedException - { + public void testMultiThreaded() throws InterruptedException { int initialSize = manager.getAll().size(); List testers = new ArrayList(); @@ -316,16 +237,8 @@ public abstract class UserManagerTestBase assertTrue((initialSize + THREAD_COUNT) == manager.getAll().size()); } - /** - * Method description - * - * - * @throws IOException - * @throws UserException - */ @Test - public void testRefresh() throws UserException, IOException - { + public void testRefresh() throws AlreadyExistsException, NotFoundException { User zaphod = UserTestData.createZaphod(); manager.create(zaphod); @@ -335,26 +248,11 @@ public abstract class UserManagerTestBase assertEquals(zaphod.getDisplayName(), "Zaphod Beeblebrox"); } - /** - * Method description - * - * - * @throws IOException - * @throws UserException - */ - @Test(expected = UserNotFoundException.class) - public void testRefreshNotFound() throws UserException, IOException - { + @Test(expected = NotFoundException.class) + public void testRefreshNotFound() throws NotFoundException { manager.refresh(UserTestData.createDent()); } - /** - * Method description - * - * - * @param user - * @param otherUser - */ private void assertUserEquals(User user, User otherUser) { assertEquals(user.getName(), otherUser.getName()); @@ -363,35 +261,16 @@ public abstract class UserManagerTestBase assertEquals(user.getPassword(), otherUser.getPassword()); } - //~--- inner classes -------------------------------------------------------- - - /** - * Class description - * - * - * @version Enter version here..., 2010-11-23 - * @author Sebastian Sdorra - */ private static class MultiThreadTester implements Runnable { - /** - * Constructs ... - * - * - * @param userManager - */ - public MultiThreadTester(Manager userManager) + public MultiThreadTester(Manager userManager) { this.manager = userManager; } //~--- methods ------------------------------------------------------------ - /** - * Method description - * - */ @Override public void run() { @@ -410,17 +289,7 @@ public abstract class UserManagerTestBase finished = true; } - /** - * Method description - * - * - * @return - * - * @throws IOException - * @throws UserException - */ - private User createUser() throws UserException, IOException - { + private User createUser() throws AlreadyExistsException { String id = UUID.randomUUID().toString(); User user = new User(id, id.concat(" displayName"), id.concat("@mail.com")); @@ -430,18 +299,7 @@ public abstract class UserManagerTestBase return user; } - /** - * Method description - * - * - * @param user - * - * @throws IOException - * @throws UserException - */ - private void modifyAndDeleteUser(User user) - throws UserException, IOException - { + private void modifyAndDeleteUser(User user) throws IOException, NotFoundException, ConcurrentModificationException { String name = user.getName(); String nd = name.concat(" new displayname"); @@ -463,6 +321,6 @@ public abstract class UserManagerTestBase private boolean finished = false; /** Field description */ - private Manager manager; + private Manager manager; } } diff --git a/scm-test/src/main/java/sonia/scm/user/UserTestData.java b/scm-test/src/main/java/sonia/scm/user/UserTestData.java index 67a2d33b0b..eb5e8d6e28 100644 --- a/scm-test/src/main/java/sonia/scm/user/UserTestData.java +++ b/scm-test/src/main/java/sonia/scm/user/UserTestData.java @@ -111,8 +111,9 @@ public final class UserTestData */ public static User createTrillian() { - return new User("trillian", "Tricia McMillan", - "tricia.mcmillan@hitchhiker.com"); + User user = new User("trillian", "Tricia McMillan", "tricia.mcmillan@hitchhiker.com"); + user.setType("xml"); + return user; } /** @@ -123,7 +124,8 @@ public final class UserTestData */ public static User createZaphod() { - return new User("zaphod", "Zaphod Beeblebrox", - "zaphod.beeblebrox@hitchhiker.com"); + User user = new User("zaphod", "Zaphod Beeblebrox", "zaphod.beeblebrox@hitchhiker.com"); + user.setType("xml"); + return user; } } diff --git a/scm-webapp/pom.xml b/scm-webapp/pom.xml index b34da3454e..89c5453ca0 100644 --- a/scm-webapp/pom.xml +++ b/scm-webapp/pom.xml @@ -99,6 +99,12 @@ jackson-datatype-jsr310 ${jackson.version} + + javax + javaee-api + 7.0 + test + @@ -131,7 +137,11 @@ org.jboss.resteasy resteasy-servlet-initializer - + + org.jboss.resteasy + resteasy-validator-provider-11 + ${resteasy.version} + diff --git a/scm-webapp/src/main/java/sonia/scm/ClassOverride.java b/scm-webapp/src/main/java/sonia/scm/ClassOverride.java index 63d4c8339b..8741ce85af 100644 --- a/scm-webapp/src/main/java/sonia/scm/ClassOverride.java +++ b/scm-webapp/src/main/java/sonia/scm/ClassOverride.java @@ -34,13 +34,14 @@ package sonia.scm; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -97,7 +98,7 @@ public class ClassOverride implements Validateable public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("bind", bind) .add("to", to) .toString(); diff --git a/scm-webapp/src/main/java/sonia/scm/ManagerDaoAdapter.java b/scm-webapp/src/main/java/sonia/scm/ManagerDaoAdapter.java index abc9ab2fd9..e2a1f29a33 100644 --- a/scm-webapp/src/main/java/sonia/scm/ManagerDaoAdapter.java +++ b/scm-webapp/src/main/java/sonia/scm/ManagerDaoAdapter.java @@ -7,19 +7,15 @@ import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier; -public class ManagerDaoAdapter { +public class ManagerDaoAdapter { private final GenericDAO dao; - private final Function notFoundException; - private final Function alreadyExistsException; - public ManagerDaoAdapter(GenericDAO dao, Function notFoundException, Function alreadyExistsException) { + public ManagerDaoAdapter(GenericDAO dao) { this.dao = dao; - this.notFoundException = notFoundException; - this.alreadyExistsException = alreadyExistsException; } - public void modify(T object, Function permissionCheck, AroundHandler beforeUpdate, AroundHandler afterUpdate) throws E { + public void modify(T object, Function permissionCheck, AroundHandler beforeUpdate, AroundHandler afterUpdate) throws NotFoundException { T notModified = dao.get(object.getId()); if (notModified != null) { permissionCheck.apply(notModified).check(); @@ -34,19 +30,19 @@ public class ManagerDaoAdapter { afterUpdate.handle(notModified); } else { - throw notFoundException.apply(object); + throw new NotFoundException(); } } - public T create(T newObject, Supplier permissionCheck, AroundHandler beforeCreate, AroundHandler afterCreate) throws E { + public T create(T newObject, Supplier permissionCheck, AroundHandler beforeCreate, AroundHandler afterCreate) throws AlreadyExistsException { return create(newObject, permissionCheck, beforeCreate, afterCreate, dao::contains); } - public T create(T newObject, Supplier permissionCheck, AroundHandler beforeCreate, AroundHandler afterCreate, Predicate existsCheck) throws E { + public T create(T newObject, Supplier permissionCheck, AroundHandler beforeCreate, AroundHandler afterCreate, Predicate existsCheck) throws AlreadyExistsException { permissionCheck.get().check(); AssertUtil.assertIsValid(newObject); if (existsCheck.test(newObject)) { - throw alreadyExistsException.apply(newObject); + throw new AlreadyExistsException(); } newObject.setCreationDate(System.currentTimeMillis()); beforeCreate.handle(newObject); @@ -55,19 +51,19 @@ public class ManagerDaoAdapter { return newObject; } - public void delete(T toDelete, Supplier permissionCheck, AroundHandler beforeDelete, AroundHandler afterDelete) throws E { + public void delete(T toDelete, Supplier permissionCheck, AroundHandler beforeDelete, AroundHandler afterDelete) throws NotFoundException { permissionCheck.get().check(); if (dao.contains(toDelete)) { beforeDelete.handle(toDelete); dao.delete(toDelete); afterDelete.handle(toDelete); } else { - throw notFoundException.apply(toDelete); + throw new NotFoundException(); } } @FunctionalInterface - public interface AroundHandler { - void handle(T notModified) throws E; + public interface AroundHandler { + void handle(T notModified); } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/UserAlreadyExistsExceptionMapper.java b/scm-webapp/src/main/java/sonia/scm/api/rest/AlreadyExistsExceptionMapper.java similarity index 53% rename from scm-webapp/src/main/java/sonia/scm/api/rest/UserAlreadyExistsExceptionMapper.java rename to scm-webapp/src/main/java/sonia/scm/api/rest/AlreadyExistsExceptionMapper.java index ef0cc8b0a4..28240482e5 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/UserAlreadyExistsExceptionMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/AlreadyExistsExceptionMapper.java @@ -1,6 +1,6 @@ package sonia.scm.api.rest; -import sonia.scm.user.UserAlreadyExistsException; +import sonia.scm.AlreadyExistsException; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; @@ -8,9 +8,9 @@ import javax.ws.rs.ext.ExceptionMapper; import javax.ws.rs.ext.Provider; @Provider -public class UserAlreadyExistsExceptionMapper implements ExceptionMapper { +public class AlreadyExistsExceptionMapper implements ExceptionMapper { @Override - public Response toResponse(UserAlreadyExistsException exception) { + public Response toResponse(AlreadyExistsException exception) { return Response.status(Status.CONFLICT).build(); } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/ConcurrentModificationExceptionMapper.java b/scm-webapp/src/main/java/sonia/scm/api/rest/ConcurrentModificationExceptionMapper.java new file mode 100644 index 0000000000..d01b2fd7de --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/ConcurrentModificationExceptionMapper.java @@ -0,0 +1,15 @@ +package sonia.scm.api.rest; + +import sonia.scm.ConcurrentModificationException; + +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; + +@Provider +public class ConcurrentModificationExceptionMapper implements ExceptionMapper { + @Override + public Response toResponse(ConcurrentModificationException exception) { + return Response.status(Response.Status.CONFLICT).build(); + } +} diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/GroupAlreadyExistsExceptionMapper.java b/scm-webapp/src/main/java/sonia/scm/api/rest/GroupAlreadyExistsExceptionMapper.java deleted file mode 100644 index 43c0d1ff32..0000000000 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/GroupAlreadyExistsExceptionMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package sonia.scm.api.rest; - -import sonia.scm.group.GroupAlreadyExistsException; - -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; -import javax.ws.rs.ext.ExceptionMapper; -import javax.ws.rs.ext.Provider; - -@Provider -public class GroupAlreadyExistsExceptionMapper implements ExceptionMapper { - @Override - public Response toResponse(GroupAlreadyExistsException exception) { - return Response.status(Status.CONFLICT).build(); - } -} diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/Permission.java b/scm-webapp/src/main/java/sonia/scm/api/rest/Permission.java index cab11840df..ba707c19c2 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/Permission.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/Permission.java @@ -34,15 +34,15 @@ package sonia.scm.api.rest; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; +import java.io.Serializable; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -127,7 +127,7 @@ public class Permission implements Serializable public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("id", id) .add("value", value) .toString(); diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/RepositoryAlreadyExistsExceptionMapper.java b/scm-webapp/src/main/java/sonia/scm/api/rest/RepositoryAlreadyExistsExceptionMapper.java deleted file mode 100644 index e69b9e98d6..0000000000 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/RepositoryAlreadyExistsExceptionMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package sonia.scm.api.rest; - -import sonia.scm.repository.RepositoryAlreadyExistsException; - -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; -import javax.ws.rs.ext.ExceptionMapper; -import javax.ws.rs.ext.Provider; - -@Provider -public class RepositoryAlreadyExistsExceptionMapper implements ExceptionMapper { - @Override - public Response toResponse(RepositoryAlreadyExistsException exception) { - return Response.status(Status.CONFLICT).build(); - } -} diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/RestExceptionResult.java b/scm-webapp/src/main/java/sonia/scm/api/rest/RestExceptionResult.java index 42130a0a35..5c0e048b78 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/RestExceptionResult.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/RestExceptionResult.java @@ -34,15 +34,16 @@ package sonia.scm.api.rest; //~--- non-JDK imports -------------------------------------------------------- +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.base.Throwables; -//~--- JDK imports ------------------------------------------------------------ - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -145,7 +146,7 @@ public class RestExceptionResult public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("message", message) .add("stacktrace", stacktrace) .toString(); diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AbstractManagerResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AbstractManagerResource.java index 2ad7a64255..f00072cdcb 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AbstractManagerResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/AbstractManagerResource.java @@ -48,8 +48,13 @@ import sonia.scm.util.AssertUtil; import sonia.scm.util.HttpUtil; import sonia.scm.util.Util; -import javax.ws.rs.core.*; +import javax.ws.rs.core.CacheControl; +import javax.ws.rs.core.EntityTag; +import javax.ws.rs.core.GenericEntity; +import javax.ws.rs.core.Request; +import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; +import javax.ws.rs.core.UriInfo; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; @@ -61,28 +66,19 @@ import java.util.Date; //~--- JDK imports ------------------------------------------------------------ -/** - * - * @author Sebastian Sdorra - * - * @param - * @param - */ -public abstract class AbstractManagerResource -{ +public abstract class AbstractManagerResource { /** the logger for AbstractManagerResource */ private static final Logger logger = LoggerFactory.getLogger(AbstractManagerResource.class); - protected final Manager manager; + protected final Manager manager; private final Class type; protected int cacheMaxAge = 0; protected boolean disableCache = false; - public AbstractManagerResource(Manager manager, Class type) { + public AbstractManagerResource(Manager manager, Class type) { this.manager = manager; this.type = type; } diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/BrowserStreamingOutput.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/BrowserStreamingOutput.java index 73f59f14da..2c78df627b 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/BrowserStreamingOutput.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/BrowserStreamingOutput.java @@ -1,44 +1,8 @@ -/** - * 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.api.rest.resources; -//~--- non-JDK imports -------------------------------------------------------- - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.repository.PathNotFoundException; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RevisionNotFoundException; import sonia.scm.repository.api.CatCommandBuilder; import sonia.scm.repository.api.RepositoryService; @@ -50,97 +14,40 @@ import javax.ws.rs.core.StreamingOutput; import java.io.IOException; import java.io.OutputStream; -/** - * - * @author Sebastian Sdorra - */ -public class BrowserStreamingOutput implements StreamingOutput -{ +public class BrowserStreamingOutput implements StreamingOutput { - /** the logger for BrowserStreamingOutput */ private static final Logger logger = LoggerFactory.getLogger(BrowserStreamingOutput.class); - //~--- constructors --------------------------------------------------------- + private final CatCommandBuilder builder; + private final String path; + private final RepositoryService repositoryService; - /** - * Constructs ... - * - * - * @param browser - * @param revision - * - * @param repositoryService - * - * @param builder - * @param path - */ public BrowserStreamingOutput(RepositoryService repositoryService, - CatCommandBuilder builder, String path) - { + CatCommandBuilder builder, String path) { this.repositoryService = repositoryService; this.builder = builder; this.path = path; } - //~--- methods -------------------------------------------------------------- - - /** - * Method description - * - * - * @param output - * - * @throws IOException - * @throws WebApplicationException - */ @Override - public void write(OutputStream output) - throws IOException, WebApplicationException - { - try - { + public void write(OutputStream output) throws IOException { + try { builder.retriveContent(output, path); - } - catch (PathNotFoundException ex) - { - if (logger.isWarnEnabled()) - { + } catch (PathNotFoundException ex) { + if (logger.isWarnEnabled()) { logger.warn("could not find path {}", ex.getPath()); } throw new WebApplicationException(Response.Status.NOT_FOUND); - } - catch (RevisionNotFoundException ex) - { - if (logger.isWarnEnabled()) - { + } catch (RevisionNotFoundException ex) { + if (logger.isWarnEnabled()) { logger.warn("could not find revision {}", ex.getRevision()); } throw new WebApplicationException(Response.Status.NOT_FOUND); - } - catch (RepositoryException ex) - { - logger.error("could not write content to page", ex); - - throw new WebApplicationException(ex, - Response.Status.INTERNAL_SERVER_ERROR); - } - finally - { + } finally { IOUtil.close(repositoryService); } } - - //~--- fields --------------------------------------------------------------- - - /** Field description */ - private final CatCommandBuilder builder; - - /** Field description */ - private final String path; - - /** Field description */ - private final RepositoryService repositoryService; } diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/ChangePasswordResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/ChangePasswordResource.java index 7aed8dde0b..95f729c2a3 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/ChangePasswordResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/ChangePasswordResource.java @@ -39,26 +39,20 @@ import com.google.inject.Inject; import com.webcohesion.enunciate.metadata.rs.ResponseCode; import com.webcohesion.enunciate.metadata.rs.StatusCodes; import com.webcohesion.enunciate.metadata.rs.TypeHint; - import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.credential.PasswordService; import org.apache.shiro.subject.Subject; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - +import sonia.scm.ConcurrentModificationException; +import sonia.scm.NotFoundException; import sonia.scm.api.rest.RestActionResult; import sonia.scm.security.Role; import sonia.scm.security.ScmSecurityException; import sonia.scm.user.User; -import sonia.scm.user.UserException; import sonia.scm.user.UserManager; import sonia.scm.util.AssertUtil; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.IOException; - import javax.ws.rs.FormParam; import javax.ws.rs.POST; import javax.ws.rs.Path; @@ -67,6 +61,8 @@ import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +//~--- JDK imports ------------------------------------------------------------ + /** * Resource to change the password of the authenticated user. * @@ -104,11 +100,6 @@ public class ChangePasswordResource * * @param oldPassword old password of the current user * @param newPassword new password for the current user - * - * @return - * - * @throws IOException - * @throws UserException */ @POST @TypeHint(RestActionResult.class) @@ -118,10 +109,7 @@ public class ChangePasswordResource @ResponseCode(code = 500, condition = "internal server error") }) @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - public Response changePassword(@FormParam("old-password") String oldPassword, - @FormParam("new-password") String newPassword) - throws UserException, IOException - { + public Response changePassword(@FormParam("old-password") String oldPassword, @FormParam("new-password") String newPassword) throws NotFoundException, ConcurrentModificationException { AssertUtil.assertIsNotEmpty(oldPassword); AssertUtil.assertIsNotEmpty(newPassword); diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/DiffStreamingOutput.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/DiffStreamingOutput.java index fc0f3751e5..db29725917 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/DiffStreamingOutput.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/DiffStreamingOutput.java @@ -35,26 +35,20 @@ package sonia.scm.api.rest.resources; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.io.Closeables; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -import sonia.scm.repository.PathNotFoundException; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RevisionNotFoundException; import sonia.scm.repository.api.DiffCommandBuilder; import sonia.scm.repository.api.RepositoryService; - -//~--- JDK imports ------------------------------------------------------------ - -import java.io.IOException; -import java.io.OutputStream; +import sonia.scm.util.IOUtil; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import javax.ws.rs.core.StreamingOutput; -import sonia.scm.util.IOUtil; +import java.io.IOException; +import java.io.OutputStream; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -96,22 +90,11 @@ public class DiffStreamingOutput implements StreamingOutput * @throws WebApplicationException */ @Override - public void write(OutputStream output) - throws IOException, WebApplicationException - { + public void write(OutputStream output) throws IOException { try { builder.retriveContent(output); } - catch (PathNotFoundException ex) - { - if (logger.isWarnEnabled()) - { - logger.warn("could not find path {}", ex.getPath()); - } - - throw new WebApplicationException(Response.Status.NOT_FOUND); - } catch (RevisionNotFoundException ex) { if (logger.isWarnEnabled()) @@ -121,13 +104,13 @@ public class DiffStreamingOutput implements StreamingOutput throw new WebApplicationException(Response.Status.NOT_FOUND); } - catch (RepositoryException ex) - { - logger.error("could not write content to page", ex); - - throw new WebApplicationException(ex, - Response.Status.INTERNAL_SERVER_ERROR); - } +// catch (RepositoryException ex) +// { +// logger.error("could not write content to page", ex); +// +// throw new WebApplicationException(ex, +// Response.Status.INTERNAL_SERVER_ERROR); +// } finally { IOUtil.close(repositoryService); diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/GroupResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/GroupResource.java index 42816abd93..a560cc278e 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/GroupResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/GroupResource.java @@ -43,12 +43,25 @@ import com.webcohesion.enunciate.metadata.rs.StatusCodes; import com.webcohesion.enunciate.metadata.rs.TypeHint; import org.apache.shiro.SecurityUtils; import sonia.scm.group.Group; -import sonia.scm.group.GroupException; import sonia.scm.group.GroupManager; import sonia.scm.security.Role; -import javax.ws.rs.*; -import javax.ws.rs.core.*; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.GenericEntity; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Request; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; import java.util.Collection; //~--- JDK imports ------------------------------------------------------------ @@ -60,23 +73,13 @@ import java.util.Collection; */ @Path("groups") @Singleton -public class GroupResource - extends AbstractManagerResource -{ +public class GroupResource extends AbstractManagerResource { /** Field description */ public static final String PATH_PART = "groups"; //~--- constructors --------------------------------------------------------- - /** - * Constructs ... - * - * - * - * @param securityContextProvider - * @param groupManager - */ @Inject public GroupResource(GroupManager groupManager) { diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryImportResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryImportResource.java index 1b25fc3f79..8a5ba8b1e3 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryImportResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/RepositoryImportResource.java @@ -33,9 +33,7 @@ package sonia.scm.api.rest.resources; -//~--- non-JDK imports -------------------------------------------------------- - -import com.google.common.base.Objects; +import com.google.common.base.MoreObjects; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import com.google.common.io.Files; @@ -47,6 +45,8 @@ import com.webcohesion.enunciate.metadata.rs.TypeHint; import org.apache.shiro.SecurityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import sonia.scm.AlreadyExistsException; +import sonia.scm.NotFoundException; import sonia.scm.NotSupportedFeatuerException; import sonia.scm.Type; import sonia.scm.api.rest.RestActionUploadResult; @@ -75,8 +75,6 @@ import java.util.Set; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; -//~--- JDK imports ------------------------------------------------------------ - /** * Rest resource for importing repositories. * @@ -256,10 +254,6 @@ public class RepositoryImportResource service = serviceFactory.create(repository); service.getPullCommand().pull(request.getUrl()); } - catch (RepositoryException ex) - { - handleImportFailure(ex, repository); - } catch (IOException ex) { handleImportFailure(ex, repository); @@ -413,11 +407,6 @@ public class RepositoryImportResource logger.warn("exception occured durring directory import", ex); response = Response.serverError().build(); } - catch (RepositoryException ex) - { - logger.warn("exception occured durring directory import", ex); - response = Response.serverError().build(); - } } else { @@ -526,14 +515,14 @@ public class RepositoryImportResource // repository = new Repository(null, type, name); manager.create(repository); } - catch (RepositoryAlreadyExistsException ex) + catch (AlreadyExistsException ex) { logger.warn("a {} repository with the name {} already exists", type, name); throw new WebApplicationException(Response.Status.CONFLICT); } - catch (RepositoryException ex) + catch (InternalRepositoryException ex) { handleGenericCreationFailure(ex, type, name); } @@ -583,11 +572,7 @@ public class RepositoryImportResource service = serviceFactory.create(repository); service.getUnbundleCommand().setCompressed(compressed).unbundle(file); } - catch (RepositoryException ex) - { - handleImportFailure(ex, repository); - } - catch (IOException ex) + catch (InternalRepositoryException ex) { handleImportFailure(ex, repository); } @@ -685,9 +670,9 @@ public class RepositoryImportResource { manager.delete(repository); } - catch (RepositoryException e) + catch (InternalRepositoryException | NotFoundException e) { - logger.error("can not delete repository", e); + logger.error("can not delete repository after import failure", e); } throw new WebApplicationException(ex, @@ -741,7 +726,7 @@ public class RepositoryImportResource { throw new WebApplicationException(ex); } - catch (RepositoryException ex) + catch (InternalRepositoryException ex) { throw new WebApplicationException(ex); } @@ -812,7 +797,7 @@ public class RepositoryImportResource public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("name", name) .add("url", url) .toString(); 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 9b9688332f..4a9fd9e38f 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 @@ -46,16 +46,51 @@ import org.apache.shiro.SecurityUtils; import org.apache.shiro.authz.AuthorizationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import sonia.scm.repository.*; -import sonia.scm.repository.api.*; +import sonia.scm.NotFoundException; +import sonia.scm.repository.BlameResult; +import sonia.scm.repository.Branches; +import sonia.scm.repository.BrowserResult; +import sonia.scm.repository.Changeset; +import sonia.scm.repository.ChangesetPagingResult; +import sonia.scm.repository.HealthChecker; +import sonia.scm.repository.Permission; +import sonia.scm.repository.Repository; +import sonia.scm.repository.RepositoryIsNotArchivedException; +import sonia.scm.repository.RepositoryManager; +import sonia.scm.repository.RepositoryNotFoundException; +import sonia.scm.repository.Tags; +import sonia.scm.repository.api.BlameCommandBuilder; +import sonia.scm.repository.api.BrowseCommandBuilder; +import sonia.scm.repository.api.CatCommandBuilder; +import sonia.scm.repository.api.CommandNotSupportedException; +import sonia.scm.repository.api.DiffCommandBuilder; +import sonia.scm.repository.api.DiffFormat; +import sonia.scm.repository.api.LogCommandBuilder; +import sonia.scm.repository.api.RepositoryService; +import sonia.scm.repository.api.RepositoryServiceFactory; import sonia.scm.util.AssertUtil; import sonia.scm.util.HttpUtil; import sonia.scm.util.IOUtil; import sonia.scm.util.Util; -import javax.ws.rs.*; -import javax.ws.rs.core.*; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.GenericEntity; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Request; +import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; +import javax.ws.rs.core.StreamingOutput; +import javax.ws.rs.core.UriInfo; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; @@ -69,7 +104,7 @@ import java.util.Collection; */ @Singleton @Path("repositories") -public class RepositoryResource extends AbstractManagerResource +public class RepositoryResource extends AbstractManagerResource { /** Field description */ @@ -169,12 +204,15 @@ public class RepositoryResource extends AbstractManagerResource +public class UserResource extends AbstractManagerResource { /** Field description */ diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/ValidationExceptionMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/ValidationExceptionMapper.java new file mode 100644 index 0000000000..c6af6b8921 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/ValidationExceptionMapper.java @@ -0,0 +1,58 @@ +package sonia.scm.api.v2; + +import lombok.Getter; +import org.jboss.resteasy.api.validation.ResteasyViolationException; + +import javax.validation.ConstraintViolation; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.List; +import java.util.stream.Collectors; + +@Provider +public class ValidationExceptionMapper implements ExceptionMapper { + + @Override + public Response toResponse(ResteasyViolationException exception) { + + List violations = + exception.getConstraintViolations() + .stream() + .map(ConstraintViolationBean::new) + .collect(Collectors.toList()); + + return Response + .status(Response.Status.BAD_REQUEST) + .type(MediaType.APPLICATION_JSON_TYPE) + .entity(new ValidationError(violations)) + .build(); + } + + @Getter + public static class ValidationError { + @XmlElement(name = "violation") + @XmlElementWrapper(name = "violations") + private List violations; + + public ValidationError(List violations) { + this.violations = violations; + } + } + + @XmlRootElement(name = "violation") + @Getter + public static class ConstraintViolationBean { + private String path; + private String message; + + public ConstraintViolationBean(ConstraintViolation violation) { + message = violation.getMessage(); + path = violation.getPropertyPath().toString(); + } + } +} diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BranchRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BranchRootResource.java index b06b5b9eba..d44a91d2c9 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BranchRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BranchRootResource.java @@ -5,7 +5,6 @@ import com.webcohesion.enunciate.metadata.rs.StatusCodes; import com.webcohesion.enunciate.metadata.rs.TypeHint; import sonia.scm.repository.Branches; import sonia.scm.repository.NamespaceAndName; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RepositoryNotFoundException; import sonia.scm.repository.api.CommandNotSupportedException; import sonia.scm.repository.api.RepositoryService; @@ -55,7 +54,7 @@ public class BranchRootResource { @ResponseCode(code = 404, condition = "not found, no branch with the specified name for the repository available or repository not found"), @ResponseCode(code = 500, condition = "internal server error") }) - public Response get(@PathParam("namespace") String namespace, @PathParam("name") String name, @PathParam("branch") String branchName) throws IOException, RepositoryException { + public Response get(@PathParam("namespace") String namespace, @PathParam("name") String name, @PathParam("branch") String branchName) throws IOException { try (RepositoryService repositoryService = servicefactory.create(new NamespaceAndName(namespace, name))) { Branches branches = repositoryService.getBranchesCommand().getBranches(); return branches.getBranches() @@ -100,7 +99,7 @@ public class BranchRootResource { @ResponseCode(code = 404, condition = "not found, no repository found for the given namespace and name"), @ResponseCode(code = 500, condition = "internal server error") }) - public Response getAll(@PathParam("namespace") String namespace, @PathParam("name") String name) throws IOException, RepositoryException { + public Response getAll(@PathParam("namespace") String namespace, @PathParam("name") String name) throws IOException { try (RepositoryService repositoryService = servicefactory.create(new NamespaceAndName(namespace, name))) { Branches branches = repositoryService.getBranchesCommand().getBranches(); return Response.ok(branchCollectionToDtoMapper.map(namespace, name, branches.getBranches())).build(); diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/CollectionResourceManagerAdapter.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/CollectionResourceManagerAdapter.java index 3169088331..3ef19f7294 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/CollectionResourceManagerAdapter.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/CollectionResourceManagerAdapter.java @@ -1,6 +1,7 @@ package sonia.scm.api.v2.resources; import de.otto.edison.hal.HalRepresentation; +import sonia.scm.AlreadyExistsException; import sonia.scm.Manager; import sonia.scm.ModelObject; import sonia.scm.PageResult; @@ -22,16 +23,14 @@ import static javax.ws.rs.core.Response.Status.BAD_REQUEST; * * @param The type of the model object, eg. {@link sonia.scm.user.User}. * @param The corresponding transport object, eg. {@link UserDto}. - * @param The exception type for the model object, eg. {@link sonia.scm.user.UserException}. * * @see SingleResourceManagerAdapter */ @SuppressWarnings("squid:S00119") // "MODEL_OBJECT" is much more meaningful than "M", right? class CollectionResourceManagerAdapter extends AbstractManagerResource { + DTO extends HalRepresentation> extends AbstractManagerResource { - CollectionResourceManagerAdapter(Manager manager, Class type) { + CollectionResourceManagerAdapter(Manager manager, Class type) { super(manager, type); } @@ -48,7 +47,7 @@ class CollectionResourceManagerAdapter modelObjectSupplier, Function uriCreator) throws EXCEPTION { + public Response create(DTO dto, Supplier modelObjectSupplier, Function uriCreator) throws AlreadyExistsException { if (dto == null) { return Response.status(BAD_REQUEST).build(); } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ContentResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ContentResource.java index 61fa86bf36..dc7c305823 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ContentResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ContentResource.java @@ -8,7 +8,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.PathNotFoundException; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RepositoryNotFoundException; import sonia.scm.repository.RevisionNotFoundException; import sonia.scm.repository.api.RepositoryService; @@ -76,12 +75,15 @@ public class ContentResource { try (RepositoryService repositoryService = serviceFactory.create(new NamespaceAndName(namespace, name))) { repositoryService.getCatCommand().setRevision(revision).retriveContent(os, path); os.close(); + } catch (RepositoryNotFoundException e) { + LOG.debug("repository {}/{} not found", path, namespace, name, e); + throw new WebApplicationException(Status.NOT_FOUND); } catch (PathNotFoundException e) { LOG.debug("path '{}' not found in repository {}/{}", path, namespace, name, e); throw new WebApplicationException(Status.NOT_FOUND); - } catch (RepositoryException e) { - LOG.info("error reading repository resource {} from {}/{}", path, namespace, name, e); - throw new WebApplicationException(Status.INTERNAL_SERVER_ERROR); + } catch (RevisionNotFoundException e) { + LOG.debug("revision '{}' not found in repository {}/{}", revision, namespace, name, e); + throw new WebApplicationException(Status.NOT_FOUND); } }; } @@ -124,7 +126,7 @@ public class ContentResource { } catch (RevisionNotFoundException e) { LOG.debug("revision '{}' not found in repository {}/{}", revision, namespace, name, e); return Response.status(Status.NOT_FOUND).build(); - } catch (IOException | RepositoryException e) { + } catch (IOException e) { LOG.info("error reading repository resource {} from {}/{}", path, namespace, name, e); return Response.status(Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } @@ -137,7 +139,7 @@ public class ContentResource { contentType.getLanguage().ifPresent(language -> responseBuilder.header("Language", language)); } - private byte[] getHead(String revision, String path, RepositoryService repositoryService) throws IOException, RepositoryException { + private byte[] getHead(String revision, String path, RepositoryService repositoryService) throws IOException, PathNotFoundException, RevisionNotFoundException { InputStream stream = repositoryService.getCatCommand().setRevision(revision).getStream(path); try { byte[] buffer = new byte[HEAD_BUFFER_SIZE]; diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupCollectionResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupCollectionResource.java index 4a9c797b9f..8abab0f720 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupCollectionResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupCollectionResource.java @@ -1,15 +1,25 @@ package sonia.scm.api.v2.resources; -import com.webcohesion.enunciate.metadata.rs.*; +import com.webcohesion.enunciate.metadata.rs.ResponseCode; +import com.webcohesion.enunciate.metadata.rs.ResponseHeader; +import com.webcohesion.enunciate.metadata.rs.ResponseHeaders; +import com.webcohesion.enunciate.metadata.rs.StatusCodes; +import com.webcohesion.enunciate.metadata.rs.TypeHint; +import sonia.scm.AlreadyExistsException; import sonia.scm.group.Group; -import sonia.scm.group.GroupException; import sonia.scm.group.GroupManager; import sonia.scm.web.VndMediaType; import javax.inject.Inject; -import javax.ws.rs.*; +import javax.validation.Valid; +import javax.ws.rs.Consumes; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.Response; -import java.io.IOException; public class GroupCollectionResource { @@ -19,7 +29,7 @@ public class GroupCollectionResource { private final GroupCollectionToDtoMapper groupCollectionToDtoMapper; private final ResourceLinks resourceLinks; - private final IdResourceManagerAdapter adapter; + private final IdResourceManagerAdapter adapter; @Inject public GroupCollectionResource(GroupManager manager, GroupDtoToGroupMapper dtoToGroupMapper, GroupCollectionToDtoMapper groupCollectionToDtoMapper, ResourceLinks resourceLinks) { @@ -76,7 +86,7 @@ public class GroupCollectionResource { }) @TypeHint(TypeHint.NO_CONTENT.class) @ResponseHeaders(@ResponseHeader(name = "Location", description = "uri to the created group")) - public Response create(GroupDto groupDto) throws IOException, GroupException { + public Response create(@Valid GroupDto groupDto) throws AlreadyExistsException { return adapter.create(groupDto, () -> dtoToGroupMapper.map(groupDto), group -> resourceLinks.group().self(group.getName())); diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupDto.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupDto.java index cb05da6568..b847412a33 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupDto.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupDto.java @@ -6,7 +6,9 @@ import de.otto.edison.hal.Links; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.hibernate.validator.constraints.NotEmpty; +import javax.validation.constraints.Pattern; import java.time.Instant; import java.util.List; import java.util.Map; @@ -18,7 +20,9 @@ public class GroupDto extends HalRepresentation { private String description; @JsonInclude(JsonInclude.Include.NON_NULL) private Instant lastModified; + @Pattern(regexp = "^[A-z0-9\\.\\-_@]|[^ ]([A-z0-9\\.\\-_@ ]*[A-z0-9\\.\\-_@]|[^ ])?$") private String name; + @NotEmpty private String type; private Map properties; private List members; diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupDtoToGroupMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupDtoToGroupMapper.java index 44c4f75eef..be1aca5814 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupDtoToGroupMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupDtoToGroupMapper.java @@ -4,12 +4,12 @@ import org.mapstruct.Mapper; import org.mapstruct.Mapping; import sonia.scm.group.Group; +import java.time.Instant; + @Mapper -public abstract class GroupDtoToGroupMapper { +public abstract class GroupDtoToGroupMapper extends BaseDtoMapper { @Mapping(target = "creationDate", ignore = true) - @Mapping(target = "lastModified", ignore = true) public abstract Group map(GroupDto groupDto); - } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupResource.java index 10818ec953..ffa9a9ec08 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/GroupResource.java @@ -3,20 +3,28 @@ package sonia.scm.api.v2.resources; import com.webcohesion.enunciate.metadata.rs.ResponseCode; import com.webcohesion.enunciate.metadata.rs.StatusCodes; import com.webcohesion.enunciate.metadata.rs.TypeHint; +import sonia.scm.ConcurrentModificationException; +import sonia.scm.NotFoundException; import sonia.scm.group.Group; -import sonia.scm.group.GroupException; import sonia.scm.group.GroupManager; import sonia.scm.web.VndMediaType; import javax.inject.Inject; -import javax.ws.rs.*; +import javax.validation.Valid; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; import javax.ws.rs.core.Response; public class GroupResource { private final GroupToGroupDtoMapper groupToGroupDtoMapper; private final GroupDtoToGroupMapper dtoToGroupMapper; - private final IdResourceManagerAdapter adapter; + private final IdResourceManagerAdapter adapter; @Inject public GroupResource(GroupManager manager, GroupToGroupDtoMapper groupToGroupDtoMapper, @@ -45,7 +53,7 @@ public class GroupResource { @ResponseCode(code = 404, condition = "not found, no group with the specified id/name available"), @ResponseCode(code = 500, condition = "internal server error") }) - public Response get(@PathParam("id") String id) { + public Response get(@PathParam("id") String id) throws NotFoundException { return adapter.get(id, groupToGroupDtoMapper::map); } @@ -90,7 +98,7 @@ public class GroupResource { @ResponseCode(code = 500, condition = "internal server error") }) @TypeHint(TypeHint.NO_CONTENT.class) - public Response update(@PathParam("id") String name, GroupDto groupDto) { + public Response update(@PathParam("id") String name, @Valid GroupDto groupDto) throws NotFoundException, ConcurrentModificationException { return adapter.update(name, existing -> dtoToGroupMapper.map(groupDto)); } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IdResourceManagerAdapter.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IdResourceManagerAdapter.java index ded4bff309..27abed637e 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IdResourceManagerAdapter.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IdResourceManagerAdapter.java @@ -1,12 +1,14 @@ package sonia.scm.api.v2.resources; import de.otto.edison.hal.HalRepresentation; +import sonia.scm.AlreadyExistsException; +import sonia.scm.ConcurrentModificationException; import sonia.scm.Manager; import sonia.scm.ModelObject; +import sonia.scm.NotFoundException; import sonia.scm.PageResult; import javax.ws.rs.core.Response; -import java.io.IOException; import java.util.Optional; import java.util.function.Function; import java.util.function.Predicate; @@ -18,25 +20,24 @@ import java.util.function.Supplier; */ @SuppressWarnings("squid:S00119") // "MODEL_OBJECT" is much more meaningful than "M", right? class IdResourceManagerAdapter { + DTO extends HalRepresentation> { - private final Manager manager; + private final Manager manager; - private final SingleResourceManagerAdapter singleAdapter; - private final CollectionResourceManagerAdapter collectionAdapter; + private final SingleResourceManagerAdapter singleAdapter; + private final CollectionResourceManagerAdapter collectionAdapter; - IdResourceManagerAdapter(Manager manager, Class type) { + IdResourceManagerAdapter(Manager manager, Class type) { this.manager = manager; singleAdapter = new SingleResourceManagerAdapter<>(manager, type); collectionAdapter = new CollectionResourceManagerAdapter<>(manager, type); } - Response get(String id, Function mapToDto) { + Response get(String id, Function mapToDto) throws NotFoundException { return singleAdapter.get(loadBy(id), mapToDto); } - public Response update(String id, Function applyChanges) { + public Response update(String id, Function applyChanges) throws NotFoundException, ConcurrentModificationException { return singleAdapter.update( loadBy(id), applyChanges, @@ -48,7 +49,7 @@ class IdResourceManagerAdapter modelObjectSupplier, Function uriCreator) throws IOException, EXCEPTION { + public Response create(DTO dto, Supplier modelObjectSupplier, Function uriCreator) throws AlreadyExistsException { return collectionAdapter.create(dto, modelObjectSupplier, uriCreator); } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/MeResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/MeResource.java index f9a32c7ddd..f016f4604c 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/MeResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/MeResource.java @@ -4,8 +4,8 @@ import com.webcohesion.enunciate.metadata.rs.ResponseCode; import com.webcohesion.enunciate.metadata.rs.StatusCodes; import com.webcohesion.enunciate.metadata.rs.TypeHint; import org.apache.shiro.SecurityUtils; +import sonia.scm.NotFoundException; import sonia.scm.user.User; -import sonia.scm.user.UserException; import sonia.scm.user.UserManager; import sonia.scm.web.VndMediaType; @@ -28,7 +28,7 @@ public class MeResource { private final UserToUserDtoMapper userToDtoMapper; - private final IdResourceManagerAdapter adapter; + private final IdResourceManagerAdapter adapter; @Inject public MeResource(UserToUserDtoMapper userToDtoMapper, UserManager manager) { this.userToDtoMapper = userToDtoMapper; @@ -47,7 +47,7 @@ public class MeResource { @ResponseCode(code = 401, condition = "not authenticated / invalid credentials"), @ResponseCode(code = 500, condition = "internal server error") }) - public Response get(@Context Request request, @Context UriInfo uriInfo) { + public Response get(@Context Request request, @Context UriInfo uriInfo) throws NotFoundException { String id = (String) SecurityUtils.getSubject().getPrincipals().getPrimaryPrincipal(); return adapter.get(id, userToDtoMapper::map); diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionNotFoundExceptionMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/NotFoundExceptionMapper.java similarity index 86% rename from scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionNotFoundExceptionMapper.java rename to scm-webapp/src/main/java/sonia/scm/api/v2/resources/NotFoundExceptionMapper.java index 61d62ecac5..04264a7629 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionNotFoundExceptionMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/NotFoundExceptionMapper.java @@ -31,8 +31,8 @@ package sonia.scm.api.v2.resources; +import sonia.scm.NotFoundException; import sonia.scm.api.rest.StatusExceptionMapper; -import sonia.scm.repository.PermissionNotFoundException; import javax.ws.rs.core.Response; import javax.ws.rs.ext.Provider; @@ -41,9 +41,9 @@ import javax.ws.rs.ext.Provider; * @since 2.0.0 */ @Provider -public class PermissionNotFoundExceptionMapper extends StatusExceptionMapper { +public class NotFoundExceptionMapper extends StatusExceptionMapper { - public PermissionNotFoundExceptionMapper() { - super(PermissionNotFoundException.class, Response.Status.NOT_FOUND); + public NotFoundExceptionMapper() { + super(NotFoundException.class, Response.Status.NOT_FOUND); } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionAlreadyExistsExceptionMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionAlreadyExistsExceptionMapper.java deleted file mode 100644 index d654f8bca7..0000000000 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionAlreadyExistsExceptionMapper.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - Copyright (c) 2014, 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.api.v2.resources; - - -import sonia.scm.api.rest.StatusExceptionMapper; -import sonia.scm.repository.PermissionAlreadyExistsException; - -import javax.ws.rs.core.Response; -import javax.ws.rs.ext.Provider; - -/** - * @since 2.0.0 - */ -@Provider -public class PermissionAlreadyExistsExceptionMapper extends StatusExceptionMapper { - - public PermissionAlreadyExistsExceptionMapper() { - super(PermissionAlreadyExistsException.class, Response.Status.CONFLICT); - } -} diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionRootResource.java index 60153c5fbf..2b53192542 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionRootResource.java @@ -6,12 +6,11 @@ import com.webcohesion.enunciate.metadata.rs.StatusCodes; import com.webcohesion.enunciate.metadata.rs.TypeHint; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; +import sonia.scm.AlreadyExistsException; +import sonia.scm.NotFoundException; import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.Permission; -import sonia.scm.repository.PermissionAlreadyExistsException; -import sonia.scm.repository.PermissionNotFoundException; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryNotFoundException; import sonia.scm.repository.RepositoryPermissions; @@ -68,7 +67,7 @@ public class PermissionRootResource { @TypeHint(TypeHint.NO_CONTENT.class) @Consumes(VndMediaType.PERMISSION) @Path("") - public Response create(@PathParam("namespace") String namespace, @PathParam("name") String name, PermissionDto permission) throws RepositoryException { + public Response create(@PathParam("namespace") String namespace, @PathParam("name") String name, PermissionDto permission) throws Exception { log.info("try to add new permission: {}", permission); Repository repository = load(namespace, name); RepositoryPermissions.permissionWrite(repository).check(); @@ -85,7 +84,7 @@ public class PermissionRootResource { * @param namespace the repository namespace * @param name the repository name * @return the http response with a list of permissionDto objects - * @throws RepositoryNotFoundException if the repository does not exists + * @throws NotFoundException if the repository does not exists */ @GET @StatusCodes({ @@ -96,7 +95,7 @@ public class PermissionRootResource { @Produces(VndMediaType.PERMISSION) @TypeHint(PermissionDto.class) @Path("{permission-name}") - public Response get(@PathParam("namespace") String namespace, @PathParam("name") String name, @PathParam("permission-name") String permissionName) throws RepositoryException { + public Response get(@PathParam("namespace") String namespace, @PathParam("name") String name, @PathParam("permission-name") String permissionName) throws NotFoundException { Repository repository = load(namespace, name); RepositoryPermissions.permissionRead(repository).check(); return Response.ok( @@ -105,7 +104,7 @@ public class PermissionRootResource { .filter(permission -> permissionName.equals(permission.getName())) .map(permission -> modelToDtoMapper.map(permission, repository)) .findFirst() - .orElseThrow(() -> new PermissionNotFoundException(repository, permissionName)) + .orElseThrow(NotFoundException::new) ).build(); } @@ -116,7 +115,7 @@ public class PermissionRootResource { * @param namespace the repository namespace * @param name the repository name * @return the http response with a list of permissionDto objects - * @throws RepositoryNotFoundException if the repository does not exists + * @throws NotFoundException if the repository does not exists */ @GET @StatusCodes({ @@ -153,7 +152,7 @@ public class PermissionRootResource { public Response update(@PathParam("namespace") String namespace, @PathParam("name") String name, @PathParam("permission-name") String permissionName, - PermissionDto permission) throws RepositoryException { + PermissionDto permission) throws NotFoundException { log.info("try to update the permission with name: {}. the modified permission is: {}", permissionName, permission); Repository repository = load(namespace, name); RepositoryPermissions.permissionWrite(repository).check(); @@ -161,7 +160,7 @@ public class PermissionRootResource { .stream() .filter(perm -> StringUtils.isNotBlank(perm.getName()) && perm.getName().equals(permissionName)) .findFirst() - .orElseThrow(() -> new PermissionNotFoundException(repository, permissionName)); + .orElseThrow(() -> new NotFoundException()); dtoToModelMapper.modify(existingPermission, permission); manager.modify(repository); log.info("the permission with name: {} is updated.", permissionName); @@ -185,9 +184,9 @@ public class PermissionRootResource { @Path("{permission-name}") public Response delete(@PathParam("namespace") String namespace, @PathParam("name") String name, - @PathParam("permission-name") String permissionName) throws RepositoryException { + @PathParam("permission-name") String permissionName) throws NotFoundException { log.info("try to delete the permission with name: {}.", permissionName); - Repository repository = load(namespace, name); + Repository repository = load(namespace, name); RepositoryPermissions.modify(repository).check(); repository.getPermissions() .stream() @@ -220,14 +219,14 @@ public class PermissionRootResource { * * @param permission the searched permission * @param repository the repository to be inspected - * @throws PermissionAlreadyExistsException if the permission already exists in the repository + * @throws AlreadyExistsException if the permission already exists in the repository */ - private void checkPermissionAlreadyExists(PermissionDto permission, Repository repository) throws PermissionAlreadyExistsException { + private void checkPermissionAlreadyExists(PermissionDto permission, Repository repository) throws AlreadyExistsException { boolean isPermissionAlreadyExist = repository.getPermissions() .stream() .anyMatch(p -> p.getName().equals(permission.getName())); if (isPermissionAlreadyExist) { - throw new PermissionAlreadyExistsException(repository, permission.getName()); + throw new AlreadyExistsException(); } } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionToPermissionDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionToPermissionDtoMapper.java index 5a6fffc33a..6938c9059c 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionToPermissionDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PermissionToPermissionDtoMapper.java @@ -48,4 +48,3 @@ public abstract class PermissionToPermissionDtoMapper { target.add(linksBuilder.build()); } } - diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryCollectionResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryCollectionResource.java index c6d54e7f4e..9f4858d2f6 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryCollectionResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryCollectionResource.java @@ -1,20 +1,31 @@ package sonia.scm.api.v2.resources; -import com.webcohesion.enunciate.metadata.rs.*; +import com.webcohesion.enunciate.metadata.rs.ResponseCode; +import com.webcohesion.enunciate.metadata.rs.ResponseHeader; +import com.webcohesion.enunciate.metadata.rs.ResponseHeaders; +import com.webcohesion.enunciate.metadata.rs.StatusCodes; +import com.webcohesion.enunciate.metadata.rs.TypeHint; +import sonia.scm.AlreadyExistsException; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RepositoryManager; import sonia.scm.web.VndMediaType; import javax.inject.Inject; -import javax.ws.rs.*; +import javax.validation.Valid; +import javax.ws.rs.Consumes; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.Response; public class RepositoryCollectionResource { private static final int DEFAULT_PAGE_SIZE = 10; - private final CollectionResourceManagerAdapter adapter; + private final CollectionResourceManagerAdapter adapter; private final RepositoryCollectionToDtoMapper repositoryCollectionToDtoMapper; private final RepositoryDtoToRepositoryMapper dtoToRepositoryMapper; private final ResourceLinks resourceLinks; @@ -76,7 +87,7 @@ public class RepositoryCollectionResource { }) @TypeHint(TypeHint.NO_CONTENT.class) @ResponseHeaders(@ResponseHeader(name = "Location", description = "uri to the created repository")) - public Response create(RepositoryDto repositoryDto) throws RepositoryException { + public Response create(@Valid RepositoryDto repositoryDto) throws AlreadyExistsException { return adapter.create(repositoryDto, () -> dtoToRepositoryMapper.map(repositoryDto, null), repository -> resourceLinks.repository().self(repository.getNamespace(), repository.getName())); diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryDto.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryDto.java index bcc8e16ebb..c597e12d4f 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryDto.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryDto.java @@ -5,7 +5,10 @@ import de.otto.edison.hal.HalRepresentation; import de.otto.edison.hal.Links; import lombok.Getter; import lombok.Setter; +import org.hibernate.validator.constraints.Email; +import org.hibernate.validator.constraints.NotEmpty; +import javax.validation.constraints.Pattern; import java.time.Instant; import java.util.List; import java.util.Map; @@ -13,6 +16,7 @@ import java.util.Map; @Getter @Setter public class RepositoryDto extends HalRepresentation { + @Email private String contact; private Instant creationDate; private String description; @@ -20,8 +24,10 @@ public class RepositoryDto extends HalRepresentation { @JsonInclude(JsonInclude.Include.NON_NULL) private Instant lastModified; private String namespace; + @Pattern(regexp = "(?!^\\.\\.$)(?!^\\.$)(?!.*[\\\\\\[\\]])^[A-z0-9\\.][A-z0-9\\.\\-_/]*$") private String name; private boolean archived = false; + @NotEmpty private String type; protected Map properties; diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryDtoToRepositoryMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryDtoToRepositoryMapper.java index 61e953602f..b7058d2830 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryDtoToRepositoryMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryDtoToRepositoryMapper.java @@ -4,10 +4,9 @@ import org.mapstruct.*; import sonia.scm.repository.Repository; @Mapper -public abstract class RepositoryDtoToRepositoryMapper { +public abstract class RepositoryDtoToRepositoryMapper extends BaseDtoMapper { @Mapping(target = "creationDate", ignore = true) - @Mapping(target = "lastModified", ignore = true) @Mapping(target = "id", ignore = true) @Mapping(target = "publicReadable", ignore = true) @Mapping(target = "healthCheckFailures", ignore = true) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryNotFoundExceptionMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryNotFoundExceptionMapper.java deleted file mode 100644 index dcab8e4fc0..0000000000 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryNotFoundExceptionMapper.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - Copyright (c) 2014, 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.api.v2.resources; - - -import sonia.scm.api.rest.StatusExceptionMapper; -import sonia.scm.repository.RepositoryNotFoundException; - -import javax.ws.rs.core.Response; -import javax.ws.rs.ext.Provider; - -/** - * @since 2.0.0 - */ -@Provider -public class RepositoryNotFoundExceptionMapper extends StatusExceptionMapper { - - public RepositoryNotFoundExceptionMapper() { - super(RepositoryNotFoundException.class, Response.Status.NOT_FOUND); - } -} diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryResource.java index 3ee27f5f84..d2055b731d 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryResource.java @@ -3,15 +3,17 @@ package sonia.scm.api.v2.resources; import com.webcohesion.enunciate.metadata.rs.ResponseCode; import com.webcohesion.enunciate.metadata.rs.StatusCodes; import com.webcohesion.enunciate.metadata.rs.TypeHint; +import sonia.scm.ConcurrentModificationException; +import sonia.scm.NotFoundException; import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RepositoryIsNotArchivedException; import sonia.scm.repository.RepositoryManager; import sonia.scm.web.VndMediaType; import javax.inject.Inject; import javax.inject.Provider; +import javax.validation.Valid; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; @@ -30,7 +32,7 @@ public class RepositoryResource { private final RepositoryDtoToRepositoryMapper dtoToRepositoryMapper; private final RepositoryManager manager; - private final SingleResourceManagerAdapter adapter; + private final SingleResourceManagerAdapter adapter; private final Provider tagRootResource; private final Provider branchRootResource; private final Provider changesetRootResource; @@ -78,7 +80,7 @@ public class RepositoryResource { @ResponseCode(code = 404, condition = "not found, no repository with the specified name available in the namespace"), @ResponseCode(code = 500, condition = "internal server error") }) - public Response get(@PathParam("namespace") String namespace, @PathParam("name") String name) { + public Response get(@PathParam("namespace") String namespace, @PathParam("name") String name) throws NotFoundException { return adapter.get(loadBy(namespace, name), repositoryToDtoMapper::map); } @@ -125,7 +127,7 @@ public class RepositoryResource { @ResponseCode(code = 500, condition = "internal server error") }) @TypeHint(TypeHint.NO_CONTENT.class) - public Response update(@PathParam("namespace") String namespace, @PathParam("name") String name, RepositoryDto repositoryDto) { + public Response update(@PathParam("namespace") String namespace, @PathParam("name") String name, @Valid RepositoryDto repositoryDto) throws NotFoundException, ConcurrentModificationException { return adapter.update( loadBy(namespace, name), existing -> processUpdate(repositoryDto, existing), diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SingleResourceManagerAdapter.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SingleResourceManagerAdapter.java index 06195284df..fa50cdcc87 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SingleResourceManagerAdapter.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SingleResourceManagerAdapter.java @@ -1,8 +1,10 @@ package sonia.scm.api.v2.resources; import de.otto.edison.hal.HalRepresentation; +import sonia.scm.ConcurrentModificationException; import sonia.scm.Manager; import sonia.scm.ModelObject; +import sonia.scm.NotFoundException; import sonia.scm.api.rest.resources.AbstractManagerResource; import javax.ws.rs.core.GenericEntity; @@ -22,22 +24,20 @@ import static javax.ws.rs.core.Response.Status.BAD_REQUEST; * * @param The type of the model object, eg. {@link sonia.scm.user.User}. * @param The corresponding transport object, eg. {@link UserDto}. - * @param The exception type for the model object, eg. {@link sonia.scm.user.UserException}. * * @see CollectionResourceManagerAdapter */ @SuppressWarnings("squid:S00119") // "MODEL_OBJECT" is much more meaningful than "M", right? class SingleResourceManagerAdapter extends AbstractManagerResource { + DTO extends HalRepresentation> extends AbstractManagerResource { private final Function> errorHandler; - SingleResourceManagerAdapter(Manager manager, Class type) { + SingleResourceManagerAdapter(Manager manager, Class type) { this(manager, type, e -> Optional.empty()); } - SingleResourceManagerAdapter(Manager manager, Class type, Function> errorHandler) { + SingleResourceManagerAdapter(Manager manager, Class type, Function> errorHandler) { super(manager, type); this.errorHandler = errorHandler; } @@ -46,28 +46,33 @@ class SingleResourceManagerAdapter> reader, Function mapToDto) { + Response get(Supplier> reader, Function mapToDto) throws NotFoundException { return reader.get() .map(mapToDto) .map(Response::ok) .map(Response.ResponseBuilder::build) - .orElse(Response.status(Response.Status.NOT_FOUND).build()); + .orElseThrow(NotFoundException::new); } /** * Update the model object for the given id according to the given function and returns a corresponding http response. * This handles all corner cases, eg. no matching object for the id or missing privileges. */ - public Response update(Supplier> reader, Function applyChanges, Predicate hasSameKey) { - Optional existingModelObject = reader.get(); - if (!existingModelObject.isPresent()) { - return Response.status(Response.Status.NOT_FOUND).build(); - } - MODEL_OBJECT changedModelObject = applyChanges.apply(existingModelObject.get()); + public Response update(Supplier> reader, Function applyChanges, Predicate hasSameKey) throws NotFoundException, ConcurrentModificationException { + MODEL_OBJECT existingModelObject = reader.get().orElseThrow(NotFoundException::new); + MODEL_OBJECT changedModelObject = applyChanges.apply(existingModelObject); if (!hasSameKey.test(changedModelObject)) { return Response.status(BAD_REQUEST).entity("illegal change of id").build(); } - return update(getId(existingModelObject.get()), changedModelObject); + else if (modelObjectWasModifiedConcurrently(existingModelObject, changedModelObject)) { + throw new ConcurrentModificationException(); + } + return update(getId(existingModelObject), changedModelObject); + } + + private boolean modelObjectWasModifiedConcurrently(MODEL_OBJECT existing, MODEL_OBJECT updated) { + return existing.getLastModified() != null + && (updated.getLastModified() == null || existing.getLastModified() > updated.getLastModified()); } public Response delete(Supplier> reader) { diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java index 4d0bfc50aa..4360e60aa9 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java @@ -2,8 +2,8 @@ package sonia.scm.api.v2.resources; import sonia.scm.repository.BrowserResult; import sonia.scm.repository.NamespaceAndName; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RepositoryNotFoundException; +import sonia.scm.repository.RevisionNotFoundException; import sonia.scm.repository.api.BrowseCommandBuilder; import sonia.scm.repository.api.RepositoryService; import sonia.scm.repository.api.RepositoryServiceFactory; @@ -66,9 +66,9 @@ public class SourceRootResource { return Response.status(Response.Status.NOT_FOUND).build(); } - } catch (RepositoryNotFoundException e) { + } catch (RepositoryNotFoundException | RevisionNotFoundException e) { return Response.status(Response.Status.NOT_FOUND).build(); - } catch (RepositoryException | IOException e) { + } catch (IOException e) { return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserCollectionResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserCollectionResource.java index 36a1e69a83..81c3a66c6d 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserCollectionResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserCollectionResource.java @@ -1,15 +1,25 @@ package sonia.scm.api.v2.resources; -import com.webcohesion.enunciate.metadata.rs.*; +import com.webcohesion.enunciate.metadata.rs.ResponseCode; +import com.webcohesion.enunciate.metadata.rs.ResponseHeader; +import com.webcohesion.enunciate.metadata.rs.ResponseHeaders; +import com.webcohesion.enunciate.metadata.rs.StatusCodes; +import com.webcohesion.enunciate.metadata.rs.TypeHint; +import sonia.scm.AlreadyExistsException; import sonia.scm.user.User; -import sonia.scm.user.UserException; import sonia.scm.user.UserManager; import sonia.scm.web.VndMediaType; import javax.inject.Inject; -import javax.ws.rs.*; +import javax.validation.Valid; +import javax.ws.rs.Consumes; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.Response; -import java.io.IOException; public class UserCollectionResource { @@ -18,7 +28,7 @@ public class UserCollectionResource { private final UserCollectionToDtoMapper userCollectionToDtoMapper; private final ResourceLinks resourceLinks; - private final IdResourceManagerAdapter adapter; + private final IdResourceManagerAdapter adapter; @Inject public UserCollectionResource(UserManager manager, UserDtoToUserMapper dtoToUserMapper, @@ -78,7 +88,7 @@ public class UserCollectionResource { }) @TypeHint(TypeHint.NO_CONTENT.class) @ResponseHeaders(@ResponseHeader(name = "Location", description = "uri to the created user")) - public Response create(UserDto userDto) throws IOException, UserException { + public Response create(@Valid UserDto userDto) throws AlreadyExistsException { return adapter.create(userDto, () -> dtoToUserMapper.map(userDto, ""), user -> resourceLinks.user().self(user.getName())); diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserDto.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserDto.java index cf7bf90504..74f43c61c2 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserDto.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserDto.java @@ -6,7 +6,10 @@ import de.otto.edison.hal.Links; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.hibernate.validator.constraints.Email; +import org.hibernate.validator.constraints.NotEmpty; +import javax.validation.constraints.Pattern; import java.time.Instant; import java.util.Map; @@ -15,10 +18,13 @@ public class UserDto extends HalRepresentation { private boolean active; private boolean admin; private Instant creationDate; + @NotEmpty private String displayName; @JsonInclude(JsonInclude.Include.NON_NULL) private Instant lastModified; + @NotEmpty @Email private String mail; + @Pattern(regexp = "^[A-z0-9\\.\\-_@]|[^ ]([A-z0-9\\.\\-_@ ]*[A-z0-9\\.\\-_@]|[^ ])?$") private String name; private String password; private String type; diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserDtoToUserMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserDtoToUserMapper.java index 29620e6742..6d266bea5a 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserDtoToUserMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserDtoToUserMapper.java @@ -9,19 +9,20 @@ import sonia.scm.user.User; import javax.inject.Inject; +import java.time.Instant; + import static sonia.scm.api.rest.resources.UserResource.DUMMY_PASSWORT; // Mapstruct does not support parameterized (i.e. non-default) constructors. Thus, we need to use field injection. @SuppressWarnings("squid:S3306") @Mapper -public abstract class UserDtoToUserMapper { +public abstract class UserDtoToUserMapper extends BaseDtoMapper { @Inject private PasswordService passwordService; @Mapping(source = "password", target = "password", qualifiedByName = "encrypt") @Mapping(target = "creationDate", ignore = true) - @Mapping(target = "lastModified", ignore = true) public abstract User map(UserDto userDto, @Context String originalPassword); @Named("encrypt") diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserResource.java index f05c8165cb..151abfa20f 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/UserResource.java @@ -3,13 +3,21 @@ package sonia.scm.api.v2.resources; import com.webcohesion.enunciate.metadata.rs.ResponseCode; import com.webcohesion.enunciate.metadata.rs.StatusCodes; import com.webcohesion.enunciate.metadata.rs.TypeHint; +import sonia.scm.ConcurrentModificationException; +import sonia.scm.NotFoundException; import sonia.scm.user.User; -import sonia.scm.user.UserException; import sonia.scm.user.UserManager; import sonia.scm.web.VndMediaType; import javax.inject.Inject; -import javax.ws.rs.*; +import javax.validation.Valid; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; import javax.ws.rs.core.Response; public class UserResource { @@ -17,7 +25,7 @@ public class UserResource { private final UserDtoToUserMapper dtoToUserMapper; private final UserToUserDtoMapper userToDtoMapper; - private final IdResourceManagerAdapter adapter; + private final IdResourceManagerAdapter adapter; @Inject public UserResource(UserDtoToUserMapper dtoToUserMapper, UserToUserDtoMapper userToDtoMapper, UserManager manager) { @@ -45,7 +53,7 @@ public class UserResource { @ResponseCode(code = 404, condition = "not found, no user with the specified id/name available"), @ResponseCode(code = 500, condition = "internal server error") }) - public Response get(@PathParam("id") String id) { + public Response get(@PathParam("id") String id) throws NotFoundException { return adapter.get(id, userToDtoMapper::map); } @@ -90,7 +98,7 @@ public class UserResource { @ResponseCode(code = 500, condition = "internal server error") }) @TypeHint(TypeHint.NO_CONTENT.class) - public Response update(@PathParam("id") String name, UserDto userDto) { + public Response update(@PathParam("id") String name, @Valid UserDto userDto) throws NotFoundException, ConcurrentModificationException { return adapter.update(name, existing -> dtoToUserMapper.map(userDto, existing.getPassword())); } } diff --git a/scm-webapp/src/main/java/sonia/scm/cache/CacheConfigurations.java b/scm-webapp/src/main/java/sonia/scm/cache/CacheConfigurations.java index f84782fee2..c425992a0a 100644 --- a/scm-webapp/src/main/java/sonia/scm/cache/CacheConfigurations.java +++ b/scm-webapp/src/main/java/sonia/scm/cache/CacheConfigurations.java @@ -35,19 +35,18 @@ package sonia.scm.cache; //~--- non-JDK imports -------------------------------------------------------- import com.google.common.collect.Iterators; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; -//~--- JDK imports ------------------------------------------------------------ - import java.io.IOException; - import java.net.URL; - import java.util.Enumeration; import java.util.Iterator; +import static java.util.Collections.emptyIterator; + +//~--- JDK imports ------------------------------------------------------------ + /** * * @author Sebastian Sdorra @@ -109,7 +108,7 @@ public final class CacheConfigurations if (it == null) { - it = Iterators.emptyIterator(); + it = emptyIterator(); } return it; diff --git a/scm-webapp/src/main/java/sonia/scm/cache/GuavaCacheConfiguration.java b/scm-webapp/src/main/java/sonia/scm/cache/GuavaCacheConfiguration.java index 0d339c8a6c..6450d97c37 100644 --- a/scm-webapp/src/main/java/sonia/scm/cache/GuavaCacheConfiguration.java +++ b/scm-webapp/src/main/java/sonia/scm/cache/GuavaCacheConfiguration.java @@ -34,17 +34,16 @@ package sonia.scm.cache; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.base.Objects; - -//~--- JDK imports ------------------------------------------------------------ - -import java.io.Serializable; +import com.google.common.base.MoreObjects; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import java.io.Serializable; + +//~--- JDK imports ------------------------------------------------------------ /** * @@ -70,7 +69,7 @@ public class GuavaCacheConfiguration implements Serializable public String toString() { //J- - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("concurrencyLevel", concurrencyLevel) .add("copyStrategy", copyStrategy) .add("expireAfterAccess", expireAfterAccess) diff --git a/scm-webapp/src/main/java/sonia/scm/group/DefaultGroupManager.java b/scm-webapp/src/main/java/sonia/scm/group/DefaultGroupManager.java index f22a5519dc..c3dcb6db8c 100644 --- a/scm-webapp/src/main/java/sonia/scm/group/DefaultGroupManager.java +++ b/scm-webapp/src/main/java/sonia/scm/group/DefaultGroupManager.java @@ -42,8 +42,10 @@ import com.google.inject.Inject; import com.google.inject.Singleton; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import sonia.scm.AlreadyExistsException; import sonia.scm.HandlerEventType; import sonia.scm.ManagerDaoAdapter; +import sonia.scm.NotFoundException; import sonia.scm.SCMContextProvider; import sonia.scm.TransformFilter; import sonia.scm.search.SearchRequest; @@ -52,7 +54,12 @@ import sonia.scm.util.CollectionAppender; import sonia.scm.util.Util; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; //~--- JDK imports ------------------------------------------------------------ @@ -80,10 +87,7 @@ public class DefaultGroupManager extends AbstractGroupManager public DefaultGroupManager(GroupDAO groupDAO) { this.groupDAO = groupDAO; - this.managerDaoAdapter = new ManagerDaoAdapter<>( - groupDAO, - GroupNotFoundException::new, - GroupAlreadyExistsException::new); + this.managerDaoAdapter = new ManagerDaoAdapter<>(groupDAO); } //~--- methods -------------------------------------------------------------- @@ -102,7 +106,7 @@ public class DefaultGroupManager extends AbstractGroupManager } @Override - public Group create(Group group) throws GroupException { + public Group create(Group group) throws AlreadyExistsException { String type = group.getType(); if (Util.isEmpty(type)) { group.setType(groupDAO.getType()); @@ -121,7 +125,7 @@ public class DefaultGroupManager extends AbstractGroupManager } @Override - public void delete(Group group) throws GroupException { + public void delete(Group group) throws NotFoundException { logger.info("delete group {} of type {}", group.getName(), group.getType()); managerDaoAdapter.delete( group, @@ -140,17 +144,8 @@ public class DefaultGroupManager extends AbstractGroupManager @Override public void init(SCMContextProvider context) {} - /** - * Method description - * - * - * @param group - * - * @throws GroupException - * @throws IOException - */ @Override - public void modify(Group group) throws GroupException { + public void modify(Group group) throws NotFoundException { logger.info("modify group {} of type {}", group.getName(), group.getType()); managerDaoAdapter.modify( @@ -164,18 +159,8 @@ public class DefaultGroupManager extends AbstractGroupManager ); } - /** - * Method description - * - * - * @param group - * - * @throws GroupException - * @throws IOException - */ @Override - public void refresh(Group group) throws GroupException - { + public void refresh(Group group) throws NotFoundException { String name = group.getName(); if (logger.isInfoEnabled()) { @@ -187,7 +172,7 @@ public class DefaultGroupManager extends AbstractGroupManager if (fresh == null) { - throw new GroupNotFoundException(group); + throw new NotFoundException("group", group.getId()); } fresh.copyProperties(group); @@ -400,5 +385,5 @@ public class DefaultGroupManager extends AbstractGroupManager /** Field description */ private GroupDAO groupDAO; - private final ManagerDaoAdapter managerDaoAdapter; + private final ManagerDaoAdapter managerDaoAdapter; } diff --git a/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java index 2eb9889434..02ae67719b 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/DefaultRepositoryManager.java @@ -42,10 +42,12 @@ import com.google.inject.Singleton; import org.apache.shiro.concurrent.SubjectAwareExecutorService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import sonia.scm.AlreadyExistsException; import sonia.scm.ArgumentIsInvalidException; import sonia.scm.ConfigurationException; import sonia.scm.HandlerEventType; import sonia.scm.ManagerDaoAdapter; +import sonia.scm.NotFoundException; import sonia.scm.SCMContextProvider; import sonia.scm.Type; import sonia.scm.config.ScmConfiguration; @@ -57,7 +59,6 @@ import sonia.scm.util.IOUtil; import sonia.scm.util.Util; import javax.servlet.http.HttpServletRequest; -import java.io.IOException; import java.util.Collection; import java.util.Collections; import java.util.Comparator; @@ -91,7 +92,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager { private final Set types; private RepositoryMatcher repositoryMatcher; private NamespaceStrategy namespaceStrategy; - private final ManagerDaoAdapter managerDaoAdapter; + private final ManagerDaoAdapter managerDaoAdapter; @Inject @@ -118,10 +119,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager { for (RepositoryHandler handler : handlerSet) { addHandler(contextProvider, handler); } - managerDaoAdapter = new ManagerDaoAdapter<>( - repositoryDAO, - RepositoryNotFoundException::new, - RepositoryAlreadyExistsException::create); + managerDaoAdapter = new ManagerDaoAdapter<>(repositoryDAO); } @@ -135,22 +133,26 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager { } @Override - public Repository create(Repository repository) throws RepositoryException { + public Repository create(Repository repository) throws AlreadyExistsException { return create(repository, true); } - public Repository create(Repository repository, boolean initRepository) throws RepositoryException { + public Repository create(Repository repository, boolean initRepository) throws AlreadyExistsException { repository.setId(keyGenerator.createKey()); repository.setNamespace(namespaceStrategy.createNamespace(repository)); - logger.info("create repository {} of type {} in namespace {}", repository.getName(), repository.getType(), repository.getNamespace()); + logger.info("create repository {}/{} of type {} in namespace {}", repository.getNamespace(), repository.getName(), repository.getType(), repository.getNamespace()); return managerDaoAdapter.create( repository, RepositoryPermissions::create, newRepository -> { if (initRepository) { - getHandler(newRepository).create(newRepository); + try { + getHandler(newRepository).create(newRepository); + } catch (AlreadyExistsException e) { + throw new InternalRepositoryException("directory for repository does already exist", e); + } } fireEvent(HandlerEventType.BEFORE_CREATE, newRepository); }, @@ -160,8 +162,8 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager { } @Override - public void delete(Repository repository) throws RepositoryException { - logger.info("delete repository {} of type {}", repository.getName(), repository.getType()); + public void delete(Repository repository) throws NotFoundException { + logger.info("delete repository {}/{} of type {}", repository.getNamespace(), repository.getName(), repository.getType()); managerDaoAdapter.delete( repository, () -> RepositoryPermissions.delete(repository), @@ -170,17 +172,16 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager { ); } - private void preDelete(Repository toDelete) throws RepositoryException { + private void preDelete(Repository toDelete) { if (configuration.isEnableRepositoryArchive() && !toDelete.isArchived()) { throw new RepositoryIsNotArchivedException(); } fireEvent(HandlerEventType.BEFORE_DELETE, toDelete); - getHandler(toDelete).delete(toDelete); +// getHandler(toDelete).delete(toDelete); } @Override - public void importRepository(Repository repository) - throws RepositoryException, IOException { + public void importRepository(Repository repository) throws AlreadyExistsException { create(repository, false); } @@ -189,23 +190,26 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager { } @Override - public void modify(Repository repository) throws RepositoryException { - logger.info("modify repository {} of type {}", repository.getName(), repository.getType()); + public void modify(Repository repository) throws NotFoundException { + logger.info("modify repository {}/{} of type {}", repository.getNamespace(), repository.getName(), repository.getType()); managerDaoAdapter.modify( repository, RepositoryPermissions::modify, notModified -> { fireEvent(HandlerEventType.BEFORE_MODIFY, repository, notModified); - getHandler(repository).modify(repository); + try { + getHandler(repository).modify(repository); + } catch (NotFoundException e) { + throw new IllegalStateException("repository not found though just created", e); + } }, notModified -> fireEvent(HandlerEventType.MODIFY, repository, notModified) ); } @Override - public void refresh(Repository repository) - throws RepositoryException { + public void refresh(Repository repository) throws RepositoryNotFoundException { AssertUtil.assertIsNotNull(repository); RepositoryPermissions.read(repository).check(); @@ -403,7 +407,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager { if (handlerMap.containsKey(type.getName())) { throw new ConfigurationException( - type.getName().concat("allready registered")); + type.getName().concat("already registered")); } if (logger.isInfoEnabled()) { @@ -417,15 +421,14 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager { } private RepositoryHandler getHandler(Repository repository) - throws RepositoryException { + { String type = repository.getType(); RepositoryHandler handler = handlerMap.get(type); if (handler == null) { - throw new RepositoryHandlerNotFoundException( - "could not find handler for ".concat(type)); + throw new InternalRepositoryException("could not find handler for " + type); } else if (!handler.isConfigured()) { - throw new RepositoryException("handler is not configured"); + throw new InternalRepositoryException("handler is not configured for type " + type); } return handler; diff --git a/scm-webapp/src/main/java/sonia/scm/repository/HealthChecker.java b/scm-webapp/src/main/java/sonia/scm/repository/HealthChecker.java index 26f674a5b5..0d27c6d250 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/HealthChecker.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/HealthChecker.java @@ -1,9 +1,9 @@ /** * 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 @@ -11,7 +11,7 @@ * 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 @@ -22,81 +22,45 @@ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + *

* http://bitbucket.org/sdorra/scm-manager - * */ - - package sonia.scm.repository; -//~--- non-JDK imports -------------------------------------------------------- - import com.github.sdorra.ssp.PermissionActionCheck; import com.google.common.collect.ImmutableList; import com.google.inject.Inject; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; -//~--- JDK imports ------------------------------------------------------------ - -import java.io.IOException; +import sonia.scm.ConcurrentModificationException; +import sonia.scm.NotFoundException; import java.util.Set; -/** - * - * @author Sebastian Sdorra - */ -public final class HealthChecker -{ - /** - * the logger for HealthChecker - */ +public final class HealthChecker { + private static final Logger logger = LoggerFactory.getLogger(HealthChecker.class); - //~--- constructors --------------------------------------------------------- + private final Set checks; + + private final RepositoryManager repositoryManager; - /** - * Constructs ... - * - * - * @param checks - * @param repositoryManager - */ @Inject public HealthChecker(Set checks, - RepositoryManager repositoryManager) - { + RepositoryManager repositoryManager) { this.checks = checks; this.repositoryManager = repositoryManager; } - //~--- methods -------------------------------------------------------------- - - /** - * Method description - * - * - * @param id - * - * - * @throws IOException - * @throws RepositoryException - * @throws RepositoryNotFoundException - */ - public void check(String id) - throws RepositoryNotFoundException, RepositoryException, IOException - { + public void check(String id) throws NotFoundException { RepositoryPermissions.healthCheck(id).check(); Repository repository = repositoryManager.get(id); - if (repository == null) - { + if (repository == null) { throw new RepositoryNotFoundException( "could not find repository with id ".concat(id)); } @@ -104,49 +68,26 @@ public final class HealthChecker doCheck(repository); } - /** - * Method description - * - * - * @param repository - * - * @throws IOException - * @throws RepositoryException - */ public void check(Repository repository) - throws RepositoryException, IOException - { + throws NotFoundException, ConcurrentModificationException { RepositoryPermissions.healthCheck(repository).check(); doCheck(repository); } - /** - * Method description - * - * - */ - public void checkAll() - { + public void checkAll() { logger.debug("check health of all repositories"); PermissionActionCheck check = RepositoryPermissions.healthCheck(); - for (Repository repository : repositoryManager.getAll()) - { - if (check.isPermitted(repository)) - { - try - { + for (Repository repository : repositoryManager.getAll()) { + if (check.isPermitted(repository)) { + try { check(repository); - } - catch (RepositoryException | IOException ex) - { + } catch (ConcurrentModificationException | NotFoundException ex) { logger.error("health check ends with exception", ex); } - } - else - { + } else { logger.debug( "no permissions to execute health check for repository {}", repository.getId()); @@ -154,32 +95,25 @@ public final class HealthChecker } } - private void doCheck(Repository repository) - throws RepositoryException, IOException - { + private void doCheck(Repository repository) throws NotFoundException { logger.info("start health check for repository {}", repository.getName()); HealthCheckResult result = HealthCheckResult.healthy(); - for (HealthCheck check : checks) - { + for (HealthCheck check : checks) { logger.trace("execute health check {} for repository {}", check.getClass(), repository.getName()); result = result.merge(check.check(repository)); } - if (result.isUnhealthy()) - { + if (result.isUnhealthy()) { logger.warn("repository {} is unhealthy: {}", repository.getName(), result); - } - else - { + } else { logger.info("repository {} is healthy", repository.getName()); } - if (!(repository.isHealthy() && result.isHealthy())) - { + if (!(repository.isHealthy() && result.isHealthy())) { logger.trace("store health check results for repository {}", repository.getName()); repository.setHealthCheckFailures( @@ -188,11 +122,5 @@ public final class HealthChecker } } - //~--- fields --------------------------------------------------------------- - /** Field description */ - private final Set checks; - - /** Field description */ - private final RepositoryManager repositoryManager; } diff --git a/scm-webapp/src/main/java/sonia/scm/repository/LastModifiedUpdateListener.java b/scm-webapp/src/main/java/sonia/scm/repository/LastModifiedUpdateListener.java index a84324cd60..badcf0c48d 100644 --- a/scm-webapp/src/main/java/sonia/scm/repository/LastModifiedUpdateListener.java +++ b/scm-webapp/src/main/java/sonia/scm/repository/LastModifiedUpdateListener.java @@ -38,6 +38,7 @@ import com.google.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.EagerSingleton; +import sonia.scm.NotFoundException; import sonia.scm.plugin.Extension; import sonia.scm.web.security.AdministrationContext; import sonia.scm.web.security.PrivilegedAction; @@ -146,13 +147,10 @@ public final class LastModifiedUpdateListener logger.info("update last modified date of repository {}", dbr.getId()); dbr.setLastModified(System.currentTimeMillis()); - try - { + try { repositoryManager.modify(dbr); - } - catch (RepositoryException ex) - { - logger.error("could not modify repository", ex); + } catch (NotFoundException e) { + logger.error("could not modify repository", e); } } else diff --git a/scm-webapp/src/main/java/sonia/scm/security/ConfigurableLoginAttemptHandler.java b/scm-webapp/src/main/java/sonia/scm/security/ConfigurableLoginAttemptHandler.java index 39c3c64d5d..6472c40eaa 100644 --- a/scm-webapp/src/main/java/sonia/scm/security/ConfigurableLoginAttemptHandler.java +++ b/scm-webapp/src/main/java/sonia/scm/security/ConfigurableLoginAttemptHandler.java @@ -30,12 +30,8 @@ */ package sonia.scm.security; -import com.google.common.base.Objects; +import com.google.common.base.MoreObjects; import com.google.inject.Inject; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.TimeUnit; -import javax.inject.Singleton; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; @@ -44,6 +40,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.config.ScmConfiguration; +import javax.inject.Singleton; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.TimeUnit; + /** * Configurable implementation of {@link LoginAttemptHandler}. * @@ -175,7 +176,7 @@ public class ConfigurableLoginAttemptHandler implements LoginAttemptHandler { @Override public String toString() { - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("counter", counter) .add("lastAttempt", lastAttempt) .toString(); diff --git a/scm-webapp/src/main/java/sonia/scm/security/SecureKey.java b/scm-webapp/src/main/java/sonia/scm/security/SecureKey.java index f8e12de398..1ab256386a 100644 --- a/scm-webapp/src/main/java/sonia/scm/security/SecureKey.java +++ b/scm-webapp/src/main/java/sonia/scm/security/SecureKey.java @@ -35,12 +35,12 @@ package sonia.scm.security; import com.google.common.base.Objects; -//~--- JDK imports ------------------------------------------------------------ - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; +//~--- JDK imports ------------------------------------------------------------ + /** * Secure key can be used for singing messages and tokens. * diff --git a/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java b/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java index 25f8c61b3b..876b0f094c 100644 --- a/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java +++ b/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java @@ -40,9 +40,11 @@ import com.google.inject.Inject; import com.google.inject.Singleton; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import sonia.scm.AlreadyExistsException; import sonia.scm.EagerSingleton; import sonia.scm.HandlerEventType; import sonia.scm.ManagerDaoAdapter; +import sonia.scm.NotFoundException; import sonia.scm.SCMContextProvider; import sonia.scm.TransformFilter; import sonia.scm.search.SearchRequest; @@ -97,10 +99,7 @@ public class DefaultUserManager extends AbstractUserManager public DefaultUserManager(UserDAO userDAO) { this.userDAO = userDAO; - this.managerDaoAdapter = new ManagerDaoAdapter<>( - userDAO, - UserNotFoundException::new, - UserAlreadyExistsException::new); + this.managerDaoAdapter = new ManagerDaoAdapter<>(userDAO); } //~--- methods -------------------------------------------------------------- @@ -139,10 +138,9 @@ public class DefaultUserManager extends AbstractUserManager * @param user * * @throws IOException - * @throws UserException */ @Override - public User create(User user) throws UserException { + public User create(User user) throws AlreadyExistsException { String type = user.getType(); if (Util.isEmpty(type)) { user.setType(userDAO.getType()); @@ -159,7 +157,7 @@ public class DefaultUserManager extends AbstractUserManager } @Override - public void delete(User user) throws UserException { + public void delete(User user) throws NotFoundException { logger.info("delete user {} of type {}", user.getName(), user.getType()); managerDaoAdapter.delete( user, @@ -193,11 +191,9 @@ public class DefaultUserManager extends AbstractUserManager * @param user * * @throws IOException - * @throws UserException */ @Override - public void modify(User user) throws UserException - { + public void modify(User user) throws NotFoundException { logger.info("modify user {} of type {}", user.getName(), user.getType()); managerDaoAdapter.modify( @@ -214,11 +210,9 @@ public class DefaultUserManager extends AbstractUserManager * @param user * * @throws IOException - * @throws UserException */ @Override - public void refresh(User user) throws UserException - { + public void refresh(User user) throws NotFoundException { if (logger.isInfoEnabled()) { logger.info("refresh user {} of type {}", user.getName(), user.getType()); @@ -229,7 +223,7 @@ public class DefaultUserManager extends AbstractUserManager if (fresh == null) { - throw new UserNotFoundException(user); + throw new NotFoundException(); } fresh.copyProperties(user); @@ -455,5 +449,5 @@ public class DefaultUserManager extends AbstractUserManager //~--- fields --------------------------------------------------------------- private final UserDAO userDAO; - private final ManagerDaoAdapter managerDaoAdapter; + private final ManagerDaoAdapter managerDaoAdapter; } diff --git a/scm-webapp/src/test/java/sonia/scm/api/rest/resources/AbstractManagerResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/rest/resources/AbstractManagerResourceTest.java index a98d18b390..41bcac3c6a 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/rest/resources/AbstractManagerResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/rest/resources/AbstractManagerResourceTest.java @@ -24,13 +24,13 @@ import static org.mockito.Mockito.when; public class AbstractManagerResourceTest { @Mock - private Manager manager; + private Manager manager; @Mock private Request request; @Captor private ArgumentCaptor> comparatorCaptor; - private AbstractManagerResource abstractManagerResource; + private AbstractManagerResource abstractManagerResource; @Before public void captureComparator() { @@ -60,7 +60,7 @@ public class AbstractManagerResourceTest { } - private class SimpleManagerResource extends AbstractManagerResource { + private class SimpleManagerResource extends AbstractManagerResource { { disableCache = true; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AuthenticationResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AuthenticationResourceTest.java index 9eea189b72..42428f9f77 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AuthenticationResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AuthenticationResourceTest.java @@ -11,8 +11,6 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import sonia.scm.config.ScmConfiguration; @@ -20,25 +18,16 @@ import sonia.scm.security.AccessToken; import sonia.scm.security.AccessTokenBuilder; import sonia.scm.security.AccessTokenBuilderFactory; import sonia.scm.security.AccessTokenCookieIssuer; -import sonia.scm.user.User; -import sonia.scm.user.UserException; -import sonia.scm.user.UserManager; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.UriInfo; -import java.io.IOException; -import java.net.URI; import java.net.URISyntaxException; import java.util.Date; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; @SubjectAware( configuration = "classpath:sonia/scm/repository/shiro.ini" diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DispatcherMock.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DispatcherMock.java new file mode 100644 index 0000000000..4d4ed435df --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DispatcherMock.java @@ -0,0 +1,19 @@ +package sonia.scm.api.v2.resources; + +import org.jboss.resteasy.core.Dispatcher; +import org.jboss.resteasy.mock.MockDispatcherFactory; +import sonia.scm.api.rest.AlreadyExistsExceptionMapper; +import sonia.scm.api.rest.AuthorizationExceptionMapper; +import sonia.scm.api.rest.ConcurrentModificationExceptionMapper; + +public class DispatcherMock { + public static Dispatcher createDispatcher(Object resource) { + Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); + dispatcher.getRegistry().addSingletonResource(resource); + dispatcher.getProviderFactory().registerProvider(NotFoundExceptionMapper.class); + dispatcher.getProviderFactory().registerProvider(AlreadyExistsExceptionMapper.class); + dispatcher.getProviderFactory().registerProvider(AuthorizationExceptionMapper.class); + dispatcher.getProviderFactory().registerProvider(ConcurrentModificationExceptionMapper.class); + return dispatcher; + } +} diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupDtoToGroupMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupDtoToGroupMapperTest.java index 64559b2419..51c5455465 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupDtoToGroupMapperTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupDtoToGroupMapperTest.java @@ -1,13 +1,13 @@ package sonia.scm.api.v2.resources; -import com.fasterxml.jackson.databind.node.TextNode; import org.junit.Test; import org.mapstruct.factory.Mappers; import sonia.scm.group.Group; +import java.time.Instant; import java.util.Arrays; -import static java.util.Arrays.asList; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; public class GroupDtoToGroupMapperTest { @@ -16,8 +16,10 @@ public class GroupDtoToGroupMapperTest { public void shouldMapAttributes() { GroupDto dto = new GroupDto(); dto.setName("group"); + dto.setLastModified(Instant.ofEpochMilli(1234)); Group group = Mappers.getMapper(GroupDtoToGroupMapper.class).map(dto); assertEquals("group", group.getName()); + assertThat(group.getLastModified()).isEqualTo(dto.getLastModified().toEpochMilli()); } @Test diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java index dff9e7e99b..1e42016ace 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/GroupRootResourceTest.java @@ -4,7 +4,6 @@ import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; import com.google.common.io.Resources; import org.jboss.resteasy.core.Dispatcher; -import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; @@ -14,8 +13,9 @@ import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; import sonia.scm.PageResult; +import sonia.scm.api.rest.JSONContextResolver; +import sonia.scm.api.rest.ObjectMapperProvider; import sonia.scm.group.Group; -import sonia.scm.group.GroupException; import sonia.scm.group.GroupManager; import sonia.scm.web.VndMediaType; @@ -27,12 +27,15 @@ import java.net.URL; import java.util.Collections; import static java.util.Collections.singletonList; -import static org.junit.Assert.*; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; +import static sonia.scm.api.v2.resources.DispatcherMock.createDispatcher; @SubjectAware( username = "trillian", @@ -44,7 +47,7 @@ public class GroupRootResourceTest { @Rule public ShiroRule shiro = new ShiroRule(); - private Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); + private Dispatcher dispatcher; private final ResourceLinks resourceLinks = ResourceLinksMock.createMock(URI.create("/")); @@ -58,7 +61,7 @@ public class GroupRootResourceTest { private ArgumentCaptor groupCaptor = ArgumentCaptor.forClass(Group.class); @Before - public void prepareEnvironment() throws IOException, GroupException { + public void prepareEnvironment() throws Exception { initMocks(this); when(groupManager.create(groupCaptor.capture())).thenAnswer(invocation -> invocation.getArguments()[0]); doNothing().when(groupManager).modify(groupCaptor.capture()); @@ -72,7 +75,8 @@ public class GroupRootResourceTest { GroupResource groupResource = new GroupResource(groupManager, groupToDtoMapper, dtoToGroupMapper); GroupRootResource groupRootResource = new GroupRootResource(MockProvider.of(groupCollectionResource), MockProvider.of(groupResource)); - dispatcher.getRegistry().addSingletonResource(groupRootResource); + dispatcher = createDispatcher(groupRootResource); + dispatcher.getProviderFactory().registerProviderInstance(new JSONContextResolver(new ObjectMapperProvider().get())); } @Test @@ -118,10 +122,10 @@ public class GroupRootResourceTest { MockHttpResponse response = new MockHttpResponse(); dispatcher.invoke(request, response); - Group capturedGroup = groupCaptor.getValue(); assertEquals(HttpServletResponse.SC_NO_CONTENT, response.getStatus()); + Group capturedGroup = groupCaptor.getValue(); assertEquals("Updated description", capturedGroup.getDescription()); } @@ -142,6 +146,40 @@ public class GroupRootResourceTest { assertEquals(HttpServletResponse.SC_NOT_FOUND, response.getStatus()); } + @Test + public void updateShouldFailOnConcurrentModification_oldModificationDate() throws URISyntaxException, IOException { + URL url = Resources.getResource("sonia/scm/api/v2/group-test-update-concurrent-modification.json"); + byte[] groupJson = Resources.toByteArray(url); + + MockHttpRequest request = MockHttpRequest + .put("/" + GroupRootResource.GROUPS_PATH_V2 + "admin") + .contentType(VndMediaType.GROUP) + .content(groupJson); + + MockHttpResponse response = new MockHttpResponse(); + + dispatcher.invoke(request, response); + + assertEquals(HttpServletResponse.SC_CONFLICT, response.getStatus()); + } + + @Test + public void updateShouldFailOnConcurrentModification_unsetModificationDate() throws URISyntaxException, IOException { + URL url = Resources.getResource("sonia/scm/api/v2/group-test-update-concurrent-modification_null_date.json"); + byte[] groupJson = Resources.toByteArray(url); + + MockHttpRequest request = MockHttpRequest + .put("/" + GroupRootResource.GROUPS_PATH_V2 + "admin") + .contentType(VndMediaType.GROUP) + .content(groupJson); + + MockHttpResponse response = new MockHttpResponse(); + + dispatcher.invoke(request, response); + + assertEquals(HttpServletResponse.SC_CONFLICT, response.getStatus()); + } + @Test public void shouldDeleteGroup() throws URISyntaxException { Group group = createDummyGroup(); @@ -215,6 +253,7 @@ public class GroupRootResourceTest { group.setName("admin"); group.setCreationDate(0L); group.setMembers(Collections.singletonList("user")); + group.setLastModified(3600000L); return group; } } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/MeResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/MeResourceTest.java index 56c60098fb..09dd545eb5 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/MeResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/MeResourceTest.java @@ -2,10 +2,6 @@ package sonia.scm.api.v2.resources; import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; -import com.google.common.io.Resources; -import org.apache.shiro.authc.credential.PasswordService; -import org.apache.shiro.subject.PrincipalCollection; -import org.apache.shiro.subject.Subject; import org.jboss.resteasy.core.Dispatcher; import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; @@ -16,26 +12,19 @@ import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; -import sonia.scm.PageResult; import sonia.scm.user.User; -import sonia.scm.user.UserException; import sonia.scm.user.UserManager; import sonia.scm.web.VndMediaType; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.UriInfo; -import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; -import java.net.URL; -import static java.util.Collections.singletonList; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; @SubjectAware( @@ -64,7 +53,7 @@ public class MeResourceTest { private ArgumentCaptor userCaptor = ArgumentCaptor.forClass(User.class); @Before - public void prepareEnvironment() throws IOException, UserException { + public void prepareEnvironment() throws Exception { initMocks(this); createDummyUser("trillian"); when(userManager.create(userCaptor.capture())).thenAnswer(invocation -> invocation.getArguments()[0]); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PermissionRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PermissionRootResourceTest.java index 4e1741abb5..227775cf16 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PermissionRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PermissionRootResourceTest.java @@ -14,7 +14,6 @@ import org.apache.shiro.util.ThreadContext; import org.apache.shiro.util.ThreadState; import org.assertj.core.util.Lists; import org.jboss.resteasy.core.Dispatcher; -import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.jboss.resteasy.spi.HttpRequest; @@ -28,7 +27,6 @@ import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.TestFactory; import org.mockito.InjectMocks; import org.mockito.Mock; -import sonia.scm.api.rest.AuthorizationExceptionMapper; import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.Permission; import sonia.scm.repository.PermissionType; @@ -56,6 +54,7 @@ import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; +import static sonia.scm.api.v2.resources.DispatcherMock.createDispatcher; @Slf4j @SubjectAware( @@ -106,7 +105,7 @@ public class PermissionRootResourceTest { .content(PERMISSION_TEST_PAYLOAD) .path(PATH_OF_ONE_PERMISSION); - private final Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); + private Dispatcher dispatcher; @Rule public ShiroRule shiro = new ShiroRule(); @@ -138,13 +137,9 @@ public class PermissionRootResourceTest { permissionRootResource = new PermissionRootResource(permissionDtoToPermissionMapper, permissionToPermissionDtoMapper, permissionCollectionToDtoMapper, resourceLinks, repositoryManager); RepositoryRootResource repositoryRootResource = new RepositoryRootResource(MockProvider .of(new RepositoryResource(null, null, null, null, null, null, null, null, MockProvider.of(permissionRootResource))), null); + dispatcher = createDispatcher(repositoryRootResource); subjectThreadState.bind(); ThreadContext.bind(subject); - dispatcher.getRegistry().addSingletonResource(repositoryRootResource); - dispatcher.getProviderFactory().registerProvider(RepositoryNotFoundExceptionMapper.class); - dispatcher.getProviderFactory().registerProvider(PermissionNotFoundExceptionMapper.class); - dispatcher.getProviderFactory().registerProvider(PermissionAlreadyExistsExceptionMapper.class); - dispatcher.getProviderFactory().registerProvider(AuthorizationExceptionMapper.class); } @After diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java index 31cacf2d72..2029764550 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/RepositoryRootResourceTest.java @@ -4,7 +4,6 @@ import com.github.sdorra.shiro.ShiroRule; import com.github.sdorra.shiro.SubjectAware; import com.google.common.io.Resources; import org.jboss.resteasy.core.Dispatcher; -import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; @@ -19,7 +18,6 @@ import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.Permission; import sonia.scm.repository.PermissionType; import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RepositoryIsNotArchivedException; import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.api.RepositoryServiceFactory; @@ -50,6 +48,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; +import static sonia.scm.api.v2.resources.DispatcherMock.createDispatcher; @SubjectAware( username = "trillian", @@ -58,7 +57,7 @@ import static org.mockito.MockitoAnnotations.initMocks; ) public class RepositoryRootResourceTest { - private final Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); + private Dispatcher dispatcher; @Rule public ShiroRule shiro = new ShiroRule(); @@ -84,7 +83,7 @@ public class RepositoryRootResourceTest { RepositoryCollectionToDtoMapper repositoryCollectionToDtoMapper = new RepositoryCollectionToDtoMapper(repositoryToDtoMapper, resourceLinks); RepositoryCollectionResource repositoryCollectionResource = new RepositoryCollectionResource(repositoryManager, repositoryCollectionToDtoMapper, dtoToRepositoryMapper, resourceLinks); RepositoryRootResource repositoryRootResource = new RepositoryRootResource(MockProvider.of(repositoryResource), MockProvider.of(repositoryCollectionResource)); - dispatcher.getRegistry().addSingletonResource(repositoryRootResource); + dispatcher = createDispatcher(repositoryRootResource); } @Test @@ -223,7 +222,7 @@ public class RepositoryRootResourceTest { } @Test - public void shouldCreateNewRepositoryInCorrectNamespace() throws URISyntaxException, IOException, RepositoryException { + public void shouldCreateNewRepositoryInCorrectNamespace() throws Exception { when(repositoryManager.create(any())).thenAnswer(invocation -> { Repository repository = (Repository) invocation.getArguments()[0]; repository.setNamespace("otherspace"); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/SourceRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/SourceRootResourceTest.java index 596618ec7e..1e73c6dfaa 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/SourceRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/SourceRootResourceTest.java @@ -13,8 +13,8 @@ import org.mockito.junit.MockitoJUnitRunner; import sonia.scm.repository.BrowserResult; import sonia.scm.repository.FileObject; import sonia.scm.repository.NamespaceAndName; -import sonia.scm.repository.RepositoryException; import sonia.scm.repository.RepositoryNotFoundException; +import sonia.scm.repository.RevisionNotFoundException; import sonia.scm.repository.api.BrowseCommandBuilder; import sonia.scm.repository.api.RepositoryService; import sonia.scm.repository.api.RepositoryServiceFactory; @@ -79,7 +79,7 @@ public class SourceRootResourceTest { } @Test - public void shouldReturnSources() throws URISyntaxException, IOException, RepositoryException { + public void shouldReturnSources() throws URISyntaxException, IOException, RevisionNotFoundException { BrowserResult result = createBrowserResult(); when(browseCommandBuilder.getBrowserResult()).thenReturn(result); MockHttpRequest request = MockHttpRequest.get("/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + "space/repo/sources"); @@ -104,7 +104,7 @@ public class SourceRootResourceTest { } @Test - public void shouldGetResultForSingleFile() throws URISyntaxException, IOException, RepositoryException { + public void shouldGetResultForSingleFile() throws URISyntaxException, IOException, RevisionNotFoundException { BrowserResult browserResult = new BrowserResult(); browserResult.setBranch("abc"); browserResult.setRevision("revision"); @@ -124,7 +124,7 @@ public class SourceRootResourceTest { } @Test - public void shouldGet404ForSingleFileIfRepoNotFound() throws URISyntaxException, RepositoryException { + public void shouldGet404ForSingleFileIfRepoNotFound() throws URISyntaxException, RepositoryNotFoundException { when(serviceFactory.create(new NamespaceAndName("idont", "exist"))).thenThrow(RepositoryNotFoundException.class); MockHttpRequest request = MockHttpRequest.get("/" + RepositoryRootResource.REPOSITORIES_PATH_V2 + "idont/exist/sources/revision/fileabc"); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserRootResourceTest.java index 1eee9b2270..5004eb7665 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/UserRootResourceTest.java @@ -5,7 +5,6 @@ import com.github.sdorra.shiro.SubjectAware; import com.google.common.io.Resources; import org.apache.shiro.authc.credential.PasswordService; import org.jboss.resteasy.core.Dispatcher; -import org.jboss.resteasy.mock.MockDispatcherFactory; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.Before; @@ -16,22 +15,26 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import sonia.scm.PageResult; import sonia.scm.user.User; -import sonia.scm.user.UserException; import sonia.scm.user.UserManager; import sonia.scm.web.VndMediaType; import javax.servlet.http.HttpServletResponse; -import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import static java.util.Collections.singletonList; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; +import static sonia.scm.api.v2.resources.DispatcherMock.createDispatcher; @SubjectAware( username = "trillian", @@ -43,7 +46,7 @@ public class UserRootResourceTest { @Rule public ShiroRule shiro = new ShiroRule(); - private Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); + private Dispatcher dispatcher; private final ResourceLinks resourceLinks = ResourceLinksMock.createMock(URI.create("/")); @@ -59,7 +62,7 @@ public class UserRootResourceTest { private ArgumentCaptor userCaptor = ArgumentCaptor.forClass(User.class); @Before - public void prepareEnvironment() throws UserException { + public void prepareEnvironment() throws Exception { initMocks(this); User dummyUser = createDummyUser("Neo"); when(userManager.create(userCaptor.capture())).thenAnswer(invocation -> invocation.getArguments()[0]); @@ -73,7 +76,7 @@ public class UserRootResourceTest { UserRootResource userRootResource = new UserRootResource(MockProvider.of(userCollectionResource), MockProvider.of(userResource)); - dispatcher.getRegistry().addSingletonResource(userRootResource); + dispatcher = createDispatcher(userRootResource); } @Test @@ -106,7 +109,7 @@ public class UserRootResourceTest { } @Test - public void shouldCreateNewUserWithEncryptedPassword() throws URISyntaxException, IOException, UserException { + public void shouldCreateNewUserWithEncryptedPassword() throws Exception { URL url = Resources.getResource("sonia/scm/api/v2/user-test-create.json"); byte[] userJson = Resources.toByteArray(url); @@ -126,7 +129,7 @@ public class UserRootResourceTest { } @Test - public void shouldUpdateChangedUserWithEncryptedPassword() throws URISyntaxException, IOException, UserException { + public void shouldUpdateChangedUserWithEncryptedPassword() throws Exception { URL url = Resources.getResource("sonia/scm/api/v2/user-test-update.json"); byte[] userJson = Resources.toByteArray(url); @@ -170,7 +173,7 @@ public class UserRootResourceTest { } @Test - public void shouldDeleteUser() throws URISyntaxException, IOException, UserException { + public void shouldDeleteUser() throws Exception { MockHttpRequest request = MockHttpRequest.delete("/" + UserRootResource.USERS_PATH_V2 + "Neo"); MockHttpResponse response = new MockHttpResponse(); @@ -181,7 +184,7 @@ public class UserRootResourceTest { } @Test - public void shouldFailUpdateForDifferentIds() throws IOException, URISyntaxException, UserException { + public void shouldFailUpdateForDifferentIds() throws Exception { URL url = Resources.getResource("sonia/scm/api/v2/user-test-update.json"); byte[] userJson = Resources.toByteArray(url); createDummyUser("Other"); @@ -199,7 +202,7 @@ public class UserRootResourceTest { } @Test - public void shouldFailUpdateForUnknownEntity() throws IOException, URISyntaxException, UserException { + public void shouldFailUpdateForUnknownEntity() throws Exception { URL url = Resources.getResource("sonia/scm/api/v2/user-test-update.json"); byte[] userJson = Resources.toByteArray(url); when(userManager.get("Neo")).thenReturn(null); diff --git a/scm-webapp/src/test/java/sonia/scm/cache/CacheConfigurationTestLoader.java b/scm-webapp/src/test/java/sonia/scm/cache/CacheConfigurationTestLoader.java index 8efd40465e..24f955f79b 100644 --- a/scm-webapp/src/test/java/sonia/scm/cache/CacheConfigurationTestLoader.java +++ b/scm-webapp/src/test/java/sonia/scm/cache/CacheConfigurationTestLoader.java @@ -34,28 +34,24 @@ package sonia.scm.cache; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.base.Charsets; import com.google.common.base.Function; import com.google.common.collect.Iterators; import com.google.common.io.ByteSource; -import com.google.common.io.CharSource; import com.google.common.io.Files; import com.google.common.io.Resources; - import org.junit.rules.TemporaryFolder; +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.Iterator; + +import static java.util.Collections.emptyIterator; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; //~--- JDK imports ------------------------------------------------------------ -import java.io.File; -import java.io.IOException; - -import java.net.URL; - -import java.util.Iterator; - /** * * @author Sebastian Sdorra @@ -196,7 +192,7 @@ public class CacheConfigurationTestLoader implements CacheConfigurationLoader if (moduleConfigurations == null) { - urlIterator = Iterators.emptyIterator(); + urlIterator = emptyIterator(); } else { diff --git a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java index 68cf2087bd..efd3f673b0 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerTest.java @@ -43,7 +43,11 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; -import sonia.scm.*; +import sonia.scm.AlreadyExistsException; +import sonia.scm.HandlerEventType; +import sonia.scm.Manager; +import sonia.scm.ManagerTestBase; +import sonia.scm.NotFoundException; import sonia.scm.config.ScmConfiguration; import sonia.scm.event.ScmEventBus; import sonia.scm.repository.api.HookContext; @@ -56,9 +60,15 @@ import sonia.scm.security.KeyGenerator; import sonia.scm.store.ConfigurationStoreFactory; import sonia.scm.store.JAXBConfigurationStoreFactory; -import java.util.*; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import java.util.Stack; -import static org.hamcrest.Matchers.*; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.hasProperty; +import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -83,7 +93,7 @@ import static org.mockito.Mockito.when; password = "secret", configuration = "classpath:sonia/scm/repository/shiro.ini" ) -public class DefaultRepositoryManagerTest extends ManagerTestBase { +public class DefaultRepositoryManagerTest extends ManagerTestBase { @Rule public ShiroRule shiro = new ShiroRule(); @@ -96,7 +106,7 @@ public class DefaultRepositoryManagerTest extends ManagerTestBase keys = new Stack<>(); @@ -260,7 +269,7 @@ public class DefaultRepositoryManagerTest extends ManagerTestBaseemptySet()); } - private Repository createRepository(Repository repository) throws RepositoryException { + private Repository createRepository(Repository repository) throws AlreadyExistsException { manager.create(repository); assertNotNull(repository.getId()); assertNotNull(manager.get(repository.getId())); @@ -541,17 +549,16 @@ public class DefaultRepositoryManagerTest extends ManagerTestBase manager, Repository repository) - throws RepositoryException { + private void delete(Manager manager, Repository repository) throws NotFoundException { String id = repository.getId(); diff --git a/scm-webapp/src/test/java/sonia/scm/security/JwtAccessTokenBuilderTest.java b/scm-webapp/src/test/java/sonia/scm/security/JwtAccessTokenBuilderTest.java index 9817389597..6dda005019 100644 --- a/scm-webapp/src/test/java/sonia/scm/security/JwtAccessTokenBuilderTest.java +++ b/scm-webapp/src/test/java/sonia/scm/security/JwtAccessTokenBuilderTest.java @@ -36,20 +36,26 @@ import com.github.sdorra.shiro.SubjectAware; import com.google.common.collect.Sets; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; +import org.apache.shiro.util.ThreadContext; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + import java.util.Random; import java.util.Set; import java.util.concurrent.TimeUnit; -import org.apache.shiro.util.ThreadContext; -import org.junit.Test; -import static org.junit.Assert.*; -import static org.hamcrest.Matchers.*; -import org.junit.Before; -import org.junit.Rule; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import static org.mockito.Mockito.*; -import org.mockito.junit.MockitoJUnitRunner; +import static org.hamcrest.Matchers.isEmptyOrNullString; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.when; /** * Unit test for {@link JwtAccessTokenBuilder}. diff --git a/scm-webapp/src/test/java/sonia/scm/selenium/page/RepositoriesAddPage.java b/scm-webapp/src/test/java/sonia/scm/selenium/page/RepositoriesAddPage.java index f9f00056ae..a6b6798b7f 100644 --- a/scm-webapp/src/test/java/sonia/scm/selenium/page/RepositoriesAddPage.java +++ b/scm-webapp/src/test/java/sonia/scm/selenium/page/RepositoriesAddPage.java @@ -30,8 +30,7 @@ */ package sonia.scm.selenium.page; -import com.google.common.base.Objects; -import java.util.List; +import com.google.common.base.MoreObjects; import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.NotFoundException; @@ -41,6 +40,8 @@ import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.ui.WebDriverWait; import sonia.scm.repository.Repository; +import java.util.List; + /** * Page object for scm-manager's repository creation page. * @@ -130,7 +131,7 @@ public class RepositoriesAddPage extends BasePage { String script = "Sonia.repository.getTypeByName('" + type + "').displayName;"; displayName = (String) ((JavascriptExecutor)driver).executeScript(script); } - return Objects.firstNonNull(displayName, type); + return MoreObjects.firstNonNull(displayName, type); } } diff --git a/scm-webapp/src/test/resources/sonia/scm/api/v2/group-test-update-concurrent-modification.json b/scm-webapp/src/test/resources/sonia/scm/api/v2/group-test-update-concurrent-modification.json new file mode 100644 index 0000000000..6450f5309c --- /dev/null +++ b/scm-webapp/src/test/resources/sonia/scm/api/v2/group-test-update-concurrent-modification.json @@ -0,0 +1,13 @@ +{ + "description": "Updated description", + "name": "admin", + "type": "xml", + "_embedded": { + "members": [ + { + "name": "user" + } + ] + }, + "lastModified": "1970-01-01T00:00:00.00Z" +} diff --git a/scm-webapp/src/test/resources/sonia/scm/api/v2/group-test-update-concurrent-modification_null_date.json b/scm-webapp/src/test/resources/sonia/scm/api/v2/group-test-update-concurrent-modification_null_date.json new file mode 100644 index 0000000000..324a2ef3c0 --- /dev/null +++ b/scm-webapp/src/test/resources/sonia/scm/api/v2/group-test-update-concurrent-modification_null_date.json @@ -0,0 +1,12 @@ +{ + "description": "Updated description", + "name": "admin", + "type": "xml", + "_embedded": { + "members": [ + { + "name": "user" + } + ] + } +} diff --git a/scm-webapp/src/test/resources/sonia/scm/api/v2/group-test-update.json b/scm-webapp/src/test/resources/sonia/scm/api/v2/group-test-update.json index fd41ff5837..13d6d5f574 100644 --- a/scm-webapp/src/test/resources/sonia/scm/api/v2/group-test-update.json +++ b/scm-webapp/src/test/resources/sonia/scm/api/v2/group-test-update.json @@ -1,11 +1,13 @@ { "description": "Updated description", "name": "admin", + "type": "xml", "_embedded": { "members": [ { "name": "user" } ] - } + }, + "lastModified": "1970-01-01T01:00:00.00Z" }