Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package io.dropwizard.bundles.webjars;
  
 import java.net.URL;
Locates an loads a particular WebJar asset from the classpath.
 
 class AssetLoader extends CacheLoader<AssetIdAsset> {
   public static final Asset NOT_FOUND = new Asset(nullnull);
 
   // For determining content type and content encoding
   private static final MimeTypes MIME_TYPES = new MimeTypes();
   private static final MediaType DEFAULT_MEDIA_TYPE = .;
   private static final Charset DEFAULT_CHARSET = .;
 
   private final LoadingCache<StringStringversionCache;
 
   AssetLoader(CacheLoader<StringStringversionLoader) {
      = CacheBuilder.newBuilder()
         .maximumSize(10)
         .build(versionLoader);
   }
 
   @Override
   public Asset load(AssetId idthrows Exception {
     String version = .getUnchecked(id.library);
     if (..equals(version)) {
       return ;
     }
 
     // Sometimes the WebJar has multiple releases which gets represented by a -# suffix to the
     // version number inside of pom.properties.  When this happens, the files inside of the jar
     // don't include the WebJar release number as part of the file path.  For example, the angularjs
     // 1.1.1 WebJar has a version inside of pom.properties of 1.1.1-1.  But the path to angular.js
     // inside of the jar is META-INF/resources/webjars/angularjs/1.1.1/angular.js.
     //
     // Alternatively sometimes the developer of the library includes a -suffix in the true library
     // version.  In these cases the WebJar pom.properties will include that suffix in the version
     // number, and the file paths inside of the jar will also include the suffix.  For example, the
     // backbone-marionette 1.0.0-beta6 WebJar has a version inside of pom.properties of 1.0.0-beta6.
     // The path to backbone.marionette.js is also
     // META-INF/resources/webjars/backbone-marionette/1.0.0-beta6/backbone.marionette.js.
     //
     // So based on the data inside of pom.properties it's going to be impossible to determine
     // whether a -suffix should be stripped off or not.  A reasonable heuristic however is going to
     // be to just keep trying over and over starting with the most specific version number, then
     // stripping a suffix off at a time until there are no more suffixes and the right version
     // number is determined.
     do {
       final String pathPattern = "META-INF/resources/webjars/%s/%s/%s";
       final String path = String.format(pathPatternid.libraryversionid.resource);
 
       try {
         URL resource = Resources.getResource(path);
 
         // Determine the media type of this resource
         MediaType mediaType = getMediaType(path);
 
         // We know that this version was valid.  Update the version cache to make sure that we
         // remember it for next time around.
         .put(id.libraryversion);
 
         return new Asset(ByteStreams.toByteArray(resource.openStream()), mediaType);
       } catch (IllegalArgumentException e) {
         // ignored
       }
 
       // Trim a suffix off of the version number
       int hyphen = version.lastIndexOf('-');
       if (hyphen == -1) {
         return ;
       }
 
       version = version.substring(0, hyphen);
     }
     while (true);
   }
 
   private MediaType getMediaType(String path) {
     String mimeType = .getMimeByExtension(path);
     if (mimeType == null) {
       return ;
     }
 
     MediaType mediaType;
     try {
       mediaType = MediaType.parse(mimeType);
 
       if (mediaType.is(.)) {
         mediaType = mediaType.withCharset();
       }
     } catch (IllegalArgumentException e) {
      return ;
    }
    return mediaType;
  }
New to GrepCode? Check out our FAQ X