Skip to content
This repository was archived by the owner on Mar 3, 2026. It is now read-only.

Commit 12fae2a

Browse files
committed
Remove MediaTypeProvider and move code to MediaType
1 parent e9a2b89 commit 12fae2a

9 files changed

Lines changed: 81 additions & 188 deletions

File tree

jooby/src/main/java/org/jooby/Jooby.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2024,8 +2024,7 @@ private Config buildConfig(final Config source) {
20242024
moduleStack = moduleStack.withFallback(module.config());
20252025
}
20262026

2027-
// add default config + mime types
2028-
Config mime = ConfigFactory.parseResources(Jooby.class, "mime.properties");
2027+
// jooby config
20292028
Config jooby = ConfigFactory.parseResources(Jooby.class, "jooby.conf");
20302029

20312030
String mode = Arrays.asList(system, source, jooby).stream()
@@ -2053,8 +2052,8 @@ private Config buildConfig(final Config source) {
20532052
return system
20542053
.withFallback(config)
20552054
.withFallback(moduleStack)
2055+
.withFallback(MediaType.types)
20562056
.withFallback(defaultConfig(config, mode, secret))
2057-
.withFallback(mime)
20582057
.withFallback(jooby)
20592058
.resolve();
20602059
}

jooby/src/main/java/org/jooby/MediaType.java

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import static com.google.common.base.Preconditions.checkArgument;
2222
import static java.util.Objects.requireNonNull;
2323

24+
import java.io.File;
25+
import java.nio.file.Path;
2426
import java.util.ArrayList;
2527
import java.util.Collections;
2628
import java.util.LinkedHashMap;
@@ -33,6 +35,8 @@
3335

3436
import com.google.common.collect.ImmutableList;
3537
import com.google.common.collect.ImmutableMap;
38+
import com.typesafe.config.Config;
39+
import com.typesafe.config.ConfigFactory;
3640

3741
/**
3842
* An immutable implementation of HTTP media types (a.k.a mime types).
@@ -302,6 +306,10 @@ private MediaType doFirst(final List<MediaType> candidates) {
302306
.put("*", all)
303307
.build();
304308

309+
static final Config types = ConfigFactory
310+
.parseResources("mime.properties")
311+
.withFallback(ConfigFactory.parseResources(MediaType.class, "mime.properties"));
312+
305313
/**
306314
* Creates a new {@link MediaType}.
307315
*
@@ -541,4 +549,57 @@ public static Matcher matcher(final @Nonnull List<MediaType> acceptable) {
541549
return new Matcher(acceptable);
542550
}
543551

544-
}
552+
/**
553+
* Get a {@link MediaType} for a file.
554+
*
555+
* @param file A candidate file.
556+
* @return A {@link MediaType} or {@link MediaType#octetstream} for unknown file extensions.
557+
*/
558+
public static @Nonnull Optional<MediaType> byFile(@Nonnull final File file) {
559+
requireNonNull(file, "A file is required.");
560+
return byPath(file.getAbsolutePath());
561+
}
562+
563+
/**
564+
* Get a {@link MediaType} for a file path.
565+
*
566+
* @param path A candidate file path.
567+
* @return A {@link MediaType} or empty optional for unknown file extensions.
568+
*/
569+
public static Optional<MediaType> byPath(final Path path) {
570+
requireNonNull(path, "A path is required.");
571+
return byPath(path.toString());
572+
}
573+
574+
/**
575+
* Get a {@link MediaType} for a file path.
576+
*
577+
* @param path A candidate file path: like <code>myfile.js</code> or <code>/js/myfile.js</code>.
578+
* @return A {@link MediaType} or empty optional for unknown file extensions.
579+
*/
580+
public static Optional<MediaType> byPath(final String path) {
581+
requireNonNull(path, "A path is required.");
582+
int idx = path.lastIndexOf('.');
583+
if (idx != -1) {
584+
String ext = path.substring(idx + 1);
585+
return byExtension(ext);
586+
}
587+
return Optional.empty();
588+
}
589+
590+
/**
591+
* Get a {@link MediaType} for a file extension.
592+
*
593+
* @param ext A file extension, like <code>js</code> or <code>css</code>.
594+
* @return A {@link MediaType} or empty optional for unknown file extensions.
595+
*/
596+
public static @Nonnull Optional<MediaType> byExtension(final String ext) {
597+
requireNonNull(ext, "An ext is required.");
598+
String key = "mime." + ext;
599+
if (types.hasPath(key)) {
600+
return Optional.of(MediaType.valueOf(types.getString("mime." + ext)));
601+
}
602+
return Optional.empty();
603+
}
604+
605+
}

