package org.h3270.render; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.avalon.framework.configuration.DefaultConfiguration; import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author Alphonse Bendt * @version $Id: H3270Configuration.java,v 1.9 2008/11/21 14:48:32 spiegel Exp $ */ public class H3270Configuration extends org.apache.avalon.framework.configuration.DefaultConfiguration { private final List colorSchemes = new ArrayList(); private final String colorSchemeDefault; private final Map validFonts = new HashMap(); private final String fontnameDefault; private final String logicalUnitBuilderClass; private static final Pattern FILENAME_PATTERN = Pattern.compile("file:(.*?)/WEB-INF/h3270-config\\.xml.*"); private H3270Configuration(Configuration data) throws ConfigurationException { super(data.getName()); final Configuration colorschemeConfig = data.getChild("colorschemes"); createColorSchemes(colorschemeConfig); colorSchemeDefault = createColorschemeDefault(colorschemeConfig, colorSchemes); final Configuration fontConfig = data.getChild("fonts"); createValidFonts(fontConfig); fontnameDefault = createFontnameDefault(fontConfig, validFonts); // If exec-path points into WEB-INF, convert it into an absolute path now. DefaultConfiguration c = (DefaultConfiguration)data.getChild("exec-path"); String execPath = c.getValue(""); if (execPath.startsWith("WEB-INF")) { Matcher m = FILENAME_PATTERN.matcher(getLocation()); if (m.find()) { execPath = m.group(1) + "/" + execPath; c.setValue(execPath); } } logicalUnitBuilderClass = createLogicalUnitBuilderClass(data.getChild("logical-units")); } public List getColorSchemes() { return colorSchemes; } public String getColorSchemeDefault() { return colorSchemeDefault; } public ColorScheme getColorScheme(String name) { for (Iterator i = colorSchemes.iterator(); i.hasNext();) { ColorScheme cs = (ColorScheme)i.next(); if (cs.getName().equals(name)) { return cs; } } return null; } public Map getValidFonts() { return validFonts; } private void createColorSchemes(Configuration config) throws ConfigurationException { Configuration[] cs = config.getChildren(); for (int x = 0; x < cs.length; ++x) { ColorScheme scheme = new ColorScheme(cs[x].getAttribute("name"), cs[x].getAttribute("pnfg"), cs[x].getAttribute("pnbg"), cs[x].getAttribute("pifg"), cs[x].getAttribute("pibg"), cs[x].getAttribute("phfg"), cs[x].getAttribute("phbg"), cs[x].getAttribute("unfg"), cs[x].getAttribute("unbg"), cs[x].getAttribute("uifg"), cs[x].getAttribute("uibg"), cs[x].getAttribute("uhfg"), cs[x].getAttribute("uhbg")); colorSchemes.add(scheme); } } private String createColorschemeDefault(Configuration config, List colorSchemes) throws ConfigurationException { String colorSchemeDefault = config.getAttribute("default", null); if (colorSchemeDefault == null) { if (colorSchemes.isEmpty()) { throw new ConfigurationException("need to specify at least one colorscheme"); } // default to first colorscheme colorSchemeDefault = ((ColorScheme)colorSchemes.get(0)).getName(); } return colorSchemeDefault; } private void createValidFonts(Configuration config) throws ConfigurationException { Configuration[] fonts = config.getChildren(); for (int x = 0; x < fonts.length; ++x) { String fontName = fonts[x].getAttribute("name"); String fontDescription = fonts[x].getAttribute("description", fontName); validFonts.put(fontName, fontDescription); } } private String createFontnameDefault(Configuration config, Map validFonts) throws ConfigurationException { String fontnameDefault = config.getAttribute("default", null); if (fontnameDefault == null) { if (validFonts.isEmpty()) { throw new ConfigurationException("need to specify at least one font"); } // default to random fontname fontnameDefault = validFonts.keySet().iterator().next().toString(); } return fontnameDefault; } public String getFontnameDefault() { return fontnameDefault; } public String createLogicalUnitBuilderClass(Configuration config) throws ConfigurationException { boolean usePool = config.getChild("use-pool").getValueAsBoolean(); if (usePool) { return config.getChild("lu-builder").getValue(); } return null; } public static H3270Configuration create(String filename) { try { return create(new FileInputStream(filename)); } catch (FileNotFoundException e) { throw new RuntimeException(e); } } public static H3270Configuration create(InputStream in) { try { DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder(); Configuration data = builder.build(in); return new H3270Configuration(data); } catch (Exception ex) { throw new RuntimeException(ex); } } public String getLogicalUnitBuilderClass() { return logicalUnitBuilderClass; } }