package diskCacheV111.vehicles ; import java.io.Serializable; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.NoSuchElementException; import java.util.StringTokenizer; import java.util.TreeSet; import dmg.util.Formats; public class PoolClassAttraction implements Serializable { private final String _organization ; private final String _storageClass ; private boolean _isTemplate; private Map<String, String> _map; private int _writePreference = -1 ; private int _readPreference = -1 ; private final String _poolName ; private String _id; public static final PoolClassComparator comparatorForWrite = new PoolClassComparator(true) ; public static final PoolClassComparator comparatorForRead = new PoolClassComparator(false) ; private static final long serialVersionUID = 5471965365309761831L; public static class PoolClassComparator implements Comparator<PoolClassAttraction> { private boolean _forWrite = true ; private PoolClassComparator( boolean forWrite ){ _forWrite = forWrite ; } @Override public int compare( PoolClassAttraction pca , PoolClassAttraction pcb ){ int intA, intB; if( _forWrite ){ intA = pca.getWritePreference() ; intB = pcb.getWritePreference() ; }else{ intA = pca.getReadPreference() ; intB = pcb.getReadPreference() ; } return intA == intB ? pca._id.compareTo( pcb._id ) : intA < intB ? 1 : -1 ; } } public PoolClassAttraction( String poolName , String organization , String storageClass ){ _poolName = poolName ; _organization = organization.toLowerCase() ; _storageClass = storageClass ; if( _storageClass.startsWith("*") ) { createTemplate(); } makeId() ; } public boolean isTemplate(){ return _isTemplate ; } public Iterator<Map.Entry<String,String>> getSelection(){ if( ( ! _isTemplate ) || ( _map == null ) ) { return (new ArrayList<Map.Entry<String,String>>()).iterator(); } return _map.entrySet().iterator() ; } private void createTemplate(){ if( _storageClass.length() == 1 ){ _isTemplate = true ; return ; } _isTemplate = true ; StringTokenizer st = new StringTokenizer(_storageClass.substring(1),"*") ; _map = new HashMap<>() ; while( st.hasMoreTokens() ){ String selection = st.nextToken() ; StringTokenizer st2 = new StringTokenizer( selection , "=" ) ; try{ _map.put( st2.nextToken() , st2.nextToken() ) ; }catch(NoSuchElementException nsee){} } if(_map.isEmpty()) { _map = null; } } public String getOrganization(){ return _organization ; } public String getStorageClass(){ return _storageClass ; } public int getWritePreference(){ return _writePreference ;} public int getReadPreference(){ return _readPreference ; } public String getPool(){ return _poolName ; } public static Comparator<PoolClassAttraction> getComparator(boolean forWrite){ return forWrite ? PoolClassAttraction.comparatorForWrite : PoolClassAttraction.comparatorForRead ; } public void setPreferences( int readPreference , int writePreference ){ _writePreference = writePreference ; _readPreference = readPreference ; } private void makeId(){ _id = _poolName + ':' + _storageClass + '@' + _organization ; } public void setWritePreference( int writePreference ){ _writePreference = writePreference ; } public void setReadPreference( int readPreference ){ _readPreference = readPreference ; } public boolean equals( Object obj ){ if( ! ( obj instanceof PoolClassAttraction ) ) { return false; } PoolClassAttraction o = (PoolClassAttraction)obj ; return ( o._id ).equals( _id ) ; } public int hashCode(){ return _id.hashCode() ; } public String toString(){ if( ! _isTemplate ){ return _id + "={read=" + _readPreference + ";write=" + _writePreference + '}'; }else{ StringBuilder sb = new StringBuilder() ; sb.append(_id).append(";t;") ; Iterator<Map.Entry<String,String>> i = getSelection() ; while( i.hasNext() ){ Map.Entry<String, String> entry = i.next(); sb.append(entry.getKey()).append('=') .append(entry.getValue()).append(';'); } return sb.toString() ; } } public String toNiceString(){ StringBuilder sb = new StringBuilder() ; PoolClassAttraction attr = this ; sb.append( Formats.field(attr.getPool(), 10, Formats.LEFT)). append( Formats.field(attr.getOrganization(),10,Formats.LEFT)). append( Formats.field(attr.getStorageClass(),30,Formats.LEFT)) ; int p = attr.getReadPreference() ; String pp = p <= 0 ? "-" : (String.valueOf(p)) ; sb.append( Formats.field(pp,8,Formats.RIGHT)) ; p = attr.getWritePreference() ; pp = p <= 0 ? "-" : (String.valueOf(p)) ; sb.append( Formats.field(pp,8,Formats.RIGHT)) ; return sb.toString(); } public static void main( String [] args ) { PoolClassAttraction pca; TreeSet<PoolClassAttraction> r_read = new TreeSet<>( PoolClassAttraction.comparatorForWrite ) ; TreeSet<PoolClassAttraction> r_write = new TreeSet<>( PoolClassAttraction.comparatorForRead ) ; pca = new PoolClassAttraction( "pool-a" , "OSM" , "MAIN:raw" ) ; pca.setPreferences( 1 , 4 ) ; r_read.add( pca ) ; r_write.add( pca ) ; pca = new PoolClassAttraction( "pool-a" , "OSM" , "MAIN:raw" ) ; pca.setPreferences( 2 , 3 ) ; r_read.add( pca ) ; r_write.add( pca ) ; pca = new PoolClassAttraction( "pool-b" , "OSM" , "MAIN:raw" ) ; pca.setPreferences( 2 , 3 ) ; r_read.add( pca ) ; r_write.add( pca ) ; Iterator<PoolClassAttraction> i; i = r_read.iterator() ; while( i.hasNext() ) { System.out.println("Read : " + i.next()); } i = r_write.iterator() ; while( i.hasNext() ) { System.out.println("Write : " + i.next()); } } }