API - Selection d'un carnet d'adresses de domaine

Bonjour,

Maintenance je cherche un récupérer un carnet d’adresse de domaine afin d’y synchroniser des contacts depuis un base Oracle.

Je but seulement sur la façon de récupérer le Folder…

			SystemClient sc = new SystemLocator().locate(prop.getProperty("core.url"));
			ICore coreClient = CoreClient.newCore(prop.getProperty("core.url"));
			AccessToken token = sc.login(prop.getProperty("core.login"), prop.getProperty("core.password"), "EB");			
						
			FolderQuery fq = new FolderQuery();	
			fq.setDomainBookOnly(true);
			fq.setName("Mairies");
			
			List<Folder> folders = coreClient.getAddressBook().findFolders(token, fq);
			
			System.out.println(folders);
			
			for (Folder f : folders) {
				System.out.println(f.getDomain() + " " + f.getName());
			}

avec le retour suivant dans la console eclipse :

2016-01-28 16:57:55,488 n.b.c.c.b.BookClient WARN - Null value provided for sid
]

Merci d’avance pour votre aide.

Êtes-vous correctement identifié ?
Quel sont les logs du core ?

J’avais essayé en admin0 mais il ne ramène rien.

Du coup j’essayais avec l’admin du domaine mais j’ai çà dans le core.log

2016-01-28 17:47:17,601 [vert.x-worker-thread-13] net.bluemind.core.UserManagement INFO - access refused to login: 'admin' domain: 'cg89.fr', auth type: BM DB, origin: EB

Plus d’erreur en admin0 mais pas de Folder…

Vous avez 2 possibilités:
[list=*]
]vous vous authentifiez en tant qu’admin0: il faut que l’attribut domain de FolderQuery soit renseigné, et que le domainId de l’attribut domain contienne l’ID du domaine que vous souhaitez requêter - il n’est pas possible de requêter l’ensemble des domaines d’un coups, il faut faire une requête par domaine/]
]soit vous vous authentifiez en tant qu’utilisateur/administrateur du domaine visé, et dans ce cas l’attribut domaine de FolderQuery peut ne pas être renseigné, par contre seul les carnets d’adresses sur lequel cet utilisateur a des droits seront remontés/]
[/list]

Bon fonctionne avec l’admin du domaine, je récupère bien le Folder… (En fait j’avais supprimé l’admin du domaine, on ne veut pas de compte administrateur générique)

Connexion OK avec admin0 mais toujours rien… malgré avoir ajouté le Domain dans le FolderQuery

SystemClient sc = new SystemLocator().locate(prop.getProperty("core.url"));
ICore coreClient = CoreClient.newCore(prop.getProperty("core.url"));
AccessToken token = sc.login(prop.getProperty("core.login"), prop.getProperty("core.password"), "EB");			
		
Domain dom = sc.getDomainFromId(token, token.getDomainId());
System.out.println(dom);
			
FolderQuery fq = new FolderQuery();
fq.setDomain(dom);
fq.setDomainBookOnly(true);
fq.setName("Mairie");

List<Folder> folders = coreClient.getAddressBook().findFolders(token, fq);

for (Folder f : folders) {
	System.out.println(f.getDomain() + " " + f.getName());
}

Bon le domaine récupérer est le domaine Global… Logique…

Y a t’il plus simple que de faire un sudo ?

Faites la requête en admin0 mais en indiquant l’ID du domaine visé.

Dans ce cas, vous n’avez pas besoin qu’un administrateur existe dans le domaine, ni de faire de sudo.

Bon… J’ai trouvé mais maintenant j’ai çà :

java.lang.IllegalArgumentException: No enum constant net.bluemind.core.api.custom.props.CustomPropertyType.RADIO

Faut peut que je mette à jour les bibliothèque BM.

C’est ok avec les apis à jour

Effectivement, c’est que votre SDK est trop vieux.

Ca fonctionne.

Maintenant autre problématique, je vais devoir mettre à jour les contacts de ce carnet d’adresse.

Je mets à jour le post…

J’avais dans l’idée de supprimer le carnet d’adresse et de le recrééer…

Finalement, j’essaie de tester l’existence du contact dans le carnet, s’il existe je le met à jour sinon je le créé.

