/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.vertical.adminweb.resource; import java.io.InputStreamReader; import java.io.Reader; import java.util.Map; import javax.xml.transform.Source; import javax.xml.transform.TransformerException; import javax.xml.transform.URIResolver; import org.springframework.context.ResourceLoaderAware; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.stereotype.Component; import com.google.common.base.Charsets; import com.enonic.vertical.adminweb.TranslationReader; import com.enonic.vertical.adminweb.VerticalAdminLogger; import com.enonic.cms.framework.xml.XMLDocument; import com.enonic.cms.framework.xml.XMLDocumentFactory; import com.enonic.cms.core.AdminConsoleTranslationService; @Component public final class AdminResourcesImpl extends AdminResources implements ResourceLoaderAware { private final static String STYLESHEET_PATH = "/WEB-INF/stylesheets/"; private final static String HREF_PREFIX = "stylesheet://"; private ResourceLoader resourceLoader; private final class StylesheetURIResolver implements URIResolver { private final String languageCode; private StylesheetURIResolver( String languageCode ) { this.languageCode = languageCode; } public Source resolve( String href, String baseHref ) throws TransformerException { String basePath = ""; if (baseHref.startsWith(HREF_PREFIX)) { final String tmp = baseHref.replace(HREF_PREFIX, ""); final int pos = tmp.lastIndexOf('/'); if (pos > -1) { basePath = tmp.substring(0, pos) + "/"; } } return getStylesheet( languageCode, basePath + href).getAsSource(); } } public void setResourceLoader(final ResourceLoader resourceLoader) { this.resourceLoader = resourceLoader; } public XMLDocument getStylesheet(final String languageCode, final String path) { final XMLDocument doc = readDocument(languageCode, path); doc.setSystemId( HREF_PREFIX + path ); return doc; } public XMLDocument getXml(final String languageCode, final String name ) { return readDocument(languageCode, "xml/" + name); } public URIResolver getURIResolver( final String languageCode ) { return new StylesheetURIResolver( languageCode ); } private XMLDocument readDocument( final String languageCode, final String path ) { try { return doReadDocument(languageCode, path); } catch ( Exception e ) { VerticalAdminLogger.errorAdmin("Could not read resource: {0}", path, e); return null; } } private XMLDocument doReadDocument( final String languageCode, final String path ) throws Exception { final Resource resource = this.resourceLoader.getResource(STYLESHEET_PATH + path); final Reader reader = new InputStreamReader(resource.getInputStream(), Charsets.UTF_8); final AdminConsoleTranslationService languageMap = AdminConsoleTranslationService.getInstance(); final Map translationMap = languageMap.getTranslationMap( languageCode ); final Reader translationReader = new TranslationReader( translationMap, reader ); return XMLDocumentFactory.create(translationReader); } }