package diskCacheV111.util; import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; import java.net.URI; import java.net.URISyntaxException; import java.util.HashMap; import java.util.Map; public class EnstoreLocationExtractor implements HsmLocation { private final URI _uri; /* enstore://enstore/?volume=VOLUME&location=LOCATION&size=SIZE&origff=FAMILY &origname=NAME&mapfile=MAP&pnfsid=PNFSID&pnfsidmap=PNFSIDMAP&bfid=BFID&drive=DRIVE&crc=CRC */ public EnstoreLocationExtractor(URI location) { _uri = location; } public EnstoreLocationExtractor(Map<Integer, String> levels) { String storageInfo = levels.get(4); if(storageInfo == null ) { throw new IllegalArgumentException("Enstore uses level 1 and 4"); } StringBuilder sb = new StringBuilder("enstore://enstore/?"); BufferedReader br = new BufferedReader( new StringReader(storageInfo) ) ; try{ String line; for( int i = 0 ; ; i++ ){ try{ if( ( line = br.readLine() ) == null ) { break; } }catch(IOException ioe ){ break ; } switch(i){ case 0 : sb.append("volume=").append(line).append("&"); break ; case 1 : sb.append("location=").append(line).append("&"); break ; case 2 : sb.append("size=").append(line).append("&"); break ; case 3 : sb.append("origff=").append(line).append("&"); break ; case 4 : sb.append("origname=").append(line).append("&"); break ; case 5 : sb.append("mapfile=").append(line).append("&"); break ; case 6 : sb.append("pnfsid=").append(line).append("&"); break ; case 7 : sb.append("pnfsidmap=").append(line).append("&"); break ; case 8 : sb.append("bfid=").append(line).append("&"); break ; case 9 : sb.append("drive=").append(line).append("&"); break ; case 10 : sb.append("crc=").append(line); break ; } } }finally{ try{ br.close() ; }catch(Exception ie ){} } try { _uri = new URI(sb.toString()); } catch (URISyntaxException e) { //should never happen, but nevertheless throw new IllegalArgumentException("failed to generate URI from level: " + storageInfo) ; } } @Override public URI location() { return _uri; } @Override public Map<Integer, String> toLevels() { Map<Integer, String> levelData = new HashMap<>(2); Map<String, String> parsed = parseURI(_uri); levelData.put(1, parsed.get("bfid") + "\n"); String asLevel4 = parsed.get("volume") + "\n" + parsed.get("location") + "\n" + parsed.get("size") + "\n" + parsed.get("origff") + "\n" + parsed.get("origname") + "\n" + parsed.get("mapfile") + "\n" + parsed.get("pnfsid") + "\n" + parsed.get("pnfsidmap") + "\n" + parsed.get("bfid") + "\n" + parsed.get("drive") + "\n" + parsed.get("crc") + "\n"; levelData.put(4, asLevel4); return levelData; } private static Map<String, String> parseURI(URI location) throws IllegalArgumentException { Map<String,String> values = new HashMap<>(); String query = location.getQuery(); String[] storageInfo = query.split("&"); if(storageInfo.length != 11) { throw new IllegalArgumentException("Invalid URI format (11 fileds expected): " + location); } for( String s: storageInfo) { String[] ss = s.split("="); if(ss.length != 2 ) { values.put(ss[0], ""); }else{ values.put(ss[0], ss[1]); } } return values; } }