type=page
status=published
title=Integration Point Reference
prev=packaging-integrating-delivering.html
~~~~~~

= Integration Point Reference

[[GSACG00010]][[ghmrp]]


[[a-integration-point-reference]]
== Integration Point Reference

This appendix provides reference information about integration points,
which are described in
link:extending-the-admin-console.html#ghmrb[Extending the Administration Console].
Define an integration point for each user interface feature in the
`console-config.xml` file for your add-on component.

The following topics are addressed here:

* link:#ghprc[Integration Point Attributes]
* link:#ghmwa[`org.glassfish.admingui:navNode` Integration Point]
* link:#gjkff[`org.glassfish.admingui:rightPanel` Integration Point]
* link:#gjkfq[`org.glassfish.admingui:rightPanelTitle` Integration Point]
* link:#ghpkh[`org.glassfish.admingui:serverInstTab` Integration Point]
* link:#ghpit[`org.glassfish.admingui:commonTask` Integration Point]
* link:#ghphz[`org.glassfish.admingui:configuration` Integration Point]
* link:#ghpfm[`org.glassfish.admingui:resources` Integration Point]
* link:#ghpiz[`org.glassfish.admingui:customtheme` Integration Point]
* link:#ghppm[`org.glassfish.admingui:masthead` Integration Point]
* link:#ghppk[`org.glassfish.admingui:loginimage` Integration Point]
* link:#ghprk[`org.glassfish.admingui:loginform` Integration Point]
* link:#ghpse[`org.glassfish.admingui:versioninfo` Integration Point]

[[ghprc]][[GSACG00145]][[integration-point-attributes]]

=== Integration Point Attributes

For each `integration-point` element, specify the following attributes.
Each attribute takes a string value.

`id`::
  An identifier for the integration point. The remaining sections of
  this appendix do not provide details about specifying this attribute.
`parentId`::
  The ID of the integration point's parent.
`type`::
  The type of the integration point.
`priority`::
  A numeric value that specifies the relative ordering of integration
  points with the same `parentId`. A lower number specifies a higher
  priority (for example, 100 represents a higher priority than 400). You
  may need to experiment in order to place the integration point where
  you want it. This attribute is optional.
`content`::
  A relative path to the Jakarta Server Faces page that contains the content
  to be integrated. Typically, the file contains a Jakarta Server Faces code
  fragment that is incorporated into a page. The code fragment often
  specifies a link to another Jakarta Server Faces page that appears when a
  user clicks the link.

[[ghmwa]][[GSACG00146]][[org.glassfish.adminguinavnode-integration-point]]

=== `org.glassfish.admingui:navNode` Integration Point

Use an `org.glassfish.admingui:navNode` integration point to insert a
node in the Administration Console navigation tree. Specify the
attributes and their content as follows.

`type`::
  `org.glassfish.admingui:navNode`, the left-hand navigation tree
`parentId`::
  The `id` value of the `navNode` that is the parent for this node.
  The `parentId` can be any of the following:
+
  `tree`;;
    The root node of the entire navigation tree. Use this value to place
    your node at the top level of the tree. You can then use the `id` of
    this node to create additional nodes beneath it.
  `registration`;;
    The Registration node
  `applicationServer`;;
    The GlassFish Server node
  `applications`;;
    The Applications node
  `resources`;;
    The Resources node
  `configuration`;;
    The Configuration node
  `webContainer`;;
    The Web Container node under the Configuration node
  `httpService`;;
    The HTTP Service node under the Configuration node
+
[NOTE]
====
The `webContainer` and `httpService` nodes are available only if you
installed the web container module for the Administration Console (the
`console-web-gui.jar` OSGi bundle).
====

`priority`::
  A numeric value that specifies the relative ordering of the node on
  the tree, whether at the top level or under another node.
`content`::
  A relative path to the Jakarta Server Faces page that contains the content
  to be integrated, or a URL to an external resource that returns the
  appropriate data structure for inclusion.

For an example, see link:extending-the-admin-console.html#ghpmb[Example 3-2].

[[gjkff]][[GSACG00147]][[org.glassfish.adminguirightpanel-integration-point]]

=== `org.glassfish.admingui:rightPanel` Integration Point

Use an `org.glassfish.admingui:rightPanel` integration point to specify
content for the right frame of the Administration Console. Specify the
attributes and their content as follows.

`type`::
  `org.glassfish.admingui:rightPanel`
`parentId`::
  None.
`priority`::
  A numeric value that specifies the relative ordering. If multiple
  plug-ins specify content for the right frame, the one with greater
  priority will take precedence.
`content`::
  A path relative to the root of the plug-in JAR file to a file
  containing the content for the right panel. Alternatively, it may
  contain a full URL which will deliver the content for the right panel.

