Format Definition Example ProgramTo be used in a format definition, a program object definition must include these characteristics:
To launch Microsoft Word 97 or 2000 on Windows and open a document file for viewing and editing, the following program code might be used in the external program named MSWORD:
The To open multiple PDF files you can create an external Program with the following code:
The For a simple generic format that uses file associations, do not define any programs for the edit, view and print clauses of the format. For a more complex and flexible generic Windows format that will open any file for view, edit, or print based on its file association, include a condition exception for Word. For example:
On a UNIX system, you might use the following for a text format:
The quotes allow the file name to contain spaces. Action Program ExampleYou could define a program to be used as an action on a State as follows: ** ** Note that the macros (EVENT,OBJECTID) required by the program must be explicitly ** specified when the program is configured on the policy. The macros are passed in ** the 'args' array when the trigger is run. ** ** This trigger will increment the 'docInt' attribute on an object when it is promoted ** from state Created to state Working, and will decrement the attribute when an ** object is demoted from state Working to state Created. ** ** To configure this as a promote and demote action on a policy: ** mod policy docPolicy state Created add trigger promote action ** docPromoteAction input "-method mxMain ${EVENT} ${OBJECTID}"; ** mod policy docPolicy state Working add trigger demote action ** docPromoteAction input '-method mxMain ${EVENT} ${OBJECTID}" ; /** docPromoteAction: example java trigger program * /import matrix.db.*; import matrix.util.*; public class ${CLASSNAME} { public ${CLASSNAME}(Context ctx,String[] args) { } public int mxMain(Context ctx,String[] args) { try { // Declarations String event = new String(); String objId = new String(); String attrName = new String("docInt"); MQLCommand mql = new MQLCommand(); // Get and check arguments arguments if (args.length > 0) event = args[0]; if (args.length > 1) objId = args[1]; // Generate notices for bad arguments if (event == null || event.equals("")) { mql.executeCommand(ctx, "notice 'No event for docPromoteAction'"); } else if (objId == null || objId.equals("")) { mql.executeCommand(ctx, "notice 'No objId for docPromoteAction'"); } // Make sure it is a promote/demote event if (!event.equalsIgnoreCase("promote") && !event.equalsIgnoreCase("demote')) return 0; // Construct and open the businessobject BusinessObject obj = new BusinessObject(objId); obj.open(ctx); // Get the current attribute value Attribute attrInt = obj.getAttributeValues(ctx, attrName); int val = Integer.parseInt(attrInt.getValue()); if (event.equalsIgnoreCase("promote")) val++; else val--; // Update the attribute, and the business object attrInt.setValue(String.valueOf(val)); AttributeList attrList = new AttributeList(); attrList.addElement(attrInt); obj.setAttributes(ctx, attrList); obj.close(ctx); } catch (Exception ex) { ex.printStackTrace(); } return 0; } } It is recommended that actions and checks be configured as promote triggers, and not as lifecycle checks and actions. Check Program Example/* ** ** docLockCheck: example java trigger program ** ** Note that the macros (EVENT,OBJECTID) required by the program must be explicitly ** specified when the program is configured on the policy. The macros are passed in ** the 'args' array when the trigger is run. ** ** This trigger reads the docString attribute on the object and compare it to the ** current user's name. It will block the event (return 1) if they do not match. ** ** To configure this as a promote and demote action on a policy: ** mod type docType add trigger lock check ** docLockCheck input "-method mxMain ${EVENT} ${OBJECTID}"; ** ** */ import matrix.db.*; import matrix.util.*; public class ${CLASSNAME} { public ${CLASSNAME}(Context ctx,String[] args) { } public int mxMain(Context ctx,String[] args) throws Exception { // Initialize return value to "ok" int retval = 0; try { // Declarations String event = new String(); String objId = new String(); String attrName = new String("docString"); MQLCommand mql = new MQLCommand(); // Get and check arguments if (args.length > 0) event = args[0]; if (args.length > 1) objId = args[1]; // Generate notices for bad arguments if (event == null || event.equals("")) { mql.executeCommand(ctx, "notice 'No event for docLockCheck'"); } else if (objId == null || objId.equals("")) { mql.executeCommand(ctx, "notice 'No objId for docLockCheck'"); } // Make sure it is a lock event if (!event.equalsIgnoreCase("lock")) return 0; // Construct and open the businessobject BusinessObject obj = new BusinessObject(objId); obj.open(ctx); // Get the current attribute value and compare to current user Attribute attrString = obj.getAttributeValues(ctx, attrName); String attrUser = attrString.getValue(); String currentUser = ctx.getUser(); // If no match, block event if (!attrUser.equals(currentUser)) { retval = 1; String msg = "You are not user " + attrUser; System.out.println(msg); mql.executeCommand(ctx, "error '" + msg + "'"); } // Close the object obj.close(ctx); } catch (Exception ex) { ex.printStackTrace(); retval = 1; } return retval; } } It is recommended that actions and checks be configured as promote triggers, and not as lifecycle checks and actions. Example of Creating a Program for Execution As Needed/* ** ** docTableProgram: example java program for use in table ** ** This program returns the number of objects of type "docType" connected to the ** current object by the relationship "docRel" ** ** Note that the macro OBJECTID must be explicitly specified when the program is ** configured in a table definition so it can be loaded into the 'args' array ** program is executed. ** ** To configure this as a table column: ** add table docTable column label Rels ** businessobject program[docTableProgram -method mxMain ${OBJECTID}] ** ** */ import matrix.db.*; import matrix.util.*; public class ${CLASSNAME} { public ${CLASSNAME}(Context ctx,String[] args) { } public String mxMain(Context ctx,String[] args) throws Exception { // Initialize number of connected objects int retval = 0; try { // Declarations String objId = new String(); MQLCommand mql = new MQLCommand(); // Get and check arguments if (args.length > 0) objId = args[0]; if (objId == null || objId.equals("")) { mql.executeCommand(ctx, "notice 'No objId for docTableProgram'"); } // Construct and open the businessobject BusinessObject obj = new BusinessObject(objId); obj.open(ctx); // Get the connected objects String relType = "docRel"; String objType = "docType"; StringList objSelect = new StringList(); StringList relSelect = new StringList(); ExpansionWithSelect exp = obj.expandSelect(ctx, relType, // relationship pattern objType, // type pattern objSelect, // selects on objectes relSelect, // selects on rels true, // getTo direction true, // getFrom direction (short)1); // levels // And return the count of related objects RelationshipWithSelectList relList = exp.getRelationships(); retval = relList.size(); // Close the object obj.close(ctx); } catch (Exception ex) { ex.printStackTrace(); } return String.valueOf(retval); } } |