/** * Container for routig configs * * @author ab */ package btools.router; import java.io.File; import btools.expressions.BExpressionContextGlobal; import btools.expressions.BExpressionContextNode; import btools.expressions.BExpressionContextWay; import btools.expressions.BExpressionMetaData; public final class ProfileCache { private static BExpressionContextWay expctxWay; private static BExpressionContextNode expctxNode; private static File lastLookupFile; private static File lastProfileFile; private static long lastLookupTimestamp; private static long lastProfileTimestamp; private static boolean profilesBusy; public static synchronized boolean parseProfile( RoutingContext rc ) { String profileBaseDir = System.getProperty( "profileBaseDir" ); File profileDir; File profileFile; if ( profileBaseDir == null ) { profileDir = new File( rc.localFunction ).getParentFile(); profileFile = new File( rc.localFunction ) ; } else { profileDir = new File( profileBaseDir ); profileFile = new File( profileDir, rc.localFunction + ".brf" ) ; } rc.profileTimestamp = profileFile.lastModified(); File lookupFile = new File( profileDir, "lookups.dat" ); // check for re-use if ( expctxWay != null && expctxNode != null && !profilesBusy ) { if ( profileFile.equals( lastProfileFile ) && lookupFile.equals( lastLookupFile ) ) { if ( rc.profileTimestamp == lastProfileTimestamp && lookupFile.lastModified() == lastLookupTimestamp ) { rc.expctxWay = expctxWay; rc.expctxNode = expctxNode; profilesBusy = true; rc.readGlobalConfig(expctxWay); return true; } } } BExpressionMetaData meta = new BExpressionMetaData(); BExpressionContextGlobal expctxGlobal = new BExpressionContextGlobal( meta ); rc.expctxWay = new BExpressionContextWay( rc.memoryclass * 512, meta ); rc.expctxNode = new BExpressionContextNode( rc.memoryclass * 128, meta ); meta.readMetaData( new File( profileDir, "lookups.dat" ) ); expctxGlobal.parseFile( profileFile, null ); expctxGlobal.evaluate( new int[0] ); rc.readGlobalConfig(expctxGlobal); rc.expctxWay.parseFile( profileFile, "global" ); rc.expctxNode.parseFile( profileFile, "global" ); if ( rc.processUnusedTags ) { rc.expctxWay.setAllTagsUsed(); } lastProfileTimestamp = profileFile.lastModified(); lastLookupTimestamp = lookupFile.lastModified(); lastProfileFile = profileFile; lastLookupFile = lookupFile; expctxWay = rc.expctxWay; expctxNode = rc.expctxNode; profilesBusy = true; return false; } public static synchronized void releaseProfile( RoutingContext rc ) { // only the thread that holds the cached instance can release it if ( rc.expctxWay == expctxWay && rc.expctxNode == expctxNode ) { profilesBusy = false; } rc.expctxWay = null; rc.expctxNode = null; } }