Extractor Method Implementation
Example
The following is an example of the SAP BW extractor method extractStudentAddress of the application service sap.com/caf.tests/University. This method returns an aggregated structure of the service Student together with the complex attribute Address (cardinality is 0…1).
The delta load mechanism is implemented in this example, where selection parameters support the data fields of the object Student. Delta load is not implemented for Address because it is an aggregated object of Student.

public java.util.HashSet extractStudentAddress(java.util.Map selections) throws com.sap.caf.rt.exception.ServiceException {
// logging
java.lang.String user = sessionContext.getCallerPrincipal().getName();
java.lang.String methodHeader = "extractStudentAddress()";
Object[] parameters = new Object[] {};
CAFPublicLogger.entering(user, JARM_REQUEST, methodHeader, location, parameters);
java.util.HashSet retValue;
try {
//@@custom code start - extractStudentAddress()
retValue = new java.util.HashSet();
selections.remove("RECORDTYPE");// remove recordtype filter
java.util.Date lowdate = null;
java.util.Date highdate = null;
// getting filter for delta-relevant field
QueryFilter dateFilter = (QueryFilter) selections.get("lastChangedAt");
QueryFilter newDataFilter = null;
if(dateFilter != null) {
if(dateFilter.condition == QueryFilter.CONDITION_GE) {
lowdate = dateFilter.dateValueLow;
} else if(dateFilter.condition == QueryFilter.CONDITION_LE) {
highdate = dateFilter.dateValueHigh;
} else if(dateFilter.condition == QueryFilter.CONDITION_BETWEEN) {
lowdate = dateFilter.dateValueLow;
highdate = dateFilter.dateValueHigh;
}
if(lowdate != null) {
// also add GMT difference between J2EE server with CAF and BW system
lowdate = new java.util.Date(lowdate.getTime() + CAFContext.CAF_BW_SYSTEMS_TIMEZONE_DIFFERENCE*3600000);
}
if(highdate != null) {
// also add GMT difference between J2EE server with CAF and BW system
highdate = new java.util.Date(highdate.getTime() + CAFContext.CAF_BW_SYSTEMS_TIMEZONE_DIFFERENCE*3600000);
}
}
if(lowdate != null && highdate != null) {
newDataFilter = new QueryFilter(new java.sql.Timestamp(((java.util.Date)lowdate).getTime()),
new java.sql.Timestamp(((java.util.Date)highdate).getTime()));
} else if(lowdate != null) {
newDataFilter = new QueryFilter(new java.sql.Timestamp(((java.util.Date)lowdate).getTime()), QueryFilter.CONDITION_GE);
} else if(highdate != null) {
newDataFilter = new QueryFilter(new java.sql.Timestamp(((java.util.Date)highdate).getTime()), QueryFilter.CONDITION_LE);
} else {
newDataFilter = new QueryFilter("*");
}
selections.put("lastChangedAt", newDataFilter);
Iterator itStudents = getStudentService().findByMultipleParameters(selections, false,
"findByMultipleParameters").iterator();
Student student;
Address address;
StudentAndAddress sa;
for (int i=0; itStudents.hasNext(); i++) {
student = (Student)itStudents.next();
sa = new StudentAndAddress();
sa.setStudentkey( student.getKey() );
sa.setCreatedBy( student.getCreatedBy() );
sa.setCreatedAt( student.getCreatedAt() );
sa.setLastChangedBy( student.getLastChangedBy() );
sa.setLastChangedAt( student.getLastChangedAt() );
sa.setAverageGrade( student.getAverageGrade() );
sa.setBirthDay( student.getBirthDay() );
sa.setFirstName( student.getFirstName() );
sa.setLastName( student.getLastName() );
sa.setRewardPoints( student.getRewardPoints() );
sa.setUserId( student.getUserId() );
sa.setRECORDTYPE( 1 );
address = student.getAddress();
if ( address != null ) {
sa.setBuilding( address.getBuilding() );
sa.setCity( address.getCity() );
sa.setCountry( address.getCountry() );
sa.setRegion( address.getRegion() );
sa.setStreet( address.getStreet() );
}
retValue.add( sa );
}
if(lowdate != null || highdate != null) {
try {
// Use DeletedObjectsRegistrationService to get deleted instance's guids
java.util.Collection deletedObjects = DeletedObjectsRegistrationService.findDeletedByObjectTypeAndDates(
Student.OBJECT_NAME,
lowdate, highdate );
for(Iterator delIt = deletedObjects.iterator(); delIt.hasNext();) {
DeletedObject del = (DeletedObject) delIt.next();
sa = new StudentAndAddress();
sa.setStudentkey( del.getObjectKey() );
sa.setLastChangedAt(del.getDeletedAt());
sa.setRECORDTYPE(0);
retValue.add( sa );
}
}
catch ( com.sap.caf.rt.exception.DataAccessException ex )
{
Object[] args = { methodHeader };
CAFPublicLogger.traceThrowableT( Severity.DEBUG, location, methodHeader, "APPSRV_DATA_ACCESS_ERROR", args, ex );
location.throwing( methodHeader, ex );
throw new com.sap.caf.rt.exception.ServiceException( ex );
}
}
//@@custom code end - extractStudentAddress()
} finally {
CAFPublicLogger.exiting(user, JARM_REQUEST, methodHeader, location, parameters);
}
return retValue;
}