# #-- # Copyright (c) 2006-2007, Nicolas Modryzk and John Mettraux, OpenWFE.org # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # . Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # . Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # . Neither the name of the "OpenWFE" nor the names of its contributors may be # used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. #++ # # $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $ # # # "made in Japan" # # Nicolas Modrzyk at openwfe.org # John Mettraux at openwfe.org # require 'fileutils' require 'openwfe/service' require 'openwfe/util/lru_cache' require 'openwfe/flowexpressionid' module OpenWFE # # Create a composite expression storage. # This will take parameters from the application context to create # the resulting composite storage class CompositeExpressionStorage include ServiceMixin attr_accessor \ :persistence, \ :cache, \ :journal def initialize (serviceName, applicationContext) service_init(serviceName, applicationContext) @cache = @application_context[:cached_expression_storage] @journal = @application_context[:journalized_expression_storage] @persistence = @application_context[:file_expression_storage] end # # call the add method for each registered storage # def []= (fei, flowExpression) @journal[fei] = flowExpression if @journal @cache[fei] = flowExpression if @cache @persistence[fei] = flowExpression end # # remove the expressionid from each registered storage # def delete (fei) @journal.delete(fei) if @journal @cache.delete(fei) if @cache @persistence.delete(fei) end # # slightly different method. Try to get the value from the cache storage if one # if not retrieve it, and then add it to the cache. def [] (fei) return @cache[fei] if @cache flow_expression = @persistence[fei] @cache[fei] = flow_expression if @cache return flow_expression end end # # implementation of a LRU caching storage. class LruCachedExpressionStorage include ServiceMixin DEFAULT_LRU_SIZE = 10 def initialize (service_name, application_context) service_init(service_name, application_context) size = if (@application_context) @application_context[:lru_storage_size] else DEFAULT_LRU_SIZE end @cache = LRUCache.new(size) end def []= (fei, flowExpression) @cache[fei]=flowExpression end # # interface method to remove an entry for the given expression_id # def delete (fei) @cache.delete(fei) end # # check if the value is in the cache def is_in_cache?(fei) @cache.include?(fei) end alias has_key? is_in_cache? # # interface method, return the value associated with the given id, # or nil if not in cache. def [] (fei) if(@cache.include?(fei)) return @cache[fei] else return nil end end end # # Memory consuming in-memory storage. # No memory limit, puts everything in a Hash # class InMemoryExpressionStorage < Hash include ServiceMixin def initialize (service_name, application_context) service_init(service_name, application_context) end alias :purge :clear def each_of_kind (kind) # TODO : implement with a filter end def to_s s = "\n\n==== #{self.class} ====" each do |k, v| s << "\n" if v.kind_of?(RawExpression) s << "*raw" else s << " " end s << v.to_s s << " key/value mismatch !" if k != v.fei end s << "\n==== . ====\n" return s end end end