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

org.mule.runtime.config.internal.SpringConfigurationComponentLocator Maven / Gradle / Ivy

/*
 * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
 * The software in this package is published under the terms of the CPAL v1.0
 * license, a copy of which has been included with this distribution in the
 * LICENSE.txt file.
 */
package org.mule.runtime.config.internal;

import static java.util.Collections.unmodifiableList;
import static java.util.Optional.empty;
import static java.util.Optional.ofNullable;
import static java.util.stream.Collectors.toList;
import static org.mule.runtime.core.api.util.ClassUtils.memoize;

import org.mule.runtime.api.component.Component;
import org.mule.runtime.api.component.ComponentIdentifier;
import org.mule.runtime.api.component.location.ComponentLocation;
import org.mule.runtime.api.component.location.ConfigurationComponentLocator;
import org.mule.runtime.api.component.location.Location;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;

/**
 * Spring implementation of {@link ConfigurationComponentLocator}.
 *
 * since 4.0
 */
public class SpringConfigurationComponentLocator implements ConfigurationComponentLocator {

  private final Function isTemplateLocationFunction;
  private final Map componentsMap = new HashMap<>();
  private final Set componentLocations = new HashSet<>();

  public SpringConfigurationComponentLocator(Function isTemplateComponentFunction) {
    this.isTemplateLocationFunction = memoize(isTemplateComponentFunction, new ConcurrentHashMap<>());
  }

  /**
   * Adds a new component to the locator.
   *
   * @param component the component to be added
   */
  public void addComponent(Component component) {
    this.componentsMap.put(component.getLocation().getLocation(), component);
  }

  /**
   * Adds a new {@link ComponentLocation} to the locator.
   * 

* This method is used in addition to {@link #addComponent(Component)} when the parser knows a certain location exists but the * component in that location is not available (i.e.: is lazy) * * @param location the component to be added */ public void addComponentLocation(ComponentLocation location) { this.componentLocations.add(location); } /** * Removes a component from the locator * * @param location the location of the component to be removed */ public void removeComponent(Location location) { this.componentsMap.remove(location.toString()); } /** * {@inheritDoc} */ @Override public Optional find(Location location) { if (isTemplateLocationFunction.apply(location.getGlobalName())) { return empty(); } return ofNullable(componentsMap.get(location.toString())); } /** * {@inheritDoc} */ @Override public List find(ComponentIdentifier componentIdentifier) { return componentsMap.values().stream() .filter(component -> component.getLocation().getComponentIdentifier().getIdentifier().equals(componentIdentifier)) .collect(toList()); } /** * {@inheritDoc} */ @Override public List findAllLocations() { return unmodifiableList(new ArrayList<>(componentLocations)); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy