blob: 809938fa219aeed866cd377056da51db7f83d871 [file] [log] [blame]
/*
* 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.pipes.models;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.models.annotations.Model;
import org.apache.sling.models.annotations.injectorspecific.OSGiService;
import org.apache.sling.pipes.Pipe;
import org.apache.sling.pipes.Plumber;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* Check for pipes presence under <code>pipes</code> node of the given resource, and make their output available as pipes
* to the script. Note that current resource is passed as a binding to the executed pipes, as a map of properties, plus
* the name and path, with the name <code>BINDING_CURRENTRESOURCE</code>
*/
@Model(adaptables = Resource.class)
public class PipeModel {
Logger LOG = LoggerFactory.getLogger(PipeModel.class);
/**
* name of the child nodes under which we should look for pipes
*/
protected static final String NN_PIPES = "pipes";
/**
* name of the binding in which we should register current resource bindings
*/
protected static final String BINDING_CURRENTRESOURCE = "currentResource";
/**
* map of the found pipes outputs
*/
protected Map<String, Iterator<Resource>> outputs;
/**
* Getter for outputs
* @return outputs of the model: pipe name as key, outputs as value
*/
public Map<String, Iterator<Resource>> getOutputs() {
return outputs;
}
@OSGiService
protected Plumber plumber;
/**
* pipe root of the current resource
*/
protected Resource root;
/**
* current resource
*/
protected Resource currentResource;
/**
* Constructor
* @param resource resource upon which this model is constructed
*/
public PipeModel(Resource resource) {
currentResource = resource;
LOG.debug("constructing Pipe Model with {}", currentResource.getPath());
root = resource.getChild(NN_PIPES);
}
@PostConstruct
protected void init(){
LOG.debug("initialising Pipe Model");
if (root != null){
outputs = new HashMap<>();
for (Iterator<Resource> pipeCandidates = root.listChildren(); pipeCandidates.hasNext();){
Resource candidate = pipeCandidates.next();
try {
Pipe pipe = plumber.getPipe(candidate);
pipe.getBindings().addBinding(BINDING_CURRENTRESOURCE, currentResource.adaptTo(ValueMap.class));
pipe.getBindings().updateStaticBindings(BINDING_CURRENTRESOURCE, currentResource);
outputs.put(pipe.getName(), pipe.getOutput());
LOG.debug("found and initialized {}", pipe.getName());
} catch(Exception e){
LOG.error("unable to bind {} pipe", candidate.getPath(), e);
}
}
} else {
LOG.debug("no root node found");
}
}
}