package act;
/*-
* #%L
* ACT Framework
* %%
* Copyright (C) 2014 - 2017 ActFramework
* %%
* 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.
* #L%
*/
import org.osgl.util.IO;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.context.SessionScoped;
import java.io.Closeable;
import java.lang.annotation.Annotation;
import java.util.Collection;
public interface Destroyable {
void destroy();
boolean isDestroyed();
Class<? extends Annotation> scope();
enum Util {
;
/**
* Helper method to destroy all elements in a in a {@link Destroyable} collection
*
* @param col the collection contains {@link Destroyable} elements
* @deprecated use {@link #destroyAll(Collection, Class)} instead
*/
public static void destroyAll(Collection<? extends Destroyable> col) {
destroyAll(col, null);
}
public static void destroyAll(Collection<? extends Destroyable> col, Class<? extends Annotation> scope) {
for (Destroyable e : col) {
if (inScope(e, scope)) {
e.destroy();
if (e instanceof Closeable) {
IO.close((Closeable) e);
}
}
}
}
/**
* Helper method to destroy all {@link Destroyable} elements,
* and close all {@link Closeable} elements in the collection specified
*
* @param col the collection might contains {@link Destroyable} and
* {@link Closeable} elements
*/
@Deprecated
public static void tryDestroyAll(Collection<?> col) {
tryDestroyAll(col, null);
}
/**
* Helper method to destroy all {@link Destroyable} elements,
* and close all {@link Closeable} elements in the collection specified
*
* @param col the collection might contains {@link Destroyable} and
* {@link Closeable} elements
* @param scope specify the scope annotation.
*/
public static void tryDestroyAll(Collection<?> col, Class<? extends Annotation> scope) {
if (null == col) {
return;
}
for (Object o : col) {
if (inScope(o, scope)) {
if (o instanceof Destroyable) {
((Destroyable) o).destroy();
}
if (o instanceof Closeable) {
IO.close((Closeable) o);
}
}
}
col.clear();
}
public static void tryDestroy(Object o) {
tryDestroy(o, null);
}
public static void tryDestroy(Object o, Class<? extends Annotation> scope) {
if (null == o) {
return;
}
if (!inScope(o, scope)) {
return;
}
if (o instanceof Destroyable) {
((Destroyable) o).destroy();
}
if (o instanceof Closeable) {
IO.close((Closeable) o);
}
}
private static boolean inScope(Object o, Class<? extends Annotation> scope) {
if (null == o) {
return false;
}
if (null == scope || scope == ApplicationScoped.class) {
return true;
}
Class<?> c = o.getClass();
if (c.isAnnotationPresent(scope)) {
return true;
}
if (scope == SessionScoped.class) {
// RequestScoped is always inside Session scope
return c.isAnnotationPresent(RequestScoped.class);
}
return false;
}
}
}