001/*
002 * (C) Copyright 2006-2008 Nuxeo SAS (http://nuxeo.com/) and contributors.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the GNU Lesser General Public License
006 * (LGPL) version 2.1 which accompanies this distribution, and is available at
007 * http://www.gnu.org/licenses/lgpl.html
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * Contributors:
015 *     Stephane Lacoin (Nuxeo EP Software Engineer)
016 */
017package org.nuxeo.runtime.management;
018
019import java.util.Map;
020import java.util.regex.Matcher;
021import java.util.regex.Pattern;
022
023import javax.management.JMException;
024import javax.management.ObjectName;
025
026import org.nuxeo.runtime.model.ComponentName;
027
028/**
029 * @author Stephane Lacoin (Nuxeo EP Software Engineer)
030 */
031public class ObjectNameFactory {
032
033    public static final String NUXEO_DOMAIN_NAME = "org.nuxeo";
034
035    private ObjectNameFactory() {
036    }
037
038    public static String formatQualifiedName(String domainName, String typeName, String instanceName) {
039        int lastDotIndex = instanceName.lastIndexOf('.');
040        if (lastDotIndex > 0) {
041            String packageName = instanceName.substring(0, lastDotIndex);
042            instanceName = instanceName.substring(lastDotIndex + 1);
043            return formatQualifiedName(domainName, typeName, packageName, instanceName);
044        }
045        return String.format("%s:name=%s,type=%s", domainName, instanceName, typeName);
046    }
047
048    public static String formatQualifiedName(String domainName, String typeName, String packageName, String instanceName) {
049        return String.format("%s:package=%s,name=%s,type=%s", domainName, packageName, instanceName, typeName);
050    }
051
052    public static String formatQualifiedName(String typeName, String instanceName) {
053        return formatQualifiedName(NUXEO_DOMAIN_NAME, typeName, instanceName);
054    }
055
056    public static String formatQualifiedName(ComponentName componentName) {
057        return formatQualifiedName(componentName.getType(), componentName.getName());
058    }
059
060    public static String formatQualifiedName(String instanceName) {
061        return formatQualifiedName("service", instanceName);
062    }
063
064    public static String formatMetricQualifiedName(ComponentName name, String metricName) {
065        return formatQualifiedName(name) + ",metric=" + metricName + ",management=metric";
066    }
067
068    public static String formatMetricQualifiedName(String name, String type) {
069        if (NUXEO_DOMAIN_NAME.equals(name)) {
070            name = "root";
071        }
072        if (name.startsWith(NUXEO_DOMAIN_NAME)) {
073            name = name.substring(NUXEO_DOMAIN_NAME.length() + 1);
074        }
075        return String.format("%s:name=%s,type=%s,management=metric", NUXEO_DOMAIN_NAME, name, type);
076    }
077
078    public static String formatAVAs(String... avas) {
079        StringBuffer buffer = new StringBuffer();
080        for (String ava : avas) {
081            if (buffer.length() > 0) {
082                buffer.append(",");
083            }
084            buffer.append(ava);
085        }
086        return buffer.toString();
087    }
088
089    public static String formatInventoryQualifiedName(ComponentName name) {
090        return formatQualifiedName(name) + ",management=inventory";
091    }
092
093    public static String formatProbeQualifiedName(ComponentName name) {
094        return formatQualifiedName(name) + ",management=probe";
095    }
096
097    public static String removeDotPart(String name) {
098        int lastDotPos = name.lastIndexOf('.');
099        if (lastDotPos != -1) {
100            name = name.substring(lastDotPos + 1);
101        }
102        return name;
103    }
104
105    public static String formatShortName(ObjectName name) {
106        String shortName = removeDotPart(name.getKeyProperty("name"));
107        String typeName = name.getKeyProperty("type");
108        if (!typeName.equals("service")) {
109            shortName += "-" + typeName;
110        }
111        Map<String, String> keys = name.getKeyPropertyList();
112        for (Map.Entry<String, String> keyEntry : keys.entrySet()) {
113            String key = keyEntry.getKey();
114            String value = keyEntry.getValue();
115            if (key.equals("name")) {
116                continue;
117            }
118            if (key.equals("type") && value.equals("service")) {
119                continue;
120            }
121            shortName += "-" + keyEntry.getValue();
122        }
123        return shortName;
124    }
125
126    public static String formatShortName(String name) {
127        ObjectName objectName = getObjectName(name);
128        return formatShortName(objectName);
129    }
130
131    public static String formatTypeQuery(String typeName) {
132        return formatTypeQuery(NUXEO_DOMAIN_NAME, typeName);
133    }
134
135    public static String formatTypeQuery(String domainName, String typeName) {
136        return String.format("%s:type=%s,*", domainName, typeName);
137    }
138
139    private static final Pattern namePattern = Pattern.compile(".*:.*");
140
141    public static boolean hasDomain(String value) {
142        if (value == null) {
143            return false;
144        }
145        Matcher matcher = namePattern.matcher(value);
146        return matcher.matches();
147    }
148
149    private static final Pattern avaPattern = Pattern.compile(".*=.*");
150
151    public static boolean hasAttributeValueAssertion(String value) {
152        if (value == null) {
153            return false;
154        }
155        Matcher matcher = avaPattern.matcher(value);
156        return matcher.matches();
157    }
158
159    public static boolean isQualified(String name) {
160        return hasDomain(name) && hasAttributeValueAssertion(name);
161    }
162
163    public static String getQualifiedName(String name) {
164        String qualifiedName = name;
165        if (!hasAttributeValueAssertion(qualifiedName)) {
166            qualifiedName = NUXEO_DOMAIN_NAME + ":name=" + name + ",type=service";
167        } else if (!hasDomain(qualifiedName)) {
168            qualifiedName = NUXEO_DOMAIN_NAME + ":" + qualifiedName;
169        }
170        return qualifiedName;
171    }
172
173    public static ObjectName getObjectName(String name) {
174        String qualifiedName = getQualifiedName(name);
175        try {
176            return new ObjectName(qualifiedName);
177        } catch (JMException e) {
178            throw ManagementRuntimeException.wrap(name + " is not correct", e);
179        }
180    }
181
182    public static ObjectName getObjectName(String name, String avas) {
183        String qualifiedName = getQualifiedName(name) + "," + avas;
184        try {
185            return new ObjectName(qualifiedName);
186        } catch (JMException e) {
187            throw ManagementRuntimeException.wrap(name + " is not correct", e);
188        }
189    }
190
191    public static String formatMetricShortName(String name) {
192        return name + "-metric";
193    }
194
195    public static String formatInventoryShortName(String name) {
196        return name + "-inventory";
197    }
198
199    public static String formatProbeShortName(String name) {
200        return name + "-probe";
201    }
202
203}