cancel
Showing results for 
Search instead for 
Did you mean: 
cancel
Showing results for 
Search instead for 
Did you mean: 

how to set the lifecycle state of wtpart using API

SOLVED
Regular Member

how to set the lifecycle state of wtpart using API

I am trying load a wtpart into windchill through API's and i would like to know how to set the lifecycle state of the part to a specific state.

1 ACCEPTED SOLUTION

Accepted Solutions

Re: how to set the lifecycle state of wtpart using API

Hey @RandyJones ,your solution is right , but we have to first store the new part which we created and the change its life cycle state.

 

 

View solution in original post

9 REPLIES 9

Re: how to set the lifecycle state of wtpart using API


@aashishramchand wrote:

I am trying load a wtpart into windchill through API's and i would like to know how to set the lifecycle state of the part to a specific state.


The LifeCycleHelper class is used for this. eg

String myState = "PROTOTYPE";

WTPart myPart = <already defined>;

LifeCycleHelper.service.setLifeCycleState((LifeCycleManaged) myPart, State.toState(myState));

Re: how to set the lifecycle state of wtpart using API

I tried that and getting this error.

 

 

 

Exception in thread "main" (wt.fc.fcResource/0) wt.util.WTException: The operation: "setLifeCycleState" failed.
Nested exception is: wt.util.WTRemoteException: Unable to invoke remote method; nested exception is:
java.rmi.ServerRuntimeException: Server exception; nested exception is:
java.lang.NullPointerException
at wt.method.RemoteMethodServer.invoke(RemoteMethodServer.java:788)
at wt.services.ServiceFactory$ClientInvocationHandler.invoke(ServiceFactory.java:349)
at com.sun.proxy.$Proxy13.setLifeCycleState(Unknown Source)
at ext.ttl.LoadPart_test.injectWTPart(LoadPart_test.java:118)
at ext.ttl.LoadPart_test.main(LoadPart_test.java:77)
Caused by: java.lang.NullPointerException
... 5 more

 

 

Re: how to set the lifecycle state of wtpart using API


@aashishramchand wrote:

I tried that and getting this error.

 

 

 

Exception in thread "main" (wt.fc.fcResource/0) wt.util.WTException: The operation: "setLifeCycleState" failed.
Nested exception is: wt.util.WTRemoteException: Unable to invoke remote method; nested exception is:
java.rmi.ServerRuntimeException: Server exception; nested exception is:
java.lang.NullPointerException
at wt.method.RemoteMethodServer.invoke(RemoteMethodServer.java:788)
at wt.services.ServiceFactory$ClientInvocationHandler.invoke(ServiceFactory.java:349)
at com.sun.proxy.$Proxy13.setLifeCycleState(Unknown Source)
at ext.ttl.LoadPart_test.injectWTPart(LoadPart_test.java:118)
at ext.ttl.LoadPart_test.main(LoadPart_test.java:77)
Caused by: java.lang.NullPointerException
... 5 more

 

 


This is an issue with your setup. You apparently are not running this on Windchill itself eg: jsp page, workflow, etc.

See this article for running code from a java client:

https://www.ptc.com/en/support/article?n=CS79047

Re: how to set the lifecycle state of wtpart using API

I executed the code from the windchill shell and im getting the same error as before "Illegal arguments Exception".

Re: how to set the lifecycle state of wtpart using API

Hi @aashishramchand,

 

Can you try following and let me know if that helps!

 

package ext;

public class TestLifeCycleState implements wt.method.RemoteAccess {

	public static void main(String[] args) throws java.rmi.RemoteException, java.lang.reflect.InvocationTargetException {
		wt.method.RemoteMethodServer rms = wt.method.RemoteMethodServer.getDefault();
		rms.invoke("setState", "ext.TestLifeCycleState", null, null, null);

	}
	
	public static void setState ()
	{
		//Your code
		//String myState = "PROTOTYPE";
		//WTPart myPart = <already defined>;
		//LifeCycleHelper.service.setLifeCycleState((LifeCycleManaged) myPart, State.toState(myState));
	}

}

Regards,

Bhushan

Highlighted

Re: how to set the lifecycle state of wtpart using API

Still getting the error.

Re: how to set the lifecycle state of wtpart using API

@aashishramchand Can you share MS logs and also the code in Text format. Also, can you elaborate on your requirement are you trying to create a new object with non-initial state or just trying to set state for an existing already persisted object?

 

Regards,

Bhushan

Re: how to set the lifecycle state of wtpart using API

@BhushanNehe yes, I am trying to create a new object with non-initial lifecycle state

 

 

public class Tester implements RemoteAccess {

