create an entry in local OData service - odata

I am trying to create en entry in my local OData service like in this example
Using Postman I am making a POST request on https://localhost:8090/odata/titles with this JSON body
{
"#odata.type":"SAPSybaseOData.titles",
"title_id":"ZZ1234",
"title":"new book",
"type":"business",
"pub_id":"1390",
"price":1,
"advance":1,
"total_sales":1,
"notes":"note",
"pubdate":"/Date(581817600000)/",
"contract":true
}
the OData service response status code is 400 - Bad request with this XML body
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<code>30068</code>
<message xml:lang="en-US">An error occurred while parsing the request body.</message>
</error>
my OData service metadata is
<edmx:Edmx xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" Version="1.0">
<edmx:DataServices xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" m:DataServiceVersion="1.0">
<Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" Namespace="SAPSybaseOData">
<EntityType Name="titles">
<Key>
<PropertyRef Name="title_id" />
</Key>
<Property Name="title_id" Type="Edm.String" Nullable="false" MaxLength="6" Unicode="false" Collation="cp850" />
<Property Name="title" Type="Edm.String" Nullable="false" MaxLength="80" Unicode="false" Collation="cp850" />
<Property Name="type" Type="Edm.String" Nullable="false" MaxLength="12" Unicode="false" Collation="cp850" FixedLength="true" />
<Property Name="pub_id" Type="Edm.String" Nullable="true" MaxLength="4" Unicode="false" Collation="cp850" />
<Property Name="price" Type="Edm.Decimal" Nullable="true" Precision="14" Scale="4" />
<Property Name="advance" Type="Edm.Decimal" Nullable="true" Precision="14" Scale="4" />
<Property Name="total_sales" Type="Edm.Int32" Nullable="true" />
<Property Name="notes" Type="Edm.String" Nullable="true" MaxLength="200" Unicode="false" Collation="cp850" />
<Property Name="pubdate" Type="Edm.DateTime" Nullable="false" Precision="3" />
<Property Name="contract" Type="Edm.Boolean" Nullable="false" />
</EntityType>
<EntityContainer Name="SAPSybaseOData_Container" m:IsDefaultEntityContainer="true">
<EntitySet Name="titles" EntityType="SAPSybaseOData.titles" />
</EntityContainer>
</Schema>
</edmx:DataServices>
</edmx:Edmx>
How can I create a new entry like in this example ?
Am I missing something ? How come the example is working fine and I get a parsing error ?

Related

UI5 - Value Help via OData annotation

I've created a value help annotation for field form/CompanyCode, see metadata below:
<EntityType sap:content-version="1" Name="shBukrs">
<Key>
<PropertyRef Name="Bukrs"/>
</Key>
<Property Name="Bukrs" sap:label="Company Code" Type="Edm.String" MaxLength="4" sap:creatable="false" Nullable="false"/>
<Property Name="Butxt" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:label="Company Name" Type="Edm.String" MaxLength="25" sap:creatable="false" Nullable="false"/>
<Property Name="Ort01" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:label="City" Type="Edm.String" MaxLength="25" sap:creatable="false" Nullable="false"/>
<Property Name="Waers" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:label="Currency" Type="Edm.String" MaxLength="5" sap:creatable="false" Nullable="false" sap:semantics="currency-code"/>
</EntityType>
<Annotation Term="com.sap.vocabularies.Common.v1.ValueList">
<Record>
<PropertyValue String="shBukrsSet" Property="CollectionPath"/>
<PropertyValue Property="SearchSupported" Bool="true"/>
<PropertyValue Property="Parameters">
<Collection>
<Record Type="com.sap.vocabularies.Common.v1.ValueListParameterOut">
<PropertyValue Property="LocalDataProperty" PropertyPath="CompanyCode"/>
<PropertyValue String="Bukrs" Property="ValueListProperty"/>
</Record>
<Record Type="com.sap.vocabularies.Common.v1.ValueListParameterDisplayOnly">
<PropertyValue String="Butxt" Property="ValueListProperty"/>
</Record>
</Collection>
</PropertyValue>
</Record>
</Annotation>
</Annotations>
I've added the field to the form:
<smartField:SmartLabel labelFor="idCompanyCode"/>
<smartField:SmartField value="{CompanyCode}" id="idCompanyCode"/>
but the value help is not attached to the field on the form (no value help button)...
Anyone any idea what's wrong?
Solved... target service name was missing:
Old:
<Annotation Term="com.sap.vocabularies.Common.v1.ValueList">
New:
<Annotation Term="com.sap.vocabularies.Common.v1.ValueList" Target="<service>">
Please make sure that you use the Registered Service name as Target value.

