001/**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.camel;
018
019import java.net.URISyntaxException;
020import java.util.List;
021import java.util.Map;
022import java.util.SortedMap;
023
024import org.apache.camel.impl.ParameterConfiguration;
025
026/**
027 * Represents a set of configuration values for an endpoint URI which can be created from a URI string
028 * or a base URI string and a set of parameter names and values.
029 *
030 * The configuration values can then be introspected, modified and converted back into a URI string
031 * or Endpoint.
032 *
033 * For @{link UriEndpointComponent} implementations created for Endpoints annotated with {@link org.apache.camel.spi.UriEndpoint} and the
034 * associated annotations then all the parameter values can be introspected and the parameter values are converted to their
035 * correct type.
036 *
037 * Other implementations keep all the types as String and there is no validation until you try to create
038 * an Endpoint from the values.
039 */
040public interface ComponentConfiguration {
041
042    /**
043     * Returns the base URI without any query parameters added
044     */
045    String getBaseUri();
046
047    /**
048     * Sets the base URI without any query parameters added
049     */
050    void setBaseUri(String baseUri);
051
052    /**
053     * Returns the current parameters of the configuration (usually encoded as ?foo=bar&whatnot=something URI query parameters)
054     */
055    Map<String, Object> getParameters();
056
057    /**
058     * Sets the parameter values of this configuration
059     */
060    void setParameters(Map<String, Object> propertyValues);
061
062    /**
063     * Returns the parameter value for the given name
064     *
065     * @param name the name of the URI query parameter to get
066     * @return the value of the parameter
067     */
068    Object getParameter(String name);
069
070    /**
071     * Sets the parameter value of the given name
072     *
073     * @param name  the name of the URI query parameter
074     * @param value the new value of the parameter
075     */
076    void setParameter(String name, Object value);
077
078
079    /**
080     * Returns the URI string (without schema) with query parameters for the current
081     * configuration which can then be used to create an {@link org.apache.camel.Endpoint}
082     */
083    String getUriString();
084
085    /**
086     * Sets the URI string (without schema but with optional query parameters)
087     * which will update the {@link #getBaseUri()} and the {@link #getParameters()} values
088     *
089     * @param newValue the new URI string with query arguments
090     */
091    void setUriString(String newValue) throws URISyntaxException;
092
093    /**
094     * Returns the URI query parameter configuration for the given parameter name or null if it does not exist
095     */
096    ParameterConfiguration getParameterConfiguration(String name);
097
098    /**
099     * Returns the sorted map of all the parameter names to their {@link ParameterConfiguration} objects
100     */
101    SortedMap<String, ParameterConfiguration> getParameterConfigurationMap();
102
103    /**
104     * Converts the configuration into a URI and then looks up the endpoint in the {@link CamelContext}
105     * which typically results in a new {@link Endpoint} instance being created.
106     */
107    Endpoint createEndpoint() throws Exception;
108
109    /**
110     * Applies the current set of parameters to the given endpoint instance.
111     * <p/>
112     * Note that typically parts of the URI are not injected into the Endpoint; this method purely
113     *
114     * @param endpoint
115     */
116    void configureEndpoint(Endpoint endpoint);
117
118    /**
119     * Gets the named URI parameter value on the given endpoint
120     *
121     * @param endpoint the endpoint instance
122     * @param name     the name of the URI query parameter
123     * @return the value of the parameter
124     * @throws RuntimeCamelException if the parameter name does not exist on the endpoint
125     */
126    Object getEndpointParameter(Endpoint endpoint, String name) throws RuntimeCamelException;
127
128    /**
129     * Sets the named URI query parameter value on the given endpoint
130     *
131     * @param endpoint the endpoint instance
132     * @param name     the name of the URI query parameter
133     * @param value    the new value of the URI query parameter
134     * @throws RuntimeCamelException
135     */
136    void setEndpointParameter(Endpoint endpoint, String name, Object value) throws RuntimeCamelException;
137
138    /**
139     * A helper method for tools such as CLIs, IDEs or web tools that provides a completion list for Endpoint Paths
140     * rather like bash tab completion or Karaf attribute or option completion handers.
141     *
142     * So given the current configuration data, return a list of completions given the specified text.
143     *
144     * e.g. return the files in a directory, the matching queues in a message broker, the database tables in a database component etc
145     *
146     * @param completionText the prefix text used to complete on (usually a matching bit of text)
147     *
148     * @return a list of matches
149     * @return a list of matches
150     */
151    List<String> completeEndpointPath(String completionText);
152
153    /**
154     * Creates a <a href="http://json-schema.org/">JSON schema</a> representation of the
155     * configuration parameters for this endpoint and the types and validation rules.
156     *
157     * @return a JSON string which represents the JSON schema for this endpoints configuration parameters.
158     */
159    String createParameterJsonSchema();
160}
161