class Fluent::Plugin::Base

def after_shutdown

def after_shutdown
  @_state.after_shutdown = true
  self
end

def after_shutdown?

def after_shutdown?
  @_state.after_shutdown
end

def after_start

def after_start
  @_state.after_start = true
  self
end

def after_started?

def after_started?
  @_state.after_start
end

def before_shutdown

def before_shutdown
  @_state.before_shutdown = true
  self
end

def before_shutdown?

def before_shutdown?
  @_state.before_shutdown
end

def called_in_test?

def called_in_test?
  caller_locations.each do |location|
    # Thread::Backtrace::Location#path returns base filename or absolute path.
    # #absolute_path returns absolute_path always.
    # https://bugs.ruby-lang.org/issues/12159
    if location.absolute_path =~ /\/test_[^\/]+\.rb$/ # location.path =~ /test_.+\.rb$/
      return true
    end
  end
  false
end

def close

def close
  @_state.close = true
  self
end

def closed?

def closed?
  @_state.close
end

def configure(conf)

def configure(conf)
  if conf.respond_to?(:for_this_worker?) && conf.for_this_worker?
    workers = if conf.target_worker_ids && !conf.target_worker_ids.empty?
                conf.target_worker_ids.size
              else
                1
              end
    system_config_override(workers: workers)
  end
  super
  @_state ||= State.new(false, false, false, false, false, false, false, false, false)
  @_state.configure = true
  self
end

def configured?

def configured?
  @_state.configure
end

def context_router

def context_router
  @_context_router
end

def context_router=(router)

def context_router=(router)
  @_context_router = router
end

def fluentd_worker_id

def fluentd_worker_id
  return @_fluentd_worker_id if @_fluentd_worker_id
  @_fluentd_worker_id = (ENV['SERVERENGINE_WORKER_ID'] || 0).to_i
  @_fluentd_worker_id
end

def has_router?

def has_router?
  false
end

def initialize

def initialize
  @log = nil
  super
  @_state = State.new(false, false, false, false, false, false, false, false, false)
  @_context_router = nil
  @_fluentd_worker_id = nil
  @under_plugin_development = false
end

def inspect

def inspect
  # Plugin instances are sometimes too big to dump because it may have too many thins (buffer,storage, ...)
  # Original commit comment says that:
  #   To emulate normal inspect behavior `ruby -e'o=Object.new;p o;p (o.__id__<<1).to_s(16)'`.
  #   https://github.com/ruby/ruby/blob/trunk/gc.c#L788
  "#<%s:%014x>" % [self.class.name, '0x%014x' % (__id__ << 1)]
end

def multi_workers_ready?

def multi_workers_ready?
  true
end

def plugin_root_dir

def plugin_root_dir
  nil # override this in plugin_id.rb
end

def shutdown

def shutdown
  @_state.shutdown = true
  self
end

def shutdown?

def shutdown?
  @_state.shutdown
end

def start

def start
  # By initialization order, plugin logger is created before set log_event_enabled.
  # It causes '@id' specified plugin, it uses plugin logger instead of global logger, ignores `<label @FLUENT_LOG>` setting.
  # This is adhoc approach but impact is minimal.
  if @log.is_a?(Fluent::PluginLogger) && $log.respond_to?(:log_event_enabled) # log_event_enabled check for tests
    @log.log_event_enabled = $log.log_event_enabled
  end
  @_state.start = true
  self
end

def started?

def started?
  @_state.start
end

def stop

def stop
  @_state.stop = true
  self
end

def stopped?

def stopped?
  @_state.stop
end

def string_safe_encoding(str)

def string_safe_encoding(str)
  unless str.valid_encoding?
    log.info "invalid byte sequence is replaced in `#{str}`" if self.respond_to?(:log)
    str = str.scrub('?')
  end
  yield str
end

def terminate

def terminate
  @_state.terminate = true
  self
end

def terminated?

def terminated?
  @_state.terminate
end