/* * Copyright (c) 2010 Lockheed Martin Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.eurekastreams.server.persistence.mappers.db; import java.io.InputStream; import java.io.StringWriter; import javax.xml.transform.Source; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.eurekastreams.server.persistence.mappers.DomainMapper; import org.eurekastreams.server.service.actions.strategies.ResourceFetcher; /** * Mapper to retrieve theme url from db and convert it to theme css file. */ public class ThemeCssDbMapper implements DomainMapper<String, String> { /** * Path to xslt resource. */ private String xsltPath; /** * Fetcher for the XML theme definition. */ private ResourceFetcher xmlFetcher = null; /** * Theme xml url mapper. */ private DomainMapper<String, String> getThemeXmlUrlByUuidDbMapper; /** * Constructor. * * @param inXsltPath * Path to xslt resource. * @param inGetThemeXmlUrlByUuidDbMapper * Theme xml url mapper. * @param inXmlFetcher * Fetcher for the XML theme definition. */ public ThemeCssDbMapper(final String inXsltPath, final DomainMapper<String, String> inGetThemeXmlUrlByUuidDbMapper, final ResourceFetcher inXmlFetcher) { xsltPath = inXsltPath; getThemeXmlUrlByUuidDbMapper = inGetThemeXmlUrlByUuidDbMapper; xmlFetcher = inXmlFetcher; } /** * Retrieve theme url from db and convert it to theme css file. * * @param inRequest * the theme uuid * @return css file for specified theme. */ @Override public String execute(final String inRequest) { InputStream xsltInputStream = null; InputStream xmlInputStream = null; try { // grab theme url from db String themeUrl = getThemeXmlUrlByUuidDbMapper.execute(inRequest.toLowerCase()); // Load the XSLT xsltInputStream = getClass().getResourceAsStream(xsltPath); Source xsltSource = new StreamSource(xsltInputStream); // Create the transformer TransformerFactory transFactory = TransformerFactory.newInstance(); javax.xml.transform.Transformer transformer = transFactory.newTransformer(xsltSource); // Transform theme xml to css string StreamResult cssResult = new StreamResult(new StringWriter()); xmlInputStream = xmlFetcher.getInputStream(themeUrl); transformer.transform(new StreamSource(xmlInputStream), cssResult); return cssResult.getWriter().toString(); } catch (Exception e) { throw new RuntimeException("Unable to retrieve theme css", e); } finally { try { if (xsltInputStream != null) { xsltInputStream.close(); } if (xmlInputStream != null) { xmlInputStream.close(); } } catch (Exception e) { throw new RuntimeException("Unable to close streams", e); } } } }