package org.easysoa.registry.integration; import java.util.ArrayList; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Path; import javax.ws.rs.core.Context; import org.easysoa.registry.DocumentService; import org.easysoa.registry.SubprojectServiceImpl; import org.easysoa.registry.facets.WsdlInfoFacet; import org.easysoa.registry.rest.integration.EndpointInformations; import org.easysoa.registry.rest.integration.ServiceInformation; import org.easysoa.registry.rest.integration.ServiceInformations; import org.easysoa.registry.rest.integration.SimpleRegistryService; import org.easysoa.registry.types.Endpoint; import org.easysoa.registry.types.SoaNode; import org.easysoa.registry.utils.ContextVisibility; import org.nuxeo.ecm.core.api.CoreSession; import org.nuxeo.ecm.core.api.DocumentModel; import org.nuxeo.ecm.core.api.DocumentModelList; import org.nuxeo.ecm.platform.query.nxql.NXQLQueryBuilder; import org.nuxeo.ecm.webengine.jaxrs.session.SessionFactory; import org.nuxeo.runtime.api.Framework; /** * Simple service registry implementation * * @author jguillemotte * */ @Path("easysoa/simpleRegistryService") public class SimpleRegistryServiceImpl implements SimpleRegistryService { //TODO : How to get nuxeo base url ? public final static String NUXEO_BASE_URL = "http://localhost:8080/nuxeo/"; // @Context HttpServletRequest request; /** * */ @Override public ServiceInformations queryWSDLInterfaces(String search, String subProjectId, String visibility) throws Exception { CoreSession documentManager = SessionFactory.getSession(request); DocumentService documentService = Framework.getService(DocumentService.class); boolean searchParamIncluded = false; ArrayList<String> parameters = new ArrayList<String>(); StringBuilder query = new StringBuilder(); query.append("SELECT * FROM InformationService "); // Search parameter if(search != null && !"".equals(search)){ String searchParam = "%"+search+"%"; query.append("WHERE (dc:title like '?' " + "OR " + SoaNode.XPATH_SOANAME + " like '?' " + "OR dc:description like '?' " + "OR " + WsdlInfoFacet.XPATH_WSDL_PORTTYPE_NAME + " like '?')"); parameters.add(searchParam); parameters.add(searchParam); parameters.add(searchParam); parameters.add(searchParam); searchParamIncluded = true; } // Project ID parameter if(subProjectId != null && !"".equals(subProjectId)){ // TODO : not implemented yet in Nuxeo registry //[and projectId=appGivenProjectId || projectId in (allProjectIdsReferredByFraSCAtiStudioProject)] String subProjectCriterias = ""; DocumentModel subProjectModel = SubprojectServiceImpl.getSubprojectById(documentManager, subProjectId); if(subProjectModel != null){ // Get subproject according to context visibility if(ContextVisibility.STRICT.getValue().equals(visibility)){ subProjectCriterias = SubprojectServiceImpl.buildCriteriaInSubproject(subProjectId); } else { subProjectCriterias = SubprojectServiceImpl.buildCriteriaSeenFromSubproject(subProjectModel); } if(searchParamIncluded){ query.append(" AND ").append(subProjectCriterias); } else { query.append(" WHERE ").append(subProjectCriterias); } } else { throw new Exception("subProjectId '" + subProjectId + "' is not a valid subproject !"); } } // LATER // Platform parameter //if(platformId != null && !"".equals(platformId)){ // TODO Add implementation for condition, would allow to search only in its own services // what acts as platformId for : FraSCAti Studio (base url and not Cloud(s) url), Talend (talend repository url ?) // for now only platform:deliverableRepositoryUrl exists that could act as platform id, later maybe : // [and is/impl:platformId='fraSCAtiStudioPlatformId'] //} // LATER // Platform service standard parameter //if(platformServiceStandard != null && !"".equals(platformServiceStandard)){ // LATER Add doc model & implementation for condition (FraSCAti & CXF only support WSDL11), something like : // platform:wsdlVersion / WsdlInfo.XPATH_WSDL_VERSION='1.1' //} // LATER // WS binding transport(_type) parameter //if(wsBindingTransport != null && !"".equals(wsBindingTransport)){ // LATER Add doc model & implementation for condition (for now only HTTP), something like : // [and platform:serviceTransport or endpointServiceTransport='http://schemas.xmlsoap.org/soap/http'] //} // LATER other platform parameters (see ServiceMatchingListener.findIServicesForImpl()) ? // Execute query String nxqlQuery = NXQLQueryBuilder.getQuery(query.toString(), parameters.toArray(), false, true); //DocumentModelList soaNodeModelList = documentManager.query(nxqlQuery); DocumentModelList soaNodeModelList = documentService.query(documentManager, nxqlQuery, true, false); // Write response ServiceInformations serviceInformations = new ServiceInformations(); for (DocumentModel soaNodeModel : soaNodeModelList) { serviceInformations.addServiceInformation(SoaNodeInformationToWSDLInformationMapper.mapToServiceInformation(soaNodeModel, NUXEO_BASE_URL, documentManager)); } return serviceInformations; } /** * */ //@Override public EndpointInformations queryEndpoints(String search, String subProjectId, String visibility) throws Exception { CoreSession documentManager = SessionFactory.getSession(request); return SimpleRegistryServiceImpl.queryEndpoints(documentManager, search, subProjectId, visibility); } // TODO : make a service with this method public static EndpointInformations queryEndpoints(CoreSession documentManager, String search, String subProjectId, String visibility) throws Exception { DocumentService documentService = Framework.getService(DocumentService.class); boolean searchParamIncluded = false; // Fetch SoaNode list ArrayList<String> parameters = new ArrayList<String>(); StringBuilder query = new StringBuilder(); query.append(DocumentService.NXQL_SELECT_FROM); query.append(Endpoint.DOCTYPE); query.append(" "); // Search parameter if(search != null && !"".equals(search)){ String searchParam = "%"+search+"%"; query.append("WHERE dc:title like '?' " + "OR " + SoaNode.XPATH_SOANAME + " like '?' " + "OR dc:description like '?' " + "OR " + WsdlInfoFacet.XPATH_WSDL_PORTTYPE_NAME + " like '?'"); parameters.add(searchParam); parameters.add(searchParam); parameters.add(searchParam); parameters.add(searchParam); searchParamIncluded = true; } // Project ID parameter if(subProjectId != null && !"".equals(subProjectId)){ // TODO : not implemented yet in Nuxeo registry //[and projectId=appGivenProjectId || projectId in (allProjectIdsReferredByFraSCAtiStudioProject)] String subProjectCriterias = ""; DocumentModel subProjectModel = SubprojectServiceImpl.getSubprojectById(documentManager, subProjectId); if(subProjectModel != null){ if(ContextVisibility.STRICT.getValue().equals(visibility)){ subProjectCriterias = SubprojectServiceImpl.buildCriteriaInSubproject(subProjectId); } else { subProjectCriterias = SubprojectServiceImpl.buildCriteriaSeenFromSubproject(subProjectModel); } if(searchParamIncluded){ query.append(DocumentService.NXQL_AND).append(subProjectCriterias); } else { query.append(DocumentService.NXQL_WHERE).append(subProjectCriterias); } } else { throw new Exception("subProjectId '" + subProjectId + "' is not a valid subproject !"); } } String nxqlQuery = NXQLQueryBuilder.getQuery(query.toString(), parameters.toArray(), false, true); //DocumentModelList soaNodeModelList = documentManager.query(nxqlQuery); DocumentModelList soaNodeModelList = documentService.query(documentManager, nxqlQuery, true, false); // Write response EndpointInformations endpointInformations = new EndpointInformations(); for (DocumentModel soaNodeModel : soaNodeModelList) { endpointInformations.addEndpointInformation(SoaNodeInformationToWSDLInformationMapper.mapToEndpointInformation(soaNodeModel, NUXEO_BASE_URL)); } return endpointInformations; } //@Override public ServiceInformations queryServicesWithEndpoints(String search, String subProjectId, String visibility) throws Exception { // Get services ServiceInformations serviceInformations = this.queryWSDLInterfaces(search, subProjectId, visibility); // For each service, get the corresponding endpoints for(ServiceInformation serviceInformation : serviceInformations.getServiceInformationList()){ EndpointInformations endpoints = this.queryServiceEndpoints(serviceInformation.getNuxeoID()); serviceInformation.setEndpoints(endpoints); } return serviceInformations; } /** * Returns the endpoints associated with the service * @param serviceId The service Nuxeo UUID * @throws Exception If a problem occurs */ private EndpointInformations queryServiceEndpoints(String serviceId) throws Exception { CoreSession documentManager = SessionFactory.getSession(request); EndpointInformations endpoints = new EndpointInformations(); // Fetch SoaNode list ArrayList<String> parameters = new ArrayList<String>(); StringBuilder query = new StringBuilder(); query.append("SELECT * FROM Endpoint WHERE impl:providedInformationService = '?'"); parameters.add(serviceId); String nxqlQuery = NXQLQueryBuilder.getQuery(query.toString(), parameters.toArray(), false, true); DocumentModelList soaNodeModelList = documentManager.query(nxqlQuery); for (DocumentModel soaNodeModel : soaNodeModelList) { endpoints.addEndpointInformation(SoaNodeInformationToWSDLInformationMapper.mapToEndpointInformation(soaNodeModel, NUXEO_BASE_URL)); } return endpoints; } }