001/*
002 * (C) Copyright 2006-2008 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 *
016 * Contributors:
017 *     Stephane Lacoin (Nuxeo EP Software Engineer)
018 */
019package org.nuxeo.runtime.management;
020
021import java.util.Map;
022import java.util.regex.Matcher;
023import java.util.regex.Pattern;
024
025import javax.management.JMException;
026import javax.management.ObjectName;
027
028import org.nuxeo.runtime.model.ComponentName;
029
030/**
031 * @author Stephane Lacoin (Nuxeo EP Software Engineer)
032 */
033public class ObjectNameFactory {
034
035    public static final String NUXEO_DOMAIN_NAME = "org.nuxeo";
036
037    private ObjectNameFactory() {
038    }
039
040    public static String formatQualifiedName(String domainName, String typeName, String instanceName) {
041        int lastDotIndex = instanceName.lastIndexOf('.');
042        if (lastDotIndex > 0) {
043            String packageName = instanceName.substring(0, lastDotIndex);
044            instanceName = instanceName.substring(lastDotIndex + 1);
045            return formatQualifiedName(domainName, typeName, packageName, instanceName);
046        }
047        return String.format("%s:name=%s,type=%s", domainName, instanceName, typeName);
048    }
049
050    public static String formatQualifiedName(String domainName, String typeName, String packageName, String instanceName) {
051        return String.format("%s:package=%s,name=%s,type=%s", domainName, packageName, instanceName, typeName);
052    }
053
054    public static String formatQualifiedName(String typeName, String instanceName) {
055        return formatQualifiedName(NUXEO_DOMAIN_NAME, typeName, instanceName);
056    }
057
058    public static String formatQualifiedName(ComponentName componentName) {
059        return formatQualifiedName(componentName.getType(), componentName.getName());
060    }
061
062    public static String formatQualifiedName(String instanceName) {
063        return formatQualifiedName("service", instanceName);
064    }
065
066    public static String formatMetricQualifiedName(ComponentName name, String metricName) {
067        return formatQualifiedName(name) + ",metric=" + metricName + ",management=metric";
068    }
069
070    public static String formatMetricQualifiedName(String name, String type) {
071        if (NUXEO_DOMAIN_NAME.equals(name)) {
072            name = "root";
073        }
074        if (name.startsWith(NUXEO_DOMAIN_NAME)) {
075            name = name.substring(NUXEO_DOMAIN_NAME.length() + 1);
076        }
077        return String.format("%s:name=%s,type=%s,management=metric", NUXEO_DOMAIN_NAME, name, type);
078    }
079
080    public static String formatAVAs(String... avas) {
081        StringBuffer buffer = new StringBuffer();
082        for (String ava : avas) {
083            if (buffer.length() > 0) {
084                buffer.append(",");
085            }
086            buffer.append(ava);
087        }
088        return buffer.toString();
089    }
090
091    public static String formatInventoryQualifiedName(ComponentName name) {
092        return formatQualifiedName(name) + ",management=inventory";
093    }
094
095    public static String formatProbeQualifiedName(ComponentName name) {
096        return formatQualifiedName(name) + ",management=probe";
097    }
098
099    public static String removeDotPart(String name) {
100        int lastDotPos = name.lastIndexOf('.');
101        if (lastDotPos != -1) {
102            name = name.substring(lastDotPos + 1);
103        }
104        return name;
105    }
106
107    public static String formatShortName(ObjectName name) {
108        String shortName = removeDotPart(name.getKeyProperty("name"));
109        String typeName = name.getKeyProperty("type");
110        if (!typeName.equals("service")) {
111            shortName += "-" + typeName;
112        }
113        Map<String, String> keys = name.getKeyPropertyList();
114        for (Map.Entry<String, String> keyEntry : keys.entrySet()) {
115            String key = keyEntry.getKey();
116            String value = keyEntry.getValue();
117            if (key.equals("name")) {
118                continue;
119            }
120            if (key.equals("type") && value.equals("service")) {
121                continue;
122            }
123            shortName += "-" + keyEntry.getValue();
124        }
125        return shortName;
126    }
127
128    public static String formatShortName(String name) {
129        ObjectName objectName = getObjectName(name);
130        return formatShortName(objectName);
131    }
132
133    public static String formatTypeQuery(String typeName) {
134        return formatTypeQuery(NUXEO_DOMAIN_NAME, typeName);
135    }
136
137    public static String formatTypeQuery(String domainName, String typeName) {
138        return String.format("%s:type=%s,*", domainName, typeName);
139    }
140
141    private static final Pattern namePattern = Pattern.compile(".*:.*");
142
143    public static boolean hasDomain(String value) {
144        if (value == null) {
145            return false;
146        }
147        Matcher matcher = namePattern.matcher(value);
148        return matcher.matches();
149    }
150
151    private static final Pattern avaPattern = Pattern.compile(".*=.*");
152
153    public static boolean hasAttributeValueAssertion(String value) {
154        if (value == null) {
155            return false;
156        }
157        Matcher matcher = avaPattern.matcher(value);
158        return matcher.matches();
159    }
160
161    public static boolean isQualified(String name) {
162        return hasDomain(name) && hasAttributeValueAssertion(name);
163    }
164
165    public static String getQualifiedName(String name) {
166        String qualifiedName = name;
167        if (!hasAttributeValueAssertion(qualifiedName)) {
168            qualifiedName = NUXEO_DOMAIN_NAME + ":name=" + name + ",type=service";
169        } else if (!hasDomain(qualifiedName)) {
170            qualifiedName = NUXEO_DOMAIN_NAME + ":" + qualifiedName;
171        }
172        return qualifiedName;
173    }
174
175    public static ObjectName getObjectName(String name) {
176        String qualifiedName = getQualifiedName(name);
177        try {
178            return new ObjectName(qualifiedName);
179        } catch (JMException e) {
180            throw ManagementRuntimeException.wrap(name + " is not correct", e);
181        }
182    }
183
184    public static ObjectName getObjectName(String name, String avas) {
185        String qualifiedName = getQualifiedName(name) + "," + avas;
186        try {
187            return new ObjectName(qualifiedName);
188        } catch (JMException e) {
189            throw ManagementRuntimeException.wrap(name + " is not correct", e);
190        }
191    }
192
193    public static String formatMetricShortName(String name) {
194        return name + "-metric";
195    }
196
197    public static String formatInventoryShortName(String name) {
198        return name + "-inventory";
199    }
200
201    public static String formatProbeShortName(String name) {
202        return name + "-probe";
203    }
204
205}