/*
|
* CDDL HEADER START
|
*
|
* The contents of this file are subject to the terms of the
|
* Common Development and Distribution License, Version 1.0 only
|
* (the "License"). You may not use this file except in compliance
|
* with the License.
|
*
|
* You can obtain a copy of the license at
|
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
|
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
|
* See the License for the specific language governing permissions
|
* and limitations under the License.
|
*
|
* When distributing Covered Code, include this CDDL HEADER in each
|
* file and include the License file at
|
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
|
* add the following below this CDDL HEADER, with the fields enclosed
|
* by brackets "[]" replaced with your own identifying information:
|
* Portions Copyright [yyyy] [name of copyright owner]
|
*
|
* CDDL HEADER END
|
*
|
*
|
* Copyright 2008 Sun Microsystems, Inc.
|
*/
|
|
package org.opends.build.tools;
|
|
import org.opends.messages.Category;
|
import org.opends.messages.Severity;
|
|
import java.util.EnumSet;
|
|
/**
|
* OpenDS messages defined in properties files must be defined
|
* with the ordinal and in most cases category and severity encoded
|
* in the message key. This class helps with generating and
|
* parsing of these keys.
|
*
|
* Keys must be of the form
|
*
|
* CATEGORY_SEVERITY_DESCRIPTION_ORDINAL
|
*
|
* where:
|
* <ul>
|
* <li>
|
* CATEGORY is the string representation of one of the
|
* <code>Category</code> enums.
|
* </li>
|
* <li>
|
* SEVERITY is the long or abbreviated form of one of
|
* the <code>Severity</code> enums.
|
* </li>
|
* <li>
|
* DESCRIPTION is an uppercase string containing characters
|
* and the underscore character for describing the purpose
|
* of the message.
|
* </li>
|
* <li>
|
* ORDINAL is an integer that makes the message unique witin
|
* the property file.
|
* </li>
|
* </ul>
|
*
|
*/
|
// TODO: move this class to GenerateMessageFile when DirectoryServer
|
// no longer needs to support dumpMessages()
|
public class MessagePropertyKey
|
implements Comparable<MessagePropertyKey> {
|
|
private Category category;
|
|
private Severity severity;
|
|
private String description;
|
|
private Integer ordinal;
|
|
/**
|
* Creates a message property key from a string value.
|
* @param keyString from properties file
|
* @param includesCategory when true expects ordinals to be encoded
|
* in the keystring; when false the mandate is relaxed
|
* @param includesSeverity when true expects ordinals to be encoded
|
* in the keystring; when false the mandate is relaxed
|
* @param includesOrdinal when true expects ordinals to be encoded
|
* in the keystring; when false the mandate is relaxed
|
* @return MessagePropertyKey created from string
|
*/
|
static public MessagePropertyKey parseString(
|
String keyString,
|
boolean includesCategory,
|
boolean includesSeverity,
|
boolean includesOrdinal) {
|
|
Category category = null;
|
Severity severity = null;
|
String description;
|
Integer ordinal = null;
|
|
String k = keyString;
|
for (Category c : EnumSet.allOf(Category.class)) {
|
String cName = c.name();
|
if (k.startsWith(cName)) {
|
category = c;
|
if ('_' != k.charAt(cName.length())) {
|
throw new IllegalArgumentException(
|
"Error processing " + keyString + ". Category must be " +
|
"separated from the rest of the " +
|
"key with an '_' character");
|
}
|
k = k.substring(cName.length() + 1);
|
break;
|
}
|
}
|
if (category == null && includesCategory) {
|
throw new IllegalArgumentException("Category not included in key " +
|
keyString);
|
}
|
|
for (Severity s : EnumSet.allOf(Severity.class)) {
|
String sName = s.propertyKeyFormName();
|
if (k.startsWith(sName)) {
|
severity = s;
|
if ('_' != k.charAt(sName.length())) {
|
throw new IllegalArgumentException(
|
"Error processing " + keyString + ". Severity must be " +
|
"separated from the rest of the " +
|
"key with an '_' character");
|
}
|
k = k.substring(sName.length() + 1);
|
break;
|
}
|
}
|
if (severity == null && includesSeverity) {
|
throw new IllegalArgumentException("Severity not included in key " +
|
keyString);
|
}
|
|
if (includesOrdinal) {
|
int li = k.lastIndexOf("_");
|
if (li != -1) {
|
description = k.substring(0, li).toUpperCase();
|
} else {
|
throw new IllegalArgumentException(
|
"Incorrectly formatted key " + keyString);
|
}
|
|
try {
|
String ordString = k.substring(li + 1);
|
ordinal = Integer.parseInt(ordString);
|
} catch (Exception nfe) {
|
throw new IllegalArgumentException("Error parsing ordinal for key " +
|
keyString);
|
}
|
} else {
|
description = k;
|
}
|
return new MessagePropertyKey(category, severity, description, ordinal);
|
}
|
|
/**
|
* Creates a parameterized instance.
|
* @param category of this key
|
* @param severity of this key
|
* @param description of this key
|
* @param ordinal of this key
|
*/
|
public MessagePropertyKey(Category category, Severity severity,
|
String description, Integer ordinal) {
|
this.category = category;
|
this.severity = severity;
|
this.description = description;
|
this.ordinal = ordinal;
|
}
|
|
/**
|
* Gets the category of this key.
|
* @return Category of this key
|
*/
|
public Category getCategory() {
|
return this.category;
|
}
|
|
/**
|
* Gets the severity of this key.
|
* @return Severity of this key
|
*/
|
public Severity getSeverity() {
|
return this.severity;
|
}
|
|
/**
|
* Gets the description of this key.
|
* @return description of this key
|
*/
|
public String getDescription() {
|
return this.description;
|
}
|
|
/**
|
* Gets the ordinal of this key.
|
* @return ordinal of this key
|
*/
|
public Integer getOrdinal() {
|
return this.ordinal;
|
}
|
|
/**
|
* Gets the name of the MessageDescriptor as it should appear
|
* in the messages file.
|
* @return name of message descriptor
|
*/
|
public String getMessageDescriptorName() {
|
return new StringBuilder()
|
.append(this.severity.messageDesciptorName())
|
.append("_")
|
.append(this.description).toString();
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
public String toString() {
|
return getPropertyKeyName(true, true, true);
|
}
|
|
/**
|
* Gets the name of the key as it would appear in a properties file.
|
* @param includeCategory in the name
|
* @param includeSeverity in the name
|
* @param includeOrdinal in the name
|
* @return string representing the property key
|
*/
|
public String getPropertyKeyName(boolean includeCategory,
|
boolean includeSeverity,
|
boolean includeOrdinal) {
|
StringBuilder sb = new StringBuilder();
|
if (category != null && includeCategory) {
|
sb.append(category.name());
|
sb.append("_");
|
}
|
if (severity != null && includeSeverity) {
|
sb.append(severity.propertyKeyFormName());
|
sb.append("_");
|
}
|
sb.append(description);
|
if (ordinal != null && includeOrdinal) {
|
sb.append("_");
|
sb.append(ordinal);
|
}
|
return sb.toString();
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
public int compareTo(MessagePropertyKey k) {
|
if (ordinal == k.ordinal) {
|
return description.compareTo(k.description);
|
} else {
|
return ordinal.compareTo(k.ordinal);
|
}
|
}
|
|
}
|