You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2009/06/08 10:05:41 UTC
svn commit: r782553 [1/2] - in
/incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter:
./ impl/
Author: cziegeler
Date: Mon Jun 8 08:05:41 2009
New Revision: 782553
URL: http://svn.apache.org/viewvc?rev=782553&view=rev
Log:
Use real factory services instead of using the osgi component factories. This makes the whole rewriter component handling easier and more understandable.
Added:
incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/GeneratorFactory.java (with props)
incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/ProcessorFactory.java (with props)
incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/SerializerFactory.java (with props)
incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/TransformerFactory.java (contents, props changed)
- copied, changed from r782538, incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/RewriterTransformerFactory.java
incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/HtmlGeneratorFactory.java (contents, props changed)
- copied, changed from r782538, incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/HtmlGenerator.java
incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/HtmlSerializerFactory.java (contents, props changed)
- copied, changed from r782538, incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/HTMLSerializer.java
Removed:
incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/RewriterTransformerFactory.java
incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/HTMLSerializer.java
incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/HtmlGenerator.java
Modified:
incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/Generator.java
incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/FactoryCache.java
incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/PipelineImpl.java
Modified: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/Generator.java
URL: http://svn.apache.org/viewvc/incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/Generator.java?rev=782553&r1=782552&r2=782553&view=diff
==============================================================================
--- incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/Generator.java (original)
+++ incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/Generator.java Mon Jun 8 08:05:41 2009
@@ -24,6 +24,9 @@
/**
* The <code>Generator</code> interface defines the start of a rewriter pipeline.
+ * A generator is not a component managed by the container (OSGi). A
+ * {@link GeneratorFactory} is a service managed by the container which creates
+ * generator instances on demand.
*/
public interface Generator {
Added: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/GeneratorFactory.java
URL: http://svn.apache.org/viewvc/incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/GeneratorFactory.java?rev=782553&view=auto
==============================================================================
--- incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/GeneratorFactory.java (added)
+++ incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/GeneratorFactory.java Mon Jun 8 08:05:41 2009
@@ -0,0 +1,39 @@
+/*
+ * 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.apache.sling.rewriter;
+
+
+/**
+ * The <code>GeneratorFactory</code> is a service which creates
+ * {@link Generator}s on demand. The created generators are the
+ * starting point for the rewriter pipeline.
+ *
+ * The factories itself are not chained but the resulting generators
+ * are. On each pipeline call new instances are created.
+ *
+ * The factory is referenced using a service property named
+ * 'pipeline.type'. Each factory should have a unique value
+ * for this property.
+ */
+public interface GeneratorFactory {
+
+ /**
+ * Create a new generator for the pipeline.
+ * @return A new generator.
+ */
+ Generator createGenerator();
+}
Propchange: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/GeneratorFactory.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/GeneratorFactory.java
------------------------------------------------------------------------------
svn:keywords = author date id revision rev url
Propchange: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/GeneratorFactory.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/ProcessorFactory.java
URL: http://svn.apache.org/viewvc/incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/ProcessorFactory.java?rev=782553&view=auto
==============================================================================
--- incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/ProcessorFactory.java (added)
+++ incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/ProcessorFactory.java Mon Jun 8 08:05:41 2009
@@ -0,0 +1,36 @@
+/*
+ * 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.apache.sling.rewriter;
+
+
+/**
+ * The <code>ProcessorFactory</code> is a service which creates
+ * {@link Processor}s on demand. The processor is used to rewrite
+ * the generated content.
+ *
+ * The factory is referenced using a service property named
+ * 'pipeline.type'. Each factory should have a unique value
+ * for this property.
+ */
+public interface ProcessorFactory {
+
+ /**
+ * Create a new processor.
+ * @return A new processor.
+ */
+ Processor createProcessor();
+}
Propchange: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/ProcessorFactory.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/ProcessorFactory.java
------------------------------------------------------------------------------
svn:keywords = author date id revision rev url
Propchange: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/ProcessorFactory.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/SerializerFactory.java
URL: http://svn.apache.org/viewvc/incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/SerializerFactory.java?rev=782553&view=auto
==============================================================================
--- incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/SerializerFactory.java (added)
+++ incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/SerializerFactory.java Mon Jun 8 08:05:41 2009
@@ -0,0 +1,39 @@
+/*
+ * 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.apache.sling.rewriter;
+
+
+/**
+ * The <code>SerializerFactory</code> is a service which creates
+ * {@link Serializer}s on demand. The created serializers are the
+ * end point for the rewriter pipeline.
+ *
+ * The factories itself are not chained but the resulting serializers
+ * are. On each pipeline call new instances are created.
+ *
+ * The factory is referenced using a service property named
+ * 'pipeline.type'. Each factory should have a unique value
+ * for this property.
+ */
+public interface SerializerFactory {
+
+ /**
+ * Create a new serializer for the pipeline.
+ * @return A new serializer.
+ */
+ Serializer createSerializer();
+}
Propchange: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/SerializerFactory.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/SerializerFactory.java
------------------------------------------------------------------------------
svn:keywords = author date id revision rev url
Propchange: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/SerializerFactory.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Copied: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/TransformerFactory.java (from r782538, incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/RewriterTransformerFactory.java)
URL: http://svn.apache.org/viewvc/incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/TransformerFactory.java?p2=incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/TransformerFactory.java&p1=incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/RewriterTransformerFactory.java&r1=782538&r2=782553&rev=782553&view=diff
==============================================================================
--- incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/RewriterTransformerFactory.java (original)
+++ incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/TransformerFactory.java Mon Jun 8 08:05:41 2009
@@ -18,18 +18,30 @@
/**
- * The <code>RewriterTransformerFactory</code> is an optional component
- * which can be used to enhance the rewriting pipeline.
- * All available rewriting transformers with a service ranking below
- * zero are chained before the default link rewriter. All available
- * transformers with a service ranking higher or equal to zero are
- * chained after the default link rewriter. Therefore the property
- * "service.ranking" should be used for the factory.
+ * The <code>TransformerFactory</code> is a service which creates
+ * {@link Transformer}s on demand. The created transformers form
+ * the middle part of the rewriter pipeline.
*
* The factories itself are not chained but the resulting transformers
* are. On each pipeline call new instances are created.
+ *
+ * The factory is referenced using a service property named
+ * 'pipeline.type'. Each factory should have a unique value
+ * for this property.
+ *
+ * With the optional property 'pipeline.mode' set to the value
+ * 'global' the transformer is used for each and every pipeline regardless
+ * of the actual configuration for this pipeline.
+ * All available global transformers with a service ranking below
+ * zero are chained right after the generator. All available global
+ * transformers with a service ranking higher or equal to zero are
+ * chained right before the serializer. Therefore the property
+ * "service.ranking" should be used for the factory in combination
+ * with 'pipeline.mode'.
+ * To be compatible with possible future uses of the 'pipeline.mode'
+ * property, it should only be used with the value 'global'.
*/
-public interface RewriterTransformerFactory {
+public interface TransformerFactory {
/**
* Create a new transformer for the pipeline.
Propchange: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/TransformerFactory.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/TransformerFactory.java
------------------------------------------------------------------------------
svn:keywords = author date id revision rev url
Propchange: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/TransformerFactory.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/FactoryCache.java
URL: http://svn.apache.org/viewvc/incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/FactoryCache.java?rev=782553&r1=782552&r2=782553&view=diff
==============================================================================
--- incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/FactoryCache.java (original)
+++ incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/FactoryCache.java Mon Jun 8 08:05:41 2009
@@ -23,16 +23,17 @@
import java.util.Map;
import org.apache.sling.rewriter.Generator;
+import org.apache.sling.rewriter.GeneratorFactory;
import org.apache.sling.rewriter.Processor;
-import org.apache.sling.rewriter.RewriterTransformerFactory;
+import org.apache.sling.rewriter.ProcessorFactory;
import org.apache.sling.rewriter.Serializer;
+import org.apache.sling.rewriter.SerializerFactory;
import org.apache.sling.rewriter.Transformer;
+import org.apache.sling.rewriter.TransformerFactory;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
-import org.osgi.framework.Filter;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
-import org.osgi.service.component.ComponentFactory;
import org.osgi.service.component.ComponentInstance;
import org.osgi.util.tracker.ServiceTracker;
import org.slf4j.Logger;
@@ -48,31 +49,27 @@
protected static final Logger LOGGER = LoggerFactory.getLogger(FactoryCache.class);
/** The tracker for generator factories. */
- protected final HashingServiceTrackerCustomizer generatorTracker;
+ protected final HashingServiceTrackerCustomizer<GeneratorFactory> generatorTracker;
/** The tracker for serializers factories. */
- protected final HashingServiceTrackerCustomizer serializerTracker;
+ protected final HashingServiceTrackerCustomizer<SerializerFactory> serializerTracker;
/** The tracker for transformer factories. */
- protected final HashingServiceTrackerCustomizer transformerTracker;
-
- /** The tracker for rewriting transformer factories. */
- protected final RewriterTransformerFactoryServiceTracker rewritingTransformerTracker;
+ protected final TransformerFactoryServiceTracker<TransformerFactory> transformerTracker;
/** The tracker for processor factories. */
- protected final HashingServiceTrackerCustomizer processorTracker;
+ protected final HashingServiceTrackerCustomizer<ProcessorFactory> processorTracker;
public FactoryCache(final BundleContext context)
throws InvalidSyntaxException {
- this.generatorTracker = new HashingServiceTrackerCustomizer(context,
- context.createFilter("(component.factory=" + Generator.class.getName() + "/*)"));
- this.serializerTracker = new HashingServiceTrackerCustomizer(context,
- context.createFilter("(component.factory=" + Serializer.class.getName() + "/*)"));
- this.transformerTracker = new HashingServiceTrackerCustomizer(context,
- context.createFilter("(component.factory=" + Transformer.class.getName() + "/*)"));
- this.processorTracker = new HashingServiceTrackerCustomizer(context,
- context.createFilter("(component.factory=" + Processor.class.getName() + "/*)"));
- this.rewritingTransformerTracker = new RewriterTransformerFactoryServiceTracker(context);
+ this.generatorTracker = new HashingServiceTrackerCustomizer<GeneratorFactory>(context,
+ GeneratorFactory.class.getName());
+ this.serializerTracker = new HashingServiceTrackerCustomizer<SerializerFactory>(context,
+ SerializerFactory.class.getName());
+ this.transformerTracker = new TransformerFactoryServiceTracker<TransformerFactory>(context,
+ TransformerFactory.class.getName());
+ this.processorTracker = new HashingServiceTrackerCustomizer<ProcessorFactory>(context,
+ ProcessorFactory.class.getName());
}
/**
@@ -82,7 +79,6 @@
this.generatorTracker.open();
this.serializerTracker.open();
this.transformerTracker.open();
- this.rewritingTransformerTracker.open();
this.processorTracker.open();
}
@@ -93,72 +89,63 @@
this.generatorTracker.close();
this.serializerTracker.close();
this.transformerTracker.close();
- this.rewritingTransformerTracker.close();
this.processorTracker.close();
}
/**
- * Lookup a factory component.
- */
- protected <ComponentType> ComponentType getComponent(final List<ComponentInstance> instanceList,
- final Class<ComponentType> typeClass,
- final String type,
- final HashingServiceTrackerCustomizer customizer) {
- // get factory
- final ComponentFactory factory = customizer.get(type);
- if ( factory == null ) {
- LOGGER.debug("Request component factory for class '{}' and type '{}' not found.", typeClass, type);
- return null;
- }
- final ComponentInstance instance = factory.newInstance(null);
- instanceList.add(instance);
- @SuppressWarnings("unchecked")
- final ComponentType component = (ComponentType)instance.getInstance();
- if ( component == null ) {
- // this should never happen
- LOGGER.debug("Unable to get instance '{}' of type '{}' from factory.", typeClass, type);
- }
- return component;
- }
-
- /**
* Get the generator of the given type.
* @param type The generator type.
- * @param instanceList The instance is added to this list for later disposal.
* @return The generator or null if the generator is not available.
*/
- public Generator getGenerator(final String type, final List<ComponentInstance> instanceList) {
- return this.getComponent(instanceList, Generator.class, type, this.generatorTracker);
+ public Generator getGenerator(final String type) {
+ final GeneratorFactory factory = this.generatorTracker.getFactory(type);
+ if ( factory == null ) {
+ LOGGER.debug("Requested generator factory for type '{}' not found.", type);
+ return null;
+ }
+ return factory.createGenerator();
}
/**
* Get the serializer of the given type.
* @param type The serializer type.
- * @param instanceList The instance is added to this list for later disposal.
* @return The serializer or null if the serializer is not available.
*/
- public Serializer getSerializer(final String type, final List<ComponentInstance> instanceList) {
- return this.getComponent(instanceList, Serializer.class, type, this.serializerTracker);
+ public Serializer getSerializer(final String type) {
+ final SerializerFactory factory = this.serializerTracker.getFactory(type);
+ if ( factory == null ) {
+ LOGGER.debug("Requested serializer factory for type '{}' not found.", type);
+ return null;
+ }
+ return factory.createSerializer();
}
/**
* Get the transformer of the given type.
* @param type The transformer type.
- * @param instanceList The instance is added to this list for later disposal.
* @return The transformer or null if the transformer is not available.
*/
- public Transformer getTransformer(final String type, final List<ComponentInstance> instanceList) {
- return this.getComponent(instanceList, Transformer.class, type, this.transformerTracker);
+ public Transformer getTransformer(final String type) {
+ final TransformerFactory factory = this.transformerTracker.getFactory(type);
+ if ( factory == null ) {
+ LOGGER.debug("Requested transformer factory for type '{}' not found.", type);
+ return null;
+ }
+ return factory.createTransformer();
}
/**
* Get the processor of the given type.
* @param type The processor type.
- * @param instanceList The instance is added to this list for later disposal.
* @return The processor or null if the processor is not available.
*/
public Processor getProcessor(final String type, final List<ComponentInstance> instanceList) {
- return this.getComponent(instanceList, Processor.class, type, this.processorTracker);
+ final ProcessorFactory factory = this.processorTracker.getFactory(type);
+ if ( factory == null ) {
+ LOGGER.debug("Requested processor factory for type '{}' not found.", type);
+ return null;
+ }
+ return factory.createProcessor();
}
private static final Transformer[] EMPTY_ARRAY = new Transformer[0];
@@ -171,35 +158,32 @@
* all post transformers.
*/
public Transformer[][] getRewriterTransformers() {
- return this.rewritingTransformerTracker.getTransformers();
+ return this.transformerTracker.getTransformers();
}
/**
* This service tracker stores all services into a hash map.
*/
- protected final class HashingServiceTrackerCustomizer extends ServiceTracker {
+ protected static class HashingServiceTrackerCustomizer<T> extends ServiceTracker {
- private final Map<String, ComponentFactory> services = new HashMap<String, ComponentFactory>();
+ /** The services hashed by their name property. */
+ private final Map<String, T> services = new HashMap<String, T>();
+ /** The bundle context. */
private final BundleContext context;
- public HashingServiceTrackerCustomizer(final BundleContext bc, final Filter filter) {
- super(bc, filter, null);
+ public HashingServiceTrackerCustomizer(final BundleContext bc, final String serviceClassName) {
+ super(bc, serviceClassName, null);
this.context = bc;
}
- public ComponentFactory get(final String type) {
+ public T getFactory(final String type) {
return services.get(type);
}
private String getType(final ServiceReference ref) {
- final String factory = (String) ref.getProperty("component.factory");
- final int pos = factory.lastIndexOf('/');
- if ( pos != -1 ) {
- final String type = factory.substring(pos + 1);
- return type;
- }
- return null;
+ final String type = (String) ref.getProperty("pipeline.type");
+ return type;
}
/**
@@ -207,7 +191,8 @@
*/
public Object addingService(final ServiceReference reference) {
final String type = this.getType(reference);
- final ComponentFactory factory = (type == null ? null : (ComponentFactory) this.context.getService(reference));
+ @SuppressWarnings("unchecked")
+ final T factory = (type == null ? null : (T) this.context.getService(reference));
if ( factory != null ) {
if ( LOGGER.isDebugEnabled() ) {
LOGGER.debug("Found service {}, type={}.", factory, type);
@@ -228,24 +213,36 @@
}
}
- protected static final class RewriterTransformerFactoryServiceTracker extends ServiceTracker {
+ protected static final class TransformerFactoryServiceTracker<T> extends HashingServiceTrackerCustomizer<T> {
- public static final RewriterTransformerFactory[] EMPTY_ARRAY = new RewriterTransformerFactory[0];
- public static final RewriterTransformerFactory[][] EMPTY_DOUBLE_ARRAY = new RewriterTransformerFactory[][] {EMPTY_ARRAY, EMPTY_ARRAY};
+ private String getMode(final ServiceReference ref) {
+ final String mode = (String) ref.getProperty("pipeline.mode");
+ return mode;
+ }
- private RewriterTransformerFactory[][] cached = EMPTY_DOUBLE_ARRAY;
+ private boolean isGlobal(final ServiceReference ref) {
+ return "global".equalsIgnoreCase(this.getMode(ref));
+ }
+
+ public static final TransformerFactory[] EMPTY_ARRAY = new TransformerFactory[0];
+ public static final TransformerFactory[][] EMPTY_DOUBLE_ARRAY = new TransformerFactory[][] {EMPTY_ARRAY, EMPTY_ARRAY};
+ private TransformerFactory[][] cached = EMPTY_DOUBLE_ARRAY;
+
+ /** flag for cache. */
private boolean cacheIsValid = true;
- public RewriterTransformerFactoryServiceTracker(final BundleContext bc) {
- super(bc, RewriterTransformerFactory.class.getName(), null);
+ public TransformerFactoryServiceTracker(final BundleContext bc, final String serviceClassName) {
+ super(bc, serviceClassName);
}
/**
* @see org.osgi.util.tracker.ServiceTracker#addingService(org.osgi.framework.ServiceReference)
*/
public Object addingService(ServiceReference reference) {
- this.cacheIsValid = false;
+ if ( isGlobal(reference) ) {
+ this.cacheIsValid = false;
+ }
return super.addingService(reference);
}
@@ -253,15 +250,13 @@
* @see org.osgi.util.tracker.ServiceTracker#removedService(org.osgi.framework.ServiceReference, java.lang.Object)
*/
public void removedService(ServiceReference reference, Object service) {
- this.cacheIsValid = false;
+ if ( isGlobal(reference) ) {
+ this.cacheIsValid = false;
+ }
super.removedService(reference, service);
}
- public boolean isCacheValid() {
- return this.cacheIsValid;
- }
-
- private RewriterTransformerFactory[][] getTransformerFactories() {
+ private TransformerFactory[][] getTransformerFactories() {
if ( !this.cacheIsValid ) {
synchronized ( this ) {
if ( !this.cacheIsValid ) {
@@ -274,33 +269,37 @@
int preCount = 0;
int postCount = 0;
for(final ServiceReference ref : refs) {
- final Object r = ref.getProperty(Constants.SERVICE_RANKING);
- int ranking = (r instanceof Integer ? (Integer)r : 0);
- if ( ranking < 0 ) {
- preCount++;
- } else {
- postCount++;
+ if ( isGlobal(ref) ) {
+ final Object r = ref.getProperty(Constants.SERVICE_RANKING);
+ int ranking = (r instanceof Integer ? (Integer)r : 0);
+ if ( ranking < 0 ) {
+ preCount++;
+ } else {
+ postCount++;
+ }
}
}
- final RewriterTransformerFactory[][] rewriters = new RewriterTransformerFactory[2][];
+ final TransformerFactory[][] rewriters = new TransformerFactory[2][];
if ( preCount == 0 ) {
rewriters[0] = EMPTY_ARRAY;
} else {
- rewriters[0] = new RewriterTransformerFactory[preCount];
+ rewriters[0] = new TransformerFactory[preCount];
}
if ( postCount == 0) {
rewriters[1] = EMPTY_ARRAY;
} else {
- rewriters[1] = new RewriterTransformerFactory[postCount];
+ rewriters[1] = new TransformerFactory[postCount];
}
int index = 0;
for(final ServiceReference ref : refs) {
- if ( index < preCount ) {
- rewriters[0][index] = (RewriterTransformerFactory) this.getService(ref);
- } else {
- rewriters[1][index - preCount] = (RewriterTransformerFactory) this.getService(ref);
+ if ( isGlobal(ref) ) {
+ if ( index < preCount ) {
+ rewriters[0][index] = (TransformerFactory) this.getService(ref);
+ } else {
+ rewriters[1][index - preCount] = (TransformerFactory) this.getService(ref);
+ }
+ index++;
}
- index++;
}
this.cached = rewriters;
}
@@ -312,7 +311,7 @@
}
public Transformer[][] getTransformers() {
- final RewriterTransformerFactory[][] factories = this.getTransformerFactories();
+ final TransformerFactory[][] factories = this.getTransformerFactories();
if ( factories == EMPTY_DOUBLE_ARRAY ) {
return FactoryCache.EMPTY_DOUBLE_ARRAY;
}
Copied: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/HtmlGeneratorFactory.java (from r782538, incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/HtmlGenerator.java)
URL: http://svn.apache.org/viewvc/incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/HtmlGeneratorFactory.java?p2=incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/HtmlGeneratorFactory.java&p1=incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/HtmlGenerator.java&r1=782538&r2=782553&rev=782553&view=diff
==============================================================================
--- incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/HtmlGenerator.java (original)
+++ incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/HtmlGeneratorFactory.java Mon Jun 8 08:05:41 2009
@@ -26,6 +26,7 @@
import org.apache.sling.commons.osgi.OsgiUtil;
import org.apache.sling.rewriter.Generator;
+import org.apache.sling.rewriter.GeneratorFactory;
import org.apache.sling.rewriter.ProcessingComponentConfiguration;
import org.apache.sling.rewriter.ProcessingContext;
import org.xml.sax.ContentHandler;
@@ -36,9 +37,10 @@
* starting point for html pipelines.
*
* @scr.component metatype="no"
- * factory="org.apache.sling.rewriter.Generator/html-generator"
+ * @scr.service
+ * @scr.property name="pipeline.type" value="html-generator"
*/
-public class HtmlGenerator extends Writer implements Generator {
+public class HtmlGeneratorFactory implements GeneratorFactory {
public static String NAMESPACE = "http://org.apache.sling/rewriter";
@@ -48,618 +50,628 @@
public static final String INCLUDE_TAGS_PROPERTY = "includeTags";
- /** Internal character buffer */
- private final CharArrayWriter buffer = new CharArrayWriter(256);
+ private static final Set<String> DEFAULT_INCLUSION_TAGS;
+ static {
+ DEFAULT_INCLUSION_TAGS = new HashSet<String>();
+ DEFAULT_INCLUSION_TAGS.add("A");
+ DEFAULT_INCLUSION_TAGS.add("/A");
+ DEFAULT_INCLUSION_TAGS.add("IMG");
+ DEFAULT_INCLUSION_TAGS.add("AREA");
+ DEFAULT_INCLUSION_TAGS.add("FORM");
+ DEFAULT_INCLUSION_TAGS.add("BASE");
+ DEFAULT_INCLUSION_TAGS.add("LINK");
+ DEFAULT_INCLUSION_TAGS.add("SCRIPT");
+ DEFAULT_INCLUSION_TAGS.add("/BODY");
+ }
- /** Tag tokenizer */
- private final TagTokenizer tokenizer = new TagTokenizer();
+ /**
+ * @see org.apache.sling.rewriter.GeneratorFactory#createGenerator()
+ */
+ public Generator createGenerator() {
+ return new HtmlGenerator();
+ }
- /** Tag name buffer */
- private final CharArrayWriter tagNameBuffer = new CharArrayWriter(30);
+ public static final class HtmlGenerator extends Writer implements Generator {
- /** Tag name */
- private String tagName;
+ /** Internal character buffer */
+ private final CharArrayWriter buffer = new CharArrayWriter(256);
- /** Tag inclusion list */
- private Set<String> tagInclusionSet;
+ /** Tag tokenizer */
+ private final TagTokenizer tokenizer = new TagTokenizer();
- /** Registered content handler */
- private ContentHandler contentHandler;
+ /** Tag name buffer */
+ private final CharArrayWriter tagNameBuffer = new CharArrayWriter(30);
- /** Parse state constant */
- private final static int PS_OUTSIDE = 0;
+ /** Tag name */
+ private String tagName;
- /** Parse state constant */
- private final static int PS_TAG = PS_OUTSIDE + 1;
+ /** Tag inclusion list */
+ private Set<String> tagInclusionSet;
- /** Parse state constant */
- private final static int PS_SCRIPT = PS_TAG + 1;
+ /** Registered content handler */
+ private ContentHandler contentHandler;
- /** Parse state constant */
- private final static int PS_COMMENT = PS_SCRIPT + 1;
+ /** Parse state constant */
+ private final static int PS_OUTSIDE = 0;
- /** Parse state constant */
- private final static int PS_STRING = PS_COMMENT + 1;
+ /** Parse state constant */
+ private final static int PS_TAG = PS_OUTSIDE + 1;
- /** Tag type constant */
- private final static int TT_NONE = 0;
+ /** Parse state constant */
+ private final static int PS_SCRIPT = PS_TAG + 1;
- /** Tag type constant */
- private final static int TT_MAYBE = 1;
+ /** Parse state constant */
+ private final static int PS_COMMENT = PS_SCRIPT + 1;
- /** Tag type constant */
- private final static int TT_TAG = 2;
+ /** Parse state constant */
+ private final static int PS_STRING = PS_COMMENT + 1;
- /** Parse state */
- private int parseState;
+ /** Tag type constant */
+ private final static int TT_NONE = 0;
- /** Parse substate */
- private int parseSubState;
+ /** Tag type constant */
+ private final static int TT_MAYBE = 1;
- /** Previous parse state */
- private int prevParseState;
+ /** Tag type constant */
+ private final static int TT_TAG = 2;
- /** Current tag type */
- private int tagType;
+ /** Parse state */
+ private int parseState;
- /** Quote character */
- private char quoteChar;
+ /** Parse substate */
+ private int parseSubState;
- /** Did we already start parsing? */
- boolean started = false;
+ /** Previous parse state */
+ private int prevParseState;
- private final org.xml.sax.helpers.AttributesImpl atts = new org.xml.sax.helpers.AttributesImpl();
+ /** Current tag type */
+ private int tagType;
- private static final Set<String> DEFAULT_INCLUSION_TAGS;
- static {
- DEFAULT_INCLUSION_TAGS = new HashSet<String>();
- DEFAULT_INCLUSION_TAGS.add("A");
- DEFAULT_INCLUSION_TAGS.add("/A");
- DEFAULT_INCLUSION_TAGS.add("IMG");
- DEFAULT_INCLUSION_TAGS.add("AREA");
- DEFAULT_INCLUSION_TAGS.add("FORM");
- DEFAULT_INCLUSION_TAGS.add("BASE");
- DEFAULT_INCLUSION_TAGS.add("LINK");
- DEFAULT_INCLUSION_TAGS.add("SCRIPT");
- DEFAULT_INCLUSION_TAGS.add("/BODY");
- }
+ /** Quote character */
+ private char quoteChar;
- /**
- * Default constructor.
- */
- public HtmlGenerator() {
- this.tagInclusionSet = DEFAULT_INCLUSION_TAGS;
- }
+ /** Did we already start parsing? */
+ boolean started = false;
- /**
- * @see org.apache.sling.rewriter.Generator#init(org.apache.sling.rewriter.ProcessingContext, org.apache.sling.rewriter.ProcessingComponentConfiguration)
- */
- public void init(ProcessingContext pipelineContext,
- ProcessingComponentConfiguration config) {
- final String[] includedTags = OsgiUtil.toStringArray(config
- .getConfiguration().get(INCLUDE_TAGS_PROPERTY));
- if (includedTags != null && includedTags.length > 0) {
- this.tagInclusionSet = new HashSet<String>();
- for (final String tag : includedTags) {
- this.tagInclusionSet.add(tag);
- }
- // we always have to include body!
- this.tagInclusionSet.add("/BODY");
+ private final org.xml.sax.helpers.AttributesImpl atts = new org.xml.sax.helpers.AttributesImpl();
+
+ /**
+ * Default constructor.
+ */
+ public HtmlGenerator() {
+ this.tagInclusionSet = DEFAULT_INCLUSION_TAGS;
}
- }
- /**
- * @see org.apache.sling.rewriter.Generator#getWriter()
- */
- public PrintWriter getWriter() {
- return new PrintWriter(this);
- }
+ /**
+ * @see org.apache.sling.rewriter.Generator#init(org.apache.sling.rewriter.ProcessingContext, org.apache.sling.rewriter.ProcessingComponentConfiguration)
+ */
+ public void init(ProcessingContext pipelineContext,
+ ProcessingComponentConfiguration config) {
+ final String[] includedTags = OsgiUtil.toStringArray(config
+ .getConfiguration().get(INCLUDE_TAGS_PROPERTY));
+ if (includedTags != null && includedTags.length > 0) {
+ this.tagInclusionSet = new HashSet<String>();
+ for (final String tag : includedTags) {
+ this.tagInclusionSet.add(tag);
+ }
+ // we always have to include body!
+ this.tagInclusionSet.add("/BODY");
+ }
+ }
- public Set<String> getTagInclusionSet() {
- return tagInclusionSet;
- }
+ /**
+ * @see org.apache.sling.rewriter.Generator#getWriter()
+ */
+ public PrintWriter getWriter() {
+ return new PrintWriter(this);
+ }
- public void setTagInclusionSet(Set<String> tagInclusionSet) {
- this.tagInclusionSet = tagInclusionSet;
- }
+ public Set<String> getTagInclusionSet() {
+ return tagInclusionSet;
+ }
- /**
- * @see org.apache.sling.rewriter.Generator#setContentHandler(org.xml.sax.ContentHandler)
- */
- public void setContentHandler(ContentHandler handler) {
- this.contentHandler = handler;
- }
+ public void setTagInclusionSet(Set<String> tagInclusionSet) {
+ this.tagInclusionSet = tagInclusionSet;
+ }
- @Override
- public void write(char cbuf[], int off, int len) throws IOException {
- this.update(cbuf, 0, len);
- }
+ /**
+ * @see org.apache.sling.rewriter.Generator#setContentHandler(org.xml.sax.ContentHandler)
+ */
+ public void setContentHandler(ContentHandler handler) {
+ this.contentHandler = handler;
+ }
- @Override
- public void write(int b) throws IOException {
- final char[] buf = new char[] { (char) b };
- this.update(buf, 0, buf.length);
- }
+ @Override
+ public void write(char cbuf[], int off, int len) throws IOException {
+ this.update(cbuf, 0, len);
+ }
- @Override
- public void close() throws IOException {
- // nothing to do
- }
+ @Override
+ public void write(int b) throws IOException {
+ final char[] buf = new char[] { (char) b };
+ this.update(buf, 0, buf.length);
+ }
- @Override
- public void flush() throws IOException {
- flushBuffer();
-
- // send 0-length characters that eventually let the serializer flush the
- // underlying writer
- try {
- this.contentHandler.characters(new char[0], 0, 0);
- } catch (SAXException e) {
- throw handle(e);
+ @Override
+ public void close() throws IOException {
+ // nothing to do
}
- }
- /**
- * Feed characters to the parser.
- *
- * @param buf
- * character buffer
- * @param off
- * offset where characters start
- * @param len
- * length of affected buffer
- */
- public void update(char[] buf, int off, int len) throws IOException {
- if (!this.started) {
+ @Override
+ public void flush() throws IOException {
+ flushBuffer();
+
+ // send 0-length characters that eventually let the serializer flush the
+ // underlying writer
try {
- this.contentHandler.startDocument();
- } catch (SAXException se) {
- this.handle(se);
+ this.contentHandler.characters(new char[0], 0, 0);
+ } catch (SAXException e) {
+ throw handle(e);
}
- this.started = true;
}
- int start = off;
- int end = off + len;
- for (int curr = start; curr < end; curr++) {
- char c = buf[curr];
+ /**
+ * Feed characters to the parser.
+ *
+ * @param buf
+ * character buffer
+ * @param off
+ * offset where characters start
+ * @param len
+ * length of affected buffer
+ */
+ public void update(char[] buf, int off, int len) throws IOException {
+ if (!this.started) {
+ try {
+ this.contentHandler.startDocument();
+ } catch (SAXException se) {
+ this.handle(se);
+ }
+ this.started = true;
+ }
+ int start = off;
+ int end = off + len;
+
+ for (int curr = start; curr < end; curr++) {
+ char c = buf[curr];
- switch (parseState) {
- case PS_OUTSIDE:
- if (c == '<') {
- if (curr > start) {
- try {
- this.contentHandler.characters(buf, start, curr - start);
- } catch (SAXException e) {
- throw handle(e);
+ switch (parseState) {
+ case PS_OUTSIDE:
+ if (c == '<') {
+ if (curr > start) {
+ try {
+ this.contentHandler.characters(buf, start, curr - start);
+ } catch (SAXException e) {
+ throw handle(e);
+ }
}
- }
- start = curr;
- parseState = PS_TAG;
- parseSubState = 0;
- tagType = TT_MAYBE;
- resetTagName();
- }
- break;
- case PS_TAG:
- switch (parseSubState) {
- case -1:
- if (c == '"' || c == '\'') {
- quoteChar = c;
- prevParseState = parseState;
- parseState = PS_STRING;
- parseSubState = -1;
- } else if (c == '>') {
- parseState = PS_OUTSIDE;
- }
- break;
- case 0:
- if (c == '!') {
- parseState = PS_COMMENT;
+ start = curr;
+ parseState = PS_TAG;
parseSubState = 0;
- tagType = TT_NONE;
- flushBuffer();
- } else if (c == '"' || c == '\'') {
- quoteChar = c;
- prevParseState = parseState;
- parseState = PS_STRING;
- parseSubState = -1;
- tagType = TT_NONE;
- flushBuffer();
- } else if (c == '>') {
- parseState = PS_OUTSIDE;
- tagType = TT_NONE;
- flushBuffer();
- } else if (!Character.isWhitespace(c)) {
- tagNameBuffer.write(c);
- parseSubState = 1;
- } else {
- parseSubState = -1;
- tagType = TT_NONE;
- flushBuffer();
+ tagType = TT_MAYBE;
+ resetTagName();
}
break;
- case 1:
- if (c == '"' || c == '\'') {
- if (tagIncluded(getTagName())) {
- tagType = TT_TAG;
+ case PS_TAG:
+ switch (parseSubState) {
+ case -1:
+ if (c == '"' || c == '\'') {
+ quoteChar = c;
+ prevParseState = parseState;
+ parseState = PS_STRING;
+ parseSubState = -1;
+ } else if (c == '>') {
+ parseState = PS_OUTSIDE;
+ }
+ break;
+ case 0:
+ if (c == '!') {
+ parseState = PS_COMMENT;
+ parseSubState = 0;
+ tagType = TT_NONE;
+ flushBuffer();
+ } else if (c == '"' || c == '\'') {
+ quoteChar = c;
+ prevParseState = parseState;
+ parseState = PS_STRING;
+ parseSubState = -1;
+ tagType = TT_NONE;
+ flushBuffer();
+ } else if (c == '>') {
+ parseState = PS_OUTSIDE;
+ tagType = TT_NONE;
+ flushBuffer();
+ } else if (!Character.isWhitespace(c)) {
+ tagNameBuffer.write(c);
+ parseSubState = 1;
} else {
+ parseSubState = -1;
tagType = TT_NONE;
flushBuffer();
}
- parseSubState = 2;
- quoteChar = c;
- prevParseState = parseState;
- parseState = PS_STRING;
- } else if (c == '>') {
- if (tagIncluded(getTagName())) {
- processTag(buf, start, curr - start + 1);
- start = curr + 1;
+ break;
+ case 1:
+ if (c == '"' || c == '\'') {
+ if (tagIncluded(getTagName())) {
+ tagType = TT_TAG;
+ } else {
+ tagType = TT_NONE;
+ flushBuffer();
+ }
+ parseSubState = 2;
+ quoteChar = c;
+ prevParseState = parseState;
+ parseState = PS_STRING;
+ } else if (c == '>') {
+ if (tagIncluded(getTagName())) {
+ processTag(buf, start, curr - start + 1);
+ start = curr + 1;
+ tagType = TT_NONE;
+ parseState = getTagName()
+ .equalsIgnoreCase("SCRIPT") ? PS_SCRIPT
+ : PS_OUTSIDE;
+ parseSubState = 0;
+ } else {
+ tagType = TT_NONE;
+ flushBuffer();
+ parseState = PS_OUTSIDE;
+ }
+ } else if (Character.isWhitespace(c)) {
+ if (tagIncluded(getTagName())) {
+ tagType = TT_TAG;
+ } else {
+ tagType = TT_NONE;
+ flushBuffer();
+ }
+ parseSubState = 2;
+ } else {
+ tagNameBuffer.write(c);
+ }
+ break;
+ case 2:
+ if (c == '"' || c == '\'') {
+ quoteChar = c;
+ prevParseState = parseState;
+ parseState = PS_STRING;
+ } else if (c == '>') {
+ if (tagType == TT_TAG) {
+ processTag(buf, start, curr - start + 1);
+ start = curr + 1;
+ } else {
+ flushBuffer();
+ }
tagType = TT_NONE;
- parseState = getTagName()
- .equalsIgnoreCase("SCRIPT") ? PS_SCRIPT
+ parseState = getTagName().equalsIgnoreCase("SCRIPT") ? PS_SCRIPT
: PS_OUTSIDE;
parseSubState = 0;
- } else {
+ }
+ break;
+ }
+ break;
+ case PS_COMMENT:
+ switch (parseSubState) {
+ case 0:
+ if (c == '-') {
+ parseSubState++;
+ } else if (c == '"' || c == '\'') {
+ quoteChar = c;
+ prevParseState = PS_TAG;
+ parseState = PS_STRING;
+ parseSubState = -1;
tagType = TT_NONE;
flushBuffer();
+ } else if (c == '>') {
parseState = PS_OUTSIDE;
- }
- } else if (Character.isWhitespace(c)) {
- if (tagIncluded(getTagName())) {
- tagType = TT_TAG;
+ tagType = TT_NONE;
+ flushBuffer();
} else {
+ parseState = PS_TAG;
+ parseSubState = -1;
tagType = TT_NONE;
flushBuffer();
}
- parseSubState = 2;
- } else {
- tagNameBuffer.write(c);
- }
- break;
- case 2:
- if (c == '"' || c == '\'') {
- quoteChar = c;
- prevParseState = parseState;
- parseState = PS_STRING;
- } else if (c == '>') {
- if (tagType == TT_TAG) {
- processTag(buf, start, curr - start + 1);
- start = curr + 1;
+ break;
+ case 1:
+ if (c == '-') {
+ parseSubState++;
+ } else if (c == '"' || c == '\'') {
+ quoteChar = c;
+ prevParseState = PS_TAG;
+ parseState = PS_STRING;
+ parseSubState = -1;
+ tagType = TT_NONE;
+ flushBuffer();
+ } else if (c == '>') {
+ parseState = PS_OUTSIDE;
+ tagType = TT_NONE;
+ flushBuffer();
} else {
+ parseState = PS_TAG;
+ parseSubState = -1;
+ tagType = TT_NONE;
flushBuffer();
}
- tagType = TT_NONE;
- parseState = getTagName().equalsIgnoreCase("SCRIPT") ? PS_SCRIPT
- : PS_OUTSIDE;
- parseSubState = 0;
- }
- break;
- }
- break;
- case PS_COMMENT:
- switch (parseSubState) {
- case 0:
- if (c == '-') {
- parseSubState++;
- } else if (c == '"' || c == '\'') {
- quoteChar = c;
- prevParseState = PS_TAG;
- parseState = PS_STRING;
- parseSubState = -1;
- tagType = TT_NONE;
- flushBuffer();
- } else if (c == '>') {
- parseState = PS_OUTSIDE;
- tagType = TT_NONE;
- flushBuffer();
- } else {
- parseState = PS_TAG;
- parseSubState = -1;
- tagType = TT_NONE;
- flushBuffer();
- }
- break;
- case 1:
- if (c == '-') {
- parseSubState++;
- } else if (c == '"' || c == '\'') {
- quoteChar = c;
- prevParseState = PS_TAG;
- parseState = PS_STRING;
- parseSubState = -1;
- tagType = TT_NONE;
- flushBuffer();
- } else if (c == '>') {
- parseState = PS_OUTSIDE;
- tagType = TT_NONE;
- flushBuffer();
- } else {
- parseState = PS_TAG;
- parseSubState = -1;
- tagType = TT_NONE;
- flushBuffer();
- }
- break;
- case 2:
- if (c == '-') {
- parseSubState++;
- }
- break;
- case 3:
- if (c == '-') {
- parseSubState++;
- } else {
- parseSubState = 2;
- }
- break;
- case 4:
- if (c == '>') {
- parseState = PS_OUTSIDE;
- } else {
- parseSubState = 2;
+ break;
+ case 2:
+ if (c == '-') {
+ parseSubState++;
+ }
+ break;
+ case 3:
+ if (c == '-') {
+ parseSubState++;
+ } else {
+ parseSubState = 2;
+ }
+ break;
+ case 4:
+ if (c == '>') {
+ parseState = PS_OUTSIDE;
+ } else {
+ parseSubState = 2;
+ }
+ break;
}
break;
- }
- break;
- case PS_SCRIPT:
- switch (parseSubState) {
- case 0:
- if (c == '<') {
- if (curr > start) {
- try {
- this.contentHandler.characters(buf, start, curr - start);
- } catch (SAXException e) {
- throw handle(e);
+ case PS_SCRIPT:
+ switch (parseSubState) {
+ case 0:
+ if (c == '<') {
+ if (curr > start) {
+ try {
+ this.contentHandler.characters(buf, start, curr - start);
+ } catch (SAXException e) {
+ throw handle(e);
+ }
}
+ start = curr;
+ tagType = TT_MAYBE;
+ parseSubState++;
}
- start = curr;
- tagType = TT_MAYBE;
- parseSubState++;
- }
- break;
- case 1:
- if (c == '/') {
- parseSubState++;
- } else {
- tagType = TT_NONE;
- flushBuffer();
- parseSubState = 0;
- }
- break;
- case 2:
- if (c == 'S' || c == 's') {
- parseSubState++;
- } else {
- tagType = TT_NONE;
- flushBuffer();
- parseSubState = 0;
- }
- break;
- case 3:
- if (c == 'C' || c == 'c') {
- parseSubState++;
- } else {
- tagType = TT_NONE;
- flushBuffer();
- parseSubState = 0;
- }
- break;
- case 4:
- if (c == 'R' || c == 'r') {
- parseSubState++;
- } else {
- tagType = TT_NONE;
- flushBuffer();
- parseSubState = 0;
- }
- break;
- case 5:
- if (c == 'I' || c == 'i') {
- parseSubState++;
- } else {
- tagType = TT_NONE;
- flushBuffer();
- parseSubState = 0;
- }
- break;
- case 6:
- if (c == 'P' || c == 'p') {
- parseSubState++;
- } else {
- tagType = TT_NONE;
- flushBuffer();
- parseSubState = 0;
- }
- break;
- case 7:
- if (c == 'T' || c == 't') {
- parseSubState++;
- } else {
- tagType = TT_NONE;
- flushBuffer();
- parseSubState = 0;
- }
- break;
- case 8:
- if (c == '>') {
- if (tagIncluded("SCRIPT")) {
- processTag(buf, start, curr - start + 1);
- start = curr + 1;
+ break;
+ case 1:
+ if (c == '/') {
+ parseSubState++;
+ } else {
+ tagType = TT_NONE;
+ flushBuffer();
+ parseSubState = 0;
+ }
+ break;
+ case 2:
+ if (c == 'S' || c == 's') {
+ parseSubState++;
+ } else {
+ tagType = TT_NONE;
+ flushBuffer();
+ parseSubState = 0;
+ }
+ break;
+ case 3:
+ if (c == 'C' || c == 'c') {
+ parseSubState++;
+ } else {
+ tagType = TT_NONE;
+ flushBuffer();
+ parseSubState = 0;
+ }
+ break;
+ case 4:
+ if (c == 'R' || c == 'r') {
+ parseSubState++;
} else {
+ tagType = TT_NONE;
flushBuffer();
+ parseSubState = 0;
}
- tagType = TT_NONE;
- parseState = PS_OUTSIDE;
+ break;
+ case 5:
+ if (c == 'I' || c == 'i') {
+ parseSubState++;
+ } else {
+ tagType = TT_NONE;
+ flushBuffer();
+ parseSubState = 0;
+ }
+ break;
+ case 6:
+ if (c == 'P' || c == 'p') {
+ parseSubState++;
+ } else {
+ tagType = TT_NONE;
+ flushBuffer();
+ parseSubState = 0;
+ }
+ break;
+ case 7:
+ if (c == 'T' || c == 't') {
+ parseSubState++;
+ } else {
+ tagType = TT_NONE;
+ flushBuffer();
+ parseSubState = 0;
+ }
+ break;
+ case 8:
+ if (c == '>') {
+ if (tagIncluded("SCRIPT")) {
+ processTag(buf, start, curr - start + 1);
+ start = curr + 1;
+ } else {
+ flushBuffer();
+ }
+ tagType = TT_NONE;
+ parseState = PS_OUTSIDE;
+ }
+ break;
}
break;
- }
- break;
- case PS_STRING:
- if (c == quoteChar) {
- parseState = prevParseState;
+ case PS_STRING:
+ if (c == quoteChar) {
+ parseState = prevParseState;
+ }
+ break;
+ }
+ }
+ if (start < end) {
+ if (tagType == TT_NONE) {
+ try {
+ this.contentHandler.characters(buf, start, end - start);
+ } catch (SAXException e) {
+ throw handle(e);
+ }
+ } else {
+ buffer.write(buf, start, end - start);
}
- break;
}
}
- if (start < end) {
- if (tagType == TT_NONE) {
+
+ /**
+ * Return a flag indicating whether the parser has still some undigested
+ * characters left.
+ *
+ * @return <code>true</code> if the parser still contains characters
+ * <code>false</code> otherwise
+ */
+ public boolean isEmpty() {
+ return buffer.size() == 0;
+ }
+
+ /**
+ * Finish the parsing process. This forces the parser to flush the
+ * characters still held in its internal buffer, regardless of the parsing
+ * state.
+ */
+ public void finished() throws IOException {
+ flushBuffer();
+ if ( this.started ) {
try {
- this.contentHandler.characters(buf, start, end - start);
+ this.contentHandler.endDocument();
} catch (SAXException e) {
throw handle(e);
}
- } else {
- buffer.write(buf, start, end - start);
- }
- }
- }
-
- /**
- * Return a flag indicating whether the parser has still some undigested
- * characters left.
- *
- * @return <code>true</code> if the parser still contains characters
- * <code>false</code> otherwise
- */
- public boolean isEmpty() {
- return buffer.size() == 0;
- }
- /**
- * Finish the parsing process. This forces the parser to flush the
- * characters still held in its internal buffer, regardless of the parsing
- * state.
- */
- public void finished() throws IOException {
- flushBuffer();
- if ( this.started ) {
- try {
- this.contentHandler.endDocument();
- } catch (SAXException e) {
- throw handle(e);
}
-
}
- }
- /**
- * Clears the internal tagname buffer and cache
- */
- protected void resetTagName() {
- tagName = null;
- tagNameBuffer.reset();
- }
-
- /**
- * Returns the tagname scanned and resets the internal tagname buffer
- *
- * @return tagname
- */
- protected String getTagName() {
- if (tagName == null) {
- tagName = tagNameBuffer.toString();
+ /**
+ * Clears the internal tagname buffer and cache
+ */
+ protected void resetTagName() {
+ tagName = null;
+ tagNameBuffer.reset();
}
- return tagName;
- }
- /**
- * Flush internal buffer. This forces the parser to flush the characters
- * still held in its internal buffer, regardless of the parsing state.
- */
- protected void flushBuffer() throws IOException {
- if (buffer.size() > 0) {
- char[] ch = buffer.toCharArray();
- try {
- this.contentHandler.characters(ch, 0, ch.length);
- } catch (SAXException e) {
- throw handle(e);
+ /**
+ * Returns the tagname scanned and resets the internal tagname buffer
+ *
+ * @return tagname
+ */
+ protected String getTagName() {
+ if (tagName == null) {
+ tagName = tagNameBuffer.toString();
}
- buffer.reset();
+ return tagName;
}
- }
- /**
- * Returns a flag indicating whether the specified tag should be included in
- * the parsing process.
- *
- * @param tagName
- * tag name
- * @return <code>true</code> if the tag should be processed, else
- * <code>false</code>
- */
- protected boolean tagIncluded(String tagName) {
- return tagInclusionSet == null
- || tagInclusionSet.contains(tagName.toUpperCase());
- }
+ /**
+ * Flush internal buffer. This forces the parser to flush the characters
+ * still held in its internal buffer, regardless of the parsing state.
+ */
+ protected void flushBuffer() throws IOException {
+ if (buffer.size() > 0) {
+ char[] ch = buffer.toCharArray();
+ try {
+ this.contentHandler.characters(ch, 0, ch.length);
+ } catch (SAXException e) {
+ throw handle(e);
+ }
+ buffer.reset();
+ }
+ }
- /**
- * Decompose a tag and feed it to the document handler.
- *
- * @param ch
- * character data
- * @param off
- * offset where character data starts
- * @param len
- * length of character data
- */
- protected void processTag(char[] ch, int off, int len) throws IOException {
- buffer.write(ch, off, len);
+ /**
+ * Returns a flag indicating whether the specified tag should be included in
+ * the parsing process.
+ *
+ * @param tagName
+ * tag name
+ * @return <code>true</code> if the tag should be processed, else
+ * <code>false</code>
+ */
+ protected boolean tagIncluded(String tagName) {
+ return tagInclusionSet == null
+ || tagInclusionSet.contains(tagName.toUpperCase());
+ }
- char[] snippet = buffer.toCharArray();
+ /**
+ * Decompose a tag and feed it to the document handler.
+ *
+ * @param ch
+ * character data
+ * @param off
+ * offset where character data starts
+ * @param len
+ * length of character data
+ */
+ protected void processTag(char[] ch, int off, int len) throws IOException {
+ buffer.write(ch, off, len);
+
+ char[] snippet = buffer.toCharArray();
+
+ tokenizer.tokenize(snippet, 0, snippet.length);
+ if (!tokenizer.endTag()) {
+ final AttributeList attributes = tokenizer.attributes();
+ final String tagName = tokenizer.tagName();
+ this.atts.clear();
- tokenizer.tokenize(snippet, 0, snippet.length);
- if (!tokenizer.endTag()) {
- final AttributeList attributes = tokenizer.attributes();
- final String tagName = tokenizer.tagName();
- this.atts.clear();
-
- final char[] quotes = new char[attributes.attributeCount()];
- int index = 0;
- final Iterator<String> names = attributes.attributeNames();
- while (names.hasNext()) {
- final String name = names.next();
- final String value = attributes.getValue(name);
- if (value != null) {
- this.atts.addAttribute("", name, name, "CDATA", value);
- } else {
- this.atts.addAttribute("", name, name, "CDATA", "");
+ final char[] quotes = new char[attributes.attributeCount()];
+ int index = 0;
+ final Iterator<String> names = attributes.attributeNames();
+ while (names.hasNext()) {
+ final String name = names.next();
+ final String value = attributes.getValue(name);
+ if (value != null) {
+ this.atts.addAttribute("", name, name, "CDATA", value);
+ } else {
+ this.atts.addAttribute("", name, name, "CDATA", "");
+ }
+ quotes[index] = attributes.getQuoteChar(name);
+ index++;
}
- quotes[index] = attributes.getQuoteChar(name);
- index++;
- }
- if ( index > 0 ) {
- this.atts.addAttribute(NAMESPACE, QUOTES_ATTR, QUOTES_ATTR, "CDATA", new String(quotes));
- }
- try {
- if (tokenizer.endSlash()) {
- // just tell the contentHandler via attribute that an end slash is needed
- this.atts.addAttribute("", END_SLASH_ATTR, END_SLASH_ATTR, "CDATA", "");
+ if ( index > 0 ) {
+ this.atts.addAttribute(NAMESPACE, QUOTES_ATTR, QUOTES_ATTR, "CDATA", new String(quotes));
+ }
+ try {
+ if (tokenizer.endSlash()) {
+ // just tell the contentHandler via attribute that an end slash is needed
+ this.atts.addAttribute("", END_SLASH_ATTR, END_SLASH_ATTR, "CDATA", "");
+ }
+ this.contentHandler.startElement("", tagName, tagName, this.atts);
+ } catch (SAXException e) {
+ throw handle(e);
+ }
+ } else {
+ try {
+ final String tagName = tokenizer.tagName();
+ this.contentHandler.endElement("", tagName, tagName);
+ } catch (SAXException e) {
+ throw handle(e);
}
- this.contentHandler.startElement("", tagName, tagName, this.atts);
- } catch (SAXException e) {
- throw handle(e);
- }
- } else {
- try {
- final String tagName = tokenizer.tagName();
- this.contentHandler.endElement("", tagName, tagName);
- } catch (SAXException e) {
- throw handle(e);
}
- }
- buffer.reset();
- }
+ buffer.reset();
+ }
- protected final IOException handle(SAXException se) {
- if ( se.getCause() != null && se.getCause() instanceof IOException) {
- return (IOException)se.getCause();
- }
- final IOException ioe = new IOException("Unable to parse document");
- ioe.initCause(se);
- return ioe;
+ protected final IOException handle(SAXException se) {
+ if ( se.getCause() != null && se.getCause() instanceof IOException) {
+ return (IOException)se.getCause();
+ }
+ final IOException ioe = new IOException("Unable to parse document");
+ ioe.initCause(se);
+ return ioe;
+ }
}
}
Propchange: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/HtmlGeneratorFactory.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/HtmlGeneratorFactory.java
------------------------------------------------------------------------------
svn:keywords = author date id revision rev url
Propchange: incubator/sling/whiteboard/rewriter/src/main/java/org/apache/sling/rewriter/impl/HtmlGeneratorFactory.java
------------------------------------------------------------------------------
svn:mime-type = text/plain