Denied access to method or field getParameter of class org.apache.catalina.core.ApplicationHttpRequest
----
FTL stack trace ("~" means nesting-related):
- Failed at: #local paramValue = request.getParame... [in template "34352066712900#33336#65816767" in function "findMatchedItem" at line 56, column 5]
----
1<#--
2 LANGUAGE HEADER DROPDOWN
3 -->
4<#assign currentURL = themeDisplay.getURLCurrent()>
5<#assign baseURL = themeDisplay.getPortalURL()>
6<#assign relativeURL = currentURL?replace(baseURL, "")>
7
8<#assign translatableParams = ["ics", "ctn"] />
9<#assign matchedItemsCache = buildMatchedItemsCache(translatableParams, locale) />
10
11<#assign desc = themeDisplay.getLanguageId()?split("_")?first >
12<div class="select-btn" id="language-select" role="button" aria-haspopup="listbox" aria-expanded="false" tabindex="0">
13 <#assign siteLanguage = themeDisplay.getLocale().getDisplayLanguage( themeDisplay.getLocale() )?cap_first>
14 <span
15 class="sBtn-text text-uppercase d-flex align-content-center align-items-center">${desc} <span
16 class="fa-solid fa-chevron-down" aria-hidden="true"></span></span>
17</div>
18 <ul class="options hide" role="listbox" aria-labelledby="language-select">
19 <li class="option actives" style="pointer-events:none" role="option" aria-selected="true">
20 <span class="option-text">
21 <svg aria-hidden="true" class="lexicon-icon mr-2 lexicon-icon-${themeDisplay.getLanguageId()?replace('_', '-')?lower_case}">
22 <use href="/o/classic-theme/images/clay/icons.svg#${themeDisplay.getLanguageId()?replace('_', '-')?lower_case}"></use>
23 </svg>
24 ${siteLanguage}
25 </span>
26 </li>
27 <#if entries?has_content>
28 <#list entries as curLanguage>
29
30 <#if !curLanguage.isSelected()>
31
32 <#--
33 <p>url:${curLanguage.getURL()}</p>
34 <p>parameter ics:${request.getParameter("ics")}</p>
35 <p>matchedItem en_us:${matchedItemsCache["ics"].value_i18n["en_US"]}</p>
36 <p>${urlCodec}</p>
37 <p>${urlCodec.decodeURL("%2Fnormas%3Fics%3Dtest")}</p>
38 <p>${urlCodec.encodeURL("01 - General Aspects. Terminology.")}</p>
39-->
40
41 <#assign entryHref = buildTranslatedHref(curLanguage.getURL(), curLanguage.getLanguageId(), translatableParams, matchedItemsCache) />
42 <li class="option" role="option"><span class="option-text"> <a href="${entryHref}" class="language-entry-short-text"
43 lang="${curLanguage.getLanguageId()}">${curLanguage.getLongDisplayName()?capitalize}</a> </span></li>
44
45 </#if>
46 </#list>
47 </#if>
48</ul>
49
50
51<#-- ============================================================
52 Traduccion de parametros de la URL al cambiar de idioma
53 ============================================================ -->
54
55<#function findMatchedItem paramName locale>
56 <#local paramValue = request.getParameter(paramName)! />
57 <#if !paramValue?has_content>
58 <#return "" />
59 </#if>
60
61 <#local paramValueTrim = paramValue?trim />
62 <#local paramType = paramName?upper_case />
63 <#local endpointURL = "/c/selectoptions/?languageId=" + locale?string + "&sort=name:asc&filter=optionsType eq '" + paramType + "'" />
64 <#local optionsResponse = restClient.get(endpointURL) />
65
66 <#list optionsResponse.items![] as item>
67 <#local valueI18n = item.value_i18n![] />
68 <#local found = false />
69
70 <#list valueI18n?keys as key>
71 <#if valueI18n[key]! == paramValueTrim>
72 <#local found = true />
73 <#break />
74 </#if>
75 </#list>
76
77 <#if !found && (item.value!"") == paramValueTrim>
78 <#local found = true />
79 </#if>
80
81 <#if found>
82 <#return item />
83 </#if>
84 </#list>
85
86 <#return "" />
87</#function>
88
89<#function buildMatchedItemsCache paramNames locale>
90 <#local cache = {} />
91 <#list paramNames as paramName>
92 <#local cache = cache + {paramName: findMatchedItem(paramName, locale)} />
93 </#list>
94 <#return cache />
95</#function>
96
97<#function translateParamInURL originalURL paramName targetLanguageId matchedItemsCache>
98
99 <#local matchedItem = matchedItemsCache[paramName]!"" />
100
101 <#if !matchedItem?has_content>
102 <#return originalURL />
103 </#if>
104
105 <#local translatedValue =
106 matchedItem.value_i18n[targetLanguageId]!matchedItem.value!""
107 />
108
109 <#if !translatedValue?has_content>
110 <#return originalURL />
111 </#if>
112
113 <#-- Caso URL de cambio de idioma de Liferay -->
114 <#if originalURL?contains("redirect=")>
115
116 <#local encodedValue =
117 urlCodec.encodeURL(translatedValue)?replace("+", "%2B")
118 />
119
120 <#return originalURL?replace(
121 paramName + "%3D[^&]*",
122 paramName + "%3D" + encodedValue,
123 "r"
124 ) />
125
126 </#if>
127
128 <#-- Caso URL normal -->
129 <#local encodedValue = urlCodec.encodeURL(translatedValue) />
130
131 <#return originalURL?replace(
132 "([?&])" + paramName + "=[^&]*",
133 "$1" + paramName + "=" + encodedValue,
134 "r"
135 ) />
136
137</#function>
138
139<#function buildTranslatedHref originalURL targetLanguageId paramNames matchedItemsCache>
140 <#local resultURL = originalURL />
141
142 <#list paramNames as paramName>
143 <#local resultURL = translateParamInURL(resultURL, paramName, targetLanguageId, matchedItemsCache) />
144 </#list>
145
146 <#return resultURL />
147</#function>
148
149<#-- ============================================================ -->
150
151<script>
152 $(document).ready(function () {
153 // Toggle el estado del menu de idiomas
154 $('.select-btn').on('click', function () {
155 var expanded = $(this).attr('aria-expanded') === 'true';
156 $(this).attr('aria-expanded', !expanded);
157 $('.options').toggleClass('hide', expanded);
158 });
159
160 // Acciones de teclado para la lupa
161 $('.select-btn').on('keydown', function (e) {
162 if (e.key === 'Enter' || e.key === ' ') {
163 e.preventDefault(); // Evitar desplazamiento al presionar espacio
164 $(this).click(); // Simula el click para abrir/cerrar el menu
165 }
166 });
167
168 // Cerrar el menu al hacer clic en cualquier parte fuera de el
169 $(document).on('click', function (event) {
170 if (!$(event.target).closest('.select-btn, .options').length) {
171 $('.options').addClass('hide');
172 $('.select-btn').attr('aria-expanded', 'false');
173 }
174 });
175
176 // Navegar con las teclas de flecha
177 let options = $('.option');
178 let selectedIndex = 0;
179
180 options.on('keydown', function (e) {
181 if (e.key === 'ArrowDown') {
182 selectedIndex = (selectedIndex + 1) % options.length;
183 options.eq(selectedIndex).focus();
184 }
185 if (e.key === 'ArrowUp') {
186 selectedIndex = (selectedIndex - 1 + options.length) % options.length;
187 options.eq(selectedIndex).focus();
188 }
189 if (e.key === 'Enter') {
190 window.location.href = $(this).find('a').attr('href'); // Redirige a la opcion seleccionada
191 }
192 });
193 });
194</script>
Guía de buenas prácticas en la seguridad patrimonial
Editorial: AENOR INTERNACIONAL, S.A.U.
La seguridad patrimonial tiene como objetivo la prevención y protección de los bienes de una empresa. Esta publicación proporciona: - Un modelo de cómo implantar un sistema de gestión de la seguridad patrimonial, alineado con la gestión de la calidad, totalmente integrable con otros estándares y fundamentado en el cumplimiento práctico de la Norma UNE-ISO 31000:2010 Gestión del riesgo. Principios y directrices. - Un método de análisis de riesgos patrimoniales de propósito general capaz de apreciar el nivel del riesgo en cualquier sector de la actividad. - Facilita a las pymes, controles y consejos de implantación que permitirán conseguir una elevación de los niveles de seguridad de su organización, incluso a personas que no tengan la especialización y habilitación de directores de seguridad.
Please enter a valid video URL.
The URL can point to any video file or a Youtube video.
El libro en palabras del autor
Ultricies magna feugiat malesuada sociosqu varius vivamus cubilia parturient, himenaeos vitae vehicula nam placerat netus urna platea, nostra rutrum felis mattis penatibus velit quisque.
ButtonNormas citadas
Libros relacionados
Normas relacionadas
Colecciones temáticas relacionadas
Respuesta 2
Desde la web
Libros y normas










