Mule with Facebook connector - OAuth access token could not be extracted from - facebook

I m using below code to authorize Facebook API. but m getting error -
Root Exception stack trace:
java.lang.IllegalArgumentException: OAuth access token could not be extracted from: {"access_token":"EAAJmNrYXQ4wBAFJIv69EuGaeUlh8LZCAUsZBLMlp8IDbyn9JLxtOsSVb3pVn6pdJb4mTzjVCrX14fBAoEuHBIOhYBSEyjPBr0l4ahOwef9l7o4BhLtzu0bACBqee7LY48OC51BDQhmea3ZANokY4KOj9HZCN6eAZD","token_type":"bearer","expires_in":5112514}
<http:listener-config name="callback" host="localhost" port="3000" doc:name="HTTP Listener Configuration" />
<http:listener-config name="HTTP_Listener_Configuration" host="localhost" port="8081" doc:name="HTTP Listener Configuration"/>
<flow name="AutorizeFacebook" >
<http:listener config-ref="HTTP_Listener_Configuration" path="/facebookauthorize" doc:name="HTTP"/>
<facebook:authorize config-ref="Facebook" doc:name="Authorize" />
<set-session-variable doc:name="Save Access Token" value="\#[flowVars['OAuthAccessTokenId']]" variableName="accessTokenId"/>
<choice doc:name="Choice">
<when expression="#[flowVars['OAuthAccessTokenId']]!= null">
<logger message="Authorization Successful" level="INFO"
doc:name="Logger" />
<set-payload value="Facebook Authorization Successful"
doc:name="Set Payload" />
</when>
<otherwise>
<logger message="Authorization Failed" level="INFO" doc:name="Logger" />
<set-payload value="Facebook Authorization Failed"
doc:name="Set Payload" />
</otherwise>
</choice
</flow>

This error is due to change in Facebook API, accessToken is returned in a JSON string.
The Regex for the access token is \"access_token\":\"([^&]+?)\"
and for expiration time you have \"expires_in\":([^&]+?),")
Use DEVKIT to install connector to your studio by cloning facebook repo
Clone updated facebook connector project from
https://github.com/mulesoft/facebook-connector
import to studio as anypoint connector project
install connector to your studio and use facebook connector in your flows

Related

How to use Choice Pattern over Soap Request in Mule ESB?

I have an endpoint accepting Soap Requests, after this endpoint, it goes to a Transform Message which generates the appropriate request to an external web service.
What I want to do is to use the Choice Pattern to decide to which external web service I must redirect.
<http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/>
<cxf:configuration name="CXF_Configuration" enableMuleSoapHeaders="true" initializeStaticBusInstance="true" doc:name="CXF Configuration"/>
<ws:consumer-config name="Web_Service_Consumer" service="KarmaService" port="KarmaPort" serviceAddress="http://localhost:8080/TestingWS/Karma" wsdlLocation="http://localhost:8080/TestingWS/Karma?wsdl" doc:name="Web Service Consumer"/>
<flow name="testingChoice">
<http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="HTTP"/>
<cxf:proxy-service configuration-ref="CXF_Configuration" payload="body" doc:name="CXF"/>
<dw:transform-message doc:name="Transform Message">
<dw:set-payload><![CDATA[%dw 1.0
%output application/xml
%namespace ns0 http://karmapackage/
---
{
ns0#sayHello: {
arg0: payload.invoke.arg0
}
}]]></dw:set-payload>
</dw:transform-message>
<choice doc:name="Choice">
<when expression="#[payload]">
<logger message="Info1" level="INFO" doc:name="Logger"/>
</when>
<otherwise>
<logger message="Default" level="INFO" doc:name="Logger"/>
</otherwise>
</choice>
<ws:consumer config-ref="Web_Service_Consumer" operation="sayHello" doc:name="Web Service Consumer"/>
<logger message="Andando" level="INFO" doc:name="Logger"/>
</flow>
Right now, Choice is redirecting to Logger info, just to know what it is doing.
I don't know how to set the expression on the when condition to check if arg0 has the value choosePath1 for example.
I would appreciate any help,
Thanks in advance
Check this post, write xpath expression based on your transformed xml. Mule 3.4.0 Choice router based on presence of a node in payload using Xpath
Also check how to build xml xpath on mule documents
https://docs.mulesoft.com/mule-user-guide/v/3.8/xpath

