diff --git a/scm-core/src/main/java/sonia/scm/BasicContextProvider.java b/scm-core/src/main/java/sonia/scm/BasicContextProvider.java index 262050f9b9..bd55d8c682 100644 --- a/scm-core/src/main/java/sonia/scm/BasicContextProvider.java +++ b/scm-core/src/main/java/sonia/scm/BasicContextProvider.java @@ -192,6 +192,20 @@ public class BasicContextProvider implements SCMContextProvider { throw new ConfigurationException(ex); } + finally + { + + // do not use logger or IOUtil, + // http://www.slf4j.org/codes.html#substituteLogger + try + { + input.close(); + } + catch (IOException ex) + { + ex.printStackTrace(System.err); + } + } } return properties.getProperty(MAVEN_PROPERTY_VERSION, DEFAULT_VERSION); diff --git a/scm-core/src/main/java/sonia/scm/io/AbstractReader.java b/scm-core/src/main/java/sonia/scm/io/AbstractReader.java index 4b60b7f25b..9fd4f700d0 100644 --- a/scm-core/src/main/java/sonia/scm/io/AbstractReader.java +++ b/scm-core/src/main/java/sonia/scm/io/AbstractReader.java @@ -33,6 +33,10 @@ package sonia.scm.io; +//~--- non-JDK imports -------------------------------------------------------- + +import sonia.scm.util.IOUtil; + //~--- JDK imports ------------------------------------------------------------ import java.io.ByteArrayInputStream; @@ -104,6 +108,19 @@ public abstract class AbstractReader */ public T read(File file) throws IOException { - return read(new FileInputStream(file)); + T result = null; + InputStream input = null; + + try + { + input = new FileInputStream(file); + result = read(input); + } + finally + { + IOUtil.close(input); + } + + return result; } } diff --git a/scm-core/src/main/java/sonia/scm/io/AbstractResourceProcessor.java b/scm-core/src/main/java/sonia/scm/io/AbstractResourceProcessor.java index 9a3481fe77..8b5c1d1dd7 100644 --- a/scm-core/src/main/java/sonia/scm/io/AbstractResourceProcessor.java +++ b/scm-core/src/main/java/sonia/scm/io/AbstractResourceProcessor.java @@ -33,6 +33,10 @@ package sonia.scm.io; +//~--- non-JDK imports -------------------------------------------------------- + +import sonia.scm.util.IOUtil; + //~--- JDK imports ------------------------------------------------------------ import java.io.BufferedReader; @@ -112,7 +116,20 @@ public abstract class AbstractResourceProcessor implements ResourceProcessor @Override public void process(File input, File output) throws IOException { - process(new FileReader(input), new FileWriter(input)); + Reader reader = null; + Writer writer = null; + + try + { + reader = new FileReader(input); + writer = new FileWriter(output); + process(reader, writer); + } + finally + { + IOUtil.close(reader); + IOUtil.close(writer); + } } /** 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 fb965c248e..d8c4a03ca0 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Changeset.java +++ b/scm-core/src/main/java/sonia/scm/repository/Changeset.java @@ -106,6 +106,25 @@ public class Changeset extends BasicPropertiesAware //~--- methods -------------------------------------------------------------- + /** + * Method description + * + * + * @return + */ + @Override + public Changeset clone() + { + Changeset changeset = new Changeset(id, date, author, description); + + changeset.setBranches(branches); + changeset.setTags(tags); + changeset.setModifications(modifications); + changeset.setProperties(properties); + + return changeset; + } + /** * Method description * diff --git a/scm-core/src/main/java/sonia/scm/repository/FileObjectNameComparator.java b/scm-core/src/main/java/sonia/scm/repository/FileObjectNameComparator.java index d059419830..0a912bcb41 100644 --- a/scm-core/src/main/java/sonia/scm/repository/FileObjectNameComparator.java +++ b/scm-core/src/main/java/sonia/scm/repository/FileObjectNameComparator.java @@ -49,7 +49,7 @@ public class FileObjectNameComparator implements Comparator { /** Field description */ - public static FileObjectNameComparator instance = + public static final FileObjectNameComparator instance = new FileObjectNameComparator(); //~--- methods -------------------------------------------------------------- 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 639b60c169..f8b8c50226 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Modifications.java +++ b/scm-core/src/main/java/sonia/scm/repository/Modifications.java @@ -39,6 +39,8 @@ import sonia.scm.util.Util; //~--- JDK imports ------------------------------------------------------------ +import java.io.Serializable; + import java.util.ArrayList; import java.util.List; @@ -54,9 +56,14 @@ import javax.xml.bind.annotation.XmlRootElement; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "modifications") -public class Modifications +public class Modifications implements Serializable { + /** Field description */ + private static final long serialVersionUID = -8902033326668658140L; + + //~--- constructors --------------------------------------------------------- + /** * Constructs ... * 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 297e790738..5d6d083950 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Person.java +++ b/scm-core/src/main/java/sonia/scm/repository/Person.java @@ -41,6 +41,8 @@ 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; @@ -52,9 +54,14 @@ import javax.xml.bind.annotation.XmlRootElement; */ @XmlRootElement(name = "person") @XmlAccessorType(XmlAccessType.FIELD) -public class Person implements Validateable +public class Person implements Validateable, Serializable { + /** Field description */ + private static final long serialVersionUID = -4675080650527063196L; + + //~--- constructors --------------------------------------------------------- + /** * Constructs a new {@link Person}. * This constructor is used by JAXB. @@ -90,7 +97,7 @@ public class Person implements Validateable /** * Parses the given string and returns a {@link Person} object. The string - * should be in the format "name >mail<". if the string contains no + * should be in the format "name >mail<". if the string contains no * "><" the whole string is handled as the name of the {@link Person}. * * @@ -122,7 +129,7 @@ public class Person implements Validateable } /** - * Returns a string representation of the {@link Person} object, + * Returns a string representation of the {@link Person} object, * in the format "name >mail<". * * diff --git a/scm-core/src/main/java/sonia/scm/script/AbstractScmScriptContext.java b/scm-core/src/main/java/sonia/scm/script/AbstractScmScriptContext.java index 86240829c9..fcbc685d62 100644 --- a/scm-core/src/main/java/sonia/scm/script/AbstractScmScriptContext.java +++ b/scm-core/src/main/java/sonia/scm/script/AbstractScmScriptContext.java @@ -33,6 +33,10 @@ package sonia.scm.script; +//~--- non-JDK imports -------------------------------------------------------- + +import sonia.scm.util.IOUtil; + //~--- JDK imports ------------------------------------------------------------ import java.io.File; @@ -40,6 +44,7 @@ import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.Reader; /** * @@ -70,7 +75,20 @@ public abstract class AbstractScmScriptContext implements ScmScriptContext "could not find script ".concat(file.getPath())); } - return createScript(new FileReader(file)); + ScmScript script = null; + Reader reader = null; + + try + { + reader = new FileReader(file); + script = createScript(reader); + } + finally + { + IOUtil.close(reader); + } + + return script; } /** @@ -97,6 +115,17 @@ public abstract class AbstractScmScriptContext implements ScmScriptContext "could not find script ".concat(path)); } - return createScript(new InputStreamReader(stream)); + ScmScript script = null; + + try + { + script = createScript(new InputStreamReader(stream)); + } + finally + { + IOUtil.close(stream); + } + + return script; } } diff --git a/scm-core/src/main/java/sonia/scm/search/SearchUtil.java b/scm-core/src/main/java/sonia/scm/search/SearchUtil.java index d82f2df4d5..01fbf21179 100644 --- a/scm-core/src/main/java/sonia/scm/search/SearchUtil.java +++ b/scm-core/src/main/java/sonia/scm/search/SearchUtil.java @@ -35,7 +35,6 @@ package sonia.scm.search; //~--- non-JDK imports -------------------------------------------------------- -import sonia.scm.Filter; import sonia.scm.TransformFilter; import sonia.scm.util.Util; diff --git a/scm-core/src/main/java/sonia/scm/security/UUIDKeyGenerator.java b/scm-core/src/main/java/sonia/scm/security/UUIDKeyGenerator.java index 361f5e839d..1e7e60bad5 100644 --- a/scm-core/src/main/java/sonia/scm/security/UUIDKeyGenerator.java +++ b/scm-core/src/main/java/sonia/scm/security/UUIDKeyGenerator.java @@ -36,7 +36,6 @@ package sonia.scm.security; //~--- JDK imports ------------------------------------------------------------ import java.util.UUID; -import sonia.scm.security.KeyGenerator; /** *