docs: @Override
      public Object findByBeanName(String application,
                                   String beanName,
                                   String interfaceName)
                      throws EJBException, RemoteException
      {
          if (application == null)
              throw new IllegalArgumentException("Application name not specified");
          if (beanName == null)
              throw new IllegalArgumentException("Bean name not specified");
          if (interfaceName == null)
              throw new IllegalArgumentException("Interface name not specified");
  
          final boolean isTraceOn = TraceComponent.isAnyTracingEnabled();
  
          if (isTraceOn && tc.isEntryEnabled())
              Tr.entry(tc, "findByBeanName : App = " + application +
                           ", bean = " + beanName + ", interface = " + interfaceName);
  
          Object retObj = null;
          EJSHome home = null;
  
          // -----------------------------------------------------------------------
          // First - find the bean home (EJSHome) based on what is known
          // -----------------------------------------------------------------------
  
          try
          {
              // A module was not explicitly specified, so look for the home in all
              // of the modules within the same application.
              if (isTraceOn && tc.isDebugEnabled())
                  Tr.debug(tc, "looking for home in all app modules...");
  
              home = homeOfHomes.getHomeByName(application, beanName);
          } catch (Throwable ex)
          {
              FFDCFilter.processException(ex, CLASS_NAME + ".findByBeanName",
                                          "182", this);
              EJBException ejbex = ExceptionUtil.EJBException
                              ("Failure locating bean " + beanName +
                               " in application " + application, ex);
              // TODO : Tr.error
              if (isTraceOn && tc.isEntryEnabled())
                  Tr.exit(tc, "findByBeanName: " + ejbex);
  
              throw ejbex;
          }
  
          if (isTraceOn && tc.isDebugEnabled())
              Tr.debug(tc, "home = " + home.getJ2EEName());
  
          // -----------------------------------------------------------------------
          // Second - determine the interface type, and create the return object
          // -----------------------------------------------------------------------
  
          BeanMetaData bmd = home.getBeanMetaData();
  
          // First, check against the home interfaces
          if (interfaceName.equals(bmd.localHomeInterfaceClassName))
          {
              if (isTraceOn && tc.isDebugEnabled())
                  Tr.debug(tc, "match on local home");
  
              retObj = home.getWrapper().getLocalObject();
          }
          else if (interfaceName.equals(bmd.homeInterfaceClassName))
          {
              if (isTraceOn && tc.isDebugEnabled())
                  Tr.debug(tc, "match on remote home");
  
              retObj = getRemoteHomeReference(home, interfaceName);
          }
          else
          {
              if (isTraceOn && tc.isDebugEnabled())
                  Tr.debug(tc, "looking for match on business interface");
  
              // The only thing left are the business interfaces
              retObj = createBusinessObject(home, bmd, interfaceName, true);
          } // End of non-home annotation processing
  
          // Careful not to call toString or it may invoke the customer bean!
          if (isTraceOn && tc.isEntryEnabled())
              Tr.exit(tc, "findByBeanName : " + retObj.getClass().getName());
  
          return retObj;
      }