Skip to main content

Overview

FreeTAKServer (FTS) uses a Model-View-Controller (MVC) pattern with a Model-Driven Architecture (MDA) approach. The architecture is built on the DigitalPy framework and follows enterprise design patterns for modularity, scalability, and maintainability.

Architectural Layers

MVC Pattern

FTS implements a clear separation of concerns:
  • Domain Model: CoT (Cursor on Target) objects generated from UML models
  • Protocol Objects: Base class FTSProtocolObject for all domain entities
  • Core Domain: Event, Point, Detail and other fundamental CoT components
  • Location: FreeTAKServer/model/ and FreeTAKServer/components/core/domain/
  • Service Controllers: Handle business logic for each service (TCP CoT, SSL CoT, REST API)
  • CoT Controllers: Process specific CoT types (presence, chat, emergency)
  • Serialization Controllers: XML/JSON serialization and deserialization
  • Location: FreeTAKServer/controllers/ and service-specific controllers
  • REST API Views: Flask-based endpoints for web interface
  • WebSocket Handlers: Real-time communication via SocketIO
  • Response Formatters: XML and JSON output formatting
  • Location: FreeTAKServer/services/rest_api_service/views/

Core Architecture Components

DigitalPy Framework Integration

FTS is built on top of DigitalPy, which provides:
# FreeTAKServer/controllers/services/FTS.py
class FTS(DigitalPy):
    def __init__(self):
        super().__init__()
        # Service initialization
        self.SSLCoTService = None
        self.CoTService = None
        self.TCPDataPackageService = None
        # ... other services
Key Features:
  • Service Management: Dynamic service registration and lifecycle management
  • Action Mapper: Routes requests to appropriate controllers
  • Object Factory: Dependency injection and object creation
  • Component System: Modular component architecture

Domain Model Architecture

CoT Node System

All CoT objects inherit from CoTNode, which provides tree-based data structure:
# FreeTAKServer/components/core/abstract_component/cot_node.py:8-15
class CoTNode(Node, FTSProtocolObject):
    def __init__(self, node_type, configuration, model, oid=None):
        # Dictionary containing CoT attributes
        self.cot_attributes = {}
        # XML representation of the CoT
        self.xml: etree.ElementTree = etree.Element(self.__class__.__name__)
        self.text = ""
        super().__init__(node_type, configuration, model, oid)
Key Characteristics:
  • Parent-child relationship management
  • XML serialization support
  • Property-based attribute access via @CoTProperty decorator
  • Support for nested CoT structures

Event Model

The Event class is the root CoT object:
# FreeTAKServer/components/core/domain/domain/_event.py:16-44
class Event(CoTNode):
    def __init__(self, configuration: Configuration, model, oid=None):
        super().__init__(self.__class__.__name__, configuration, model, oid)
        
        self.cot_attributes["version"] = None  # Schema version (e.g., 2.0)
        self.cot_attributes["uid"] = None      # Globally unique identifier
        self.cot_attributes["type"] = None     # Hierarchical event type
        self.cot_attributes["how"] = None      # Coordinate generation method
        self.cot_attributes["stale"] = None    # Expiration timestamp
        self.cot_attributes["start"] = None    # Start validity timestamp
        self.cot_attributes["time"] = None     # Event generation timestamp
Event Structure:
  • Attributes: version, uid, type, how, time, start, stale
  • Children: point (location), detail (additional data)
  • Properties: Exposed via @CoTProperty decorator with getters/setters

Request-Response Pattern

FTS uses an action-based request-response pattern: Implementation Example:
# Request creation
request = ObjectFactory.get_new_instance("request")
request.set_action("XMLToDict")
request.set_value("message", xml_string)

# Action mapping
actionmapper = ObjectFactory.get_instance("syncactionMapper")
response = ObjectFactory.get_new_instance("response")
actionmapper.process_action(request, response)

# Response retrieval
result = response.get_value("dict")

Service Architecture

Service Lifecycle

Each service extends DigitalPyService:
# FreeTAKServer/services/tcp_cot_service/tcp_cot_service_main.py:73-97
class TCPCoTServiceMain(DigitalPyService):
    def __init__(
        self,
        service_id,
        subject_address,
        subject_port,
        subject_protocol,
        integration_manager_address,
        integration_manager_port,
        integration_manager_protocol,
        formatter: Formatter,
    ):
        super().__init__(
            service_id,
            subject_address,
            subject_port,
            subject_protocol,
            integration_manager_address,
            integration_manager_port,
            integration_manager_protocol,
            formatter
        )
Service Responsibilities:
  1. Connection Management: Accept and manage client connections
  2. Message Processing: Parse, validate, and route CoT messages
  3. Event Distribution: Broadcast messages to connected clients
  4. State Management: Track active clients and sessions

Multi-Threading Architecture

FTS uses thread pools for concurrent client handling:
# Thread pool for client connections
from multiprocessing.pool import ThreadPool

# Separate threads for:
# - Accepting new connections
# - Receiving data from clients
# - Sending data to clients
# - Processing CoT messages

Data Flow

CoT Message Processing Pipeline

XML to Domain Object Conversion

# FreeTAKServer/core/parsers/XMLCoTController.py:64-75
# Serialize XML to etree
event = etree.fromstring(data.xmlString)

# Convert XML to dictionary
request.set_action("XMLToDict")
request.set_value("message", data.xmlString)
actionmapper.process_action(request, response)
data_dict = response.get_value("dict")

# Convert machine-readable type to human-readable
request.set_action("ConvertMachineReadableToHumanReadable")
request.set_value("machine_readable_type", data_dict["event"]["@type"])
actionmapper.process_action(request, response)

Persistence Layer

Database Architecture

  • ORM: SQLAlchemy for database abstraction
  • Database Controller: FreeTAKServer/core/persistence/DatabaseController.py
  • Models: SQLAlchemy models in FreeTAKServer/model/SQLAlchemy/
Persisted Data:
  • User authentication and sessions
  • CoT event history
  • Mission data and packages
  • Video stream metadata
  • Client connection information

Configuration Management

Main Configuration

# Singleton configuration object
from FreeTAKServer.core.configuration.MainConfig import MainConfig
config = MainConfig.instance()
Configuration Sources:
  • INI Files: Primary configuration via config.ini
  • Environment Variables: Override configuration values
  • Command Line Arguments: Runtime configuration
  • Component Configs: Component-specific settings

Telemetry and Monitoring

OpenTelemetry Integration

from opentelemetry.trace import Status, StatusCode
from digitalpy.core.telemetry.tracer import Tracer

# Tracing support throughout the codebase
# for performance monitoring and debugging

Logging Architecture

from FreeTAKServer.core.configuration.CreateLoggerController import CreateLoggerController
from FreeTAKServer.core.configuration.LoggingConstants import LoggingConstants

loggingConstants = LoggingConstants(log_name="ServiceName")
logger = CreateLoggerController("ServiceName", logging_constants=loggingConstants).getLogger()

Security Architecture

SSL/TLS Support

  • Certificate Generation: AtakOfTheCerts utility for certificate management
  • SSL Services: Separate SSL CoT and HTTPS TAK API services
  • Client Authentication: Certificate-based client authentication

Authentication and Authorization

  • Flask-Login: Session management for REST API
  • API Keys: Token-based authentication support
  • Certificate Auth: x.509 certificate validation

Extensibility

The architecture supports extension through:
  1. Component System: Add new components in components/extended/
  2. Service Plugins: Create new services implementing DigitalPyService
  3. CoT Handlers: Register handlers for specific CoT types
  4. Action Mappers: Add new actions to the request-response system

Design Patterns

Patterns Used

  • MVC: Model-View-Controller separation
  • Factory: Object creation via ObjectFactory
  • Singleton: Configuration and service instances
  • Strategy: Multiple serialization strategies (XML, JSON, Protobuf)
  • Observer: Event-based message distribution
  • Command: Action-based request handling
  • Repository: Database access abstraction

Performance Considerations

Optimization Strategies

  1. Connection Pooling: Reuse database connections
  2. Thread Pools: Limit thread creation overhead
  3. Caching: Type mapping and configuration caching
  4. Lazy Loading: Load domain objects on demand
  5. Asynchronous I/O: EventLet for concurrent operations

Services

Learn about FTS service architecture

Components

Explore the component system

CoT Messages

Understand CoT message format

Installation

Get started with FTS

Build docs developers (and LLMs) love