Looks like, you do not know about %Installer.Manifest.  You can use it in any different ways, be it installation new application or just simple changing instance's settings. With this manifest I'm building installation archive with project, it includes deployed code some data, and web sources. I'm installing new server with it, manually, or even with docker. And you can use internal Task Manager to run this installation by schedule automatically. You may also look at this project - GitHubCI, it helps to deploy application automatically just after commit to your github repository.

You can look at the documentation here online

and excerpt about custom installation

The Caché installation program allows you to select certain Caché components to be installed on the computer. For example, you may want to install only the Caché SQL Manager. Keep in mind that some selections require that you also install other components.

and about standard installation

The standard installation procedure installs both Caché server and client components on the computer.

Such error you can face on a windows as well. Your super port has already in use by another instance of Cache. And you can change port for new instance, by editing cache.cpf file in the root of installed Cache. 

To be sure that port is in use you can use some network tools, such as netstat

netstat -na | grep 1972
tcp4       0      0  *.1972                *.*                    LISTEN

or lsof, which can show which process with pid uses this port

sudo lsof -i tcp:1972
cache   14960 cacheusr    4u  IPv4 0x768e107dffb0f4df      0t0  TCP *:1972 (LISTEN)

I did not show how you made connection to the Caché, and looks like, your Java application has hardcoded login password which used to connect to server. 

so, I may only suggest, that you use code like this

Class.forName ("com.intersys.jdbc.CacheDriver").newInstance();
CacheDataSource ds = new CacheDataSource();
ds.setURL("jdbc:Cache://127.0.0.1:1972/SAMPLES");
Connection dbconn = ds.getConnection("_SYSTEM","SYS");

Last string is Caché login password, so you should use here user's login and password. Any works from your application should be with user's login.

UDL format is for classes only, and this format how that classes looks in Studio.

Export web files, available as any others in XML format with $system.OBJ.Export()

USER>d $system.OBJ.Export("/csp/user/*.*","export.xml")

Exporting to XML started on 08/24/2016 20:52:44
Exporting CSP/CSR or file: /csp/user/ML_Util.js
Exporting CSP/CSR or file: /csp/user/menu.csp
Exporting CSP/CSR or file: /csp/user/showsource.csp
Export finished successfully.

And all web files stores as files in the directory for this web-application, so you can get it directly, but native export/import works only in XML

Why do you name it macro ?
Maybe you mean MAC routine ?

I highly recommend to read this tutorial about CacheObjectScript

usually you can call routine by simple command

do ^routine

but sometime you need to call directly to concrete label in that routine

do label^routine()

but in this case if you use curly brace style, you should public such method in routine

label() public {
 write "Hello World!"
​}

or in old style

label()
 write "Hello world!"
 quit

So, you had to start with such explanation.

Well, does not matter what do you set in Accept header, if you don't use it by yourself. Like, you should check incoming content type and send an error if it is not accepted. This Header change nothing in incoming data,  if data was sent in another format.

To read data, you should know that %request has three different ways for getting data. You have already known in %request.Content, which usually contains binary streams. Then %request.MimeData, and %request.Data, it is a Multidimensional properties, and %request has some getters for them, %request.GetMimeData and %request.Get. MimeData, needs when client send data in multipart mime format, such as several files or so on. And %request.Data, in all most cases, and you should look at this property and method %request.Get("somename")

If you use %CSP.REST, you can set needed ContentType in any called method

XData UrlMap
{
<Routes>
  <Route Url="/text" Method="GET" Call="GetText" Cors="false" />
</Routes>
}

ClassMethod GetText() 
{
    set %response.ContentType="text/plain"
    
    write "test"
    
    quit $$$OK
}

and test

➜  ~ curl -v http://localhost:57774/api/app/text
*   Trying ::1...
* Connected to localhost (::1) port 57774 (#0)
> GET /api/ambulance/text HTTP/1.1
> Host: localhost:57774
> User-Agent: curl/7.49.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Wed, 17 Aug 2016 17:54:28 GMT
< Server: Apache
< CACHE-CONTROL: no-cache
< EXPIRES: Thu, 29 Oct 1998 17:04:19 GMT
< PRAGMA: no-cache
< CONTENT-LENGTH: 4
< Content-Type: text/plain; charset=utf-8
<
* Connection #0 to host localhost left intact
test%