blob: 9c3897889283bdfff1eed43f8a7a51e9aa3b0937 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.axis2.transport.testkit.tests;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class TestResourceSet {
enum Status { UNRESOLVED, RESOLVED, SETUP, RECYCLED };
private static Log log = LogFactory.getLog(TestResourceSet.class);
private final TestResourceSet parent;
private final List<TestResource> unresolvedResources = new LinkedList<TestResource>();
final List<TestResource> resolvedResources = new LinkedList<TestResource>();
Status status = Status.UNRESOLVED;
public TestResourceSet(TestResourceSet parent) {
this.parent = parent;
}
public TestResourceSet() {
this(null);
}
public void addResource(Object resource) {
if (status != Status.UNRESOLVED) {
throw new IllegalStateException();
}
unresolvedResources.add(new TestResource(resource));
}
public void addResources(Object... resources) {
for (Object resource : resources) {
addResource(resource);
}
}
public Object[] getResources() {
if (status == Status.UNRESOLVED) {
throw new IllegalStateException();
}
Object[] result = new Object[resolvedResources.size()];
int i = 0;
for (TestResource resource : resolvedResources) {
result[i++] = resource.getInstance();
}
return result;
}
public void resolve() {
if (status == Status.UNRESOLVED) {
while (!unresolvedResources.isEmpty()) {
resolveResource(unresolvedResources.get(0));
}
status = Status.RESOLVED;
}
}
private void resolveResource(TestResource resource) {
unresolvedResources.remove(resource);
resource.resolve(this);
resolvedResources.add(resource);
}
TestResource[] findResources(Class<?> clazz, boolean allowAutoCreate) {
List<TestResource> result = new LinkedList<TestResource>();
if (parent != null) {
result.addAll(Arrays.asList(parent.findResources(clazz, false)));
}
for (TestResource resource : resolvedResources) {
if (clazz.isInstance(resource.getInstance())) {
result.add(resource);
}
}
List<TestResource> unresolvedMatchingResources = new LinkedList<TestResource>();
for (TestResource resource : unresolvedResources) {
if (clazz.isInstance(resource.getInstance())) {
unresolvedMatchingResources.add(resource);
}
}
for (TestResource resource : unresolvedMatchingResources) {
resolveResource(resource);
result.add(resource);
}
if (allowAutoCreate && result.isEmpty()) {
TestResource resource;
try {
Field field = clazz.getField("INSTANCE");
resource = new TestResource(field.get(null));
} catch (Throwable ex) {
resource = null;
}
if (resource != null) {
unresolvedResources.add(resource);
resolveResource(resource);
result.add(resource);
}
}
return result.toArray(new TestResource[result.size()]);
}
public void setUp() throws Exception {
resolve();
if (status != Status.RESOLVED) {
throw new IllegalStateException();
}
setUp(resolvedResources);
status = Status.SETUP;
}
static List<TestResource> filterOnHasLifecycle(List<TestResource> resources) {
List<TestResource> result = new ArrayList<TestResource>(resources.size());
for (TestResource resource : resources) {
if (resource.hasLifecycle()) {
result.add(resource);
}
}
return result;
}
static void setUp(List<TestResource> resources) throws Exception {
resources = filterOnHasLifecycle(resources);
if (!resources.isEmpty()) {
log.info("Setting up: " + resources);
for (TestResource resource : resources) {
resource.setUp();
}
}
}
public void tearDown() throws Exception {
if (status != Status.SETUP) {
throw new IllegalStateException();
}
tearDown(resolvedResources);
}
static void tearDown(List<TestResource> resources) throws Exception {
resources = filterOnHasLifecycle(resources);
if (!resources.isEmpty()) {
log.info("Tearing down: " + resources);
for (ListIterator<TestResource> it = resources.listIterator(resources.size()); it.hasPrevious(); ) {
it.previous().tearDown();
}
}
}
@Override
public String toString() {
return resolvedResources.toString();
}
}