/*******************************************************************************
* 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.wink.server.internal.application;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import javax.ws.rs.Path;
import javax.ws.rs.core.Application;
import javax.ws.rs.ext.Provider;
import junit.framework.TestCase;
import org.apache.wink.common.AbstractDynamicResource;
import org.apache.wink.common.WinkApplication;
import org.apache.wink.common.internal.lifecycle.LifecycleManagersRegistry;
import org.apache.wink.common.internal.providers.entity.FileProvider;
import org.apache.wink.common.internal.providers.entity.StreamingOutputProvider;
import org.apache.wink.common.internal.providers.entity.StringProvider;
import org.apache.wink.common.internal.registry.ProvidersRegistry;
import org.apache.wink.server.internal.registry.ResourceRegistry;
import org.apache.wink.server.internal.resources.HtmlServiceDocumentResource;
import org.apache.wink.server.internal.resources.RootResource;
public class ApplicationProcessorTest extends TestCase {
private static class ResourceRegistryMock extends ResourceRegistry {
List<Object> instances = new ArrayList<Object>();
List<Class<?>> classes = new ArrayList<Class<?>>();
public ResourceRegistryMock() {
super(new LifecycleManagersRegistry(), null);
}
public void addResource(Object instance) {
addResource(instance, 0.5);
}
public void addResource(Object instance, double priority) {
if (instance instanceof BadResource) {
throw new BadResource("BadResource cannot be added");
}
instances.add(instance);
}
public void addResource(Class<?> clazz) {
addResource(clazz, 0.5);
}
public void addResource(Class<?> clazz, double priority) {
if (BadResource.class == clazz) {
throw new BadResource("BadResource cannot be added");
}
classes.add(clazz);
}
}
private static class ProvidersRegistryMock extends ProvidersRegistry {
List<Object> instances = new ArrayList<Object>();
List<Class<?>> classes = new ArrayList<Class<?>>();
public ProvidersRegistryMock() {
super(new LifecycleManagersRegistry(), null);
}
public boolean addProvider(Class<?> cls) {
return addProvider(cls, 0.5);
}
public boolean addProvider(Object provider) {
return addProvider(provider, 0.5);
}
public boolean addProvider(Class<?> cls, double priority) {
if (BadProvider.class == cls) {
throw new BadProvider("BadProvider cannot be added");
}
return classes.add(cls);
}
public boolean addProvider(Class<?> cls, double priority, boolean isSystemProvider) {
if (BadProvider.class == cls) {
throw new BadProvider("BadProvider cannot be added");
}
return classes.add(cls);
}
public boolean addProvider(Object provider, double priority) {
if (provider instanceof BadProvider) {
throw new BadProvider("BadProvider cannot be added");
}
return instances.add(provider);
}
public boolean addProvider(Object provider, double priority, boolean isSystemProvider) {
if (provider instanceof BadProvider) {
throw new BadProvider("BadProvider cannot be added");
}
return instances.add(provider);
}
}
@Provider
private static class BadProvider extends RuntimeException {
public BadProvider() {
super();
}
public BadProvider(String message) {
super(message);
}
}
@Path("bad-resource")
private static class BadResource extends RuntimeException {
public BadResource() {
super();
}
public BadResource(String message) {
super(message);
}
}
private static final StreamingOutputProvider StreamingOutputProvider =
new StreamingOutputProvider();
private static final RootResource rootResource = new RootResource();
private static class ApplicationMock extends Application {
@Override
public Set<Class<?>> getClasses() {
LinkedHashSet<Class<?>> classes = new LinkedHashSet<Class<?>>();
classes.add(FileProvider.class); // provider
classes.add(BadResource.class); // simulate resource exception
classes.add(String.class); // should be ignored
classes.add(BadProvider.class); // simulate provider exception
classes.add(RootResource.class); // resource
return classes;
}
@Override
public Set<Object> getSingletons() {
LinkedHashSet<Object> instances = new LinkedHashSet<Object>();
instances.add(StreamingOutputProvider); // provider
instances.add(new BadResource()); // simulate resource exception
instances.add("bla-bla"); // should be ignored
instances.add(new BadProvider()); // simulate provider exception
instances.add(rootResource);
return instances;
}
}
private static final HtmlServiceDocumentResource HtmlServiceDocument =
new HtmlServiceDocumentResource();
private static final StringProvider StringProvider = new StringProvider();
private static final AbstractDynamicResource DynamicResource =
new AbstractDynamicResource() {
};
private static class WinkApplicationMock extends WinkApplication {
@Override
public Set<Class<?>> getClasses() {
LinkedHashSet<Class<?>> classes = new LinkedHashSet<Class<?>>();
classes.add(FileProvider.class); // provider
classes.add(BadResource.class); // simulate resource exception
classes.add(String.class); // should be ignored
classes.add(BadProvider.class); // simulate provider exception
classes.add(RootResource.class); // resource
return classes;
}
@Override
public Set<Object> getSingletons() {
LinkedHashSet<Object> instances = new LinkedHashSet<Object>();
instances.add(StreamingOutputProvider); // provider
instances.add(new BadResource()); // simulate resource exception
instances.add("bla-bla"); // should be ignored
instances.add(new BadProvider()); // simulate provider exception
instances.add(rootResource); // resource
return instances;
}
@Override
public Set<Object> getInstances() {
LinkedHashSet<Object> instances = new LinkedHashSet<Object>();
instances.add(StringProvider);
instances.add("bla-bla"); // should be ignored
instances.add(new BadResource()); // simulate resource exception
instances.add(HtmlServiceDocument);
instances.add(new BadProvider()); // simulate provider exception
instances.add(DynamicResource);
return instances;
}
}
public void testApplication() {
ResourceRegistryMock resourceRegistry = new ResourceRegistryMock();
ProvidersRegistryMock providersRegistry = new ProvidersRegistryMock();
new ApplicationProcessor(new ApplicationMock(), resourceRegistry, providersRegistry, false)
.process();
assertTrue(providersRegistry.classes.contains(FileProvider.class));
assertTrue(resourceRegistry.classes.contains(RootResource.class));
assertEquals(1, providersRegistry.classes.size());
assertEquals(1, resourceRegistry.classes.size());
assertTrue(providersRegistry.instances.contains(StreamingOutputProvider));
assertTrue(resourceRegistry.instances.contains(rootResource));
assertEquals(1, providersRegistry.instances.size());
assertEquals(1, resourceRegistry.instances.size());
}
public void testWinkApplication() {
ResourceRegistryMock resourceRegistry = new ResourceRegistryMock();
ProvidersRegistryMock providersRegistry = new ProvidersRegistryMock();
new ApplicationProcessor(new WinkApplicationMock(), resourceRegistry, providersRegistry,
false).process();
assertTrue(providersRegistry.classes.contains(FileProvider.class));
assertTrue(resourceRegistry.classes.contains(RootResource.class));
assertEquals(1, providersRegistry.classes.size());
assertEquals(1, resourceRegistry.classes.size());
assertTrue(providersRegistry.instances.contains(StreamingOutputProvider));
assertTrue(providersRegistry.instances.contains(StringProvider));
assertTrue(resourceRegistry.instances.contains(rootResource));
assertTrue(resourceRegistry.instances.contains(HtmlServiceDocument));
assertTrue(resourceRegistry.instances.contains(DynamicResource));
assertEquals(2, providersRegistry.instances.size());
assertEquals(3, resourceRegistry.instances.size());
}
}