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.mina;
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 import org.apache.camel.component.queue.QueueComponent;
025
026 import java.util.concurrent.Callable;
027 import java.io.IOException;
028 import java.net.URISyntaxException;
029
030 /**
031 * An implementation of {@link EndpointResolver} that creates
032 * {@link MinaEndpoint} objects.
033 *
034 * The syntax for a MINA URI looks like:
035 *
036 * <pre><code>mina:</code></pre>
037 *
038 * @version $Revision:520964 $
039 */
040 public class MinaEndpointResolver implements EndpointResolver<MinaExchange> {
041
042 public static final String DEFAULT_COMPONENT_NAME = MinaEndpointResolver.class.getName();
043
044 /**
045 * Finds the {@link MinaComponent} specified by the uri. If the {@link MinaComponent}
046 * object do not exist, it will be created.
047 */
048 public Component resolveComponent(CamelContext container, String uri) {
049 String[] id = getEndpointId(uri);
050 return resolveMinaComponent(container, id[0]);
051 }
052
053 /**
054 * Finds the {@link MinaEndpoint} specified by the uri. If the {@link MinaEndpoint} or it's associated
055 * {@see QueueComponent} object do not exist, they will be created.
056 */
057 public MinaEndpoint resolveEndpoint(CamelContext container, String uri) throws IOException, URISyntaxException {
058 String[] urlParts = getEndpointId(uri);
059 MinaComponent component = resolveMinaComponent(container, urlParts[0]);
060 return component.createEndpoint(uri, urlParts);
061 }
062
063 /**
064 * @return an array that looks like: [componentName,endpointName]
065 */
066 private String[] getEndpointId(String uri) {
067 String rc [] = {DEFAULT_COMPONENT_NAME, null};
068 String splitURI[] = ObjectHelper.splitOnCharacter(uri, ":", 3);
069 if( splitURI[2] != null ) {
070 rc[0] = splitURI[1];
071 rc[1] = splitURI[2];
072 } else {
073 rc[1] = splitURI[1];
074 }
075 return rc;
076 }
077
078 @SuppressWarnings("unchecked")
079 private MinaComponent resolveMinaComponent(final CamelContext context, final String componentName) {
080 Component rc = context.getOrCreateComponent(componentName, new Callable(){
081 public MinaComponent call() throws Exception {
082 return new MinaComponent(context);
083 }});
084 return (MinaComponent) rc;
085 }
086
087
088 }