Force URL Mapping Registration

Last modified by Raphaël Jakse on 2026/06/02 17:55

cogForce URL Mapping to register again
Type
CategoryOther
Developed by

Raphaël Jakse

Rating
0 Votes
LicenseGNU Lesser General Public License 2.1

Table of contents

Description

Sometimes, the URL Mapping module fails to registrer upon extension installs.

If it happens, Here is the snippet you can use to force it to register again:

{{groovy}}
  import org.xwiki.observation.EventListener;
  import org.xwiki.contrib.urlmapping.internal.URLMappingResourceReferenceHandler;
  import java.lang.reflect.Method;
  import org.xwiki.resource.ResourceReferenceHandler;
  import org.xwiki.component.util.DefaultParameterizedType;
  import org.xwiki.resource.ResourceType;

  if (request.fixurlmappingwithlistener) {
      println("\nFIXING url-mapping\n")
      services.component.getContextComponentManager().getInstance(EventListener.class, "urlprefixhandler").onEvent(null, null, null);
      println("\nFIXED url-mapping\n")
  } else if (request.fixurlmappingwithreflection) {
    println("\nFIXING url-mapping\n")
    Method setSupportedTypes = URLMappingResourceReferenceHandler.class.getDeclaredMethod("setSupportedTypes", Collection.class)
    setSupportedTypes.setAccessible(true);
    ResourceReferenceHandler urlMappingHandler = services.component.getContextComponentManager().getInstance(
    new DefaultParameterizedType(null,ResourceReferenceHandler.class, ResourceType.class),
    "urlmapping");
    setSupportedTypes.invoke(urlMappingHandler, ["olddocs"]);
    println("\nFIXED url-mapping\n")
  }

  if (!request.fixurlmappingwithlistener) {
    println "\n\n{{html}}\n<p><a href='?fixurlmappingwithlistener=1' class='btn btn-primary'>Fix using listener</a> <a href='?fixurlmappingwithreflection=1' class='btn btn-primary'>Fix using reflection</a></p>{{/html}}\n";
  }
{{/groovy}}

{{groovy}}
  import org.xwiki.resource.ResourceReferenceHandler;
  import org.xwiki.component.util.DefaultParameterizedType;
  import org.xwiki.resource.ResourceType;

  ResourceReferenceHandler urlMappingHandler = services.component.getContextComponentManager().getInstance(
    new DefaultParameterizedType(null,ResourceReferenceHandler.class, ResourceType.class),
    "urlmapping");

  println("\nURL Mapping currently handles the following prefixes: " + urlMappingHandler.getSupportedResourceReferences())

{{/groovy}}

{{groovy}}
  import org.xwiki.contrib.urlmapping.URLMappingPrefixHandler;
  import org.apache.commons.lang3.StringUtils;
  import java.util.stream.Collectors;

  List<URLMappingPrefixHandler> handlers = services.component.getContextComponentManager().getInstanceList(URLMappingPrefixHandler.class);
  List<String> types = handlers.stream()
    .map(URLMappingPrefixHandler::getPrefix)
    .filter(Objects::nonNull)
    .map(prefix -> StringUtils.strip(prefix, "/"))
    .collect(Collectors.toList());
  println("\n\nURL Mapping would support these types after fixing: " + types);
{{/groovy}}

Get Connected