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

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

There is a newer version: 7.0.0.Alpha4
Show newest version
package org.jboss.resteasy.jsapi;

import org.jboss.logging.Logger.Level;
import org.jboss.resteasy.spi.ResourceInvoker;
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.ResteasyProviderFactory;
import org.jboss.resteasy.spi.metadata.ResourceLocator;
import org.jboss.resteasy.util.GetRestful;

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

/**
 * @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 - 2024 Weber Informatics LLC | Privacy Policy