Problème, le seul champs vraiment fiable sur lequel je peux faire la vérification est le code géographique de la commune (carnet d’adresse des mairies) que je vais mettre dans le champs externalID de la fiche contact.

J’essai de faire çà :

ContactQuery cq = new ContactQuery();
cq.setQuery("extid:"+vCODEGEO);				
ResultList<Contact> contacts= ab.advancedSearchContact(token, cq);		

et j’ai cette erreur là dans les log elascticsearch :

[2016-01-29 13:09:36,432][DEBUG][action.search.type       ] [Dark Angel] [contact][3], node[HHo4ZYTmQua2PGSnYJaCaw], [P], s[STARTED]: Failed to execute [org.elasticsearch.action.search.SearchRequest@36e08fd5] lastShard [true]
org.elasticsearch.search.SearchParseException: [contact][3]: from[0],size[10]: Parse Failure [Failed to parse source [{"from":0,"size":10,"query":{"filtered":{"query":{"query_string":{"query":"extid:89001","fields":["_all"],"default_operator":"and","analyze_wildcard":true,"minimum_should_match":"100%"}},"filter":{"bool":{}}}},"fields":"id","sort":{"sortable":{"order":"asc"}}]}]]
	at org.elasticsearch.search.SearchService.parseSource(SearchService.java:681)
	at org.elasticsearch.search.SearchService.createContext(SearchService.java:537)
	at org.elasticsearch.search.SearchService.createAndPutContext(SearchService.java:509)
	at org.elasticsearch.search.SearchService.executeQueryPhase(SearchService.java:264)
	at org.elasticsearch.search.action.SearchServiceTransportAction$5.call(SearchServiceTransportAction.java:231)
	at org.elasticsearch.search.action.SearchServiceTransportAction$5.call(SearchServiceTransportAction.java:228)
	at org.elasticsearch.search.action.SearchServiceTransportAction$23.run(SearchServiceTransportAction.java:559)
	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:745)
Caused by: org.elasticsearch.index.query.QueryParsingException: [contact] [bool] filter has no inner should/must/must_not elements
	at org.elasticsearch.index.query.BoolFilterParser.parse(BoolFilterParser.java:130)
	at org.elasticsearch.index.query.QueryParseContext.executeFilterParser(QueryParseContext.java:343)
	at org.elasticsearch.index.query.QueryParseContext.parseInnerFilter(QueryParseContext.java:324)
	at org.elasticsearch.index.query.FilteredQueryParser.parse(FilteredQueryParser.java:74)
	at org.elasticsearch.index.query.QueryParseContext.parseInnerQuery(QueryParseContext.java:277)
	at org.elasticsearch.index.query.IndexQueryParserService.innerParse(IndexQueryParserService.java:382)
	at org.elasticsearch.index.query.IndexQueryParserService.parse(IndexQueryParserService.java:281)
	at org.elasticsearch.index.query.IndexQueryParserService.parse(IndexQueryParserService.java:276)
	at org.elasticsearch.search.query.QueryParseElement.parse(QueryParseElement.java:33)
	at org.elasticsearch.search.SearchService.parseSource(SearchService.java:665)
	... 9 more

Hello,

Une petite idée ce qui ne vas pas dans le ContactQuery ?

Bonjour,

Cela ressemble à un bug de l’API, pouvez-vous créer un ticket sur notre jira ?

token est un token de quel utilisateur ?

Il faut utiliser un token de l’utilisateur visé, il semblerait que token soit un token de l’utilisateur admin0@global.virt.

C’est le token d’amin0 en effet.

Je veux rechercher si un contact existe déjà dans un carnet d’adresse de domaine pas dans le carnet d’un utilisateur particulier.

Je créé un ticket dans la forge et vous met le code complet qui contient des infos privées…

Mettez nous le code dans un ticket, nous pourrons valider que tout est bon.

Cependant il va falloir utiliser un token d’un utilisateur ayant les droits de lecture/écriture sur ce carnet pour en gérer son contenu. Celui d’admin0 ne conviendra pas.

Le ticket a été créé BM-7619.

Çà fonctionne correctement avec un utilisateur qui a accès au carnet.