You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2013/05/23 03:16:38 UTC
[1/2] git commit: Add support for Less compilation
Updated Branches:
refs/heads/master d111e421b -> 74dcf0bd0
Add support for Less compilation
Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/09a94cd5
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/09a94cd5
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/09a94cd5
Branch: refs/heads/master
Commit: 09a94cd5926e061212b09f78576772dae68e1ce9
Parents: d111e42
Author: Howard M. Lewis Ship <hl...@apache.org>
Authored: Wed May 22 17:34:26 2013 -0700
Committer: Howard M. Lewis Ship <hl...@apache.org>
Committed: Wed May 22 17:34:26 2013 -0700
----------------------------------------------------------------------
54_RELEASE_NOTES.txt | 5 +-
.../wro4j/CoffeeScriptResourceCompiler.java | 71 ---------------
.../wro4j/ResourceProcessorSourceImpl.java | 7 ++-
.../internal/wro4j/ResourceTransformerFactory.java | 43 +++++++++
.../wro4j/ResourceTransformerFactoryImpl.java | 70 ++++++++++++++
.../tapestry5/wro4j/modules/WRO4JModule.java | 25 ++++--
.../src/test/groovy/t5/wro4j/pages/Index.groovy | 2 +-
.../src/test/resources/META-INF/assets/index.less | 5 +
8 files changed, 146 insertions(+), 82 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/09a94cd5/54_RELEASE_NOTES.txt
----------------------------------------------------------------------
diff --git a/54_RELEASE_NOTES.txt b/54_RELEASE_NOTES.txt
index 0ce07d9..884ed40 100644
--- a/54_RELEASE_NOTES.txt
+++ b/54_RELEASE_NOTES.txt
@@ -57,8 +57,8 @@ asset URLs are distinct.
Tapestry 5.4 now re-writes CSS files, expanding any `url()` references in them into fully qualify URLs; this
is to allow for the checksum embedded into each URL, which breaks relative references.
-Tapestry 5.4 introduces a new module, tapestry-wro4j, that provides support for compiling CoffeeScript and JavaScript,
-and for minimizing CSS and JavaScript. All processing takes place at runtime.
+Tapestry 5.4 introduces a new module, tapestry-wro4j, that provides support for compiling CoffeeScript into JavaScript,
+Less into CSS, and for minimizing CSS and JavaScript. All processing takes place at runtime.
## ControlGroup Mixin
@@ -91,6 +91,7 @@ for example).
By default, tapestry-wro4j enables:
- compilation of CoffeeScript to JavaScript (using Java's Rhino JavaScript engine)
+- compilation of Less to CSS
- minification of CSS using Andy Robert's csscompressor
- minification of JavaScript using the Google Closure compiler (in simple optimizations mode)
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/09a94cd5/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/CoffeeScriptResourceCompiler.java
----------------------------------------------------------------------
diff --git a/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/CoffeeScriptResourceCompiler.java b/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/CoffeeScriptResourceCompiler.java
deleted file mode 100644
index 432dfe5..0000000
--- a/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/CoffeeScriptResourceCompiler.java
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2013 The Apache Software Foundation
-//
-// 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 org.apache.tapestry5.internal.wro4j;
-
-import org.apache.tapestry5.ioc.Resource;
-import org.apache.tapestry5.services.assets.ResourceDependencies;
-import org.apache.tapestry5.services.assets.ResourceTransformer;
-import org.apache.tapestry5.wro4j.services.ResourceProcessor;
-import org.apache.tapestry5.wro4j.services.ResourceProcessorSource;
-import org.slf4j.Logger;
-import ro.isdc.wro.extensions.processor.js.RhinoCoffeeScriptProcessor;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Compiles CoffeeScript to JavaScript, using {@link RhinoCoffeeScriptProcessor}. Because what is most commonly written
- * are AMD Modules, which have (effectively) an implicit hygienic function wrapper, we compile as with "--bare".
- *
- * @since 5.4
- */
-public class CoffeeScriptResourceCompiler implements ResourceTransformer
-{
- private final Logger logger;
-
- private static final double NANOS_TO_MILLIS = 1.0d / 1000000.0d;
-
- private final ResourceProcessor compiler;
-
- public CoffeeScriptResourceCompiler(Logger logger, ResourceProcessorSource processorSource)
- {
- this.logger = logger;
-
- // Could set up some special kind of injection for this, but overkill for the couple of places it is used.
- compiler = processorSource.getProcessor("CoffeeScriptCompiler");
- }
-
- public String getTransformedContentType()
- {
- return "text/javascript";
- }
-
- public InputStream transform(final Resource source, ResourceDependencies dependencies) throws IOException
- {
- final long startTime = System.nanoTime();
-
- InputStream result = compiler.process(String.format("Compiling %s from CoffeeScript to JavaScript", source),
- source.toURL().toString(),
- source.openStream(), "text/javascript");
-
- final long elapsedTime = System.nanoTime() - startTime;
-
- logger.info(String.format("Compiled %s to JavaScript in %.2f ms",
- source,
- ((double) elapsedTime) * NANOS_TO_MILLIS));
-
- return result;
- }
-}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/09a94cd5/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceProcessorSourceImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceProcessorSourceImpl.java b/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceProcessorSourceImpl.java
index 266832c..cb94760 100644
--- a/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceProcessorSourceImpl.java
+++ b/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceProcessorSourceImpl.java
@@ -79,7 +79,12 @@ public class ResourceProcessorSourceImpl implements ResourceProcessorSource
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(5000);
- lazyCreator.createObject().process(resource, new InputStreamReader(input), new OutputStreamWriter(outputStream));
+ OutputStreamWriter writer = new OutputStreamWriter(outputStream);
+
+ lazyCreator.createObject().process(resource, new InputStreamReader(input), writer);
+
+ // close the writer to flush content into the outputStream
+ writer.close();
return new BytestreamCache(outputStream).openStream();
}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/09a94cd5/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceTransformerFactory.java
----------------------------------------------------------------------
diff --git a/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceTransformerFactory.java b/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceTransformerFactory.java
new file mode 100644
index 0000000..4016ebe
--- /dev/null
+++ b/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceTransformerFactory.java
@@ -0,0 +1,43 @@
+// Copyright 2013 The Apache Software Foundation
+//
+// 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 org.apache.tapestry5.internal.wro4j;
+
+import org.apache.tapestry5.services.assets.ResourceTransformer;
+
+/**
+ * Creates ResourceTransformer around a named {@link org.apache.tapestry5.wro4j.services.ResourceProcessor}.
+ *
+ * @since 5.4
+ * @see org.apache.tapestry5.services.assets.StreamableResourceSource
+ */
+public interface ResourceTransformerFactory
+{
+
+ /**
+ * Constructs a compiler around a named processor.
+ *
+ * @param contentType
+ * transformed content type, e.g., "text/javascript"
+ * @param processorName
+ * name of processor to do work
+ * @param sourceName
+ * for debugging: source name, e.g., "CoffeeScript"
+ * @param targetName
+ * for debugging: target name, e.g., "JavaScript"
+ * @return transformer
+ * @see org.apache.tapestry5.wro4j.services.ResourceProcessorSource
+ */
+ ResourceTransformer createCompiler(String contentType, String processorName, String sourceName, String targetName);
+}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/09a94cd5/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceTransformerFactoryImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceTransformerFactoryImpl.java b/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceTransformerFactoryImpl.java
new file mode 100644
index 0000000..5893bd1
--- /dev/null
+++ b/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceTransformerFactoryImpl.java
@@ -0,0 +1,70 @@
+// Copyright 2013 The Apache Software Foundation
+//
+// 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 org.apache.tapestry5.internal.wro4j;
+
+import org.apache.tapestry5.ioc.Resource;
+import org.apache.tapestry5.services.assets.ResourceDependencies;
+import org.apache.tapestry5.services.assets.ResourceTransformer;
+import org.apache.tapestry5.wro4j.services.ResourceProcessor;
+import org.apache.tapestry5.wro4j.services.ResourceProcessorSource;
+import org.slf4j.Logger;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+public class ResourceTransformerFactoryImpl implements ResourceTransformerFactory
+{
+ private static final double NANOS_TO_MILLIS = 1.0d / 1000000.0d;
+
+ private final Logger logger;
+
+ private final ResourceProcessorSource source;
+
+ public ResourceTransformerFactoryImpl(Logger logger, ResourceProcessorSource source)
+ {
+ this.logger = logger;
+ this.source = source;
+ }
+
+ public ResourceTransformer createCompiler(final String contentType, String processorName, final String sourceName, final String targetName)
+ {
+ final ResourceProcessor compiler = source.getProcessor(processorName);
+
+ return new ResourceTransformer()
+ {
+ public String getTransformedContentType()
+ {
+ return contentType;
+ }
+
+ public InputStream transform(Resource source, ResourceDependencies dependencies) throws IOException
+ {
+ final long startTime = System.nanoTime();
+
+ InputStream result = compiler.process(String.format("Compiling %s from %s to %s", source, sourceName, targetName),
+ source.toURL().toString(),
+ source.openStream(), contentType);
+
+ final long elapsedTime = System.nanoTime() - startTime;
+
+ logger.info(String.format("Compiled %s to %s in %.2f ms",
+ source, targetName,
+ ((double) elapsedTime) * NANOS_TO_MILLIS));
+
+ return result;
+ }
+ };
+ }
+}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/09a94cd5/tapestry-wro4j/src/main/java/org/apache/tapestry5/wro4j/modules/WRO4JModule.java
----------------------------------------------------------------------
diff --git a/tapestry-wro4j/src/main/java/org/apache/tapestry5/wro4j/modules/WRO4JModule.java b/tapestry-wro4j/src/main/java/org/apache/tapestry5/wro4j/modules/WRO4JModule.java
index 108858b..7874d73 100644
--- a/tapestry-wro4j/src/main/java/org/apache/tapestry5/wro4j/modules/WRO4JModule.java
+++ b/tapestry-wro4j/src/main/java/org/apache/tapestry5/wro4j/modules/WRO4JModule.java
@@ -14,10 +14,7 @@
package org.apache.tapestry5.wro4j.modules;
-import org.apache.tapestry5.internal.wro4j.CSSMinimizer;
-import org.apache.tapestry5.internal.wro4j.CoffeeScriptResourceCompiler;
-import org.apache.tapestry5.internal.wro4j.JavaScriptMinimizer;
-import org.apache.tapestry5.internal.wro4j.ResourceProcessorSourceImpl;
+import org.apache.tapestry5.internal.wro4j.*;
import org.apache.tapestry5.ioc.MappedConfiguration;
import org.apache.tapestry5.ioc.ObjectCreator;
import org.apache.tapestry5.ioc.ObjectLocator;
@@ -28,6 +25,7 @@ import org.apache.tapestry5.services.assets.ResourceMinimizer;
import org.apache.tapestry5.services.assets.ResourceTransformer;
import org.apache.tapestry5.services.assets.StreamableResourceSource;
import org.apache.tapestry5.wro4j.services.ResourceProcessorSource;
+import ro.isdc.wro.extensions.processor.css.Less4jProcessor;
import ro.isdc.wro.extensions.processor.js.GoogleClosureCompressorProcessor;
import ro.isdc.wro.extensions.processor.js.RhinoCoffeeScriptProcessor;
import ro.isdc.wro.extensions.processor.support.coffeescript.CoffeeScript;
@@ -43,6 +41,7 @@ public class WRO4JModule
public static void bind(ServiceBinder binder)
{
binder.bind(ResourceProcessorSource.class, ResourceProcessorSourceImpl.class);
+ binder.bind(ResourceTransformerFactory.class, ResourceTransformerFactoryImpl.class);
}
/**
@@ -53,6 +52,7 @@ public class WRO4JModule
* <dt>JavaScriptMinimizer</dt>
* <dd>{@link GoogleClosureCompressorProcessor} configured for simple optimizations. Advanced optimizations assume that all code is loaded
* in a single bundle, not a given for Tapestry.</dd>
+ * <dt>LessCompiler</dt> <dd>Compiles Less source files into CSS.</dd>
* </dl>
*
* @param configuration
@@ -94,13 +94,24 @@ public class WRO4JModule
return new GoogleClosureCompressorProcessor();
}
});
+
+ configuration.add("LessCompiler", new ObjectCreator()
+ {
+ public Object createObject()
+ {
+ return new Less4jProcessor();
+ }
+ });
}
@Contribute(StreamableResourceSource.class)
- public static void provideCoffeeScriptCompilation
- (MappedConfiguration<String, ResourceTransformer> configuration)
+ public static void provideCompilations
+ (MappedConfiguration<String, ResourceTransformer> configuration, ResourceTransformerFactory factory)
{
- configuration.addInstance("coffee", CoffeeScriptResourceCompiler.class);
+ configuration.add("coffee",
+ factory.createCompiler("text/javascript", "CoffeeScriptCompiler", "CoffeeScript", "JavaScript"));
+
+ configuration.add("less", factory.createCompiler("text/css", "LessCompiler", "Less", "CSS"));
}
@Contribute(ResourceMinimizer.class)
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/09a94cd5/tapestry-wro4j/src/test/groovy/t5/wro4j/pages/Index.groovy
----------------------------------------------------------------------
diff --git a/tapestry-wro4j/src/test/groovy/t5/wro4j/pages/Index.groovy b/tapestry-wro4j/src/test/groovy/t5/wro4j/pages/Index.groovy
index 690577e..78b58da 100644
--- a/tapestry-wro4j/src/test/groovy/t5/wro4j/pages/Index.groovy
+++ b/tapestry-wro4j/src/test/groovy/t5/wro4j/pages/Index.groovy
@@ -2,7 +2,7 @@ package t5.wro4j.pages
import org.apache.tapestry5.annotations.Import
-@Import(stack = "core", module = "index")
+@Import(stack = "core", module = "index", stylesheet = "index.less")
class Index {
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/09a94cd5/tapestry-wro4j/src/test/resources/META-INF/assets/index.less
----------------------------------------------------------------------
diff --git a/tapestry-wro4j/src/test/resources/META-INF/assets/index.less b/tapestry-wro4j/src/test/resources/META-INF/assets/index.less
new file mode 100644
index 0000000..738be7b
--- /dev/null
+++ b/tapestry-wro4j/src/test/resources/META-INF/assets/index.less
@@ -0,0 +1,5 @@
+container {
+ alert {
+ font-size: x-large;
+ }
+}
\ No newline at end of file
[2/2] git commit: Improve exception reporting for invalid source files
Posted by hl...@apache.org.
Improve exception reporting for invalid source files
Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/74dcf0bd
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/74dcf0bd
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/74dcf0bd
Branch: refs/heads/master
Commit: 74dcf0bd0daf18a3848c097d3e88e8c69d0aef5d
Parents: 09a94cd
Author: Howard M. Lewis Ship <hl...@apache.org>
Authored: Wed May 22 17:57:59 2013 -0700
Committer: Howard M. Lewis Ship <hl...@apache.org>
Committed: Wed May 22 17:57:59 2013 -0700
----------------------------------------------------------------------
.../wro4j/ResourceTransformerFactoryImpl.java | 35 +++++++++----
.../tapestry5/wro4j/modules/WRO4JModule.java | 41 +++++++++++++++
2 files changed, 65 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/74dcf0bd/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceTransformerFactoryImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceTransformerFactoryImpl.java b/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceTransformerFactoryImpl.java
index 5893bd1..cd5005d 100644
--- a/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceTransformerFactoryImpl.java
+++ b/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceTransformerFactoryImpl.java
@@ -14,6 +14,8 @@
package org.apache.tapestry5.internal.wro4j;
+import org.apache.tapestry5.ioc.IOOperation;
+import org.apache.tapestry5.ioc.OperationTracker;
import org.apache.tapestry5.ioc.Resource;
import org.apache.tapestry5.services.assets.ResourceDependencies;
import org.apache.tapestry5.services.assets.ResourceTransformer;
@@ -32,10 +34,13 @@ public class ResourceTransformerFactoryImpl implements ResourceTransformerFactor
private final ResourceProcessorSource source;
- public ResourceTransformerFactoryImpl(Logger logger, ResourceProcessorSource source)
+ private final OperationTracker tracker;
+
+ public ResourceTransformerFactoryImpl(Logger logger, ResourceProcessorSource source, OperationTracker tracker)
{
this.logger = logger;
this.source = source;
+ this.tracker = tracker;
}
public ResourceTransformer createCompiler(final String contentType, String processorName, final String sourceName, final String targetName)
@@ -49,21 +54,29 @@ public class ResourceTransformerFactoryImpl implements ResourceTransformerFactor
return contentType;
}
- public InputStream transform(Resource source, ResourceDependencies dependencies) throws IOException
+ public InputStream transform(final Resource source, ResourceDependencies dependencies) throws IOException
{
- final long startTime = System.nanoTime();
+ final String description = String.format("Compiling %s from %s to %s", source, sourceName, targetName);
+
+ return tracker.perform(description, new IOOperation<InputStream>()
+ {
+ public InputStream perform() throws IOException
+ {
+ final long startTime = System.nanoTime();
- InputStream result = compiler.process(String.format("Compiling %s from %s to %s", source, sourceName, targetName),
- source.toURL().toString(),
- source.openStream(), contentType);
+ InputStream result = compiler.process(description,
+ source.toURL().toString(),
+ source.openStream(), contentType);
- final long elapsedTime = System.nanoTime() - startTime;
+ final long elapsedTime = System.nanoTime() - startTime;
- logger.info(String.format("Compiled %s to %s in %.2f ms",
- source, targetName,
- ((double) elapsedTime) * NANOS_TO_MILLIS));
+ logger.info(String.format("Compiled %s to %s in %.2f ms",
+ source, targetName,
+ ((double) elapsedTime) * NANOS_TO_MILLIS));
- return result;
+ return result;
+ }
+ });
}
};
}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/74dcf0bd/tapestry-wro4j/src/main/java/org/apache/tapestry5/wro4j/modules/WRO4JModule.java
----------------------------------------------------------------------
diff --git a/tapestry-wro4j/src/main/java/org/apache/tapestry5/wro4j/modules/WRO4JModule.java b/tapestry-wro4j/src/main/java/org/apache/tapestry5/wro4j/modules/WRO4JModule.java
index 7874d73..499ae88 100644
--- a/tapestry-wro4j/src/main/java/org/apache/tapestry5/wro4j/modules/WRO4JModule.java
+++ b/tapestry-wro4j/src/main/java/org/apache/tapestry5/wro4j/modules/WRO4JModule.java
@@ -14,6 +14,8 @@
package org.apache.tapestry5.wro4j.modules;
+import com.github.sommeri.less4j.core.parser.AntlrException;
+import org.apache.tapestry5.MarkupWriter;
import org.apache.tapestry5.internal.wro4j.*;
import org.apache.tapestry5.ioc.MappedConfiguration;
import org.apache.tapestry5.ioc.ObjectCreator;
@@ -21,6 +23,9 @@ import org.apache.tapestry5.ioc.ObjectLocator;
import org.apache.tapestry5.ioc.ServiceBinder;
import org.apache.tapestry5.ioc.annotations.Contribute;
import org.apache.tapestry5.ioc.annotations.Primary;
+import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
+import org.apache.tapestry5.ioc.internal.util.InternalUtils;
+import org.apache.tapestry5.services.ObjectRenderer;
import org.apache.tapestry5.services.assets.ResourceMinimizer;
import org.apache.tapestry5.services.assets.ResourceTransformer;
import org.apache.tapestry5.services.assets.StreamableResourceSource;
@@ -31,6 +36,8 @@ import ro.isdc.wro.extensions.processor.js.RhinoCoffeeScriptProcessor;
import ro.isdc.wro.extensions.processor.support.coffeescript.CoffeeScript;
import ro.isdc.wro.model.resource.processor.impl.css.CssCompressorProcessor;
+import java.util.List;
+
/**
* Configures CoffeeScript-to-JavaScript compilation.
*
@@ -121,4 +128,38 @@ public class WRO4JModule
configuration.addInstance("text/css", CSSMinimizer.class);
configuration.addInstance("text/javascript", JavaScriptMinimizer.class);
}
+
+ @Contribute(ObjectRenderer.class)
+ @Primary
+ public static void decodeLessErrors(MappedConfiguration<Class, ObjectRenderer> configuration)
+ {
+ configuration.add(AntlrException.class, new ObjectRenderer<AntlrException>()
+ {
+ public void render(AntlrException e, MarkupWriter writer)
+ {
+ List<String> strings = CollectionFactory.newList();
+
+ if (InternalUtils.isNonBlank(e.getMessage()))
+ {
+ strings.add(e.getMessage());
+ }
+
+ // Inside WRO4J we see that the LessSource is a StringSource with no useful toString(), so
+ // it is omitted. We may need to create our own processors, stripping away a couple of layers of
+ // WRO4J to get proper exception reporting!
+
+ if (e.getLine() > 0)
+ {
+ strings.add("line " + e.getLine());
+ }
+
+ if (e.getCharacter() > 0)
+ {
+ strings.add("position " + e.getCharacter());
+ }
+
+ writer.write(InternalUtils.join(strings, " - "));
+ }
+ });
+ }
}
[2/2] git commit: Improve exception reporting for invalid source files
Posted by hl...@apache.org.
Improve exception reporting for invalid source files
Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/74dcf0bd
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/74dcf0bd
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/74dcf0bd
Branch: refs/heads/master
Commit: 74dcf0bd0daf18a3848c097d3e88e8c69d0aef5d
Parents: 09a94cd
Author: Howard M. Lewis Ship <hl...@apache.org>
Authored: Wed May 22 17:57:59 2013 -0700
Committer: Howard M. Lewis Ship <hl...@apache.org>
Committed: Wed May 22 17:57:59 2013 -0700
----------------------------------------------------------------------
.../wro4j/ResourceTransformerFactoryImpl.java | 35 +++++++++----
.../tapestry5/wro4j/modules/WRO4JModule.java | 41 +++++++++++++++
2 files changed, 65 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/74dcf0bd/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceTransformerFactoryImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceTransformerFactoryImpl.java b/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceTransformerFactoryImpl.java
index 5893bd1..cd5005d 100644
--- a/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceTransformerFactoryImpl.java
+++ b/tapestry-wro4j/src/main/java/org/apache/tapestry5/internal/wro4j/ResourceTransformerFactoryImpl.java
@@ -14,6 +14,8 @@
package org.apache.tapestry5.internal.wro4j;
+import org.apache.tapestry5.ioc.IOOperation;
+import org.apache.tapestry5.ioc.OperationTracker;
import org.apache.tapestry5.ioc.Resource;
import org.apache.tapestry5.services.assets.ResourceDependencies;
import org.apache.tapestry5.services.assets.ResourceTransformer;
@@ -32,10 +34,13 @@ public class ResourceTransformerFactoryImpl implements ResourceTransformerFactor
private final ResourceProcessorSource source;
- public ResourceTransformerFactoryImpl(Logger logger, ResourceProcessorSource source)
+ private final OperationTracker tracker;
+
+ public ResourceTransformerFactoryImpl(Logger logger, ResourceProcessorSource source, OperationTracker tracker)
{
this.logger = logger;
this.source = source;
+ this.tracker = tracker;
}
public ResourceTransformer createCompiler(final String contentType, String processorName, final String sourceName, final String targetName)
@@ -49,21 +54,29 @@ public class ResourceTransformerFactoryImpl implements ResourceTransformerFactor
return contentType;
}
- public InputStream transform(Resource source, ResourceDependencies dependencies) throws IOException
+ public InputStream transform(final Resource source, ResourceDependencies dependencies) throws IOException
{
- final long startTime = System.nanoTime();
+ final String description = String.format("Compiling %s from %s to %s", source, sourceName, targetName);
+
+ return tracker.perform(description, new IOOperation<InputStream>()
+ {
+ public InputStream perform() throws IOException
+ {
+ final long startTime = System.nanoTime();
- InputStream result = compiler.process(String.format("Compiling %s from %s to %s", source, sourceName, targetName),
- source.toURL().toString(),
- source.openStream(), contentType);
+ InputStream result = compiler.process(description,
+ source.toURL().toString(),
+ source.openStream(), contentType);
- final long elapsedTime = System.nanoTime() - startTime;
+ final long elapsedTime = System.nanoTime() - startTime;
- logger.info(String.format("Compiled %s to %s in %.2f ms",
- source, targetName,
- ((double) elapsedTime) * NANOS_TO_MILLIS));
+ logger.info(String.format("Compiled %s to %s in %.2f ms",
+ source, targetName,
+ ((double) elapsedTime) * NANOS_TO_MILLIS));
- return result;
+ return result;
+ }
+ });
}
};
}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/74dcf0bd/tapestry-wro4j/src/main/java/org/apache/tapestry5/wro4j/modules/WRO4JModule.java
----------------------------------------------------------------------
diff --git a/tapestry-wro4j/src/main/java/org/apache/tapestry5/wro4j/modules/WRO4JModule.java b/tapestry-wro4j/src/main/java/org/apache/tapestry5/wro4j/modules/WRO4JModule.java
index 7874d73..499ae88 100644
--- a/tapestry-wro4j/src/main/java/org/apache/tapestry5/wro4j/modules/WRO4JModule.java
+++ b/tapestry-wro4j/src/main/java/org/apache/tapestry5/wro4j/modules/WRO4JModule.java
@@ -14,6 +14,8 @@
package org.apache.tapestry5.wro4j.modules;
+import com.github.sommeri.less4j.core.parser.AntlrException;
+import org.apache.tapestry5.MarkupWriter;
import org.apache.tapestry5.internal.wro4j.*;
import org.apache.tapestry5.ioc.MappedConfiguration;
import org.apache.tapestry5.ioc.ObjectCreator;
@@ -21,6 +23,9 @@ import org.apache.tapestry5.ioc.ObjectLocator;
import org.apache.tapestry5.ioc.ServiceBinder;
import org.apache.tapestry5.ioc.annotations.Contribute;
import org.apache.tapestry5.ioc.annotations.Primary;
+import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
+import org.apache.tapestry5.ioc.internal.util.InternalUtils;
+import org.apache.tapestry5.services.ObjectRenderer;
import org.apache.tapestry5.services.assets.ResourceMinimizer;
import org.apache.tapestry5.services.assets.ResourceTransformer;
import org.apache.tapestry5.services.assets.StreamableResourceSource;
@@ -31,6 +36,8 @@ import ro.isdc.wro.extensions.processor.js.RhinoCoffeeScriptProcessor;
import ro.isdc.wro.extensions.processor.support.coffeescript.CoffeeScript;
import ro.isdc.wro.model.resource.processor.impl.css.CssCompressorProcessor;
+import java.util.List;
+
/**
* Configures CoffeeScript-to-JavaScript compilation.
*
@@ -121,4 +128,38 @@ public class WRO4JModule
configuration.addInstance("text/css", CSSMinimizer.class);
configuration.addInstance("text/javascript", JavaScriptMinimizer.class);
}
+
+ @Contribute(ObjectRenderer.class)
+ @Primary
+ public static void decodeLessErrors(MappedConfiguration<Class, ObjectRenderer> configuration)
+ {
+ configuration.add(AntlrException.class, new ObjectRenderer<AntlrException>()
+ {
+ public void render(AntlrException e, MarkupWriter writer)
+ {
+ List<String> strings = CollectionFactory.newList();
+
+ if (InternalUtils.isNonBlank(e.getMessage()))
+ {
+ strings.add(e.getMessage());
+ }
+
+ // Inside WRO4J we see that the LessSource is a StringSource with no useful toString(), so
+ // it is omitted. We may need to create our own processors, stripping away a couple of layers of
+ // WRO4J to get proper exception reporting!
+
+ if (e.getLine() > 0)
+ {
+ strings.add("line " + e.getLine());
+ }
+
+ if (e.getCharacter() > 0)
+ {
+ strings.add("position " + e.getCharacter());
+ }
+
+ writer.write(InternalUtils.join(strings, " - "));
+ }
+ });
+ }
}