/*
* Copyright 2010 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package spock.lang;
import java.lang.annotation.*;
import org.spockframework.runtime.extension.ExtensionAnnotation;
import org.spockframework.runtime.extension.builtin.AutoCleanupExtension;
/**
* Automatically cleans up the object stored in the annotated field or property
* at the end of its life time. More precisely, auto-cleanup of an object has
* the same effect as, and serves as a convenient replacement for, calling the
* object's <tt>close</tt> method at the end of the spec's <tt>cleanup</tt> method.
* <tt>@Shared</tt> objects are cleaned up at the end of the spec's
* <tt>cleanupSpec</tt> method.
* <h3>Customizing how cleanup is performed</h3>
* By default, an object is cleaned up by invoking its parameterless close()
* method (which is assumed to exist); visibility and return type of this method
* are irrelevant. If some other method should be called instead, override the
* annotation's <tt>value</tt> attribute:
*
* <pre>
* @AutoCleanup("dispose") // invoke the object's "dispose" method
* </pre>
*
* <h3>Cleaning up multiple objects</h3>
* If multiple fields or properties are annotated with <tt>@AutoCleanup</tt>,
* their objects are cleaned up sequentially in reverse field/property declaration
* order, starting from the most derived class and walking up the inheritance chain.
*
* <h3>Handling of exceptions during cleanup</h3>
* If a cleanup operation fails with an exception, the exception is reported
* (just as if it had occurred in a <tt>cleanup</tt> or <tt>cleanupSpec</tt>
* method) and cleanup proceeds with the next annotated object. To prevent
* cleanup exceptions from being reported, override the annotation's <tt>quiet</tt>
* attribute:
*
* <pre>
* @AutoCleanup(quiet = true) // don't report exceptions
* </pre>
*
* @author Peter Niederwieser
*/
@ExtensionAnnotation(AutoCleanupExtension.class)
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoCleanup {
String value() default "close";
boolean quiet() default false;
}