Exemple #1
0
  @Test
  public void testGetObjectInstance() throws Exception {
    config.setAcquireIncrement(5);
    config.setMinConnectionsPerPartition(30);
    config.setMaxConnectionsPerPartition(100);
    config.setPartitionCount(1);

    Reference mockRef = createNiceMock(Reference.class);
    Enumeration<RefAddr> mockEnum = createNiceMock(Enumeration.class);
    RefAddr mockRefAddr = createNiceMock(RefAddr.class);
    expect(mockRef.getAll()).andReturn(mockEnum).anyTimes();
    expect(mockEnum.hasMoreElements()).andReturn(true).times(2);

    expect(mockEnum.nextElement()).andReturn(mockRefAddr).anyTimes();
    expect(mockRefAddr.getType())
        .andReturn("driverClassName")
        .once()
        .andReturn("password")
        .times(2);
    expect(mockRefAddr.getContent())
        .andReturn("com.jolbox.bonecp.MockJDBCDriver")
        .once()
        .andReturn("abcdefgh")
        .once();
    replay(mockRef, mockEnum, mockRefAddr);
    BoneCPDataSource dsb = new BoneCPDataSource();
    BoneCPDataSource result = (BoneCPDataSource) dsb.getObjectInstance(mockRef, null, null, null);
    assertEquals("abcdefgh", result.getPassword());
    verify(mockRef, mockEnum, mockRefAddr);
  }
  /** JNDI object factory so the proxy can be used as a resource. */
  public Object getObjectInstance(
      Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception {
    Reference ref = (Reference) obj;

    String api = null;
    String url = null;
    String user = null;
    String password = null;

    for (int i = 0; i < ref.size(); i++) {
      RefAddr addr = ref.get(i);

      String type = addr.getType();
      String value = (String) addr.getContent();

      if (type.equals("type")) api = value;
      else if (type.equals("url")) url = value;
      else if (type.equals("user")) setUser(value);
      else if (type.equals("password")) setPassword(value);
    }

    if (url == null) throw new NamingException("`url' must be configured for HessianProxyFactory.");
    // XXX: could use meta protocol to grab this
    if (api == null)
      throw new NamingException("`type' must be configured for HessianProxyFactory.");

    ClassLoader loader = Thread.currentThread().getContextClassLoader();
    Class apiClass = Class.forName(api, false, loader);

    return create(apiClass, url);
  }
  private Map<String, String[]> getConfigurationMap(Reference ref) {
    Map<String, String[]> configMap = new HashMap<String, String[]>();

    String separatorChars = ",";
    RefAddr separatorCharsRefAddr = ref.get("separatorChars");
    if (separatorCharsRefAddr != null) {
      String value = (String) separatorCharsRefAddr.getContent();
      if (value != null && !"".equals(value)) {
        separatorChars = value.trim();
      }
    }

    Enumeration addrs = ref.getAll();

    while (addrs.hasMoreElements()) {
      RefAddr addr = (RefAddr) addrs.nextElement();
      String type = addr.getType();
      String value = (String) addr.getContent();

      String[] valueArray = StringUtils.splitPreserveAllTokens(value, separatorChars);

      for (int i = 0; i < valueArray.length; i++) {
        valueArray[i] = valueArray[i].trim();
      }

      configMap.put(type, valueArray);
    }

    return configMap;
  }
    public Object getObjectInstance(Object arg0, Name arg1, Context arg2, Hashtable arg3)
        throws Exception {
      Reference ref = (Reference) arg0;

      RefAddr refAddr = ref.get(0);
      String valueName = refAddr.getType();
      if (!valueName.equalsIgnoreCase("val"))
        throw new RuntimeException("Unrecognized refaddr type = " + valueName);

      String value = (String) refAddr.getContent();

      return new SomeObject(Integer.parseInt(value.trim()));
    }
  /*
   * Ref has no factory.  For each address of type "URL", try its URL
   * context factory.  Returns null if unsuccessful in creating and
   * invoking a factory.
   */
  static Object processURLAddrs(
      Reference ref, Name name, Context nameCtx, Hashtable<?, ?> environment)
      throws NamingException {

    for (int i = 0; i < ref.size(); i++) {
      RefAddr addr = ref.get(i);
      if (addr instanceof StringRefAddr && addr.getType().equalsIgnoreCase("URL")) {

        String url = (String) addr.getContent();
        Object answer = processURL(url, name, nameCtx, environment);
        if (answer != null) {
          return answer;
        }
      }
    }
    return null;
  }
  /** Return a String rendering of this object. */
  @Override
  public String toString() {

    StringBuilder sb = new StringBuilder("HandlerRef[");
    sb.append("className=");
    sb.append(getClassName());
    sb.append(",factoryClassLocation=");
    sb.append(getFactoryClassLocation());
    sb.append(",factoryClassName=");
    sb.append(getFactoryClassName());
    Enumeration<RefAddr> refAddrs = getAll();
    while (refAddrs.hasMoreElements()) {
      RefAddr refAddr = refAddrs.nextElement();
      sb.append(",{type=");
      sb.append(refAddr.getType());
      sb.append(",content=");
      sb.append(refAddr.getContent());
      sb.append("}");
    }
    sb.append("]");
    return (sb.toString());
  }
  /**
   * Create a new Bean instance.
   *
   * @param obj The reference object describing the Bean
   */
  @Override
  public Object getObjectInstance(
      Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws NamingException {

    if (obj instanceof ResourceRef) {

      try {

        Reference ref = (Reference) obj;
        String beanClassName = ref.getClassName();
        Class<?> beanClass = null;
        ClassLoader tcl = Thread.currentThread().getContextClassLoader();
        if (tcl != null) {
          try {
            beanClass = tcl.loadClass(beanClassName);
          } catch (ClassNotFoundException e) {
          }
        } else {
          try {
            beanClass = Class.forName(beanClassName);
          } catch (ClassNotFoundException e) {
            e.printStackTrace();
          }
        }
        if (beanClass == null) {
          throw new NamingException("Class not found: " + beanClassName);
        }

        BeanInfo bi = Introspector.getBeanInfo(beanClass);
        PropertyDescriptor[] pda = bi.getPropertyDescriptors();

        Object bean = beanClass.newInstance();

        Enumeration<RefAddr> e = ref.getAll();
        while (e.hasMoreElements()) {

          RefAddr ra = e.nextElement();
          String propName = ra.getType();

          if (propName.equals(Constants.FACTORY)
              || propName.equals("scope")
              || propName.equals("auth")
              || propName.equals("singleton")) {
            continue;
          }

          String value = (String) ra.getContent();

          Object[] valueArray = new Object[1];

          int i = 0;
          for (i = 0; i < pda.length; i++) {

            if (pda[i].getName().equals(propName)) {

              Class<?> propType = pda[i].getPropertyType();

              if (propType.equals(String.class)) {
                valueArray[0] = value;
              } else if (propType.equals(Character.class) || propType.equals(char.class)) {
                valueArray[0] = Character.valueOf(value.charAt(0));
              } else if (propType.equals(Byte.class) || propType.equals(byte.class)) {
                valueArray[0] = new Byte(value);
              } else if (propType.equals(Short.class) || propType.equals(short.class)) {
                valueArray[0] = new Short(value);
              } else if (propType.equals(Integer.class) || propType.equals(int.class)) {
                valueArray[0] = new Integer(value);
              } else if (propType.equals(Long.class) || propType.equals(long.class)) {
                valueArray[0] = new Long(value);
              } else if (propType.equals(Float.class) || propType.equals(float.class)) {
                valueArray[0] = new Float(value);
              } else if (propType.equals(Double.class) || propType.equals(double.class)) {
                valueArray[0] = new Double(value);
              } else if (propType.equals(Boolean.class) || propType.equals(boolean.class)) {
                valueArray[0] = Boolean.valueOf(value);
              } else {
                throw new NamingException(
                    "String conversion for property type '"
                        + propType.getName()
                        + "' not available");
              }

              Method setProp = pda[i].getWriteMethod();
              if (setProp != null) {
                setProp.invoke(bean, valueArray);
              } else {
                throw new NamingException("Write not allowed for property: " + propName);
              }

              break;
            }
          }

          if (i == pda.length) {
            throw new NamingException("No set method found for property: " + propName);
          }
        }

        return bean;

      } catch (java.beans.IntrospectionException ie) {
        NamingException ne = new NamingException(ie.getMessage());
        ne.setRootCause(ie);
        throw ne;
      } catch (java.lang.IllegalAccessException iae) {
        NamingException ne = new NamingException(iae.getMessage());
        ne.setRootCause(iae);
        throw ne;
      } catch (java.lang.InstantiationException ie2) {
        NamingException ne = new NamingException(ie2.getMessage());
        ne.setRootCause(ie2);
        throw ne;
      } catch (java.lang.reflect.InvocationTargetException ite) {
        NamingException ne = new NamingException(ite.getMessage());
        ne.setRootCause(ite);
        throw ne;
      }

    } else {
      return null;
    }
  }
Exemple #8
0
  /**
   * Create a new Bean instance.
   *
   * @param obj The reference object describing the Bean
   */
  @Override
  public Object getObjectInstance(
      Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws NamingException {

    if (obj instanceof ResourceRef) {

      try {

        Reference ref = (Reference) obj;
        String beanClassName = ref.getClassName();
        Class<?> beanClass = null;
        ClassLoader tcl = Thread.currentThread().getContextClassLoader();
        if (tcl != null) {
          try {
            beanClass = tcl.loadClass(beanClassName);
          } catch (ClassNotFoundException e) {
          }
        } else {
          try {
            beanClass = Class.forName(beanClassName);
          } catch (ClassNotFoundException e) {
            e.printStackTrace();
          }
        }
        if (beanClass == null) {
          throw new NamingException("Class not found: " + beanClassName);
        }

        BeanInfo bi = Introspector.getBeanInfo(beanClass);
        PropertyDescriptor[] pda = bi.getPropertyDescriptors();

        Object bean = beanClass.newInstance();

        /* Look for properties with explicitly configured setter */
        RefAddr ra = ref.get("forceString");
        Map<String, Method> forced = new HashMap<String, Method>();
        String value;

        if (ra != null) {
          value = (String) ra.getContent();
          Class<?> paramTypes[] = new Class[1];
          paramTypes[0] = String.class;
          String setterName;
          int index;

          /* Items are given as comma separated list */
          for (String param : value.split(",")) {
            param = param.trim();
            /* A single item can either be of the form name=method
             * or just a property name (and we will use a standard
             * setter) */
            index = param.indexOf('=');
            if (index >= 0) {
              setterName = param.substring(index + 1).trim();
              param = param.substring(0, index).trim();
            } else {
              setterName =
                  "set" + param.substring(0, 1).toUpperCase(Locale.ENGLISH) + param.substring(1);
            }
            try {
              forced.put(param, beanClass.getMethod(setterName, paramTypes));
            } catch (NoSuchMethodException ex) {
              throw new NamingException(
                  "Forced String setter " + setterName + " not found for property " + param);
            } catch (SecurityException ex) {
              throw new NamingException(
                  "Forced String setter " + setterName + " not allowed for property " + param);
            }
          }
        }

        Enumeration<RefAddr> e = ref.getAll();

        while (e.hasMoreElements()) {

          ra = e.nextElement();
          String propName = ra.getType();

          if (propName.equals(Constants.FACTORY)
              || propName.equals("scope")
              || propName.equals("auth")
              || propName.equals("forceString")
              || propName.equals("singleton")) {
            continue;
          }

          value = (String) ra.getContent();

          Object[] valueArray = new Object[1];

          /* Shortcut for properties with explicitly configured setter */
          Method method = forced.get(propName);
          if (method != null) {
            valueArray[0] = value;
            try {
              method.invoke(bean, valueArray);
            } catch (IllegalAccessException ex) {
              throw new NamingException(
                  "Forced String setter "
                      + method.getName()
                      + " threw IllegalAccessException for property "
                      + propName);
            } catch (IllegalArgumentException ex) {
              throw new NamingException(
                  "Forced String setter "
                      + method.getName()
                      + " threw IllegalArgumentException for property "
                      + propName);
            } catch (InvocationTargetException ex) {
              throw new NamingException(
                  "Forced String setter "
                      + method.getName()
                      + " threw InvocationTargetException for property "
                      + propName);
            }
            continue;
          }

          int i = 0;
          for (i = 0; i < pda.length; i++) {

            if (pda[i].getName().equals(propName)) {

              Class<?> propType = pda[i].getPropertyType();

              if (propType.equals(String.class)) {
                valueArray[0] = value;
              } else if (propType.equals(Character.class) || propType.equals(char.class)) {
                valueArray[0] = Character.valueOf(value.charAt(0));
              } else if (propType.equals(Byte.class) || propType.equals(byte.class)) {
                valueArray[0] = Byte.valueOf(value);
              } else if (propType.equals(Short.class) || propType.equals(short.class)) {
                valueArray[0] = Short.valueOf(value);
              } else if (propType.equals(Integer.class) || propType.equals(int.class)) {
                valueArray[0] = Integer.valueOf(value);
              } else if (propType.equals(Long.class) || propType.equals(long.class)) {
                valueArray[0] = Long.valueOf(value);
              } else if (propType.equals(Float.class) || propType.equals(float.class)) {
                valueArray[0] = Float.valueOf(value);
              } else if (propType.equals(Double.class) || propType.equals(double.class)) {
                valueArray[0] = Double.valueOf(value);
              } else if (propType.equals(Boolean.class) || propType.equals(boolean.class)) {
                valueArray[0] = Boolean.valueOf(value);
              } else {
                throw new NamingException(
                    "String conversion for property "
                        + propName
                        + " of type '"
                        + propType.getName()
                        + "' not available");
              }

              Method setProp = pda[i].getWriteMethod();
              if (setProp != null) {
                setProp.invoke(bean, valueArray);
              } else {
                throw new NamingException("Write not allowed for property: " + propName);
              }

              break;
            }
          }

          if (i == pda.length) {
            throw new NamingException("No set method found for property: " + propName);
          }
        }

        return bean;

      } catch (java.beans.IntrospectionException ie) {
        NamingException ne = new NamingException(ie.getMessage());
        ne.setRootCause(ie);
        throw ne;
      } catch (java.lang.IllegalAccessException iae) {
        NamingException ne = new NamingException(iae.getMessage());
        ne.setRootCause(iae);
        throw ne;
      } catch (java.lang.InstantiationException ie2) {
        NamingException ne = new NamingException(ie2.getMessage());
        ne.setRootCause(ie2);
        throw ne;
      } catch (java.lang.reflect.InvocationTargetException ite) {
        Throwable cause = ite.getCause();
        if (cause instanceof ThreadDeath) {
          throw (ThreadDeath) cause;
        }
        if (cause instanceof VirtualMachineError) {
          throw (VirtualMachineError) cause;
        }
        NamingException ne = new NamingException(ite.getMessage());
        ne.setRootCause(ite);
        throw ne;
      }

    } else {
      return null;
    }
  }