package com.evolute.siprp.pagina; import java.io.IOException; import java.io.StringWriter; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.util.Iterator; import java.util.Map; import java.util.Properties; import java.util.StringTokenizer; import java.util.Vector; import javax.servlet.ServletContext; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import com.evolute.utils.Singleton; import com.evolute.utils.arrays.ResultSet2DArray; import com.evolute.utils.arrays.Virtual2DArray; import com.evolute.utils.db.DBManager; import com.evolute.utils.db.Executer; import com.evolute.utils.db.JDBCManager; import com.evolute.utils.sql.Select; public class siprpServlet extends HttpServlet implements GlobalConstants { private static final long serialVersionUID = 1L; // MSG public static final String msgErroNoUser = "Tem+de+especificar+um+utilizador."; public static final String msgErroAuthFail = "Utilizador+inexistente+e/ou+Password+errada."; public static final String msgErroBd = "Erro+na+ligaç&atiolde;o+à+base+de+dados."; public static final String msgGenericError = "Erro"; public static final String msgListaEmpresas = "Empresas"; public static final String msgAcessoNegado = "Acesso+Negado."; public static final String msgLinkFormatError = "URL+inválido."; public static final String msgLogin = "Login"; public static final String msgNovaPasswordErrada = "Erro+ao+criar+a+nova+password,+nova+password+inválida."; public static final String msgButtonNotSuported = "funcionalidade+ainda+não+suportada."; public static final String msgSessionTimeout = "Por+razões+de+segurança+o+tempo+da+sua+sessão+expirou
" + "Por+favor+efectue+novamente+o+seu+login.
"; // Templates - Nomes e valores // public static final String loginTemplate = "login.html"; public static final String indexTemplate = "index.html"; public static final String authenticatedUserTemplate = "user.html"; public static final String authenticatedUserPrintTemplate = "user_print.html"; public static final String errorTemplate = "erro.html"; // public static final String errorTemplate = "frame_erro.html"; // public static final String innerErrorTemplate = "erro.html"; public static final String mainTemplate = "main.html"; // public static final String criticalErrorTemplate = "critical.html"; public static final String templateVector1 = "v1"; public static final String templateVector2 = "v2"; public static final String templateVector3 = "v3"; public static final String templateUserRole = "userRole"; public static final String msgTemplate = "msg"; public static final String templateQuery = "query"; public static final String buttonPressedTemplate = "buttonPressed"; // Query Strings , usadas para na template do velocity saber o que mostar public static final String queryStringErro = "erro"; public static final String queryStringEmpresas = "empresas"; public static final String queryStringEstabelecimentos = "estabelecimentos"; public static final String queryStringOpcoes = "opcoes"; public static final String queryStringFicheiros = "ficheiros"; public static final String queryStringTrabalhadores = "trabalhadores"; public static final String queryStringTrabalhador = "trabalhador"; // Botoes, saber qual o botao escholido, campo value dos forms public static final String botaoLogin = "Entrar"; public static final String botaoMarcarProximoExame = "Marcar Exame"; // Var da Session public static final String sessionUser = "user"; public static final String sessionUserRole = "userRole"; public static final String sessionPassword = "password"; public static final String sessionEmpresaId = "empresaId"; public static final String sessionEstabelecimentoId = "estabelecimentoId"; public static final String sessionTrabalhadorId = "trabalhadorId"; public static final String sessionCompanyName = "sessionCompanyName"; public static final String sessionCompanyEmail = "sessionCompanyEmail"; public static final int sessionTimeout = 3600; // segundos public static final String servletName = "siprpWeb"; public static final String superUserRole = "manager"; // // BD // public static final String bdHost = "127.0.0.1"; // public static final String bdPort = "5436"; // public static final String bdUsername = "siprp"; // public static final String bdPassword = ""; // public static final String bdDriver = "org.postgresql.Driver"; // public static final String bdUrl = "jdbc:postgresql://" + bdHost + ":" + // bdPort + "/siprp"; public static final String bdEmpresaIdRef = "id"; // campo que contem id da empresa public static final String bdEmpresaNomeRef = "designacao_social"; // campo que contem nome da empresa public static final String bdEstIdRef = "id"; // campo que contem nome do estabelecimento public static final String bdEstNomeRef = "nome"; // campo que contem nome do estabelecimento public static final String bdTrabIdRef = "id"; // campo que contem id do trabalhador public static final String bdTrabNomeRef = "nome"; // campo que contem nome do trabalhador public static final String bdNullString = ""; // String a mostrar quando o campo lido da BD e' null public static final String bdEmailEmpresa = "email"; // campo que contem email da empresa protected static ServletContext CONTEXT; // Arrays // nome que o user ve, nome do campo na tabela public static final String[][] trabalhadorDescFields = new String[][] { { "Nome", "nome" }, { "N\u00ba", "numero_mecanografico", }, { "\u00DAltimo Exame", "ultimo_exame" }, { "Realizado", "realizado" }, { "Pr\u00F3ximo Exame", "proximo_exame" }, { "\u00DAltima Consulta", "ultima_consulta" }, { "Realizada", "realizada" }, { "Pr\u00F3xima Consulta", "proxima_consulta" } }; public void init() { try { CONTEXT = this.getServletContext(); String TEMPLATE_DIR = this.getServletContext().getRealPath( "/" ) + "html/"; System.out.println( "DIR: " + TEMPLATE_DIR ); Properties props = new Properties(); props.setProperty( "file.resource.loader.path", TEMPLATE_DIR ); Velocity.init( props ); Class.forName( bdDriver ); } catch ( Exception e ) { SiprpWebLogger.logException( e ); } } public void doGet( HttpServletRequest req, HttpServletResponse res ) throws IOException { String queryString = req.getQueryString(); String backUri = req.getRequestURI(); ServletOutputStream out = res.getOutputStream(); // res.setContentType( "text/html" ); res.setContentType( "text/html" ); try { System.out.println( "query: " + queryString ); HttpSession session = req.getSession( true ); session.setMaxInactiveInterval( sessionTimeout ); if ( queryString == null ) // Reload, 1a vez, etc ... { session.invalidate(); out.println( mergeTemplate( "", indexTemplate ) ); } else if ( session.isNew() && !( queryString.indexOf( queryStringErro ) == 0 ) ) // session // timeout { session.invalidate(); String msgErro = msgSessionTimeout.replace( '+', ' ' ); out.println( mergeTemplate( msgErro, indexTemplate ) ); // doErro(queryString, out); } else if ( queryString.equals( queryStringEmpresas ) ) // Listar // Empresas { new doGetListaEmpresas( req, res ); } else if ( queryString.indexOf( queryStringErro ) == 0 ) // Listar // Empresas { // System.out.println( "entrou" ); doErro( queryString, out ); } else // interpretar query string { String empresa = null, estabelecimentoOuFicheiros = null, opcao = null, trabalhador = null, ficheiro = null; String query = null; int checkInt; StringTokenizer sToken = new StringTokenizer( queryString, "/" ); empresa = sToken.nextToken(); // empresa ID checkInt = Integer.parseInt( empresa ); // check int, // NumberFormatException if ( sToken.hasMoreElements() ) { estabelecimentoOuFicheiros = sToken.nextToken(); // estabelecimento ID if(!estabelecimentoOuFicheiros.equals("fich")) { checkInt = Integer.parseInt( estabelecimentoOuFicheiros ); // check // int, // NumberFormatException if ( sToken.hasMoreElements() ) { opcao = sToken.nextToken(); if( sToken.hasMoreElements() ) { if(opcao.equals("fich")) { ficheiro = sToken.nextToken(); } else { trabalhador = sToken.nextToken(); // trabalhador ID try { checkInt = Integer.parseInt( trabalhador ); // check // int, // NumberFormatException } catch ( NumberFormatException nfex ) { query = trabalhador; if ( query.indexOf( "trabalhadores_tudo" ) != 0 && query.indexOf( "trabalhadores_pendentes" ) != 0 && query.indexOf( "_print" ) == -1 ) { throw nfex; } } } } } } else { if ( sToken.hasMoreElements() ) { ficheiro = sToken.nextToken(); } } } if ( estabelecimentoOuFicheiros == null ) // empresa query { session.setAttribute( sessionEmpresaId, empresa ); // update // HTTP // Session new doGetListaEstabelecimentos( req, res ); // out.println( mergeTemplate ( empresa, loginTemplate ) ) ; } else if ( opcao == null )//opcao query { session.setAttribute( sessionEmpresaId, empresa ); // update // HTTP // Session session.setAttribute( sessionEstabelecimentoId, estabelecimentoOuFicheiros ); if(estabelecimentoOuFicheiros.equals("fich") && ficheiro != null) { new doGetFicheiro(req, res, ficheiro); } else if(estabelecimentoOuFicheiros.equals("fich")) { new doGetListaFicheiros(req, res, true); } else { new doGetFuncionariosFicheiros( req, res ); } } else if ( trabalhador == null || query != null ) // estabelecimento query { session.setAttribute( sessionEmpresaId, empresa ); // update // HTTP // Session session.setAttribute( sessionEstabelecimentoId, estabelecimentoOuFicheiros ); //new doGetFuncionariosFicheiros( req, res ); if(opcao.equals("func")) { new doGetListaTrabalhadores( req, res, query ); } else if(opcao.equals("fich") && ficheiro != null) { new doGetFicheiro(req, res, ficheiro); } else if(opcao.equals("fich")) { new doGetListaFicheiros(req, res, false); } // out.println( mergeTemplate ( // " chama oGeHashtabletListaTrabalhadores", loginTemplate ) // ) ; } else // trabalhador query { session.setAttribute( sessionEmpresaId, empresa ); // update // HTTP // Session session.setAttribute( sessionEstabelecimentoId, estabelecimentoOuFicheiros ); session.setAttribute( sessionTrabalhadorId, trabalhador ); new doGetTrabalhador( req, res ); // out.println( mergeTemplate ( trabalhador, loginTemplate ) // ) ; } } } catch ( NumberFormatException e ) // argumentos invalidos { SiprpWebLogger.logException( e ); out.println( mergeTemplate( msgLinkFormatError, backUri, errorTemplate ) ); } catch ( IllegalStateException e ) // session timeout { SiprpWebLogger.logException( e ); out.println( mergeTemplate( msgSessionTimeout, errorTemplate ) ); } catch ( Exception e ) { SiprpWebLogger.logException( e ); // out.println( mergeTemplate( msgGenericError , backUri, // errorTemplate ) ); out.println( mergeTemplate( msgGenericError, errorTemplate ) ); } // System.out.println( "fim - " + queryString + " bu " + backUri ); } public void doPost( HttpServletRequest req, HttpServletResponse res ) throws IOException { ServletOutputStream out = res.getOutputStream(); // StringBuffer dbQuery; // ResultSet2DArray rs; // Connection con = null ; // Statement stmt = null ; // String user, userRole, password; String buttonPressed = req.getParameter( "form" ); res.setContentType( "text/html" ); try { if ( buttonPressed.equals( botaoLogin ) ) { new doPostLogin( req, res ); } else { out.println( mergeTemplate( msgButtonNotSuported, errorTemplate ) ); } } /* * catch ( SQLException e ) { SiprpWebLogger.logException( e ); out.println( * mergeTemplate( msgErroBd , criticalErrorTemplate) ); } */ catch ( IllegalStateException e ) // session timeout { SiprpWebLogger.logException( e ); out.println( mergeTemplate( msgSessionTimeout, errorTemplate ) ); } catch ( Exception e ) { SiprpWebLogger.logException( e ); out.println( mergeTemplate( msgGenericError, errorTemplate ) ); } } public String mergeTemplate( Map< String, Object > values, String template ) { VelocityContext context = new VelocityContext(); StringWriter output = new StringWriter(); try { Iterator< String > it = values.keySet().iterator(); while ( it.hasNext() ) { String key = it.next(); context.put( key, values.get( key ) ); } Velocity.mergeTemplate( template, Velocity.ENCODING_DEFAULT, context, output ); return output.toString(); } catch ( Exception e ) { SiprpWebLogger.logException( e ); } return null; } public String mergeTemplate( String msg, String template ) // #1 { VelocityContext context = new VelocityContext(); StringWriter output = new StringWriter(); try { context.put( msgTemplate, msg ); Velocity.mergeTemplate( template, Velocity.ENCODING_DEFAULT, context, output ); return output.toString(); } catch ( Exception e ) { SiprpWebLogger.logException( e ); } return null; } public String mergeTemplate( String msg, String userRole, String template ) // #1 { VelocityContext context = new VelocityContext(); StringWriter output = new StringWriter(); try { context.put( msgTemplate, msg ); context.put( templateUserRole, userRole ); Velocity.mergeTemplate( template, Velocity.ENCODING_DEFAULT, context, output ); return output.toString(); } catch ( Exception e ) { SiprpWebLogger.logException( e ); } return null; } public String mergeTemplate( String msg, String userRole, String querySelected, Vector vector1, Vector vector2, Vector vector3, String template ) // #2 { VelocityContext context = new VelocityContext(); StringWriter output = new StringWriter(); try { context.put( msgTemplate, msg ); context.put( templateUserRole, userRole ); context.put( templateQuery, querySelected ); context.put( templateVector1, vector1 ); context.put( templateVector2, vector2 ); context.put( templateVector3, vector3 ); Velocity.mergeTemplate( template, Velocity.ENCODING_DEFAULT, context, output ); return output.toString(); } catch ( Exception e ) { SiprpWebLogger.logException( e ); } return null; } public void destroy() { } public void handleSessionTimeout( HttpServletResponse res, String template ) throws IOException { ServletOutputStream out = res.getOutputStream(); try { out.println( mergeTemplate( msgSessionTimeout, template ) ); } catch ( Exception e ) { SiprpWebLogger.logException( e ); } } public boolean verificaEstabelecimento( Connection con, java.lang.String empresaId, java.lang.String estabelecimentoId ) // verifica se o establecimento pertence 'a empresa { // Connection con = null ; Statement stmt = null; Virtual2DArray rs; String query; try { // con = DriverManager.getConnection( bdUrl, bdUsername, bdPassword // ); query = "SELECT empresa_id FROM estabelecimentos where id='" + estabelecimentoId + "'"; if ( con != null ) { stmt = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY ); rs = new ResultSet2DArray( stmt.executeQuery( query ) ); } else { rs = getExecuter().executeQuery( new Select( query ) ); } String temp = "" + rs.get( 0, 0 ); // converter de int para String if ( con != null ) { stmt.close(); } if ( empresaId.equals( temp ) ) // estabelecimento pertence 'a // empresa { return true; } else { return false; } } catch ( Exception e ) { SiprpWebLogger.logException( e ); } return false; } public boolean verificaTrabalhador( Connection con, java.lang.String estabelecimentoId, java.lang.String trabalhadorId ) // verifica se o trabalhador pertence ao estabelecimento { // Connection con = null ; Statement stmt = null; ResultSet2DArray rs; StringBuffer dbQuery; try { // con = DriverManager.getConnection( bdUrl, bdUsername, bdPassword // ); dbQuery = new StringBuffer(); dbQuery.append( "SELECT estabelecimento_id FROM trabalhadores where id='" + trabalhadorId + "'" ); stmt = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY ); rs = new ResultSet2DArray( stmt.executeQuery( dbQuery.toString() ) ); String temp = "" + rs.get( 0, 0 ); // converter de int para String stmt.close(); if ( estabelecimentoId.equals( temp ) ) // estabelecimento pertence // 'a empresa { return true; } else { return false; } } catch ( Exception e ) { SiprpWebLogger.logException( e ); } return false; } public void closeSqlCon( Connection con ) { try { if ( con != null ) con.close(); } catch ( Exception e ) { SiprpWebLogger.logException( e ); } } public String emailEmpresa( Connection con, String empresaId ) { Statement stmt = null; ResultSet2DArray rs; StringBuffer dbQuery; String returnString; try { dbQuery = new StringBuffer(); dbQuery.append( "SELECT email FROM empresas, contactos " + "WHERE empresas.id ='" + empresaId + "' AND empresas.contacto_1 = contactos.id" ); stmt = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY ); rs = new ResultSet2DArray( stmt.executeQuery( dbQuery.toString() ) ); if ( rs.columnLength() > 0 ) { returnString = ( String ) rs.get( 0, 0 ); stmt.close(); return returnString; } else { return null; } } catch ( Exception e ) { SiprpWebLogger.logException( e ); } return null; } public String nomeEmpresa( Connection con, String empresaId ) { Statement stmt = null; Virtual2DArray rs; String returnString; try { String query = "SELECT designacao_social FROM empresas WHERE id ='" + empresaId + "'"; if ( con != null ) { stmt = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY ); rs = new ResultSet2DArray( stmt.executeQuery( query ) ); } else { rs = getExecuter().executeQuery( new Select( query ) ); } if ( rs.columnLength() > 0 ) { returnString = ( String ) rs.get( 0, 0 ); if ( con != null ) { stmt.close(); } return returnString; } else { return null; } } catch ( Exception e ) { SiprpWebLogger.logException( e ); } return null; } public String nomeEstabelecimento( Connection con, String estabelecimentoId ) { Statement stmt = null; Virtual2DArray rs; StringBuffer dbQuery; String returnString; try { String query = "SELECT nome FROM estabelecimentos WHERE id ='" + estabelecimentoId + "'"; if ( con != null ) { stmt = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY ); rs = new ResultSet2DArray( stmt.executeQuery( query ) ); } else { rs = getExecuter().executeQuery( new Select( query ) ); } if ( rs.columnLength() > 0 ) { returnString = ( String ) rs.get( 0, 0 ); if ( con != null ) { stmt.close(); } return returnString; } else { return null; } } catch ( Exception e ) { SiprpWebLogger.logException( e ); } return null; } public String nomeTrabalhador( Connection con, java.lang.String trabalhadorId ) { Statement stmt = null; ResultSet2DArray rs; StringBuffer dbQuery; String returnString; try { dbQuery = new StringBuffer(); dbQuery.append( "SELECT nome FROM trabalhadores where id='" + trabalhadorId + "'" ); stmt = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY ); rs = new ResultSet2DArray( stmt.executeQuery( dbQuery.toString() ) ); if ( rs.columnLength() > 0 ) { returnString = ( String ) rs.get( 0, 0 ); stmt.close(); return returnString; } else { return null; } } catch ( Exception e ) { SiprpWebLogger.logException( e ); } return null; } public void doErro( String queryString, ServletOutputStream out ) throws Exception { String split[] = queryString.split( "=" ); String err; if ( split.length > 1 ) { err = split[ 1 ]; } else { err = "Erro"; } err = err.replace( '+', ' ' ); // out.println( mergeTemplate( err, innerErrorTemplate) ); out.println( mergeTemplate( err, errorTemplate ) ); } protected Executer getExecuter() throws Exception { ServletContext context = CONTEXT; DBManager dbm = ( DBManager ) context.getAttribute( Singleton.DEFAULT_DBMANAGER ); if ( dbm == null ) { dbm = new JDBCManager( bdLocalUrl, bdLocalUsername, bdLocalPassword, 500, 499, 1, null ); context.setAttribute( Singleton.DEFAULT_DBMANAGER, dbm ); } return dbm.getSharedExecuter( this ); } }