• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

jreleaser / jreleaser / #521

29 Jul 2025 12:08PM UTC coverage: 45.469% (-0.05%) from 45.518%
#521

push

github

web-flow
feat(extensions): Support JBang as extension loader and launcher

Closed #1952

1 of 49 new or added lines in 6 files covered. (2.04%)

9 existing lines in 2 files now uncovered.

24041 of 52873 relevant lines covered (45.47%)

0.45 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/core/jreleaser-model-impl/src/main/java/org/jreleaser/model/internal/extensions/Extension.java
1
/*
2
 * SPDX-License-Identifier: Apache-2.0
3
 *
4
 * Copyright 2020-2025 The JReleaser authors.
5
 *
6
 * Licensed under the Apache License, Version 2.0 (the "License");
7
 * you may not use this file except in compliance with the License.
8
 * You may obtain a copy of the License at
9
 *
10
 *     https://www.apache.org/licenses/LICENSE-2.0
11
 *
12
 * Unless required by applicable law or agreed to in writing, software
13
 * distributed under the License is distributed on an "AS IS" BASIS,
14
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
 * See the License for the specific language governing permissions and
16
 * limitations under the License.
17
 */
18
package org.jreleaser.model.internal.extensions;
19

20
import com.fasterxml.jackson.annotation.JsonIgnore;
21
import org.jreleaser.model.internal.common.AbstractModelObject;
22
import org.jreleaser.model.internal.common.Domain;
23
import org.jreleaser.model.internal.common.EnabledAware;
24

25
import java.util.ArrayList;
26
import java.util.Collections;
27
import java.util.LinkedHashMap;
28
import java.util.List;
29
import java.util.Map;
30

31
import static java.util.Collections.unmodifiableMap;
32
import static java.util.stream.Collectors.toList;
33

34
/**
35
 * @author Andres Almiray
36
 * @since 1.3.0
37
 */
