I've already answered for exactly the same question at google groups

In first you should look at the official documentation which is available online here
You have very old system, so you should install new version of Ensemble at new windows server. Installation Guide 

And copy all of you data from old server to new. But it is may be very difficult task, without knowledge about your application.

As well you should look at Cache Upgrade checklists archive and latest, and Ensemble Release Notes

I've used Delphi so long ago, and could be mistaken. But to be sure that application is not interactive, it should not have any visual components. And as I remember you should start developing from Console Application. To check that actually it does work correctly, you may try with real console tool, something like: dir, md, etc.. You may try this $zf(-2,"dir > testdir.txt"), if after executing this code testdir.txt file will appaer with content for some folder, you'll see that it's work. And it means that in your application should be changed something to be as console application.

If to talk about REST and best practices, then I should say, to update some object or all collection you should use method PUT, while POST should be used only for creating new objects.

What about updating objects, actually it it could be inside objects. And I hope that InterSystems has some optimizations in this case. But I think it is mostly depends on you objects, how difficult they are, and how often you should change this objects. And you of course you can use some profile tools, to understand how many time spends while object is changing and for what.  In may opinion in first you should keep it as is, just update all properties from request, without any checking. Some time it is possible that checking for changes, may take more time, when just save it all.

I managed to work it, I've just extended Cache dialect for Hibernate, and changed GlobalTemporary table which is not support DROP to LocalTemporaryTable. And changed column type for boolean, for supported in Caché data type bit. And looks like, I get working FHIR server which stores all data in Caché.

public class CacheDialect extends Cache71Dialect {

    public CacheDialect() {
        super();
        this.registerColumnType(Types.BOOLEAN, "bit");
    }

    @Override
    public MultiTableBulkIdStrategy getDefaultMultiTableBulkIdStrategy() {
        return new LocalTemporaryTableBulkIdStrategy(
            new IdTableSupportStandardImpl() {
                @Override
                public String generateIdTableName(String baseName) {
                    final String name = super.generateIdTableName( baseName );
                    return name.length() > 25 ? name.substring( 1, 25 ) : name;
                }

                @Override
                public String getCreateIdTableCommand() {
                    return "create global temporary table";
                }
            },
            AfterUseAction.DROP,
            null
        );

    }

}

Actually there are two causes, of this.

First, is a quite simple, installation script looking at previous installation, and can't change if it was already installed in another folder.

But next reason, it is just a small typo in installation script, which suit only for silent install.

file package/csp_gateway/parameters contains CSPGATEWAY_DIR variable instead of CSPGATEWAYDIR

you may just add this line to your installation script, to fix this error.

sed -i '' -e 's/CSPGATEWAY_DIR/CSPGATEWAYDIR/g' ./package/csp_gateway/parameters

And I think, you should ask WRC to fix this error in all next builds.

To find way how to compare time, you should remember format for $horolog, which is has two parts separated with comma. First of part it is a date, which is actually numbers of days since 1841 year, so $horolog=1 it is 01/01/1841. Next part is a seconds in a day, no more than 86400, and may have milliseconds after point.

Know it, you can easily convert $horolog to seconds and compare them

SAMPLES>set date1=$zdth("01/02/2016 10:00")
SAMPLES>set date2=$zdth("01/02/2016 20:00")
SAMPLES>zwrite date1,date2
date1="63919,36000"
date2="63919,72000"

SAMPLES>write ($piece(date1,",")*86400+$p(date1,",",2))>($p(date2,",")*86400+$p(date2,",",2))
0
SAMPLES>write ($piece(date1,",")*86400+$p(date1,",",2))<($p(date2,",")*86400+$p(date2,",",2))
1

You can also use SQL function DATEDIFF, to see difference in seconds between to dates

SAMPLES>write $system.SQL.DATEDIFF("ss",date1,date2)
36000
SAMPLES>write $system.SQL.DATEDIFF("ss",date2,date1)
-36000
SAMPLES>write $system.SQL.DATEDIFF("ss",date1,date1)
0

Why are you so sure in that ?

Any examples of code, and application, which you want to call.

Looks like you want to start something like notepad or so on, which you expected to see. You just can't see what was launched because it is interactive application, but with $zf(-1) you you should use only command-line applications, just because it is server. And such behavior exists since Windows Vista. As I remember you can change it, you just should allow to interact with desktop, in the settings for Caché service.

For now, I need only Data Model and API to get access, in time when even do not have any data model. 
Yes, I know, that we are already have documented api, and will be easier to implement, but I still need some time.

Ok, maybe someone know some testing tool for API, some unit test which can get my base url, and test all functions in that API and says that everything works by standard?

So, you have to modify some entries in AD by data on Caché side.
In first, I have not been done such work before, I'm just trying to suggest what may help you.
Better way to understand what you have to achieve your needs, it's look at classes. Like EnsLib.LDAP.OutboundAdapter which you've already found and %SYS.LDAP which is lowest class, which actually doing all work with LDAP. Actually Enslib.LDAP as I see used deprecated classes from %Net.LDAP.Client.

How it may help? for example? you can find there such method as GetEntryEditObj,  which I think may be used to edit some entries in your AD, if you have enough permissions. Some example you can find in the class for this EntryEdit. Or method ModifyExts in %SYS.LDAP, also has some examples.

Hope it helps.

To support Raspberry Pi, IntersSystems should support ARM, but not sure that so easy, and could be valuable for them, even if remember how quickly  they ended GlobalsDB. But GlobalsDB was a quite good product, and was used in some projects, and even still used. If somebody needs to use micro-pc they can use some alternatives on Intel's process such as Intel Galileo