Event framework Java PX code example debug,deploy and pop up warning message
Hi All,
I have written event framework java px and I am new in it. I have used “change status from workflow” event and write following code.Now i have to test it before converted into jar file, So is it possible to test it locally?
public EventActionResult doAction(IAgileSession session, INode actionNode,
IEventInfo request) {
//IObjectEventInfo objectEventInfo = (IObjectEventInfo) request;
IWFChangeStatusEventInfo objectEventInfo = (IWFChangeStatusEventInfo) request;
IDataObject affectedObject = null;
String changeNo,ActionString = null;
try {
affectedObject = objectEventInfo.getDataObject();
} catch (APIException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//def changeno1 = ChangeConstants.ATT_COVER_PAGE_ORIGINATOR;// ChangeConstants.ATT_COVER_PAGE_NUMBER;
try {
changeNo = affectedObject.getName();
IAdmin admin=session.getAdminInstance();
String ChangeNo = affectedObject.getValue(ChangeConstants.ATT_COVER_PAGE_NUMBER).toString();
IChange ChangeObj = (IChange)session.getObject(3 ,ChangeNo);
ITable affectedItemsTable =ChangeObj.getTable(ChangeConstants.TABLE_AFFECTEDITEMS);
Iterator ite = affectedItemsTable.iterator();
while (ite.hasNext())
{
IRow row = (IRow) ite.next();
String item = row.getValue(ChangeConstants.ATT_AFFECTED_ITEMS_ITEM_NUMBER).toString();
IItem itemObj = (IItem)session.getObject(ItemConstants.CLASS_PART, item);
String ITEMLIFE = itemObj.getValue(ItemConstants.ATT_TITLE_BLOCK_LIFECYCLE_PHASE).toString();
String ItemPartType = itemObj.getValue(ItemConstants.ATT_TITLE_BLOCK_PART_TYPE).toString();
String createUser = “Priyanka Mehta”;
// obj.logMonitor(“item = “+ item +” || ITEMLIFE “+ITEMLIFE+”|| ItemPartType “+ItemPartType);
itemObj.setRevision(ChangeNo);
ITable tab = itemObj.getTable(ItemConstants.TABLE_RELATIONSHIPS);
// obj.logMonitor( ” || item “+item+” || “+ITEMLIFE);
ActionString = ActionString +” “+item+” “;
for (Iterator iterator = tab.iterator(); iterator.hasNext();)
{
IRow manuRow = (IRow) iterator.next();
String RitemName = manuRow.getValue(ItemConstants.ATT_RELATIONSHIPS_NAME).toString();
String val2 = manuRow.getValue(ItemConstants.ATT_RELATIONSHIPS_CURRENT_STATUS).toString();
// obj.logMonitor( ” || RitemName “+RitemName+” || “+val2);
if(RitemName.contains(“TNM”))
{
ActionString = ActionString +” rtm “+RitemName+” “;
if(ITEMLIFE.equals(“Production”) && (!val2.equals(“Production”) ))
{
ActionString = ActionString +” rtm lc “+ITEMLIFE+” “;
session.popWarningState();
// obj.logMonitor( ” production condtion mismatch”);
String sendToList = affectedObject.getValue(ChangeConstants.ATT_COVER_PAGE_ORIGINATOR).toString();
// affectedObject.sendNotification(“TNMDummyNotifiction”, false, sendToList, “Comments: send from Script handler”);
session.enableWarning(ExceptionConstants.APDM_ADDAFFECTED_ITEM_WARNING);
JOptionPane.showMessageDialog(null, “TNM is not in Production LC state”, “Warning”, JOptionPane.YES_NO_OPTION);
// throw new AgileDSLException(“Item is in production lifecycle and TNM part is not in”);
}
else
{
// obj.logMonitor( ” not enter”);
ActionString = ActionString +” rtm lc not production “+ITEMLIFE+” “;
JOptionPane.showMessageDialog(null, “TNM is not in Production LC state”, “Warning”, JOptionPane.YES_NO_OPTION);
}
}
else
{
ActionString = ActionString +” not tnm “;
}
}
}
}
catch (Exception e) {
e.printStackTrace();
// throw new AgileDSLException(e);
}
ActionResult actionResult = new ActionResult(ActionResult.STRING,
ActionString);
return new EventActionResult(request, actionResult);
}
Now i have following doubts:-
1. I am unable to found how to pass value of IEventInfo.
I have create void main fx and in it try to used this object like
try {
factory = AgileSessionFactory.getInstance(“http://secureagiletest.udp.sml.com/Agile/”);
IAgileSession session = factory.createSession(param1);
IDataObject obj1 = (IDataObject)session.getObject(ChangeConstants.CLASS_CHANGE_ORDERS_CLASS , “DCO42921”);
//sm.tnmaction.EventControllerController controller = new sm.tnmaction.EventController();
EventController controller = new EventController();
EventActionResult result = controller.doAction(session, null, (IEventInfo) obj1);
but unable to cast obj1 into Ieventinfo type…
2. I want to show a warning message infront of user so i have written on some condition
JOptionPane.showMessageDialog(null, “TNM is not in Production LC state”, “Warning”, JOptionPane.YES_NO_OPTION);
It will work or not?
3.how and where to add jar files so that my class name will appears on LOV in java client event management–>event handlers–>event action
Hi Priyanka,
You can take basically take most of what you have and test it as a Groovy PX just fine – just the main method and return method will be different on a groovy PX. I’ve done that to test chunks of script at a time and basically anything written in Java will convert over to Groovy just fine. You can try exporting as a jar and testing in your test environment as well. I’ve never got a JOptionPane to work in Groovy script though I’ve never tried on a java PX (can anyone else confirm?).
Your script looks ok to me. I noticed that you’re getting the IChange/Dataobject twice in your script. Replace line 5 (IDataObject affectedObject = null;) to (IChange affectedObject = null) and you won’t need lines 17 and 18. Your line <String ITEMLIFE = itemObj.getValue(…> might want to be switched to the row.getValue(ChangeConstants.ATT_AFFECTED_ITEMS_LIFECYCLE_PHASE) just to be on the safe side. Also try IItem itemObj = row.getReferent() as an easy way to get the IItem dataobject on a Change Order affected items table.
I can’t really say why you’re not able to get the IEventInfo object info but that’s because I’m way more familiar with how Groovy scripts handle this. I am confident that your casting issue is because you need to change it to an IChange object instead (IChange obj1 = (IChange) session….).
Check out Oracle Doc ID 760058.1, Doc ID 885594.1, and Doc ID 742488.1 for more help and step by step guides for deploying Java PXs.
move all your logic code into a separate java class. The class containing doAction() should do minimum possible.
For example, the logic class would execute something given the “IDataObjet” and other parameters
To test from your desktop:
write a “launcher” class that connects to A9 and and instantiates the logic class with the necessary parameters.
If this is too difficult, use the jar file as is, but add a lot of print statements in your code. If you are capturing stdout to a file when you launch A9, then you can “see” the print statements.
A better approach is to create your own logger ( i.e insert new “logger” into existing log4j framework for Agile PLM ), but that may take some time to make it work in the PX environment.