or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

tessl/maven-io-cdap-cdap--cdap-features

CDAP Feature Flags - A Java library that provides feature flag management functionality for the CDAP platform, allowing features to be enabled or disabled based on version compatibility and configuration settings

Workspace
tessl
Visibility
Public
Created
Last updated
Describes
mavenpkg:maven/io.cdap.cdap/cdap-features@6.11.x

To install, run

npx @tessl/cli install tessl/maven-io-cdap-cdap--cdap-features@6.11.0

0

# CDAP Features

1

2

CDAP Features is a Java library that provides feature flag management functionality for the CDAP (Cask Data Application Platform) ecosystem. It enables runtime control of platform features based on version compatibility and administrative configuration.

3

4

## Package Information

5

6

- **Package Name**: cdap-features

7

- **Package Type**: Maven

8

- **Group ID**: io.cdap.cdap

9

- **Artifact ID**: cdap-features

10

- **Language**: Java

11

- **Installation**: Add Maven dependency:

12

```xml

13

<dependency>

14

<groupId>io.cdap.cdap</groupId>

15

<artifactId>cdap-features</artifactId>

16

<version>6.11.0</version>

17

</dependency>

18

```

19

20

## Core Imports

21

22

```java

23

import io.cdap.cdap.features.Feature;

24

import io.cdap.cdap.api.feature.FeatureFlagsProvider;

25

import io.cdap.cdap.api.PlatformInfo;

26

import javax.annotation.Nullable;

27

```

28

29

## Basic Usage

30

31

```java

32

import io.cdap.cdap.features.Feature;

33

import io.cdap.cdap.api.feature.FeatureFlagsProvider;

34

35

// Assuming you have a FeatureFlagsProvider implementation

36

FeatureFlagsProvider provider = // ... obtained from configuration

37

38

// Check if a specific feature is enabled

39

boolean isEnabled = Feature.EVENT_PUBLISH.isEnabled(provider);

40

41

if (isEnabled) {

42

// Use the feature

43

enableEventPublishing();

44

}

45

46

// Get the feature flag string identifier

47

String flagName = Feature.EVENT_PUBLISH.getFeatureFlagString();

48

// Returns: "event.publish.enabled"

49

```

50

51

## Architecture

52

53

The CDAP Features library is built around a simple but powerful design:

54

55

- **Feature Enum**: Defines all available feature flags as enumerated constants with version information

56

- **Version-based Logic**: Features are automatically enabled/disabled based on platform version compatibility

57

- **Configuration Override**: Features can be explicitly enabled/disabled through FeatureFlagsProvider configuration

58

- **Default Behavior Control**: Each feature defines its default behavior after introduction (enabled/disabled)

59

60

## Capabilities

61

62

### Feature Flag Management

63

64

The core functionality revolves around the `Feature` enum which provides version-aware feature flag management.

65

66

```java { .api }

67

public enum Feature {

68

REPLICATION_TRANSFORMATIONS("6.6.0"),

69

EVENT_PUBLISH("6.7.0", false),

70

EVENT_READER("6.10.0", false),

71

PIPELINE_COMPOSITE_TRIGGERS("6.8.0"),

72

PUSHDOWN_TRANSFORMATION_GROUPBY("6.7.0"),

73

PUSHDOWN_TRANSFORMATION_DEDUPLICATE("6.7.0"),

74

STREAMING_PIPELINE_CHECKPOINT_DELETION("6.7.1"),

75

LIFECYCLE_MANAGEMENT_EDIT("6.8.0"),

76

WRANGLER_FAIL_PIPELINE_FOR_ERROR("6.8.0"),

77

STREAMING_PIPELINE_NATIVE_STATE_TRACKING("6.8.0", false),

78

PUSHDOWN_TRANSFORMATION_WINDOWAGGREGATION("6.9.1"),

79

SOURCE_CONTROL_MANAGEMENT_GIT("6.9.0"),

80

SOURCE_CONTROL_MANAGEMENT_MULTI_APP("6.10.0"),

81

WRANGLER_PRECONDITION_SQL("6.9.1"),

82

WRANGLER_EXECUTION_SQL("6.10.0"),

83

WRANGLER_SCHEMA_MANAGEMENT("6.10.0"),

84

NAMESPACED_SERVICE_ACCOUNTS("6.10.0"),

85

WRANGLER_KRYO_SERIALIZATION("6.10.1"),

86

SOURCE_CONTROL_MANAGEMENT_GITLAB_BITBUCKET("6.10.1"),

87

DATAPLANE_AUDIT_LOGGING("6.10.1");

88

89

// Constructors

90

Feature(String versionIntroduced);

91

Feature(String versionIntroduced, boolean defaultAfterIntroduction);

92

93

// Methods

94

public boolean isEnabled(FeatureFlagsProvider featureFlagsProvider);

95

public String getFeatureFlagString();

96

}

97

```

