# Application Packages

> Browse PeopleSoft Application Package class hierarchies with methods, properties, service operation usage, and PeopleCode references.

---

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 Packages are PeopleSoft's object-oriented PeopleCode container — packages hold sub-packages and classes, classes hold methods and properties. They are the standard way to write reusable PeopleCode in PeopleSoft applications. psLens walks the package tree (`PSPACKAGEDEFN`, `PSPACKAGEITEM`, `PSPCMPROG`) and shows the full class hierarchy plus a reverse index of where the package is used: by service operation handlers, by other PeopleCode, and in which projects.

## Object Relationships

Application Packages organize reusable application logic across PeopleSoft objects:

- **Contains Sub-packages & Classes**: Packages (`PSPACKAGEDEFN`) structure object-oriented classes (`PSPACKAGEITEM`) into hierarchical namespaces.
- **Executes via Handlers & PeopleCode**: Classes define methods and properties called by Integration Broker operation handlers (`PSOPRHDLR`), App Engine steps, and event PeopleCode.

## How psLens Improves Application Package Inspection

In Application Designer, inspecting application packages requires manually expanding sub-packages and class nodes, opening individual classes to view methods and properties, running **Find In PeopleCode** for import statements, and opening Integration Broker service operations one by one to find handler classes.

psLens exposes the fully expanded recursive package tree, caller call sites, IB service operation handlers, and project membership on a single screen.

## Search Page

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

<figure><img src="/images/screenshots/metadata/app-packages-search.png"
			alt="App Package search results for PT_PAGE% showing PT_PAGE_UTILS"><figcaption>
			<p>App Package search results for <code>PT_PAGE%</code></p>
		</figcaption>
</figure>


Wildcard `%` search supported. Each result card shows the package name and the top-level class names inside it.

## Detail Page

URL: `/apppackages/{PACKAGENAME}?db={database}`

<figure><img src="/images/screenshots/metadata/app-packages-detail.png"
			alt="Detail page for PT_PAGE_UTILS app package"><figcaption>
			<p>App Package detail page for <code>PT_PAGE_UTILS</code></p>
		</figcaption>
</figure>


The main pane shows **Package Properties** (owner, last-updated, source path) and the full **Package Structure**, a recursive tree of sub-packages and classes with methods, properties, and visibility markers. The sidebar has 3 related-data toggles.

## Related Data Panels

### Package Structure

<figure><img src="/images/screenshots/metadata/app-packages-panel-structure.png"
			alt="Package Structure card"><figcaption>
			<p>The recursive package/class/method tree</p>
		</figcaption>
</figure>


The recursive package tree showing every sub-package, class, method, and property. The equivalent of expanding every node in App Designer's package browser at once. Methods link into their PeopleCode source.

### Projects Containing This Package

<figure><img src="/images/screenshots/metadata/app-packages-panel-projects.png"
			alt="Projects Containing This Package panel"><figcaption>
			<p>App Designer projects that include this package</p>
		</figcaption>
</figure>


App Designer projects that include this package as a project item.

### Service Operations Using This Package

<figure><img src="/images/screenshots/metadata/app-packages-panel-service-ops.png"
			alt="Service Operations Using This Package panel"><figcaption>
			<p>Integration Broker service operation handlers using this package</p>
		</figcaption>
</figure>


Integration Broker service operations whose handler is implemented in this package. Lists the IB endpoints that route through this code.

### PeopleCode References

<figure><img src="/images/screenshots/metadata/app-packages-panel-pc-references.png"
			alt="PeopleCode References panel for the app package"><figcaption>
			<p>PeopleCode programs anywhere in the database that import or instantiate this package</p>
		</figcaption>
</figure>


PeopleCode programs anywhere in the database that `import` or instantiate classes from this package — the impact view before refactoring.
