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.management;
019    
020    import java.net.InetAddress;
021    import java.net.UnknownHostException;
022    import java.util.Hashtable;
023    
024    import javax.management.MalformedObjectNameException;
025    import javax.management.ObjectName;
026    
027    import org.apache.camel.CamelContext;
028    import org.apache.camel.Endpoint;
029    
030    public class CamelNamingStrategy {
031    
032            public static final String VALUE_UNKNOWN = "unknown";
033            public static final String KEY_CONTEXT = "context";
034            public static final String KEY_ENDPOINT = "endpoint";
035            public static final String KEY_ROUTE = "route";
036            public static final String KEY_TYPE = "type";
037            public static final String KEY_NAME = "name";
038            public static final String TYPE_ENDPOINTS = "Endpoints";
039            public static final String TYPE_SERVICES = "Services";
040            public static final String TYPE_ROUTES = "Routes";
041            
042            protected String domainName = "org.apache.camel";
043            protected String hostName = "locahost";
044            
045            public CamelNamingStrategy(String domainName) {
046                    if (domainName != null) {
047                        this.domainName = domainName;
048                    }
049                    try {
050                            hostName = InetAddress.getLocalHost().getHostName();
051                    }
052                    catch (UnknownHostException ex) {
053                            // ignore
054                    }
055            }
056    
057            /**
058             * Implements the naming strategy for a {@see CamelContext}.
059             * The convention used for a {@see CamelContext} ObjectName is
060             * "<domain>:context=<context>,name=camel".
061             * 
062             * @param mbean
063             * @return generated ObjectName
064             * @throws MalformedObjectNameException
065             */
066            public ObjectName getObjectName(CamelContext context) throws MalformedObjectNameException {
067                    Hashtable<String, String> keys = new Hashtable<String, String>();
068                    keys.put(KEY_CONTEXT, getContextId(context));
069                    keys.put(KEY_NAME, "camel");
070                    return new ObjectName(domainName, keys);
071            }
072    
073            /**
074             * Implements the naming strategy for a {@see ManagedEndpoint}.
075             * The convention used for a {@see ManagedEndpoint} ObjectName is
076             * "<domain>:context=<context>,type=Endpoints,endpoint=[urlPrefix]localPart".
077             * 
078             * @param mbean
079             * @return generated ObjectName
080             * @throws MalformedObjectNameException
081             */
082            public ObjectName getObjectName(ManagedEndpoint mbean) throws MalformedObjectNameException {
083                    Endpoint ep = mbean.getEndpoint();
084                    Hashtable<String, String> keys = new Hashtable<String, String>();
085                    keys.put(KEY_CONTEXT, getContextId(ep.getContext()));
086                    keys.put(KEY_TYPE, TYPE_ENDPOINTS);
087                    keys.put(KEY_ENDPOINT, getEndpointId(ep));
088                    return new ObjectName(domainName, keys);
089            }
090    
091            /**
092             * Implements the naming strategy for a {@see ServiceSpport Service}.
093             * The convention used for a {@see Service} ObjectName is
094             * "<domain>:context=<context>,type=Services,endpoint=[urlPrefix]localPart".
095             * 
096             * @param mbean
097             * @return generated ObjectName
098             * @throws MalformedObjectNameException
099             */
100            public ObjectName getObjectName(CamelContext context, ManagedService mbean) throws MalformedObjectNameException {
101                    Hashtable<String, String> keys = new Hashtable<String, String>();
102                    keys.put(KEY_CONTEXT, getContextId(context));
103                    keys.put(KEY_TYPE, TYPE_SERVICES);
104                    keys.put(KEY_ENDPOINT, Integer.toHexString(mbean.getService().hashCode()));
105                    return new ObjectName(domainName, keys);
106            }
107    
108            /**
109             * Implements the naming strategy for a {@see ManagedRoute}.
110             * The convention used for a {@see ManagedEndpoint} ObjectName is
111             * "<domain>:context=<context>,type=Routes,endpoint=[urlPrefix]localPart".
112             * 
113             * @param mbean
114             * @return generated ObjectName
115             * @throws MalformedObjectNameException
116             */
117            public ObjectName getObjectName(ManagedRoute mbean) throws MalformedObjectNameException {
118                    Hashtable<String, String> keys = new Hashtable<String, String>();
119                    Endpoint ep = mbean.getRoute().getEndpoint();
120                    String ctxid = ep != null ? getContextId(ep.getContext()) : VALUE_UNKNOWN;
121                    keys.put(KEY_CONTEXT, ctxid);
122                    keys.put(KEY_TYPE, TYPE_ROUTES);
123                    keys.put(KEY_ENDPOINT, getEndpointId(ep));
124                    return new ObjectName(domainName, keys);
125            }
126            
127            protected String getContextId(CamelContext context) {
128                    String id = context != null ? Integer.toString(context.hashCode()) : VALUE_UNKNOWN;
129                    return hostName + "/" + id;
130            }
131            
132            protected String getEndpointId(Endpoint ep) {
133                    String uri = ep.getEndpointUri();
134                    int pos = uri.indexOf(':');
135                    String id = (pos == -1) ? uri : 
136                            "[" + uri.substring(0, pos) + "]" + uri.substring(pos + 1);
137                    if (!ep.isSingleton()) { 
138                            id += "." + Integer.toString(ep.hashCode());
139                    }
140                    return id;
141            }
142    }