@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; } }
/** * 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; } }