public void reloadPolicies() throws DataAdapterException, CacheSizeExceedCapacityException, PolicySyntaxException, BuiltInFunctionNotFoundException { System.out.println("Reloading policies ..."); try { // update status status.updateProperty(KEY_RUN_STATUS, STATUS_RUN_RELOADPOLICY); cacheMgr.policyCache.writeLock(); // clear both result and policy cache cacheMgr.removeAll(); // reload all policies loadPolicies(); if (logger.isDebugEnabled()) { ByteArrayOutputStream out = new ByteArrayOutputStream(); cacheMgr.policyCache.dump(out); logger.debug( "=================Dump all Cacheables that current in Policy Cache================="); logger.debug( "\nCurrent non-indexed empty target cache size = " + cacheMgr.policyCache.emptyTargetCache.size() + ".\n" + cacheMgr.policyCache.emptyTargetCache + "\n" + out.toString()); logger.debug( "=====================================Done========================================="); } } finally { cacheMgr.policyCache.writeUnlock(); status.updateProperty(KEY_RUN_STATUS, STATUS_RUN_RUNING); } }
/** * Initialize the PDP, load policies and cache them, and other things. * * @throws CacheSizeExceedCapacityException * @throws DataAdapterException * @throws PolicySyntaxException * @throws ClassNotFoundException * @throws IOException * @throws BuiltInFunctionExistsException * @throws BuiltInFunctionNotFoundException */ protected void startPDP() throws CacheSizeExceedCapacityException, DataAdapterException, PolicySyntaxException, IOException, ClassNotFoundException, BuiltInFunctionExistsException, BuiltInFunctionNotFoundException { // load all functions funcReg = BuiltInFunctionRegistry.getInstance(); // load all policies loadPolicies(); if (logger.isDebugEnabled()) { ByteArrayOutputStream out = new ByteArrayOutputStream(); cacheMgr.policyCache.dump(out); logger.debug( "=================Dump all Cacheables that current in Policy Cache================="); logger.debug( "\nCurrent non-indexed empty target cache size = " + cacheMgr.policyCache.emptyTargetCache.size() + ".\n" + cacheMgr.policyCache.emptyTargetCache + "\n" + out.toString()); logger.debug( "=====================================Done========================================="); } // update status status.updateProperty(KEY_RUN_STATUS, STATUS_RUN_RUNING); }
/** * Load all policies from a specific path, return an Iterator of DataAdapter, caller may call * DataAdapter.getEngineElement method to get the corresponding engine element which is going to * be evaluated. * * @throws ConfigurationException */ public DataAdapter[] load() throws DataAdapterException { try { policyFilesByID.clear(); Vector<DataAdapter> adapters = new Vector<DataAdapter>(); File dir = new File(path); if (dir.isDirectory()) { File[] policyFiles = dir.listFiles( new FilenameFilter() { public boolean accept(File dir, String name) { if (pattern == null || pattern.length() == 0) { return true; } else { return name.matches(pattern); } } }); System.out.println("Loading policies from '" + dir.toString() + "' ..."); System.out.println("nbre de fichier =" + policyFiles.length); PDP currentPDP = DataStoreHelper.getPDP(this); // Retrieve the schema file from given path or classpath, and verify if it exists. String defaultSchema = null; try { defaultSchema = verifySchemaFile(getPolicyDefaultSchema()); } catch (ConfigurationException ce) { System.err.println("Erreur1 sur schéma xacml " + ce.toString()); throw new DataAdapterException(ce.toString(), ce); } catch (XMLGeneralException xe) { System.err.println("Erreur1 sur schéma xacml " + xe.toString()); throw new DataAdapterException(xe.toString(), xe); } InputStream in = null; int actualPolicyNum = 0; boolean warn = false; boolean error = false; System.gc(); long memBegin = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); long begin = System.currentTimeMillis(); System.out.println("boucle des fichiers schema=" + defaultSchema); for (int i = 0; i < policyFiles.length; i++) { try { in = new FileInputStream(policyFiles[i]); Element root = parse(in, defaultSchema); // check if there are duplicated policy IDs in different files URI policyId = getPolicyOrPolicySetId(root); if (policyFilesByID.get(policyId) != null) { throw new DataAdapterException( "The policy loaded from '" + policyFiles[i] + "' with ID<" + policyId + "> already exists."); } // This is used to build up a URI->Policy File index. The index will be used in // load(URI[]) // method. policyFilesByID.put(policyId, policyFiles[i]); DataAdapter da = createPolicyDataAdapterFromXMLElement(root); // We may use configuration of PDP in engine element. ((AbstractPolicy) da.getEngineElement()).setOwnerPDP(currentPDP); adapters.add(da); // 10 policies one dot, 1000 policies one line actualPolicyNum++; if (actualPolicyNum % 10 == 0) { System.out.print("."); } if (actualPolicyNum % 1000 == 0 && i < policyFiles.length - 1) { System.out.println(); } // Check if loaded policy is correct if (logger.isDebugEnabled()) { try { // Create a new dataAdapter, do not use the loaded one, since it holds the original // XML element. We should use the one data adapter generated. XACMLElement engineElem = da.getEngineElement(); Constructor<?> cons = da.getClass().getConstructor(XACMLElement.class); DataAdapter daGenFromEngineElem = (DataAdapter) cons.newInstance(engineElem); logger.debug( "Dump policy loaded from '" + policyFiles[i] + "': " + getNodeXMLText((Element) daGenFromEngineElem.getDataStoreObject())); } catch (Exception debugEx) { logger.debug("Dump policy failed due to: ", debugEx); } } } catch (Exception e) { if (e instanceof XMLGeneralException || e instanceof PolicySyntaxException) { logger.warn( "Could not load file '" + policyFiles[i] + "' since it should not be a valid policy file.", e); warn = true; } else if (e instanceof DataAdapterException) { throw e; } else { logger.error("Error occurs when parsing policy file : " + policyFiles[i], e); error = true; } } finally { try { in.close(); } catch (Exception ex) { } } } // Print some hints if (actualPolicyNum > 0) { long end = System.currentTimeMillis(); System.gc(); long memEnd = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); System.out.println( "\n" + actualPolicyNum + " policies loaded. " + "Time elapsed " + (end - begin) / 1000 + " second. " + "Memory used " + (memEnd - memBegin) / 1024 / 1024 + " MB."); if (error || warn) { System.out.println( "There are " + (error ? "errors" : "warnings") + " occur while loading policies, please check log file for details."); } } } return adapters.toArray(new DataAdapter[0]); } catch (DataAdapterException daEx) { throw daEx; } catch (Exception ex) { throw new DataAdapterException("Failed to get default policy schema from configuration.", ex); } }