diff --git a/src/main/java/se/su/dsv/scipro/SciProSession.java b/src/main/java/se/su/dsv/scipro/SciProSession.java index 4c7efc0954..9bd554cc00 100644 --- a/src/main/java/se/su/dsv/scipro/SciProSession.java +++ b/src/main/java/se/su/dsv/scipro/SciProSession.java @@ -22,6 +22,8 @@ import se.su.dsv.scipro.data.dataobjects.Project; import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.dataobjects.UserSettings; import se.su.dsv.scipro.json.IUserLookupFromUsername; +import se.su.dsv.scipro.json.RemoteLookupOptions; +import se.su.dsv.scipro.json.RemoteLookupOptions.LOOKUP_DEPTH; import se.su.dsv.scipro.security.auth.Authenticator; import se.su.dsv.scipro.security.auth.roles.Admin; import se.su.dsv.scipro.security.auth.roles.DefaultRole; @@ -191,7 +193,6 @@ public class SciProSession extends WebSession { // With this userSettings.created() will return a users first login date and userSettings.modified() will return last login userSettings.setLastModified(new Date()); userSettings = userSettingsDao.save(userSettings); - logger.info("User: "+getLoggedInIdentity()+ " logged in to "+this.getApplication().getClass().getSimpleName()+ " as: "+user.getFirstName()+" "+user.getLastName()+" "+user.getUserNames()+ " at: "+new Date()); loggedIn = true; @@ -265,7 +266,7 @@ public class SciProSession extends WebSession { return false; } private User doUserLookup(final String username, final String realm) { - final User u = userLookupFromUsername.lookup(new KeyValuePair<String>(username,realm)); + final User u = userLookupFromUsername.lookup(new KeyValuePair<String>(username,realm), new RemoteLookupOptions(LOOKUP_DEPTH.PROJECT_AND_PARTICIPANTS)); if(u == null) logger.warn(username + " authenticated successfully, but the user was not available from remote system."); return u; diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/Dao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/Dao.java index d810b8b77f..92cf0cb885 100644 --- a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/Dao.java +++ b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/Dao.java @@ -22,6 +22,8 @@ public interface Dao<T extends DomainObject> public T reLoad(T object); + public void refresh(T object); + public List<T> findAll(int first, int count); public List<T> findAll(int first, int count, String orderBy); diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/AbstractDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/AbstractDaoJPAImp.java index 80464e1577..e1f3319b76 100644 --- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/AbstractDaoJPAImp.java +++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/AbstractDaoJPAImp.java @@ -56,6 +56,11 @@ public abstract class AbstractDaoJPAImp<T extends DomainObject> extends JpaDaoSu else return null; } + @Transactional(readOnly=true) + public void refresh(T object){ + if(object != null) + getJpaTemplate().refresh(object); + } @Transactional( readOnly=false ) public T save(T object){ diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/User.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/User.java index 8f545290fc..42b9fa57a8 100644 --- a/src/main/java/se/su/dsv/scipro/data/dataobjects/User.java +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/User.java @@ -8,7 +8,6 @@ import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; -import javax.persistence.Lob; import javax.persistence.OneToMany; import javax.persistence.Table; @@ -102,6 +101,9 @@ public class User extends LazyDeletableDomainObject implements Comparable<User>, return emailAddress; } + public void addUserName(Username username){ + this.usernames.add(username); + } public void setUserNames(Set<Username> usernames) { this.usernames = usernames; diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/Username.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/Username.java index 2926eef4bb..c7decd5eea 100644 --- a/src/main/java/se/su/dsv/scipro/data/dataobjects/Username.java +++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/Username.java @@ -73,6 +73,8 @@ public class Username extends DomainObject { public void setUser(User user) { this.user = user; + if(user!=null) + user.addUserName(this); } @Override diff --git a/src/main/java/se/su/dsv/scipro/json/DefaultUserLookupBase.java b/src/main/java/se/su/dsv/scipro/json/DefaultUserLookupBase.java index 4279004070..8714538429 100644 --- a/src/main/java/se/su/dsv/scipro/json/DefaultUserLookupBase.java +++ b/src/main/java/se/su/dsv/scipro/json/DefaultUserLookupBase.java @@ -16,13 +16,12 @@ abstract class DefaultUserLookupBase{ @Autowired protected UserDao userDao; @Autowired - protected JsonUserResponseHandler userResponseHandler; + private JsonUserResponseHandler userResponseHandler; @Autowired - protected ApplicationSettings settings; + private ApplicationSettings settings; - protected boolean doRemoteRequest(final Map<String,String> params){ - userResponseHandler.setLogResult(true); - RequestSender request = new RequestSender(userResponseHandler, settings.getRemoteLookupUrl(), params, RequestSender.REQUEST_TYPE_POST); + protected boolean doRemoteRequest(final Map<String,String> params, final RemoteLookupOptions options){ + RequestSender request = new RequestSender(userResponseHandler, settings.getRemoteLookupUrl(), params, options, RequestSender.REQUEST_TYPE.POST); try{ request.processRequest(); } catch (final IOException e){ diff --git a/src/main/java/se/su/dsv/scipro/json/DefaultUserLookupFromIdentifier.java b/src/main/java/se/su/dsv/scipro/json/DefaultUserLookupFromIdentifier.java index d67d38495c..ac51a4702c 100644 --- a/src/main/java/se/su/dsv/scipro/json/DefaultUserLookupFromIdentifier.java +++ b/src/main/java/se/su/dsv/scipro/json/DefaultUserLookupFromIdentifier.java @@ -7,6 +7,7 @@ import org.apache.log4j.Logger; import org.springframework.stereotype.Component; import se.su.dsv.scipro.data.dataobjects.User; +import se.su.dsv.scipro.json.RemoteLookupOptions.LOOKUP_DEPTH; /** * Default implementation of IUserLookupFromIdentifier queries remote defined by ApplicationSettings via JSon requests. @@ -15,18 +16,20 @@ import se.su.dsv.scipro.data.dataobjects.User; public class DefaultUserLookupFromIdentifier extends DefaultUserLookupBase implements IUserLookupFromIdentifier { private Logger logger = Logger.getLogger(DefaultUserLookupFromIdentifier.class); - public User lookup(final Long identifier){ + public User lookup(final Long identifier, final RemoteLookupOptions options){ if(identifier == null){ throw new IllegalStateException("null values for user parameter not allowed"); } logger.debug("Starting remote lookup for: " + identifier); final Map<String, String> params = new HashMap<String, String>(); params.put("userid", identifier.toString()); - if(!doRemoteRequest(params)) + if(!doRemoteRequest(params,options)){ + logger.warn("Remote lookup failed for identifier: "+identifier); return null; + } final User u = userDao.getUserByIdentifier(identifier); if(u != null) - logger.info("Successfully imported user/username from remote system: " + u.getFirstName() + " " + u.getLastName() + "("+identifier+") id: " + u.getId()); + logger.info("Successfully imported user/username from remote system: " + u.getId() + " " +u.getUserNames()); else logger.warn("Failed to import a valid user from remote system: "+identifier); return u; diff --git a/src/main/java/se/su/dsv/scipro/json/DefaultUserLookupFromUsername.java b/src/main/java/se/su/dsv/scipro/json/DefaultUserLookupFromUsername.java index 4e359ef6c2..d4354bffe0 100644 --- a/src/main/java/se/su/dsv/scipro/json/DefaultUserLookupFromUsername.java +++ b/src/main/java/se/su/dsv/scipro/json/DefaultUserLookupFromUsername.java @@ -16,7 +16,7 @@ import se.su.dsv.scipro.util.KeyValuePair; public class DefaultUserLookupFromUsername extends DefaultUserLookupBase implements IUserLookupFromUsername { private Logger logger = Logger.getLogger(DefaultUserLookupFromUsername.class); - public User lookup(final KeyValuePair<String> userAtRealm){ + public User lookup(final KeyValuePair<String> userAtRealm, final RemoteLookupOptions options){ if(userAtRealm == null || userAtRealm.getKey() == null){ throw new IllegalStateException("null values for user parameter not allowed"); } @@ -26,11 +26,11 @@ public class DefaultUserLookupFromUsername extends DefaultUserLookupBase impleme final Map<String, String> params = new HashMap<String, String>(); params.put("username", user); params.put("realm", realm); - if(!doRemoteRequest(params)) + if(!doRemoteRequest(params,options)) return null; final User u = userDao.getUserByUsername(user,realm); if(u != null) - logger.info("Successfully imported user/username from remote system: " + u.getFirstName() + " " + u.getLastName() + "("+user+"@"+realm+") id: " + u.getId()); + logger.info("Successfully imported user/username from remote system: " + user+"@"+realm+ " (id: " + u.getId()+") "+u.getUserNames()); else logger.warn("Failed to import a valid user from remote system: "+userAtRealm); return u; diff --git a/src/main/java/se/su/dsv/scipro/json/ILookup.java b/src/main/java/se/su/dsv/scipro/json/ILookup.java index e89d0008cd..2132496f2f 100644 --- a/src/main/java/se/su/dsv/scipro/json/ILookup.java +++ b/src/main/java/se/su/dsv/scipro/json/ILookup.java @@ -8,6 +8,6 @@ package se.su.dsv.scipro.json; * @param <E> The lookup parameter, use compound types to support querying on multiple parameters. */ public interface ILookup<T, E> { - public T lookup(E lookupParam); + public T lookup(final E lookupParam, final RemoteLookupOptions options); } diff --git a/src/main/java/se/su/dsv/scipro/json/IResponseHandler.java b/src/main/java/se/su/dsv/scipro/json/IResponseHandler.java index aa876a79d8..80ed1a69d2 100644 --- a/src/main/java/se/su/dsv/scipro/json/IResponseHandler.java +++ b/src/main/java/se/su/dsv/scipro/json/IResponseHandler.java @@ -4,5 +4,5 @@ package se.su.dsv.scipro.json; * Interface for delegated callback handling of response-strings. */ public interface IResponseHandler { - public void handleResponse(String response); + public void handleResponse(final String response,final RemoteLookupOptions options); } diff --git a/src/main/java/se/su/dsv/scipro/json/IUserLookupFromIdentifier.java b/src/main/java/se/su/dsv/scipro/json/IUserLookupFromIdentifier.java index 51186fe3d7..645899001b 100644 --- a/src/main/java/se/su/dsv/scipro/json/IUserLookupFromIdentifier.java +++ b/src/main/java/se/su/dsv/scipro/json/IUserLookupFromIdentifier.java @@ -7,5 +7,5 @@ import se.su.dsv.scipro.data.dataobjects.User; * See ILookup for more information on the implicit contract of this interface. */ public interface IUserLookupFromIdentifier extends ILookup<User,Long>{ - public User lookup(final Long identifier); + public User lookup(final Long identifier, final RemoteLookupOptions options); } diff --git a/src/main/java/se/su/dsv/scipro/json/IUserLookupFromUsername.java b/src/main/java/se/su/dsv/scipro/json/IUserLookupFromUsername.java index 4ca53ba88d..7f5496cf1b 100644 --- a/src/main/java/se/su/dsv/scipro/json/IUserLookupFromUsername.java +++ b/src/main/java/se/su/dsv/scipro/json/IUserLookupFromUsername.java @@ -9,5 +9,5 @@ import se.su.dsv.scipro.util.KeyValuePair; * See ILookup for more information on the implicit contract of this interface. */ public interface IUserLookupFromUsername extends ILookup<User,KeyValuePair<String>>{ - public User lookup(final KeyValuePair<String> userAtRealm); + public User lookup(final KeyValuePair<String> userAtRealm, final RemoteLookupOptions options); } diff --git a/src/main/java/se/su/dsv/scipro/json/ImportUpdateStatsResponseHandler.java b/src/main/java/se/su/dsv/scipro/json/ImportUpdateStatsResponseHandler.java index 811f4a3f0a..7030ac23e2 100644 --- a/src/main/java/se/su/dsv/scipro/json/ImportUpdateStatsResponseHandler.java +++ b/src/main/java/se/su/dsv/scipro/json/ImportUpdateStatsResponseHandler.java @@ -27,7 +27,7 @@ public class ImportUpdateStatsResponseHandler extends JsonResponseHandler { * * @param response the json string */ - public void handleResponse(String response) { + public void handleResponse(final String response, final RemoteLookupOptions options) { JsonUpdateStatsContainer statsContainer = null; try{ Gson gson = new Gson(); diff --git a/src/main/java/se/su/dsv/scipro/json/ImportWorkerLookup.java b/src/main/java/se/su/dsv/scipro/json/ImportWorkerLookup.java index 13bafdd178..cc094fac0f 100644 --- a/src/main/java/se/su/dsv/scipro/json/ImportWorkerLookup.java +++ b/src/main/java/se/su/dsv/scipro/json/ImportWorkerLookup.java @@ -13,10 +13,11 @@ import se.su.dsv.scipro.ApplicationSettings; /** * This class does a lookup on a username against the remote remoteLookupUrl specified in * the applicationContext, under ApplicationSettings. - * + * * * @author Dan Kjellman <dan-kjel@dsv.su.se> */ +//TODO Make sure this worker successfully fails when it should @Component public class ImportWorkerLookup { public static final String USERS = "users"; @@ -52,7 +53,7 @@ public class ImportWorkerLookup { }else{ //logger.log(Level.INFO,"Starting lookup for completeGet=true & type="+type+" & updatedAfter=" + updatedAfter); } - RequestSender request = new RequestSender(importWorkerResponseHandler, applicationSettings.getRemoteLookupUrl(), params, RequestSender.REQUEST_TYPE_POST); + RequestSender request = new RequestSender(importWorkerResponseHandler, applicationSettings.getRemoteLookupUrl(), params, new RemoteLookupOptions(), RequestSender.REQUEST_TYPE.POST); try{ request.processRequest(); } catch (IOException e) { @@ -66,7 +67,7 @@ public class ImportWorkerLookup { params.put("updateStats", "true"); params.put("updatedAfter",""+updatedAfter.getTime()); - RequestSender request = new RequestSender(importUpdateStatsResponseHandler, applicationSettings.getRemoteLookupUrl(), params, RequestSender.REQUEST_TYPE_POST); + RequestSender request = new RequestSender(importUpdateStatsResponseHandler, applicationSettings.getRemoteLookupUrl(), params, new RemoteLookupOptions(), RequestSender.REQUEST_TYPE.POST); try{ request.processRequest(); } catch (IOException e) { diff --git a/src/main/java/se/su/dsv/scipro/json/ImportWorkerResponseHandler.java b/src/main/java/se/su/dsv/scipro/json/ImportWorkerResponseHandler.java index f365bc138b..4d8292901e 100644 --- a/src/main/java/se/su/dsv/scipro/json/ImportWorkerResponseHandler.java +++ b/src/main/java/se/su/dsv/scipro/json/ImportWorkerResponseHandler.java @@ -34,7 +34,7 @@ public class ImportWorkerResponseHandler extends JsonResponseHandler { * * @param response the json string */ - public void handleResponse(String response) { + public void handleResponse(final String response, final RemoteLookupOptions options) { JsonCompleteGetContainer completeContainer = null; try{ Gson gson = new Gson(); @@ -101,7 +101,7 @@ public class ImportWorkerResponseHandler extends JsonResponseHandler { if(user == null){ - createThesisUser(jsonUser, false); + createThesisUser(jsonUser, new RemoteLookupOptions()); }else{ lookForChangesInUserAndSave(jsonUser); } @@ -112,7 +112,7 @@ public class ImportWorkerResponseHandler extends JsonResponseHandler { if(project == null){ //System.out.println("User does not exist... trying to create"); - if(null == checkAndCreateProject(jsonThesis)){ + if(null == checkAndCreateProject(jsonThesis,options)){ thesesCreationsErrors++; } else { thesesCreations++; diff --git a/src/main/java/se/su/dsv/scipro/json/JsonResponseHandler.java b/src/main/java/se/su/dsv/scipro/json/JsonResponseHandler.java index 94f0024cb4..b28c809bb4 100644 --- a/src/main/java/se/su/dsv/scipro/json/JsonResponseHandler.java +++ b/src/main/java/se/su/dsv/scipro/json/JsonResponseHandler.java @@ -1,13 +1,16 @@ package se.su.dsv.scipro.json; import java.util.Date; +import java.util.HashSet; import java.util.Iterator; +import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; +import org.springframework.transaction.annotation.Transactional; import se.su.dsv.scipro.ApplicationSettings; import se.su.dsv.scipro.data.dao.interfaces.ProjectClassDao; @@ -31,7 +34,7 @@ import se.su.dsv.scipro.jsonobjects.JsonUser; import se.su.dsv.scipro.jsonobjects.JsonUserRole; import se.su.dsv.scipro.jsonobjects.JsonUsername; /** - * Package-private sase class for JsonResponseHandlers. + * Package-private base class for JsonResponseHandlers. * Contains a number of utility methods to lessen boilerplate code inside implementations. */ abstract class JsonResponseHandler implements IResponseHandler { @@ -67,9 +70,10 @@ abstract class JsonResponseHandler implements IResponseHandler { /** * Creates and persists a User from a JsonUser * @param jsonUser the JsonUser to use for creation + * @param doFullCheck If true, checkAndCreateProject will be called on each project included in the query response. * @return The created User or null if it cannot be persisted. */ - protected User createThesisUser(JsonUser jsonUser, boolean doFullCheck){ + protected User createThesisUser(final JsonUser jsonUser, final RemoteLookupOptions options){ User user = new User(); user.setFirstName(jsonUser.firstName); user.setLastName(jsonUser.lastName); @@ -110,18 +114,21 @@ abstract class JsonResponseHandler implements IResponseHandler { /* * Create any projects of which the user is a member of */ - if(doFullCheck){ + if(options.getLookupDepth().equals(RemoteLookupOptions.LOOKUP_DEPTH.PROJECT_AND_PARTICIPANTS)){ for(JsonThesis jThesis : jsonUser.theses){ - checkAndCreateProject(jThesis); + checkAndCreateProject(jThesis, options); } } numUsersCreated++; return user; } - - protected Project checkAndCreateProject(JsonThesis jThesis) { + /** + * Retrieve a Project matching the given JsonThesis ID, and create a project matching the supplied JsonThesis in full if it does not already exists. + * @param jThesis + * @return The retrieved (or newly created) project. + */ + protected Project checkAndCreateProject(JsonThesis jThesis, final RemoteLookupOptions options) { Project project = null; - //System.out.println("Creating project:" + jThesis.thesisID); project = projectDao.getProjectByIdentifier(jThesis.thesisID); if(project == null){ project = new Project(); @@ -139,48 +146,48 @@ abstract class JsonResponseHandler implements IResponseHandler { if(jThesis.daisyStartDate > 0){ Date daisyStartDate = new Date(jThesis.daisyStartDate); project.setDaisyStartDate(daisyStartDate); - } project = projectDao.save(project); //Synch participants - for(JsonThesisParticipant jtp : jThesis.participants){ - User u = userDao.getUserByIdentifier(jtp.id); - //Attempt remote lookup if no user is found - if(u == null){ - final Long id = Long.valueOf(jtp.id); - if( (u = userLookupFromIdentifier.lookup(id)) == null){ - throw new RuntimeException("Cannot save jsonuser with jsonuserid: " + jtp.id); - } - } - //Move on - if(jtp.role.equals("SUPERVISOR")){ - Employee e = roleDao.makeEmployee(u); - project.setHeadSupervisor(e); - }else if(jtp.role.equals("PARTICIPANT")){ - Student s = roleDao.makeStudent(u); - project.getProjectParticipants().add(s); - } - else{ - ProjectFollower pf = new ProjectFollower(); - - if(jtp.role.equals("ASSISTANT_SUPERVISOR")){ - pf.setProjectRole(ProjectTeamMemberRoles.CO_SUPERVISOR); - pf.setFollower((Employee)roleDao.makeEmployee(u)); - }else if(jtp.role.equals("OPPONENT")){ - //TODO: OPPONENT - }else if (jtp.role.equals("EXAMINER")){ - pf.setProjectRole(ProjectTeamMemberRoles.REVIEWER); - pf.setFollower(roleDao.makeEmployee(u)); - } - if(pf.getFollower() != null && pf.getProjectRole() != null){ - pf.setProject(project); - pf = projectFollowerDao.save(pf); - project.getProjectFollowers().add(pf); - + if(options.getLookupDepth().equals(RemoteLookupOptions.LOOKUP_DEPTH.PROJECT_AND_PARTICIPANTS)){ + for(JsonThesisParticipant jtp : jThesis.participants){ + User u = userDao.getUserByIdentifier(jtp.id); + //Attempt remote lookup if no user is found + if(u == null){ + final Long id = Long.valueOf(jtp.id); + if( (u = userLookupFromIdentifier.lookup(id, new RemoteLookupOptions(RemoteLookupOptions.LOOKUP_DEPTH.NONE))) == null){ + logger.warn("Cannot create jsonuser with jsonuserid: " + jtp.id+" while adding participants for the project: "+project.getIdentifier()); + continue; + } + } + //Move on, set participant roles + if(jtp.role.equals("SUPERVISOR")){ + Employee e = roleDao.makeEmployee(u); + project.setHeadSupervisor(e); + }else if(jtp.role.equals("PARTICIPANT")){ + Student s = roleDao.makeStudent(u); + project.getProjectParticipants().add(s); + }else{ + ProjectFollower pf = new ProjectFollower(); + if(jtp.role.equals("ASSISTANT_SUPERVISOR")){ + pf.setProjectRole(ProjectTeamMemberRoles.CO_SUPERVISOR); + pf.setFollower((Employee)roleDao.makeEmployee(u)); + }else if(jtp.role.equals("OPPONENT")){ + //TODO: OPPONENT + }else if (jtp.role.equals("EXAMINER")){ + pf.setProjectRole(ProjectTeamMemberRoles.REVIEWER); + pf.setFollower(roleDao.makeEmployee(u)); + } + if(pf.getFollower() != null && pf.getProjectRole() != null){ + pf.setProject(project); + pf = projectFollowerDao.save(pf); + project.getProjectFollowers().add(pf); + + } } } + project = projectDao.save(project); } - project = projectDao.save(project); } project = projectDao.getProjectByIdentifier(jThesis.thesisID); return project; @@ -243,7 +250,7 @@ abstract class JsonResponseHandler implements IResponseHandler { }else{ try { - checkAndCreateProject(jThesis); + checkAndCreateProject(jThesis,new RemoteLookupOptions()); } catch (Exception e) { logger.error("Error when creating project: daisyId=" + jThesis.thesisID + "when looking up user:" +jsonUser.firstName+ " "+jsonUser.lastName+" \n" + e.getMessage()); @@ -376,9 +383,9 @@ abstract class JsonResponseHandler implements IResponseHandler { if(u == null){ final Long id = Long.valueOf(jtp.id); try { - u = userLookupFromIdentifier.lookup(id); + u = userLookupFromIdentifier.lookup(id, new RemoteLookupOptions(RemoteLookupOptions.LOOKUP_DEPTH.NONE)); } catch (Exception e) { - logger.error("Failed to save changes for project:" + current.getIdentifier() + " when looking up user whith idetifier:"+jtp.id+ + logger.error("Failed to save changes for project:" + current.getIdentifier() + " when looking up user with identifier:"+jtp.id+ " Rolling back...\n" + e.getMessage()); throw new RuntimeException(e); } @@ -458,7 +465,7 @@ abstract class JsonResponseHandler implements IResponseHandler { /* * Force subclasses to handle the response */ - public abstract void handleResponse(String response); + public abstract void handleResponse(final String response, final RemoteLookupOptions options); /* * Getters for logging diff --git a/src/main/java/se/su/dsv/scipro/json/JsonUserFullResponseHandler.java b/src/main/java/se/su/dsv/scipro/json/JsonUserFullResponseHandler.java index 442a149c68..1aaf31a2d9 100644 --- a/src/main/java/se/su/dsv/scipro/json/JsonUserFullResponseHandler.java +++ b/src/main/java/se/su/dsv/scipro/json/JsonUserFullResponseHandler.java @@ -32,7 +32,7 @@ public class JsonUserFullResponseHandler extends JsonResponseHandler { * * @param response the json string */ - public void handleResponse(String response) { + public void handleResponse(final String response, final RemoteLookupOptions options) { JsonUserContainer userContainer = null; try{ @@ -52,13 +52,11 @@ public class JsonUserFullResponseHandler extends JsonResponseHandler { //Loop all users in the response and look for changes... for(JsonUser jsonUser : userContainer.users){ - System.out.println("Checking: " + " id: " + jsonUser.id + " firstName: "+ jsonUser.firstName); + logger.debug("Checking: " + jsonUser); User thesisUser = userDao.getUserByIdentifier(new Long(jsonUser.id)); for(JsonUsername jsonUsername : jsonUser.usernames){ - - System.out.println(jsonUsername.username); - + logger.debug("\t"+jsonUsername.username); String usernameString = jsonUsername.username.toLowerCase().trim(); String userRealmString = jsonUsername.realm.toUpperCase().trim(); User potentialDuplicateUser = userDao.getUserByUsername(usernameString, userRealmString); @@ -108,7 +106,7 @@ public class JsonUserFullResponseHandler extends JsonResponseHandler { if(thesisUser == null){ //System.out.println("User does not exist... trying to create"); - if(null == createThesisUser(jsonUser,true)){ + if(null == createThesisUser(jsonUser,options)){ userCreationErrors++; } else { createdUsers++; diff --git a/src/main/java/se/su/dsv/scipro/json/JsonUserResponseHandler.java b/src/main/java/se/su/dsv/scipro/json/JsonUserResponseHandler.java index 69d956016c..33b3c96993 100644 --- a/src/main/java/se/su/dsv/scipro/json/JsonUserResponseHandler.java +++ b/src/main/java/se/su/dsv/scipro/json/JsonUserResponseHandler.java @@ -29,16 +29,16 @@ public class JsonUserResponseHandler extends JsonResponseHandler { * * @param response the json string */ - public void handleResponse(String response) { + public void handleResponse(final String response, final RemoteLookupOptions options) { JsonUserContainer userContainer = null; logger.debug(response); try{ Gson gson = new Gson(); Type type = new TypeToken<JsonUserContainer>(){}.getType(); userContainer = gson.fromJson(response, type); - } catch (Exception e) { - logger.error("Gson error when creating objects from json \n" + e.getMessage()); + logger.error("Gson error when creating objects from json response" + e.getMessage()); + logger.error("Full response from remote:" + response); return; } int createdUsers = 0; @@ -47,12 +47,11 @@ public class JsonUserResponseHandler extends JsonResponseHandler { //Loop all users in the response and look for changes... for(JsonUser jsonUser : userContainer.users){ - logger.debug("Checking identifier: " + jsonUser.id); + logger.debug("Checking " + jsonUser.id); User thesisUser = userDao.getUserByIdentifier(Long.valueOf(jsonUser.id)); - if(thesisUser == null){ - logger.debug("User '"+jsonUser.id+ "' does not exist, trying to create"); - if(null == createThesisUser(jsonUser,false)){ + logger.debug("User '"+jsonUser.id+ "' does not exist locally, trying to create"); + if(null == createThesisUser(jsonUser,options)){ userCreationErrors++; } else { createdUsers++; diff --git a/src/main/java/se/su/dsv/scipro/json/RemoteLookupOptions.java b/src/main/java/se/su/dsv/scipro/json/RemoteLookupOptions.java new file mode 100644 index 0000000000..cdf1a6e34c --- /dev/null +++ b/src/main/java/se/su/dsv/scipro/json/RemoteLookupOptions.java @@ -0,0 +1,18 @@ +package se.su.dsv.scipro.json; + +/** + * Bla bla bla + */ +public final class RemoteLookupOptions { + public enum LOOKUP_DEPTH{NONE,PROJECT_AND_PARTICIPANTS}; + private final LOOKUP_DEPTH depth; + public RemoteLookupOptions(){ + this(LOOKUP_DEPTH.NONE); + } + public RemoteLookupOptions(final LOOKUP_DEPTH depth){ + this.depth = depth; + } + public LOOKUP_DEPTH getLookupDepth(){ + return depth; + } +} \ No newline at end of file diff --git a/src/main/java/se/su/dsv/scipro/json/RequestSender.java b/src/main/java/se/su/dsv/scipro/json/RequestSender.java index a2f4629e2e..20199e1ce6 100644 --- a/src/main/java/se/su/dsv/scipro/json/RequestSender.java +++ b/src/main/java/se/su/dsv/scipro/json/RequestSender.java @@ -9,8 +9,6 @@ import java.net.URL; import java.util.HashMap; import java.util.Map; -import javax.net.ssl.HttpsURLConnection; - import org.apache.log4j.Level; import org.apache.log4j.Logger; @@ -20,66 +18,40 @@ import org.apache.log4j.Logger; * @author Dan Kjellman * */ -public class RequestSender { +public final class RequestSender { - public static final int REQUEST_TYPE_POST = 0; - public static final int REQUEST_TYPE_GET = 1; - public static final String[] REQUEST_METHODS = new String[]{ - "POST", "GET" - }; - - private Logger logger; + public enum REQUEST_TYPE{POST,GET}; + private final REQUEST_TYPE requestType; + private Logger logger = Logger.getLogger(RequestSender.class); /* * The Handler for the response */ - protected IResponseHandler responseHandler; - + private IResponseHandler responseHandler; /* * The params */ - protected Map<String, String> parameters; - + private Map<String, String> parameters; /* * The url to call */ - protected String url; + private String url; + //Options for performed lookups + private final RemoteLookupOptions remoteLookupOptions; - /* - * Type of request, use the static variables REQUEST_TYPE_POST or REQUEST_TYPE_GET - */ - protected int requestType; - - public RequestSender(IResponseHandler responseHandler, String url, Map<String, String> parameters, int requestType){ - - logger = Logger.getLogger(this.getClass()); - - if(requestType != REQUEST_TYPE_GET && requestType != REQUEST_TYPE_POST){ - logger.log(Level.ERROR, "Could not send request, no request type specified"); - throw new IllegalArgumentException("Bad request type"); - } - + public RequestSender(final IResponseHandler responseHandler, final String url, final Map<String, String> parameters, final RemoteLookupOptions options, final REQUEST_TYPE requestType){ if(responseHandler == null){ logger.log(Level.ERROR, "Could not send request, no response handler was provided"); throw new IllegalArgumentException("You need no provide a handler for the response"); } - + remoteLookupOptions = (options==null?new RemoteLookupOptions():options); this.responseHandler = responseHandler; this.url = url; this.parameters = parameters; this.requestType = requestType; } - public RequestSender(IResponseHandler responseHandler, String url){ - - if(responseHandler == null){ - throw new IllegalArgumentException("You need no provide a handler for the response"); - } - - this.responseHandler = responseHandler; - this.url = url; - this.parameters = new HashMap<String, String>(); - this.requestType = REQUEST_TYPE_GET; + this(responseHandler,url,new HashMap<String,String>(),null,REQUEST_TYPE.GET); } /** @@ -100,7 +72,7 @@ public class RequestSender { count++; } - if(requestType == REQUEST_TYPE_GET && parameters.size() > 0){ + if(requestType == REQUEST_TYPE.GET && parameters.size() > 0){ url += "?" + parameterData; } @@ -112,7 +84,7 @@ public class RequestSender { URL u = new URL(url); conn = (HttpURLConnection) u.openConnection(); - conn.setRequestMethod(REQUEST_METHODS[requestType]); + conn.setRequestMethod(requestType.name()); /* * Set connect timeout to 60 seconds and read timeout to 120 sec @@ -122,7 +94,7 @@ public class RequestSender { conn.setConnectTimeout(1000 * 60); conn.setReadTimeout(1000 * 120); - if(requestType == REQUEST_TYPE_POST){ + if(requestType == REQUEST_TYPE.POST){ conn.setDoOutput(true); osr = new OutputStreamWriter(conn.getOutputStream()); osr.write(parameterData); @@ -136,7 +108,7 @@ public class RequestSender { while((line = br.readLine()) != null){ response += line; } - responseHandler.handleResponse(response); + responseHandler.handleResponse(response, remoteLookupOptions); } catch (IOException e){ /* @@ -152,11 +124,9 @@ public class RequestSender { if(conn != null){ conn.disconnect(); } - if(osr != null){ osr.close(); } - if(br != null){ br.close(); } diff --git a/src/main/resources/applicationContext.xml b/src/main/resources/applicationContext.xml index bbc70d4ac6..2e26e2d9e2 100644 --- a/src/main/resources/applicationContext.xml +++ b/src/main/resources/applicationContext.xml @@ -33,7 +33,7 @@ By default it's turned off since we don't have access to the daisy search yet --> <property name="enableRemoteUserLookup" value="true"></property> - <!-- This property points to the location of the daisy json search --> + <!-- This property points to the location of the remote system used for json requests --> <property name="remoteLookupUrl" value="https://thesis.dsv.su.se/match/json" /> <!-- External auth support (via J2EE standard mechanism REMOTE_USER), if true: other authentication mechanics will be bypassed.--> <property name="acceptExternalAuthentication" value="true"/> diff --git a/src/test/java/se/su/dsv/scipro/security/auth/TestAuthRoutines.java b/src/test/java/se/su/dsv/scipro/security/auth/TestAuthRoutines.java index c59375a092..cd032a41e0 100644 --- a/src/test/java/se/su/dsv/scipro/security/auth/TestAuthRoutines.java +++ b/src/test/java/se/su/dsv/scipro/security/auth/TestAuthRoutines.java @@ -34,6 +34,7 @@ import se.su.dsv.scipro.data.dataobjects.User; import se.su.dsv.scipro.data.dataobjects.Username; import se.su.dsv.scipro.json.IUserLookupFromIdentifier; import se.su.dsv.scipro.json.IUserLookupFromUsername; +import se.su.dsv.scipro.json.RemoteLookupOptions; import se.su.dsv.scipro.repository.util.RepositoryManager; import se.su.dsv.scipro.util.KeyValuePair; @@ -54,7 +55,7 @@ public class TestAuthRoutines { //Fake a lookup mechanism fixedLookupFromUsername = new IUserLookupFromUsername(){ @Override - public User lookup(final KeyValuePair<String> userAtRealm){ + public User lookup(final KeyValuePair<String> userAtRealm, final RemoteLookupOptions options){ if(userAtRealm.getKey().equals("kalle-kula")) return user; else @@ -63,7 +64,7 @@ public class TestAuthRoutines { }; fixedLookupFromIdentifier = new IUserLookupFromIdentifier(){ @Override - public User lookup(final Long identifier){ + public User lookup(final Long identifier, final RemoteLookupOptions options){ if(identifier.equals(666)) return user; else