/*
* Copyright 2012 Jason Miller
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jj.resource;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Provider;
import javax.inject.Singleton;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* provides the default set of type configurations for
* {@link ResourceConfiguration#fileTypeSettings()}
*
* @author jason
*
*/
@Singleton
public class FileTypeSettingsDefaultProvider implements Provider<Map<String, ResourceSettings>> {
// this class has to be public or the config system can't find it
// and the error is WEIRD, seriously not even comprehensible, since it's just
// an immutable set of data, it's fine
private static final Map<String, ResourceSettings> settings;
static {
try (InputStream is = FileTypeSettingsDefaultProvider.class.getResourceAsStream("api/resource-configurations.json")) {
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Map<String, Object>> configuration =
objectMapper.readValue(is, new TypeReference<Map<String, Map<String, Object>>>() {});
HashMap<String, ResourceSettings> result = new HashMap<>(configuration.size() * 2);
configuration.forEach((ext, input) -> {
result.put(ext, makeSettings(input));
});
settings = Collections.unmodifiableMap(result);
} catch (Exception e) {
throw new AssertionError("trouble reading default resource configurations", e);
}
}
private static ResourceSettings makeSettings(Map<String, Object> input) {
String mimeType = (String)input.get("mimeType");
Charset charset = input.containsKey("charset") ? Charset.forName((String)input.get("charset")) : null;
boolean compressible = input.containsKey("compressible") && Boolean.TRUE.equals(input.get("compressible"));
return new ResourceSettings(mimeType, charset, compressible);
}
@Override
public Map<String, ResourceSettings> get() {
return settings;
}
}