feat(fls): a project's own applications through the editor model

The model carries the captured beans of a project's own applications
(ownApplicationsByNodeId); the export writes them again on the system
software of their node, and their classes go with the archive's other
entries. Checked by Java: from the exported files FILIUS loads
Accumulator and Broadcast as from the original; the export test no longer
leaves own applications out, and a probe that drops them is caught.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-30 09:44:39 +00:00
co-authored by Claude Opus 5.5
parent 3548652687
commit c8f2e9e225
6 changed files with 44 additions and 12 deletions
+1 -3
View File
@@ -39,7 +39,6 @@ import {
type ProjectToExport,
} from '../src/index.js';
import { writeTopologyXml } from '../src/topologyWriter.js';
import { withoutOwnApplications } from './ownApplications.js';
const here = dirname(fileURLToPath(import.meta.url));
const corpusRoot = join(here, '../../../corpus');
@@ -350,8 +349,7 @@ describe('the editor model exported, as Java loads it', () => {
return nic.mac === derived ? derived : undefined;
}),
);
// The model does not install own applications yet (B2).
const source = withoutOwnApplications(original[name]!);
const source = original[name]!;
const nodeIds = project.graph.nodes.map((node) => node.id);
const pairs = nodeIds.map((id) => project.remoteLinkConfigurations.get(id)?.pairIdentifier);
// The account files of each host the export writes anew, by path, as the file has them.
+18 -3
View File
@@ -8100,7 +8100,15 @@
"directory": "root",
"children": []
},
"applications": [],
"applications": [
{
"key": "filius.software.clientserver.Accumulator",
"class": "filius.software.clientserver.Accumulator",
"onItsSystem": true,
"aktiv": true,
"port": 55555
}
],
"dhcpClient": false,
"dhcpServer": {
"aktiv": false,
@@ -8309,7 +8317,7 @@
}
],
"documentation": [],
"sha256": "955edc9322d1de6bae59ce05221b94ab18983c46193db034cf37fd18f0146a48"
"sha256": "acca8f9fe5b317e12472b5e975d0463d367b90896e14a07df46e24fc71feef38"
},
"java-examples/dhcp_test_scenario.fls": {
"success": true,
@@ -13346,6 +13354,13 @@
"children": []
},
"applications": [
{
"key": "filius.software.clientserver.Broadcast",
"class": "filius.software.clientserver.Broadcast",
"onItsSystem": true,
"aktiv": true,
"port": 55555
},
{
"key": "filius.software.clientserver.ServerBaustein",
"class": "filius.software.clientserver.ServerBaustein",
@@ -13585,7 +13600,7 @@
}
],
"documentation": [],
"sha256": "b860d1bdf773a92b90f63ff6c7c76e9d0ee2c9b342e6042c3e39f61acf6697e3"
"sha256": "4f1a87256f67f1d09a25db7eb2f964663b4728b43592731952a0a30e562cf702"
},
"java-examples/nat.fls": {
"success": true,
+1 -1
View File
@@ -11,7 +11,7 @@ export const OWN_APPLICATION_FILES = ['java-examples/anwendung_komplett.fls', 'j
type View = { nodes?: { system: Record<string, unknown> }[] };
/** Java's view without the applications FILIUS does not ship. */
export function withoutOwnApplications<T>(view: T): T {
function withoutOwnApplications<T>(view: T): T {
const { nodes } = view as View;
if (nodes === undefined) return view;
return {