Elfin EW11 TCP Client does not send data - tcpclient

I want to use an Elfin EW11 device as a Modbus TCP Client/Master to send requests to a Modbus TCP Server/Slave (another Elfin EW11). It is connected via RS485 to my Test-Computer/PC.
PC ---RS485--> Elfin EW11 TCP Client ---WLAN---> Elfin EW11 TCP Server---RS485--->IOT Device
The Elfin EW11 Modbus TCP Client should reveive requests from ts RS485 Interface and send them via WLAN to the Modbus TCP Server.
It appears in its status-page, that
it is connected to the server
2, receives requests from RS485, but
does not send anything to the server
See screenshot of the status page of the Modbus TCP Client
Screenshot1
I already tried
a. the Modbus TCP server. It responds well when queried directly from my PC via WLAN
b. several options,timeouts etc. in the configuration of the TCP Client. Without success.
No data were transmitted from the TCP Client to the TCP Server
I would have expected at least that some bytes were transferred, even if the Modbus request would be wrong.
INSERT: I am quite sure that the frames/modbus requests sent from my PC are in the correct format (See my comments below)
Anyone got an Elfin EW11 working as a Modbus TCP Client?
My Client Config (backup XML):
<!--SYS Config-->
<SYS key='User' value='admin'>
<SYS key='Password' value='admin'>
<SYS key='DHCP' value='Enable'>
<SYS key='Ip Address' value='10.10.100.10'>
<SYS key='GateWay' value='10.10.100.254'>
<SYS key='Mask' value='255.255.255.0'>
<SYS key='Host Name' value='EW11-DTU'>
<SYS key='DNS' value='223.5.5.5'>
<SYS key='Telnet' value='Disable'>
<SYS key='Telnet Port' value='23'>
<SYS key='Echo' value='Enable'>
<SYS key='Web' value='Enable'>
<SYS key='Web Port' value='80'>
<SYS key='Ipv6' value='Disable'>
<SYS key='Ipv6 address' value=''>
<SYS key='Ipv6 DHCP' value='Disable'>
<SYS key='NTP' value='Disable'>
<SYS key='NTP Server' value=''>
<SYS key='NTP Port' value='0'>
<SYS key='NTP GMT' value='8'>
<SYS key='Customer ID' value='EW11'>
<SYS key='Config Version' value='0'>
<SYS key='NetworkMode' value='Router'>
<SYS key='WiFiMode' value='APSTA'>
<SYS key='WiFiAPSSID' value='EW11_F330'>
<SYS key='WiFiAPKey' value=''>
<SYS key='WiFiSTASSID' value='myWLAN'>
<SYS key='WiFiSTAKey' value='xxxxxxxxxx'>
<SYS key='WiFiAPCH' value='0'>
<SYS key='WiFiHideSSID' value='0'>
<SYS key='WiFiRoamingEn' value='0'>
<SYS key='ScanRSSIThreshold' value='0'>
<SYS key='ConnectRSSIThreshold' value='0'>
<SYS key='LanIpAddress' value='10.10.100.254'>
<SYS key='LanMarsk' value='255.255.255.0'>
<SYS key='LanDhcpEn' value='Enable'>
<SYS key='EthernetMode' value='WAN'>
<SYS key='Longitude' value='0.000000'>
<SYS key='Latitude' value='0.000000'>
<SYS key='SmartConfig' value='SmartLink'>
<SYS key='ModbusTime' value='0'>
<!--UART Config-->
<UART key='Baudrate' value='9600'>
<UART key='Databits' value='8'>
<UART key='Stopbits' value='1'>
<UART key='Parity' value='NONE'>
<UART key='FlowCtrl' value='Half-Duplex'>
<UART key='Software FlowCtrl' value='Disable'>
<UART key='Xon' value='11'>
<UART key='Xoff' value='13'>
<UART key='Protocol' value='Modbus'>
<UART key='Frame Length' value='16'>
<UART key='Frame Time' value='100'>
<UART key='Tag Enable' value='Disable'>
<UART key='Tag Head' value='00'>
<UART key='Tag Tail' value='00'>
<UART key='Buffer Size' value='512'>
<UART key='gapTime Size' value='50'>
<UART key='cliGetin' value='1'>
<UART key='serialStr' value='+++'>
<UART key='waitTime' value='300'>
<!--SOCK Config-->
<SOCK name='netp' key='Name' value='netp'>
<SOCK name='netp' key='Protocol' value='TCP-CLIENT'>
<SOCK name='netp' key='Server Addr' value='10.0.0.2'>
<SOCK name='netp' key='Remote Port' value='502'>
<SOCK name='netp' key='Local Port' value='0'>
<SOCK name='netp' key='Buffer Size' value='8192'>
<SOCK name='netp' key='KeepAlive' value='32'>
<SOCK name='netp' key='Timeout' value='60'>
<SOCK name='netp' key='Security' value='NONE'>
<SOCK name='netp' key='HeartBeat' value='Disable'>
<SOCK name='netp' key='Regist Mode' value='Disable'>
<SOCK name='netp' key='Regist Code' value=''>
<SOCK name='netp' key='Connect Mode' value='Always'>
<SOCK name='netp' key='VcomEn' value='0'>
<SOCK name='netp' key='Rout' value='uart'>
<!--CRC Config-->
<CRC key='CheckNum' value='231438'>
Server Config:
<!--SYS Config-->
<SYS key='User' value='admin'>
<SYS key='Password' value='admin'>
<SYS key='DHCP' value='Enable'>
<SYS key='Ip Address' value='10.10.100.10'>
<SYS key='GateWay' value='10.10.100.254'>
<SYS key='Mask' value='255.255.255.0'>
<SYS key='Host Name' value='EW11-DTSU666-H'>
<SYS key='DNS' value='223.5.5.5'>
<SYS key='Telnet' value='Disable'>
<SYS key='Telnet Port' value='23'>
<SYS key='Echo' value='Enable'>
<SYS key='Web' value='Enable'>
<SYS key='Web Port' value='80'>
<SYS key='Ipv6' value='Disable'>
<SYS key='Ipv6 address' value=''>
<SYS key='Ipv6 DHCP' value='Disable'>
<SYS key='NTP' value='Disable'>
<SYS key='NTP Server' value=''>
<SYS key='NTP Port' value='0'>
<SYS key='NTP GMT' value='8'>
<SYS key='Customer ID' value='EW11'>
<SYS key='Config Version' value='0'>
<SYS key='NetworkMode' value='Router'>
<SYS key='WiFiMode' value='STA'>
<SYS key='WiFiAPSSID' value='EW11_F0FC'>
<SYS key='WiFiAPKey' value=''>
<SYS key='WiFiSTASSID' value='myWLAN'>
<SYS key='WiFiSTAKey' value='xxxxxxxx'>
<SYS key='WiFiAPCH' value='0'>
<SYS key='WiFiHideSSID' value='0'>
<SYS key='WiFiRoamingEn' value='0'>
<SYS key='ScanRSSIThreshold' value='0'>
<SYS key='ConnectRSSIThreshold' value='0'>
<SYS key='LanIpAddress' value='10.0.0.2'>
<SYS key='LanMarsk' value='255.255.255.0'>
<SYS key='LanDhcpEn' value='Enable'>
<SYS key='EthernetMode' value='WAN'>
<SYS key='Longitude' value='0.000000'>
<SYS key='Latitude' value='0.000000'>
<SYS key='SmartConfig' value='SmartLink'>
<SYS key='ModbusTime' value='0'>
<!--UART Config-->
<UART key='Baudrate' value='9600'>
<UART key='Databits' value='8'>
<UART key='Stopbits' value='1'>
<UART key='Parity' value='NONE'>
<UART key='FlowCtrl' value='Half-Duplex'>
<UART key='Software FlowCtrl' value='Disable'>
<UART key='Xon' value='11'>
<UART key='Xoff' value='13'>
<UART key='Protocol' value='Modbus'>
<UART key='Frame Length' value='16'>
<UART key='Frame Time' value='100'>
<UART key='Tag Enable' value='Disable'>
<UART key='Tag Head' value='00'>
<UART key='Tag Tail' value='00'>
<UART key='Buffer Size' value='512'>
<UART key='gapTime Size' value='50'>
<UART key='cliGetin' value='1'>
<UART key='serialStr' value='+++'>
<UART key='waitTime' value='300'>
<!--SOCK Config-->
<SOCK name='netp' key='Name' value='netp'>
<SOCK name='netp' key='Protocol' value='TCP-SERVER'>
<SOCK name='netp' key='Server Addr' value='0.0.0.0'>
<SOCK name='netp' key='Remote Port' value='0'>
<SOCK name='netp' key='Local Port' value='502'>
<SOCK name='netp' key='Buffer Size' value='8192'>
<SOCK name='netp' key='KeepAlive' value='32'>
<SOCK name='netp' key='Timeout' value='600'>
<SOCK name='netp' key='Security' value='NONE'>
<SOCK name='netp' key='Connect Mode' value='Always'>
<SOCK name='netp' key='VcomEn' value='0'>
<SOCK name='netp' key='Rout' value='uart'>
<SOCK name='netp' key='maxAccept' value='3'>
<!--CRC Config-->
<CRC key='CheckNum' value='222713'>

