Hello SQLMap development team,
I would like to post this idea again,
which is 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,
-------------------------------
--
Tak Yoshida mailto:[EMAIL PROTECTED]