	public static void main(String[] args) {

		RemoteMethodServer rms = RemoteMethodServer.getDefault();
		rms.setUserName("username");
		rms.setPassword("password");

		try {
			rms.invoke("setState", Tester.class.getName(), null, null, null);
		} catch (RemoteException | InvocationTargetException e) {
			e.printStackTrace();
		}
	}

	public static void setState() throws WTException, WTPropertyVetoException {
		String name = "TestPart1"; // Name
		String number = "00000055"; // Number
		String lifeCycleName = "Basic"; // Lifecycle name
		String container_path = "container path";
		String folder_path = "/Default/Design"; // Folder path
		String PPAPRevision = "20";

		WTPart newPart = WTPart.newWTPart();

		newPart.setName(name);
		newPart.setNumber(number);

		WTContainerRef containerRef = WTContainerHelper.service.getByPath(container_path);
		newPart.setContainerReference(containerRef);

		Folder folder = FolderHelper.service.getFolder(folder_path, containerRef);
		FolderHelper.assignLocation(newPart, folder);

		LifeCycleTemplate lct = LifeCycleHelper.service.getLifeCycleTemplate(lifeCycleName,
				newPart.getContainerReference());

		newPart = (WTPart) LifeCycleHelper.setLifeCycle(newPart, lct);

		String myState = "RELEASED";
		LifeCycleHelper.service.setLifeCycleState((wt.lifecycle.LifeCycleManaged) newPart, State.toState(myState));

		newPart = (WTPart) wt.fc.PersistenceHelper.manager.store(newPart);

	}

}

here are the MS logs:

 

//--------------------------------------------------------------------------------------

2018-07-23 19:02:49,205 ERROR [RMI TCP Connection(11)-172.28.77.125] wt.method.MethodContextMonitor.contexts.rmi wcadmin - 2018-07-23 13:32:48.891 +0000, 1br5x19;jjyb9vd5;40236;rc07vq;1, -, -, -, wcadmin, 172.28.77.125, ext.ttl.Tester, setState, , 0, 27, 0.017394686, 26, 0.128692733, 0.1248008, 0.31294933
java.lang.IllegalArgumentException: null cache key
 at wt.pom.RefreshCache.find(RefreshCache.java:283)
 at wt.pom.RefreshCache.containskey(RefreshCache.java:119)
 at wt.pom.TransactionManager.containOidInCache(TransactionManager.java:907)
 at wt.pom.PersistentObjectManager.lock(PersistentObjectManager.java:919)
 at wt.fc.StandardPersistenceManager.lock(StandardPersistenceManager.java:1335)
 at wt.lifecycle.StandardLifeCycleService.doSetState(StandardLifeCycleService.java:10350)
 at wt.lifecycle.StandardLifeCycleService.doSetState(StandardLifeCycleService.java:7683)
 at wt.lifecycle.StandardLifeCycleService.setState(StandardLifeCycleService.java:7490)
 at wt.lifecycle.StandardLifeCycleService.setLifeCycleState(StandardLifeCycleService.java:2734)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:606)
 at wt.services.ServiceFactory$ServerInvocationHandler.invoke(ServiceFactory.java:399)
 at com.sun.proxy.$Proxy143.setLifeCycleState(Unknown Source)
 at ext.ttl.Tester.setState(Tester.java:79)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:606)
 at wt.method.MethodResultWriter.writeExternal(MethodResultWriter.java:152)
 at wt.method.MethodResult.writeExternal(MethodResult.java:228)
 at java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1455)
 at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1429)
 at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
 at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
 at sun.rmi.server.UnicastRef.marshalValue(UnicastRef.java:293)
 at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:332)
 at sun.rmi.transport.Transport$1.run(Transport.java:177)
 at sun.rmi.transport.Transport$1.run(Transport.java:174)
 at java.security.AccessController.doPrivileged(Native Method)
 at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
 at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:556)
 at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:811)
 at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:670)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
 at java.lang.Thread.run(Thread.java:744)

 

 

 

//------------------------------------------------------------------------------------------------------------------------------------------

here is the error im getting when i run the code on windchill shell:

wt.util.WTRemoteException: Unable to invoke remote method; nested exception is:
        java.rmi.ServerRuntimeException: Server exception; nested exception is:
        java.lang.IllegalArgumentException: null cache key
        at wt.method.RemoteMethodServer.invoke(RemoteMethodServer.java:788)
        at ext.ttl.Tester.main(Tester.java:48)
Caused by: java.lang.IllegalArgumentException: null cache key
        ... 2 more

 

 

Re: how to set the lifecycle state of wtpart using API

Hey @RandyJones ,your solution is right , but we have to first store the new part which we created and the change its life cycle state.

 

 

View solution in original post