98

99

#### Feature Constants

100

101

Each feature constant represents a specific CDAP platform capability:

102

103

- **REPLICATION_TRANSFORMATIONS**: Enables data replication transformations (introduced in 6.6.0)

104

- **EVENT_PUBLISH**: Enables event publishing functionality (introduced in 6.7.0, defaults to disabled)

105

- **EVENT_READER**: Enables event reader functionality (introduced in 6.10.0, defaults to disabled)

106

- **PIPELINE_COMPOSITE_TRIGGERS**: Enables composite triggers in pipelines (introduced in 6.8.0)

107

- **PUSHDOWN_TRANSFORMATION_GROUPBY**: Enables pushdown GroupBy transformations (introduced in 6.7.0)

108

- **PUSHDOWN_TRANSFORMATION_DEDUPLICATE**: Enables pushdown deduplication transformations (introduced in 6.7.0)

109

- **STREAMING_PIPELINE_CHECKPOINT_DELETION**: Enables checkpoint deletion in streaming pipelines (introduced in 6.7.1)

110

- **LIFECYCLE_MANAGEMENT_EDIT**: Enables lifecycle management editing (introduced in 6.8.0)

111

- **WRANGLER_FAIL_PIPELINE_FOR_ERROR**: Enables pipeline failure on Wrangler errors (introduced in 6.8.0)

112

- **STREAMING_PIPELINE_NATIVE_STATE_TRACKING**: Enables native state tracking in streaming pipelines (introduced in 6.8.0, defaults to disabled)

113

- **PUSHDOWN_TRANSFORMATION_WINDOWAGGREGATION**: Enables pushdown window aggregation transformations (introduced in 6.9.1)

114

- **SOURCE_CONTROL_MANAGEMENT_GIT**: Enables Git-based source control management (introduced in 6.9.0)

115

- **SOURCE_CONTROL_MANAGEMENT_MULTI_APP**: Enables multi-application source control management (introduced in 6.10.0)

116

- **WRANGLER_PRECONDITION_SQL**: Enables SQL preconditions in Wrangler (introduced in 6.9.1)

117

- **WRANGLER_EXECUTION_SQL**: Enables SQL execution in Wrangler (introduced in 6.10.0)

118

- **WRANGLER_SCHEMA_MANAGEMENT**: Enables schema management in Wrangler (introduced in 6.10.0)

119

- **NAMESPACED_SERVICE_ACCOUNTS**: Enables namespaced service accounts (introduced in 6.10.0)

120

- **WRANGLER_KRYO_SERIALIZATION**: Enables Kryo serialization in Wrangler (introduced in 6.10.1)

121

- **SOURCE_CONTROL_MANAGEMENT_GITLAB_BITBUCKET**: Enables GitLab and Bitbucket source control management (introduced in 6.10.1)

122

- **DATAPLANE_AUDIT_LOGGING**: Enables dataplane audit logging (introduced in 6.10.1)

123

124

#### Feature Enablement Logic

125

126

```java { .api }

127

public boolean isEnabled(FeatureFlagsProvider featureFlagsProvider)

128

```

129

130

Determines if a feature flag is enabled using the following logic:

131

1. First checks the `featureFlagsProvider` for explicit configuration

132

2. If not configured, falls back to version-based default behavior:

133

- If current platform version ≤ feature introduction version: returns `false`

134

- If current platform version > feature introduction version: returns the feature's default behavior (true for most features, false for some)

135

136

**Parameters:**

137

- `featureFlagsProvider` (FeatureFlagsProvider): Provider that contains feature flag configuration

138

139

**Returns:** `boolean` - `true` if the feature is enabled, `false` otherwise

140

141

**Exception Handling:** Handles NullPointerException internally and falls back to default version-based logic

142

143

#### Feature Flag String Identifier

144

145

```java { .api }

146

public String getFeatureFlagString()

147

```

148

149

Returns the string identifier used to configure this feature flag in the provider.

150

151

**Returns:** `String` - The feature flag identifier (feature name in lowercase with underscores replaced by dots, plus ".enabled" suffix)

152

153

**Example:** `Feature.EVENT_PUBLISH.getFeatureFlagString()` returns `"event.publish.enabled"`

154

155

## Types

156

157

### FeatureFlagsProvider Interface

