001    /**
002     *
003     * Licensed to the Apache Software Foundation (ASF) under one or more
004     * contributor license agreements.  See the NOTICE file distributed with
005     * this work for additional information regarding copyright ownership.
006     * The ASF licenses this file to You under the Apache License, Version 2.0
007     * (the "License"); you may not use this file except in compliance with
008     * the License.  You may obtain a copy of the License at
009     *
010     * http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    package org.apache.camel.component.cxf;
019    
020    import org.apache.camel.EndpointResolver;
021    import org.apache.camel.Component;
022    import org.apache.camel.CamelContext;
023    import org.apache.camel.util.ObjectHelper;
024    
025    import java.io.IOException;
026    import java.net.URISyntaxException;
027    import java.util.concurrent.Callable;
028    
029    /**
030     * An implementation of {@link EndpointResolver} that creates
031     * {@link CxfEndpoint} objects.
032     *
033     * The syntax for a MINA URI looks like:
034     *
035     * <pre><code>mina:</code></pre>
036     *
037     * @version $Revision:520964 $
038     */
039    public class CxfEndpointResolver implements EndpointResolver<CxfExchange> {
040    
041            public static final String DEFAULT_COMPONENT_NAME = CxfEndpointResolver.class.getName();
042    
043            /**
044             * Finds the {@link CxfComponent} specified by the uri.  If the {@link CxfComponent}
045             * object do not exist, it will be created.
046             */
047            public Component resolveComponent(CamelContext container, String uri) {
048                    String[] id = getEndpointId(uri);
049                    return resolveCxfComponent(container, id[0]);
050            }
051    
052            /**
053             * Finds the {@link CxfEndpoint} specified by the uri.  If the {@link CxfEndpoint} or it's associated
054             * {@see QueueComponent} object do not exist, they will be created.
055             */
056            public CxfEndpoint resolveEndpoint(CamelContext container, String uri) throws IOException, URISyntaxException {
057                    String[] urlParts = getEndpointId(uri);
058            CxfComponent component = resolveCxfComponent(container, urlParts[0]);
059            return component.createEndpoint(uri, urlParts);
060        }
061    
062            /**
063             * @return an array that looks like: [componentName,endpointName]
064             */
065            private String[] getEndpointId(String uri) {
066                    String rc [] = {CxfEndpointResolver.DEFAULT_COMPONENT_NAME, null};
067                    String splitURI[] = ObjectHelper.splitOnCharacter(uri, ":", 3);
068            if( splitURI[2] != null ) {
069                    rc[0] =  splitURI[1];
070                    rc[1] =  splitURI[2];
071            } else {
072                    rc[1] =  splitURI[1];
073            }
074                    return rc;
075            }
076    
077            @SuppressWarnings("unchecked")
078            private CxfComponent resolveCxfComponent(final CamelContext context, final String componentName) {
079            Component rc = context.getOrCreateComponent(componentName, new Callable(){
080                            public CxfComponent call() throws Exception {
081                    return new CxfComponent(context);
082                            }});
083            return (CxfComponent) rc;
084            }
085    
086    
087    }