jooby/src/main/java/org/jooby/MediaTypeProvider.java

Lines changed: 0 additions & 124 deletions
This file was deleted.

jooby/src/main/java/org/jooby/internal/AssetProvider.java

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,33 +18,18 @@
1818
*/
1919
package org.jooby.internal;
2020

21-
import static java.util.Objects.requireNonNull;
22-
2321
import java.io.File;
2422
import java.net.URL;
2523

26-
import javax.inject.Inject;
27-
import javax.inject.Singleton;
28-
2924
import org.jooby.Asset;
3025
import org.jooby.Err;
3126
import org.jooby.MediaType;
32-
import org.jooby.MediaTypeProvider;
3327
import org.jooby.Status;
3428

35-
@Singleton
3629
public class AssetProvider {
3730

38-
private MediaTypeProvider mediaTypeProvider;
39-
40-
@Inject
41-
public AssetProvider(final MediaTypeProvider mediaTypeProvider) {
42-
this.mediaTypeProvider = requireNonNull(mediaTypeProvider,
43-
"A file media type provider is required.");
44-
}
45-
4631
public Asset get(final String path) throws Exception {
47-
return resolve(path, mediaTypeProvider.forPath(path));
32+
return resolve(path, MediaType.byPath(path).orElse(MediaType.octetstream));
4833
}
4934

5035
private Asset resolve(final String path, final MediaType mediaType) throws Exception {

jooby/src/main/java/org/jooby/internal/PartUpload.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
import javax.servlet.http.Part;
2727

2828
import org.jooby.MediaType;
29-
import org.jooby.Upload;
3029
import org.jooby.Mutant;
30+
import org.jooby.Upload;
3131

3232
import com.google.common.collect.ImmutableList;
3333
import com.google.inject.Injector;
@@ -44,14 +44,13 @@ class PartUpload implements Upload {
4444

4545
private Charset charset;
4646

47-
public PartUpload(final Injector injector, final Part part, final MediaType type,
48-
final Charset charset,
47+
public PartUpload(final Injector injector, final Part part, final Charset charset,
4948
final String workDir) {
5049
this.injector = injector;
5150
this.part = part;
5251
this.charset = charset;
5352
this.workDir = workDir;
54-
this.type = type;
53+
this.type = MediaType.byPath(part.getSubmittedFileName()).orElse(MediaType.octetstream);
5554
}
5655

5756
@Override

jooby/src/main/java/org/jooby/internal/RequestImpl.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
import org.jooby.Cookie;
4242
import org.jooby.Err;
4343
import org.jooby.MediaType;
44-
import org.jooby.MediaTypeProvider;
4544
import org.jooby.Mutant;
4645
import org.jooby.Request;
4746
import org.jooby.Route;
@@ -301,15 +300,13 @@ protected List<Upload> reqUploads(final String name) throws Exception {
301300
return Collections.emptyList();
302301
}
303302
Config config = getInstance(Config.class);
304-
MediaTypeProvider typeProvider = getInstance(MediaTypeProvider.class);
305-
String workDir = config.getString("java.io.tmpdir");
303+
String workDir = config.getString("application.tmpdir");
306304
return FluentIterable
307305
.from(parts)
308306
.filter(p -> p.getSubmittedFileName() != null && p.getName().equals(name))
309307
.transform(
310308
p -> {
311-
Upload upload = new PartUpload(injector, p, typeProvider.forPath(p
312-
.getSubmittedFileName()), charset, workDir);
309+
Upload upload = new PartUpload(injector, p, charset, workDir);
313310
return upload;
314311
})
315312
.toList();

jooby/src/main/java/org/jooby/internal/ResponseImpl.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import org.jooby.Body;
4040
import org.jooby.Err;
4141
import org.jooby.MediaType;
42-
import org.jooby.MediaTypeProvider;
4342
import org.jooby.Mutant;
4443
import org.jooby.Response;
4544
import org.jooby.Route;
@@ -70,8 +69,6 @@ public class ResponseImpl implements Response {
7069

7170
private MediaType type;
7271

73-
private MediaTypeProvider typeProvider;
74-
7572
private final Map<String, Object> locals;
7673

7774
private Route route;
@@ -82,13 +79,12 @@ public class ResponseImpl implements Response {
8279

8380
public ResponseImpl(final HttpServletResponse response, final Injector injector,
8481
final Route route, final Map<String, Object> locals, final BodyConverterSelector selector,
85-
final MediaTypeProvider typeProvider, final Charset charset, final Optional<String> referer) {
82+
final Charset charset, final Optional<String> referer) {
8683
this.response = requireNonNull(response, "A response is required.");
8784
this.injector = requireNonNull(injector, "An injector is required.");
8885
this.route = requireNonNull(route, "A route is required.");
8986
this.locals = requireNonNull(locals, "The locals is required.");
9087
this.selector = requireNonNull(selector, "A message converter selector is required.");
91-
this.typeProvider = requireNonNull(typeProvider, "A type's provider is required.");
9288
this.charset = requireNonNull(charset, "A charset is required.");
9389
this.referer = requireNonNull(referer, "A referer is required.");
9490

@@ -131,7 +127,7 @@ private void contentDisposition(final String filename) {
131127
}
132128
header("Content-Disposition", "attachment; filename=" + basename);
133129
header("Transfer-Encoding", "chunked");
134-
type(typeProvider.forPath(basename));
130+
type(MediaType.byPath(basename).orElse(MediaType.octetstream));
135131
}
136132

137133
@Override

jooby/src/main/java/org/jooby/internal/RouteHandler.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
import org.jooby.Body;
4646
import org.jooby.Err;
4747
import org.jooby.MediaType;
48-
import org.jooby.MediaTypeProvider;
4948
import org.jooby.Request;
5049
import org.jooby.Response;
5150
import org.jooby.Route;
@@ -79,8 +78,6 @@ public class RouteHandler {
7978

8079
private Set<Request.Module> modules;
8180

82-
private MediaTypeProvider typeProvider;
83-
8481
private Err.Handler err;
8582

8683
@Inject
@@ -98,7 +95,6 @@ public RouteHandler(final Injector injector,
9895
this.charset = requireNonNull(defaultCharset, "A defaultCharset is required.");
9996
this.locale = requireNonNull(defaultLocale, "A defaultLocale is required.");
10097
this.err = requireNonNull(err, "An err handler is required.");
101-
this.typeProvider = injector.getInstance(MediaTypeProvider.class);
10298
}
10399

104100
public void handle(final HttpServletRequest request, final HttpServletResponse response)
@@ -141,7 +137,7 @@ public void handle(final HttpServletRequest request, final HttpServletResponse r
141137
new RequestImpl(request, injector, route, selector, type, accept, charset, locale);
142138

143139
BiFunction<Injector, Route, Response> resFactory = (injector, route) ->
144-
new ResponseImpl(response, injector, route, locals, selector, typeProvider, charset,
140+
new ResponseImpl(response, injector, route, locals, selector, charset,
145141
Optional.ofNullable(request.getHeader("Referer")));
146142

147143
Injector injector = rootInjector;

0 commit comments

Comments
 (0)