[[gjkfq]][[GSACG00148]][[org.glassfish.adminguirightpaneltitle-integration-point]]

=== `org.glassfish.admingui:rightPanelTitle` Integration Point

Use an `org.glassfish.admingui:rightPanel` integration point to specify
the title for the right frame of the Administration Console. Specify the
attributes and their content as follows.

`type`::
  `org.glassfish.admingui:rightPanelTitle`
`parentId`::
  None.
`priority`::
  A numeric value that specifies the relative ordering. If multiple
  plug-ins specify content for the right frame, the one with greater
  priority will take precedence.
`content`::
  Specifies the title to display at the top of the right panel.

[[ghpkh]][[GSACG00149]][[org.glassfish.adminguiserverinsttab-integration-point]]

=== `org.glassfish.admingui:serverInstTab` Integration Point

Use an `org.glassfish.admingui:serverInstTab` integration point to place
an additional tab on the GlassFish Server page of the Administration
Console. Specify the attributes and their content as follows.

`type`::
  `org.glassfish.admingui:serverInstTab`
`parentId`::
  The `id` value of the tab set that is the parent for this tab. For a
  top-level tab on this page, this value is `serverInstTabs`, the tab
  set that contains the general information property pages for GlassFish
  Server.
  For a sub-tab, the value is the `id` value for the parent tab.
`priority`::
  A numeric value that specifies the relative ordering of the tab on the
  page, whether at the top level or under another tab.
`content`::
  A relative path to the Jakarta Server Faces page that contains the content
  to be integrated.
  When you use this integration point, your Jakarta Server Faces page must
  call the `setSessionAttribute` handler for the `command` event to set
  the session variable of the `serverInstTabs` tab set to the `id` value
  of your tab. For example, the file may have the following content:
+
[source,xml]
----
<sun:tab id="sampletab" immediate="true" text="Sample First Tab">
    <!command
        setSessionAttribute(key="serverInstTabs" value="sampleTab");
        gf.redirect(page="#{request.contextPath}/page/tabPage.jsf?name=Sample%20First%20Tab");
    />
</sun:tab>
----
  The `id` of the `sun:tab` custom tag must be the same as the `value`
  argument of the `setSessionAttribute` handler.

For examples, see link:extending-the-admin-console.html#ghplc[Example
3-4] and link:extending-the-admin-console.html#ghplu[Example 3-5].

[[ghpit]][[GSACG00150]][[org.glassfish.adminguicommontask-integration-point]]

=== `org.glassfish.admingui:commonTask` Integration Point

Use an `org.glassfish.admingui:commonTask` integration point to place a
new task or task group on the Common Tasks page of the Administration
Console. Specify the attributes and their content as follows.

`type`::
  `org.glassfish.admingui:commonTask`
`parentId`::
  If you are adding a task group, the `id` value of the Common Tasks
  page, which is `commonTasksSection`.
  If you are adding a single task, the `id` value of the task group that
  is the parent for this tab, such as `deployment` (for the Deployment
  group).
`priority`::
  A numeric value that specifies the relative ordering of the tab on the
  page, whether at the top level or under another tab.
`content`::
  A relative path to the Jakarta Server Faces page that contains the content
  to be integrated.

For examples, see link:extending-the-admin-console.html#ghpox[Example
3-7] and link:extending-the-admin-console.html#ghplk[Example 3-9].

[[ghphz]][[GSACG00151]][[org.glassfish.adminguiconfiguration-integration-point]]

=== `org.glassfish.admingui:configuration` Integration Point

Use an `org.glassfish.admingui:configuration` integration point to add a
component to the Configuration page of the Administration Console.
Typically, you add a link to the property sheet section of this page.
Specify the attributes and their content as follows.

`type`::
  `org.glassfish.admingui:configuration`
`parentId`::
  The `id` value of the property sheet for the Configuration page. This
  value is `propSheetSection`, the section that contains the property
  definitions for the Configuration page.
`priority`::
  A numeric value that specifies the relative ordering of the item on
  the Configuration page.
`content`::
  A relative path to the Jakarta Server Faces page that contains the content
  to be integrated.

[[ghpfm]][[GSACG00152]][[org.glassfish.adminguiresources-integration-point]]

=== `org.glassfish.admingui:resources` Integration Point

Use an `org.glassfish.admingui:resources` integration point to add a
component to the Resources page of the Administration Console.
Typically, you add a link to the property sheet section of this page.
Specify the attributes and their content as follows.

`type`::
  `org.glassfish.admingui:resources`
`parentId`::
  The `id` value of the property sheet for the Resources page. This
  value is `propSheetSection`, the section that contains the property
  definitions for the Resources page.
`priority`::
  A numeric value that specifies the relative ordering of the item on
  the Resources page.