Related

Authenticating a user with j_security_check in Java EE 7

I practise Java EE 7 nowadays. I come across a problem when trying to authenticate a user by using container provided way, i.e., j_security_check .
Application server: Apache Tomcat 7
Project/Application name: ServletDrill
Resource (Servlet) annotated with #WebServlet
My Web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>ServletDrill</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<security-constraint>
<web-resource-collection>
<web-resource-name>To_Auth</web-resource-name>
<url-pattern>/auth/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>valid</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/FormAuth.jsp</form-login-page>
<form-error-page>/LogInErr.jsp</form-error-page>
</form-login-config>
</login-config>
</web-app>
My tomcat-users.xml:
<tomcat-users>
<role rolename="valid"/>
<user username="username" password="pass" roles="valid"/>
</tomcat-users>
My <form>:
<form action="/ServletDrill/j_security_check" accept-charset="UTF-8" method="post">
<fieldset id="postForm">
<legend>j_security_check method</legend>
<div class="partContainer">
<div class="left"><label for="user" >User Name: </label></div>
<div class="right"><input type="text" name="j_username" id="user" required="required" maxlength="20"></div>
</div>
<hr/>
<div class="partContainer">
<div class="left"><label for="pass" >Pass: </label></div>
<div class="right"><input type="password" name="j_password" id="pass" required="required" maxlength="20"></div>
</div>
<hr/>
<div class="partContainer">
<div class="left"><input type="submit" value="Log In"></div>
<div class="right"><input type="reset" value="Reset"></div>
</div>
</fieldset>
</form>
My protected resource (Servlet):
#WebServlet("/auth/NeedsPriorAuth")
public final class NeedsPriorAuth extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("Welcome, "+request.getRemoteUser()+". The user has been authenticated before hand").append("\n Auth Type: "+request.getAuthType());
}
}
When I execute the following link,
Access Protected Servlet
,the user redirected for authentication on the following page,
<form-login-page>/FormAuth.jsp</form-login-page>
(the <form> that I posted above).
Despite passing in correct credentials (posted above at tomcat-users.xml) the user redirected to the following Error page (posted above at Web.xml):
<form-error-page>/LogInErr.jsp</form-error-page>
What is the culprit which causes such an inconvenience for me? I've been stuck on this problem for several days now.
What about <realm>, do I need it?
Any ideas?
There you go, in the end, I have resolved the problem. The modification that I needed to apply:
<form action="j_security_check" accept-charset="UTF-8" method="post">
That is, the action has no application context prefix.
The other thing, is that there are, in my case, 2 instances of tomcat-users.xml file:
Under Apache Tomcat v7 directory (The server app)
And the one accessible from Project Explorer in Eclipse, under Servers2 name
When you modify the role(s), username, and password, if you want to see an affect to take place, modify it under the latter instance example; the server restart comes after.

