public URL buildURL ( final UrlMapping mapping ) { URL result = null ; String expression = "" ; Object value = null ; try { FacesContext context = FacesContext . getCurrentInstance ( ) ; URLPatternParser parser = mapping . getPatternParser ( ) ; List < PathParameter > parameters = parser . getPathParameters ( ) ; List < String > parameterValues = new ArrayList < String > ( ) ; for ( PathParameter injection : parameters ) { // read value of the path parameter expression = injection . getExpression ( ) . getELExpression ( ) ; value = elUtils . getValue ( context , expression ) ; if ( value == null ) { throw new PrettyException ( "PrettyFaces: Exception occurred while building URL for MappingId < " + mapping . getId ( ) + " >, Required value " + " < " + expression + " > was null" ) ; } // convert the value to a string using the correct converter Converter converter = context . getApplication ( ) . createConverter ( value . getClass ( ) ) ; if ( converter != null ) { String convertedValue = converter . getAsString ( context , new NullComponent ( ) , value ) ; if ( convertedValue == null ) { throw new PrettyException ( "PrettyFaces: The converter <" + converter . getClass ( ) . getName ( ) + "> returned null while converting the object <" + value . toString ( ) + ">!" ) ; } value = convertedValue ; } parameterValues . add ( value . toString ( ) ) ; } result = parser . getMappedURL ( parameterValues ) . encode ( ) ; } catch ( ELException e ) { throw new PrettyException ( "PrettyFaces: Exception occurred while building URL for MappingId < " + mapping . getId ( ) + " >, Error occurred while extracting values from backing bean" + " < " + expression + ":" + value + " >" , e ) ; } return result ; }
For all required values of the given PrettyUrlMapping extract values from their mapped backing beans and create a URL based on the url - pattern .