Friday, February 05, 2021

PeopleCode to Move a File... sort of

You ever need to move a file through PeopleCode? Perhaps an App Engine program that needs to move generated content into the process output directory? I found myself in that position today. Surely there is a PeopleCode function for that... right? If you have one, please share it, because it seems the Internet doesn't know about it. A quick Internet search turned up several examples of using Exec with mv. I'm always weary of Exec. If I have to use the command line, I prefer to control it through the Java Runtime (see Exec Processes while Controlling stdin and stdout). Speaking of Java, can we borrow anything from the JRE? I did find my old ITToolbox response showing how to use java.io.File.renameTo to move files. It is still a great solution, but with multiple mounted file systems... well... it actually might fail. So I got to thinking... what about using java.nio? Here is an example:

Local JavaObject &jSource = CreateJavaObject("java.io.File", "c:\temp\JSM_TEST.log").toPath();
Local JavaObject &jTarget = CreateJavaObject("java.io.File", "c:\temp\JSM_TEST_moved.log").toPath();

Local JavaObject &jFiles = GetJavaClass("java.nio.file.Files");
Local JavaObject &jOptions = CreateJavaObject("java.nio.file.CopyOption[]");

&jFiles.move(&jSource, &jTarget, &jOptions);

And, what if you want to overrwrite the destination? Try it with copy options:

Local JavaObject &jSource = CreateJavaObject("java.io.File", "c:\temp\JSM_TEST.log").toPath();
Local JavaObject &jTarget = CreateJavaObject("java.io.File", "c:\temp\JSM_TEST_moved.log").toPath();

Local JavaObject &jFiles = GetJavaClass("java.nio.file.Files");
Local JavaObject &jStandardCopyOptions = GetJavaClass("java.nio.file.StandardCopyOption");
Local JavaObject &jOptions = CreateJavaObject("java.nio.file.CopyOption[]", &jStandardCopyOptions.REPLACE_EXISTING);

&jFiles.move(&jSource, &jTarget, &jamp;Options);

For more details about copy options, take a look at the Java Docs.

Are you ready to take your PeopleSoft development skills to the next level? Check out our latest course offerings at jsmpros.com. Prefer a custom agenda? Contact us for details.

7 comments:

Banksy said...

For Process Scheduler - we had differences in behavior using java to copy/move/delete files in App Engines when using PSAE vs PSAESRV - PSAESRV reuses a JVM between App Engines, whereas PSAE creates and destroys one for each App Engine. For us, this meant PSAESRV was not 'releasing' the file after App Engine finished. Not sure if it was a bug or a feature, but recommend using PSAE. This was PT8.56 / Windows.

Jim Marion said...

Good point, and the App Server behaves the same way, although I am surprised about it keeping a hold on files even in a shared JVM.

Nate said...

I'm working on something at the moment where I needed this exact functionality, and it's funny that you just wrote this up recently. Works great. Thanks.

Jim Marion said...

Thanks, @Nate!

R Saxena said...

works great thanks.

SNR said...

Hi There - With reference to the PSAE not releasing' the file after App Engine finished. Do we have a workaround for this? this is in 8.59 tools

Thanks!

Banksy said...

Disable the app engine server on the process scheduler via psadmin. More commentary is here:

https://psadmin.io/2015/11/30/disabling-the-app-engine-server/