/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.jooby.assets;
import org.jooby.MediaType;
import com.google.common.base.CaseFormat;
import com.typesafe.config.Config;
/**
* <h2>asset processor</h2>
* <p>
* Checks, validate and/or modify asset contents. An {@link AssetProcessor} is usually provided as a
* separated dependency.
* </p>
*
* <h3>how to use it?</h3>
* <p>
* First thing to do is to add the dependency:
* </p>
* <pre>
* <dependency>
* <groupId>org.jooby</groupId>
* <artifactId>jooby-assets-my-processor</artifactId>
* <scope>provided</scope>
* </dependency>
* </pre>
*
* <p>
* Did you see the <strong>provided</strong> scope? We just need the processor for development,
* because assets are processed on the fly. For <code>prod</code>, assets are processed at
* built-time via Maven/Gradle plugin, at runtime we don't need this. This also, helps to keep our
* dependencies and the jar size small.
* </p>
*
* <p>
* Now we have the dependency all we have to do is to add it to our pipeline:
* </p>
*
* <pre>
* assets {
* pipeline: {
* dev: [my-processor]
* }
* }
* </pre>
*
* <h3>configuration</h3>
* <p>
* It is possible to configure or set options too:
* </p>
*
* <pre>
* assets {
* pipeline: {
* dev: [my-processor]
* dist: [my-processor]
* }
*
* my-processor {
* foo: bar
* }
* }
* </pre>
*
* <p>
* Previous example, set a <code>foo</code> property to <code>bar</code>! Options can be set
* per environment too:
* </p>
*
* <pre>
* assets {
* pipeline: {
* dev: [my-processor]
* dist: [my-processor]
* }
*
* my-processor {
* dev {
* bar: bar
* }
* dist {
* foo: bar
* }
* foo: foo
* }
* }
* </pre>
*
* <p>
* Here, in <code>dev</code> processor has two properties: <code>foo:foo</code> and
* <code>bar:bar</code>, while in <code>dist</code> the processor only has <code>foo:bar</code>
* </p>
*
* <h3>binding</h3>
* <p>
* The <code>my-processor</code> will be resolved it to: <code>org.jooby.assets.MyProcessor</code>
* class. The processor name is converted to <code>MyProcessor</code>, it converts the hyphenated
* name to upper camel and by default processors are defined in the <code>org.jooby.assets</code>
* package.
* </p>
* <p>
* A custom binding is provided via the <code>class</code> property:
* </p>
* <pre>
* assets {
* pipeline: {
* dev: [my-processor]
* dist: [my-processor]
* }
*
* my-processor {
* class: whatever.i.Want
* }
* }
* </pre>
*
* @author edgar
* @since 0.11.0
*/
public abstract class AssetProcessor extends AssetOptions {
public String name() {
return CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_HYPHEN, getClass().getSimpleName());
}
@Override
public AssetProcessor set(final String name, final Object value) {
super.set(name, value);
return this;
}
@Override
public AssetProcessor set(final Config options) {
super.set(options);
return this;
}
public abstract boolean matches(final MediaType type);
public abstract String process(String filename, String source, Config conf) throws Exception;
@Override
public String toString() {
return name();
}
}