☕ Cross-File Communication in TuskLang for Java Applications

Java Documentation

Cross-File Communication in TuskLang for Java Applications

This guide covers comprehensive cross-file communication strategies for TuskLang in Java applications, including file imports, references, modular configuration, and advanced communication patterns.

Table of Contents

- Overview - File Import System - Cross-File References - Modular Configuration - Environment-Specific Files - Dynamic File Loading - File Validation - Performance Optimization - Security Considerations - Best Practices - Troubleshooting

Overview

Cross-file communication in TuskLang enables modular, maintainable, and scalable configuration management. This guide covers how to effectively use multiple configuration files in Java applications.

Cross-File Communication Benefits

// Benefits of cross-file communication
public enum CrossFileBenefit {
    MODULARITY,         // Separate concerns into different files
    REUSABILITY,        // Share configuration across applications
    MAINTAINABILITY,    // Easier to maintain and update
    SCALABILITY,        // Scale configuration as application grows
    ENVIRONMENT_ISOLATION, // Separate environment-specific configs
    TEAM_COLLABORATION  // Multiple teams can work on different configs
}

File Import System

Use TuskLang's powerful import system to include and reference other configuration files.

Basic File Import

import com.tusklang.config.TuskLangConfig;
import com.tusklang.imports.FileImporter;

public class BasicFileImportExample { public void importConfiguration() { // Main configuration file String mainConfig = """ # Import other configuration files @import("database.tsk") @import("security.tsk") @import("logging.tsk") [app] name = MyApplication version = 1.0.0 """; // Create file importer FileImporter importer = new FileImporter(); importer.setBasePath("/config"); // Parse with imports TuskLangConfig config = importer.parseWithImports(mainConfig); // Access imported configuration String dbHost = config.getString("database.host"); String jwtSecret = config.getString("security.jwt.secret"); String logLevel = config.getString("logging.level"); System.out.println("Database host: " + dbHost); System.out.println("JWT secret: " + jwtSecret); System.out.println("Log level: " + logLevel); } }

Advanced Import Options

public class AdvancedImportExample {
    
    public void advancedImportConfiguration() {
        // Advanced import configuration
        String config = """
            # Import with options
            @import("database.tsk", {
                "priority": "high",
                "required": true,
                "cache": true
            })
            
            # Conditional import
            @import.if("monitoring.tsk", "ENABLE_MONITORING")
            
            # Environment-specific import
            @import.env("production.tsk", "production")
            
            # Import with namespace
            @import.as("external-api.tsk", "api")
            
            [app]
            name = MyApplication
            """;
        
        // Configure importer with advanced options
        FileImporter importer = new FileImporter();
        importer.setBasePath("/config");
        importer.setCacheEnabled(true);
        importer.setValidationEnabled(true);
        
        // Parse with advanced imports
        TuskLangConfig result = importer.parseWithImports(config);
        
        // Access namespaced configuration
        String apiUrl = result.getString("api.base_url");
        String apiKey = result.getString("api.key");
        
        System.out.println("API URL: " + apiUrl);
        System.out.println("API Key: " + apiKey);
    }
}

Import Resolution

public class ImportResolutionExample {
    
    public void resolveImports() {
        // Import resolution configuration
        ImportResolver resolver = new ImportResolver();
        
        // Set search paths
        resolver.addSearchPath("/config");
        resolver.addSearchPath("/config/environments");
        resolver.addSearchPath("/config/modules");
        
        // Set file extensions
        resolver.addFileExtension(".tsk");
        resolver.addFileExtension(".conf");
        
        // Configure resolution strategy
        resolver.setResolutionStrategy(ResolutionStrategy.FIRST_MATCH);
        resolver.setCaseSensitive(false);
        
        // Resolve imports
        String config = """
            @import("database")
            @import("security")
            """;
        
        List<ResolvedImport> resolvedImports = resolver.resolveImports(config);
        
        for (ResolvedImport import_ : resolvedImports) {
            System.out.println("Resolved: " + import_.getOriginalPath() + " -> " + import_.getResolvedPath());
        }
    }
}

Cross-File References

Reference values and sections from other configuration files.

Basic Cross-File References

public class CrossFileReferenceExample {
    
    public void basicCrossFileReferences() {
        // Database configuration file (database.tsk)
        String databaseConfig = """
            [database]
            host = localhost
            port = 5432
            name = myapp
            username = user
            password = password
            """;
        
        // Application configuration file (app.tsk)
        String appConfig = """
            @import("database.tsk")
            
            [app]
            name = MyApplication
            database_url = postgresql://${database.host}:${database.port}/${database.name}
            """;
        
        // Parse with cross-file references
        FileImporter importer = new FileImporter();
        TuskLangConfig config = importer.parseWithImports(appConfig);
        
        // Access cross-file reference
        String databaseUrl = config.getString("app.database_url");
        System.out.println("Database URL: " + databaseUrl);
        // Output: postgresql://localhost:5432/myapp
    }
}

Advanced Cross-File References

public class AdvancedCrossFileReferenceExample {
    
    public void advancedCrossFileReferences() {
        // Security configuration (security.tsk)
        String securityConfig = """
            [security]
            jwt_secret = @env.secure(JWT_SECRET)
            encryption_key = @env.secure(ENCRYPTION_KEY)
            session_timeout = 3600
            """;
        
        // API configuration (api.tsk)
        String apiConfig = """
            @import("security.tsk")
            
            [api]
            base_url = https://api.example.com
            timeout = 5000
            retries = 3
            auth_header = Bearer ${security.jwt_secret}
            """;
        
        // Main application configuration (app.tsk)
        String mainConfig = """
            @import("api.tsk")
            @import("database.tsk")
            
            [app]
            name = MyApplication
            api_config = ${api}
            security_config = ${security}
            """;
        
        // Parse with advanced references
        FileImporter importer = new FileImporter();
        TuskLangConfig config = importer.parseWithImports(mainConfig);
        
        // Access nested cross-file references
        String authHeader = config.getString("app.api_config.auth_header");
        String jwtSecret = config.getString("app.security_config.jwt_secret");
        
        System.out.println("Auth header: " + authHeader);
        System.out.println("JWT secret: " + jwtSecret);
    }
}

Reference Resolution

public class ReferenceResolutionExample {
    
    public void resolveReferences() {
        // Reference resolver
        ReferenceResolver resolver = new ReferenceResolver();
        
        // Configure resolution options
        resolver.setAllowCircularReferences(false);
        resolver.setMaxReferenceDepth(10);
        resolver.setDefaultValueProvider(new DefaultValueProvider());
        
        // Resolve references
        String config = """
            @import("base.tsk")
            @import("override.tsk")
            
            [app]
            name = ${base.app_name}
            version = ${override.app_version}
            """;
        
        ResolutionResult result = resolver.resolveReferences(config);
        
        if (result.isSuccessful()) {
            System.out.println("References resolved successfully");
            System.out.println("Resolved config: " + result.getResolvedConfig());
        } else {
            System.out.println("Reference resolution failed: " + result.getError());
        }
    }
}

Modular Configuration

Organize configuration into modular, reusable components.

Configuration Modules

public class ConfigurationModulesExample {
    
    public void useConfigurationModules() {
        // Database module (modules/database.tsk)
        String databaseModule = """
            [database]
            host = localhost
            port = 5432
            name = myapp
            username = user
            password = password
            
            [database.pool]
            min_size = 5
            max_size = 20
            timeout = 30000
            """;
        
        // Security module (modules/security.tsk)
        String securityModule = """
            [security]
            jwt_secret = @env.secure(JWT_SECRET)
            encryption_key = @env.secure(ENCRYPTION_KEY)
            
            [security.auth]
            session_timeout = 3600
            refresh_token_expiry = 604800
            """;
        
        // Monitoring module (modules/monitoring.tsk)
        String monitoringModule = """
            [monitoring]
            enabled = true
            metrics_endpoint = /metrics
            health_check_interval = 30
            
            [monitoring.logging]
            level = INFO
            format = JSON
            """;
        
        // Main application (app.tsk)
        String mainApp = """
            @import("modules/database.tsk")
            @import("modules/security.tsk")
            @import("modules/monitoring.tsk")
            
            [app]
            name = MyApplication
            version = 1.0.0
            """;
        
        // Load modular configuration
        ModularConfigLoader loader = new ModularConfigLoader();
        loader.setModulesPath("/config/modules");
        
        TuskLangConfig config = loader.loadModularConfig(mainApp);
        
        // Access module configurations
        String dbHost = config.getString("database.host");
        String jwtSecret = config.getString("security.jwt_secret");
        boolean monitoringEnabled = config.getBoolean("monitoring.enabled");
        
        System.out.println("Database host: " + dbHost);
        System.out.println("JWT secret: " + jwtSecret);
        System.out.println("Monitoring enabled: " + monitoringEnabled);
    }
}

Module Management

public class ModuleManagementExample {
    
    public void manageModules() {
        ModuleManager manager = new ModuleManager();
        
        // Register modules
        manager.registerModule("database", "/config/modules/database.tsk");
        manager.registerModule("security", "/config/modules/security.tsk");
        manager.registerModule("monitoring", "/config/modules/monitoring.tsk");
        
        // Set module dependencies
        manager.addDependency("security", "database");
        manager.addDependency("monitoring", "security");
        
        // Load modules with dependency resolution
        List<Module> modules = manager.loadModules(Arrays.asList("database", "security", "monitoring"));
        
        for (Module module : modules) {
            System.out.println("Loaded module: " + module.getName());
            System.out.println("Dependencies: " + module.getDependencies());
        }
    }
}

Environment-Specific Files

Manage different configurations for different environments.

Environment-Specific Configuration

public class EnvironmentSpecificExample {
    
    public void loadEnvironmentSpecificConfig() {
        // Base configuration (base.tsk)
        String baseConfig = """
            [app]
            name = MyApplication
            version = 1.0.0
            
            [database]
            host = localhost
            port = 5432
            name = myapp
            """;
        
        // Development configuration (dev.tsk)
        String devConfig = """
            @import("base.tsk")
            
            [app]
            environment = development
            debug = true
            
            [database]
            host = localhost
            name = myapp_dev
            """;
        
        // Production configuration (prod.tsk)
        String prodConfig = """
            @import("base.tsk")
            
            [app]
            environment = production
            debug = false
            
            [database]
            host = prod-db.example.com
            name = myapp_prod
            username = ${DB_USERNAME}
            password = ${DB_PASSWORD}
            """;
        
        // Environment-aware loader
        EnvironmentAwareLoader loader = new EnvironmentAwareLoader();
        loader.setEnvironment("production");
        loader.setBasePath("/config/environments");
        
        TuskLangConfig config = loader.loadEnvironmentConfig();
        
        System.out.println("Environment: " + config.getString("app.environment"));
        System.out.println("Database host: " + config.getString("database.host"));
        System.out.println("Debug mode: " + config.getBoolean("app.debug"));
    }
}

Environment Detection

public class EnvironmentDetectionExample {
    
    public void detectEnvironment() {
        EnvironmentDetector detector = new EnvironmentDetector();
        
        // Configure detection sources
        detector.addDetectionSource(DetectionSource.ENVIRONMENT_VARIABLE, "NODE_ENV");
        detector.addDetectionSource(DetectionSource.SYSTEM_PROPERTY, "spring.profiles.active");
        detector.addDetectionSource(DetectionSource.FILE, "/etc/environment");
        
        // Detect environment
        String environment = detector.detectEnvironment();
        System.out.println("Detected environment: " + environment);
        
        // Load appropriate configuration
        EnvironmentAwareLoader loader = new EnvironmentAwareLoader();
        loader.setEnvironment(environment);
        
        TuskLangConfig config = loader.loadEnvironmentConfig();
        System.out.println("Loaded configuration for: " + environment);
    }
}

Dynamic File Loading

Load configuration files dynamically based on runtime conditions.

Dynamic Loading

public class DynamicLoadingExample {
    
    public void loadConfigurationDynamically() {
        DynamicConfigLoader loader = new DynamicConfigLoader();
        
        // Configure dynamic loading
        loader.setReloadEnabled(true);
        loader.setReloadInterval(30); // 30 seconds
        loader.setFileWatcherEnabled(true);
        
        // Add dynamic import conditions
        loader.addConditionalImport("monitoring.tsk", () -> {
            return System.getProperty("ENABLE_MONITORING", "false").equals("true");
        });
        
        loader.addConditionalImport("debug.tsk", () -> {
            return System.getProperty("DEBUG_MODE", "false").equals("true");
        });
        
        // Load configuration
        TuskLangConfig config = loader.loadDynamicConfig();
        
        // Register change listener
        loader.addChangeListener((changedFiles) -> {
            System.out.println("Configuration files changed: " + changedFiles);
            reloadConfiguration();
        });
        
        // Start dynamic loading
        loader.start();
    }
    
    private void reloadConfiguration() {
        System.out.println("Reloading configuration...");
        // Reload configuration logic
    }
}

Conditional Loading

public class ConditionalLoadingExample {
    
    public void conditionalLoading() {
        ConditionalLoader loader = new ConditionalLoader();
        
        // Add loading conditions
        loader.addCondition("feature-flags.tsk", new FeatureFlagCondition("ENABLE_FEATURE_FLAGS"));
        loader.addCondition("experimental.tsk", new ExperimentalFeatureCondition());
        loader.addCondition("beta.tsk", new BetaFeatureCondition());
        
        // Load configuration with conditions
        TuskLangConfig config = loader.loadConditionalConfig();
        
        // Check which files were loaded
        List<String> loadedFiles = loader.getLoadedFiles();
        System.out.println("Loaded files: " + loadedFiles);
    }
}

class FeatureFlagCondition implements LoadingCondition { private final String flagName; public FeatureFlagCondition(String flagName) { this.flagName = flagName; } @Override public boolean shouldLoad() { return System.getProperty(flagName, "false").equals("true"); } }

File Validation

Validate cross-file configuration for consistency and correctness.

Cross-File Validation

public class CrossFileValidationExample {
    
    public void validateCrossFileConfiguration() {
        CrossFileValidator validator = new CrossFileValidator();
        
        // Add validation rules
        validator.addRule(new ReferenceValidationRule());
        validator.addRule(new CircularReferenceRule());
        validator.addRule(new RequiredFileRule(Arrays.asList("database.tsk", "security.tsk")));
        validator.addRule(new EnvironmentConsistencyRule());
        
        // Validate configuration
        ValidationResult result = validator.validate("/config");
        
        if (result.isValid()) {
            System.out.println("Cross-file validation passed");
        } else {
            System.out.println("Cross-file validation failed:");
            for (ValidationError error : result.getErrors()) {
                System.out.println("- " + error.getMessage());
                System.out.println("  File: " + error.getFile());
                System.out.println("  Line: " + error.getLine());
            }
        }
    }
}

Dependency Validation

public class DependencyValidationExample {
    
    public void validateDependencies() {
        DependencyValidator validator = new DependencyValidator();
        
        // Configure validation
        validator.setCheckCircularDependencies(true);
        validator.setCheckMissingDependencies(true);
        validator.setCheckVersionCompatibility(true);
        
        // Validate dependencies
        DependencyValidationResult result = validator.validate("/config");
        
        if (result.hasCircularDependencies()) {
            System.out.println("Circular dependencies detected:");
            for (CircularDependency dep : result.getCircularDependencies()) {
                System.out.println("- " + dep.getFiles());
            }
        }
        
        if (result.hasMissingDependencies()) {
            System.out.println("Missing dependencies:");
            for (MissingDependency dep : result.getMissingDependencies()) {
                System.out.println("- " + dep.getFile() + " requires " + dep.getDependency());
            }
        }
    }
}

Performance Optimization

Optimize cross-file communication for better performance.

Caching Strategies

public class CachingStrategyExample {
    
    public void implementCaching() {
        ConfigCache cache = new ConfigCache();
        
        // Configure cache
        cache.setMaxSize(100);
        cache.setExpirationTime(300); // 5 minutes
        cache.setEvictionPolicy(EvictionPolicy.LRU);
        
        // Cache-aware loader
        CachedConfigLoader loader = new CachedConfigLoader();
        loader.setCache(cache);
        loader.setCacheEnabled(true);
        
        // Load configuration with caching
        TuskLangConfig config = loader.loadCachedConfig("/config/app.tsk");
        
        // Check cache statistics
        CacheStatistics stats = cache.getStatistics();
        System.out.println("Cache hits: " + stats.getHits());
        System.out.println("Cache misses: " + stats.getMisses());
        System.out.println("Cache size: " + stats.getSize());
    }
}

Lazy Loading

public class LazyLoadingExample {
    
    public void implementLazyLoading() {
        LazyConfigLoader loader = new LazyConfigLoader();
        
        // Configure lazy loading
        loader.setLazyLoadingEnabled(true);
        loader.setPreloadCriticalFiles(true);
        loader.setBackgroundLoadingEnabled(true);
        
        // Load configuration lazily
        TuskLangConfig config = loader.loadLazyConfig("/config");
        
        // Access configuration (loaded on demand)
        String dbHost = config.getString("database.host"); // Triggers lazy loading
        
        // Preload specific files
        loader.preloadFiles(Arrays.asList("security.tsk", "monitoring.tsk"));
    }
}

Security Considerations

Implement security measures for cross-file communication.

File Access Control

public class FileAccessControlExample {
    
    public void implementAccessControl() {
        FileAccessController controller = new FileAccessController();
        
        // Configure access control
        controller.setRestrictedPaths(Arrays.asList("/config/secrets", "/config/production"));
        controller.setAllowedExtensions(Arrays.asList(".tsk", ".conf"));
        controller.setRequireAuthentication(true);
        
        // Add security rules
        controller.addRule(new FilePermissionRule());
        controller.addRule(new ContentValidationRule());
        controller.addRule(new EncryptionRule());
        
        // Secure loader
        SecureConfigLoader loader = new SecureConfigLoader();
        loader.setAccessController(controller);
        
        // Load configuration securely
        try {
            TuskLangConfig config = loader.loadSecureConfig("/config");
            System.out.println("Configuration loaded securely");
        } catch (SecurityException e) {
            System.err.println("Access denied: " + e.getMessage());
        }
    }
}

Content Validation

public class ContentValidationExample {
    
    public void validateContent() {
        ContentValidator validator = new ContentValidator();
        
        // Add validation rules
        validator.addRule(new SensitiveDataRule());
        validator.addRule(new MaliciousContentRule());
        validator.addRule(new FormatValidationRule());
        
        // Validate file content
        ValidationResult result = validator.validateFile("/config/app.tsk");
        
        if (result.isValid()) {
            System.out.println("Content validation passed");
        } else {
            System.out.println("Content validation failed:");
            for (ValidationError error : result.getErrors()) {
                System.out.println("- " + error.getMessage());
            }
        }
    }
}

Best Practices

Follow these best practices for effective cross-file communication.

File Organization

public class FileOrganizationExample {
    
    public void organizeFiles() {
        ConfigFileOrganizer organizer = new ConfigFileOrganizer();
        
        // Define organization structure
        organizer.setStructure(new FileStructure()
            .addDirectory("base", "Base configuration files")
            .addDirectory("environments", "Environment-specific files")
            .addDirectory("modules", "Reusable modules")
            .addDirectory("secrets", "Secret configuration files")
            .addDirectory("templates", "Configuration templates"));
        
        // Organize files
        organizer.organize("/config");
        
        // Validate organization
        OrganizationValidationResult result = organizer.validateOrganization();
        
        if (result.isValid()) {
            System.out.println("File organization is valid");
        } else {
            System.out.println("Organization issues found:");
            for (OrganizationIssue issue : result.getIssues()) {
                System.out.println("- " + issue.getDescription());
            }
        }
    }
}

Naming Conventions

public class NamingConventionsExample {
    
    public void applyNamingConventions() {
        NamingConventionEnforcer enforcer = new NamingConventionEnforcer();
        
        // Define naming conventions
        enforcer.setFileNamingPattern("^[a-z][a-z0-9_-]*\\.tsk$");
        enforcer.setSectionNamingPattern("^[a-z][a-z0-9_-]*$");
        enforcer.setKeyNamingPattern("^[a-z][a-z0-9_-]*$");
        
        // Enforce conventions
        List<NamingViolation> violations = enforcer.enforceConventions("/config");
        
        if (violations.isEmpty()) {
            System.out.println("All files follow naming conventions");
        } else {
            System.out.println("Naming convention violations:");
            for (NamingViolation violation : violations) {
                System.out.println("- " + violation.getFile() + ": " + violation.getDescription());
            }
        }
    }
}

Troubleshooting

Common issues and solutions for cross-file communication.

Import Issues

public class ImportTroubleshootingExample {
    
    public void troubleshootImports() {
        ImportTroubleshooter troubleshooter = new ImportTroubleshooter();
        
        // Check import issues
        List<ImportIssue> issues = troubleshooter.checkImports("/config");
        
        for (ImportIssue issue : issues) {
            System.out.println("Import issue: " + issue.getType());
            System.out.println("File: " + issue.getFile());
            System.out.println("Description: " + issue.getDescription());
            System.out.println("Solution: " + issue.getSolution());
        }
        
        // Fix common issues
        troubleshooter.fixCommonIssues("/config");
    }
}

Reference Issues

public class ReferenceTroubleshootingExample {
    
    public void troubleshootReferences() {
        ReferenceTroubleshooter troubleshooter = new ReferenceTroubleshooter();
        
        // Check reference issues
        List<ReferenceIssue> issues = troubleshooter.checkReferences("/config");
        
        for (ReferenceIssue issue : issues) {
            System.out.println("Reference issue: " + issue.getType());
            System.out.println("File: " + issue.getFile());
            System.out.println("Reference: " + issue.getReference());
            System.out.println("Description: " + issue.getDescription());
        }
        
        // Resolve issues
        troubleshooter.resolveIssues("/config");
    }
}

This comprehensive cross-file communication guide provides everything needed to effectively manage multiple configuration files in TuskLang Java applications, ensuring modular, maintainable, and scalable configuration management.