WSO2 ESB - Consume a OAuth2 Service

I'm tying to call an OAuth token service to retrieve the token.
Below is my proxy. This is a simple rest endpoint call which retrieves the token. For testing purpose I'm trying to log the token in the response.
<?xml version="1.0" encoding="UTF-8"?>
<proxy name="sla_proxy_svc_vo2" startOnLoad="true" trace="disable"
transports="http https" xmlns="http://ws.apache.org/ns/synapse">
<target>
<inSequence>
<log level="custom">
<property name="msg" value="*****INITIATING*****" />
</log>
<payloadFactory media-type="xml">
<format>
<soapenv:Envelope xmlns:echo="http://echo.services.core.carbon.wso2.org"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<nstxt:text xmlns:nstxt="http://ws.apache.org/commons/ns/payload">grant_type=client_credentials&client_id=G6Dk_3ZdrXOfPiuctufVq6GfTWoa&client_secret=jxA8NTkEClE5xGUvGvvhVTDyXM4a</nstxt:text>
</soapenv:Body>
</soapenv:Envelope>
</format>
<args />
</payloadFactory>
<log level="custom">
<property name="msg" value="*****BEFORE TOKEN SERVICE CALL*****" />
</log>
<log level="full" />
<property name="HTTP_METHOD" scope="axis2" type="STRING"
value="POST" />
<property name="messageType" scope="axis2" type="STRING"
value="text/plain" />
<property name="ContentType" scope="axis2" type="STRING"
value="text/plain" />
<property name="Accept" scope="axis2" type="STRING"
value="application/json" />
<send>
<endpoint>
<http format="rest" method="post" trace="disable"
uri-template="http://10.236.70.9:8281/token" />
</endpoint>
</send>
</inSequence>
<outSequence>
<log level="custom">
<property name="msg" value="******OUT SEQUENCE*******" />
</log>
<log level="full" />
<send />
</outSequence>
<faultSequence />
</target>
</proxy>
I'm getting the below response when I call.
DEBUG {org.apache.synapse.transport.http.wire} - << "HTTP/1.1 415 Unsupported Media Type[\r][\n]" {org.apache.synapse.transport.http.wire}
DEBUG {org.apache.synapse.transport.http.wire} - << "X-Frame-Options: DENY[\r][\n]" {org.apache.synapse.transport.http.wire}
DEBUG {org.apache.synapse.transport.http.wire} - << "X-XSS-Protection: 1; mode=block[\r][\n]" {org.apache.synapse.transport.http
Will be please if anyone can guide me of I'm doing anything wrong here.
I was able to call the service with the following payload.
<payloadFactory media-type="xml">
<format>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<root>
<grant_type>client_credentials</grant_type>
<client_id>G6Dk_3ZdrXOfPiuctufVq6GfTWoa</client_id>
<client_secret>jxA8NTkEClE5xGUvGvvhVTDyXM4a</client_secret>
</root>
</soapenv:Body>
</soapenv:Envelope>
</format>
<args />
</payloadFactory>
Also had to add the content type as below.
<property name="messageType" scope="axis2" type="STRING" value="application/x-www-form-urlencoded" />
<property name="ContentType" scope="axis2" type="STRING" value="application/x-www-form-urlencoded" />
This worked and retrieved the token.
Here is a template I'm using in a component to set the oAuth token, you could probably adapt it a bit for your case (sounds like you do not need grantType or user credentials)
<?xml version="1.0" encoding="UTF-8"?>
<template name="getToken" xmlns="http://ws.apache.org/ns/synapse">
<parameter name="tokenURL"/>
<parameter name="clientId"/>
<parameter name="clientSecret"/>
<parameter name="grantType"/>
<sequence>
<property description="Base64 crendetials" expression="base64Encode(fn:concat($func:clientId,':',$func:clientSecret))" name="credentials" scope="default" type="STRING"/>
<property description="Authentication" expression="fn:concat('Basic ', get-property('credentials'))" name="Authorization" scope="transport" type="STRING"/>
<header name="Content-Type" scope="transport" value="application/x-www-form-urlencoded"/>
<property name="messageType" scope="axis2" type="STRING" value="application/x-www-form-urlencoded"/>
<property name="DISABLE_CHUNKING" scope="axis2" type="STRING" value="true"/>
<property expression="$func:tokenURL" name="uri.var.authUrl" scope="default" type="STRING"/>
<property expression="$func:grantType" name="uri.var.grantType" scope="default" type="STRING"/>
<call blocking="true">
<endpoint>
<http method="post" uri-template="{uri.var.authUrl}?grant_type={uri.var.grantType}"/>
</endpoint>
</call>
<property expression="json-eval($.access_token)" name="OAuth_Token" scope="default" type="STRING"/>
<property action="remove" description="Remove Headers" name="TRANSPORT_HEADERS" scope="axis2"/>
<property description="Authorization" expression="fn:concat('Bearer ',get-property('OAuth_Token'))" name="Authorization" scope="transport" type="STRING"/>
</sequence>
</template>

Make a request application/x-www-form-urlencoded using wso2 esb

I trying to retrive a token OAuth2. But I don't khnow how I can make a x-www-form-urlencoded request using wso2esb.
This is a snippet of my code:
<?xml version="1.0" encoding="UTF-8"?>
<sequence name="test-oauth_v1" xmlns="http://ws.apache.org/ns/synapse">
<in>
<property name="RESPONSE" scope="default" value="true"/>
<property action="remove" name="NO_ENTITY_BODY" scope="axis2"/>
<header action="remove" name="To"/>
<property name="messageType" value="application/json" scope="axis2" type="STRING"/>
<property name="basicAuth" scope="default" type="STRING" value="Z3FZVFhUQnhkQlVGNDloblxxzedtSGRBQ1kySWpmSmNvZXdh"/>
<script language="js"><![CDATA[
var body = {};
body.grant_type = 'password';
body.username = 'xxxx';
body.password = 'xxxxxxx';
mc.setPayloadJSON(body);
]]></script>
<property name="messageType" scope="default" type="STRING" value="application/x-www-form-urlencoded"/>
<header
expression="fn:concat('Basic ', get-property('basicAuth'))"
name="Authorization" scope="transport" xmlns:ns="http://org.apache.synapse/xsd"/>
<call>
<endpoint key="server_token_oauth"/>
</call>
<send />
</in>
</sequence>
Would you have any propositions ?
Best regards
You can refer this example [1]. Scope of the messageType should be axis2.
<property name="messageType" value="application/x-www-form-urlencoded" scope="axis2" type="STRING"/>
<property name="DISABLE_CHUNKING" value="true" scope="axis2" type="STRING"/>

breezejs with odata error (odata4j)

Using breeze.js (master branch) and angular on client with odata4j on the server-side, I'm receiving the following error if i want to query for countries:
var query = breeze.EntityQuery.from('Country');
entityManager.executeQuery(query).then(...).fail(...);
-> Unable to locate a 'Type' by the name: Country:#odataContainer
I've configured breeze as follows:
breeze.config.initializeAdapterInstances({dataService: "OData"});
breeze.NamingConvention.none.setAsDefault();
.../$metadata OData response:
<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
<edmx:DataServices m:DataServiceVersion="2.0" xmlns:m="...">
<Schema Namespace="odataContainer" xmlns="...">
<EntityContainer Name="odataEntities" m:IsDefaultEntityContainer="true">
<EntitySet Name="Country" EntityType="odataModel.Country">
</EntitySet>
</EntityContainer>
</Schema>
<Schema Namespace="odataModel" xmlns="...">
<EntityType Name="Country">
<Key>
<PropertyRef Name="countryCode"></PropertyRef>
</Key>
<Property Name="region" Type="Edm.String" Nullable="true"></Property>
<Property Name="population" Type="Edm.Int32" Nullable="false"></Property>
<Property Name="countryCode" Type="Edm.String" Nullable="false"></Property>
<Property Name="name" Type="Edm.String" Nullable="true"></Property>
</EntityType>
</Schema>
</edmx:DataServices>
</edmx:Edmx>
You need to include namespace for you models in your project. In case your Country class is in odataModel.Country you need to add the third line to configure oData service:
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Department>("Countries");
builder.Namespace = "odataModel.Country";

Spring security 3.0 remember me functionality

I have been trying to implement spring security 3.0 remember me service in my application but unfortunately couldn't get it working.
I didn't find any specific example related to this, not even in spring documentation. It would be nice if somebody can give a working example code. Please find code of my spring-security.xml file.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.0.xsd">
<security:http entry-point-ref="myAuthenticationEntryPoint">
<security:session-management
session-fixation-protection="newSession" />
<security:custom-filter position="FORM_LOGIN_FILTER"
ref="processingFilter" />
<security:logout logout-url="/logout"
logout-success-url="/login" />
<security:intercept-url pattern='/index.jsp'
filters='none' />
<security:intercept-url pattern='/login*'
filters='none' />
<security:remember-me key="springrocks" />
<security:intercept-url pattern='/admin/**'
access="ROLE_ADMIN" />
</security:http>
<security:authentication-manager>
<security:authentication-provider
ref="myAuthenticationProvider"></security:authentication-provider>
</security:authentication-manager>
<bean id="myAuthenticationProvider"
class="example.AuthenticationProviderExtended">
</bean>
<bean id="authenticationManager" class="example.AuthenticationManagerExtended" />
<bean id="processingFilter" class="example.FormBasedProcessingFilter">
<property name="authenticationManager" ref="authenticationManager" />
<property name="usernameParameter" value="username" />
<property name="passwordParameter" value="password" />
<property name="allowSessionCreation" value="true" />
<property name="authenticationFailureHandler" ref="simpleUrlAuthenticationFailureHandler" />
<property name="authenticationSuccessHandler" ref="simpleUrlAuthenticationSuccessHandler" />
<property name="filterProcessesUrl" value="/performLogin" />
</bean>
<bean id="simpleUrlAuthenticationFailureHandler" class="example.AuthenticationFailureHandler">
<property name="defaultFailureUrl" value="/login"></property>
</bean>
<bean id="simpleUrlAuthenticationSuccessHandler"
class="org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler">
<property name="defaultTargetUrl" value="/home" />
</bean>
<bean id="myAuthenticationEntryPoint"
class="example.CustomAuthenticationEntryPoint">
<property name="loginFormUrl" value="/login" />
</bean>
<bean id="rememberMeFilter"
class="org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter">
<property name="rememberMeServices" ref="rememberMeServices" />
<property name="authenticationManager" ref="authenticationManager" />
</bean>
<bean id="rememberMeServices"
class="org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices">
<property name="userDetailsService" ref="myUserDetailsService" />
<property name="key" value="springRocks" />
</bean>
<bean id="rememberMeAuthenticationProvider"
class="org.springframework.security.authentication.RememberMeAuthenticationProvider">
<property name="key" value="springRocks" />
</bean>
<bean id="myUserDetailsService" class="example.MyCustomeUserDetailsService">
</bean>
</beans>
Please look the Spring Security documentation here:
http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#remember-me-hash-token
You need to make sure your form contains a checkbox (or other types of input with) the remember me attribute name
<input type="checkbox" name="_spring_security_remember_me"/>
This attribute is configurable via remember-me-parameter on xml, eg:
<remember-me remember-me-parameter="please_remember"/>

Resources