/******************************************************************************* * Copyright (c) 2012-2016 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.everrest.core.impl; import org.everrest.core.ObjectFactory; import org.everrest.core.ObjectModel; import org.everrest.core.ResourceBinder; import javax.ws.rs.core.Application; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; /** * @author andrew00x */ public class ApplicationPublisher { private final ResourceBinder resources; private final RestComponentResolver componentResolver; public ApplicationPublisher(ResourceBinder resources, ProviderBinder providers) { this(resources, new RestComponentResolver(resources, providers)); } ApplicationPublisher(ResourceBinder resources, RestComponentResolver componentResolver) { this.resources = resources; this.componentResolver = componentResolver; } public void publish(Application application) { Set<Class<?>> classes = new LinkedHashSet<>(); Set<Class<?>> appClasses = application.getClasses(); if (appClasses != null) { classes.addAll(appClasses); } if (application instanceof EverrestApplication) { EverrestApplication everrest = (EverrestApplication)application; for (Map.Entry<String, Class<?>> e : everrest.getResourceClasses().entrySet()) { Class<?> clazz = e.getValue(); addResource(e.getKey(), clazz); classes.remove(clazz); } for (Map.Entry<String, Object> e : everrest.getResourceSingletons().entrySet()) { addResource(e.getKey(), e.getValue()); } for (ObjectFactory<? extends ObjectModel> factory : everrest.getFactories()) { addFactory(factory); classes.remove(factory.getObjectModel().getObjectClass()); } } for (Class<?> clazz : classes) { addPerRequest(clazz); } Set<Object> singletons = application.getSingletons(); if (singletons != null) { for (Object instance : singletons) { addSingleton(instance); } } } private void addResource(String uriPattern, Class<?> resourceClass) { resources.addResource(uriPattern, resourceClass, null); } private void addResource(String uriPattern, Object resource) { resources.addResource(uriPattern, resource, null); } private void addSingleton(Object instance) { componentResolver.addSingleton(instance); } @SuppressWarnings({"unchecked"}) private void addPerRequest(Class clazz) { componentResolver.addPerRequest(clazz); } @SuppressWarnings({"unchecked"}) private void addFactory(ObjectFactory factory) { componentResolver.addFactory(factory); } }