use of org.wso2.carbon.registry.api.Registry in project carbon-business-process by wso2.
the class RESTTask method execute.
@Override
public void execute(DelegateExecution execution) {
if (method == null) {
String error = "HTTP method for the REST task not found. Please specify the \"method\" form property.";
throw new RESTClientException(error);
}
if (log.isDebugEnabled()) {
if (serviceURL != null) {
log.debug("Executing RESTInvokeTask " + method.getValue(execution).toString() + " - " + serviceURL.getValue(execution).toString());
} else if (serviceRef != null) {
log.debug("Executing RESTInvokeTask " + method.getValue(execution).toString() + " - " + serviceRef.getValue(execution).toString());
}
}
RESTInvoker restInvoker = BPMNRestExtensionHolder.getInstance().getRestInvoker();
RESTResponse response;
String url = null;
String bUsername = null;
String bPassword = null;
JsonNodeObject jsonHeaders = null;
boolean contentAvailable = false;
try {
if (serviceURL != null) {
url = serviceURL.getValue(execution).toString();
if (basicAuthUsername != null && basicAuthPassword != null) {
bUsername = basicAuthUsername.getValue(execution).toString();
bPassword = basicAuthPassword.getValue(execution).toString();
}
} else if (serviceRef != null) {
String resourcePath = serviceRef.getValue(execution).toString();
String registryPath;
int tenantIdInt = Integer.parseInt(execution.getTenantId());
RealmService realmService = RegistryContext.getBaseInstance().getRealmService();
String domain = realmService.getTenantManager().getDomain(tenantIdInt);
Registry registry;
Resource urlResource;
try {
PrivilegedCarbonContext.startTenantFlow();
if (domain != null) {
PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantDomain(domain);
PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantId(tenantIdInt);
} else {
PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantId(tenantIdInt);
}
if (resourcePath.startsWith(GOVERNANCE_REGISTRY_PREFIX)) {
registryPath = resourcePath.substring(GOVERNANCE_REGISTRY_PREFIX.length());
registry = BPMNExtensionsComponent.getRegistryService().getGovernanceSystemRegistry(tenantIdInt);
} else if (resourcePath.startsWith(CONFIGURATION_REGISTRY_PREFIX)) {
registryPath = resourcePath.substring(CONFIGURATION_REGISTRY_PREFIX.length());
registry = BPMNExtensionsComponent.getRegistryService().getConfigSystemRegistry(tenantIdInt);
} else {
String msg = "Registry type is not specified for service reference in " + getTaskDetails(execution) + ". serviceRef should begin with gov:/ or conf:/ to indicate the registry type.";
throw new RESTClientException(msg);
}
if (log.isDebugEnabled()) {
log.debug("Reading endpoint from registry location: " + registryPath + " for task " + getTaskDetails(execution));
}
urlResource = registry.get(registryPath);
} finally {
PrivilegedCarbonContext.endTenantFlow();
}
if (urlResource != null) {
String uepContent = new String((byte[]) urlResource.getContent(), Charset.defaultCharset());
UnifiedEndpointFactory uepFactory = new UnifiedEndpointFactory();
OMElement uepElement = AXIOMUtil.stringToOM(uepContent);
UnifiedEndpoint uep = uepFactory.createEndpoint(uepElement);
url = uep.getAddress();
bUsername = uep.getAuthorizationUserName();
bPassword = uep.getAuthorizationPassword();
} else {
String errorMsg = "Endpoint resource " + registryPath + " is not found. Failed to execute REST invocation in task " + getTaskDetails(execution);
throw new RESTClientException(errorMsg);
}
} else {
String urlNotFoundErrorMsg = "Service URL is not provided for " + getTaskDetails(execution) + ". serviceURL or serviceRef must be provided.";
throw new RESTClientException(urlNotFoundErrorMsg);
}
if (headers != null) {
String headerContent = headers.getValue(execution).toString();
jsonHeaders = JSONUtils.parse(headerContent);
}
if (POST_METHOD.equals(method.getValue(execution).toString().trim().toUpperCase())) {
String inputContent = input.getValue(execution).toString();
response = restInvoker.invokePOST(new URI(url), jsonHeaders, bUsername, bPassword, inputContent);
} else if (GET_METHOD.equals(method.getValue(execution).toString().trim().toUpperCase())) {
response = restInvoker.invokeGET(new URI(url), jsonHeaders, bUsername, bPassword);
} else if (PUT_METHOD.equals(method.getValue(execution).toString().trim().toUpperCase())) {
String inputContent = input.getValue(execution).toString();
response = restInvoker.invokePUT(new URI(url), jsonHeaders, bUsername, bPassword, inputContent);
} else if (DELETE_METHOD.equals(method.getValue(execution).toString().trim().toUpperCase())) {
response = restInvoker.invokeDELETE(new URI(url), jsonHeaders, bUsername, bPassword);
} else {
String errorMsg = "Unsupported http method. The REST task only supports GET, POST, PUT and DELETE operations";
throw new RESTClientException(errorMsg);
}
Object output = response.getContent();
if (output != null) {
contentAvailable = !response.getContent().equals("");
}
boolean contentTypeAvailable = false;
if (response.getContentType() != null) {
contentTypeAvailable = true;
}
if (contentAvailable && contentTypeAvailable && response.getContentType().contains(APPLICATION_JSON)) {
output = JSONUtils.parse(String.valueOf(output));
} else if (contentAvailable && contentTypeAvailable && response.getContentType().contains(APPLICATION_XML)) {
output = Utils.parse(String.valueOf(output));
} else {
output = StringEscapeUtils.escapeXml(String.valueOf(output));
}
if (outputVariable != null) {
String outVarName = outputVariable.getValue(execution).toString();
execution.setVariable(outVarName, output);
} else if (outputMappings != null) {
String outMappings = outputMappings.getValue(execution).toString();
outMappings = outMappings.trim();
String[] mappings = outMappings.split(",");
for (String mapping : mappings) {
String[] mappingParts = mapping.split(":");
String varName = mappingParts[0];
String expression = mappingParts[1];
Object value;
if (output instanceof JsonNodeObject) {
value = ((JsonNodeObject) output).jsonPath(expression);
} else {
value = ((XMLDocument) output).xPath(expression);
}
execution.setVariable(varName, value);
}
} else {
String outputNotFoundErrorMsg = "An outputVariable or outputMappings is not provided. " + "Either an output variable or output mappings must be provided to save " + "the response.";
throw new RESTClientException(outputNotFoundErrorMsg);
}
if (responseHeaderVariable != null) {
StringBuilder headerJsonStr = new StringBuilder();
headerJsonStr.append("{");
String prefix = "";
for (Header header : response.getHeaders()) {
headerJsonStr.append(prefix);
String name = header.getName().replaceAll("\"", "");
String value = header.getValue().replaceAll("\"", "");
headerJsonStr.append("\"").append(name).append("\":\"").append(value).append("\"");
prefix = ",";
}
headerJsonStr.append("}");
JsonNodeObject headerJson = JSONUtils.parse(headerJsonStr.toString());
execution.setVariable(responseHeaderVariable.getValue(execution).toString(), headerJson);
}
if (httpStatusVariable != null) {
execution.setVariable(httpStatusVariable.getValue(execution).toString(), response.getHttpStatus());
}
} catch (RegistryException | XMLStreamException | URISyntaxException | IOException | SAXException | ParserConfigurationException e) {
String errorMessage = "Failed to execute " + method.getValue(execution).toString() + " " + url + " within task " + getTaskDetails(execution);
log.error(errorMessage, e);
throw new RESTClientException(REST_INVOKE_ERROR, errorMessage);
} catch (BPMNJsonException | BPMNXmlException e) {
String errorMessage = "Failed to extract values for output mappings, the response content" + " doesn't support the expression" + method.getValue(execution).toString() + " " + url + " within task " + getTaskDetails(execution);
log.error(errorMessage, e);
throw new RESTClientException(REST_INVOKE_ERROR, errorMessage);
} catch (UserStoreException e) {
String errorMessage = "Failed to obtain tenant domain information";
log.error(errorMessage, e);
throw new RESTClientException(REST_INVOKE_ERROR, errorMessage);
}
}
use of org.wso2.carbon.registry.api.Registry in project carbon-business-process by wso2.
the class SOAPTask method execute.
@Override
public void execute(DelegateExecution execution) {
String endpointURL;
String payloadRequest;
String version;
String connection;
String transferEncoding;
String[] transportHeaderList;
String action = "";
String soapVersionURI = SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI;
List<Header> headerList = new ArrayList<Header>();
try {
if (serviceURL != null) {
endpointURL = serviceURL.getValue(execution).toString();
} else if (serviceRef != null) {
String resourcePath = serviceRef.getValue(execution).toString();
String registryPath;
String tenantId = execution.getTenantId();
Registry registry;
if (resourcePath.startsWith(GOVERNANCE_REGISTRY_PREFIX)) {
registryPath = resourcePath.substring(GOVERNANCE_REGISTRY_PREFIX.length());
registry = BPMNExtensionsComponent.getRegistryService().getGovernanceSystemRegistry(Integer.parseInt(tenantId));
} else if (resourcePath.startsWith(CONFIGURATION_REGISTRY_PREFIX)) {
registryPath = resourcePath.substring(CONFIGURATION_REGISTRY_PREFIX.length());
registry = BPMNExtensionsComponent.getRegistryService().getConfigSystemRegistry(Integer.parseInt(tenantId));
} else {
String msg = "Registry type is not specified for service reference in " + " serviceRef should begin with gov:/ or conf:/ to indicate the registry type.";
throw new SOAPException(SOAP_INVOKE_ERROR_CODE, msg);
}
if (log.isDebugEnabled()) {
log.debug("Reading endpoint from registry location: " + registryPath + " for task " + execution.getCurrentActivityName());
}
Resource urlResource = registry.get(registryPath);
if (urlResource != null) {
String uepContent = new String((byte[]) urlResource.getContent(), Charset.defaultCharset());
UnifiedEndpointFactory uepFactory = new UnifiedEndpointFactory();
OMElement uepElement = AXIOMUtil.stringToOM(uepContent);
UnifiedEndpoint uep = uepFactory.createEndpoint(uepElement);
endpointURL = uep.getAddress();
} else {
String errorMsg = "Endpoint resource " + registryPath + " is not found. Failed to execute REST invocation in task " + execution.getCurrentActivityName();
throw new SOAPException(SOAP_INVOKE_ERROR_CODE, errorMsg);
}
} else {
String urlNotFoundErrorMsg = "Service URL is not provided. serviceURL must be provided.";
throw new SOAPException(SOAP_INVOKE_ERROR_CODE, urlNotFoundErrorMsg);
}
if (payload != null) {
payloadRequest = payload.getValue(execution).toString();
} else {
String payloadNotFoundErrorMsg = "Payload request is not provided. Payload must be provided.";
throw new SOAPException(SOAP_INVOKE_ERROR_CODE, payloadNotFoundErrorMsg);
}
if (soapVersion != null) {
version = soapVersion.getValue(execution).toString();
if (version.equalsIgnoreCase(SOAP12_VERSION)) {
soapVersionURI = SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI;
} else if (version.equalsIgnoreCase(SOAP11_VERSION)) {
soapVersionURI = SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI;
} else {
String invalidVersionErrorMsg = "Invalid soap version string specified";
throw new SOAPException(SOAP_INVOKE_ERROR_CODE, invalidVersionErrorMsg);
}
}
// Adding the connection
Header connectionHeader = new Header();
if (httpConnection != null) {
connection = httpConnection.getValue(execution).toString();
if (connection != null && !connection.trim().equals("Keep-Alive")) {
log.debug("Setting Keep-Alive header ");
connectionHeader.setName("Connection");
connectionHeader.setValue(connection);
headerList.add(connectionHeader);
}
}
// Adding the additional transport headers
if (transportHeaders != null) {
String headerContent = transportHeaders.getValue(execution).toString();
if (headerContent != null) {
transportHeaderList = headerContent.split(",");
for (String transportHeader : transportHeaderList) {
String[] pair = transportHeader.split(":");
Header additionalHeader = new Header();
if (pair.length == 1) {
additionalHeader.setName(pair[0]);
additionalHeader.setValue("");
if (log.isDebugEnabled()) {
log.debug("Adding transport headers " + pair[0]);
}
} else {
additionalHeader.setName(pair[0]);
additionalHeader.setValue(pair[1]);
if (log.isDebugEnabled()) {
log.debug("Adding transport headers " + pair[0] + " " + pair[1]);
}
}
headerList.add(additionalHeader);
}
}
}
// Adding the soap action
if (soapAction != null) {
action = soapAction.getValue(execution).toString();
if (log.isDebugEnabled()) {
log.debug("Setting soap action " + soapAction);
}
}
// Converting the payload to an OMElement
OMElement payLoad = AXIOMUtil.stringToOM(payloadRequest);
// Creating the Service client
ServiceClient sender = new ServiceClient();
OMElement response;
// Creating options to set the headers
Options options = new Options();
options.setTo(new EndpointReference(endpointURL));
options.setAction(action);
options.setSoapVersionURI(soapVersionURI);
options.setProperty(org.apache.axis2.transport.http.HTTPConstants.HTTP_HEADERS, headerList);
// Adding the soap header block to the SOAP Header block when creating the SOAP Envelope
if (headers != null) {
String headerContent = headers.getValue(execution).toString();
OMElement headerElement = AXIOMUtil.stringToOM(headerContent);
sender.addHeader(headerElement);
if (log.isDebugEnabled()) {
log.debug("Adding soap header " + headerContent);
}
}
// Adding the transfer encoding
if (httpTransferEncoding != null) {
transferEncoding = httpTransferEncoding.getValue(execution).toString();
if (transferEncoding.equalsIgnoreCase("chunked")) {
options.setProperty(HTTPConstants.CHUNKED, Boolean.TRUE);
if (log.isDebugEnabled()) {
log.debug("Enabling transfer encoding chunked ");
}
} else {
options.setProperty(HTTPConstants.CHUNKED, Boolean.FALSE);
if (log.isDebugEnabled()) {
log.debug("Disabling transfer encoding chunked ");
}
}
}
sender.setOptions(options);
// Invoking the endpoint
response = sender.sendReceive(payLoad);
// Getting the response as a string
String responseStr = response.toStringWithConsume();
if (outputVariable != null) {
String outVarName = outputVariable.getValue(execution).toString();
execution.setVariableLocal(outVarName, responseStr);
} else {
String outputNotFoundErrorMsg = "Output variable is not provided. " + "outputVariable must be provided to save " + "the response.";
throw new SOAPException(SOAP_INVOKE_ERROR_CODE, outputNotFoundErrorMsg);
}
} catch (AxisFault axisFault) {
log.error("Axis2 Fault", axisFault);
throw new SOAPException(SOAP_INVOKE_ERROR_CODE, "Exception while getting response :" + axisFault.getMessage());
} catch (XMLStreamException | RegistryException e) {
log.error("Exception in processing", e);
throw new SOAPException(SOAP_INVOKE_ERROR_CODE, "Exception in processing :" + e.getMessage());
}
}
use of org.wso2.carbon.registry.api.Registry in project carbon-business-process by wso2.
the class ArchiveBasedHumanTaskDeploymentUnitBuilder method readInTheWSDLFile.
/**
* Read the WSDL file given the input stream for the WSDL source
*
* @param in WSDL input stream
* @param entryName ZIP file entry name
* @param fromRegistry whether the wsdl is read from registry
* @return WSDL Definition
* @throws javax.wsdl.WSDLException at parser error
*/
public static Definition readInTheWSDLFile(InputStream in, String entryName, boolean fromRegistry) throws WSDLException {
WSDLReader reader = WSDLFactory.newInstance().newWSDLReader();
// switch off the verbose mode for all usecases
reader.setFeature(HumanTaskConstants.JAVAX_WSDL_VERBOSE_MODE_KEY, false);
reader.setFeature("javax.wsdl.importDocuments", true);
Definition def;
Document doc;
try {
doc = XMLUtils.newDocument(in);
} catch (ParserConfigurationException e) {
throw new WSDLException(WSDLException.PARSER_ERROR, "Parser Configuration Error", e);
} catch (SAXException e) {
throw new WSDLException(WSDLException.PARSER_ERROR, "Parser SAX Error", e);
} catch (IOException e) {
throw new WSDLException(WSDLException.INVALID_WSDL, "IO Error", e);
}
// Log when and from where the WSDL is loaded.
if (log.isDebugEnabled()) {
log.debug("Reading 1.1 WSDL with base uri = " + entryName);
log.debug(" the document base uri = " + entryName);
}
if (fromRegistry) {
throw new UnsupportedOperationException("This operation is not currently " + "supported in this version of WSO2 BPS.");
} else {
def = reader.readWSDL(entryName, doc.getDocumentElement());
}
def.setDocumentBaseURI(entryName);
return def;
}
use of org.wso2.carbon.registry.api.Registry in project jaggery by wso2.
the class RegistryHostObject method search.
private AdvancedSearchResultsBean search(Registry configSystemRegistry, UserRegistry registry, CustomSearchParameterBean parameters) throws CarbonException {
RegistryUtils.recordStatistics(parameters);
AdvancedSearchResultsBean metaDataSearchResultsBean;
ResourceData[] contentSearchResourceData;
String[][] tempParameterValues = parameters.getParameterValues();
// Doing a validation of all the values sent
boolean allEmpty = true;
for (String[] tempParameterValue : tempParameterValues) {
if (tempParameterValue[1] != null & tempParameterValue[1].trim().length() > 0) {
allEmpty = false;
// Validating all the dates
if (tempParameterValue[0].equals("createdAfter") || tempParameterValue[0].equals("createdBefore") || tempParameterValue[0].equals("updatedAfter") || tempParameterValue[0].equals("updatedBefore")) {
if (!SearchUtils.validateDateInput(tempParameterValue[1])) {
String message = tempParameterValue[0] + " contains illegal characters";
return SearchUtils.getEmptyResultBeanWithErrorMsg(message);
}
} else if (tempParameterValue[0].equals("mediaType")) {
if (SearchUtils.validateMediaTypeInput(tempParameterValue[1])) {
String message = tempParameterValue[0] + " contains illegal characters";
return SearchUtils.getEmptyResultBeanWithErrorMsg(message);
}
} else if (tempParameterValue[0].equals("content")) {
if (SearchUtils.validateContentInput(tempParameterValue[1])) {
String message = tempParameterValue[0] + " contains illegal characters";
return SearchUtils.getEmptyResultBeanWithErrorMsg(message);
}
} else if (tempParameterValue[0].equals("tags")) {
boolean containsTag = false;
for (String str : tempParameterValue[1].split(",")) {
if (str.trim().length() > 0) {
containsTag = true;
break;
}
}
if (!containsTag) {
String message = tempParameterValue[0] + " contains illegal characters";
return SearchUtils.getEmptyResultBeanWithErrorMsg(message);
}
if (SearchUtils.validateTagsInput(tempParameterValue[1])) {
String message = tempParameterValue[0] + " contains illegal characters";
return SearchUtils.getEmptyResultBeanWithErrorMsg(message);
}
} else {
if (SearchUtils.validatePathInput(tempParameterValue[1])) {
String message = tempParameterValue[0] + " contains illegal characters";
return SearchUtils.getEmptyResultBeanWithErrorMsg(message);
}
}
}
}
if (allEmpty) {
return SearchUtils.getEmptyResultBeanWithErrorMsg("At least one field must be filled");
}
boolean onlyContent = true;
for (String[] tempParameterValue : tempParameterValues) {
if (!tempParameterValue[0].equals("content") && !tempParameterValue[0].equals("leftOp") && !tempParameterValue[0].equals("rightOp") && tempParameterValue[1] != null && tempParameterValue[1].length() > 0) {
onlyContent = false;
break;
}
}
for (String[] tempParameterValue : tempParameterValues) {
if (tempParameterValue[0].equals("content") && tempParameterValue[1] != null && tempParameterValue[1].length() > 0) {
try {
contentSearchResourceData = search(registry, tempParameterValue[1]);
} catch (Exception e) {
metaDataSearchResultsBean = new AdvancedSearchResultsBean();
metaDataSearchResultsBean.setErrorMessage(e.getMessage());
return metaDataSearchResultsBean;
}
// If there are no resource paths returned from content, then there is no point of searching for more
if (contentSearchResourceData != null && contentSearchResourceData.length > 0) {
// Map<String, ResourceData> resourceDataMap = new HashMap<String, ResourceData>();
Map<String, ResourceData> aggregatedMap = new HashMap<String, ResourceData>();
for (ResourceData resourceData : contentSearchResourceData) {
aggregatedMap.put(resourceData.getResourcePath(), resourceData);
}
metaDataSearchResultsBean = AdvancedSearchResultsBeanPopulator.populate(configSystemRegistry, registry, parameters);
if (metaDataSearchResultsBean != null) {
ResourceData[] metaDataResourceData = metaDataSearchResultsBean.getResourceDataList();
if (metaDataResourceData != null && metaDataResourceData.length > 0) {
List<String> invalidKeys = new ArrayList<String>();
for (String key : aggregatedMap.keySet()) {
boolean keyFound = false;
for (ResourceData resourceData : metaDataResourceData) {
if (resourceData.getResourcePath().equals(key)) {
keyFound = true;
break;
}
}
if (!keyFound) {
invalidKeys.add(key);
}
}
for (String invalidKey : invalidKeys) {
aggregatedMap.remove(invalidKey);
}
} else if (!onlyContent) {
aggregatedMap.clear();
}
}
ArrayList<ResourceData> sortedList = new ArrayList<ResourceData>(aggregatedMap.values());
SearchUtils.sortResourceDataList(sortedList);
metaDataSearchResultsBean = new AdvancedSearchResultsBean();
metaDataSearchResultsBean.setResourceDataList(sortedList.toArray(new ResourceData[sortedList.size()]));
return metaDataSearchResultsBean;
} else {
metaDataSearchResultsBean = new AdvancedSearchResultsBean();
metaDataSearchResultsBean.setResourceDataList(contentSearchResourceData);
return metaDataSearchResultsBean;
}
}
}
return AdvancedSearchResultsBeanPopulator.populate(configSystemRegistry, registry, parameters);
}
use of org.wso2.carbon.registry.api.Registry in project jaggery by wso2.
the class RegistryHostObject method search.
private ResourceData[] search(UserRegistry registry, String searchQuery) throws IndexerException, RegistryException {
SolrClient client = SolrClient.getInstance();
SolrDocumentList results = client.query(searchQuery, registry.getTenantId());
if (log.isDebugEnabled())
log.debug("result received " + results);
List<ResourceData> filteredResults = new ArrayList<ResourceData>();
for (int i = 0; i < results.getNumFound(); i++) {
SolrDocument solrDocument = results.get(i);
String path = getPathFromId((String) solrDocument.getFirstValue("id"));
//if (AuthorizationUtils.authorize(path, ActionConstants.GET)){
if ((registry.resourceExists(path)) && (isAuthorized(registry, path, ActionConstants.GET))) {
filteredResults.add(loadResourceByPath(registry, path));
}
}
if (log.isDebugEnabled()) {
log.debug("filtered results " + filteredResults + " for user " + registry.getUserName());
}
return filteredResults.toArray(new ResourceData[0]);
}
Aggregations