Olá pessoal,
Tenho uma aplicação web sendo desenvolvida usando JSF 2 com Primefaces 3.3 com uma funcionalidade pouco comum. Como a aplicação tem vários componentes “plugáveis”, preciso fazer includes dinâmicos de páginas contidas em arquivos JAR, que na prática são os componentes utilizados pela aplicação.
Todas essas páginas tem um nome default (parametros.xml). Com base nisso e no item de menu que o usuário seleciona, sei exatamente em qual componente ir, portanto, monto uma expressão regular e utilizo a classe PathMatchingResourcePatternResolver (do Spring) para fazer a busca deste recurso.
Criei o seguinte Resource Resolver para encontrar as páginas:
public class FaceletsResourceResolver extends ResourceResolver {
private static final Log logger = LogFactory.getLog(FaceletsResourceResolver.class);
public static final String PAGINA_PARAMETROS_DEFAULT = "/pages/parametros.xhtml";
private ResourceResolver parent;
private PathMatchingResourcePatternResolver patternResolver;
public FaceletsResourceResolver(ResourceResolver parent) {
this.parent = parent;
patternResolver = new PathMatchingResourcePatternResolver();
}
@Override
public URL resolveUrl(String path) {
URL url = parent.resolveUrl(path); // buscar no WAR
if (url == null) { // buscar em JARs
url = executarBuscaEmJARs(path);
}
return url;
}
public URL executarBuscaEmJARs(String path) {
URL url = null;
Resource[] resources = null;
String qualificadorJob = null;
try {
qualificadorJob = path.replace(PAGINA_PARAMETROS_DEFAULT, "");
// TODO ajudar regex para deixar mais rápido
resources = patternResolver.getResources("classpath*:**" + PAGINA_PARAMETROS_DEFAULT);
for (Resource resource : resources) {
if (resource.getURL().getFile().contains(qualificadorJob)) {
url = resource.getURL();
break;
}
}
} catch (IOException e) {
logger.error("Erro durante a busca de paginas em JARs", e);
}
logger.info("URL encontrada <PathMatchingResourcePatternResolver>: " + url);
return url;
}
}
Na página tenho o seguinte trecho:
<p:dialog header="Parâmetros" widgetVar="dlgParametros" resizable="false">
<ui:fragment>
<ui:include src="#{cc.attrs.paginaParametros}" />
</ui:fragment>
</p:dialog>
O atributo página parâmetros me ajuda a identificar qual página buscar.
Resumidamente, estou com o seguinte problema: o dialog aparece a primeira vez trazendo a página corretamente, mas após fazer algumas outras operações e abrir novamente o diálogo, a página some arbitrariamente.
O que pode estar acontecendo?
Obrigado!