Skip to main content
1-Visitor
June 14, 2017
Solved

How to add a custom action to Windchill PSB where command is not a JSP, but a custom class?

  • June 14, 2017
  • 3 replies
  • 9961 views

Hi All

Trying to add a custom action to right-click menu in Part Structure Builder (PSB)

Uncommented:

<action name="customActionGWT" type="psb"/>

in psb-actionmodels.xml

and

<action name="customActionGWT" ajax="component">

            <command class="com.ptc.cat.ui.client.action.LaunchURLAction" method="execute" url="/ptc1/psb/customAction" windowType="popup"/>

                        <supportedTypes>

                                <type value="wt.part.WTPart"/>

                                <type value="wt.part.WTPartUsageLink"/>

                                <type value="wt.part.PartUsesOccurrence"/>

                                <type value="wt.part.RTPartPathOccurrence"/>

                        </supportedTypes>     

        </action>

in psb-actions.xml

The menu item appears.

When i change command:

<command class="com.ptc.cat.ui.client.action.LaunchURLAction" method="execute" url="/ptc1/psb/customAction" windowType="popup"/>

to :

<command class="com.myCompany.MySimpleAction"/>

menu item disappears.

MySimpleAction class looks like this:

package com.myCompany;

import com.google.gwt.user.client.rpc.AsyncCallback;

import com.ptc.cat.ops.client.OperationResult;

import com.ptc.cat.ui.client.action.AbstractAction;

import com.ptc.cat.ui.client.action.ActionDefinition;

public class MySimpleAction extends AbstractAction {

    public MySimpleAction(ActionDefinition ad) {

        super(ad);

    }

    @Override

    public void run(AsyncCallback<OperationResult> ac) {

        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.

    }

   

}

Tried adding my class through adding JAR to WC/lib

and .java to WC/src and building

It is Windchill 10.2 M030

no .xconfs and .properties added or modified

jcaDebug somehow doesn't work for PSB tree menus

Does anybody know how to add a custom action class properly?

Thanks in advance!

Best answer by HelesicPetr

Hello, I found solution. 

I needed a button in the PBS with Wizard and some options. 

I search for a long time to solve it because I can not activate own Processor to achieve the results.

 

It is little bit tricky because Documentation is not clear for GWT actions. 

 

First create actionModel with JSP page. Class in the custom-Actions.xml must be LaunchURLAction or LaunchCustomURLAction (because the button in the PSB menu appears only with this two classes)

example:

Wizard

<action name="myOwnMenuActionGWT" ajax="component">
<label>Download data zip</label>
<icon>package_zipped.gif</icon>
<command class="com.ptc.cat.ui.client.action.LaunchCustomURLAction"
method="execute"
url="netmarkets/jsp/cz/aveng/DownloadZIP/DownloadZIPWizard.jsp"
windowType="popup" />
</action>

 

Step1

<action name="DownloadZIPWizardStep1" preloadWizardPage="true" resourceBundle="com.ptc.core.ui.actionsRB">
<command windowType="wizard_step"
url="netmarkets/jsp/cz/aveng/DownloadZIP/DownloadZIPWizardStep1.jsp"/>
</action>

 

the Wizard JSP page(DownloadZIPWizard) should contains wizard definition 

example

<jca:wizard formProcessorController="cz.aveng.PublcZip.ZipColectProcessorController"
title="Data Collector"
buttonList="DefaultWizardButtonsNoApply">
<jca:wizardStep action="DownloadZIPWizardStep1" type="psb" label="Data Collector"/>
</jca:wizard>

and here is the trick 

here you need to define own ProcessController class in 

formProcessorController=

example of formProcessorController

package cz.aveng.PublcZip;

import com.ptc.core.components.beans.ObjectBean;
import com.ptc.core.components.forms.DefaultFormProcessorController;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ZipColectProcessorController extends DefaultFormProcessorController
{
@Override
protected List<ObjectBean> getRootObjectBeans()
{
List objectBeanList = super.getRootObjectBeans();
Iterator next = objectBeanList.iterator();
List<String> delegate = new ArrayList<>();
//Processor delegagte (very important Delegate if is not set, then Processor is pushed to delegate which is not possible error can not catst Processor to ProcessorDelegate)
delegate.add("com.ptc.core.components.forms.DefaultObjectFormProcessorDelegate")
;
while (next.hasNext())
{
ObjectBean objectBean = (ObjectBean) next.next();
// Processor for managing action after OK button
objectBean.setProcessorClassName("cz.aveng.PublcZip.ZipColectProcessor");
// here is own Processor
objectBean.setDelegateClassNames(delegate); // add DefaultObjectFormProcessorDelegate
}
super.setRootObjectBeans(objectBeanList);
return super.getRootObjectBeans();
}
}

the processor ZipColectProcessor contains the code with the action and there you can do what you want :D.