158

159

```java { .api }

160

public interface FeatureFlagsProvider {

161

/**

162

* This method tells is feature flag is currently enabled. To ensure proper feature life cycle

163

* management and backwards compatibility please define features using Feature enum and use

164

* Feature#isEnabled method instead of directly calling this one.

165

*

166

* @param name the feature flag string identifier

167

* @return value of the feature flag if set

168

* @throws NullPointerException if feature flag name is not defined

169

* @throws IllegalArgumentException if the feature flag is not a valid boolean

170

*/

171

default boolean isFeatureEnabled(String name) throws NullPointerException, IllegalArgumentException;

172

}

173

```

174

175

Interface for providing feature flag configuration. The default implementation throws `UnsupportedOperationException`. Implementations should:

176

- Return `true` if the specified feature flag is enabled

177

- Return `false` if the specified feature flag is disabled

178

- Throw `NullPointerException` if the feature flag is not configured (allowing fallback to default logic)

179

- Throw `IllegalArgumentException` if the feature flag value is not a valid boolean

180

181

### VersionInfo Interface

182

183

```java { .api }

184

public interface VersionInfo extends Comparable<Object> {

185

// Marker interface for version information that is comparable

186

// All implementations must return proper version string from toString()

187

}

188

```

189

190

Marker interface for version information that is comparable to other instances or objects. Any implementation must return a properly formatted version string from its `toString()` method to enable comparison with string representations.

191

192

### PlatformInfo.Version

193

194

```java { .api }

195

public static final class PlatformInfo.Version implements VersionInfo {

196

// Constructors

197

public Version(int major, int minor, int fix, boolean snapshot, long buildTime);

198

public Version(@Nullable String version);

199

200

// Accessor methods

201

public int getMajor();

202

public int getMinor();

203

public int getFix();

204

public boolean isSnapshot();

205

public long getBuildTime();

206

207

// Object methods

208

public String toString();

209

public int compareTo(Object other);

210

public boolean equals(Object obj);

211

public int hashCode();

212

}

213

```

214

215

Version class used for comparing platform versions against feature introduction versions. This class is provided by the cdap-api dependency and implements comparison logic based on major.minor.fix version numbers.

216

217

## Usage Examples

218

219

### Checking Multiple Features

220

221

```java

222

import io.cdap.cdap.features.Feature;

223

import io.cdap.cdap.api.feature.FeatureFlagsProvider;

224

225

public class FeatureManager {

226

private final FeatureFlagsProvider provider;

227

228

public FeatureManager(FeatureFlagsProvider provider) {

229

this.provider = provider;

230

}

231

232

public boolean canUseAdvancedTransformations() {

233

return Feature.PUSHDOWN_TRANSFORMATION_GROUPBY.isEnabled(provider) &&

234

Feature.PUSHDOWN_TRANSFORMATION_DEDUPLICATE.isEnabled(provider) &&

235

Feature.PUSHDOWN_TRANSFORMATION_WINDOWAGGREGATION.isEnabled(provider);

236

}

237

238

public boolean isSourceControlEnabled() {

239

return Feature.SOURCE_CONTROL_MANAGEMENT_GIT.isEnabled(provider) ||

240

Feature.SOURCE_CONTROL_MANAGEMENT_GITLAB_BITBUCKET.isEnabled(provider);

241

}

242

}

243

```

244

245

### Feature Flag Configuration

246

247

```java

248

// Example of retrieving feature flag strings for configuration

249

import io.cdap.cdap.features.Feature;

250

251

public class ConfigurationHelper {

252

public static void printAllFeatureFlags() {

253

for (Feature feature : Feature.values()) {

254

System.out.println(feature.name() + " -> " + feature.getFeatureFlagString());

255

}

256

}

257

}

258

```

259

260

### Version-based Feature Logic

261

262

```java

263

import io.cdap.cdap.features.Feature;

264

265

public class PipelineProcessor {

266

private final FeatureFlagsProvider provider;

267

268

public void processData() {

269

// Use new checkpoint deletion if available

270

if (Feature.STREAMING_PIPELINE_CHECKPOINT_DELETION.isEnabled(provider)) {

271

useAdvancedCheckpointDeletion();

272

} else {

273

useLegacyCheckpointHandling();

274

}

275

276

// Enable native state tracking only if explicitly configured

277

// (defaults to disabled even after version 6.8.0)

278

if (Feature.STREAMING_PIPELINE_NATIVE_STATE_TRACKING.isEnabled(provider)) {

279

enableNativeStateTracking();

280

}

281

}

282

}