# App Engines

> Browse PeopleSoft Application Engine program structures, sections, steps, actions, and source code.

---

Site [llms.txt](/llms.txt)

---

<div id="pslens-context-panel" class="card border-info mb-4 d-none">
  <div class="card-header bg-light text-info py-2 fw-bold d-flex align-items-center border-bottom border-info-subtle">
    <i class="bi bi-info-circle-fill me-2"></i>
    <span>Tailored Operational Context</span>
  </div>
  <div class="card-body p-0">
    <ul class="list-group list-group-flush">
      <li id="row-db" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Target Database:</strong>
        <span id="ctx-db" class="badge bg-secondary font-monospace">&mdash;</span>
      </li>
      <li id="row-type" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Context Type:</strong>
        <span id="ctx-type" class="badge bg-light text-dark border font-monospace text-uppercase">&mdash;</span>
      </li>
      <li id="row-severity" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Alert Severity:</strong>
        <span id="ctx-severity" class="badge">&mdash;</span>
      </li>
      <li id="row-time" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Triggered Time:</strong>
        <span id="ctx-time" class="text-muted small">&mdash;</span>
      </li>
      <li id="row-details" class="list-group-item py-2 d-none">
        <strong id="label-details" class="d-block mb-1">Firing Context:</strong>
        <code id="ctx-details" class="d-block p-2 bg-light border rounded small"
          style="white-space: pre-wrap; word-break: break-all;">&mdash;</code>
      </li>
      <li id="row-sql" class="list-group-item py-2 d-none">
        <div class="d-flex justify-content-between align-items-center mb-1">
          <strong id="label-sql">Contextual SQL:</strong>
          <button id="btn-copy-sql" type="button" class="btn btn-sm btn-outline-secondary py-0 px-2 small">
            <i class="bi bi-clipboard me-1"></i>Copy SQL
          </button>
        </div>
        <pre class="mb-0 p-2 bg-light border rounded small"><code id="ctx-sql" style="white-space: pre-wrap; word-break: break-word;">&mdash;</code></pre>
      </li>
    </ul>
  </div>
</div>

<script>
  (function () {
    const params = new URLSearchParams(window.location.search);
    const metadata = params.get('metadata');
    if (!metadata) return;

    try {
      
      const base64 = metadata.replace(/-/g, '+').replace(/_/g, '/');
      const jsonStr = decodeURIComponent(escape(window.atob(base64)));
      const data = JSON.parse(jsonStr);

      if (data) {
        let hasData = false;

        if (data.db) {
          document.getElementById('ctx-db').textContent = data.db;
          document.getElementById('row-db').classList.remove('d-none');
          hasData = true;
        }

        if (data.type) {
          document.getElementById('ctx-type').textContent = data.type;
          document.getElementById('row-type').classList.remove('d-none');
          hasData = true;
        }

        if (data.severity) {
          const severityBadge = document.getElementById('ctx-severity');
          const severity = data.severity.toLowerCase();
          severityBadge.textContent = severity.toUpperCase();
          if (severity === 'critical') {
            severityBadge.className = 'badge bg-danger';
          } else if (severity === 'warning') {
            severityBadge.className = 'badge bg-warning text-dark';
          } else {
            severityBadge.className = 'badge bg-info';
          }
          document.getElementById('row-severity').classList.remove('d-none');
          hasData = true;
        }

        if (data.t) {
          const date = new Date(data.t * 1000);
          document.getElementById('ctx-time').textContent = date.toLocaleString();
          document.getElementById('row-time').classList.remove('d-none');
          hasData = true;
        }

        if (data.details) {
          document.getElementById('ctx-details').textContent = data.details;

          
          const labelDetails = document.getElementById('label-details');
          if (data.type === 'object') {
            labelDetails.textContent = 'Object Metadata Details:';
          } else if (data.type === 'report') {
            labelDetails.textContent = 'Report Description:';
          } else {
            labelDetails.textContent = 'Firing Context:';
          }

          document.getElementById('row-details').classList.remove('d-none');
          hasData = true;
        }

        if (data.sql) {
          document.getElementById('ctx-sql').textContent = data.sql;
          document.getElementById('row-sql').classList.remove('d-none');
          const copyBtn = document.getElementById('btn-copy-sql');
          if (copyBtn && navigator.clipboard) {
            copyBtn.addEventListener('click', function () {
              navigator.clipboard.writeText(data.sql).then(function () {
                copyBtn.innerHTML = '<i class="bi bi-check2 me-1"></i>Copied';
                setTimeout(function () {
                  copyBtn.innerHTML = '<i class="bi bi-clipboard me-1"></i>Copy SQL';
                }, 2000);
              });
            });
          }
          hasData = true;
        }

        if (hasData) {
          document.getElementById('pslens-context-panel').classList.remove('d-none');
        }
      }
    } catch (e) {
      console.error('Failed to parse operational context metadata:', e);
    }
  })();
</script>

Application Engines (AE) are PeopleSoft's batch processing framework. Unlike traditional COBOL or SQR programs, Application Engine programs are defined in PeopleSoft metadata tables (such as `PSAEAPPLDEFN`, `PSAESECTDEFN`, `PSAESTEPDEFN`, and `PSAESTMTDEFN`) and executed by the `psae` batch executable. They are commonly used for data processing, background calculations, integrations, and ETL processes.

psLens allows you to search and browse the structure of Application Engine programs, inspect their sections, steps, and actions, and view the associated SQL and PeopleCode source code without opening App Designer.

## Object Relationships

Application Engines structure batch execution across database tables and code modules:

- **Structures Sections, Steps & Actions**: App Engines (`PSAEAPPLDEFN`) decompose batch logic into executable sections (`PSAESECTDEFN`), steps (`PSAESTEPDEFN`), and statement actions (`PSAESTMTDEFN`).
- **Executes SQL & PeopleCode**: Step actions execute embedded SQL statements (`PSSQLDEFN`) or Application Engine PeopleCode programs.
- **Scheduled via Process Definitions**: App Engines are mapped to Process Definitions (`PRCSDEFN`) for scheduling and execution in Process Scheduler.

## How psLens Improves Application Engine Inspection

In Application Designer, reviewing an Application Engine program requires opening individual section and step nodes, clicking into actions, and switching windows to inspect SQL statements or PeopleCode scripts.

psLens presents the full section/step/action hierarchy with inline, syntax-highlighted SQL and PeopleCode source code viewable without opening Application Designer.

## Search Page

URL: `/appengines?db={database}`

- **Search:** Search for Application Engines by program name (prefix match). Type `PSAE` to find all AEs starting with `PSAE`. Use `%` as a wildcard if needed (e.g., `%PRCS%` to find programs containing `PRCS`).
- **Metadata Card:** Each search result card shows the program description, owner ID, and last modified operator/timestamp.

## Detail Page

URL: `/appengines/{APPLID}?db={database}`

The Detail Page exposes the internal structure of the Application Engine program:

- **Program Properties:** Shows description, owner ID, program type (Standard, Upgrade, Import, Daemon), active status, disable restart setting, and modification details.
- **Sections & Steps Tree:** Lists all sections (e.g., `MAIN`) and steps defined in the program.
- **Actions View:** For each step, psLens shows the actions it executes (SQL, PeopleCode, Call Section, Log Message, XSLT, Do Select, Do Until, Do While, Do When).
- **Source Code Viewer:** Steps that run SQL or PeopleCode actions can be expanded to view the actual code inline.
- **Export as Markdown:** Reconstructs the entire Application Engine structure, including all sections, steps, actions, and embedded code, into a single structured Markdown file.