`content`::
  A relative path to the Jakarta Server Faces page that contains the content
  to be integrated.

For an example, see link:extending-the-admin-console.html#ghpnu[Example
3-11].

[[ghpiz]][[GSACG00153]][[org.glassfish.adminguicustomtheme-integration-point]]

=== `org.glassfish.admingui:customtheme` Integration Point

Use an `org.glassfish.admingui:customtheme` integration point to add
your own branding to the Administration Console. Specify the attributes
and their content as follows. Do not specify a `parentId` attribute for
this integration point.

`type`::
  `org.glassfish.admingui:customtheme`
`priority`::
  A numeric value that specifies the relative ordering of the item in
  comparison to other themes. This value must be between 1 and 100. The
  theme with the smallest number is used first.
`content`::
  The name of the properties file that contains the key/value pairs that
  will be used to access your theme JAR file. You must specify the
  following keys:
  `com.sun.webui.theme.DEFAULT_THEME`;;
    Specifies the theme name for the theme that this application may
    depend on.
  `com.sun.webui.theme.DEFAULT_THEME_VERSION`;;
    Specifies the theme version this application may depend on.
+
For example, the properties file for the default Administration Console brand contains the following:
+
[source]
----
com.sun.webui.theme.DEFAULT_THEME=suntheme
com.sun.webui.theme.DEFAULT_THEME_VERSION=4.3
----

For an example, see link:extending-the-admin-console.html#ghpls[Example
3-14].

[[ghppm]][[GSACG00154]][[org.glassfish.adminguimasthead-integration-point]]

=== `org.glassfish.admingui:masthead` Integration Point

Use an `org.glassfish.admingui:masthead` integration point to specify
the name and location of the include masthead file, which can be
customized with a branding image. This include file will be integrated
on the masthead of the Administration Console. Specify the attributes
and their content as follows. Do not specify a `parentId` attribute for
this integration point.

`type`::
  `org.glassfish.admingui:masthead`
`priority`::
  A numeric value that specifies the relative ordering of the item in
  comparison to other items of this type. This value must be between 1
  and 100. The theme with the smallest number is used first.
`content`::
  A file that contains the content, typically a file that is included in
  a Jakarta Server Faces page.

For an example, see link:extending-the-admin-console.html#ghpla[Example
3-15].

[[ghppk]][[GSACG00155]][[org.glassfish.adminguiloginimage-integration-point]]

=== `org.glassfish.admingui:loginimage` Integration Point

Use an `org.glassfish.admingui:loginimage` integration point to specify
the name and location of the include file containing the branding login
image code that will be integrated with the login page of the
Administration Console. Specify the attributes and their content as
follows. Do not specify a `parentId` attribute for this integration
point.

`type`::
  `org.glassfish.admingui:loginimage`
`parentId`::
  None; a login image does not have a parent ID.
`priority`::
  A numeric value that specifies the relative ordering of the item in
  comparison to other items of this type. This value must be between 1
  and 100. The theme with the smallest number is used first.
`content`::
  A file that contains the content, typically a file that is included in
  a Jakarta Server Faces page.

For an example, see link:extending-the-admin-console.html#ghpla[Example
3-15].

[[ghprk]][[GSACG00156]][[org.glassfish.adminguiloginform-integration-point]]

=== `org.glassfish.admingui:loginform` Integration Point

Use an `org.glassfish.admingui:loginform` integration point to specify
the name and location of the include file containing the customized
login form code. This code also contains the login background image used
for the login page for the Administration Console. Specify the
attributes and their content as follows. Do not specify a `parentId`
attribute for this integration point.

`type`::
  `org.glassfish.admingui:loginform`
`priority`::
  A numeric value that specifies the relative ordering of the item in
  comparison to other items of this type. This value must be between 1
  and 100. The theme with the smallest number is used first.
`content`::
  A file that contains the content, typically a file that is included in
  a Jakarta Server Faces page.

For an example, see link:extending-the-admin-console.html#ghpla[Example
3-15].

[[ghpse]][[GSACG00157]][[org.glassfish.adminguiversioninfo-integration-point]]

=== `org.glassfish.admingui:versioninfo` Integration Point

Use an `org.glassfish.admingui:versioninfo` integration point to specify
the name and location of the include file containing the branding image
that will be integrated with the content of the version popup window.
Specify the attributes and their content as follows. Do not specify a
`parentId` attribute for this integration point.

`type`::
  `org.glassfish.admingui:versioninfo`
`priority`::
  A numeric value that specifies the relative ordering of the item in
  comparison to other items of this type. This value must be between 1
  and 100. The theme with the smallest number is used first.
`content`::
  A file that contains the content, typically a file that is included in
  a Jakarta Server Faces page.

For an example, see link:extending-the-admin-console.html#ghpla[Example
3-15].

