@Override protected void sendResource(URL resourceUrl, RouteContext routeContext) throws IOException { try { // compile less to css log.trace("Send css for '{}'", resourceUrl); LessSource.URLSource source = new LessSource.URLSource(resourceUrl); String content = source.getContent(); String result = sourceMap.get(content); if (result == null) { ThreadUnsafeLessCompiler compiler = new ThreadUnsafeLessCompiler(); LessCompiler.Configuration configuration = new LessCompiler.Configuration(); configuration.setCompressing(minify); LessCompiler.CompilationResult compilationResult = compiler.compile(resourceUrl, configuration); for (LessCompiler.Problem warning : compilationResult.getWarnings()) { log.warn("Line: {}, Character: {}, Message: {} ", warning.getLine(), warning.getCharacter(), warning.getMessage()); } result = compilationResult.getCss(); if (routeContext.getApplication().getPippoSettings().isProd()) { sourceMap.put(content, result); } } // send css routeContext.getResponse().contentType("text/css"); routeContext.getResponse().ok().send(result); } catch (Exception e) { throw new PippoRuntimeException(e); } }
@Override public byte[] getBytes() throws FileNotFound, CannotReadFile { try { URLConnection connection = getInputURL().openConnection(); Reader input = new InputStreamReader(connection.getInputStream()); setLastModified(connection.getLastModified()); byte[] content = IOUtils.toByteArray(input); input.close(); return content; } catch (FileNotFoundException ex) { throw new FileNotFound(); } catch (IOException ex) { throw new CannotReadFile(); } }
@Override protected void sendResource(URL resourceUrl, RouteContext routeContext) throws IOException { try { // compile less to css log.trace("Send css for '{}'", resourceUrl); LessSource.URLSource source = new LessSource.URLSource(resourceUrl); String content = source.getContent(); String result = sourceMap.get(content); if (result == null) { ThreadUnsafeLessCompiler compiler = new ThreadUnsafeLessCompiler(); LessCompiler.Configuration configuration = new LessCompiler.Configuration(); configuration.setCompressing(minify); LessCompiler.CompilationResult compilationResult = compiler.compile(resourceUrl, configuration); for (LessCompiler.Problem warning : compilationResult.getWarnings()) { log.warn("Line: {}, Character: {}, Message: {} ", warning.getLine(), warning.getCharacter(), warning.getMessage()); } result = compilationResult.getCss(); if (routeContext.getApplication().getPippoSettings().isProd()) { sourceMap.put(content, result); } } // send css routeContext.getResponse().contentType("text/css"); routeContext.getResponse().ok().send(result); } catch (Exception e) { throw new PippoRuntimeException(e); } }
@Override public LessSource relativeSource(String filename) throws CannotReadFile, FileNotFound { if (filename.startsWith("/webjars/")) { URL webjarResource = ClassPaths.getResource("META-INF/resources" + filename); if (webjarResource == null) { throw new FileNotFound(); } return new LessSource.URLSource(webjarResource); } Path relativePath = Paths.get(filename); if (!resources.exists(relativePath)) { throw new FileNotFound(); } try { return new PathSource(resources, resources.sourceFile(relativePath)); } catch (IOException e) { throw new CannotReadFile(); } }
@Override protected void send(final Request req, final Response rsp, final Asset asset) throws Exception { LessSource.URLSource src = new LessSource.URLSource(asset.resource(), req.charset().name()); CompilationResult result = compiler.compile(src); result.getWarnings().forEach(warning -> log.warn(warning.toString())); if (req.path().endsWith(".map")) { rsp.type(MediaType.json) .send(Results.ok(result.getSourceMap())); } else { rsp.type(MediaType.css) .send(Results.ok(result.getCss())); } } }
@Override public CompilationResult compile(URL lessURL) throws Less4jException { return compile(new LessSource.URLSource(lessURL)); }
@Override public CompilationResult compile(URL lessURL) throws Less4jException { return compile(new LessSource.URLSource(lessURL)); }
@Override public LessSource relativeSource(String filename) throws FileNotFound, CannotReadFile { return new URLSource(this, filename, charsetName); }
@Override public String getContent() throws FileNotFound, CannotReadFile { try { URLConnection connection = getInputURL().openConnection(); Reader input = charsetName != null ? new InputStreamReader(connection.getInputStream(), charsetName) : new InputStreamReader(connection.getInputStream()); String content = IOUtils.toString(input).replace("\r\n", "\n"); setLastModified(connection.getLastModified()); input.close(); return content; } catch (FileNotFoundException ex) { throw new FileNotFound(); } catch (IOException ex) { throw new CannotReadFile(); } }
@Override public CompilationResult compile(URL lessURL, Configuration options) throws Less4jException { return compile(new LessSource.URLSource(lessURL), options); }
@Override public CompilationResult compile(URL lessURL, Configuration options) throws Less4jException { return compile(new LessSource.URLSource(lessURL), options); }
public URLSource(URLSource parent, String filename, String charsetName) throws FileNotFound, CannotReadFile { super(parent); try { this.inputURL = new URL(URIUtils.toParentURL(parent.inputURL), filename); } catch (MalformedURLException e) { throw new FileNotFound(); } this.charsetName = charsetName; parent.addImportedSource(this); }