package com.processpuzzle.application.security.control; import java.io.IOException; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.processpuzzle.application.configuration.domain.ProcessPuzzleContext; import com.processpuzzle.application.configuration.domain.PropertyKeys; import com.processpuzzle.application.control.control.CommandDispatcher; import com.processpuzzle.application.control.control.CommandInterface; import com.processpuzzle.application.security.domain.User; import com.processpuzzle.application.security.domain.UserFactory; import com.processpuzzle.internalization.domain.ProcessPuzzleLocale; import com.processpuzzle.party.domain.PartyRepository; import com.processpuzzle.party.domain.Person; import com.processpuzzle.persistence.domain.DefaultUnitOfWork; import com.processpuzzle.user_session.domain.UserRequestManager; import com.processpuzzle.user_session.domain.UserSession; public class LoginCommand implements CommandInterface { ProcessPuzzleContext applicationContext = UserRequestManager.getInstance().getApplicationContext(); PartyRepository repository = (PartyRepository) applicationContext.getRepository( PartyRepository.class ); public static String USER_PARAM_NAME = "userName"; public static String PASSWORD_PARAM_NAME = "password"; private String userName; private String password; private Person signedInUser; private UserFactory userFactory; private ServletContext servletContext = null; public void init( CommandDispatcher dispatcher ) { this.servletContext = dispatcher.getServletContext(); userFactory = applicationContext.getEntityFactory( UserFactory.class ); } public String execute( CommandDispatcher dispatcher ) throws Exception { HttpServletRequest request = dispatcher.getRequest(); HttpServletResponse response = dispatcher.getResponse(); if( request.getParameter( "method" ) != null && request.getParameter( "method" ).equals( "logout" ) ){ String id = ""; UserSession userSession = (UserSession) dispatcher.getRequest().getSession().getAttribute( "userSession" ); if( userSession != null ) id = userSession.getUser().getId().toString(); request.getSession().setAttribute( "userSession", null ); if( !(id.equals( "" )) ){ Collection<String> loggedInUsers = (Collection<String>) dispatcher.getServletContext().getAttribute( "loggedInUsers" ); for( Iterator<String> iter = loggedInUsers.iterator(); iter.hasNext(); ){ String element = (String) iter.next(); if( element.equals( id ) ){ loggedInUsers.remove( element ); dispatcher.getServletContext().setAttribute( "loggedInUsers", loggedInUsers ); break; } } } StringBuffer responseXml = new StringBuffer(); responseXml.append( "<?xml version=\"1.0\" ?>" ); responseXml.append( "<logoutResponse value='true'>" ); responseXml.append( "</logoutResponse>" ); response.setContentType( "text/xml" ); response.setCharacterEncoding( "UTF-8" ); response.setHeader( "Cache-Control", "no-cache" ); response.getWriter().write( responseXml.toString() ); dispatcher.getServletContext().setAttribute( "haltApplication", "false" ); }else{ userName = dispatcher.getProperties().getProperty( USER_PARAM_NAME ); password = dispatcher.getProperties().getProperty( PASSWORD_PARAM_NAME ); findUser(); buildXmlResponse( request, response ); saveSignedInUserInSession( dispatcher ); } return ""; } // Getters, setters public String getName() { return this.getClass().getName(); } public ServletContext getServletContext() { return servletContext; } // Protected, private helper methods private void buildXmlResponse( HttpServletRequest request, HttpServletResponse response ) throws IOException { String responseXml = "<?xml version=\"1.0\" ?>"; if( signedInUser != null ){ // Collection replacements = signedInUser.getReplacements(); responseXml += "<loginResponse value='true'>"; responseXml += "<user>"; if( signedInUser != null ){ responseXml += "<id>" + signedInUser.getSystemUser().getId() + "</id>"; responseXml += "<name>" + signedInUser.getPartyName().getName() + "</name>"; responseXml += "<location>" + signedInUser.getSystemUser().getLocation() + "</location>"; if( signedInUser.getSystemUser().getPrefferedLocale() != null ) responseXml += "<prefferedLanguage>" + signedInUser.getSystemUser().getPrefferedLocale().getLanguage() + "</prefferedLanguage>"; else{ ProcessPuzzleContext applicationContext = UserRequestManager.getInstance().getApplicationContext(); responseXml += "<prefferedLanguage>" + applicationContext.getProperty( PropertyKeys.INTERNALIZATION_DEFAULT_LOCALE.getXPathKey() ) + "</prefferedLanguage>"; } // if( !replacements.isEmpty() ){ // responseXml += "<replacements>"; // for (Iterator replacementIteraror = replacements.iterator(); // replacementIteraror // .hasNext();) { // Person person = (Person) replacementIteraror.next(); // responseXml += "<substituted>" // + "<id>"+person.getId()+"</id>" // + "<name>"+person.getPartyName.getName()+"</name>" // + "</substituted>"; // } // responseXml += "</replacements>"; // } // responseXml += "</user>"; // responseXml += "</loginResponse>"; System.out.println( responseXml ); }else responseXml += "<name></name>"; responseXml += "</user>"; responseXml += "</loginResponse>"; }else{ responseXml += "<loginResponse value='false'>"; responseXml += "</loginResponse>"; } response.setContentType( "text/xml" ); response.setCharacterEncoding( "UTF-8" ); response.setHeader( "Cache-Control", "no-cache" ); response.getWriter().write( responseXml ); } private void findUser() { DefaultUnitOfWork work = new DefaultUnitOfWork( true ); Collection<?> persons = (Collection<?>) repository.findAllOrderedActivePerson( work, "partyName asc" ); for( Iterator<?> iter = persons.iterator(); iter.hasNext(); ){ Person person = (Person) iter.next(); if( person.getSystemUser() != null ){ if( (person.getSystemUser().getUserName() != null) && (person.getSystemUser().getPassword() != null) && (person.getSystemUser().getUserName().equals( userName )) && (person.getSystemUser().getPassword().equals( password )) ){ signedInUser = person; break; } } } work.finish(); } @SuppressWarnings( "unchecked" ) private void saveSignedInUserInSession( CommandDispatcher dispatcher ) { if( signedInUser != null ){ @SuppressWarnings("unused") String fullName = signedInUser.getPartyName().getName(); String userName = signedInUser.getSystemUser().getUserName(); String password = signedInUser.getSystemUser().getPassword(); User user = userFactory.createUser( userName, password ); if( signedInUser.getSystemUser().getPrefferedLocale() != null ){ ProcessPuzzleLocale preferedLocale = new ProcessPuzzleLocale( signedInUser.getSystemUser().getPrefferedLocale().getLanguage() ); user.setPrefferedLocale( preferedLocale ); } // user.setPartyRoleType( signedInUser.getPartyType().getName() ); dispatcher.getRequest().getSession().setAttribute( "userSession", user ); Collection<String> loggedInUsers = (Collection<String>) dispatcher.getServletContext().getAttribute( "loggedInUsers" ); if( loggedInUsers == null ) loggedInUsers = new HashSet<String>(); loggedInUsers.add( user.getId().toString() ); dispatcher.getServletContext().setAttribute( "loggedInUsers", loggedInUsers ); } } }