/*
* DefaultXMLIORegistry.java
*/
package org.freehep.xml.io;
import java.util.Hashtable;
/**
* Default XMLIORegistry.
* @see XMLIORegistry
* @author turri
* @version 1.0
*/
public class DefaultXMLIORegistry implements XMLIORegistry {
private Hashtable factoryHash = new Hashtable();
private Hashtable proxyHash = new Hashtable();
private Hashtable classIds = new Hashtable();
private Hashtable idClasses = new Hashtable();
/**
* Register an XMLIOFactory or an XMLIOProxy.
* param xmlioFactory the XMLIOFactory being registered
* param factoryId the identification String.
*
*/
public void register( Object obj ) {
if ( !(obj instanceof XMLIOFactory) && !(obj instanceof XMLIOProxy) ) throw new IllegalArgumentException("Cannot register object "+obj+"."+
"Only XMLIOFactories and XMLIOProxies can be registered!");
if ( obj instanceof XMLIOFactory ) {
XMLIOFactory xmlioFactory = (XMLIOFactory)obj;
Class[] classes = xmlioFactory.XMLIOFactoryClasses();
for ( int i = 0; i < classes.length; i++ ) {
if ( factoryHash.containsKey( classes[i] ) ) throw new IllegalArgumentException("Identifier "+classes[i]+" has already been registered!!");
factoryHash.put( classes[i], xmlioFactory );
addClassId( classes[i] );
}
}
if ( obj instanceof XMLIOProxy ) {
XMLIOProxy xmlioProxy = (XMLIOProxy)obj;
Class[] classes = xmlioProxy.XMLIOProxyClasses();
for ( int i = 0; i < classes.length; i++ ) {
if ( proxyHash.containsKey( classes[i] ) ) throw new IllegalArgumentException("Class "+classes[i]+" has already been registered!!");
proxyHash.put( classes[i], xmlioProxy );
}
}
}
private void addClassId( Class clazz ) {
String objClassString = clazz.toString();
String classId = objClassString.substring( objClassString.lastIndexOf(".")+1 );
classId = classId.replace('$','-');
if ( classIds.containsValue(classId) ) throw new RuntimeException("Already registered ClassId in the registry!!! "+classId);
classIds.put(clazz,classId);
idClasses.put(classId,clazz);
}
/**
* Get the XMLIOFactory corresponding to the identification
* string <code>factoryId<\code>
* param factoryId the identification String
* @return the XMLIOFactory corresponding to <code>factoryId<\code>
*
*/
public XMLIOFactory getXMLIOFactory(Class objClass) {
return (XMLIOFactory) factoryHash.get( objClass );
}
public XMLIOProxy getXMLIOProxy(Class objClass) {
return (XMLIOProxy) proxyHash.get( objClass );
}
public String getClassId( Class clName ) {
if ( ! classIds.containsKey(clName ) )
addClassId(clName);
return (String) classIds.get( clName );
}
public Class getIdClass(String objName) {
return (Class) idClasses.get(objName);
}
}