Internal Server Error in Net4india server

To deploy the project I have purchased java server online with www.net4.in and created the database using phpmyadmin access given by them. I have deployed the project by transferring .war file of my project.
I have adjusted all the links like:
servlet path
form submission path
web.xml
all the required ones.
In servlet path if I add .java to servlet it is showing the code online, however the same path is giving error when I am submitting the form to Servlet.
<html>
<body>
<form id="theForm" name="form1" method="post" action="../../../db/src/com/mayuri/servlet/SelectCustServlet" enctype="multipart/form-data" target="_self" onSubmit="return verify()">
<fieldset class="login"><br>
<legend>Customer Details - Fill Customer Details</legend>
<div>
<label for="Ac_No">Account Number</label>
<input type="text" id="Ac_No" name="Ac_No" autocomplete="off" onKeyPress="return IsNumeric(event);" ondrop="return false;" onpaste="return false;" />
</div>
<div>
<label for="Center_No">Center Number</label> <input type="text" id="Center_No" autocomplete="off" class="input username" name="Center_No" onkeypress="return IsNumeric(event);" ondrop="return false;" onpaste="return false;" />
</div>
</fieldset><br>
<center>
<button type="submit" >Submit</button>
</center>
</form>
</body>
</html>
Servlet Code
package com.mayuri.servlet;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
/**
* Servlet implementation class FileUploadDBServlet
*/
//#WebServlet("/FileUploadDBServlet")
#MultipartConfig(maxFileSize = 10177215) // upload file's size up to 16MB
public class SelectCustServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* #see HttpServlet#HttpServlet()
*/
public SelectCustServlet() {
super();
}
private String dbURL = "jdbc:mysql://118.67.244.52/databasename";
private String dbUser = "loginid";
private String dbPass = "pwd";
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
Connection conn = null; // connection to the database
PrintWriter out = response.getWriter();
String message = null; // message will be sent back to client
try {
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
conn = DriverManager.getConnection(dbURL, dbUser, dbPass);
// gets values of text fields
String Ac_No = request.getParameter("Ac_No");
System.out.println("in Servlettttttttttttttttttttttttt" + Ac_No);
String Center_No = request.getParameter("Center_No");
try {
// connects to the database
// constructs SQL statement
String sql = "INSERT INTO cust (Ac_No, Center_No ) values (?,?)";
PreparedStatement statement = conn.prepareStatement(sql);
statement.setString(1, Ac_No);
statement.setString(2, Center_No);
out.println("dfsfsdf");
// sends the statement to the database server
int row = statement.executeUpdate();
if (row > 0) {
// message = "File uploaded and saved into database";
}
} catch (SQLException ex) {
message = "ERROR: " + ex.getMessage();
ex.printStackTrace();
}
} catch (SQLException ex) {
message = "ERROR: " + ex.getMessage();
ex.printStackTrace();
} finally {
if (conn != null) {
// closes the database connection
try {
conn.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
// sets the message in request scope
// request.setAttribute("Message", message);
// forwards to the message page
//request.getRequestDispatcher("Message.jsp").forward(request, response);
}
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>softwarematcs</display-name>
<servlet>
<description></description>
<display-name>SelectCustServlet</display-name>
<servlet-name>SelectCustServlet</servlet-name>
<servlet-class>db.src.com.mayuri.servlet.SelectCustServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SelectCustServlet</servlet-name>
<url-pattern>../../src/com/mayuri/servlet/SelectCustServlet</url-pattern>
</servlet-mapping>
</web-app>
Use short and valid Servlet URL pattern and don't forget to prefix form action with context root path. Servlet URL pattern shows in the browser URL.
Either use JSP Expression Language ${pageContext.request.contextPath} or core tag library <c:url> for getting context root relative URL path.
For example:
JSP:
<form action="${pageContext.request.contextPath}/myServlet" method="post">
web.xml:
<servlet>
<servlet-name>SelectCustServlet</servlet-name>
<servlet-class>db.src.com.mayuri.servlet.SelectCustServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SelectCustServlet</servlet-name>
<url-pattern>/myServlet</url-pattern>
</servlet-mapping>
Read more...
Try the following pieces of code. I've modified the web.xml to the correct servlet-class name com.mayuri.servlet.SelectCustServlet and the servlet's url-pattern to /SelectCustServlet.
Also, I've updated the HTML form's action to the correct servlet url pattern.
HTML form:
<html>
<body>
<form id="theForm" name="form1" method="post" action="<%=request.getContextPath()%>/SelectCustServlet" enctype="multipart/form-data" target="_self" onSubmit="return verify()">
<fieldset class="login"><br>
<legend>Customer Details - Fill Customer Details</legend>
<div>
<label for="Ac_No">Account Number</label>
<input type="text" id="Ac_No" name="Ac_No" autocomplete="off" onKeyPress="return IsNumeric(event);" ondrop="return false;" onpaste="return false;" />
</div>
<div>
<label for="Center_No">Center Number</label> <input type="text" id="Center_No" autocomplete="off" class="input username" name="Center_No" onkeypress="return IsNumeric(event);" ondrop="return false;" onpaste="return false;" />
</div>
</fieldset><br>
<center>
<button type="submit" >Submit</button>
</center>
</form>
</body>
</html>
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>softwarematcs</display-name>
<servlet>
<description></description>
<display-name>SelectCustServlet</display-name>
<servlet-name>SelectCustServlet</servlet-name>
<servlet-class>com.mayuri.servlet.SelectCustServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SelectCustServlet</servlet-name>
<url-pattern>/SelectCustServlet</url-pattern>
</servlet-mapping>
</web-app>

WSO2 APIM The system cannot infer the transport information from the /devtest/1.0/users/admin

Hi I have an API with a custom sequence (dblookup & switch sequence) that will verify if a user is existing on the database, if not it should send a http status 401: Unauthorized, below is the case code but I always get an error cannot infer the transport information. What is the correct way of sending the back the response message.
THanks,
Drew
<case regex="0">
<log level="custom">
<property name="ucount" expression="fn:concat('User login - ', get-property('employee_count'))"/>
</log>
<send>
<property name="RESPONSE" value="true" scope="default"/>
<property name="NO_ENTITY_BODY" action="remove" scope="axis2"/>
<property name="HTTP_SC" value="401" scope="axis2"/>
<header name="To" action="remove"/>
<payloadFactory media-type="xml">
<format>
<response>
<result>Unauthorized</result>
</response>
</format>
<args/>
</payloadFactory>
<send/>
</case>
ERROR:
TID: [0] [AM] [2014-12-02 08:16:30,852] ERROR {org.apache.synapse.core.axis2.Axis2Sender} - Unexpected error during sending message out {org.apache.synapse.core.axis2.Axis2Sender}
org.apache.axis2.AxisFault: The system cannot infer the transport information from the /devtest/1.0/users/admin URL.
at org.apache.axis2.description.ClientUtils.inferOutTransport(ClientUtils.java:81)
at org.apache.synapse.core.axis2.DynamicAxisOperation$DynamicOperationClient.executeImpl(DynamicAxisOperation.java:115)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:149)
at org.apache.synapse.core.axis2.Axis2FlexibleMEPClient.send(Axis2FlexibleMEPClient.java:482)
at org.apache.synapse.core.axis2.Axis2Sender.sendOn(Axis2Sender.java:59)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.send(Axis2SynapseEnvironment.java:338)
at org.apache.synapse.mediators.builtin.SendMediator.mediate(SendMediator.java:94)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:77)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:47)
at org.apache.synapse.config.xml.AnonymousListMediator.mediate(AnonymousListMediator.java:30)
at org.apache.synapse.config.xml.SwitchCase.mediate(SwitchCase.java:66)
at org.apache.synapse.mediators.filters.SwitchMediator.mediate(SwitchMediator.java:123)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:77)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:47)
at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:131)
at org.wso2.carbon.apimgt.gateway.handlers.ext.APIManagerExtensionHandler.mediate(APIManagerExtensionHandler.java:64)
at org.wso2.carbon.apimgt.gateway.handlers.ext.APIManagerExtensionHandler.handleRequest(APIManagerExtensionHandler.java:180)
at org.apache.synapse.rest.API.process(API.java:285)
at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:83)
at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:64)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:220)
at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:83)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:344)
at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:168)
at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
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:744)
TID: [0] [AM] [2014-12-02 08:16:30,853] INFO {org.apache.synapse.mediators.builtin.LogMediator} - STATUS = Executing default 'fault' sequence, ERROR_CODE = 0, ERROR_MESSAGE = Unexpected error during sending message out {org.apache.synapse.mediators.builtin.LogMediator}
Within send mediator you can not define other mediators.
Correct like this;
<property name="RESPONSE" value="true" scope="default"/>
<property name="NO_ENTITY_BODY" action="remove" scope="axis2"/>
<property name="HTTP_SC" value="401" scope="axis2"/>
<header name="To" action="remove"/>
<payloadFactory media-type="xml">
<format>
<response>
<result>Unauthorized</result>
</response>
</format>
<args/>
</payloadFactory>
<send>
endpoint>
<address uri="ADDRESS OF YOUR ENDPOINT"/>
</endpoint>
</send>
In my case there were invisible characters prepended to otherwise correct (Production/Sandbox) URL.
WSO2 seems very strict and didn't manage to interpret such definition, resulting in vague error:
The system cannot infer the transport information from the https://...
Notice the two spaces between the and https. It may have been a tabulator character.

