added support for remote fetching of usernames based on the hierarchy of the new api. usernames are now fetched by person/id/usernames

This commit is contained in:
Emil Siverhall 2012-02-13 10:59:04 +01:00
parent 0611d806ea
commit 2e4899a808
3 changed files with 94 additions and 2 deletions

@ -77,6 +77,29 @@ public abstract class AbstractDtoResponseHandler implements DtoResponseHandler {
return new ProjectDTOCollectionWrapper();
}
protected final UsernameDTOCollectionWrapper asUsernameCollection(final String jsonUsernameCollection) {
try{
final Type collectionType = new TypeToken<Collection<UsernameDTO>>(){}.getType();
final Collection<UsernameDTO> collection = parseTo(jsonUsernameCollection, collectionType);
final UsernameDTOCollectionWrapper wrapper = new UsernameDTOCollectionWrapper(collection);
return wrapper;
} catch(final JsonParseException jpe){
logger.debug("Attempting to treat response '"+jsonUsernameCollection+"' as a raw array failed.");
}
{
final UsernameDTO usernameDTO = parseTo(jsonUsernameCollection, UsernameDTO.class);
if(usernameDTO != null){
final UsernameDTOCollectionWrapper wrapper = new UsernameDTOCollectionWrapper();
wrapper.getUsernames().add(usernameDTO);
return wrapper;
} else{
logger.debug("Attempting to treat response '" +jsonUsernameCollection+"' as a single username failed.");
}
}
logger.warn("Returning empty username collection wrapper for response '"+jsonUsernameCollection+"'");
return new UsernameDTOCollectionWrapper();
}
protected final ResearchAreaDTOCollectionWrapper asAreaCollection(final String jsonAreaCollection){
//Treat as raw array
try{

@ -0,0 +1,30 @@
package se.su.dsv.scipro.io.dto;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
//Collection-wrapper for UsernameDTO objects
public class UsernameDTOCollectionWrapper implements Iterable<UsernameDTO>{
private final List<UsernameDTO> usernames = new ArrayList<UsernameDTO>();
public UsernameDTOCollectionWrapper(){
}
public UsernameDTOCollectionWrapper(Collection<UsernameDTO> source){
this.usernames.addAll(source);
}
public List<UsernameDTO> getUsernames() {
return usernames;
}
public int size(){
return usernames.size();
}
@Override
public String toString(){
return ("listOf "+usernames.size()+" usernames :" + usernames.toString());
}
@Override
public Iterator<UsernameDTO> iterator() {
return usernames.iterator();
}
}

@ -27,11 +27,12 @@ import se.su.dsv.scipro.io.dto.UnitDTOCollectionWrapper;
import se.su.dsv.scipro.io.dto.UserDTO;
import se.su.dsv.scipro.io.dto.UserDTOCollectionWrapper;
import se.su.dsv.scipro.io.dto.UserRoleDTO;
import se.su.dsv.scipro.io.dto.UsernameDTO;
import se.su.dsv.scipro.io.dto.UsernameDTOCollectionWrapper;
import se.su.dsv.scipro.io.exceptions.ExternalImportException;
import se.su.dsv.scipro.io.exceptions.HttpRemoteRespondedWithFailureException;
import se.su.dsv.scipro.io.facade.ImporterFacade;
import se.su.dsv.scipro.io.http.HttpRequestSender;
import se.su.dsv.scipro.io.http.HttpRequestSender.REQUEST_TYPE;
import se.su.dsv.scipro.io.http.HttpsRequestSender;
import se.su.dsv.scipro.security.auth.roles.Roles;
@ -246,6 +247,31 @@ public class ExternalImporterDaisyImpl implements ExternalImporter {
return dtoCache;
}
private Set<UsernameDTO> fetchRemoteUsernames(final Map<String,String> parameters, final HttpRequestSender.REQUEST_TYPE requestType, final UrlProcessor urlProcessor) {
final String requestUrl = (urlProcessor==null?getRequestUrl():urlProcessor.process(getRequestUrl()));
final Set<UsernameDTO> dtoCache = new HashSet<UsernameDTO>();
final HttpsRequestSender senderProxy = new HttpsRequestSender(new AbstractDtoResponseHandler() {
@Override
public void handleResponse(String response) {
logger.info("Response recieved (from: "+requestUrl+"): " + response);
final UsernameDTOCollectionWrapper usernameCollection = asUsernameCollection(response);
if(usernameCollection.size() == 0){
throw new ExternalImportException("No usernames found in remote");
}else{
dtoCache.addAll(usernameCollection.getUsernames());
}
logger.info("Received " + usernameCollection.size() + " usernames"+(usernameCollection.size()==1?"":"s")+" from remote");
}
}, requestUrl, getRequestUser(), getRequestPassword(), parameters, requestType);
try{
process(senderProxy);
} catch (final ExternalImportException eie){
logger.warn("No usernames found");
}
return dtoCache;
}
private Set<ResearchAreaDTO> fetchResearchAreas(final Map<String, String> parameters, final HttpRequestSender.REQUEST_TYPE requestType, final UrlProcessor urlProcessor) {
final String requestUrl = (urlProcessor==null?getRequestUrl():urlProcessor.process(getRequestUrl()));
final Set<ResearchAreaDTO> dtoCache = new HashSet<ResearchAreaDTO>();
@ -302,7 +328,14 @@ public class ExternalImporterDaisyImpl implements ExternalImporter {
return (url+"/person/"+userDTO.id+"/theses");
}
});
final Set<UsernameDTO> fetchedUsernames = fetchRemoteUsernames(new HashMap<String,String>(), HttpRequestSender.REQUEST_TYPE.GET, new UrlProcessor(){
@Override
String process(String url){
return(url+"/person/"+userDTO.id+"/usernames");
}
});
userDTO.projects = fetchedProjects;
userDTO.usernames = fetchedUsernames;
return userDTO;
}
};
@ -320,7 +353,13 @@ public class ExternalImporterDaisyImpl implements ExternalImporter {
});
userDTO.projects = fetchedProjects;
}
final Set<UsernameDTO> fetchedUsernames = fetchRemoteUsernames(new HashMap<String,String>(), HttpRequestSender.REQUEST_TYPE.GET, new UrlProcessor(){
@Override
String process(String url){
return(url+"/person/"+userDTO.id+"/usernames");
}
});
userDTO.usernames = fetchedUsernames;
final Set<ResearchAreaDTO> fetchedResearchAreas = fetchResearchAreas(new HashMap<String,String>(), HttpRequestSender.REQUEST_TYPE.GET, new UrlProcessor(){
@Override
String process(String url){