/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.ows.kvp; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import java.util.TreeMap; import java.util.logging.Level; import org.geoserver.ows.KvpParser; import org.geoserver.ows.util.CaseInsensitiveMap; import org.geoserver.ows.util.KvpUtils; import org.geoserver.platform.GeoServerExtensions; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; /** * Parses the format options parameter which is of the form: * <pre>FORMAT_OPTIONS=opt1:val1,val2;opt2:val1;opt3:...</pre> * * @author Justin Deoliveira, The Open Planning Project, jdeolive@openplans.org * */ public class FormatOptionsKvpParser extends KvpParser implements ApplicationContextAware { /** * application context used to lookup KvpParsers */ ApplicationContext applicationContext; public FormatOptionsKvpParser() { this("format_options"); } /** * Builds a {@link FormatOptionsKvpParser} with a user specified key (for params that have the * syntax of format_options, but not the same name) * * @param key */ public FormatOptionsKvpParser(String key) { super(key, Map.class); } public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } public Object parse(String value) throws Exception { List parsers = GeoServerExtensions.extensions(KvpParser.class, applicationContext); Map formatOptions = new CaseInsensitiveMap(new TreeMap()); List<String> kvps = KvpUtils.escapedTokens(value, ';'); for (String kvp : kvps) { List<String> kv = KvpUtils.escapedTokens(kvp, ':', 2); String key = kv.get(0); String raw = kv.size() == 1 ? "true" : KvpUtils.unescape(kv.get(1)); Object parsed = null; for (Iterator p = parsers.iterator(); p.hasNext();) { KvpParser parser = (KvpParser) p.next(); if ( key.equalsIgnoreCase( parser.getKey() ) ) { parsed = parser.parse( raw ); if ( parsed != null ) { break; } } } if (parsed == null) { if(LOGGER.isLoggable(Level.FINER)) LOGGER.finer( "Could not find kvp parser for: '" + key + "'. Storing as raw string."); parsed = raw; } formatOptions.put(key, parsed); } return formatOptions; } }