All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jboss.resteasy.jsapi.ServiceRegistry Maven / Gradle / Ivy

The newest version!
package org.jboss.resteasy.jsapi;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;

import org.jboss.logging.Logger.Level;
import org.jboss.resteasy.core.ResourceLocatorInvoker;
import org.jboss.resteasy.core.ResourceMethodInvoker;
import org.jboss.resteasy.core.ResourceMethodRegistry;
import org.jboss.resteasy.jsapi.i18n.LogMessages;
import org.jboss.resteasy.jsapi.i18n.Messages;
import org.jboss.resteasy.spi.ResourceInvoker;
import org.jboss.resteasy.spi.ResteasyProviderFactory;
import org.jboss.resteasy.spi.metadata.ResourceLocator;
import org.jboss.resteasy.util.GetRestful;

/**
 * @author Stéphane Épardaud
 */
public class ServiceRegistry {
    private static final long serialVersionUID = -1985015444704126795L;

    private ResourceMethodRegistry registry;

    private ResteasyProviderFactory providerFactory;

    private ServiceRegistry parent;

    private ArrayList methods;

    private ArrayList locators;

    private ResourceLocatorInvoker invoker;

    private String uri;

    private String functionPrefix;

    public ServiceRegistry getParent() {
        return parent;
    }

    public ServiceRegistry(final ServiceRegistry parent, final ResourceMethodRegistry registry,
            final ResteasyProviderFactory providerFactory, final ResourceLocatorInvoker invoker) throws Exception {
        this.parent = parent;
        this.registry = registry;
        this.providerFactory = providerFactory;
        this.invoker = invoker;
        if (invoker != null) {
            Method method = invoker.getMethod();

            ResourceLocator resourceLocator = MethodMetaData.getResourceLocator(invoker);

            String methodPathVal = resourceLocator.getPath();
            String classPathVal = resourceLocator.getResourceClass().getPath();

            this.uri = MethodMetaData.appendURIFragments(parent, classPathVal, methodPathVal);

            if (parent.isRoot())
                this.functionPrefix = method.getDeclaringClass().getSimpleName() + "." + method.getName();
            else
                this.functionPrefix = parent.getFunctionPrefix() + "." + method.getName();
        }
        scanRegistry();
    }

    private void scanRegistry() throws Exception {
        methods = new ArrayList();
        locators = new ArrayList();
        for (Entry> entry : registry.getBounded().entrySet()) {
            List invokers = entry.getValue();
            for (ResourceInvoker invoker : invokers) {
                if (invoker instanceof ResourceMethodInvoker) {
                    methods.add(new MethodMetaData(this, (ResourceMethodInvoker) invoker));
                } else if (invoker instanceof ResourceLocatorInvoker) {
                    ResourceLocatorInvoker locator = (ResourceLocatorInvoker) invoker;
                    Method method = locator.getMethod();
                    Class locatorType = method.getReturnType();
                    Class[] locatorResourceTypes = GetRestful.getSubResourceClasses(locatorType);
                    for (Class locatorResourceType : locatorResourceTypes) {
                        if (locatorResourceType == null) {
                            // FIXME: we could generate an error for the client, which would be more informative than
                            // just logging this
                            if (LogMessages.LOGGER.isEnabled(Level.WARN))
                                LogMessages.LOGGER.warn(Messages.MESSAGES
                                        .impossibleToGenerateJsapi(method.getDeclaringClass().getName(), method.getName()));
                            // skip this
                            continue;
                        }
                        ResourceMethodRegistry locatorRegistry = new ResourceMethodRegistry(providerFactory);
                        locatorRegistry.addResourceFactory(null, null, locatorResourceType);
                        locators.add(new ServiceRegistry(this, locatorRegistry, providerFactory, locator));
                    }
                }
            }
        }
    }

    public List getMethodMetaData() {
        return methods;
    }

    public List getLocators() {
        return locators;
    }

    public String getUri() {
        return uri;
    }

    public boolean isRoot() {
        return parent == null;
    }

    public String getFunctionPrefix() {
        return functionPrefix;
    }

    public void collectResourceMethodsUntilRoot(List methods) {
        if (isRoot())
            return;
        methods.add(invoker.getMethod());
        parent.collectResourceMethodsUntilRoot(methods);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy