Nate Yolles
2015-07-28 15:46:19 UTC
Hello,
Im trying to add a link rewriter into the pipeline but Im running into some trouble. Ive done this in AEM/CQ a few times but this is the first time Im attempting it in a pure Sling application. Im using
org.apache.sling.launchpad-7-standalone.jar with Sightly. When I try to load a page I get the error Unable to get component of class interface org.apache.sling.rewriter.Generator with type htmlparser.
Any guidance would be appreciated.
Thank you!
28.07.2015 08:07:26.341 *ERROR* [0:0:0:0:0:0:0:1 [1438096046286] GET /content/blog/index.html HTTP/1.1] org.apache.sling.servlets.resolver.internal.SlingServletResolver Original error class java.io.IOException
java.io.IOException: Unable to get component of class 'interface org.apache.sling.rewriter.Generator' with type 'htmlparser'.
at org.apache.sling.rewriter.impl.PipelineImpl.getPipelineComponent(PipelineImpl.java:160)
at org.apache.sling.rewriter.impl.PipelineImpl.init(PipelineImpl.java:85)
at org.apache.sling.rewriter.impl.ProcessorManagerImpl.getProcessor(ProcessorManagerImpl.java:445)
at org.apache.sling.rewriter.impl.RewriterResponse.getProcessor(RewriterResponse.java:172)
at org.apache.sling.rewriter.impl.RewriterResponse.getWriter(RewriterResponse.java:110)
at org.apache.sling.scripting.core.impl.helper.OnDemandWriter.getWriter(OnDemandWriter.java:38)
at org.apache.sling.scripting.core.impl.helper.OnDemandWriter.write(OnDemandWriter.java:75)
at java.io.PrintWriter.write(PrintWriter.java:456)
at java.io.PrintWriter.write(PrintWriter.java:473)
at libs.publick.pages.page.SightlyJava_html.render(SightlyJava_html.java:37)
I have a configuration node under /apps/mysite/config/rewriter/linkrewriter along with /apps/mysite/config/rewriter/linkrewriter/generator-htmlparser
{
"jcr:primaryType": "sling:Folder",
"rewriter" : {
"jcr:primaryType": "sling:Folder",
"linkrewriter" : {
"jcr:primaryType" : "nt:unstructured",
"contentTypes" : [
"text/html"
],
"enabled" : true,
"generatorType" : "htmlparser",
"order" : 1,
"paths" : [
"/content"
],
"serializerType" : "htmlwriter",
"transformerTypes" : [
"linkrewriter"
],
"generator-htmlparser" : {
"jcr:primaryType" : "nt:unstructured",
"includeTags" : [
"A",
"/A"
]
}
}
}
}
Then I have the Transformer and TransformerFactory implementations:
import java.io.IOException;
import java.util.Map;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.rewriter.ProcessingComponentConfiguration;
import org.apache.sling.rewriter.ProcessingContext;
import org.apache.sling.rewriter.Transformer;
import org.apache.sling.rewriter.TransformerFactory;
import org.osgi.service.component.ComponentContext;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
@Component
@Service
@Property(name="pipeline.type", value="linkrewriter", propertyPrivate=true)
public class LinkRewriterTransformerFactory implements TransformerFactory {
public Transformer createTransformer() {
return new LinkRewriterTransformer();
}
@Activate
protected void activate(Map<String, Object> properties) {
}
@Deactivate
protected void deactivate(ComponentContext ctx) {
}
private class LinkRewriterTransformer implements Transformer {
private ContentHandler contentHandler;
public void characters(char[] ch, int start, int length) throws SAXException {
contentHandler.characters(ch, start, length);
}
public void dispose() {
}
public void endDocument() throws SAXException {
contentHandler.endDocument();
}
public void endElement(String uri, String localName, String qName) throws SAXException {
contentHandler.endElement(uri, localName, qName);
}
public void endPrefixMapping(String prefix) throws SAXException {
contentHandler.endPrefixMapping(prefix);
}
public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
contentHandler.ignorableWhitespace(ch, start, length);
}
public void init(ProcessingContext context, ProcessingComponentConfiguration config) throws IOException {
}
public void processingInstruction(String target, String data) throws SAXException {
contentHandler.processingInstruction(target, data);
}
public void setContentHandler(ContentHandler handler) {
this.contentHandler = handler;
}
public void setDocumentLocator(Locator locator) {
contentHandler.setDocumentLocator(locator);
}
public void skippedEntity(String name) throws SAXException {
contentHandler.skippedEntity(name);
}
public void startDocument() throws SAXException {
contentHandler.startDocument();
}
public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
contentHandler.startElement(uri, localName, qName, atts);
// final AttributesImpl attributes = new AttributesImpl(atts);
// final String href = attributes.getValue("href");
// final boolean enableRewritePath = true;
//
// if (href != null && href.startsWith("/")) {
//
// for (int i = 0; i < attributes.getLength(); i++) {
// if ("href".equalsIgnoreCase(attributes.getQName(i))) {
// attributes.setValue(i, enableRewritePath ? rewritePath(href) : href);
// }
// }
// }
//
// contentHandler.startElement(uri, localName, qName, attributes);
}
public void startPrefixMapping(String prefix, String uri) throws SAXException {
contentHandler.startPrefixMapping(prefix, uri);
}
private String rewritePath(final String href) {
return href.replace("/content", "");
}
}
}
Im trying to add a link rewriter into the pipeline but Im running into some trouble. Ive done this in AEM/CQ a few times but this is the first time Im attempting it in a pure Sling application. Im using
org.apache.sling.launchpad-7-standalone.jar with Sightly. When I try to load a page I get the error Unable to get component of class interface org.apache.sling.rewriter.Generator with type htmlparser.
Any guidance would be appreciated.
Thank you!
28.07.2015 08:07:26.341 *ERROR* [0:0:0:0:0:0:0:1 [1438096046286] GET /content/blog/index.html HTTP/1.1] org.apache.sling.servlets.resolver.internal.SlingServletResolver Original error class java.io.IOException
java.io.IOException: Unable to get component of class 'interface org.apache.sling.rewriter.Generator' with type 'htmlparser'.
at org.apache.sling.rewriter.impl.PipelineImpl.getPipelineComponent(PipelineImpl.java:160)
at org.apache.sling.rewriter.impl.PipelineImpl.init(PipelineImpl.java:85)
at org.apache.sling.rewriter.impl.ProcessorManagerImpl.getProcessor(ProcessorManagerImpl.java:445)
at org.apache.sling.rewriter.impl.RewriterResponse.getProcessor(RewriterResponse.java:172)
at org.apache.sling.rewriter.impl.RewriterResponse.getWriter(RewriterResponse.java:110)
at org.apache.sling.scripting.core.impl.helper.OnDemandWriter.getWriter(OnDemandWriter.java:38)
at org.apache.sling.scripting.core.impl.helper.OnDemandWriter.write(OnDemandWriter.java:75)
at java.io.PrintWriter.write(PrintWriter.java:456)
at java.io.PrintWriter.write(PrintWriter.java:473)
at libs.publick.pages.page.SightlyJava_html.render(SightlyJava_html.java:37)
I have a configuration node under /apps/mysite/config/rewriter/linkrewriter along with /apps/mysite/config/rewriter/linkrewriter/generator-htmlparser
{
"jcr:primaryType": "sling:Folder",
"rewriter" : {
"jcr:primaryType": "sling:Folder",
"linkrewriter" : {
"jcr:primaryType" : "nt:unstructured",
"contentTypes" : [
"text/html"
],
"enabled" : true,
"generatorType" : "htmlparser",
"order" : 1,
"paths" : [
"/content"
],
"serializerType" : "htmlwriter",
"transformerTypes" : [
"linkrewriter"
],
"generator-htmlparser" : {
"jcr:primaryType" : "nt:unstructured",
"includeTags" : [
"A",
"/A"
]
}
}
}
}
Then I have the Transformer and TransformerFactory implementations:
import java.io.IOException;
import java.util.Map;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.rewriter.ProcessingComponentConfiguration;
import org.apache.sling.rewriter.ProcessingContext;
import org.apache.sling.rewriter.Transformer;
import org.apache.sling.rewriter.TransformerFactory;
import org.osgi.service.component.ComponentContext;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
@Component
@Service
@Property(name="pipeline.type", value="linkrewriter", propertyPrivate=true)
public class LinkRewriterTransformerFactory implements TransformerFactory {
public Transformer createTransformer() {
return new LinkRewriterTransformer();
}
@Activate
protected void activate(Map<String, Object> properties) {
}
@Deactivate
protected void deactivate(ComponentContext ctx) {
}
private class LinkRewriterTransformer implements Transformer {
private ContentHandler contentHandler;
public void characters(char[] ch, int start, int length) throws SAXException {
contentHandler.characters(ch, start, length);
}
public void dispose() {
}
public void endDocument() throws SAXException {
contentHandler.endDocument();
}
public void endElement(String uri, String localName, String qName) throws SAXException {
contentHandler.endElement(uri, localName, qName);
}
public void endPrefixMapping(String prefix) throws SAXException {
contentHandler.endPrefixMapping(prefix);
}
public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
contentHandler.ignorableWhitespace(ch, start, length);
}
public void init(ProcessingContext context, ProcessingComponentConfiguration config) throws IOException {
}
public void processingInstruction(String target, String data) throws SAXException {
contentHandler.processingInstruction(target, data);
}
public void setContentHandler(ContentHandler handler) {
this.contentHandler = handler;
}
public void setDocumentLocator(Locator locator) {
contentHandler.setDocumentLocator(locator);
}
public void skippedEntity(String name) throws SAXException {
contentHandler.skippedEntity(name);
}
public void startDocument() throws SAXException {
contentHandler.startDocument();
}
public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
contentHandler.startElement(uri, localName, qName, atts);
// final AttributesImpl attributes = new AttributesImpl(atts);
// final String href = attributes.getValue("href");
// final boolean enableRewritePath = true;
//
// if (href != null && href.startsWith("/")) {
//
// for (int i = 0; i < attributes.getLength(); i++) {
// if ("href".equalsIgnoreCase(attributes.getQName(i))) {
// attributes.setValue(i, enableRewritePath ? rewritePath(href) : href);
// }
// }
// }
//
// contentHandler.startElement(uri, localName, qName, attributes);
}
public void startPrefixMapping(String prefix, String uri) throws SAXException {
contentHandler.startPrefixMapping(prefix, uri);
}
private String rewritePath(final String href) {
return href.replace("/content", "");
}
}
}