Hi.
I´m using xCP 2.0 and I know that it doesn´t have processo versioning. But I have to change a process that have several instances in production.
How can I make this change without affecting the instances created?
If you are asking about stateful process, then checkout it using BPM and checkin to new version, after that installation will override new version.
Sorry about that.
I´m asking about statefull process. But when you said "using BPM" you are talking about "Process Builder" ?!?
you are talking about "Process Builder" ?
Yes.
Hello Panfilov.
I´ve tried with Process Builder 6.7 SP2, but no process were listed in the process folder. It seems that Process Builder is using some filter.
So I tried with Composer 7.1 but an error occurred:
I´m getting to a dead end. If you can help I would be grateful.
I would like to say that it was a challenge
BPM 6.7SP2 does not want to see process templates with non-empty a_application_type attribute, but if set a_application_type to empty value BPM still can't open process template. I also tried to version process template using composer 6.7SP2, it's able to import template from repository, but not able to install it. So I decided to code own versioning tool I'm not sure it works properly with xCP process templates - I have only checked it against BPM processes. My classpath: /u01/documentum/cs/shared/dfc/log4j.jar:/u01/documentum/cs/shared/dfc/dfcbase.jar:/u01/documentum/cs/shared/dfc/dfc.jar:/u01/documentum/cs/product/7.0/bin:/u01/documentum/cs/shared/config:/u01/documentum/cs/product/7.0/dctm-server.jar:/u01/documentum/cs/shared/dctm.jar::/u01/documentum/cs/shared/jboss5.1.0/server/DctmServer_MethodServer/deploy/bpm.ear/lib/bpm-model-impl.jar:/u01/documentum/cs/shared/jboss5.1.0/server/DctmServer_MethodServer/deploy/bpm.ear/lib/org.eclipse.emf.common_2.7.0.v20120127-1122.jar:/u01/documentum/cs/product/7.0/install/composer/ComposerHeadless/plugins/com.emc.ide.external.dfc_1.0.0/lib/xercesImpl.jar
import java.lang.reflect.Method;import java.util.ArrayList;import java.util.List;import com.documentum.bpm.IDfActivityEx;import com.documentum.bpm.IDfProcessEx;import com.documentum.bpm.expression.ExpressionContainer;import com.documentum.bpm.expression.utils.ExpressionUtils;import com.documentum.fc.client.DfClient;import com.documentum.fc.client.DfTypedObject;import com.documentum.fc.client.IDfActivity;import com.documentum.fc.client.IDfProcess;import com.documentum.fc.client.IDfSession;import com.documentum.fc.client.IDfSessionManager;import com.documentum.fc.client.impl.IPersistentObject;import com.documentum.fc.common.DfException;import com.documentum.fc.common.DfId;import com.documentum.fc.common.DfLoginInfo;import com.documentum.fc.common.IDfId;import com.documentum.fc.common.IDfList;import com.documentum.fc.common.IDfLoginInfo;/*** @author Andrey B. Panfilov <andrew@panfilov.tel>*/public class CreateProcessVersion { public static final String PREDICATE_ID = "r_predicate_id"; public static void main(String argv[]) throws Exception { String docbase = argv[0]; String username = argv[1]; String password = argv[2]; String processId = argv[3]; IDfSessionManager sessionManager = new DfClient().newSessionManager(); sessionManager.beginTransaction(); IDfLoginInfo loginInfo = new DfLoginInfo(username, password); sessionManager.setIdentity(docbase, loginInfo); IDfSession session = sessionManager.getSession(docbase); IDfProcessEx process = (IDfProcessEx) session.getObject(new DfId( processId)); process.checkout(); System.out.println("Coping process: " + process.getObjectId()); for (int i = 0, n = process.getActivityCount(); i < n; i++) { IDfId activityId = process.getActivityDefId(i); System.out .print("Copying activity: " + activityId.getId() + "... "); IDfActivityEx activity = (IDfActivityEx) session .getObject(activityId); IDfId newAcivityId = activity.saveAsNew(false); activity.revert(); IDfActivityEx newActivity = (IDfActivityEx) session .getObject(newAcivityId); copyRouteCases(activity, newActivity, process); copyPerformerConditions(activity, newActivity); newActivity.save(); newActivity.validate(); newActivity.install(); System.out.println("new activity: " + newActivity.getObjectId()); Method setRepeatingIdInternal = DfTypedObject.class .getDeclaredMethod("setRepeatingIdInternal", String.class, int.class, IDfId.class); setRepeatingIdInternal.setAccessible(true); setRepeatingIdInternal.invoke(((IPersistentObject) process) .getProxyHandler().____getImp____(), "r_act_def_id", i, newAcivityId); } IDfId newProcessId = process.checkin(false, null); process = (IDfProcessEx) session.getObject(newProcessId); System.out.println("New process: " + process.getObjectId()); sessionManager.commitTransaction(); try { process.fetch(null); process.validateEx(true); process.install(true, true); } catch (Exception ex) { cleanup(process); return; } System.out.print("New process is installed, revert changes? (Y/N): "); byte[] buffer = new byte[1]; if (System.in.read(buffer) > -1) { if ("Y".equalsIgnoreCase(new String(buffer))) { System.out.println("Destroying process " + process.getObjectId() + " and all corresponding activities..."); cleanup(process); } } } public static void cleanup(IDfProcess process) throws DfException { IDfSession session = process.getSession(); process.revert(); List<IDfId> activities = new ArrayList<IDfId>(); for (int i = 0, n = process.getActivityCount(); i < n; i++) { IDfId activityId = process.getActivityDefId(i); activities.add(activityId); IDfActivity activity = (IDfActivity) session.getObject(activityId); activity.revert(); uninstall(activity); } uninstall(process); process.revert(); System.out.println("Destroying process " + process.getObjectId().getId()); process.destroy(); for (IDfId activityId : activities) { IDfActivity activity = (IDfActivity) session.getObject(activityId); activity.revert(); System.out.println("Destroying activity " + process.getObjectId().getId()); activity.destroy(); } } public static void uninstall(IDfActivity activity) throws DfException { try { System.out.println("Uninstalling activity " + activity.getObjectId().getId()); activity.uninstall(); } catch (DfException ingore) { // } try { System.out.println("Invalidating activity " + activity.getObjectId().getId()); activity.invalidate(); } catch (DfException ingore) { // } } public static void uninstall(IDfProcess process) throws DfException { try { System.out.println("Uninstalling process " + process.getObjectId().getId()); process.uninstall(); } catch (DfException ingore) { // } try { System.out.println("Invalidating process " + process.getObjectId().getId()); process.invalidate(); } catch (DfException ingore) { // } } public static void copyPerformerConditions(IDfActivityEx src, IDfActivityEx dst) throws Exception { IDfList performerConditions = dst.getPerformerConditionNames(); for (int n = performerConditions.getCount(), i = n - 1; i >= 0; i--) { dst.removePerformerCondition(performerConditions.getString(i)); } performerConditions = src.getPerformerConditionNames(); for (int i = 0, n = performerConditions.getCount(); i < n; i++) { String performerConditionName = performerConditions.getString(i); IDfList performers = src.getPerformers(performerConditionName); String performerCondition = src .getPerformerCondition(performerConditionName); dst.addPerformerCondition(performerConditionName, performerCondition, performers); } } public static void copyRouteCases(IDfActivityEx src, IDfActivityEx dst, IDfProcessEx process) throws Exception { IDfId conditionId = src.getId("r_condition_id"); if (!conditionId.isObjectId()) { return; } IDfList routeCases = dst.getRouteCaseIdentifiers(); for (int n = routeCases.getCount(), i = n - 1; i >= 0; i--) { dst.removeRouteCase(routeCases.getString(i)); } routeCases = src.getRouteCaseIdentifiers(); for (int i = 0, n = routeCases.getCount(); i < n; i++) { String routeCaseName = routeCases.getString(i); IDfList ports = src.getRouteCasePorts(routeCaseName); if (src.getValueCount(PREDICATE_ID) > i && src.getRepeatingId(PREDICATE_ID, i).isObjectId()) { IDfList conditions = src.getConditions(routeCaseName); dst.addConditionRouteCase(routeCaseName, conditions, ports); } else { String condition = src.getRouteCaseCondition(routeCaseName); ExpressionContainer localExpressionContainer = ExpressionUtils .getExpressionFromStatement(condition, process, src); if (localExpressionContainer != null) { dst.addConditionRouteCase(routeCaseName, localExpressionContainer.getStatementAsList( process, src), ports); } else { dst.addConditionRouteCase(routeCaseName, null, ports); } } } }}
Thanks Panfilov.
I will try this one with xCP 2.0 process. As soon as I test the code, I´ll post the result.
FYU,
I have tried to version test process template and install xcp project after that, but got error:
[ERROR] Caused by: com.emc.xcp.installer.process.docbase.dao.ProcessModelDAOException: Error occurred while creating dependent object for process: testproc[ERROR] at com.emc.xcp.installer.process.docbase.dao.impl.ProcessModelDAO.updateDependentObjects(ProcessModelDAO.java:84)[ERROR] at com.emc.xcp.installer.process.docbase.dao.impl.MultiPassProcessModelDAOImpl.updateDependentObjects(MultiPassProcessModelDAOImpl.java:50)[ERROR] at com.emc.xcp.installer.process.ProcessInstaller.overwrite(ProcessInstaller.java:66)[ERROR] ... 9 more[ERROR] Caused by: DfException:: THREAD: pool-31-thread-1; MSG: [DM_SYSOBJECT_E_CANT_SAVE_IMMUTABLE]error: "Cannot save testproc since it is immutable."; ERRORCODE: 100; NEXT: null[ERROR] at com.documentum.fc.client.impl.docbase.DocbaseExceptionMapper.newException(DocbaseExceptionMapper.java:57)[ERROR] at com.documentum.fc.client.impl.connection.docbase.MessageEntry.getException(MessageEntry.java:39)[ERROR] at com.documentum.fc.client.impl.connection.docbase.DocbaseMessageManager.getException(DocbaseMessageManager.java:137)[ERROR] at com.documentum.fc.client.impl.connection.docbase.netwise.NetwiseDocbaseRpcClient.checkForMessages(NetwiseDocbaseRpcClient.java:310)[ERROR] at com.documentum.fc.client.impl.connection.docbase.netwise.NetwiseDocbaseRpcClient.applyForInt(NetwiseDocbaseRpcClient.java:581)[ERROR] at com.documentum.fc.client.impl.connection.docbase.DocbaseConnection$6.evaluate(DocbaseConnection.java:1274)[ERROR] at com.documentum.fc.client.impl.connection.docbase.DocbaseConnection.evaluateRpc(DocbaseConnection.java:1072)[ERROR] at com.documentum.fc.client.impl.connection.docbase.DocbaseConnection.applyForInt(DocbaseConnection.java:1267)[ERROR] at com.documentum.fc.client.impl.docbase.DocbaseApi.parameterizedSave(DocbaseApi.java:767)[ERROR] at com.documentum.fc.client.DfSysObject$1.evaluate(DfSysObject.java:373)[ERROR] at com.documentum.fc.client.DfSysObject.doSaveImpl(DfSysObject.java:403)[ERROR] at com.documentum.fc.client.DfSysObject.doSave(DfSysObject.java:206)[ERROR] at com.documentum.bpm.impl.DfProcessEx.doSave(DfProcessEx.java:97)[ERROR] at com.documentum.fc.client.DfPersistentObject.saveEx(DfPersistentObject.java:912)[ERROR] at com.documentum.fc.client.DfPersistentObject.save(DfPersistentObject.java:907)[ERROR] at com.documentum.bpm.impl.DfProcessEx___PROXY.save(DfProcessEx___PROXY.java)[ERROR] at com.emc.xcp.installer.process.docbase.dao.impl.ProcessModelDAO.updateDependentObjects(ProcessModelDAO.java:80)[ERROR] ... 11 more
So, it was trying to override initial version, after that I executed magic SQL:
UPDATE XCP_ARTIFACT_BUNDLE_R SET INSTALLEDOBJECTID = REPLACE (INSTALLEDOBJECTID, 'oldprocessid', 'actualprocessid') WHERE INSTALLEDOBJECTID LIKE '%oldprocessid%';COMMIT;
And installation completed successfully
I executed the code but an error ocured in "process.validateEx(true);".
Let me ask you a question: in ALL companies in the world that use xCP 2.0, no one have to change their processes ?
The output message was :
log4j:WARN No such property [maxFileSize] in org.apache.log4j.ConsoleAppender.
log4j:WARN No such property [maxBackupIndex] in org.apache.log4j.ConsoleAppender.
16:41:51,805 INFO [main] com.documentum.fc.client.security.impl.JKSKeystoreUtilForDfc - keystore file name is C:\Documentum\config\dfc.keystore
16:41:51,815 INFO [main] com.documentum.fc.client.security.impl.InitializeKeystoreForDfc - [DFC_SECURITY_IDENTITY_LOADED] Loaded identity from keystore, DFC alias=dfc, identity=dfc_WOJcaWpizZHlE5kNtddi61Q2dfQa
16:41:51,816 INFO [main] com.documentum.fc.client.security.impl.AuthenticationMgrForDfc - identity for authentication is dfc_WOJcaWpizZHlE5kNtddi61Q2dfQa
16:41:51,818 INFO [main] com.documentum.fc.impl.RuntimeContext - DFC Version is 7.0.0000.0487
16:41:51,853 INFO [Timer-1] com.documentum.fc.client.impl.bof.cache.ClassCacheManager$CacheCleanupTask - [DFC_BOF_RUNNING_CLEANUP] Running class cache cleanup task
16:41:53,210 INFO [main] com.documentum.fc.client.impl.connection.docbase.DocbaseConnection - Object protocol version 2
16:41:53,258 INFO [main] com.documentum.fc.client.security.internal.AuthenticationMgr - new identity bundle <dfc_WOJcaWpizZHlE5kNtddi61Q2dfQa 1392403313 kzn001188indw7e.intra.kaizen.com.br UkPxccJ+pSfBuWWmOX5UWbXgTiLKZ1z2jLjrQPzA5ImE2LfoixsSn2DwR53QiuSs4vXw89zsYb6snibOpFeH56y3YGtGIfEUK9Jn1rmAjppuH2EQmu/ulRrX+efX5H+pcuNe7adnNKUZeOwC8vP10S2dyEKfpaexpFy+MHQoVjY=>
16:41:53,579 INFO [main] com.documentum.fc.client.security.impl.JKSKeystoreUtilForDfc - keystore file name is C:\Documentum\config\dfc.keystore
16:41:55,207 INFO [main] com.documentum.fc.client.security.impl.DfcIdentityPublisher - found client registration: true
16:41:55,591 INFO [main] com.documentum.fc.client.impl.connection.docbase.DocbaseConnection - Object protocol version 2
16:41:58,730 INFO [main] com.documentum.fc.client.impl.bof.cache.ClassCacheManager - [DFC_BOF_OBJECT_DOWNLOADED] Object dm_process was downloaded from docbase ECMHOM successfully.
Coping process: 4b00277680223188
Copying activity: 4c00277680223a04... 16:42:00,870 INFO [main] com.documentum.fc.client.impl.bof.cache.ClassCacheManager - [DFC_BOF_OBJECT_DOWNLOADED] Object dm_activity was downloaded from docbase ECMHOM successfully.
new activity: 4c002776802241e0
Copying activity: 4c00277680223a05... new activity: 4c002776802241e1
Copying activity: 4c00277680223a06... new activity: 4c002776802241e2
New process: 4b002776802241eb
UnknownServerResponseException:: THREAD: main; MSG: [DFC_SESSION_UNKNOWN_SERVER_RESPONSE] A server request failed but the server did not provide an error message. Method=ProcStateOp, ObjectId=4b002776802241eb, Arguments=DynamicallyTypedData@235b7c7f[readOnly=false, autoFill=true, fetchTimestamp=0, values=[ArgAction=1, ArgRecur=T, ArgRestart=F]]; ERRORCODE: ff; NEXT: null
at com.documentum.fc.client.impl.connection.docbase.netwise.NetwiseDocbaseRpcClient.applyForBool(NetwiseDocbaseRpcClient.java:357)
at com.documentum.fc.client.impl.connection.docbase.DocbaseConnection$1.evaluate(DocbaseConnection.java:1138)
at com.documentum.fc.client.impl.connection.docbase.DocbaseConnection.evaluateRpc(DocbaseConnection.java:1072)
at com.documentum.fc.client.impl.connection.docbase.DocbaseConnection.applyForBool(DocbaseConnection.java:1131)
at com.documentum.fc.client.impl.connection.docbase.DocbaseConnection.apply(DocbaseConnection.java:1116)
at com.documentum.fc.client.impl.docbase.DocbaseApi.procStateOp(DocbaseApi.java:1092)
at com.documentum.fc.client.DfProcess.validateEx(DfProcess.java:34)
at com.documentum.bpm.impl.DfProcessEx___PROXY.validateEx(DfProcessEx___PROXY.java)
at com.sonda.elber.teste.CreateProcessVersion.main(CreateProcessVersion.java:76)
16:44:07,415 INFO [main] com.documentum.fc.client.impl.connection.docbase.DocbaseConnection - Object protocol version 2
Uninstalling activity 4c002776802241e0
Invalidating activity 4c002776802241e0
Uninstalling activity 4c002776802241e1
Invalidating activity 4c002776802241e1
Uninstalling activity 4c002776802241e2
Invalidating activity 4c002776802241e2
Uninstalling process 4b002776802241eb
Invalidating process 4b002776802241eb
Destroying process 4b002776802241eb
Destroying activity 4b002776802241eb
Any idea ?