/*
* @(#)ParserImplTableBase.java 1.7 03/12/19
*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.sun.corba.se.spi.orb ;
import java.util.Map ;
import java.util.AbstractMap ;
import java.util.Set ;
import java.util.AbstractSet ;
import java.util.Iterator ;
import java.util.Properties ;
import java.lang.reflect.Field ;
import org.omg.CORBA.INTERNAL ;
// XXX This could probably be further extended by using more reflection and
// a dynamic proxy that satisfies the interfaces that are inherited by the
// more derived class. Do we want to go that far?
public abstract class ParserImplTableBase extends ParserImplBase {
private final ParserData[] entries ;
public ParserImplTableBase( ParserData[] entries )
{
this.entries = entries ;
setDefaultValues() ;
}
protected PropertyParser makeParser()
{
PropertyParser result = new PropertyParser() ;
for (int ctr=0; ctr<entries.length; ctr++ ) {
ParserData entry = entries[ctr] ;
entry.addToParser( result ) ;
}
return result ;
}
private static final class MapEntry implements Map.Entry {
private Object key ;
private Object value ;
public MapEntry( Object key )
{
this.key = key ;
}
public Object getKey()
{
return key ;
}
public Object getValue()
{
return value ;
}
public Object setValue( Object value )
{
Object result = this.value ;
this.value = value ;
return result ;
}
public boolean equals( Object obj )
{
if (!(obj instanceof MapEntry))
return false ;
MapEntry other = (MapEntry)obj ;
return (key.equals( other.key )) &&
(value.equals( other.value )) ;
}
public int hashCode()
{
return key.hashCode() ^ value.hashCode() ;
}
}
// Construct a map that maps field names to test or default values,
// then use setFields from the parent class. A map is constructed
// by implementing AbstractMap, which requires implementing the
// entrySet() method, which requires implementing a set of
// map entries, which requires implementing an iterator,
// which iterates over the ParserData, extracting the
// correct (key, value) pairs (nested typed lambda expression).
private static class FieldMap extends AbstractMap {
private final ParserData[] entries ;
private final boolean useDefault ;
public FieldMap( ParserData[] entries, boolean useDefault )
{
this.entries = entries ;
this.useDefault = useDefault ;
}
public Set entrySet()
{
return new AbstractSet()
{
public Iterator iterator()
{
return new Iterator() {
// index of next element to return
int ctr = 0 ;
public boolean hasNext()
{
return ctr < entries.length ;
}
public Object next()
{
ParserData pd = entries[ctr++] ;
Map.Entry result = new MapEntry( pd.getFieldName() ) ;
if (useDefault)
result.setValue( pd.getDefaultValue() ) ;
else
result.setValue( pd.getTestValue() ) ;
return result ;
}
public void remove()
{
throw new UnsupportedOperationException() ;
}
} ;
}
public int size()
{
return entries.length ;
}
} ;
}
} ;
protected void setDefaultValues()
{
Map map = new FieldMap( entries, true ) ;
setFields( map ) ;
}
public void setTestValues()
{
Map map = new FieldMap( entries, false ) ;
setFields( map ) ;
}
}
|