When you create VDoc processes or data stockroom tables and that you develop in Java
on these items, you must manipulate the system name of fields. But what is the system name of these fields and their types?
The principle is to simply generate for each resource model (IResourceDefinition) a Java interface:
At the top right of the studio home page, you will find a configuration button (gear) with a Classes generation menu.
In the screen, it has 2 options :
This will provide you a zip file containing all the classes of your projects.
Path: Project -> Properties -> Development -> SDK Development -> Package name : "com.axemble.vdoc.generatesdkresource.myproject"
Classes generation is organized into sub-package as follows:
sub-package | Description |
generated | The base classes that include all fields with their setter and getter methods (don't modify these classes) |
backend | This class has the same role as the BaseResourceDefinition (you can change) |
frontend | This class has the same role as the BaseDocumentExtention (you can change) |
dynamictables | A sub-package for dynamic table classes. |
In the diagram MyResource could be a process, a dynamic table or a data stockroom.
If the resource is an instance of ProcessResource then a Front-end instance is created
else a Back-end instance is created.
public static MyRessource getInstance( IResource resource ) { try { if ( resource instanceof ProcessResource ) return MyRessourceFrontend.class.getConstructor( IResource.class ).newInstance( resource ); return MyRessourceBackend.class.getConstructor( IResource.class ).newInstance( resource ); } catch( Exception e ) { throw new VDocException( "Error running getInstance", e ); } }
In the figure below, we can see the result of generated classes from an application containing :
If a package / class / method name does not suit you, you can go to the level of concern element to modify its alias.
Alias is available for :
package com.axemble.vdoc.generatedsdkresources.myapp.mygroupofprocess.generated; /** * Source generated on 04/11/2014 * @author vdoc * Don't update this auto-generated source ! */ public abstract class GeneratedMyProcess extends BaseSDKExtension { public static final String FIELD_sys_Title = "sys_Title"; public String getTitle() { return (String)workflowInstance.getValue( FIELD_sys_Title ); } public void setTitle(String newValue) { workflowInstance.setValue( FIELD_sys_Title, newValue ); } } /****************************************************************************************/ package com.axemble.vdoc.generatedsdkresources.projetdu.mygroupofproccess; import com.axemble.vdp.ui.core.document.extensions.IGenerated; import com.axemble.vdoc.generatedsdkresources.myapp.mygroupofproccess.MyProcess; import com.axemble.vdoc.generatedsdkresources.myapp.mygroupofproccess.generated.GeneratedMyProcess; import com.axemble.vdoc.sdk.interfaces.IWorkflowInstance; /** * Source generated on 04/11/2014 * @author vdoc * You can add custom method in this auto-generated source ! */ public abstract class MyProcess extends GeneratedMyProcess implements IGenerated { protected MyProcess( IWorkflowInstance workflowInstance ) { super( workflowInstance ); } } public static IProject getProject() { return (IProject) ProtocolURIHelper.getResource("uril://vdoc/project/DefaultOrganization/MyApp"); } public static ICatalog getCatalog() { return (ICatalog) ProtocolURIHelper.getResource("uril://vdoc/catalog/DefaultOrganization/MyApp/MyGroupofprocess:0"); } public static MyProcess createInstance(IContext iContext,IWorkflow iWorkflow, String reference, String label) throws WorkflowModuleException { return getInstance(Modules.getWorkflowModule().createWorkflowInstance( iContext, iWorkflow, reference, label )); }
import com.axemble.vdoc.generatedsdkresources.projetdu.mygroupofprocess.MyProcess; IProject myProject = MyProcess.getProject(); IOrganization myOrganization = MyProcess.getProject().getOrganization(); Collection<? extends IGroup> allgroup = MyProcess.getProject().getOrganization().getGroups(); ICatalog myCatalog = MyProcess.getCatalog(); IResourceDefinition myResourceDefinition = MyProcess.getDefinition() IWorkflow workflow1 = workflowmodule.getWorkflow( sysadminContext, mycatalog, PROCESS_VERSION_NAME ); MyProcess myresource = MyProcess.createInstance( sysadminContext, workflow1, null, "PROCESS GENERATED" ); myresource.setName( "My process name"); myresource.save( sysadminContext );
package com.axemble.vdoc.generatedsdkresources.myapp.mygroupofprocesses.dynamictables.generated; public abstract class GeneratedMyDynamicTable extends BaseSDKExtension { public static final String FIELD_DTCarModel = "TDCarModel"; public String getDT_CarModel() { return (String)resource.getValue( FIELD_DTCarModel ); } public void setDTCarModel(String newValue) { resource.setValue( FIELD_DTCarModel, newValue ); } } /**********************************************************************/ package com.axemble.vdoc.generatedsdkresources.projetdu.mygroupofprocesses.dynamictables; import com.axemble.vdoc.sdk.interfaces.IResource; import com.axemble.vdp.ui.core.document.extensions.IGenerated; import com.axemble.vdoc.generatedsdkresources.projetdu.groupedeprocessusauto.dynamictables.TabDynAuto; import com.axemble.vdoc.generatedsdkresources.projetdu.groupedeprocessusauto.dynamictables.generated.GeneratedMyDynamicTable; /** * Source generated on 04/11/2014 * @author vdoc * You can add custom method in this auto-generated source ! */ public abstract class MyDynamicTable extends GeneratedMyDynamicTable implements IGenerated { protected MyDynamicTable( IResource resource ) { super( resource ); } }
MyProcess myprocessresource = MyProcess.createInstance( sysadminContext, workflow1, null, "PROCESS GENERATED DYNAMIC TABLE " ); //début gestion du tableau dynamique avec les classes générée MyDynamicTable myLinkedResource = myresource.addNewMyDynamicTable(); myLinkedResource.setTDDate( new Date() ); myLinkedResource.setTDDonneePrincipale( dossierstorageresource ); myLinkedResource.setTDElementExterne( velo ); myLinkedResource.setTDGroupePrincipal( mygroup ); myLinkedResource.setTDListeAuto( "toyota" ); myLinkedResource.setTDLocalisationPrincipale( localisation1 ); myLinkedResource.setTDMonBlob( myBlob ); myLinkedResource.setTDMonBool( new Boolean( true ) ); myLinkedResource.setTDMonEntier( MY_INTEGER ); myLinkedResource.setTDMonMap( myMap ); myLinkedResource.setTDMonNombreDoubl( MY_DOUBLE_NUMBER ); myLinkedResource.setTDNombreDecimal( MY_DECIMAL ); myLinkedResource.setTDMonDocumentDeProcessus( dummyWorkflowInstance2 ); myLinkedResource.setTDNombreGrdPrecision( MY_BIGDECIMAL ); myLinkedResource.setTDNomDuTableauDynamique( "My dynamic table name" ); myLinkedResource.setTDOrganisationPrincipale( organization2 ); myLinkedResource.setTDPeriodeDuProjet( new Period( new Date(), new Date() ) ); myLinkedResource.setTDResponsableProjet( user_mail3 ); myLinkedResource.save( sysadminContext ); myprocessresource.save( sysadminContext );
package com.axemble.vdoc.generatedsdkresources.myapp.mydatastockroom.generated; public abstract class GeneratedMyTable extends BaseSDKExtension { public static final String FIELD_sys_Title = "sys_Title"; public static final String FIELD_Name = "Name"; public String getTitle() { return (String)resource.getValue( FIELD_sys_Title ); } public void setTitle(String newValue) { resource.setValue( FIELD_sys_Title, newValue ); } public String getName() { return (String)resource.getValue( FIELD_Name ); } /** * IProperty: Name<br/> * - Label : Name<br/> * - Description : <br/> * - Type param :String<br/> */ public void setName(String newValue) { resource.setValue( FIELD_Name, newValue ); } public static IProject getProject() { return (IProject) ProtocolURIHelper.getResource("uril://vdoc/project/DefaultOrganization/myApp"); } public static ICatalog getCatalog() { return (ICatalog) ProtocolURIHelper.getResource("uril://vdoc/catalog/DefaultOrganization/myApp/MyDataStockroom:4"); } public static IResourceDefinition getDefinition() { return (IResourceDefinition) ProtocolURIHelper.getResource("uril://vdoc/resourceDefinition/DefaultOrganization/myApp/MyDataStockroom:4/MyTable"); } } /********************************************************************/ package com.axemble.vdoc.generatedsdkresources.myapp.mydatastockroom; import com.axemble.vdoc.generatedsdkresources.projetdu.reservoirprojet.generated.GeneratedProject; import com.axemble.vdoc.sdk.interfaces.IResource; import com.axemble.vdp.ui.core.document.extensions.IGenerated; /** * Source generated on 04/11/20xx * @author vdoc * You can add custom method in this auto-generated source ! */ public abstract class MyTable extends GeneratedMyTable implements IGenerated { protected MyTable( IResource resource ) { super( resource ); } }
The following example shows an agent manipulating data stockroom by creating a client record
with 3 associated file records on a secondary data stockroom field.
and with many manipulations on different field types.
package com.axemble.vdoc.generatedsdkresources.agents; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.Map; import com.axemble.vdoc.generatedsdkresources.appdu.mydatastockroom.File; import com.axemble.vdoc.generatedsdkresources.appdu.mydatastockroom.Client; import com.axemble.vdoc.sdk.Modules; import com.axemble.vdoc.sdk.agent.base.BaseAgent; import com.axemble.vdoc.sdk.exceptions.SDKException; import com.axemble.vdoc.sdk.interfaces.IContext; import com.axemble.vdoc.sdk.interfaces.IGroup; import com.axemble.vdoc.sdk.interfaces.ILocalization; import com.axemble.vdoc.sdk.interfaces.IOrganization; import com.axemble.vdoc.sdk.interfaces.IResourceDefinition; import com.axemble.vdoc.sdk.interfaces.IStorageResource; import com.axemble.vdoc.sdk.interfaces.IUser; import com.axemble.vdoc.sdk.interfaces.IViewController; import com.axemble.vdoc.sdk.modules.IDirectoryModule; import com.axemble.vdoc.sdk.modules.IWorkflowModule; import com.axemble.vdoc.sdk.structs.ExternalElement; import com.axemble.vdoc.sdk.structs.Period; import com.axemble.vdp.resource.classes.SysColumns; public class Duagent extends BaseAgent { private static final String LOGIN_SYSADMIN = "sysadmin"; private static final String APPLICATION_NAME = "AppDU"; private static final String PROJECT_CLIENT_NAME = "Client"; private static final String PROJECT_ASSOCIATED_FILE_NAME = "AssociatedFile"; private static final String MYTABLE_CLIENT_NAME = "GENERATED_CLIENT"; private static final String MYTABLE_ASSOCIATED_FILE_NAME = "GENERATED_ASSOC_FILE"; private static final String IUSER_PROJECT_RESPONSIBLE = "usermail1"; private static final String IUSER_MAIL_3 = "usermail3"; private static final String ORGANIZATION_1 = "Organization_1"; private static final String ORGANIZATION_2 = "Organization_2"; private static final String LOCALIZATION_1 = "Localisation_1"; private static final String LOCALIZATION_2 = "Localisation_2"; private static final float MY_DECIMAL = 2532456; private static final long MY_INTEGER = 999561236; private static final double MY_DOUBLE_NUMBER = 333338888; private static final BigDecimal MY_BIGDECIMAL = new BigDecimal( MY_DOUBLE_NUMBER ); @Override protected void execute() { try { Client mystorageresource = null; IWorkflowModule workflowmodule = Modules.getWorkflowModule(); IDirectoryModule directoryModule = Modules.getDirectoryModule(); IContext sysadminContext = workflowmodule.getContextByLogin( LOGIN_SYSADMIN ); // Get ResourceDefinition with generated class IResourceDefinition myResourcedef = Client.getDefinition(); // Get Datastockroom table(Client) // Get ResourceDefinition without generated classes //IProject project = Modules.getProjectModule().getProject( sysadminContext, APPLICATION_NAME, getDefaultOrganization() ); //ICatalog mycatalog = workflowmodule.getCatalog( sysadminContext, PROJECT_CLIENT_NAME, project ); //IResourceDefinition myResourcedef = workflowmodule.getResourceDefinition( sysadminContext, mycatalog, PROJECT_CLIENT_NAME ); //*************************************** Create AssociatedFile ressource ************************************* Collection<IStorageResource> myAssociatedFiles = new ArrayList<IStorageResource>(); for ( int i = 1 ; i < 4 ; i++ ) // Create GENERATED_ASSOC_FILE1, GENERATED_ASSOC_FILE2, GENERATED_ASSOC_FILE3 { mystorageresourceAssociateFile = AssociatedFile.createInstance( sysadminContext, null ); //use reference generator //mystorageresourceAssociateFile = AssociatedFile.createInstance( sysadminContext, MYTABLE_ASSOCIATED_FILE_NAME + i ); //given reference mystorageresourceAssociateFile.setTitle( MYTABLE_ASSOCIATED_FILE_NAME + i ); mystorageresourceAssociateFile.setAssociatedFileName( MYTABLE_ASSOCIATED_FILE_NAME + "_NAME" + i ); mystorageresourceAssociateFile.save( sysadminContext ); myAssociatedFiles.add( (IStorageResource)mystorageresourceAssociateFile.getResource() ); } //*************************************** Create Client ressource ************************************* mystorageresource = Client.createInstance( sysadminContext, null ); //reference automatically generated e.g: Table-[Chrono] is used // Without generated class method //IResourceDefinition myResourcedef = workflowmodule.getResourceDefinition( sysadminContext, mycatalog, PROJECT_CLIENT_NAME ); //IStorageResource mystorageresource = workflowmodule.createStorageResource( sysadminContext, myResourcedef, "TEST AGENT GENERATED SDK" ); mystorageresource.save( sysadminContext ); //******************************************************************************** workflowmodule.beginTransaction(); //******************************************************************************** Client mydata = Client.getInstance( mystorageresource.getResource() ); // ********* Clien data edition *********** mydata.setTitle( MYTABLE_CLIENT_NAME ); mydata.setProjectName( MYTABLE_CLIENT_NAME + " NAME" ); mydata.setProjectDate( new Date() ); mydata.setProjectPeriode( new Period( new Date(), new Date() ) ); mydata.setMyBool( Boolean.valueOf( true ) ); //boolean mybool = Boolean.valueOf( true ); //new Boolean( true ); mydata.setMyInteger( MY_INTEGER ); mydata.setDecimal( new Float( MY_DECIMAL ) ); mydata.setMyDouble( MY_DOUBLE_NUMBER ); mydata.setMyBigDecimal( MY_BIGDECIMAL ); mydata.addAllAssociatedFiles( myAssociatedFiles ); mydata.setMainAssociatedFile( myAssociatedFiles.iterator().next() ); // Assign a record randomly IOrganization organization1 = directoryModule.getOrganization( sysadminContext, ORGANIZATION_1 ); IOrganization organization2 = directoryModule.getOrganization( sysadminContext, ORGANIZATION_2 ); mydata.setMainOrgarnization( organization1 ); Collection<IOrganization> organizations = new ArrayList<IOrganization>(); organizations.add( organization1 ); organizations.add( organization2 ); mydata.addAllSecondaryOrganizations( organizations ); ILocalization localisation1 = directoryModule.getLocalization( sysadminContext, LOCALIZATION_1 ); ILocalization localisation2 = directoryModule.getLocalization( sysadminContext, LOCALIZATION_2 ); Collection<ILocalization> localizations = new ArrayList<ILocalization>(); localizations.add( localisation1 ); localizations.add( localisation2 ); mydata.setMainLocalization( localisation1 ); mydata.addAllSecondaryLocalizations( localizations ); IUser user_Resp1 = workflowmodule.getUserByLogin( IUSER_PROJECT_RESPONSIBLE ); IUser user_Resp2 = workflowmodule.getUserByLogin( IUSER_MAIL_3 ); Collection<IUser> secondaryResp = new ArrayList<IUser>(); secondaryResp.add( user_Resp1 ); secondaryResp.add( user_Resp2 ); mydata.setProjectResponsible( user_Resp1 ); mydata.addAllSecondaryResponsible( secondaryResp ); //GroupeMail group retrieving IGroup mygroup = null; Iterable<? extends IGroup> allgroup = Client.getProject().getOrganization().getGroups(); for ( IGroup iGroup : allgroup ) { if ( iGroup.getName().equalsIgnoreCase( "GroupeMail" ) ) { mygroup = iGroup; } } mydata.setMainGroup( mygroup ); // ************* retrieves a IGroup collection ************** Collection<IGroup> mygroups = new ArrayList<IGroup>(); for ( IGroup iGroup : allgroup ) { if ( iGroup.getName().equalsIgnoreCase( "GroupeMail" ) ) mygroups.add( iGroup ); if ( iGroup.getName().equalsIgnoreCase( "SDK" ) ) mygroups.add( iGroup ); } mydata.addAllSecondaryGroups( mygroups ); // ************ Map element ****************** Map<String, String> myMap = new HashMap<>(); myMap.put( "1", "Fox" ); myMap.put( "2", "Weasel" ); mydata.setMap( myMap ); Map<String, String> myMap2 = new HashMap<>(); myMap2.put( "1", "Sparrow" ); myMap2.put( "2", "Woodpecker" ); Collection<Map> myMaps = new ArrayList<Map>(); myMaps.add( myMap ); myMaps.add( myMap2 ); mydata.addAllMesMaps( myMaps ); // *********** External element **************** ExternalElement car = new ExternalElement( "1", "Mustang", "carType" ); ExternalElement bike = new ExternalElement( "2", "BMX", "bikeType" ); ExternalElement plane = new ExternalElement( "3", "Hurricane", "planeType" ); Collection<ExternalElement> externalElements = new ArrayList<ExternalElement>(); externalElements.add( car ); externalElements.add( bike ); externalElements.add( plane ); mydata.setElementExterne( car ); //add several external elements (collection) mydata.addAllMyExternalElements( externalElements ); mydata.save( sysadminContext ); workflowmodule.commitTransaction(); } catch( Exception e ) { workflowmodule.rollbackTransaction(); throw new SDKException( e ); } finally { if ( workflowmodule.isTransactionActive() ) workflowmodule.rollbackTransaction(); Modules.releaseModule( workflowmodule ); Modules.releaseModule( directoryModule ); } } }
The following example shows an agent deleting all data stockrooms created in the preceding example.
public class Duagent extends BaseAgent { private static final String LOGIN_SYSADMIN = "sysadmin"; private static final String APPLICATION_NAME = "AppDU"; private static final String PROJECT_CLIENT_NAME = "Client"; private static final String PROJECT_ASSOCIATED_FILE_NAME = "AssociatedFile"; private static final String MYTABLE_CLIENT_NAME = "GENERATED_CLIENT"; private static final String MYTABLE_ASSOCIATED_FILE_NAME = "GENERATED_ASSOC_FILE"; @Override protected void execute() { try { Client mystorageresource = null; IWorkflowModule workflowmodule = Modules.getWorkflowModule(); IDirectoryModule directoryModule = Modules.getDirectoryModule(); IContext sysadminContext = workflowmodule.getContextByLogin( LOGIN_SYSADMIN ); // Get ResourceDefinition with generated class IResourceDefinition myResourcedef = Client.getDefinition(); // Get Datastockroom table(Client) //****************************** Remove existing Client ********************************************* Collection<IStorageResource> resources = null; IViewController viewController = workflowmodule.getViewController( sysadminContext, IStorageResource.class ); //*** Get client record where SYS_TITLE = MYTABLE_CLIENT_NAME viewController.addEqualsConstraint( SysColumns.SYS_TITLE, MYTABLE_CLIENT_NAME ); //Retrieves records with specified title name resources = viewController.evaluate( myResourcedef ); //Query on the table Client with Constraint //******************************************************************************** workflowmodule.beginTransaction(); //******************************************************************************** for ( IStorageResource myResource : resources ) //IStorageResource myResource = resources.iterator().next(); { String refName = (String)myResource.getValue( SysColumns.SYS_TITLE ); mystorageresource = Client.getInstance( myResource ); //You can not delete table if external elements exist mystorageresource.removeAllMyExternalElements( mystorageresource.getMyExternalElements() ); Collection<AssociatedFile> myAssociatedFiles = mystorageresource.getAssociatedFiles(); for ( AssociatedFile myAssociatedFile : myAssociatedFiles ) { mystorageresource.removeAssociatedFiles( (IStorageResource)myAssociatedFile.getResource() ); } mystorageresource.save( sysadminContext ); mystorageresource.delete( sysadminContext ); } AssociatedFile mystorageresourceAssociateFile = null; myResourcedef = AssociatedFile.getDefinition(); // Get Data stockroom table(AssociatedFile) // ******************* Remove existing AssociatedFile ************************************** viewController = workflowmodule.getViewController( sysadminContext, IStorageResource.class ); // no removeConstraint method() //viewController.addLikeConstraint( AssociatedFile.FIELD_sys_Reference, "%" + MYTABLE_ASSOCIATED_FILE_NAME + "%" ); //Retrieve record with specified name viewController.addLikeConstraint( SysColumns.SYS_TITLE, MYTABLE_ASSOCIATED_FILE_NAME + "%" ); //Retrieve record with specified name resources = viewController.evaluate( myResourcedef ); //Query on the table AssociatedFile with Constraint //Delete records with MYTABLE_CLIENT_NAME for ( IStorageResource myResource : resources ) //IStorageResource myResource = resources.iterator().next(); { mystorageresourceAssociateFile = AssociatedFile.getInstance( myResource ); mystorageresourceAssociateFile.delete( sysadminContext ); } //******************************************************************************** workflowmodule.commitTransaction(); //******************************************************************************** } catch( Exception e ) { getWorkflowModule().rollbackTransaction(); throw new SDKException( e ); } finally { if ( getWorkflowModule().isTransactionActive() ) getWorkflowModule().rollbackTransaction(); Modules.releaseModule( getWorkflowModule() ); Modules.releaseModule( getDirectoryModule() ); } } }