All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.jetty.http.pathmap.PathMappings Maven / Gradle / Ivy

There is a newer version: 11.0.0.beta1
Show newest version
//
//  ========================================================================
//  Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd.
//  ------------------------------------------------------------------------
//  All rights reserved. This program and the accompanying materials
//  are made available under the terms of the Eclipse Public License v1.0
//  and Apache License v2.0 which accompanies this distribution.
//
//      The Eclipse Public License is available at
//      http://www.eclipse.org/legal/epl-v10.html
//
//      The Apache License v2.0 is available at
//      http://www.opensource.org/licenses/apache2.0.php
//
//  You may elect to redistribute this code under either of these licenses.
//  ========================================================================
//

package org.eclipse.jetty.http.pathmap;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;

/**
 * Path Mappings of PathSpec to Resource.
 * 

* Sorted into search order upon entry into the Set * * @param the type of mapping endpoint */ @ManagedObject("Path Mappings") public class PathMappings implements Iterable>, Dumpable { private static final Logger LOG = Log.getLogger(PathMappings.class); private List> mappings = new ArrayList>(); private MappedResource defaultResource = null; private MappedResource rootResource = null; @Override public String dump() { return ContainerLifeCycle.dump(this); } @Override public void dump(Appendable out, String indent) throws IOException { ContainerLifeCycle.dump(out,indent,mappings); } @ManagedAttribute(value = "mappings", readonly = true) public List> getMappings() { return mappings; } public void reset() { mappings.clear(); } /** * Return a list of MappedResource matches for the specified path. * * @param path the path to return matches on * @return the list of mapped resource the path matches on */ public List> getMatches(String path) { boolean matchRoot = "/".equals(path); List> ret = new ArrayList<>(); int len = mappings.size(); for (int i = 0; i < len; i++) { MappedResource mr = mappings.get(i); switch (mr.getPathSpec().group) { case ROOT: if (matchRoot) ret.add(mr); break; case DEFAULT: if (matchRoot || mr.getPathSpec().matches(path)) ret.add(mr); break; default: if (mr.getPathSpec().matches(path)) ret.add(mr); break; } } return ret; } public MappedResource getMatch(String path) { if (path.equals("/") && rootResource != null) { return rootResource; } int len = mappings.size(); for (int i = 0; i < len; i++) { MappedResource mr = mappings.get(i); if (mr.getPathSpec().matches(path)) { return mr; } } return defaultResource; } @Override public Iterator> iterator() { return mappings.iterator(); } @SuppressWarnings("incomplete-switch") public void put(PathSpec pathSpec, E resource) { MappedResource entry = new MappedResource<>(pathSpec,resource); switch (pathSpec.group) { case DEFAULT: defaultResource = entry; break; case ROOT: rootResource = entry; break; } // TODO: add warning when replacing an existing pathspec? mappings.add(entry); if (LOG.isDebugEnabled()) LOG.debug("Added {} to {}",entry,this); Collections.sort(mappings); } @Override public String toString() { return String.format("%s[size=%d]",this.getClass().getSimpleName(),mappings.size()); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy