tim@52: /** tim@52: * tim@52: */ tim@52: package de.intevation.gnv.artifacts.context; tim@52: tim@52: import java.io.FileInputStream; tim@52: import java.io.FileNotFoundException; tim@52: import java.io.IOException; tim@52: import java.io.InputStream; ingo@369: import java.io.File; ingo@369: tim@52: import java.util.Properties; sascha@426: import java.util.HashMap; tim@52: tim@52: import org.apache.log4j.Logger; sascha@426: tim@52: import org.w3c.dom.Document; sascha@426: import org.w3c.dom.Element; sascha@426: import org.w3c.dom.NodeList; sascha@426: import org.w3c.dom.Node; sascha@426: sascha@426: import de.intevation.gnv.geobackend.base.connectionpool.ConnectionPoolFactory; sascha@426: sascha@426: import de.intevation.gnv.geobackend.base.query.container.QueryContainerFactory; sascha@426: import de.intevation.gnv.geobackend.base.query.container.exception.QueryContainerException; sascha@426: sascha@426: import de.intevation.gnv.chart.XMLChartTheme; sascha@426: sascha@426: import de.intevation.gnv.artifacts.cache.CacheFactory; sascha@426: sascha@426: import de.intevation.gnv.raster.Palette; sascha@426: sascha@426: import de.intevation.artifacts.ArtifactContextFactory; tim@52: tim@52: import de.intevation.artifactdatabase.Config; ingo@369: import de.intevation.artifactdatabase.XMLUtils; tim@52: tim@52: /** tim@52: * @author Tim Englich tim@171: * tim@52: */ tim@52: public class GNVArtifactContextFactory implements ArtifactContextFactory { tim@52: /** tim@52: * the logger, used to log exceptions and additonaly information tim@52: */ tim@52: private static Logger log = Logger.getLogger(GNVArtifactContext.class); tim@171: sascha@426: public static final String XPATH_GEOBACKEND_CONFIGURATION = sascha@426: "artifact-database/geo-backend/backend-configuration"; tim@171: sascha@426: public static final String XPATH_GEOBACKEND_QUERYCONFIGURATION = sascha@426: "artifact-database/geo-backend/query-configuration"; tim@171: sascha@426: private final static String CACHECONFIGNODEPATH = sascha@426: "/artifact-database/ehcache/configuration"; tim@171: sascha@426: private final static String CHARTCONFIGNODEPATH = sascha@426: "/artifact-database/charttemplate/configuration"; sascha@426: sascha@426: public final static String PALETTES_PATH = sascha@426: "/artifact-database/palettes"; sascha@426: sascha@426: public final static String PALETTE_ITEMS = sascha@426: "palette"; sascha@426: sascha@426: public final static String PALETTES = sascha@426: "color.palettes"; ingo@358: ingo@358: public final static String CHARTTEMPLATE = "template"; ingo@358: tim@52: /** tim@52: * Constructor tim@52: */ tim@52: public GNVArtifactContextFactory() { tim@52: super(); tim@52: log.debug("GNVArtifactContextFactory.Constructor"); tim@52: } tim@52: tim@52: /** tim@52: * @see de.intevation.artifacts.ArtifactContextFactory#createArtifactContext(org.w3c.dom.Document) tim@52: */ tim@52: public Object createArtifactContext(Document config) { ingo@358: GNVArtifactContext returnValue = null; tim@52: try { tim@52: log.debug("GNVArtifactContextFactory.createArtifactContext"); tim@52: log.info("Initialisation of the Geo-BackendConnectionPool"); tim@171: String backendConfigurationFile = Config.getStringXPath(config, tim@171: XPATH_GEOBACKEND_CONFIGURATION); sascha@426: backendConfigurationFile = Config.replaceConfigDir( sascha@426: backendConfigurationFile); tim@203: tim@52: Properties properties = getProperties(backendConfigurationFile); tim@52: ConnectionPoolFactory cpf = ConnectionPoolFactory.getInstance(); tim@52: cpf.initializeConnectionPool(properties); tim@171: tim@52: log.info("Initialisation of the QueryContainer"); tim@171: String queryConfigurationFile = Config.getStringXPath(config, tim@171: XPATH_GEOBACKEND_QUERYCONFIGURATION); sascha@426: queryConfigurationFile = Config.replaceConfigDir( sascha@426: queryConfigurationFile); tim@203: tim@52: Properties queryProperties = getProperties(queryConfigurationFile); tim@52: QueryContainerFactory qcf = QueryContainerFactory.getInstance(); tim@52: qcf.initializeQueryContainer(queryProperties); tim@171: tim@99: log.info("Initialisation of the Cache"); tim@171: String cacheConfigurationFile = Config.getStringXPath(config, tim@171: CACHECONFIGNODEPATH); sascha@426: cacheConfigurationFile = Config.replaceConfigDir( sascha@426: cacheConfigurationFile); sascha@426: tim@99: CacheFactory cf = CacheFactory.getInstance(); tim@99: cf.initializeCache(cacheConfigurationFile); tim@171: tim@52: returnValue = new GNVArtifactContext(config); ingo@358: sascha@426: configurePalettes(config, returnValue); sascha@426: sascha@426: configureChartTemplate(config, returnValue); sascha@426: sascha@426: tim@52: } catch (FileNotFoundException e) { tim@171: log.error(e, e); tim@52: } catch (IOException e) { tim@171: log.error(e, e); tim@171: } catch (QueryContainerException e) { tim@171: log.error(e, e); tim@52: } tim@52: return returnValue; tim@52: } tim@52: sascha@426: protected void configureChartTemplate( sascha@426: Document config, sascha@426: GNVArtifactContext context sascha@426: ) { sascha@426: log.info("Initialisation of chart template"); sascha@426: String chartConfigFile = Config.getStringXPath( sascha@426: config, CHARTCONFIGNODEPATH sascha@426: ); sascha@426: chartConfigFile = Config.replaceConfigDir(chartConfigFile); sascha@426: log.debug("Parse xml configuration of " + chartConfigFile); sascha@426: sascha@426: Document tmpl = XMLUtils.parseDocument(new File(chartConfigFile)); sascha@426: XMLChartTheme theme = new XMLChartTheme("XMLChartTheme"); sascha@426: if (tmpl != null) { sascha@426: theme.applyXMLConfiguration(tmpl); sascha@426: } sascha@426: else { sascha@426: log.error( sascha@426: "Cannot load chart template from '" + sascha@426: chartConfigFile + "'"); sascha@426: } sascha@426: sascha@426: context.put(CHARTTEMPLATE, theme); sascha@426: } sascha@426: sascha@426: protected void configurePalettes( sascha@426: Document config, sascha@426: GNVArtifactContext context sascha@426: ) { sascha@426: log.info("configure palettes"); sascha@426: sascha@426: HashMap palettes = new HashMap(); sascha@426: sascha@426: Node node = Config.getNodeXPath(config, PALETTES_PATH); sascha@426: sascha@426: if (node == null) { sascha@426: log.error("No palettes found"); sascha@426: } sascha@426: else { sascha@426: NodeList pals = Config.getNodeSetXPath(PALETTE_ITEMS); sascha@426: for (int i = 0, N = pals == null ? 0 : pals.getLength(); i < N; ++i) { sascha@426: Element pal = (Element)pals.item(i); sascha@426: String name = pal.getAttribute("name"); sascha@426: String description = pal.getAttribute("description"); sascha@426: String filename = pal.getAttribute("file"); sascha@426: sascha@426: if (name == null || name.length() == 0) { sascha@426: log.error("Palette has no 'name' attribute."); sascha@426: } sascha@426: else if (filename == null || filename.length() == 0) { sascha@426: log.error("Palette has no 'file' attribute."); sascha@426: } sascha@426: else { sascha@426: filename = Config.replaceConfigDir(filename); sascha@426: Document document = XMLUtils.parseDocument( sascha@426: new File(filename)); sascha@426: if (document == null) { sascha@426: log.error("Cannot load palette file '" + sascha@426: filename + "'"); sascha@426: } sascha@426: else { sascha@426: Palette p = new Palette(document, description); sascha@426: palettes.put(name, p); sascha@426: } sascha@426: } sascha@426: } sascha@426: } sascha@426: sascha@426: context.put(PALETTES, palettes); sascha@426: } sascha@426: tim@52: /** tim@52: * @param filePath tim@52: * @return tim@52: * @throws FileNotFoundException tim@52: * @throws IOException tim@52: */ tim@52: private Properties getProperties(String filePath) sascha@426: throws FileNotFoundException, IOException sascha@426: { sascha@172: InputStream inputStream = null; sascha@172: try { sascha@172: inputStream = new FileInputStream(filePath); sascha@172: Properties properties = new Properties(); sascha@172: properties.load(inputStream); sascha@172: return properties; sascha@172: } sascha@172: finally { sascha@172: if (inputStream != null) { sascha@172: try { inputStream.close(); } sascha@172: catch (IOException ioe) {} sascha@172: } sascha@172: } tim@52: } tim@52: }