package com.nominanuda.springmvc; import java.util.HashMap; import java.util.Map; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.xml.ParserContext; import com.nominanuda.urispec.Utils; import com.nominanuda.web.mvc.ObjURISpec; import com.nominanuda.zen.obj.Obj; public class Sitemap { public static final String BEAN_ID = "__zen-webservice-sitemap__"; // use uuid instead? private static final String BEAN_PROP_ENTRIES = "entries"; private final Map<String, ObjURISpec> specs = new HashMap<>(); public String getUrl(String id, Obj o) { ObjURISpec s = specs.get(id); return s != null ? s.template(o != null ? o : Obj.make()) : null; } /* setter */ public void setEntries(Map<String, String> entries) { for (String id : entries.keySet()) { specs.put(id, new ObjURISpec(Utils.extracturiSpecFromSitemapMatch(entries.get(id)))); } } /* static helper */ @SuppressWarnings("unchecked") public static void registerPattern(String id, String pattern, ParserContext parserContext) { if (!"".equals(id)) { // add to sitemap only if it has an id BeanDefinitionRegistry registry = parserContext.getRegistry(); BeanDefinition sitemapBean; try { sitemapBean = registry.getBeanDefinition(BEAN_ID); } catch (NoSuchBeanDefinitionException e) { sitemapBean = BeanDefinitionBuilder.genericBeanDefinition(Sitemap.class) .addPropertyValue(BEAN_PROP_ENTRIES, new HashMap<String, String>()) .getBeanDefinition(); registry.registerBeanDefinition(BEAN_ID, sitemapBean); } ((Map<String, String>) sitemapBean.getPropertyValues().getPropertyValue(BEAN_PROP_ENTRIES).getValue()).put(id, pattern); } } }