Spring Security redirects to forbidden page(403)

I am using spring-security on top of spring-mvc application. Few points about the application I am working on.
Home page is login page i.e /users(). Login menu served as HTML dropdown menu.
Implementing userDetailsService() and UserDetails() instead of AuthenticationManager/provider
Required is person to view the home page without any roles.
Current situation :
Redirects it to 403 page mentioned in the entrypoint-ref.
No idea how to redirect it to user.jsp or /users
All examples I can find on net somehow show same stuff which is implementing `AuthenticationManager. Some code :
security-context.xml
<import resource="servlet-context.xml" />
<!-- Global Security settings -->
<security:global-method-security pre-post-annotations="enabled" />
<!-- Spring Security framework settings -->
<security:http pattern="/users" use-expressions="true" auto-config="true" disable-url-rewriting="true" entry-point-ref="formAuthenticationEntryPoint">
<security:session-management>
<security:concurrency-control max-sessions="5" error-if-maximum-exceeded="false"/>
</security:session-management>
<security:intercept-url pattern="/*" requires-channel="any" access="permitAll" />
<security:intercept-url pattern="/**" requires-channel="any" access="permitAll" />
</security:http>
<!-- queries to be run on data -->
<beans:bean id="formAuthenticationEntryPoint"
class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint"/>
<bean id="LoginServiceImplementation" class="com.WirTauschen.service.LoginServiceImpl"></bean>
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider user-service-ref="userDetailsService" />
</security:authentication-manager>
</beans>
LoginServiceImpl :
#Service("userDetailsService")
public class LoginServiceImpl implements UserDetailsService{
#Autowired private UserDao userDao;
#Autowired private Assembler assembler;
#Override
#Transactional
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserDetails userDetails = null;
User user = userDao.findByName(username);
if(user == null) { throw new UsernameNotFoundException("Wrong username or password");} //Never specify which one was it exactly
return assembler.buildUserFromUserEntity(user);
}
}
Login-form(part of hompage HTML code enveloped in user.jsp)
<nav class="col-lg-5 col-md-5 col-sm-5">
<ul class="pull-right">
<li class="purple"><i class="icons icon-user-3"></i> Login
<ul id="login-dropdown" class="box-dropdown">
<li>
<form id="form" action="<c:url value='/login'/>" method="POST">
<div class="box-wrapper">
<h4>LOGIN</h4>
<div class="iconic-input">
<input type="text" placeholder="Username" name="username" id="username" value="">
<i class="icons icon-user-3"></i>
</div>
<div class="iconic-input">
<input type="password" placeholder="Password" name="password" id="password" value="">
<i class="icons icon-lock"></i>
</div>
<input type="checkbox" id="loginremember"> <label for="loginremember">Remember me</label>
<br>
<br>
<div class="pull-left">
<input name="submit" type="submit" class="orange" value="Login">
</div>
<div class="pull-right">
Forgot your password?
<br>
Forgot your username?
<br>
</div>
<br class="clearfix">
</div>
<div class="footer">
<h4 class="pull-left">NEW CUSTOMER?</h4>
<a class="button pull-right" href="create_an_account.html">Create an account</a>
</div>
</form>
</li>
</ul>
</li>
<li><i class="icons icon-lock"></i> Create an Account</li>
</ul>
</nav>
Form-login from security-applicationContext.xml
<security:form-login login-page="/users" default-target-url="/users"/>
Any help would be nice. Never knew spring-security will be nothing but torture.
UPDATE
You have to understand how Spring works: the client tries to get to a protected resource (users page, for example); if he did not login yet, he is being redirected (Spring redirects him) to the login page.
In your Spring beans.xml you declare what is your login page. If you put there "/login.html", you have to make sure that you have this kind of page, with the login form. After the user logs in, Spring will redirect him back to the /users.
Makes sense?
UPDATE II
You can make (like Amazon...) a landing page (e.g. index.html) which is public, meaning users can see it without logging in. Then, there are links there to 'protected resources', and if a user try to click on it and get the protected resource, Spring will redirect him to the login page. If you wanna do that, you put you 'protected resources' under a specific directory (e.g. /secured) and you place there all protected resources HTML/JSP/etc. You configure this in the beans.xml: (note here that 'welcome' page is non-secured, everybody will be able to see it without login)
<sec:http pattern="/welcome" security="none" />
<sec:http authentication-manager-ref="authenticationManager">
<sec:intercept-url pattern="/secure/**" access="ROLE_USER" />

Using Records Across Flows in Mule 3.4

I want to select records from a database and use them across different flows in mule.
My approach is to get the records using a Spring bean and pass it to a hashmap then return the hashmap and save it in a session variable.
Currently getting this error:
Message : Execution of the expression "message.payload.getServiceCodes()" failed. (org.mule.api.expression.ExpressionRuntimeException). Message payload is of type: HashMap
Code : MULE_ERROR--2
Its there a better approach? Or what I'm I doing wrong?
My Configuration XML
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" xmlns:quartz="http://www.mulesoft.org/schema/mule/quartz" xmlns:jdbc-ee="http://www.mulesoft.org/schema/mule/ee/jdbc" xmlns:mulexml="http://www.mulesoft.org/schema/mule/xml" xmlns:data-mapper="http://www.mulesoft.org/schema/mule/ee/data-mapper" xmlns:xm="http://www.mulesoft.org/schema/mule/xml" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:file="http://www.mulesoft.org/schema/mule/file" xmlns:jms="http://www.mulesoft.org/schema/mule/jms" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans" version="EE-3.4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.mulesoft.org/schema/mule/ee/jdbc http://www.mulesoft.org/schema/mule/ee/jdbc/current/mule-jdbc-ee.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/xml http://www.mulesoft.org/schema/mule/xml/current/mule-xml.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/jms http://www.mulesoft.org/schema/mule/jms/current/mule-jms.xsd
http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/ee/data-mapper http://www.mulesoft.org/schema/mule/ee/data-mapper/current/mule-data-mapper.xsd
http://www.mulesoft.org/schema/mule/quartz http://www.mulesoft.org/schema/mule/quartz/current/mule-quartz.xsd
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd">
<jms:activemq-connector name="Active_MQ" brokerURL="tcp://localhost:61616" validateConnections="true" doc:name="Active MQ"></jms:activemq-connector>
<xm:jaxb-context name="myJaxb" doc:name="myJaxb" packageNames="com.test.jaxb"></xm:jaxb-context>
<spring:beans>
<spring:bean id="springDataSource" name="Bean" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<spring:property name="url" value="jdbc:mysql://localhost:3306/muledb"></spring:property>
<spring:property name="maxActive" value="30"></spring:property>
<spring:property name="removeAbandoned" value="true"></spring:property>
<spring:property name="driverClassName" value="com.mysql.jdbc.Driver"></spring:property>
<spring:property name="initialSize" value="20"></spring:property>
<spring:property name="username" value="root"></spring:property>
</spring:bean>
</spring:beans>
<quartz:connector name="quartzConnector" doc:name="Quartz">
<quartz:factory-property key="org.quartz.scheduler.instanceName" value="MuleScheduler1"></quartz:factory-property>
<quartz:factory-property key="org.quartz.threadPool.class" value="org.quartz.simpl.SimpleThreadPool"></quartz:factory-property>
<quartz:factory-property key="org.quartz.threadPool.threadCount" value="3"></quartz:factory-property>
<quartz:factory-property key="org.quartz.scheduler.rmi.proxy" value="false"></quartz:factory-property>
<quartz:factory-property key="org.quartz.scheduler.rmi.export" value="false"></quartz:factory-property>
<quartz:factory-property key="org.quartz.jobStore.class" value="org.quartz.simpl.RAMJobStore"></quartz:factory-property>
</quartz:connector>
<jdbc-ee:mysql-data-source name="MySQL_Data_Source" user="root" password="" url="jdbc:mysql://localhost:3306/muledb" transactionIsolation="UNSPECIFIED" doc:name="MySQL Data Source"></jdbc-ee:mysql-data-source>
<jdbc-ee:connector name="Database" dataSource-ref="MySQL_Data_Source" validateConnections="true" transactionPerMessage="false" queryTimeout="-1" pollingFrequency="0" doc:name="Database"></jdbc-ee:connector>
<!-- <flow name="JMSMessageFlow1" doc:name="JMSMessageFlow1" >
<jdbc-ee:inbound-endpoint queryKey="FirstUpdate" queryTimeout="-1" connector-ref="Database" doc:name="Database" pollingFrequency="0">
<jdbc-ee:query key="FirstUpdate" value="SELECT * FROM gcp_txn_log WHERE PROCESSED= 'Y'"></jdbc-ee:query>
<jdbc-ee:query key="FirstUpdate.ack" value="update gcp_txn_log set PROCESSED='N' where service_id = #[map-payload:service_id]"></jdbc-ee:query>
</jdbc-ee:inbound-endpoint>
<logger level="INFO" doc:name="Logger"/>
</flow> -->
<!-- <flow name="JMSMessageFlow2" doc:name="JMSMessageFlow2">
<jdbc-ee:inbound-endpoint queryKey="SelectAll" queryTimeout="-1" connector-ref="Database" doc:name="Database" pollingFrequency="0">
<jdbc-ee:transaction action="ALWAYS_BEGIN"></jdbc-ee:transaction>
<jdbc-ee:query key="SelectAll" value="SELECT * FROM gcp_txn_log WHERE PROCESSED= 'N'"></jdbc-ee:query>
<jdbc-ee:query key="SelectAll.ack" value="update gcp_txn_log set PROCESSED='Y' where service_id = #[map-payload:service_id] "></jdbc-ee:query>
</jdbc-ee:inbound-endpoint>
<xm:object-to-xml-transformer doc:name="Object to XML"></xm:object-to-xml-transformer>
<file:outbound-endpoint path="C:\Users\FASYL\Downloads" outputPattern="test#[function:datestamp:dd-MM-yy]_#[function:systime].xml" responseTimeout="10000" doc:name="File"></file:outbound-endpoint>
<jdbc-ee:outbound-endpoint queryKey="FirstUpdate" queryTimeout="-1" connector-ref="Database" doc:name="Database">
<jdbc-ee:query key="FirstUpdate" value="update gcp_txn_log set PROCESSED = 'N' WHERE PROCESSED = 'Y'"></jdbc-ee:query>
</jdbc-ee:outbound-endpoint>
</flow> -->
<flow name="JMSMessageFlow3" doc:name="JMSMessageFlow3">
<quartz:inbound-endpoint jobName="job2" repeatInterval="1" repeatCount="0" responseTimeout="10000" doc:name="Quartz" connector-ref="quartzConnector">
<quartz:event-generator-job>
<quartz:payload>Setting Session Variable</quartz:payload>
</quartz:event-generator-job>
</quartz:inbound-endpoint>
<component class="com.test.SchedulerComponent" doc:name="Java"></component>
<component doc:name="Java">
<singleton-object class="com.test.ServiceDAO">
<property key="dataSource" value-ref="springDataSource" value="null"/>
</singleton-object>
</component>
<message-properties-transformer scope="session" doc:name="Message Properties">
<add-message-property key="serviceDAO" value="#[message.payload]"/>
</message-properties-transformer>
<logger level="INFO" doc:name="Logger" message="#[sessionVars['serviceDAO']['1001']]"/>
</flow>
<!-- <flow name="JMSMessageFlow1" doc:name="JMSMessageFlow1">
</flow> -->
<flow name="JMSMessageFlow4" doc:name="JMSMessageFlow4">
<jms:inbound-endpoint queue="StudioIns" connector-ref="Active_MQ" doc:name="JMS"/>
<xm:jaxb-xml-to-object-transformer jaxbContext-ref="myJaxb" returnClass="com.test.jaxb.MsgContent"></xm:jaxb-xml-to-object-transformer>
<choice doc:name="Choice">
<when expression="payload.getMsgBody().getValue() == 'fundstransfer'" >
<pooled-component doc:name="Java">
<prototype-object class="com.test.PersonComponent">
<property key="dataSource" value-ref="springDataSource" value="null"/>
</prototype-object>
</pooled-component>
</when>
<when expression="#[sessionVars['serviceDAO']['1001'] == 1] ">
<pooled-component doc:name="Java">
<prototype-object class="com.test.SecondPersonComponent">
<property key="dataSource" value-ref="springDataSource" value="null"/>
</prototype-object>
</pooled-component>
</when>
</choice>
<logger message="#[sessionVars['serviceDAO']]" level="INFO" doc:name="Logger"/>
<file:outbound-endpoint path="D:\Documents\MuleStudio\workspace\jms_amq\bin\com\test" outputPattern="new.txt" responseTimeout="10000" doc:name="File"/>
</flow>
</mule>
The error indicates your payload is a HashMap: "Message payload is of type: HashMap". So the expression: message.payload.getServiceCodes() won't work as a HashMap doesn't have a method named 'getServiceCodes()'. If you want access elements of that HashMap you can use MEL(Mule Expression Language - http://www.mulesoft.org/documentation/display/current/Mule+Expression+Language+MEL) in a few ways.
Either via standard java method invocation such as:
payload.get('mykey')
or you can use MEL short hand such as:
payload['mykey'] or payload.mykey
Ont he other point about session variables you can store it in a session variable via the "set-session-variable" message processor and access the elements in a similar way. You can refer to it using "sessionVars" instead of "payload" and this time it will be a map of maps so:
sessionVars.mymap.mykey or sessionVars['mymap']['mykey'] etc.

Resources