/*
* 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.messages;
import java.util.Map;
import java.util.HashMap;
import java.util.Set;
import java.util.HashSet;
import java.util.Collections;
import java.util.List;
import java.util.LinkedList;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.lang.reflect.Field;
/**
* Serves as a registry for messages providing access to message descriptors
* by ID and class in which they are defined. Classes containing message
* descriptors are stored in the text file "descriptors.reg" which is
* generated during the OpenDS build process.
*/
@org.opends.server.types.PublicAPI(
stability=org.opends.server.types.StabilityLevel.PRIVATE)
final class MessageDescriptorRegistry {
private static final String REGISTRY_FILE = "descriptors.reg";
private static final Set<Class<?>> REGISTERED_MESSAGE_CLASSES =
new HashSet<Class<?>>();
private static final Map<Integer, MessageDescriptor>
ID_TO_DESCRIPTORS =
new HashMap<Integer,MessageDescriptor>();
private static final Map<Class<?>, List<MessageDescriptor>>
CLASS_TO_DESCRIPTORS =
new HashMap<Class<?>,List<MessageDescriptor>>();
static {
InputStream is = MessageDescriptor.class
.getResourceAsStream(REGISTRY_FILE);
BufferedReader reader =
new BufferedReader(new InputStreamReader(is));
String line;
try {
while (null != (line = reader.readLine())) {
String descClassName = line.trim();
Class<?> descClass;
try {
descClass = Class.forName(descClassName);
List<MessageDescriptor> mdList = new LinkedList<MessageDescriptor>();
CLASS_TO_DESCRIPTORS.put(descClass, mdList);
REGISTERED_MESSAGE_CLASSES.add(descClass);
Field[] fa = descClass.getFields();
if (fa != null) {
for (Field f : fa) {
Class<?> c = f.getType();
if (MessageDescriptor.class.isAssignableFrom(c)) {
MessageDescriptor md = (MessageDescriptor)f.get(null);
mdList.add(md);
int id = md.getId();
if (id != MessageDescriptor.NULL_ID) {
ID_TO_DESCRIPTORS.put(id, md);
}
}
}
}
} catch (ClassNotFoundException e) {
System.err.println("Message class " + descClassName +
" not found.");
} catch (IllegalAccessException e) {
System.err.println("Error accessing class " +
descClassName + ": " + e.getMessage());
}
}
} catch (IOException e) {
System.err.println("Unable to register message files: " +
e.getMessage());
}
}
/**
* Returns a message descriptor given its unique OpenDS system-wide ID.
*
* @param id integer value of the message to retreive
* @return MessageDescriptor having the ID of <code>id</code>
*/
public static MessageDescriptor getMessageDescriptor(int id) {
return ID_TO_DESCRIPTORS.get(id);
}
/**
* Given a registered class containing message descriptors, returns a
* list of all message descriptors defined by that class.
*
* @param mdClass registered class containing message descriptors
* @return unmodifiable list of message descriptors declared in
* <code>mdClass</code>
*/
public static List<MessageDescriptor> getMessageDescriptorsForClass(
Class<?> mdClass)
{
return Collections.unmodifiableList(CLASS_TO_DESCRIPTORS.get(mdClass));
}
/**
* Returns a set of classes registered as having message descriptor
* declarations.
*
* @return list of classes
*/
public static Set<Class<?>> getRegisteredClasses() {
return Collections.unmodifiableSet(REGISTERED_MESSAGE_CLASSES);
}
}