package camelinaction;

import java.util.Dictionary;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.apache.camel.CamelContext;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.cm.ConfigurationException;
import org.osgi.service.cm.ManagedServiceFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FileInventoryServiceFactory implements ManagedServiceFactory {
    
    private static final Logger LOG = LoggerFactory.getLogger(FileInventoryServiceFactory.class);

    private CamelContext camelContext;
    private BundleContext bundleContext;
    private Map<String, FileInventoryRoute> routes = new HashMap<String, FileInventoryRoute>();
    private ServiceRegistration registration;
    
    @Override
    public String getName() {
        return "FileInventoryRouteCamelServiceFactory";
    }

    @SuppressWarnings("unchecked")
    public void init() {
        Dictionary properties = new Properties();
        properties.put( Constants.SERVICE_PID, "camelinaction.fileinventoryroutefactory");
        registration = bundleContext.registerService(ManagedServiceFactory.class.getName(), this, properties);
        
        LOG.info("FileInventoryRouteCamelServiceFactory ready to accept new config with PID=camelinaction.fileinventoryroutefactory-xxx");
    }
    
    @Override
    public void updated(String pid, Dictionary<String, ?> properties) throws ConfigurationException {
        String path = (String) properties.get("path");

        LOG.info("Updating route for PID=" + pid + " with new path=" + path);
        
        // need to remove old route before updating
        deleted(pid);

        // now we create a new route with update path
        FileInventoryRoute newRoute = new FileInventoryRoute();
        newRoute.setInputPath(path);
        newRoute.setRouteId("file-" + pid);
        
        // finally we add the route
        try {
            camelContext.addRoutes(newRoute);
        } catch (Exception e) {
            LOG.error("Failed to add route", e);
        }
        routes.put(pid, newRoute);
    }

    @Override
    public void deleted(String pid) {
        LOG.info("Deleting route with PID=" + pid);
        
        try {
            FileInventoryRoute route = routes.get(pid);
            if (route != null) {
                camelContext.stopRoute(route.getRouteId());
                camelContext.removeRoute(route.getRouteId());
                routes.remove(pid);
            }
        } catch (Exception e) {
            LOG.error("Failed to remove route", e);
        }
    }       
   
    public BundleContext getBundleContext() {
        return bundleContext;
    }

    public void setBundleContext(BundleContext bundleContext) {
        this.bundleContext = bundleContext;
    }

    public CamelContext getCamelContext() {
        return camelContext;
    }

    public void setCamelContext(CamelContext camelContext) {
        this.camelContext = camelContext;
    }
}

@@ -1353,16 +1353,29 @@
  accept 
+%22 +%0A        %22
 new conf

break long line