jitendra kansal's Profile | SCN
Thanks Jitendra
After changing datatype in String it works for me. But as per requirement now they want Datetime format like 22-MAY-2015 07:00:00. For this we change Oracle Backend datatype to VARCHAR2 and in entity its String it works.But because of this change it shows error in Delta token as we are getting delta in below format
<linkrel="delta"href="WORK_ORDER_INPROGRESS?!deltatoken='2015-05-16'"/>
-------------------------------------------------------------------------------------------------------------------------------
import com.sap.gateway.ip.core.customdev.util.Message;
import org.apache.olingo.odata2.api.uri.UriInfo;
import java.util.*;
import org.apache.olingo.odata2.api.edm.EdmEntitySet;
import org.apache.olingo.odata2.api.uri.NavigationPropertySegment;
import com.sap.gateway.core.ip.component.commons.ODataMethod.*;
import com.sap.gateway.ip.core.customdev.logging.*;
import com.sap.gateway.core.ip.component.commons.*;
import com.sap.gateway.ip.core.customdev.api.*;
import java.text.SimpleDateFormat;
// MAPPING
def Message processRequestData(Message message) {
//If pagination is implemented in processRequestSQL set IS_TOP_HANDLED and IS_SKIP_HANDLED
message.setHeader(ODataCamelExchangeHeaders.IS_TOP_HANDLED.toString(), true);
message.setHeader(ODataCamelExchangeHeaders.IS_SKIP_HANDLED.toString(), true);
return message;
}
// Processs SQL
def Message processRequestSQL(Message message)
{
//Get the SQL statement contained in message body
String sqlStatement = message.getBody();
def uriInfo = message.getHeaders().get(ODataExchangeHeaderProperty.UriInfo.toString());
def map = new HashMap(); map = uriInfo.getCustomQueryOptions();
def deltaToken = map.get("!deltatoken");
//check if $expand=OperationSet is used
String targetSetName = "";
def expand = new ArrayList();
def navProp = new ArrayList();
expand = uriInfo.getExpand();
if (expand.size() == 1) navProp = expand.get(0);
if (navProp.size() == 1) targetSetName = navProp.get(0).getTargetEntitySet().getName();
boolean isExpand = targetSetName.equals("WORK_ORDER_PICTURES");
//Create the query and sub query
String AND = " AND ";
String WHERE = " WHERE ";
String MO_CHANGEDATE = " TRUNC(UPDATED_DATE) >= ";
String OP_CHANGEDATE = " OR TRUNC(UPDATED_DATE) >= ";
//Modify the SQL statement
String modifiedSqlStatement = "";
def entitySet = uriInfo.getStartEntitySet();
def odataMethod = message.getHeaders().get(ODataExchangeHeaderProperty.ODataMethod.toString());
modifiedSqlStatement += sqlStatement;
if (odataMethod.toString() == "GET_FEED")
{ entitySetName = entitySet.getName();
if (entitySetName == "WORK_ORDER_INPROGRESS")
{
}
//Check if a deltatoken is defined in the URL query options
//Returns all entities of
if (deltaToken != null && deltaToken.length() > 0)
{
if (sqlStatement.toUpperCase().indexOf(WHERE) != -1)
{
modifiedSqlStatement += AND;
}
else
{
modifiedSqlStatement += WHERE;
}
modifiedSqlStatement += "(";
modifiedSqlStatement += MO_CHANGEDATE;
if (isExpand)
{
modifiedSqlStatement += deltaToken;
modifiedSqlStatement += OP_CHANGEDATE;
}
modifiedSqlStatement += "DATE ";
modifiedSqlStatement += deltaToken + ") ";
}
}
//For pagination we use the functionality of the database
Integer skip = uriInfo.getSkip();
Integer top = uriInfo.getTop();
//For pagination we use the functionality of the database
if (skip != null && skip.value > 0)
{
modifiedSqlStatement = "";
// modifiedSqlStatement += " offset " + skip.value + " rows";
modifiedSqlStatement += "SELECT * from( select m.*, rownum r from work_order_inprogress m) where r > " + skip.value;
// where r > 10 and r < 21
}
if (top != null && top.value > 0 )
{ top = skip + top;
modifiedSqlStatement += " and r <= " + top.value;
modifiedSqlStatement += "and ACTIVE <> 0";
}
//Set the message body back with the modified SQL statement
message.setBody(modifiedSqlStatement);
//Logger
// log.logErrors(LogMessage.TechnicalError, modifiedSqlStatement);
return message;
}
/* In this method ,the message object will contain the resultSet(response HashMap).
* If certain values are to be calculated based on the result,user can do so here.
* Delta token scenario is illustrated in the sample. */
def Message processResponseResult(Message message)
{
UriInfo uriInfo = message.getHeaders().get(ODataExchangeHeaderProperty.UriInfo.toString());
def entitySet = uriInfo.getStartEntitySet();
String entitySetName = entitySet.getName();
//Check if the $expand=OperationSet statement is used in the request URL.
String targetSetName = "";
def expand = new ArrayList();
def navProp = new ArrayList();
expand = uriInfo.getExpand();
if (expand.size() == 1) navProp = expand.get(0);
if (navProp.size() == 1) targetSetName = navProp.get(0).getTargetEntitySet().getName();
def method = message.getHeaders().get(ODataExchangeHeaderProperty.ODataMethod.toString());
//Call the sample method for implementing delta token and deleted item detection. As the JDBC result set is differently when using the $expand statement we have to check for it.
if (method == ODataMethod.GET_FEED)
{
if (targetSetName.equals("WORK_ORDER_PICTURES") && entitySetName.equals("WORK_ORDER_INPROGRESS"))
{ deltaHandlingExpand(message,entitySet);
}
else if ("WORK_ORDER_INPROGRESS".equals(entitySetName))
{
deltaHandling(message,entitySet);
}
}
return message;
}
/* calculating delta token and tombstones */
def void deltaHandling(Message message, def entitySet)
{
def deletedItems = new ArrayList();
def resultEntities = new ArrayList();
String deletedColumn = "ACTIVE";
def currentTokenValue = new Date();
def highestTokenValue = new Date();
def token = "";
def date = new Date();
def dataSourceResponse = new ArrayList();
dataSourceResponse = message.getBody();
def customMap = new HashMap();
def uriInfo = message.getHeaders().get(ODataExchangeHeaderProperty.UriInfo.toString());
customMap = uriInfo.getCustomQueryOptions();
def deltaToken = customMap.get("!deltatoken");
//Segregating the result set into deleted items and otherwise
if (deltaToken != null && deltaToken.length() > 0)
{
for (def i = 0; i < dataSourceResponse.size(); i++)
{ if (dataSourceResponse.get(i).get(deletedColumn) == 0)
deletedItems.add(dataSourceResponse.get(i));
else
resultEntities.add(dataSourceResponse.get(i));
}
message.setBody(resultEntities);
message.setHeader(ODataCamelExchangeHeaders.DELETED_ENTITIES.toString(), deletedItems);
}
//Parse through the result set to get the latest change date
for (def i = 0; i < dataSourceResponse.size(); i++)
{
if (dataSourceResponse.get(i).get("UPDATED_DATE") != null)
{
currentTokenValue = dataSourceResponse.get(i).get("UPDATED_DATE");
if (currentTokenValue > highestTokenValue)
highestTokenValue = currentTokenValue;
}
}
token = highestTokenValue.toString();
def sdf = new SimpleDateFormat("yyyy-MM-dd");
//Set new delta token to the message header
message.setHeader( ODataCamelExchangeHeaders.IS_DELTA_IMPLEMENTED.toString(), true);
message.setHeader(ODataCamelExchangeHeaders.DELTA_TOKEN.toString(),sdf.format(highestTokenValue));
}
/* calculating delta token and tombstones when $expand is used*/
def void deltaHandlingExpand(Message message, def entitySet)
{
def deletedItems = new ArrayList();
def resultEntities = new ArrayList();
String colDeletedMO = "C4";
def currentTokenValue = new Date();
def highestTokenValue = new Date();
def token = "";
def date = new Date();
def dataSourceResponse = new ArrayList();
dataSourceResponse = message.getBody();
def customMap = new HashMap();
def uriInfo = message.getHeaders().get(ODataExchangeHeaderProperty.UriInfo.toString());
customMap = uriInfo.getCustomQueryOptions();
def deltaToken = customMap.get("!deltatoken");
//Segregating the result set into deleted items and otherwise
if (deltaToken != null && deltaToken.length() > 0)
{
for (def i = 0; i < dataSourceResponse.size(); i++)
{
if (dataSourceResponse.get(i).get(colDeletedMO) == 0)
deletedItems.add(dataSourceResponse.get(i));
else
resultEntities.add(dataSourceResponse.get(i));
}
message.setBody(resultEntities);
message.setHeader( ODataCamelExchangeHeaders.DELETED_ENTITIES.toString(), deletedItems);
}
//Parse through the result set to get the latest change date
for (def i = 0; i < dataSourceResponse.size(); i++)
{
if (dataSourceResponse.get(i).get("C7") != null)
{ currentTokenValue = dataSourceResponse.get(i).get("C7");
if (currentTokenValue > highestTokenValue)
highestTokenValue = currentTokenValue;
}
if (dataSourceResponse.get(i).get("C16") != null)
{ currentTokenValue = dataSourceResponse.get(i).get("C16");
if (currentTokenValue > highestTokenValue)
highestTokenValue = currentTokenValue;
}
}
def sdf = new SimpleDateFormat("yyyy-MM-dd");
//Set new delta token to the message header
message.setHeader( ODataCamelExchangeHeaders.IS_DELTA_IMPLEMENTED.toString(), true);
message.setHeader(ODataCamelExchangeHeaders.DELTA_TOKEN.toString(),sdf.format(highestTokenValue));
}
/* Here the message object will have data after all the post processing.
* Can be used e.g. If, $expand was present in the URI and the direct resultSet is unclear to the user. */
def Message processResponseData(Message message)
{
return message;
}
----------------------------------------------------------------------------------------------------------------------------------