Java API
Si vous souhaitez étendre beCPG grâce à un nouveau module JAVA AMP, beCPG fourni un ensemble d'API public pouvant être utilisé et facilitant le développement d'applications.
ORM API
Afin de manipuler les entités de beCPG, il existe un outil de mapping entre les modèles Alfresco et les objets Java Pojo.
En effet, il permet de mapper les objets Java Pojo avec les modèles de données Alfresco et utilise l'API Java pour manipuler ces objets. Le mapping est basé sur 5 annotations Java.
Un ensemble d'annotations représente les propriétés et les associations d'Alfresco:
@AlfQname --> Spécifie le qName d'Alfresco
@AlfType --> Correspond à un type Alfresco
@AlfProp --> Correspond à des propriétés Alfresco
@AlfMlText --> Correspond à des propriétés mltext précises
@AlfSingleAssoc --> Correspond à une unique association cible
@AlfMultiAssoc --> Correspond à plusieurs associations cibles
@AlfEnforced --> Enregistre le champ même s'il est nul
@AlfReadOnly --> N'enregistre pas les propriétés
Il existe également un ensemble d'annotations représentant les datalists de beCPG:
@DataList
@DataListIdentifierAttr
@DataListView
@MultiLevelDataList
...
Nous voulons, par exemple, créer et manipuler des objects de type "deliverable".
- Créer le modèle de données Alfresco:
<type name="pjt:deliverable">
<properties>
<property name="pjt:dlDescription">
<type>d:text</type>
<mandatory>true</mandatory>
</property>
<property name="pjt:dlState">
<type>d:text</type>
<constraints>
<constraint ref="pjt:deliverableStates" />
</constraints>
</property>
<property name="pjt:dlUrl">
<type>d:text</type>
</property>
</properties>
<associations>
<association name="pjt:dlTask">
<source>
<mandatory>true</mandatory>
<many>true</many>
</source>
<target>
<class>pjt:taskList</class>
<mandatory>true</mandatory>
<many>false</many>
</target>
</association>
<association name="pjt:dlContent">
<source>
<mandatory>false</mandatory>
<many>true</many>
</source>
<target>
<class>cm:content</class>
<mandatory>false</mandatory>
<many>false</many>
</target>
</association>
</associations>
</type>
- Créer l'objet Java correspondant avec les annotations beCPG.
La classe devrait hériter de BeCPGDataObject. Les méthodes setters, hashCode, equals et toString doivent être déclarées.
@AlfType
@AlfQname(qname = "pjt:deliverable")
public class Deliverable extends BeCPGDataObject {
private NodeRef task;
private DeliverableState state = DeliverableState.Planned;
private String description;
private String url;
private Integer completionPercent = 0;
private NodeRef content;
@AlfSingleAssoc
@AlfQname(qname = "pjt:dlTask")
public NodeRef getTask() {
return task;
}
@AlfProp
@AlfQname(qname = "pjt:dlUrl")
public String getUrl() {
return url;
}
@AlfProp
@AlfQname(qname = "pjt:dlState")
public DeliverableState getState() {
return state;
}
@AlfProp
@AlfQname(qname = "pjt:dlDescription")
public String getDescription() {
return description;
}
@AlfProp
@AlfQname(qname = "pjt:completionPercent")
public Integer getCompletionPercent() {
return completionPercent;
}
@AlfSingleAssoc
@AlfQname(qname = "pjt:dlContent")
public NodeRef getContent() {
return content;
}
...
}
- Enfin, utiliser la classe AlfrescoRepository afin d'effectuer les opérations CRUD (création, lecture, mise à jour, supression) sur l'objet Java créé.
public class TestORM {
@Resource
protected AlfrescoRepository<Deliverable> alfrescoRepository;
@Test
public void test() {
//CRUD
Deliverable deliverable = new Deliverable();
deliverable.setParentNodeRef(getParentNodeRef());
//Create
alfrescoRepository.save(deliverable);
NodeRef deliverableNodeRef = deliverable.getNodeRef();
//Retrieve
deliverable = alfrescoRepository.findOne(deliverableNodeRef);
deliverable.setDescription("Test");
//Update
alfrescoRepository.save(deliverable); }
...
}
Search query builder
beCPG fournit une classe utilitaire pour construire des requêtes FTS (Full-Text Search) ou Alfresco Lucene sûres et rapides.\ Cette classe s'efforcera autant que possible de construire une requête transactionnelle. Consultez https://docs.alfresco.com/search-services/latest/config/transactional/ pour plus d'informations.
Voici quelques cas d'utilisation :
//Getting some search results
List<NodeRef> ret = BeCPGQueryBuilder.createQuery()
.ofType(ContentModel.TYPE_FOLDER)
.isNotNull(ContentModel.PROP_MODIFIED)
.excludeAspect(ContentModel.ASPECT_WORKING_COPY)
.withAspect(ContentModel.ASPECT_TITLED)
.addSort(ContentModel.PROP_MODIFIED,true).list();
// Getting unlimited results, it will do an internal pagination based on date modified
List<NodeRef> ret = BeCPGQueryBuilder.createQuery()
.ofType(ContentModel.TYPE_FOLDER).maxResults(RepoConsts.MAX_RESULTS_UNLIMITED).list();
//Getting single result or null
NodeRef nodeRef = BeCPGQueryBuilder.createQuery()
.ofType(ContentModel.TYPE_FOLDER)
.andPropEquals(ContentModel.PROP_NAME, "Test").singleValue();