Sorry "IF I *wasn't* clear" :-P
On 04/16/2011 05:11 PM, Pablo Nussembaum wrote: > Sorry if I was clear. The problem when you do: ClassLoader.getResource( > "resource.path" ) is the the resource can be inside a war the in > WEB-INF/classes and the war could be NOT exploded in > container that's is deployed, so the translation to something like file:// is > NOT reliable. > > On 04/16/2011 05:05 PM, Mauricio Salatino wrote: >> I'm still thinking about that mapping and those assumptions >> >> On Sat, Apr 16, 2011 at 5:05 PM, Mauricio Salatino <sala...@gmail.com >> <mailto:sala...@gmail.com>> wrote: >> >> Can you? or Can't you? >> >> >> >> On Sat, Apr 16, 2011 at 4:24 PM, Pablo Nussembaum <bau...@gmail.com >> <mailto:bau...@gmail.com>> wrote: >> >> Esteban, >> You can assume that a resource that was obtained from the classpath >> exists in your filesystem, for instance it can be a file inside a jar or war >> that are not exploded. In other words you >> can't always convert an URL to "file://". >> >> -- >> Bauna >> >> >> On 04/15/2011 08:52 AM, Esteban Aliverti wrote: >>> Hi Guys, >>> >>> I want to discuss a problem I have found when using the combination >>> of knowledge agent + classpathResources. >>> I will try to describe what am I doing first to give you some >>> context. >>> I'm deploying drools-camel-server in a Tomcat 7 container. Inside >>> the WEB-INF/classes directory I have some DRL files that I want to use. >>> My knowledge-services.xml file declares the following kagent: >>> >>> <drools:kagent id="kagent1" kbase="kbase1" new-instance="false"> >>> <drools:resources> >>> <drools:resource type="DRL" >>> source="*classpath*:simple.drl"/> >>> ... >>> </drools:resources> >>> </drools:kagent> >>> >>> When spring parses this configuration file it creates a >>> KnowledgeAgent instance with a ChangeSet containing all the listed >>> resources. >>> The next step is to start ResourceChangeNotifierService and >>> ResourceChangeScannerService. >>> So far so good. >>> >>> The problem: >>> The problem I'm having is not directly related to drools, but I >>> think it is quite easy to provide a solution for the people that is in my >>> same situation. >>> >>> ClassPathResource is the class that represents a resource defined >>> as "*classpath:"* >>> >>> This class has 2 important methods: >>> >>> public long getLastModified(){ >>> return this.classLoader.getResource( this.path >>> ).openConnection().getLastModified(); >>> } >>> >>> public InputStream getInputStream(){ >>> return this.classLoader.getResourceAsStream( this.path ); >>> } >>> >>> >>> The first method is used by ResourceChangeScannerService to check >>> whether the resource has changed or not. It works fine. When the resource >>> in the filesystem changes, the scanner detects >>> the change without any problem. >>> The scanner ends up notifying the kagent about the change, and the >>> kagent passes the Resource to an instance of KnowledgeBuilder. >>> An here is when things fail. >>> The kbuilder uses the second method of ClassPathResource >>> (getInputStream()) to get the content of the resource. In the case of >>> Tomcat (and probably some other environments), it seems that >>> the classloader (Tomcat's classloader) is using a cache. So the >>> InputStream returned doesn't reflect the current state of the resource. >>> Long story short: the agent is notified about a change in the >>> resource, but the change is never applied to the kbase because the kbuilder >>> is unable to get it :P >>> >>> Solutions: >>> The first solution is not to use classpath resources :). You can >>> use just url resources like http:// or file:/. But honestly, when you have >>> your rules inside your webapp, it is much >>> more comfortable and even manageable to avoid the use of real paths. >>> >>> What I was thinking about (I already have a working prototype) is >>> to create a new Resource type for these cases. This resource type will let >>> you define your resources present in your >>> classpath as usually but it will translate them to URL Resource >>> internally. >>> So, in the example above: >>> >>> <drools:resource type="DRL" source="*URLClasspath*:simple.drl"/> >>> >>> is going to be translated (internally and in a transparent way) to >>> something like: >>> file:/usr/local/apache-tomcat-7/webapps/MyWebapp/WEB-INF/simple.drl. >>> >>> Opinions? >>> >>> XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX >>> >>> Esteban Aliverti >>> - Developer @ http://www.plugtree.com <http://www.plugtree.com> >>> - Blog @ http://ilesteban.wordpress.com >>> >>> >>> _______________________________________________ >>> rules-dev mailing list >>> rules-dev@lists.jboss.org <mailto:rules-dev@lists.jboss.org> >>> https://lists.jboss.org/mailman/listinfo/rules-dev >> >> _______________________________________________ >> rules-dev mailing list >> rules-dev@lists.jboss.org <mailto:rules-dev@lists.jboss.org> >> https://lists.jboss.org/mailman/listinfo/rules-dev >> >> >> >> >> -- >> - CTO @ http://www.plugtree.com >> - MyJourney @ http://salaboy.wordpress.com >> - Co-Founder @ http://www.jbug.com.ar >> >> - Salatino "Salaboy" Mauricio - >> >> >> >> >> -- >> - CTO @ http://www.plugtree.com >> - MyJourney @ http://salaboy.wordpress.com >> - Co-Founder @ http://www.jbug.com.ar >> >> - Salatino "Salaboy" Mauricio -
_______________________________________________ rules-dev mailing list rules-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-dev