reference
reference
Reference
Last updated 2024-10-16
IBM
About this PDF
© International Business Machines Corporation 1992, 2024.
This PDF was generated from the content of the IBM® Developer for z/OS® online documentation. It is
provided for reference only. Many of the links in this PDF do not lead to a target location on the IBM
Developer for z/OS IBM Documentation site. For the most recent content, go to https://www.ibm.com/
docs/en/developer-for-zos/latest.
Some of the content in the IBM Developer for z/OS IBM Documentation site is embedded from other
IBM product documentation sites. Because of this content reuse, the embedded content might not be
included in the generated PDFs.
Reference
Reference
Review reference information for the product.
For most purposes, extending the CARMA plug-in should be sufficient, which has the following
advantages over creating your own user interface:
• Dialogs automatically prompt the user for return values, custom parameters, and login information as
necessary.
• It features a built-in CARMA hierarchy navigator.
• You can easily provide access to custom RAM actions through menus with minimal effort.
If you would like to extend the CARMA plug-in and are new to Developer for z/OS plug-in development,
you may want to refer to the Eclipse Platform Plug-in Developer Guide. If you would instead like to create
your own user interface for CARMA using the core API, refer to the CARMA plug-in API specification.
Tip:
Eclipse plug-in development requires the Plug-in Development perspective. This perspective is not
enabled by default in Developer for z/OS. To enable it:
1. Open the Preferences window.
2. Navigate to General > Capabilities.
3. On the Capabilities page, expand Development and select Plug-in Development.
4. Click Apply and Close.
To open the perspective, click Window (on Windows) or IBM Developer for z/OS (on macOS) >
Perspective > Open Perspective > Other, and then select Plug-in Development and click Open.
Concepts
The following topics provide information about the Common Access Repository Manager (CARMA)
architecture and custom parameters.
• “CARMA architecture” on page 2
• “Dealing with custom parameters” on page 3
CARMA architecture
A CARMA system requires three components in order to function properly: a CARMA hierarchy, a CARMA
transport, and a CARMA host.
A CARMA hierarchy is a client-side data structure that provides support for CARMA content navigation
and the execution of CARMA operations. CARMA operation requests are sent via a CARMA transport to a
CARMA host. A CARMA transport is a client-side communication service between CARMA hierarchies and
CARMA hosts. CARMA hosts contain the host-side CARMA service, CARMA-390, which is responsible for
managing the available content.
CARMA hierarchy
A CARMA hierarchy is a special type of tree data structure that is used to manage CARMA content. Each
CARMA hierarchy is connected with exactly one CARMA transport and exactly one CARMA host (it uses its
CARMA transport to communicate with its CARMA host). The CARMA plug-in acts as a workstation client
and provides a graphical representation of CARMA hierarchies using the CARMA Repositories view. Each
top-level node in this view represents a CARMA hierarchy.
CARMA transport
The CARMA transport is a service plug-in forDeveloper for z/OS that manages the connection between a
CARMA hierarchy and its CARMA host. Thus, the CARMA transport packages send commands from the
CARMA hierarchy and returns responses from the CARMA host. The CARMA RSE transport is used for this
purpose by the CARMA plug-in.
There are several helper classes available so that you can easily make use of these custom actions:
CustomActionParameterManager
Queries the default, which is stored, and link values (retrieved in the order that is specified in the
CARMA preferences) against the metadata.
CustomActionParameterDialog
A convenience dialog that simply asks users to enter values for custom parameters.
CustomActionUtil
A helper class providing various convenience methods.
CustomActionUtil.getCustomParameters(resource, "101");
This retrieves the custom parameters for the action with an action ID of 101 for the given resource.
If you plan on using the same task repeatedly for different, but similar, resources, you can use
getCustomParametersForTask like so:
In this example, taskMemento is used to store information the user has entered for use between action
invocations. If taskMemento were not to be used here, the user would be queried with the same prompts
for every resource.
If you would rather use a different mechanism to fetch parameter values (such as a different user
interface), you could interact directly with the CustomActionParameterManager class, as illustrated in the
following example:
//find the parameter you want to change this way, or look for it to be null in
paramsToPass
Reference 3
int index = 0;
while (it.hasNext()) {
Parameter param = (Parameter) it.next();
if (param.getName().equals(targetName))
break;
index++;
}
In this example, targetName is the name of the parameter as defined by the RAM developer.
Related tasks
“Contributing an action” on page 4
You can add an action to the CARMA Repositories view menu so that the action can be run on CARMA
resources.
Tasks
The following topics provide information about the contributing actions and creating CARMA connections.
• “Contributing an action” on page 4
• “Creating a CARMA connection programmatically ” on page 6
Contributing an action
You can add an action to the CARMA Repositories view menu so that the action can be run on CARMA
resources.
Before you can contribute a CARMA action, you must have the proper foundation for extending the
Developer for z/OS CARMA plug-in. Refer to the Eclipse Platform Plug-in Developer Guide for information
on how to begin developing a plug-in extension.
To contribute a CARMA action to the Developer for z/OS CARMA plug-in, follow these steps:
1. Update your plugin.xml file to use the org.eclipse.ui.popupMenus extension point to define an
object delegate class for resources that implement either the IResource or CARMAContent interface.
Two common resource interfaces you might specify are IFile (which extends the IResource
interface) and CARMAContent. Specifying IFile as the resource object class causes your menu item
to appear on the menu in the Navigator view, on local project content, while specifying CARMAContent
as the resource object class causes your menu item to appear on the menu in the CARMA Repositories
view.
Example markup to add a menu item to the Navigator view:
You could include the following markup in your plugin.xml file if you were to define a menu item to
appear for files that are managed by CARMA in the Navigator view:
<extension point="org.eclipse.ui.popupMenus">
<objectContribution
id="com.ibm.carma.action.disconnected.iFile"
objectClass="org.eclipse.core.resources.IFile"
adaptable="true">
<filter
name="projectPersistentProperty"
value="org.eclipse.team.core.repository=com.ibm.carma">
</filter>
<action
label="ABC Action"
class="com.xyz.ABCDelegate"
<extension point="org.eclipse.ui.popupMenus">
<objectContribution
id="com.ibm.carma.action.disconnected.carmaContent"
objectClass="com.ibm.carma.model.CARMAContent
adaptable="true">
<filter
name="repositoryManager"
value="My RAM">
</filter>
<action
label="ABC Action"
class="com.xyz.ABCDelegate"
id="com.xyz.abc">
</action>
</objectContribution>
</extension>
The first line in the run method above obtains an array of the selected CARMA resources, which you
can then use to perform your action. You might, for example, loop through all of the selected resources
Reference 5
and set certain metadata properties. Although you only really need to override the run method, you
may also find it useful to override the selectionChanged method to update the availability of your
action as shown in the example above.
As defined in the example, selectionChanged uses the isUnsupported helper function of
CarmaObjectActionDelegate to enable the action with an action ID of 101 if the new selection of
objects supports the action. Although a value of 101 is hardcoded into the example code, it is possible
to resolve the action ID dynamically if the name of the action is known. Simply use the getActions
method of the appropriate RepositoryManager object to retrieve a list of the actions available for that
RAM, search through the list to find the appropriate action that is based on the name the action, and
then use the getActionId method to retrieve the action ID from corresponding Action object. You
might resolve the ID using this more dynamic method if you are unsure what the action ID of your
action is.
Related concepts
“Dealing with custom parameters” on page 3
RAM developers have the ability to either customize existing CARMA actions or to create entirely new
actions. These actions can have custom parameters or return values as defined by the configuration of the
CARMA host.
The identifier string must be unique to your CARMA hierarchy. Currently, the only valid transport is
the RSE transport service, which is used by default (if you are using the alternative method call that
requires a backend ID to be specified, you can select the RSE transport service by passing a backend
ID value of "com.ibm.carma.client.rse.datastore").
The connection properties map stores key-value pairs for transport configuration options. If
the required parameters for the transport you are using are not specified in the map, the
getCARMAInstance method throws a CARMAException. The RSE transport service requires that
you specify a value for the key "aliasName" in the connection properties map. For the value of the
key "aliasName", provide a name for the RSE connection to use when communicating with the CARMA
host.
2. Store a reference to your CARMA hierarchy for later retrieval in the CARMA registry:
CarmaRegistry.getRegistry().addCarma(carma);
The singleton CarmaRegistry object is used by a CARMABrowser object to maintain a list of known
CARMA connections. Events are sent to registered listeners when objects are added or removed from
the CARMA hierarchy. You can retrieve a CARMA hierarchy from the CARMA registry by passing its
identifier into the getCARMA method of the CARMA registry.
You can now connect to your CARMA object's CARMA host by using the connect method.
Reference
The following topics provide CARMA reference information.
• Client API reference
• “Other reference information” on page 7
Reference 7
Map of plugins
The CARMA Plug-in API is divided into a series of plug-ins. The following table shows which API packages
are found in which plug-ins. This table is useful for determining which plug-ins a given plug-in should
include as prerequisites.
Learning objectives
After completing the modules in this module, you will have an understanding of the following concepts:
• Creating an Developer for z/OS Eclipse plug-in project
• Using the plug-in Manifest Editor to add dependencies and extensions
• Use the plugin.xml file to modify extensions and their attributes
• Create packages, classes, and folders within an Eclipse plug-in project
• Create and modify Java™ classes to add enhanced functionality to the plug-ins
Time required
The time that is required to complete these modules vary. Each module contains an approximate time
required.
Prerequisites
To successfully complete the modules, you should have:
• Developer for z/OS installed on your local workspace
• Access to a z/OS host system and any required authentication
• Basic understanding of Java coding and debugging
Tip:
Eclipse plug-in development requires the Plug-in Development perspective. This perspective is not
enabled by default in Developer for z/OS. To enable it:
1. Open the Preferences window.
2. Navigate to General > Capabilities.
3. On the Capabilities page, expand Development and select Plug-in Development.
4. Click Apply and Close.
To open the perspective, click Window (on Windows) or IBM Developer for z/OS (on macOS) >
Perspective > Open Perspective > Other, and then select Plug-in Development and click Open.
a) To debug, you would select the down button beside the Debug icon , select Debug
Configurations, and follow the rest of the steps.
3. From the left menu, double-click on the Eclipse Application option. A new run configuration opens,
this might take a little while to open.
4. Select the Configurations tab from the top tab menu.
5. Mark the checkbox, Clear the configuration area before launching. If this is not set, Developer for
z/OS does not know how to pick up the new plug-ins you developed.
6. Click Apply to save the changes.
7. You can select which plug-ins you have developed to run in the testing workbench. To do this, select
the Plug-ins tab from the top menu.
8. In the Launch With dropdown menu, select the option: plug-ins selected below only.
9. In the panel below the dropdown menu will be a list of the various plug-ins associated with Developer
for z/OS. Find the directory that is labeled Workspace. Check the plug-ins that you want included in
your build. Clear those you do not want to be included in the build.
10. Click Run. This launches a second instance of Developer for z/OS in a testing workspace.
Note: If you have already started Developer for z/OS in the testing workspace once before, be sure to
close it out before you start it again, else you get an error.
Return to the exercise summary for steps on how to determine if your CARMA plug-in ran successfully.
Reference 9
Module 1: Adding decorators to the user interface
This module takes you through the steps to add a decorator, or image overlay, to the CARMA members
shown in the CARMA Repositories view.
You add a lock decorator to display on members when they are locked and a question mark decorator to
display on members when members need their metadata synchronized.
Note: The sample RAMs that come with Developer for z/OS do not support the Lock function. You want to
use this exercise with a RAM that supports the Lock function.
Learning objectives
After completing the lessons in this exercise, you will be able to:
• Create a Developer for z/OS plug-in Project
• Import graphics to the plug-in project
• Modify the Java Activator class, so the plug-in is able to find the necessary graphics
• Create a Java Decorator class and write code to display the appropriate graphic
• Modify the plugin.xml file to provide the org.eclipse.ui.decorators extension point
• Run and debug the sample plug-in
Time required
This module takes approximately 30 minutes to complete.
Prerequisites
To successfully complete the lessons in this module, you should have:
• Created an Eclipse plug-in project
• An accessible directory containing a graphic of a lock and a question mark, or other representative
graphics, with dimensions of approximately 11 x 13 pixels
This method provides a way for the Activator class to find the graphics you plan to use as
decorators.
3. Ensure that the following classes and packages are included in the import commands. An easy way of
doing this is by right-clicking within the editor, and selecting Source > Organize Imports and verifying
all the listed import statements were included. You can also manually enter the import commands at
the top of the class with any other import commands.
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
Reference 11
9. Next, to the Superclass text field, click Browse to browse for the class that your Descriptor class
extends.
10. In the Superclass Selection dialog box that opens, enter LabelProvider in the text field. Select
the class that is part of the org.eclipse.jface.viewers package, and click OK.
11. Next, to the Interfaces panel, click Add. In the Implemented Interfaces Selection dialog box that
opens, enter ILightweightLabelDecorator, and select the matching item that appears. Click
OK.
12. Click Finish to close out of the New Java Class dialog box.
You should see the Decorator class appear under the decorator package and the source code for the
Decorator class open in the editor.
Tip: The file names you provide should correspond with the names of the icons you imported into the
icons folder.
2. Add the code to the body of the decorate() method that adds a locked suffix to the CARMA
members and containers when they are locked, or decorate them with question marks if the
MemberInfoMap has not been set. The following pseudocode demonstrates this:
import com.ibm.carma.plugin.decorators.Activator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IDecoration;
import org.eclipse.jface.viewers.ILightweightLabelDecorator;
import org.eclipse.jface.viewers.LabelProvider;
import com.ibm.carma.model.CARMAMember;
import com.ibm.carma.model.CARMAContainer;
import com.ibm.carma.model.CARMAResource;
import com.ibm.carma.transport.NotSynchronizedException;
import org.eclipse.emf.common.util.EMap;
4. If the com.ibm.carma.model part of your import packages statement is still underlined in red, then
right-click on it and select the quick fix, "Add com.ibm.carma.model to list of imported packages."
5. Save the source and debug any errors.
<plugin>
<extension
point="org.eclipse.ui.decorators">
</extension>
</plugin>
Between the open and close extension tags, place the following code:
<description
adaptable="true"
class="decorator.Decorator"
id="com.ibm.carma.ui.ftt.sample"
label="Sample Decorator"
lightweight="true"
location="BOTTOM_RIGHT"
state="true">
</description>
<enablement>
<or>
Reference 13
<objectClass name="com.ibm.carma.model.CARMAMember"/>
<ObjectClass name="com.ibm.carma.model.CARMAContainer"/>
</or>
</enablement>
Note: The information that follows the class attribute tells the plug-in what class to use and where
it is located. This location should correspond with the pkg_you_created.class_name. If you
followed the names that are provided in this tutorial, then your package and class name should be
the same as those given.
7. Click save and resolve any errors.
Summary: Module1
This module has guided you through the steps to create an Eclipse plug-in project that adds decorators to
CARMA members and containers, which are locked or unsynchronized.
Results
You should run or debug your plug-in project now. Do the following while still in the testing workspace to
verify the functionality of your plug-in:
1. Make sure that you are connected to your host system. Create a new connection if needed.
2. Open the CARMA Repositories view by selecting from the file menu, Window (on Windows) or IBM
Developer for z/OS (on macOS) > Show View > CARMA Repositories View.
3. Expand a RAM that supports the Lock option.
4. Right click a CARMA member within that RAM, and select Lock.
5. The CARMA member should lock, and your lock icon appear in the lower-right hand corner of the
CARMA member icon. For example:
Learning objectives
After completing the lessons in this module, you will be able to:
• Create an Eclipse plug-in project
• Add dependencies to a plug-in project
• Add and modify extensions that are associated with a plug-in project
• Run and debug a plug-in project
Time required
This module takes approximately 30 minutes to complete.
Prerequisites
To successfully complete the lessons in this module, you should have:
• Created an Eclipse plug-in project
Reference 15
9. Next, you want to create a second action. In the left panel of the Plugin Editor, click the Add button.
10. In the New Extension dialog box that appears, enter the filter
com.ibm.carma.action.ramBrowserAction. Select the matching extension, and click Finish.
11. Expand the extension, and update the ramId or uniqueId to the appropriate value for your RAM.
12. Select the action below the ram. On the right-hand side, in the actionID dropdown menu, select
com.ibm.carma.action.openWith. In the state dropdown menu, select disabled. This allows
for the option Open With to be seen by the user, but will not allow it to be selected.
13. Save the changes that you made in the Plug-in Editor and resolve any errors.
Summary: Module 2
This module has guided you through the steps to create a plug-in project to disable the Delete and Open
With menu options on CARMA Members.
Results
You should run or debug your plug-in project now. Do the following while still in the testing workspace to
verify the functionality of your plug-in:
1. Make sure that you are connected to your host system.
2. Open the CARMA Repositories view.
3. Expand the RAM that you developed your plug-in to modify down to an individual member within the
RAM and right-click it.
4. Right click any member within that RAM. The menu that appears should not allow you to select the
Delete or Open With options.
Learning objectives
After completing this module you should know how to:
• Create an Eclipse plug-in project
• Define the plug-in extensions and dependencies
• Modify the Activator class
• Run or Debug the Eclipse plug-in project
Time required
This module should take approximately 30 minutes to complete.
Prerequisites
To successfully complete the lessons in this module, you should have:
• Created an Eclipse plug-in project
Lesson 1: Define the extensions and dependencies for the plug-in project
This lesson guides you through defining extension points, including dependencies, creating an extension
to the plug-in, and modifying the Activator class to customize the menu options.
Note: Before you complete this lesson, you should create an Eclipse plug-in project with the following
attributes:
• Project Name: com.ibm.carma.plugin.disable.programatically
• ID: com.ibm.carma.plugin.disable.programatically
• Name: CARMA_Modify_Actions Plug-in
Note: If you choose to use the ramId as the RAM identification, then change the fourth line of code to:
myRegistry.setRAMActionState("ramId",
"com.ibm.carma.action.openWith",
RAMActionState.DISABLED);
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
import com.ibm.carma.ui.view.*;
Reference 17
4. Save the source and resolve any errors.
Summary: Module 3
This module has guided you through the steps to create a plug-in project and modify the actions available
in the menu when you right-click on CARMA members in the CARMA Repositories view.
Results:
You should run or debug your plug-in project now. Do the following while still in the testing workspace to
verify the functionality of your plug-in:
1. Make sure that you are connected to your host system
2. Open the CARMA Repositories view
3. Expand the RAM that you developed your plug-in to modify down to the individual CARMA members.
4. Right click any member within that particular RAM.
5. Attempt to select the Delete option. You should be unable to select this option.
Learning objectives
After completing this module, you should be able to:
• Create an Eclipse plug-in project
• Create Java classes to add items to the menu
• Add the action to an extension point
• Run and debug the plug-in project
Time required
This module should take approximately 45 minutes to complete.
Prerequisites
To successfully complete this module, you should have:
• Created an Eclipse plug-in project
while (i.hasNext()) {
Object next = i.next();
if (next instanceof CARMAMember) { // the element is a member
//remember the item selected so if the action is run it knows
//which item to run the action against
this.itemSelected = (CARMAMember) next;
} else {
Reference 19
this.itemSelected = null;
return;
}
}
//Make sure the temporary space is of the right type and exists
if (myResource instanceof IContainer && myResource.exists()) {
IContainer myContainer = (IContainer) myResource;
//Create the job that will get the contents of the file
GetContentsJob myJob = new GetContentsJob("CRAJOB1", itemSelected);
try{
InputStream myStream = null;
while( (myStream = myJob.getStream()) == null){
}
try {
ResourceAttributes myAttributes = myFile.getResourceAttributes();
if(myAttributes == null){
myAttributes = new ResourceAttributes();
}
//setting the attributes to readonly
myAttributes.setReadOnly(true);
try{
myFile.setResourceAttributes(myAttributes);
} catch(Exception e){
e.printStackTrace();
}
//opening the file in browse mode
IDE.openEditor(page, myFile, true);
} catch (PartInitException e) {
//TODO handle exception
System.out.println(e);
}
}
});
}
}
}
4. Verify that all the packages the class needs are imported. Add any that are listed below but are not
already included in the import statements:
import java.io.InputStream;
import java.util.Iterator;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourceAttributes;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IViewActionDelegate;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import com.ibm.carma.model.CARMAMember;
import com.ibm.carma.ui.job.GetContentsJob;
Reference 21
3. In the New Extension dialog box that opens, type the filter text, org.eclipse.ui.popupMenus in
the Extension Point filter text field.
4. Highlight the extension point that matches your filter, and click Finish. You should see the extension
that you selected added to the list of extensions in the left panel on the Extensions page.
5. Now, select the plugin.xml tab from the menu options at the bottom of the Plug-in Editor.
6. Replace the existing code with the following:
<plugin>
<extension
id="carma.bootcamp.ui.actions"
point="org.eclipse.ui.popupMenus">
<objectContribution
id="CARMA.Bootcamp.browse"
objectClass="com.ibm.carma.model.CARMAMember">
<action
class="browse.BrowseMemberAction"
id="BootCamp.browse"
label="Browse Member"
menubarPath="open">
</action>
</objectContribution>
</extension>
</plugin>
Summary: Module 4
In this module, you have created a plug-in that would allow you to open a particular CARMAMember in a
read-only environment.
Results
You should run or debug your plug-in project now. Do the following while still in the testing workspace to
verify the functionality of your plug-in:
1. Make sure that you are connected to your host system.
2. Open the CARMA Repositories view.
3. Expand a RAM on your host system down until you see the individual members.
Module 5: Creating a new CARMA view using the existing CARMA context provider
This module will take you through the steps of creating a new CARMA view using the default CARMA
context provider.
Learning objectives
After completing this module, you should be able to:
• Create an Eclipse plug-in project
• Import images into the plug-in project
• Create Java classes to implement the enhanced functionality offered by the plug-in
• Run and debug the plug-in project
Time required
This module should take approximately 30 minutes to complete.
Prerequisites
To successfully complete the lessons in this module, you should have:
• Created an Eclipse plug-in project
• A image with dimensions of 16 x 16 pixels to use as the icon for your view
Reference 23
For the frame list, you create a frame list for a tree viewer, which looks similar to the default CARMA
Repositories view. For the viewer, you set the content provider to the default CARMA Content Provider.
To implement the Java methods:
1. Open the CARMADeveloperView class by expanding, in the Package Explorer view,
com.ibm.carma.plugin.view > view, and double-clicking CARMADeveloperView.
2. In the editor, you want to add the createFrameList method.
This method first creates the TreeViewerFrameSource, then create a new FrameList, and then
set the source to the TreeViewerFrameSource. Use the following sample code to implement this
functionality:
/* This is a TreeViewer.
* Create the frame list.
*/
FrameList frameList = new FrameList(source);
source.connectTo(frameList);
return frameList;
}
3. Next, you want to overwrite the createViewer so that it creates the CARMATreeViewer with the
default CARMAContentProvider. Use the following sample code to implement this functionality:
4. Ensure that all classes and packages that are mentioned in the source are included in the import
commands at the beginning of the class. The easiest way to do this is to right click in the editor and
select Source > Organize Imports.
Be sure to verify that the following classes were all imported:
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.views.framelist.FrameList;
import org.eclipse.ui.views.framelist.TreeViewerFrameSource;
import com.ibm.carma.ui.view.BaseCarmaBrowser;
import com.ibm.carma.ui.widget.CARMATreeViewer;
<plugin>
<extension
point="org.eclipse.ui.views">
<category
name="BootCamp"
Note: The attributes that are used in the plugin.xml file are described in more detail below:
• Category: the attributes that are used with this markup correspond to the labeling and view of the
Show View dialog box
– Name: the name that appears as the enclosing category in the Show View dialog box
– Id: the id of the category that the view should display under when searching for it in the Show
View dialog box
• View: the attributes that are used with this markup correspond to the labeling, appearance, and
location of the source for the actual view you created
– Name: the label that is given to the view, this name appears in the tab that is associated with the
view, and also in the Show View dialog box
– Icon: the image to associate with the view, this is shown in the tab associated with the view, and
also next to its label in the Show View dialog box
– Category: the id of the category that the view should display under when searching for it in the
Show View dialog box
– Class: the Java class you wrote that controls the view, you should provide the enclosing package
as well
– Id: the unique identifier for the view
Summary: Module 5
This module has guided you through the steps to create a plug-in project that creates the CARMA
Developer View.
Results
You should run or debug your plug-in project now. Do the following while still in the testing workspace to
verify the functionality of your plug-in:
1. Open the CARMA Developer View by selecting from the main file menu, Window (on Windows) or
IBM Developer for z/OS (on macOS) > Show View > Other.
2. In the Show View dialog box that opens, enter the filter text: CARMA Developer View. You should
see this view appear.
3. Select it, and click OK.
4. Your CARMA Developer View opens. If you followed the tutorial exactly, it looks almost exactly like
the CARMA Repository View except the icon in the tab is different.
Reference 25
Learning objectives
After completing the lessons in this module you should be able to:
• Build extra functionality on top of an existing Eclipse plug-in project
• Develop Java code to control the labels in the CARMA Developer View
• Run or debug the modified plug-in project
Time required
This module should take approximately 45 minutes to complete.
Prerequisites
To successfully complete the lessons in this module, you should have:
• Completed Exercise 5: Creating a new CARMA view using the existing CARMA context provider
• An image to use as an icon for COBOL members
This static method allows the image descriptor or decorator to be retrieved from the appropriate
location in the plug-in project.
3. Add the following import at the top of the Activator class: import
org.eclipse.jface.resource.ImageDescriptor;. Save and debug any errors in the source.
4. Next, you want to create the CustomLabelProvider class. In the Package Explorer view, expand
the com.ibm.carma.plugin.view plug-in project. Right click the view package you created in
Exercise 5, and select New > Class. The New Java Class dialog box opens.
5. In the Name text field, enter CustomLabelProvider.
return textLabel;
}
3. The next method that you will want to override is the getImage() method. This method should
change the icon display for COBOL members.
The following is pseudocode for the getImage() method:
Reference 27
{
if(((CARMAMember) element).getLocalExtension().equalsIgnoreCase("cbl"))
{
//replace the parameter of getImageDescriptor() with the path to your particular
icon
ImageDescriptor myDescriptor = Activator.getImageDescriptor("icons/cobol.gif");
return myDescriptor.createImage();
}
}
return super.getImage(element);
}
Note: The path name passed as a parameter to the getImageDescriptor method should match
your directory and image name.
4. Finally, make sure that you have the following packages that are listed in your import statements at the
top of your Java class. Add any that are missing:
import com.ibm.carma.plugin.view.Activator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;
import com.ibm.carma.model.*;
import com.ibm.carma.ui.view.*;
Summary: Module 6
In this module, you have modified the Eclipse plug-in project from Module 5 to customize the view of
COBOL container members with a decorator, and label each RAM with either Connected or Disconnected
tags.
Results
You can run or debug your plug-in project now. Do the following while still in the testing workspace to
verify the functionality of your plug-in:
1. Open the z/OS Projects perspective.
2. Open the CARMA Developer view by selecting from the main file menu, Window (on Windows) or IBM
Developer for z/OS (on macOS) > Show View > CARMA Developer. The view should open.
Learning objectives
After completing the lessons that make up this module, you should be able to:
• Modify an existing Eclipse plug-in project
• Create and modify a Java class to perform the enhancements that are offered by the plug-in
• Run or debug the plug-in project
Time required
This module should take approximately 30 minutes to complete.
Prerequisites
To successfully complete the lessons in this module, you should have:
• Successfully completed Exercise 5 and Exercise 6
import java.util.Vector;
import com.ibm.carma.model.RepositoryInstance;
import com.ibm.carma.ui.view.CarmaTreeContentProvider;
7. You want to modify the getChildren method to change the content that is provided to the viewer.
This method is where the provider can control which items are sent to the viewer when expanding the
Reference 29
RAM. For this tutorial, you implement the getChildren method to return only repository instances
that have a CARMA token in the name and are not a listing, object, or load repository instance.
The following pseudocode demonstrates what the getChildren method should do:
Results
You should run or debug your plug-in project now. Do the following while still in the testing workspace to
verify the functionality of your plug-in:
1. Open the z/OS Projects perspective
2. Open the CARMA Developer view by selecting from the main file menu, (on Windows) or IBM
Developer for z/OS (on macOS) > Show View > CARMA Developer. The view should open.
3. In the CARMA Developer view, expand the host system. You should see each of the RAMs on the host
system marked with a label.
4. Right click a particular RAM, select Connect, and expand the RAM once it is connected.
5. When you expand the RAM, you should only see PDS that contain CARMA in their name.
Learning objectives
After completing the lessons in this module, you should be able to:
• Modify an existing Eclipse plug-in project
• Create and modify Java classes that handle the plug-in enhancement
• Run or debug the plug-in project
Time required
This module should take approximately 30 minutes to complete.
Prerequisites
To successfully complete the lessons in this Module, you should have:
• Successfully completed Exercise 5, Exercise 6, and Exercise 7
Reference 31
5. Click the Browse button to the right of the Superclass text field. In the Superclass Selection
dialog box that opens, enter the filter text, OpenActionGroup. Select the class that is part of the
com.ibm.carma.ui.view package, and click OK.
6. Click Finish to close the New Java Class dialog box and create the class.
7. You want to override the fillContextMenu method to provide the custom content of the open
section of the menu. For the open section of the menu, you need to display everything but the
Open and Open With menu selections. The easiest way to do this is to get the default from
OpenActionGroup section and remove the Open and Open With menu selections.
The following pseudocode demonstrates this:
8. Automatically import any needed packages and classes. Ensure that all of the following are imported:
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IMenuManager;
import com.ibm.carma.ui.action.OpenAction;
import com.ibm.carma.ui.view.OpenActionGroup;
Tip: These variables should be declared at the top of the class before any method declarations.
6. Now you want to override the makeActions method to instantiate the groups and actions
that are needed to fill the menu. With the OpenActionGroup, be sure to instantiate your
CustomOpenActionGroup class instead of the default. Use the following source code:
7. Override the fillContextMenu() method with the updated list of groups, actions, and separators.
To make it look like a pop-up menu, use the same order for adding items to the menu using the
following example code:
_newMenuActionGroup.setContext(myContext);
_newMenuActionGroup.fillContextMenu(menu);
_navigationActionMenu.setContext(myContext);
_navigationActionMenu.fillContextMenu(menu);
menu.add(new Separator("open"));
_openActionGroup.setContext(myContext);
_openActionGroup.fillContextMenu(menu);
menu.add(new Separator("refractor"));
menu.add(new Separator("connect"));
_connectionActionGroup.setContext(myContext);
_connectionActionGroup.fillContextMenu(menu);
_connectionActionGroup.updateActionBars();
menu.add(new Separator("display"));
_displayActionGroup.setContext(myContext);
_displayActionGroup.fillContextMenu(menu);
menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
menu.add(new Separator("project"));
menu.add(new Separator("properties"));
menu.add(_propertyAction);
}
8. Import all needed classes and packages. Ensure that all of the following are included in the import
statements:
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.dialogs.PropertyDialogAction;
import com.ibm.carma.ui.view.BaseCarmaBrowser;
import com.ibm.carma.ui.view.CarmaBrowserActionGroup;
Reference 33
import com.ibm.carma.ui.view.ConnectionActionGroup;
import com.ibm.carma.ui.view.DisplayActionGroup;
import com.ibm.carma.ui.view.NavigationActionGroup;
import com.ibm.carma.ui.view.NewMenuActionGroup;
import com.ibm.carma.ui.view.OpenActionGroup;
This code sets the default action group to the CustomMainActionGroup you created.
3. Add import menu.CustomMainActionGroup; to your list of import statements at the top of the
CARMADeveloperView class.
4. Save the source and debug any errors.
Summary: Module 8
You have modified the Eclipse plug-in project from Module 5-7 to add a custom menu.
Results
You should run or debug your plug-in project now. Do the following while still in the testing workspace to
verify the functionality of your plug-in:
1. Open the CARMA Developer and CARMA Repositories view
2. In one of the views, connect to a particular RAM.
3. Expand the RAM until you can see each of the particular members.
4. Right click any CARMA member in the CARMA Repositories view and in the menu that appears there
should be options to both Open and Delete.
5. Right click the same CARMA member in the CARMA Developer view, and in the menu that appears
there should be no option to Open or Delete.
Learning objectives
After completing the lessons in this module you should be able to:
• Create an Eclipse plug-in project
• Create and define actionValidators, parameterValidators, and customParameterControl
extension points
• Create and develop the necessary classes to add the enhanced functionality to the custom actions
• Run and debug the plug-in project
• Understand the end-result in the plug-in project of using each of the extension points
Prerequisites
To successfully complete the lessons in this module, you should have:
• Access to modify the Sample PDS RAM on your host system or a systems administrator who can do this
for you
• Basic understanding of RAM Development, found in the CARMA Developer's Guide
• Basic understanding of C coding and debugging is recommended
• Experience submitting JCL jobs to REPRO files
Learning objectives
Though this is not a focal point of the exercise, you should be able to configure a RAM to add custom
actions and parameters.
Time required
This portion of lessons should take approximately 30 minutes to complete.
Prerequisites
A basic understanding of the content in the CARMA Developers Guide is recommended.
Lesson 1.1: Customize the PDS RAM by adding a custom action and parameters to the model
This lesson will briefly step you through adding the HowTo custom action and its four parameters: value,
string1, string2, and option, to the PDS RAM.
These parameters and actions are added to the PDS RAM by supplying the appropriate information to
the CRA0VDEF file. For more information on the steps in this lesson, see the CARMA Developer's Guide,
Chapter 4. Customizing a RAM API using the CAF.
1. Start by listing the action or actions that you want to extend to the RAM's API. For this sample, you will
add a custom action, HowTo, with the following attributes:
• Name: HowTo
• Description: Provides an example of implementing plug-in projects with extension points
• ActionID: 100
• RAM ID: 00
• Parameter list: value, string1, string2, option
• Return Value list:
Tip: If you are using the shipped Sample PDS with no customization, then the following values for
action id and RAM id should be correct; however, if you have added or removed RAMs, custom actions,
or parameters check to make sure that the action id is the next available action id and the RAM id
corresponds to the Sample PDS RAM. .
2. In the description of the HowTo custom action above, there are parameters and return values listed.
Each of these must be defined within the RAM as well. The descriptions of each are as follows:
Reference 35
• Name: value
• Description: a one-digit numerical value
• Parameter ID: 000
• Ram ID: 00
• Type: string
• Length: 1
• Constant: no
• Default value: none
• Prompt: Enter a one-digit value:
• Name: string1
• Description: a string of text
• Parameter ID: 001
• RAM ID: 00
• Type: string
• Length: 10
• Constant: no
• Default value: none
• Prompt: Enter a short string of text:
• Name: string2
• Description: a string of text
• Parameter ID: 002
• RAM ID: 00
• Type: string
• Length: 10
• Constant: no
• Default value: none
• Prompt: Enter a short string of text:
• Name: option
• Description: yes or no option
• Parameter ID: 003
• RAM ID: 00
• Type: string
• Length: 1
• Constant: no
• Default value: none
• Prompt: Yes or No?
3. Knowing the actions, parameters, and descriptions of each helps you create the declarations to include
into the configurations file. Each action and parameter is defined on its own line and its particular
metadata is specified within a predefined byte length.
Tip: You can also define the actions and parameters without using the predefined byte sizes for
metadata by using tabs as a delimiter. Be sure to consult the CARMA Developer's Guide, Chapter 4.
Customizing a RAM API using the CAF for the details of this alternative format.
For this sample, using the predefined byte sizes, the custom HowTo action is declared as:
A00100 000,001,002,003|
Note: For both actions and parameters, the first 8 bytes of the record is called the record key.
4. Make sure that there are no active connections between the Sample PDS RAM, CARMA, and the host
system before continuing.
5. You should add this information to FEL.SFELVSM2(CRA0DEF) and ensure that all record keys are
in alphanumeric order. Use the JCL script that is located at FEL.#CUST.JCL(CRA$VDEF) to REPRO
FEL.SFELVSM2(CRA0DEF).
6. Next, for each action and parameter you define in the CRA0VDEF file you must define a corresponding
definition in the CRA0VSTR file containing any language-dependent information about the action or
parameter.
For this sample, the custom action would be defined in the CRA0VSTR like the following:
EN_US 00037A00100 HowTo For demonstration. Does nothing.
Note: For both actions and parameters, the first twenty-one bytes of the record is called the record
key.
7. You should add this information to the FEL.SFELVSM2(CRA0VSTR) file and ensure that all records
are in alphanumeric order. Use the JCL script that is located at FEL.#CUST.JCL(CRA$VSTR) to
REPRO FEL.SFELVSM2(CRA0VSTR).
Lesson 1.2: Add the performAction function to the PDS RAM to correspond with the custom HowTo action
In the last lesson, you configured the Sample PDS RAM with a HowTo custom action and its four
parameters. In this lesson, you create or modify the function on the host that handles the HowTo action.
The HowTo action was created for demonstrational purposes to display the dialog box to which you
will later apply the actionValidators, parameterValidators, and customParameterControl
extension points. However, for the purposes of this sample, you do not need this action to perform any
action on the host. Therefore, the function that is provided for the HowTo action id on the Sample PDS
RAM does nothing.
1. Open the C file on the host containing the Sample PDS RAM source; it should be
FEL.SFELSAMP(CRASPDS). You can open this file directly in Developer for z/OS.
2. If you have custom actions that are already implemented on the Sample PDS RAM, you want to modify
the performAction function to do nothing if it is passed the HowTo action id and return successful.
Use the following sample code snippet to add this to your performAction function:
if(actionID == 100)
{
return 0;
}
If the HowTo custom action calls the performAction function it will now return successful without
performing any action on the host. Skip steps 3 and 4.
Note: If you have already implemented the performAction function, you should check and make
sure that the actionId 100 has not already been set to another custom action.
3. If you have not implemented any custom actions for the Sample PDS RAM, you will want to implement
the performAction function and have it do the same thing as the snippet of code above does.
Start by adding the following export statement to the preprocessor directives at the top of the C
source: #pragma export(performAction).
Reference 37
4. Next, add the following method to the PDS RAM:
Note: If you add more custom actions to the PDS RAM later, you will want to specify for each custom
action id what action should be performed, similar to the snippet of code in step 2.
5. Save the source and debug any errors.
Lesson 1.3: Recompile the PDS RAM and verify the HowTo custom action
This lesson guides you through the final steps in adding the custom action and parameters to the Sample
PDS RAM.
1. Be sure that there are no active connections between the Sample PDS RAM, CARMA, and the host
system. Any active connections could cause CARMA or the RAM to act abnormally.
2. Recompile the FEL.SFELSAMP(CRASPDS) member.
3. Restart the server.
4. In the client, reconnect to CARMA and to the Sample PDS RAM.
5. Now, expand the Sample PDS RAM down to a particular CARMA member.
6. When you right-click on the CARMA member, you should be able to select Custom > HowTo.
7. The HowTo action dialog box opens and should have empty text fields and prompts for the four
parameters you defined on the Sample PDS.
Lesson 2: Define the dependency and extensions for the plug-in project
In this lesson, you define the dependencies and the three extension points: actionValidators,
parameterValidators, and customParameterControl.
Note: Before you complete this lesson, you should create an Eclipse plug-in project with the following
attributes:
• Project Name: com.ibm.carma.plugin.howto
• ID: com.ibm.carma.plugin.howto
• Name: HowTo Action
1. Open the Plug-in Manifest Editor by right-clicking on the com.ibm.carma.plugin.howto plug-in
project, and selecting PDE Tools > Open Manifest.
2. Start by adding the dependency. Select the Dependencies tab at the bottom of the Plug-in Manifest
Editor.
3. Click the Add button under the Required Plug-ins panel. The Plug-in Selection dialog box opens.
4. Filter for the com.ibm.carma.ui plug-in, select it when it appears, and click OK.
5. Next, add the extensions to the plug-in project. Select the Extensions tab and filter for each of the
following:
• com.ibm.carma.ui.parameterValidators,
• com.ibm.carma.actionValidators,
• com.ibm.carma.customParameterControls
In the next three lessons, you configure each of the extensions to be associated with the HowTo custom
action and its parameters.
Reference 39
5. Finally, in the class text field, enter the class that contains the code to apply the
actionValidator to the parameters of the HowTo custom action. For this sample, the class is,
com.ibm.carma.plugin.howto.action.ActionValidationAction. You create this class later
on in this exercise.
You have now defined a parameterValidator extension for the PDS RAM on the HowTo action using
the ActionValidationAction Java class.
Lesson 6: Create the appropriate Java classes to handle the verification and validation
In the previous lessons you configured the extension points; now you create the Java classes that are
needed to handle the validation of the parameters and actions.
Tip: As you create these Java classes, they will each have to implement or extend certain interfaces or
classes respectively. To determine what classes or interfaces need to be included, you can right-click on
the extension in the Plug-in Editor and select Show Description. The description of the extension will
open in the editor. If you scroll down to the API Information heading, you find the classes or interfaces
the class needs to use in conjunction with the extension point.
1. Start by creating the class that is used with the parameterValidator extension point. This class
is responsible for checking to make sure the value that is entered into the value parameter follows
the specifications that are outlined in this sample. In the Package Explorer view, right click the
com.ibm.carma.plugin.howto plug-in project, and select New > Package.
2. In the New Java Package dialog box that opens, enter com.ibm.carma.plugin.howto.action as
the name for the package. Click Finish. You should see the package that is created under your Eclipse
plug-in project.
3. Now, right click the com.ibm.carma.plugin.howto.action package you created, and select New
> Class. The New Java Class dialog box opens.
4. Enter ValueParamValidator in the Name text field.
5. To the right of the Interfaces click the Add button. In the Implemented Interfaces Selection dialog
box that opens, filter for the interface IParameterValidator. Click Finish to close the New Java
Class dialog box and open the class in the editor.
6. Now, you create the second Java class that is responsible for handling the verification of the HowTo
action. Right click the com.ibm.carma.plugin.howto.action package and select New > Java
Class.
7. In the New Java Class dialog box that opens enter the name of the class to be, ActionValidator
and add the interface IActionValidator. Click Finish to close the dialog box and create the class.
Use the following example sample code to implement the verifyInput method:
3. Next, you will override the validateParameter method to display the appropriate methods
depending on the values entered, as described above.
The following pseudo code demonstrates this:
if input = 0
return an informational message
else if input = 1
return a warning message
else
return an error message
Reference 41
}
else if(event.text.contains("1"))
{
//Display a warning message
result.severity = ValidationResult.WARNING;
result.message = "Values greater than 1 will result in an error!";
}
else
{
//Display an error message.
result.severity = ValidationResult.ERROR;
result.message = "Value is too great, enter a lower value.";
}
return result;
}
Use the following example source code to override the isParameterRequired method:
return false;
}
3. Next, you override the validateAction method to allow only one value in the input strings
parameter, but not both. The following pseudocode demonstrates this:
//Retrieve the parameter value for string1, and determine if there was input
String string1Val = (String) event.parameterValueMap.get(string1Param);
boolean string1IsThere = !(string1Val == null || string1Val.length() == 0);
//Retrieve the parameter value for string2, and determine if there was input
String string2Val = (String) event.parameterValueMap.get(string2Param);
boolean string2IsThere = !(string2Val == null || string2Val.length() == 0);
return result;
}
4. Now, you override the getValue method. This method returns the value of the parameters. Since
you are using a checkbox instead of a text field, the code you write will have to translate the check
or unchecked status of the checkbox into the expected string format. The following pseudocode
demonstrates this:
Reference 43
if the checkbox is checked
return "Y" for yes
else
return "N" for no
5. The last method that you need to override is the isUsingDefaultLabel method. If set to false, this
method will not display the default label that you provided when you added the parameter to the RAM.
If set to true, then the label is displayed like normal. For this sample, the code will use the default
label.
Use the following sample code to override the method:
6. Finally, you need to ensure that all required imports are listed. Add any of the following import
statements that are not listed in your class:
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import com.ibm.carma.model.*;
import com.ibm.carma.ui.action.custom.AbstractCustomParameterControl;
package com.ibm.carma.plugin.howto.action;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import com.ibm.carma.model.*;
import com.ibm.carma.ui.action.custom.AbstractCustomParameterControl;
@Override
public Object getValue() {
if(theButton.getSelection())
return "Y";
else
return "N";
}
@Override
public boolean isUsingDefaultLabel() {
return true;
Summary: Module 9
In this module, you have created a plug-in project that demonstrates the use of the actionValidators,
parameterValidators, and customParameterControl extension points.
Results
You should run or debug your plug-in project now. Do the following while still in the testing workspace to
verify the functionality of your plug-in:
1. Be sure that you are in the zOS Projects perspective and are connected to your host system. Use the
port numbers that are associated with the updates you did on the PDS RAM in Lesson 1.
2. Open the CARMA Repositories view and connect to the PDS RAM you modified in Lesson 1.
3. Expand the RAM down to an individual CARMA Member. Right click this member, and select Custom >
HowTo. The HowTo dialog box opens.
Tip: If you have trouble getting this dialog box to open or for the custom option to be available, check
back through the steps you followed in Lesson 1 or consult the CARMA Developer's Guide.
4. The first thing that you will check for is that the parameterValidator extension is working correctly.
a. In the first text field, enter 0. An informational message should appear in the header of the dialog
box.
b. Now enter 1 in the text field. The message should change to a warning message.
c. Entering 2 or other numerical value should result in a displayed error message and the OK button
disabled.
d. The final test for the parameterValidator extension is attempting to enter a nonnumeric
character, such as a. The input should not be allowed and will not even appear within the text
field.
5. Next, you check the actionValidator extension.
a. The first test is to see if the appropriate parameter you coded to be required is marked with an
asterisk. For this sample, the first parameter should be marked with the asterisk, but no other
parameters.
b. The second test is to ensure that the form will not be accepted if both strings are provided. For
this sample, when you enter a value into both string fields, you should see an error message that is
displayed and the OK button should be disabled.
6. Finally, you will test the customParameterControl extension.
a. The first test is to check to see if a checkbox has replaced the default text field and that selecting
and clearing the checkbox does not cause any errors.
b. The second test is to see if the default label provided, Y/N? was kept.
Reference 45
Defining criteria for CARMA compare
CARMA has the ability to compare (associated) resources in the Developer for z/OS workspace (for
example, local or remote projects) with resources in a CARMA RAM. This is useful for determining what
changes have been made to the workspace files before checking the changes into CARMA.
CARMA stores the current criteria values when it downloads a resource into the workspace. Based on
criteria value and workspace changes CARMA can determine what changes have been made to the
version in the RAM and indicate what direction changes should be moved. For example, CARMA can
determine whether a workspace file has been updated locally, in the RAM, or both. Based on the change
information CARMA can indicate what portions of the file that is changed and indicate where changes
should be uploaded to the RAM, copied from the RAM, or if a merge needs to occur because changes have
occurred in the workspace and the RAM.
In order to perform the compare in a flexible manner, CARMA has provided a Compare Criteria
configuration file – syncConfig.xml. This syncConfig file is placed in the RSE configuration directory*
and automatically picked up by CARMA when RSE starts**.
The compare configuration file allows the RAM developer to specify a variety of criteria for comparison on
a RAM-by-RAM basis. An example of a compare configuration file is:
The XML document must begin with a CARMACompare element. The CARMACompare element can contain
1 or more RAMCompare elements. Each RAMCompare element specifies the comparison criteria for a
single RAM. The RAM that the criteria apply to is denoted by the ramId attribute. The ramId value should
match up with the RAM id in the CARMA VSAM configuration and is a 2-digit number. 0 s are required to
be added to the beginning of the Id value if the Id is fewer than 2 digits.
Note: You can identify a RAM using either the ramId or uniqueId. If you know the particular ID for
the RAM, use the ramId. If you know the RAM, but do not know the ramID associated with it, use the
uniqueId.
The example above defines compare criteria for 2 RAMs, 01 and 02. Each RAMCompare element contains
the criteria for the RAM. Currently, the criteria available for checking include:
• Member information
• Member contents
Member information
The configuration can define 1 or more memberinfo elements for each RAMCompare. The member
information elements are concatenated together to form a comparison. The member information element
contains a key, type, and optional format attributes. Currently, the type and format attributes are
ignored but an explanation of usage is included. The keys are currently compared directly for string
equivalence.
Key attribute
The key attribute references a member information item that is found in the properties for a resource.
The key attribute should match the key that is returned by the RAM for the resource.
Type attribute
The type attribute specifies how the key value should be treated. The type attribute can be set to
one of the following:
• int
Reference 47
Related information
Generated files: Implementation code
Custom Rules API for COBOL Code Review
COBOL Application Model API
Reference 49
5. In the Plug-in Directory window, select the com.ibm.ftt.api.samples plug-in and click OK. This
plug-in is in the idz\samples\api-samples\eclipse\plugins folder of the Developer for z/OS
installation path.
6. In the Import As area of the Import Plug-ins and Fragments window, select the Projects with
source folders checkbox and click Next.
7. In the Selection window, select the plug-in name in the left pane and then click Add and Finish.
The samples plug-in is added to the Package Explorer.
8. To see how the samples integrate with Developer for z/OS, define and start a runtime configuration.
a) Select com.ibm.ftt.api.samples in the Package Explorer and then click Run > Run
Configurations.
The Create, manage, and run configurations wizard opens.
b) To open the new configuration page, double-click Eclipse Application from the list of
configurations.
c) In the Name field, type a name of your choice and in the Location field, type a location of your
choice.
To create a configuration in the current workspace, for example, you might type Resource
API configuration in the Name field and ${workspace_loc}/../Resource API
configuration in the Location field.
d) Click Run a product and then select com.ibm.rational.developer.systemz.product.ide from the
list.
e) To start the runtime configuration, click Run.
A runtime Developer for z/OS workbench opens with the z/OS Projects perspective. This runtime
workbench opens in a new workspace, separate from the originating workspace. The menu bar in the
new workspace contains an API Samples menu. Some of the menus contain API Sample Actions.
The results of some of these actions are displayed in the Console view of the originating workspace.
For more information about these samples, see the descriptions in the Remote Resource Access API
topics in Help Contents.
Sample scenario
To retrieve information about z/OS systems, select the API Samples > Systems Information. action.
For each system that is defined, the name, IP address, and connection status are displayed in the
standard output that is associated with the workbench. This information can be found in the Console view
of the workbench.
Note: The standard output for a workbench started with the standard Eclipse icon might not be visible
depending on the runtime settings for the workbench.
Reference 51
Retrieving the system list and obtaining system properties
The following code snippet from the ListSystemsAction class contains the core of the sample.
First, it uses the PhysicalSystemRegistry class, obtained from the getSingleton method of the
PhysicalSystemRegistryFactory class, to retrieve the IOSImage objects that represent the MVS
subsystems that are defined in the workspace. Then, it iterates through each of the subsystems and prints
the following information:
• Name of the connection (getName)
• IP address of the connection (getIpAddress)
• Connection status (isConnected)
The menu item is contributed to the workbench through an Eclipse action set:
<extension
id="com.ibm.ftt.api.samples.actionSets"
name="%apiSample.actionSets"
point="org.eclipse.ui.actionSets">
<actionSet label="com.ibm.ftt.api.samples.actionSet1"
description="Action set for the API samples"
visible="true"
id="com.ibm.ftt.api.samples.actionSet1">
<menu label="%apiMenu.title"
id="com.ibm.ftt.api.samples.apiMenu">
<separator name="com.ibm.ftt.api.samples.apiMenu.resourcesAPI"/>
</menu>
<action label="%apiMenu.samples.listSystems"
class="com.ibm.ftt.api.samples.resources.ListSystemsAction"
style="push" menubarPath=
"com.ibm.ftt.api.samples.apiMenu/com.ibm.ftt.api.samples.apiMenu.resourcesAPI"
id="com.ibm.ftt.api.samples.listSystemsAction"/>
......
</actionSet>
</extension>
Sample scenario
To retrieve information about z/OS projects, select the API Samples > Projects Information action.
For each project that is defined, some basic information about the projects and a hierarchical list of data
sets and members are displayed. For each child under the project, the applicable COBOL compiler options
set for each of them are shown. The output is sent to the standard output associated with the workbench.
This information can be found in the Console view of the workbench.
Note: The standard output for a workbench started with the standard Eclipse icon might not be visible.
Object [] projectReferences =
LogicalProjectRegistryFactory.getSingleton().getProjects();
The code starts by using the LogicalProjectRegistry class, obtained by the getSingleton method
of the LogicalProjectRegistryFactory class, to obtain the list of all ILogicalProject instances
that are defined in the workbench. It then iterates through the list of known projects, obtaining the
children of each project from the getChildren method. An ILogicalProject object can contain
only ILogicalSubProject objects as children. The ILogicalSubProject objects are in turn iterated
through and processed.
The getName method obtains the name of the project and the subproject.
Reference 53
Determining whether the associated system is connected
You can determine whether the system associated with an MVS subproject is connected. After you have
a reference to an ILogicalSubProject, retrieve the IOSImage object that represents the particular
system by using the method getSystems. Each MVS subproject corresponds to only one MVS file system.
After you have the IOSImage object, you can determine whether the system is connected by using the
(isConnected) method. The following code snippet is from the printSubproject sample method.
if (subProject.getSystems()[0].isConnected()) {
printMembers(subProject, indent);
} else {
......
}
Similarly, the printMember sample method uses it to retrieve the COPYLIB associated with the specified
resource.
String copyLibraries =
resource.getPersistentProperty(IPhysicalResourceCoreConstants.COBOL_COMPILE_COPYLIBRARIES);
The printMember method then prints the appropriate information for the current resource. If the current
resource is an ILogicalContainer, it co-recursively starts the printMembers method to descend into
the subtree.
Sample Scenario
To retrieve information about the specified resource, make sure the fully qualified name, of the form
system.name datasetname(membername) is in the current selection, then select the API Samples >
Find Resource action.
The name, full path, modification time stamp, and compiler options of the resource are displayed in the
standard output that is associated with the workbench. This information can be found in the Console view
of the workbench.
Note: The standard output for a workbench started with the standard Eclipse icon might not be visible.
identifier.setDataSetName(dataset);
identifier.setMemberName(member);
identifier.setSystem(systemName);
IPhysicalResource res = ZOSPhysicalResourceFinder.eINSTANCE.
findPhysicalResource(identifier);
Reference 55
+ resource.getModificationStamp() + " ("
+ new Date(resource.getModificationStamp()) + ")");
System.out.println("Name of the associated system is "
+ resource.getSystem().getName());
Sample scenario
To open a remote resource in the default editor, select a remote resource and then select the API Sample
Actions > Open File action.
Sample scenario
To retrieve the content for the resource, make sure that the resource is selected in the navigator, then
select the API Samples > Get File Contents action.
The contents in the file are displayed in the standard output that is associated with the workbench. The
contents can be found in the Console view of the workbench.
Note: The standard output for a workbench started with the standard Eclipse icon might not be visible.
InputStream is = null;
if (selectedItem instanceof ILogicalFile) {
// Project proxy for resource
ILogicalFile file = (ILogicalFile) selectedItem;
filename = file.getName();
is = file.getContents();
} else if (selectedItem instanceof IPhysicalFile) {
// Physical Resource
IPhysicalFile file = (IPhysicalFile) selectedItem;
filename = file.getName();
is = file.getContents();
}
int ch = is.read();
while (ch != -1) {
System.out.write(ch);
ch = is.read();
}
<extension
id=“com.ibm.ftt.api.samples.actionSets”
name=“
point=“org.eclipse.ui.actionSets”>
<actionSet
label=“com.ibm.ftt.api.samples.actionSet1”
description=“Action set for the API samples”
visible=“true”
id=“com.ibm.ftt.api.samples.actionSet1”>
<menu
label=“
id=“com.ibm.ftt.api.samples.apiMenu”>
<separator name=“com.ibm.ftt.api.samples.apiMenu.resourcesAPI”/>
</menu>
<action
label=“
class=“com.ibm.ftt.api.samples.resources.GetContentsAction”
style=“push”
menubarPath=“com.ibm.ftt.api.samples.apiMenu/
Reference 57
com.ibm.ftt.api.samples.apiMenu.resourcesAPI”
id=“com.ibm.ftt.api.samples.getContentAction”/>
......
</actionSet>
</extension>
A menu action is defined at the group that is associated with the samples
menu, which is specified with the menu path com.ibm.ftt.api.samples.apiMenu/
com.ibm.ftt.api.samples.apiMenu.resourcesAPI. Furthermore, the menu action is associated
with the GetContentsAction class. This class is started when you click the menu item.
Sample scenario
To copy a physical resource, select a remote resource and then select the API Sample Actions > Copy
Physical Resource action.
Sample scenario
To create a logical resource from a physical resource, select a remote resource and then select the API
Sample Actions > Create Logical Resource action.
Sample scenario
Right-click the MVS Files subsystem for the appropriate connection and then select the API Sample
Actions > Allocate PDS action.
A sample partitioned data set is allocated. The name of the allocated data set is hardcoded in the action
as the constant DATASET_NAME.
If the data set exists, it is deleted and then reallocated. The following messages are sent to system
output.
After the ZOSCatalog is obtained, its findMember method is started to see whether a partitioned
data set with the specified name exists. If the data set exists already, the sample attempts
to delete the existing data set by using the delete method. It is important to catch the
OperationFailedException in case something goes wrong during the delete.
Sample scenario
To use this sample, right-click a partitioned data set in the Remote Systems Explorer View, and select the
API Sample Actions > Create Member action.
A member with the name TEMP is created in the selected data set.
Reference 59
return;
}
The member is then created as follows. An IPhysicalResource object that references the member
is created by using the getPhysicalResource method of the ZOSPhysicalResourceFactory class.
(The resource object that is returned by the getPhysicalResource method is not required to represent
an actual existing remote system resource.) After you have the IPhysicalResource, the actual member
can then be created on the remote system by starting create method.
ZOSPhysicalResourceFactory factory =
ZOSPhysicalResourceFactory.eINSTANCE;
resource = (IPhysicalFile) factory.getPhysicalResource(dataSet,
ZOSDataSetMember.class, MEMBER_NAME);
try {
resource.create(
new ByteArrayInputStream(MEMBER_CONTENT.getBytes()),
true, null);
} catch (OperationFailedException e) {
......
}
The create method expects an InputStream containing the content for the file to be created.
Processing of offline resources by using the Remote Access API is not yet supported.
The code then proceeds to create a data set member IPhysicalResource as in “Creating a data set
member IPhysicalResource” on page 59.
The following code snippet then adds the resource to the appropriate subproject obtained
through the getSubProject method. The code snippet accomplishes this purpose by using the
LogicalResourceFactory class. This method can be used to add any physical resource to a project, by
using the Add to Subproject menu action.
selectedItem = null;
if (selection instanceof IStructuredSelection) {
IStructuredSelection currentSelection =
(IStructuredSelection) selection;
Iterator iterator = currentSelection.iterator();
while (iterator.hasNext()) {
Object item = iterator.next();
if (item instanceof LZOSPartitionedDataSet) {
selectedItem = item;
break;
} else if (item instanceof ZOSResourceReference) {
item = ((ZOSResourceReference) item).getReferent();
if (item instanceof ZOSPartitionedDataSet) {
selectedItem = item;
break;
}
}
}
}
<extension
id="com.ibm.ftt.api.samples.popupMenus"
name="%apiSample.popupMenus"
point="org.eclipse.ui.popupMenus">
<objectContribution
adaptable="false"
objectClass= "com.ibm.ftt.resources.zos.zosphysical.ZOSResourceReference"
id="com.ibm.ftt.api.samples.physical.patitionedDataset">
......
<action
label="%apiMenu.samples.createMember"
class= "com.ibm.ftt.api.samples.resources.CreateMemberAction"
menubarPath="com.ibm.ftt.api.samples.PopupMenu/group1"
id="com.ibm.ftt.api.samples.physical.createMember"/>
</objectContribution>
......
<objectContribution
adaptable="false"
objectClass= "com.ibm.ftt.projects.zos.zoslogical.LZOSPartitionedDataSet"
id="com.ibm.ftt.api.samples.logical.patitionedDataset">
<menu
id="com.ibm.ftt.api.samples.PopupMenu"
label="
<separator name="group1"/>
</menu>
<action
label="%apiMenu.samples.createMember"
class= "com.ibm.ftt.api.samples.resources.CreateMemberAction"
menubarPath="com.ibm.ftt.api.samples.PopupMenu/group1"
id="com.ibm.ftt.api.samples.logical.createMember"/>
</objectContribution>
Reference 61
Subscribing to events related to remote resources
This sample demonstrates how to subscribe to events related to remote resources.
Sample scenario
To subscribe to events related to remote resources, select a remote resource and then select the API
Sample Actions > Subscribe to Events action.
Sample scenario
Create a z/OS project and MVS subproject according to the instructions in the following topics:
• Creating a z/OS project
• Creating an MVS subproject
To add the sample project nature to the subproject, right-click the subproject and select the API Sample
Actions > Add Project Nature action.
<extension
id=“samplenature”
name=“
point=“com.ibm.ftt.projects.core.natures”>
<nature class=“com.ibm.ftt.api.samples.natures.SampleNature”/>
</extension>
try {
getSubProject().addNatureId("com.ibm.ftt.api.samples.samplenature");
} catch (CoreException e) {
// TODO: in production code exception should be handled for real
<objectContribution
adaptable=“false”
objectClass=“com.ibm.ftt.projects.core.logical.ILogicalSubProject”
id=“com.ibm.ftt.api.samples.addnature”>
<action
label=“
class=“com.ibm.ftt.api.samples.natures.AddSubProjectNatureAction”
id=“com.ibm.ftt.api.samples.addnatureaction”/>
</objectContribution>
Removing a project nature and contributing menu items filtered by project natures
The Remove Project Nature menu item is implemented by the RemoveSubProjectNatureAction
class. Its run(IAction) method removes the SampleNature by passing the ID of the nature to the
removeNatureId(String) method of ILogicalSubProject.
try {
getSubProject().removeNatureId(“com.ibm.ftt.api.samples.samplenature”);
} catch (CoreException e) {
// TODO: in production code exception should be handled for real
e.printStackTrace();
}
<objectContribution
adaptable=“false”
objectClass=“com.ibm.ftt.projects.core.logical.ILogicalSubProject”
id=“com.ibm.ftt.api.samples.removenature”>
<filter
value=“com.ibm.ftt.api.samples.samplenature”
name=“projectNature”/>
<action
label=“
class=“com.ibm.ftt.api.samples.natures.RemoveSubProjectNatureAction”
id=“com.ibm.ftt.api.samples.removenatureaction”/>
</objectContribution>
Sample scenario
To create a property group, select the API Sample Actions -> Create Property Group action from the
menu of an MVS Files node in the Remote Systems view.
Statements are displayed when the property group is created and the property values are set. Also, if any
error conditions are detected, error messages are displayed as well. They are displayed in the standard
output that is associated with the workbench. This information can be found in the Console view of the
workbench.
Note: The standard output for a workbench started with the standard Eclipse icon might not be visible
depending on the runtime settings for the workbench.
The following illustration shows the results of successfully creating the property group and setting the
values:
Reference 63
Retrieving the property group container for the system
The following code snippet from the CreatePropertyGroupAction class demonstrates how to retrieve
the property group container for the selected system:
if (selectedItem == null) {
System.err.println("Create Property Group Action - Selected resource must be an MVS File
subsystem.");
return;
}
if (selectedItem instanceof ZOSSystemReference) {
System.out.println("");
System.out.println("-----------------------");
System.out.println("Beginning Create Property Group Action...");
ZOSSystemReference reference = (ZOSSystemReference) selectedItem;
ZOSSystemImage system = (ZOSSystemImage) reference.getReferent();
// Get the property group container for this system.
ZOSPropertyGroupManager manager = ZOSPropertyGroupManager.getZOSPropertyGroupManager();
IPropertyGroupContainer container = manager.getPropertyGroupContainer(system.getName());
if (container == null) {
System.err.println("Create Property Group Action - No container for system: " +
system.getName());
return;
}
It starts by verifying that the selectedItem is an instance of the ZOSSystemReference class. If so, it
retrieves the ZOSSystemImage from the ZOSSystemReference by using the getReferent method.
For each system connection, there is a property group container. The property group container
for a system name can be retrieved by using the getPropertyGroupContainer method of the
ZOSPropertyGroupManager class.
The property group is created by using the createPropertyGroup method. If the property group exists,
a DuplicatePropertyGroupException is thrown and an error message is printed.
An instance of the SAMPLE_CATEGORY category is created by the previous code snippet. This category is
registered with Developer for z/OS using the following Eclipse extension point:
<extension point="com.ibm.ftt.properties.api.category">
<category name="SAMPLE_CATEGORY">
<property name="PROPERTY_1" />
<property name="PROPERTY_2" />
</category>
</extension>
These property values are not displayed in the Developer for z/OS user interface because the user
interface is not extensible, but they are available through the API.
Reference 65
Getting the lists of categories, properties, and category instances
This sample demonstrates how to programmatically obtain the list of registered categories and
properties. Currently, the names of the registered categories and properties can be obtained. For each
category, the instances of that category can be obtained, and the property values in each instance can be
obtained.
Sample scenario
To retrieve information about the categories, properties, and instances, select the API Samples >
Properties Information action.
For each registered category, the name, the properties, and any instances of the category are displayed in
the standard output that is associated with the workbench. This information can be found in the Console
view of the workbench.
Note: The standard output for a workbench started with the standard Eclipse icon might not be visible
depending on the runtime settings for the workbench.
Each category has a name and retrieves IPropertyInfo objects, which have the names of the
registered properties for that category.
Each category retrieves ICategoryInstance objects, which hold property values. Finally, the
IProperty objects that are retrieved from a ICategoryInstance object have the name of the property
and the property value.
The menu item is contributed to the workbench through an Eclipse action set:
<extension
id="com.ibm.ftt.api.samples.actionSets"
name="%apiSample.actionSets"
point="org.eclipse.ui.actionSets">
<actionSet label="com.ibm.ftt.api.samples.actionSet1"
description="Action set for the API samples"
visible="true"
id="com.ibm.ftt.api.samples.actionSet1">
<menu label="%apiMenu.title"
id="com.ibm.ftt.api.samples.apiMenu">
<separator name="com.ibm.ftt.api.samples.apiMenu.resourcesAPI"/>
</menu>
<action label="%apiMenu.samples.listProperties"
class="com.ibm.ftt.api.samples.resources.ListPropertiesAction"
style="push" menubarPath=
"com.ibm.ftt.api.samples.apiMenu/com.ibm.ftt.api.samples.apiMenu.resourcesAPI"
id="com.ibm.ftt.api.samples.listPropertiesAction"/>
......
</actionSet>
</extension>
Sample scenario
Create a z/OS project and MVS subproject according to the instructions in the following topics:
• Creating a z/OS project
• Creating an MVS subproject
The act of creating a subproject causes an XML file to be created in which various characteristics and
properties of the subproject are maintained. The following illustration shows a portion of this XML file
after creation of the subproject:
Reference 67
To replace the default subproject builder with a different (user-defined) builder, right-click the subproject
and select the API Sample Actions > Replace Default Builder action.
This action causes the information in the XML file to be updated. The file might not be updated
immediately, but the builder information changes the next time that the file is written. The file looks
similar to the following illustration:
Reference 69
BuildSpec by using the setBuildSpec(com.ibm.ftt.projects.core.logical.IBuildCommand
newCommands) method.
<objectContribution
adaptable=“false”
objectClass=“com.ibm.ftt.projects.core.logical.ILogicalSubProject”
id=“com.ibm.ftt.api.samples.addbuilder”>
<visibility>
<not>
<objectState
name=“projectBuilder”
value=“com.ibm.ftt.api.samples.samplebuilder”>
</objectState>
</not>
</visibility>
<action
label=“
class=“com.ibm.ftt.api.samples.builders.AddSubProjectBuilderAction”
menubarPath=“com.ibm.ftt.api.samples.PopupMenu/group1”
id=“com.ibm.ftt.api.samples.addbuilderaction”/>
</objectContribution>
<objectContribution
adaptable=“false”
objectClass=“com.ibm.ftt.projects.core.logical.ILogicalSubProject”
id=“com.ibm.ftt.api.samples.removebuilder”>
<filter
value=“com.ibm.ftt.api.samples.samplebuilder”
name=“projectBuilder”/>
<action
label=“
class=“com.ibm.ftt.api.samples.builders.RemoveSubProjectBuilderAction”
menubarPath=“com.ibm.ftt.api.samples.PopupMenu/group1”
id=“com.ibm.ftt.api.samples.removebuilderaction”/>
</objectContribution>
Sample scenario
To submit JCL and wait for the output, select a JCL file from the z/OS Projects view and then select the
API Sample Actions > Submit and Wait action.
Remote System Explorer API Software Developer Toolkit (RSE API SDK)
IBM RSE API SDK overview
IBM Remote System Explorer API (RSE API) SDK is an extension from IBM Remote System Explorer API.
Same as RSE API, RSE API SDK allows clients to work with various components on the z/OS host system,
such as MVS data sets, z/OS UNIX files and commands, and JES jobs.
RSE API SDK provides easy-to-call methods while specifying the parameters that are required by the RSE
API itself. Therefore, Java clients can call the REST APIs without worrying about the backbone structure
of a request call and the type of response to accept. Use RSE API SDK in your Java project by importing
Reference 71
the IBM RSE API SDK Toolkit that contains the library of JAR files required to support the RSE API SDK
Toolkit APIs. For more information, see “Importing IBM RSE API SDK Toolkit” on page 72.
RSE API SDK also provides default code templates for you to call upon during development to easily
access its services. For example, the code templates that are provided for logging in to z/OS, logging out
of z/OS, and listing z/OS UNIX System Services files. For more information, see “Accessing IBM RSE API
SDK code templates” on page 72.
Reference 73
74 Developer for z/OS: Reference
Documentation notices
© International Business Machines Corporation 1992, 2024.
This information was developed for products and services offered in the US. This material might be
available from IBM in other languages. However, you may be required to own a copy of the product or
product version in that language in order to access it.
IBM may not offer the products, services, or features discussed in this document in other countries.
Consult your local IBM representative for information on the products and services currently available in
your area. Any reference to an IBM product, program, or service is not intended to state or imply that
only that IBM product, program, or service may be used. Any functionally equivalent product, program, or
service that does not infringe any IBM intellectual property right may be used instead. However, it is the
user's responsibility to evaluate and verify the operation of any non-IBM product, program, or service.
IBM may have patents or pending patent applications covering subject matter described in this
document. The furnishing of this document does not grant you any license to these patents. You can
send license inquiries, in writing, to ipemail@us.ibm.com.
INTERNATIONAL BUSINESS MACHINES CORPORATION PROVIDES THIS PUBLICATION "AS IS"
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED
TO, THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A
PARTICULAR PURPOSE. Some jurisdictions do not allow disclaimer of express or implied warranties in
certain transactions, therefore, this statement may not apply to you.
This information could include technical inaccuracies or typographical errors. Changes are periodically
made to the information herein; these changes will be incorporated in new editions of the publication.
IBM may make improvements and/or changes in the product(s) and/or the program(s) described in this
publication at any time without notice.
Any references in this information to non-IBM websites are provided for convenience only and do not in
any manner serve as an endorsement of those websites. The materials at those websites are not part of
the materials for this IBM product and use of those websites is at your own risk.
IBM may use or distribute any of the information you provide in any way it believes appropriate without
incurring any obligation to you.
Licensees of this program who wish to have information about it for the purpose of enabling: (i)
the exchange of information between independently created programs and other programs (including
this one) and (ii) the mutual use of the information which has been exchanged, should contact
ipemail@us.ibm.com.
Such information may be available, subject to appropriate terms and conditions, including in some cases,
payment of a fee.
The licensed program described in this document and all licensed material available for it are provided by
IBM under terms of the IBM Customer Agreement, IBM International Program License Agreement or any
equivalent agreement between us.
Any performance data and client examples cited are presented for illustrative purposes only. Actual
performance results may vary depending on specific configurations and operating conditions.
Information concerning non-IBM products was obtained from the suppliers of those products, their
published announcements or other publicly available sources. IBM has not tested those products and
cannot confirm the accuracy of performance, compatibility or any other claims related to non-IBM
products. Questions on the capabilities of non-IBM products should be addressed to the suppliers of
those products.
Statements regarding IBM's future direction or intent are subject to change or withdrawal without notice,
and represent goals and objectives only. Such statements should not be relied upon when making
purchasing decisions.
Trademarks
IBM, the IBM logo, and ibm.com are trademarks or registered trademarks of International Business
Machines Corporation, registered in many jurisdictions worldwide. Other product and service names
might be trademarks of IBM or other companies. A current list of IBM trademarks is available at
"Copyright and trademark information" at www.ibm.com/legal/copytrade.shtml.
Applicability
These terms and conditions are in addition to any terms of use for the IBM website.
Personal use
You may reproduce these publications for your personal, noncommercial use provided that all proprietary
notices are preserved. You may not distribute, display or make derivative work of these publications, or
any portion thereof, without the express consent of IBM.
Commercial use
You may reproduce, distribute and display these publications solely within your enterprise provided
that all proprietary notices are preserved. You may not make derivative works of these publications, or
reproduce, distribute or display these publications or any portion thereof outside your enterprise, without
the express consent of IBM.
Rights
Except as expressly granted in this permission, no other permissions, licenses or rights are granted, either
express or implied, to the publications or any information, data, software or other intellectual property
contained therein.
Documentation notices 77
78 Developer for z/OS: Reference
Security considerations
This topic highlights some of the security limitations that you might encounter with this application. To
help ensure the security of your installation, customize your security settings and set up user access
controls.
Multi-Factor Authentication
Developer for z/OS relies on IBM Explorer for z/OS for multi-factor authentication (MFA) support. For
information about configuring MFA in IBM Explorer for z/OS, see Using Multi-Factor Authentication.
Security considerations 81
82 Developer for z/OS: Reference
IBM®