[ http://issues.apache.org/jira/browse/IBATIS-84?page=comments#action_60293 ] Clinton Begin commented on IBATIS-84: -------------------------------------
Hi Tak, Looking into this a bit further, I wonder if you could manage this using either: 1) A custom cache model implementation (preferred). or 2) A custom type handler. As for the name, ServiceLocatorBean for me does not describe what it does. To me, a Bean is primarily a data centric construct, whereas this is mostly function and no state. ServiceLocator implies that a service is being looked up, but to my eyes it seems that it's actually looking up data. If it is synonymous with a cache, then maybe we should call it a cache. My recommendation is to write a custom cache model. If there is a hook that you need (such as more specific manual flush capability), then let's look at that. If the cache model doesn't work, then a Custom Type Handler might. A CTH is not unlike what you've suggested. Cheers, Clinton > Enhancement proposal: plug in external bean > ------------------------------------------- > > Key: IBATIS-84 > URL: http://issues.apache.org/jira/browse/IBATIS-84 > Project: iBatis for Java > Type: New Feature > Components: SQL Maps > Versions: 2.0.9b > Reporter: Tak Yoshida > > Hello SQLMap development team, > I would like to post this idea again, > which was submitted to sourceforge forum last year. > I believe this is not only for my case in real world, > and makes SQLMap more flexible. > > I have already done on 2.0.9b, and it works pretty well on my project. > If you would reflect my proposal in the future SQLMap, that would be great. > thanks, > Tak Yoshida > -------- Here is the post on Oct 30th for 2.0.7 -------- > I found one thing I should ask, > that is external service bean plug in feature for the complex object query. > > In my project, I need to use Oracle Object Cache Service for disributed > application environment. > and this cache will be managed outside of SQLMap framework, > which mean I cannot use SQLMap cache plugin mechanism where SQLMap manages > cache object itself. > > So I would like to have SQLMap call external service for complex object's sub > query. > > Here is my proposal: > Summary: > Inject ServiceLocator to make SQLMap be able to call the service managed > outside of SQLMap. > > 1: To make use of external object, SqlMapClient has UserServiceBeanLocator > object property. > > public interface SqlMapClient extends SqlMapExecutor, > SqlMapTransactionManager { > public void setUserServiceBeanLocator(UserServiceBeanLocator > serviceBeanLocator); > public UserServiceBeanLocator getUserServiceBeanLocator(); > .... > } > And SqlMapClientImpl has this imlementation. > > public interface UserServiceBeanLocator { > // locator method > public Object getUserServiceBean(String name) throws SqlMapException; > } > > > 2: Extends resultMap's "result" tag attribute to specify the external bean > and the method name. > > <result property="shipMode" column="SMODE" javaType="string" > bean="shipModeDao" method="getShipModeById"/> > instead of > <result property="shipMode" column="SMODE" > select="shipModeSqlMap.getShipModeById"/> > > 3: To support 2, DTD must be enhanced for new two attributes, and > XmlSqlMapClientBuilder must support it. --> SQLMapParser on 2.0.9b > > 4: And to hold these external bean info in mapping object created by > XmlSqlMapClientBuilder, > I introduce UserServiceBeanInfo. > public class UserServiceBeanInfo { > private String beanName; > private String methodName; > private Method method; > ... > } > > 5: Utilizing aboves, BasicResultMap.getResults() method can do nested quesry > for the complex property by calling external service. > > Here is a snippet of the codes > } else if (mapping.getUserServiceBeanInfo() != null) { > // get key for complex property > Object rawValue = getPrimitiveResultMappingValue(rs, mapping); > // get complex property via external service > UserServiceBeanLocator serviceBeanLocator = > request.getSession().getSqlMapClient().getUserServiceBeanLocator(); > UserServiceBeanInfo serviceBeanInfo = mapping.getUserServiceBeanInfo(); > try { > Object service = > serviceBeanLocator.getUserServiceBean(serviceBeanInfo.getBeanName()); > Method method = serviceBeanInfo.getMethod(); // check cacheed one. > if (method == null) { > method = service.getClass().getMethod(serviceBeanInfo.getMethodName(), new > Class[] {mapping.getJavaType()}); > serviceBeanInfo.setMethod(method); // cache it. > } > columnValues[i] = method.invoke(service, new Object[] {rawValue}); > ... exception handling... > } else { > > 6: Application is fully responsible to set this up at startup time. > I am injecting spring ApplicationContext object to SqlMapClient via > ApplicationListener, > ------------------------------- -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - If you want more information on JIRA, or have a bug to report see: http://www.atlassian.com/software/jira