38
public final class Extension extends AbstractModelObject<Extension> implements Domain, EnabledAware {
×
39
    private static final long serialVersionUID = 8235578876272898843L; //TODO: regenerate
40

41
    private final List<Provider> providers = new ArrayList<>();
×
42
    private Boolean enabled;
43
    private String name;
44
    private String gav;
45
    private String directory;
46
    private String jbang;
47

48
    @JsonIgnore
×
49
    private final org.jreleaser.model.api.extensions.Extension immutable = new org.jreleaser.model.api.extensions.Extension() {
×
50
        private static final long serialVersionUID = -8554317090414988357L; //TODO: regenerate
51

52
        private List<? extends org.jreleaser.model.api.extensions.Extension.Provider> providers;
53

54
        @Override
55
        public String getName() {
56
            return name;
×
57
        }
58

59
        @Override
60
        public String getGav() {
61
            return gav;
×
62
        }
63

64
        @Override
65
        public String getDirectory() {
66
            return directory;
×
67
        }
68

69
        @Override
70
        public String getJbang() {
NEW
71
            return jbang;
×
72
        }
73

74
        @Override
75
        public List<? extends org.jreleaser.model.api.extensions.Extension.Provider> getProviders() {
76
            if (null == providers) {
×
77
                providers = Extension.this.providers.stream()
×
78
                    .map(Extension.Provider::asImmutable)
×
79
                    .collect(toList());
×
80
            }
81
            return providers;
×
82
        }
83

84
        @Override
85
        public Map<String, Object> asMap(boolean full) {
86
            return unmodifiableMap(Extension.this.asMap(full));
×
87
        }
88

89
        @Override
90
        public boolean isEnabled() {
91
            return Extension.this.isEnabled();
×
92
        }
93
    };
94

95
    public org.jreleaser.model.api.extensions.Extension asImmutable() {
96
        return immutable;
×
97
    }
98

99
    @Override
100
    public void merge(Extension source) {
101
        this.enabled = merge(this.enabled, source.enabled);
×
102
        this.name = merge(this.name, source.name);
×
103
        this.gav = merge(this.gav, source.gav);
×
104
        this.directory = merge(this.directory, source.directory);
×
NEW
105
        this.jbang = merge(this.jbang, source.jbang);
×
106
        setProviders(merge(this.providers, source.providers));
×
107
    }
×
108

109
    @Override
110
    public boolean isEnabled() {
111
        return null != enabled && enabled;
×
112
    }
113

114
    @Override
115
    public void setEnabled(Boolean enabled) {
116
        this.enabled = enabled;
×
117
    }
×
118

119
    @Override
120
    public boolean isEnabledSet() {
121
        return null != enabled;
×
122
    }
123

124
    public String getName() {
125
        return name;
×
126
    }
127

128
    public void setName(String name) {
129
        this.name = name;
×
130
    }
×
131

132
    public String getGav() {
133
        return gav;
×
134
    }
135

136
    public void setGav(String gav) {
137
        this.gav = gav;
×
138
    }
×
139

140
    public String getJbang() {
NEW
141
        return jbang;
×
142
    }
143

144
    public void setJbang(String jbang) {
NEW
145
        this.jbang = jbang;
×
NEW
146
    }
×
147

148
    public String getDirectory() {
149
        return directory;
×
150
    }
151

152
    public void setDirectory(String directory) {
153
        this.directory = directory;
×
154
    }
×
155

156
    public List<Provider> getProviders() {
157
        return providers;
×
158
    }
159

160
    public void setProviders(List<Provider> providers) {
161
        this.providers.clear();
×
162
        this.providers.addAll(providers);
×
163
    }
×
164

165
    public void addProvider(Provider provider) {
166
        if (null != provider) {
×
167
            this.providers.add(provider);
×
168
        }
169
    }
×
170

171
    @Override
172
    public Map<String, Object> asMap(boolean full) {
173
        if (!full && !isEnabled()) return Collections.emptyMap();
×
174

175
        Map<String, Object> props = new LinkedHashMap<>();
×
176
        props.put("enabled", isEnabled());
×
177
        props.put("gav", gav);
×
178
        props.put("directory", directory);
×
NEW
179
        props.put("jbang", jbang);
×
180
        Map<String, Map<String, Object>> m = new LinkedHashMap<>();
×
181
        for (int i = 0; i < providers.size(); i++) {
×
182
            m.put("provider " + i, providers.get(i).asMap(full));
×
183
        }
NEW
184
        props.put("providers", m);  
×
185

186
        Map<String, Object> map = new LinkedHashMap<>();
×
187
        map.put(name, props);
×
188
        return map;
×
189
    }
190

191

192
    public static final class Provider extends AbstractModelObject<Provider> implements Domain {
×
193
        private static final long serialVersionUID = -6536770909683740039L;
194

195
        private final Map<String, Object> properties = new LinkedHashMap<>();
×
196
        private String type;
197

198
        @JsonIgnore
×
199
        private final org.jreleaser.model.api.extensions.Extension.Provider immutable = new org.jreleaser.model.api.extensions.Extension.Provider() {
×
200
            private static final long serialVersionUID = 6167354406466230040L;
201

202
            @Override
203
            public String getType() {
204
                return type;
×
205
            }
206

207
            @Override
208
            public Map<String, Object> getProperties() {
209
                return unmodifiableMap(properties);
×
210
            }
211

212
            @Override
213
            public Map<String, Object> asMap(boolean full) {
214
                return unmodifiableMap(Provider.this.asMap(full));
×
215
            }
216
        };
217

218
        public org.jreleaser.model.api.extensions.Extension.Provider asImmutable() {
219
            return immutable;
×
220
        }
221

222
        @Override
223
        public void merge(Provider source) {
224
            this.type = merge(this.type, source.type);
×
225
            setProperties(merge(this.properties, source.properties));
×
226
        }
×
227

228
        public String getType() {
229
            return type;
×
230
        }
231

232
        public void setType(String type) {
233
            this.type = type;
×
234
        }
×
235

236
        public Map<String, Object> getProperties() {
237
            return properties;
×
238
        }
239

240
        public void setProperties(Map<String, Object> properties) {
241
            this.properties.clear();
×
242
            this.properties.putAll(properties);
×
243
        }
×
244

245
        @Override
246
        public Map<String, Object> asMap(boolean full) {
247
            Map<String, Object> map = new LinkedHashMap<>();
×
248
            map.put("type", type);
×
249
            map.put("properties", getProperties());
×
250
            return map;
×
251
        }
252
    }
253
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc