Thanks pablo (aka baunax)!
I agree that resource -> file: is not always possible. But what about
resource -> URL? After all, i'm converting resources to URLs.
Best regards,
El abr 16, 2011 5:18 p.m., "Pablo Nussembaum" <baunax(a)gmail.com>
escribió:
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
<salaboy(a)gmail.com<mailto:
salaboy(a)gmail.com>> wrote:
>>
>> Can you? or Can't you?
>>
>>
>>
>> On Sat, Apr 16, 2011 at 4:24 PM, Pablo Nussembaum <baunax(a)gmail.com<mailto:
baunax(a)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(a)lists.jboss.org <mailto:rules-dev@lists.jboss.org>
https://lists.jboss.org/mailman/listinfo/rules-dev
>>
>> _______________________________________________
>> rules-dev mailing list
>> rules-dev(a)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 -