started working on research area imports. most work is done but still needs to be overlooked after it's been tested against the api. test server down at the moment

This commit is contained in:
Emil Siverhall 2012-02-07 09:17:20 +01:00
parent 1d4670f2c6
commit ca741ff7a1
6 changed files with 136 additions and 5 deletions

@ -77,11 +77,31 @@ public abstract class AbstractDtoResponseHandler implements DtoResponseHandler {
return new ProjectDTOCollectionWrapper();
}
/**
* Attempts to treat input as a ProjectDTOCollectionWrapper, returns the empty wrapper if unable to extract data.
* @param jsonUserCollectionString
* @return
*/
protected final ResearchAreaDTOCollectionWrapper asAreaCollection(final String jsonAreaCollection){
//Treat as raw array
try{
final Type collectionType = new TypeToken<Collection<ResearchAreaDTO>>(){}.getType();
final Collection<ResearchAreaDTO> collection = parseTo(jsonAreaCollection,collectionType);
final ResearchAreaDTOCollectionWrapper wrapper = new ResearchAreaDTOCollectionWrapper(collection);
return wrapper;
}catch(final JsonParseException jpe){
logger.debug("Attempting to treat response '"+jsonAreaCollection+"' as a raw array failed.");
}
//If that fails, treat as regular project
{
final ResearchAreaDTO researchAreaDTO = parseTo(jsonAreaCollection, ResearchAreaDTO.class);
if(researchAreaDTO != null){
final ResearchAreaDTOCollectionWrapper wrapper = new ResearchAreaDTOCollectionWrapper();
wrapper.getAreas().add(researchAreaDTO);
return wrapper;
}else{
logger.debug("Attempting to treat response '"+jsonAreaCollection+"' as a single project failed.");
}
}
logger.warn("Returning empty project collection wrapper for respose '"+jsonAreaCollection+"'");
return new ResearchAreaDTOCollectionWrapper();
}
protected final UnitDTOCollectionWrapper asUnitCollection(final String jsonUnitCollection){
//Treat as raw array
try{

@ -0,0 +1,20 @@
package se.su.dsv.scipro.io.dto;
public class ResearchAreaDTO {
public long id;
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ResearchAreaDTO(){
}
public String toString(){
return getName();
}
}

@ -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 ProjectDTO objects
public class ResearchAreaDTOCollectionWrapper implements Iterable<ResearchAreaDTO>{
private final List<ResearchAreaDTO> areas = new ArrayList<ResearchAreaDTO>();
public ResearchAreaDTOCollectionWrapper(){
}
public ResearchAreaDTOCollectionWrapper(Collection<ResearchAreaDTO> source){
this.areas.addAll(source);
}
public List<ResearchAreaDTO> getAreas() {
return areas;
}
public int size(){
return areas.size();
}
@Override
public String toString(){
return ("listOf "+areas.size()+" areas :" + areas.toString());
}
@Override
public Iterator<ResearchAreaDTO> iterator() {
return areas.iterator();
}
}

@ -12,6 +12,7 @@ public class UserDTO {
@SerializedName("theses")
public Set<ProjectDTO> projects = new HashSet<ProjectDTO>();
public Set<UserRoleDTO> roles = new HashSet<UserRoleDTO>();
public Set<ResearchAreaDTO> researchAreas = new HashSet<ResearchAreaDTO>();
public UserDTO(){}
public String toString(){
return firstName + " " + lastName + "("+id+")";

@ -41,6 +41,7 @@ import se.su.dsv.scipro.io.dto.ProjectDTO;
import se.su.dsv.scipro.io.dto.ProjectParticipantDTO;
import se.su.dsv.scipro.io.dto.ProjectParticipantDTO.EXTERNAL_PROJECT_ROLE;
import se.su.dsv.scipro.io.dto.ProjectParticipantDTO.LOCAL_PROJECT_ROLE;
import se.su.dsv.scipro.io.dto.ResearchAreaDTO;
import se.su.dsv.scipro.io.dto.SupervisorDTO;
import se.su.dsv.scipro.io.dto.UnitDTO;
import se.su.dsv.scipro.io.dto.UserDTO;
@ -117,8 +118,10 @@ public class ImporterFacade {
mergeLinkedUsernames(user,userDTO.usernames);
mergeLinkedProjects(userDTO.projects);
mergeLinkedRoles(user,userDTO.roles);
mergeLinkedResearchAreas(user, userDTO.researchAreas);
}
}
private void mergeLinkedUsernames(final User user, final Set<UsernameDTO> userNames){
final Set<Username> currentUserNames = user.getUserNames();
final Set<UsernameDTO> userNamesInput = new HashSet<UsernameDTO>(userNames);//Defensive copy
@ -420,6 +423,25 @@ public class ImporterFacade {
supervisor.getKeywords().getAll().add(unitToAdd);
}
private void mergeLinkedResearchAreas(final User user, final Set<ResearchAreaDTO> areas){
for(final ResearchAreaDTO researchAreaDTO : areas){
Keyword area = keywordDao.getKeywordByNameAndType(researchAreaDTO.name, keywordTypeDao.findByType(KeywordTypeDao.TYPE.RESEARCH_AREA));
if(area == null){
logger.info("External research area: '"+researchAreaDTO+"' has no local representation, creating");
area = new Keyword(researchAreaDTO.name, keywordTypeDao.findByType(KeywordTypeDao.TYPE.RESEARCH_AREA));
area = keywordDao.save(area);
}
addResearchAreaToUser(user, area);
}
}
private void addResearchAreaToUser(User user, Keyword area) {
Employee supervisor = supervisorDao.getFrom(user);
logger.info("Adding research area: " + area.getKeyword() + " to supervisor " + supervisor.getUser().getFullName());
supervisor.getKeywords().getAll().add(area);
}
@Transactional
public void addUnexistingUnitsAsKeywords(final Set<UnitDTO> subunits) {
//include deleted keywords set to true, should it be like that? /Friis
@ -445,4 +467,5 @@ public class ImporterFacade {
dto.setName(unit.getKeyword());
return dto;
}
}

@ -19,6 +19,8 @@ import se.su.dsv.scipro.io.ExternalImporter;
import se.su.dsv.scipro.io.dto.AbstractDtoResponseHandler;
import se.su.dsv.scipro.io.dto.ProjectDTO;
import se.su.dsv.scipro.io.dto.ProjectDTOCollectionWrapper;
import se.su.dsv.scipro.io.dto.ResearchAreaDTO;
import se.su.dsv.scipro.io.dto.ResearchAreaDTOCollectionWrapper;
import se.su.dsv.scipro.io.dto.SupervisorDTO;
import se.su.dsv.scipro.io.dto.UnitDTO;
import se.su.dsv.scipro.io.dto.UnitDTOCollectionWrapper;
@ -29,6 +31,7 @@ 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;
@ -227,6 +230,30 @@ public class ExternalImporterDaisyImpl implements ExternalImporter {
}
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>();
final HttpsRequestSender senderProxy = new HttpsRequestSender(new AbstractDtoResponseHandler(){
@Override
public void handleResponse(String response) {
logger.info("Response recieved (from: "+requestUrl+"): " + response);
final ResearchAreaDTOCollectionWrapper areaCollection = asAreaCollection(response);//The query will always returns a collection, regardless of backing data
if(areaCollection.size() == 0){//If at this point we have nothing, we have to throw.
throw new ExternalImportException("No research areas found in remote");
}else{
dtoCache.addAll(areaCollection.getAreas());
}
logger.info("Recieved " + areaCollection.size() + " research areas"+(areaCollection.size()==1?"":"s")+" from remote");
}
}, requestUrl, getRequestUser(), getRequestPassword(), parameters, requestType);
try{
process(senderProxy);
}catch(final ExternalImportException eie){
logger.warn("No research areas found, this may or may not indicate a problem");
}
return dtoCache;
}
private String getRequestUrl(){
return applicationSettings.getRemoteLookupUrl();
@ -278,6 +305,14 @@ public class ExternalImporterDaisyImpl implements ExternalImporter {
});
userDTO.projects = fetchedProjects;
}
final Set<ResearchAreaDTO> fetchedResearchAreas = fetchResearchAreas(new HashMap<String,String>(), HttpRequestSender.REQUEST_TYPE.GET, new UrlProcessor(){
@Override
String process(String url){
return (url+"/person/"+userDTO.id+"/researchAreas");
}
});
userDTO.researchAreas = fetchedResearchAreas;
//Force employee role data to be on the DTO
UserRoleDTO employeeRole = new UserRoleDTO();
employeeRole.role = UserRoleDTO.EXTERNAL_USER_ROLES.SUPERVISOR_ROLE.asExternal();
@ -286,6 +321,8 @@ public class ExternalImporterDaisyImpl implements ExternalImporter {
}
return userDTO;
}
};
}
/**