I need to get value from input html FORM to using as query in database using by Mule studio

enter image description here
How can I get the value from html input from to use as query in my database in mule studio .
<http:listener-config name="HTTP_Listener_Configuration" host="localhost"
port="8081" doc:name="HTTP Listener Configuration"/>
<db:mysql-config name="MySQL_Configuration" host="localhost" port="3306"
user="root" password="Blue1234" database="news" doc:name="MySQL Configuration"/>
<flow name="searchhtmlFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="/web" doc:name="HTTP"/>
<db:select config-ref="MySQL_Configuration" doc:name="Database">
<db:parameterized-query><![CDATA[select txt from news.nws where sub=#[message.inboundProperties[q]]]]></db:parameterized-query>
</db:select>
<parse-template location="C:\Users\Hersh\Desktop\attach\index.html" doc:name="Parse Template"/>
<set-property propertyName="content" value="#[message.inboundProperties.'http.query.params'.q]" doc:name="Property"/>
</flow>
Try this out :-
<http:listener-config name="HTTP_Listener_Configuration" host="localhost"
port="8081" doc:name="HTTP Listener Configuration"/>
<db:mysql-config name="MySQL_Configuration" host="localhost" port="3306"
user="root" password="Blue1234" database="news" doc:name="MySQL Configuration"/>
<flow name="searchhtmlFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="/web" doc:name="HTTP"/>
<parse-template location="C:\Users\Hersh\Desktop\attach\index.html" doc:name="Parse Template"/>
<logger message="Value from DB :- #[message.inboundProperties.'http.query.params'.q]" level="INFO" doc:name="Logger"/>
<db:select config-ref="MySQL_Configuration" doc:name="Database">
<db:parameterized-query><![CDATA[select txt from news.nws where sub=#[message.inboundProperties[q]]]]></db:parameterized-query>
</db:select>
<logger message="#[payload]" level="INFO" doc:name="Logger"/>
</flow>

Mule Set JSESSIONID from first into 2nd REST request or how to put the cookie through

for my Thesis I'm integrating Bonita BPM into a Mule SOA.
To start a new case or process-instance in Bonita I have to call the Bonita REST. First I have to authenticate with that Bonita REST. And here starts my problem.
The authentication works like "You have to call the loginservice and put the responding cookie in all future request".
How could this be done inside a mule flow ? Some articles told me that copy-properties propertyName="JSESSIONID" should do that. But this does not work.
Does anybody have a idea ?
Further heres my flow and the related print messages:
PRINT1 : CopyPropertiesTransformer: Property value for is null, no property will be copied
PRINT 2 : LoggerMessageProcessor: {Set-Cookie=JSESSIONID=F60114E3ECB450A62171E3D63EAC3E4D; Path=/bonita/; HttpOnly}
PRINT 3 : Response code 401 mapped as failure. Message payload is of type: BufferInputStream
<http:request-config name="bos" host="localhost"
port="8080" basePath="/bonita" doc:name="bos-connection" />
<flow name="sendOrderFlow">
<http:listener config-ref="HTTP_Listener_Configuration"
path="/" doc:name="HTTP" />
<http:request config-ref="bos" path="loginservice"
method="GET" followRedirects="false" doc:name="bos-login">
<http:request-builder>
<http:query-param paramName="username" value="walter.bates" />
<http:query-param paramName="password" value="bpm" />
</http:request-builder>
</http:request>
<copy-properties propertyName="JSESSIONID" /> <!-- PRINT 1 HERE -->
<logger message="#[headers:INBOUND:Set-Cookie]" level="INFO" /> <!-- PRINT 2 HERE -->
<http:request config-ref="bos"
path="API/bpm/process" method="GET" followRedirects="false" doc:name="bos-listAvailableProcesses">
<http:request-builder>
<http:query-param paramName="p" value="0" />
</http:request-builder>
</http:request>
Additionally to JSESSIONID you also need to include X-Bonita-API-Token in HTTP header. The value of this header is provide as a cookie sent with the answer to the authentication (i.e. the call to loginservice).

Insert SOAP web service payload into JMS using Mule

I have the following Mule flow. What I'm trying to achieve is simply to put the SOAP message into the JMS queue.
The content of the message in the JMS queue is
org.mule.module.xml.stax.ReversibleXMLStreamReader#3c7e9afa
What am I missing in the transformer?
<object-to-string-transformer name="Object_to_String" doc:name="Object to String"/>
<flow name="soapServiceFlow">
<http:listener config-ref="SOAP_JMS_HTTP_Listener_Configuration" path="/soap" doc:name="HTTP"/>
<cxf:proxy-service
configuration-ref="CXF_Configuration"
doc:name="CXF"
payload="envelope"
wsdlLocation="service.wsdl"
namespace="http://www.examples.com/wsdl/ReportService"
port="ReportPort"
service="ReportService" />
<logger message="#[payload]" level="INFO" doc:name="Logger"/>
<jms:outbound-endpoint queue="my.requests" connector-ref="Active_MQ" doc:name="JMS" transformer-refs="Object_to_String">
<jms:transaction action="NONE"/>
</jms:outbound-endpoint>
</flow>
This is a transformation error and you can simply use object-to-string-transformer to make it work:-
<object-to-string-transformer doc:name="Object to String"/>
before your JMS outbound
Before the logger, add <object-to-string-transformer doc:name="Object to String"/> for you to see the string content of the class org.mule.module.xml.stax.ReversibleXMLStreamReader#3c7e9afa

Controlling number of threads in Mule

I'm using Mule 3.3.1 Community Edition.
I have a flow that accepts HTTP requests. This runs successfully.
<flow name="TestFlow">
<http:inbound-endpoint exchange-pattern="request-response"
host="localhost" port="8088" path="test" doc:name="HTTP" mimeType="text/plain"
encoding="UTF-8"/>
<logger level="INFO" category="hello" doc:name="Logger"/>
</flow>
The service needs to be single-threaded so that messages are handled strictly in the order in which they are received. My thought was to set maxThreadsActive=1 and maxBufferSize=100 to get my desired behavior. However, I can't get any control over threads to work.
At this point I'm just trying to get a thread profile working, regardless of the number of threads. I added a threading-profile exactly out of the current version of the Manning book Mule in Action, but Mule rejects it as "Invalid content" and won't run.
<flow name="TestFlow">
<threading-profile maxBufferSize="100" maxThreadsActive="20" maxThreadsIdle="10"
threadTTL="60000" poolExhaustedAction="RUN" />
<http:inbound-endpoint exchange-pattern="request-response"
host="localhost" port="8088" path="test" doc:name="HTTP" mimeType="text/plain"
encoding="UTF-8"/>
<logger level="INFO" category="hello" doc:name="Logger"/>
</flow>
I commented that out and moved up to a configuration block.
<configuration>
<default-threading-profile maxThreadsActive="20" maxBufferSize="100"
poolExhaustedAction="RUN" />
</configuration>
<flow name="TestFlow">
<http:inbound-endpoint exchange-pattern="request-response"
host="localhost" port="8088" path="test" doc:name="HTTP" mimeType="text/plain"
encoding="UTF-8"/>
<logger level="INFO" category="hello" doc:name="Logger"/>
</flow>
Mule accepts this, but the service no longer returns; the client simply hangs waiting for a response.
How do I configure my flow so that I can control thread pool size and, once that's done, so that only one thread is available in the pool?
You need to configure the receiver-threading-profile of the HTTP connector:
<http:connector name="httpConnector">
<receiver-threading-profile maxThreadsActive="1" />
</http:connector>