Hi
You can use a bit of Java code to read the file content into memory,
and then use xpath to extract that other file name.
Camel has some helper APIs for that in IOHelper#loadTexxt and XPathBuilder.
Here is some snippet from an unit test
@Test
public void testNotUsingExchangeResultType() throws Exception {
String xml = "<xml><a>1</a><a>2</a></xml>";
// will evaluate as NodeSet
XPathBuilder xpb = new XPathBuilder("/xml/a/text()");
assertEquals("12", xpb.evaluate(context, xml, String.class));
xpb.setResultType(String.class);
assertEquals("1", xpb.evaluate(context, xml));
}
On Thu, Dec 13, 2018 at 2:58 PM John F. Berry
<[email protected]> wrote:
>
> Thank you Claus.. it's great to hear from you again..
> I did see an example close to this on stackoverflow.. someone referenced a
> bean as a filter to check for an extra file to exist, but in that example the
> extra file's name that needed to exist was static.The "chicken or the egg"
> question about that is.. I need to use the xpath in the current consumed XML
> to determine what file should exist for the route to continue. I haven't seen
> to many examples of parameter passing of the internal workings of a Camel
> route to beans and the route accepting data from to use in <choice>. I did
> think I needed to pass this off to another java execution, thus the reason
> I'm pulling my results to the log and so forth, but I still thought I needed
> the facilites of the CamelContext to run first... or is the filter not really
> so close on incept of an inbound file as I think? Is the inbound "message"
> (file in this case) really "consumed" as in loaded/headers made, etc. before
> the filter instruction applies?
> Thanks for the heads up on noop.. I did know I had to address that once
> things were in place.. I put it there to test "once throughs" and was going
> to adjust that later in testing.
>
>
> On Thursday, December 13, 2018 02:43:00 AM EST, Claus
> Ibsen <[email protected]> wrote:
>
> Hi
>
> Just use Java - You can use Java File API to check for the existence
> of a file ;)
>
> You can also use a file filter to only pickup the file where you check
> for the existence of that other file.
> You can then write a bit of Java code as the filter and configure it
> on the file endpoint. In the filter you grab the file context, do the
> xpath to extract the name, and check for the file exists.
>
> Also mind that noop=true will leave the file as-is after processing
> it, but will not pickup it again, unless you configure the idempotent
> to false also. Which you would need in cases while you may
> wait for that other file.
>
> So the better alternative is the file filter, and then move the files
> after it has been processed, so you wont process the file again in the
> future.
> On Thu, Dec 13, 2018 at 1:58 AM John F. Berry
> <[email protected]> wrote:
> >
> > OK.. not hearing any pre-build advise.. I started building.
> > I can successfully extract the XML field value that is the name of the work
> > file out of the consumed file of the route.
> > What I need to do is only move both (the file I'm consuming and it's work
> > file).. if the work file shows up..
> >
> > Here's what I got so far....
> >
> >
> > package org.mainegeneral.camel;
> > import org.apache.camel.Processor;
> > import org.apache.camel.Exchange;
> > import org.apache.camel.builder.RouteBuilder;
> > public class MyRouteBuilder extends RouteBuilder {
> > public void configure() {
> > from("file:src/data?noop=true&include=.*\\.xml")
> >
> > .setProperty("SourceFN").xpath("/SYSTEMJOB/WORKDETAIL/SOURCE_FILENAME",
> > String.class)
> > .process(new Processor() {
> > public void process(Exchange exchange) throws
> > Exception {
> > }
> > } )
> > .log("Reading XML file: ${header.CamelFileName}")
> > .log("XML Source Filename = ${property.SourceFN}")
> > .to("file:target/messages/others");
> > }
> > }
> >
> >
> > Now I will need to not move the XML I'm consuming if the file named in
> > SOURCE_FILENAME doesn't yet exist, and go on to the other XML files in the
> > directory and come back to check this one.
> > I was going to use a choice to perform both those moves in.. but struggling
> > to check for the named SOURCE_FILENAME's existance.
> >
> > Suggestions?
> >
> > Thanks!
> >
> >
> >
> >
> >
> > On Monday, December 10, 2018, 3:10:09 PM EST, John F. Berry
> > <[email protected]> wrote:
> >
> >
> >
> >
> >
> > Figured I'd try something new and ask for advice here first before hitting
> > a brick wall and asking after I hit that dead end...I need to poll for XML
> > files dumping into a specific NFS directory, read in the XML, find the
> > "work" file generated by the task that generated the XML, and move both
> > files together. The XML file is a custom small app specific job detail
> > sort of file, with the exported work contained in a file named between the
> > <SOURCE_FILENAME> tag.I could just regex the file, instead of parsing XML
> > "officially", then use a choice and when satisfied, move both the file I'm
> > reading, and the result from the regex. I don't really need the 50 or so
> > other job statistic tags contained in the XML. I plan to use Java DSL with
> > a blueprint or some Karaf supported type to run as a bundle.
> > Since these xml files are generated at invocation, the "work" file might
> > not show up for a few minutes. In that time, I'm hoping to round-robin any
> > other XML files to find completed "pairs" in this landing directory. Sound
> > simple enough? Any gotchas that people can think of?
> > Thanks!
>
>
>
> --
> Claus Ibsen
> -----------------
> http://davsclaus.com @davsclaus
> Camel in Action 2: https://www.manning.com/ibsen2
--
Claus Ibsen
-----------------
http://davsclaus.com @davsclaus
Camel in Action 2: https://www.manning.com/ibsen2