/*******************************************************************************
* Copyright 2010 Simon Mieth
*
* 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.kabeja.processing;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import org.kabeja.DraftDocument;
import org.kabeja.common.Block;
import org.kabeja.common.DraftEntity;
import org.kabeja.common.Layer;
import org.kabeja.common.Type;
import org.kabeja.entities.Entity;
public class LayerFilter extends AbstractPostProcessor {
public final static String PROPERTY_REMOVE_LAYERS = "layers.remove";
public final static String PROPERTY_MERGE_LAYERS = "layers.merge";
public final static String PROPERTY_REMOVE_EMPTY_LAYERS = "remove.empty.layers";
public final static String MERGED_LAYER_NAME = "ALL";
protected boolean merge = false;
protected boolean removeEmptyLayer = false;
protected Set<String> removableLayers = new HashSet<String>();
public void setProperties(Map properties) {
super.setProperties(properties);
if (properties.containsKey(PROPERTY_MERGE_LAYERS)) {
this.merge = Boolean.valueOf(
(String) properties.get(PROPERTY_MERGE_LAYERS))
.booleanValue();
}
if (properties.containsKey(PROPERTY_REMOVE_LAYERS)) {
this.removableLayers.clear();
StringTokenizer st = new StringTokenizer((String) properties
.get(PROPERTY_REMOVE_LAYERS), "|");
while (st.hasMoreTokens()) {
this.removableLayers.add(st.nextToken());
}
}
if (properties.containsKey(PROPERTY_REMOVE_EMPTY_LAYERS)) {
this.removeEmptyLayer = Boolean.valueOf(
(String) properties.get(PROPERTY_REMOVE_EMPTY_LAYERS))
.booleanValue();
}
}
public void process(DraftDocument doc, Map context) throws ProcessorException {
Layer mergeLayer = null;
if (this.merge) {
if (doc.containsLayer(MERGED_LAYER_NAME)) {
mergeLayer = doc.getLayer(MERGED_LAYER_NAME);
} else {
mergeLayer = new Layer();
mergeLayer.setName(MERGED_LAYER_NAME);
doc.addLayer(mergeLayer);
}
}
// check if the remove layer
Set<String> blockLayer = new HashSet<String>();
for(Block block :doc.getBlocks()){
for(DraftEntity e:block.getEntities()){
blockLayer.add(e.getLayer().getName());
}
}
// iterate over all layers
Iterator<Layer> i = doc.getLayers().iterator();
int count = 0;
while (i.hasNext()) {
Layer layer = (Layer) i.next();
count++;
if (this.removableLayers.contains(layer.getName())) {
i.remove();
} else if (this.merge) {
if (layer != mergeLayer) {
for(Type<?> type :layer.getEntityTypes()){
Iterator<?> entityIterator = layer.getEntitiesByType(type)
.iterator();
while (entityIterator.hasNext()) {
Entity e = (Entity) entityIterator.next();
// we set all entities to the merged layer
// and remove them from the last layer
e.setLayer(mergeLayer);
// set again to the doc, which will
// place the entity on the right
// layer -> the LAYER = "ALL"
doc.addEntity(e);
entityIterator.remove();
}
}
// remove the layer
i.remove();
}
} else if (this.removeEmptyLayer && layer.isEmpty() && !blockLayer.contains(layer.getName())) {
i.remove();
}
}
}
}