preProcess, doOperation, postProcess.....

 

Hope it could be helpful.

 

Best Regards

PetrH

3 replies

1-Visitor
March 11, 2019

Hello,

 

I am also facing same issue. Does anyone know how to solve this.

Custom action went disable when use custom class in <command class=""/>

1-Visitor
June 4, 2019

Hello,

 

Same issue for me, with a JSP or with an existing action which calls a java class there is no problem and the menu item is visible.

When I use my own java class it went wrong.

 

@Roshni or @ybulankou did one of you found a solution?

1-Visitor
December 6, 2019

Add me to the stack of devs unable to add a custom action to the PSB context menu that uses a class other than com.ptc.cat.ui.client.action.LaunchURLAction.  I'm leveraging of the 25 custom report actions to fire my popup because we have more than one action to add.

<objecttype name="psb" resourceBundle="com.company.customResourceRB">
	<action name="psbCustomReportGWT19" ajax="component">
		<command class="com.ptc.cat.ui.client.action.LaunchURLAction" method="execute" url="/ptc1/part/awesomeCustomTool" windowType="popup" />
		<!-- filters -->
	</action>
</objecttype>

 

As soon as I change the command class to my custom class, the action disappears.  The command class extends com.ptc.cat.ui.client.action.LaunchURLAction.  Refactoring my custom class to the same package as LaunchURLAction has no effect.

 

If feels like the PSB leverages a white list of acceptable action definitions.  If a new action is introduced that does not match the object type + name + command class in the list, the action is rejected.

 

Anyone?

3-Newcomer
February 18, 2020

https://www.ptc.com/en/support/article/CS320109?&language=en&posno=1&q=SPR%209810813&source=search

 

There is an SPR  9810813 for this issue applies to Windchill PDMLink 11.0 to 11.2

HelesicPetr
22-Sapphire II
22-Sapphire II
May 19, 2021

Hello, I found solution. 

I needed a button in the PBS with Wizard and some options. 

I search for a long time to solve it because I can not activate own Processor to achieve the results.

 

It is little bit tricky because Documentation is not clear for GWT actions. 

 

First create actionModel with JSP page. Class in the custom-Actions.xml must be LaunchURLAction or LaunchCustomURLAction (because the button in the PSB menu appears only with this two classes)

example:

Wizard

<action name="myOwnMenuActionGWT" ajax="component">
<label>Download data zip</label>
<icon>package_zipped.gif</icon>
<command class="com.ptc.cat.ui.client.action.LaunchCustomURLAction"
method="execute"
url="netmarkets/jsp/cz/aveng/DownloadZIP/DownloadZIPWizard.jsp"
windowType="popup" />
</action>

 

Step1

<action name="DownloadZIPWizardStep1" preloadWizardPage="true" resourceBundle="com.ptc.core.ui.actionsRB">
<command windowType="wizard_step"
url="netmarkets/jsp/cz/aveng/DownloadZIP/DownloadZIPWizardStep1.jsp"/>
</action>

 

the Wizard JSP page(DownloadZIPWizard) should contains wizard definition 

example

<jca:wizard formProcessorController="cz.aveng.PublcZip.ZipColectProcessorController"
title="Data Collector"
buttonList="DefaultWizardButtonsNoApply">
<jca:wizardStep action="DownloadZIPWizardStep1" type="psb" label="Data Collector"/>
</jca:wizard>

and here is the trick 

here you need to define own ProcessController class in 

formProcessorController=

example of formProcessorController

package cz.aveng.PublcZip;

import com.ptc.core.components.beans.ObjectBean;
import com.ptc.core.components.forms.DefaultFormProcessorController;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ZipColectProcessorController extends DefaultFormProcessorController
{
@Override
protected List<ObjectBean> getRootObjectBeans()
{
List objectBeanList = super.getRootObjectBeans();
Iterator next = objectBeanList.iterator();
List<String> delegate = new ArrayList<>();
//Processor delegagte (very important Delegate if is not set, then Processor is pushed to delegate which is not possible error can not catst Processor to ProcessorDelegate)
delegate.add("com.ptc.core.components.forms.DefaultObjectFormProcessorDelegate")
;
while (next.hasNext())
{
ObjectBean objectBean = (ObjectBean) next.next();
// Processor for managing action after OK button
objectBean.setProcessorClassName("cz.aveng.PublcZip.ZipColectProcessor");
// here is own Processor
objectBean.setDelegateClassNames(delegate); // add DefaultObjectFormProcessorDelegate
}
super.setRootObjectBeans(objectBeanList);
return super.getRootObjectBeans();
}
}

the processor ZipColectProcessor contains the code with the action and there you can do what you want :D.

preProcess, doOperation, postProcess.....

 

Hope it could be helpful.

 

Best Regards

PetrH

1-Visitor
November 9, 2023

it works! Thank you !