2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.controller.filtervalve.cors.jaxb;
11 import static com.google.common.base.Preconditions.checkArgument;
12 import static com.google.common.base.Preconditions.checkState;
13 import static java.lang.String.format;
15 import com.google.common.base.Optional;
16 import java.util.ArrayList;
17 import java.util.Collections;
18 import java.util.HashMap;
19 import java.util.LinkedHashMap;
20 import java.util.List;
22 import javax.xml.bind.annotation.XmlAttribute;
23 import javax.xml.bind.annotation.XmlElement;
24 import javax.xml.bind.annotation.XmlRootElement;
25 import org.opendaylight.controller.filtervalve.cors.model.UrlMatcher;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
30 public class Context {
31 private static final Logger logger = LoggerFactory.getLogger(Context.class);
34 private List<Filter> filters = new ArrayList<>();
35 private List<FilterMapping> filterMappings = new ArrayList<>();
36 private boolean initialized;
37 private UrlMatcher<Filter> urlMatcher;
40 public synchronized void initialize(String fileName, Map<String, Filter> namesToTemplates) {
41 checkState(initialized == false, "Already initialized");
42 Map<String, Filter> namesToFilters = new HashMap<>();
43 for (Filter filter : filters) {
45 filter.initialize(fileName, Optional.fromNullable(namesToTemplates.get(filter.getFilterName())));
46 } catch (Exception e) {
47 throw new IllegalStateException(format("Error while processing filter %s of context %s, defined in %s",
48 filter.getFilterName(), path, fileName), e);
50 namesToFilters.put(filter.getFilterName(), filter);
52 filters = Collections.unmodifiableList(new ArrayList<>(filters));
53 LinkedHashMap<String, Filter> patternMap = new LinkedHashMap<>();
54 for (FilterMapping filterMapping : filterMappings) {
55 filterMapping.initialize();
56 Filter found = namesToFilters.get(filterMapping.getFilterName());
58 patternMap.put(filterMapping.getUrlPattern(), found);
60 logger.error("Cannot find matching filter for filter-mapping {} of context {}, defined in {}",
61 filterMapping.getFilterName(), path, fileName);
62 throw new IllegalStateException(format(
63 "Cannot find filter for filter-mapping %s of context %s, defined in %s",
64 filterMapping.getFilterName(), path, fileName));
67 filterMappings = Collections.unmodifiableList(new ArrayList<>(filterMappings));
68 urlMatcher = new UrlMatcher<>(patternMap);
72 public List<Filter> findMatchingFilters(String pathInfo) {
73 checkState(initialized, "Not initialized");
74 return urlMatcher.findMatchingFilters(pathInfo);
77 @XmlAttribute(name = "path")
78 public String getPath() {
82 public void setPath(String path) {
83 checkArgument(initialized == false, "Already initialized");
87 @XmlElement(name = "filter")
88 public List<Filter> getFilters() {
92 public void setFilters(List<Filter> filters) {
93 checkArgument(initialized == false, "Already initialized");
94 this.filters = filters;
97 @XmlElement(name = "filter-mapping")
98 public List<FilterMapping> getFilterMappings() {
99 return filterMappings;
102 public void setFilterMappings(List<FilterMapping> filterMappings) {
103 checkArgument(initialized == false, "Already initialized");
104 this.filterMappings = filterMappings;
108 public String toString() {
110 "path='" + path + '\'' +