diff --git a/scm-core/src/main/java/sonia/scm/io/DeepCopy.java b/scm-core/src/main/java/sonia/scm/io/DeepCopy.java index 3a5a1675d0..81d08982b6 100644 --- a/scm-core/src/main/java/sonia/scm/io/DeepCopy.java +++ b/scm-core/src/main/java/sonia/scm/io/DeepCopy.java @@ -56,57 +56,41 @@ import java.io.ObjectOutputStream; * @since 1.29 * @see http://javatechniques.com/blog/faster-deep-copies-of-java-objects */ -public final class DeepCopy -{ +public final class DeepCopy { + private DeepCopy() { + } + /** * Returns a copy of the object, or null if the object cannot * be serialized. * - * @param orig - * @param + * @param orig object to copy + * @param type of object to copy * - * @return + * @return deep copy of object * * @throws IOException */ @SuppressWarnings("unchecked") - public static T copy(T orig) throws IOException - { - T obj = null; - - Closer closer = Closer.create(); - - try - { - + public static T copy(T orig) throws IOException { + try (Closer closer = Closer.create()) { // Write the object out to a byte array - FastByteArrayOutputStream fbos = - closer.register(new FastByteArrayOutputStream()); - ObjectOutputStream out = closer.register(new ObjectOutputStream(fbos)); - - out.writeObject(orig); - out.flush(); - out.close(); + FastByteArrayOutputStream fbos = closer.register(new FastByteArrayOutputStream()); + try (ObjectOutputStream out = new ObjectOutputStream(fbos)) { + out.writeObject(orig); + out.flush(); + } // Retrieve an input stream from the byte array and read // a copy of the object back in. // use ScmObjectInputStream to solve ClassNotFoundException // for plugin classes - ObjectInputStream in = - closer.register(new ScmObjectInputStream(fbos.getInputStream())); - - obj = (T) in.readObject(); - } - catch (Exception ex) - { + ObjectInputStream in = closer.register(new ScmObjectInputStream(fbos.getInputStream())); + + return (T) in.readObject(); + } catch (ClassNotFoundException ex) { throw new IOException("could not copy object", ex); } - finally - { - closer.close(); - } - - return obj; } } 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 f21c304d58..31a6185182 100644 --- a/scm-core/src/test/java/sonia/scm/io/DeepCopyTest.java +++ b/scm-core/src/test/java/sonia/scm/io/DeepCopyTest.java @@ -45,23 +45,20 @@ import java.io.IOException; import java.io.Serializable; /** - * + * Unit tests for {@link DeepCopy}. + * * @author Sebastian Sdorra */ -public class DeepCopyTest -{ +public class DeepCopyTest { /** - * Method description - * + * Tests {@link DeepCopy#copy(Object)}. * * @throws IOException */ @Test - public void testDeepCopy() throws IOException - { - Person orig = new Person("Tricia", "McMillan", - new Address("Magrathea", "Mainstreet 3")); + public void testDeepCopy() throws IOException { + Person orig = new Person("Tricia", "McMillan", new Address("Magrathea", "Mainstreet 3")); Person copy = DeepCopy.copy(orig); assertNotSame(orig, copy); @@ -69,73 +66,35 @@ public class DeepCopyTest } /** - * Method description - * + * Tests {@link DeepCopy#copy(Object)} with a non serializable object. * * @throws IOException */ @Test(expected = IOException.class) - public void testDeepCopyNonSerializable() throws IOException - { + public void testDeepCopyNonSerializable() throws IOException { DeepCopy.copy(new NonSerializable()); } //~--- inner classes -------------------------------------------------------- - /** - * Class description - * - * - * @version Enter version here..., 14/03/08 - * @author Enter your name here... - */ - private static class Address implements Serializable - { + private static class Address implements Serializable { - /** Field description */ private static final long serialVersionUID = 3200816222378286310L; - - //~--- constructors ------------------------------------------------------- - - /** - * Constructs ... - * - */ + public Address() {} - /** - * Constructs ... - * - * - * @param city - * @param street - */ - public Address(String city, String street) - { + public Address(String city, String street) { this.city = city; this.street = street; } - //~--- methods ------------------------------------------------------------ - - /** - * Method description - * - * - * @param obj - * - * @return - */ @Override - public boolean equals(Object obj) - { - if (obj == null) - { + public boolean equals(Object obj) { + if (obj == null) { return false; } - if (getClass() != obj.getClass()) - { + if (getClass() != obj.getClass()) { return false; } @@ -144,94 +103,40 @@ public class DeepCopyTest return Objects.equal(city, other.city) && Objects.equal(street, other.street); } - - /** - * Method description - * - * - * @return - */ + @Override - public int hashCode() - { + public int hashCode() { return Objects.hashCode(city, street); } //~--- get methods -------------------------------------------------------- - /** - * Method description - * - * - * @return - */ - public String getCity() - { + public String getCity() { return city; } - /** - * Method description - * - * - * @return - */ - public String getStreet() - { + public String getStreet() { return street; } //~--- fields ------------------------------------------------------------- - /** Field description */ private String city; - /** Field description */ private String street; } - - /** - * Class description - * - * - * @version Enter version here..., 14/03/08 - * @author Enter your name here... - */ private static class NonSerializable {} + private static class Person implements Serializable { - /** - * Class description - * - * - * @version Enter version here..., 14/03/08 - * @author Enter your name here... - */ - private static class Person implements Serializable - { - - /** Field description */ private static final long serialVersionUID = -2098386757802626539L; //~--- constructors ------------------------------------------------------- - /** - * Constructs ... - * - */ public Person() {} - /** - * Constructs ... - * - * - * @param firstname - * @param lastname - * @param address - */ - public Person(String firstname, String lastname, Address address) - { + public Person(String firstname, String lastname, Address address) { this.firstname = firstname; this.lastname = lastname; this.address = address; @@ -239,24 +144,13 @@ public class DeepCopyTest //~--- methods ------------------------------------------------------------ - /** - * Method description - * - * - * @param obj - * - * @return - */ @Override - public boolean equals(Object obj) - { - if (obj == null) - { + public boolean equals(Object obj) { + if (obj == null) { return false; } - if (getClass() != obj.getClass()) - { + if (getClass() != obj.getClass()) { return false; } @@ -267,62 +161,31 @@ public class DeepCopyTest && Objects.equal(address, other.address); } - /** - * Method description - * - * - * @return - */ @Override - public int hashCode() - { + public int hashCode() { return Objects.hashCode(firstname, lastname, address); } //~--- get methods -------------------------------------------------------- - /** - * Method description - * - * - * @return - */ - public Address getAddress() - { + public Address getAddress() { return address; } - - /** - * Method description - * - * - * @return - */ - public String getFirstname() - { + + public String getFirstname() { return firstname; } - /** - * Method description - * - * - * @return - */ - public String getLastname() - { + public String getLastname() { return lastname; } //~--- fields ------------------------------------------------------------- - /** Field description */ private Address address; - - /** Field description */ + private String firstname; - /** Field description */ private String lastname; } }