/*
* #%L
* Talend :: ESB :: Job :: Controller
* %%
* Copyright (C) 2011 - 2012 Talend Inc.
* %%
* 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.
* #L%
*/
package org.talend.esb.job.controller.internal;
import java.util.logging.Logger;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Filter;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
import routines.system.api.TalendESBJob;
import routines.system.api.TalendESBJobFactory;
import routines.system.api.TalendESBRoute;
import routines.system.api.TalendJob;
/**
* Tracks registration and unregistration of all type of jobs and notifies a corresponding listener.
*/
public class JobTracker {
private static final Logger LOG = Logger.getLogger(JobTracker.class.getName());
private static final String FILTER =
"(objectClass=" + TalendJob.class.getName() + ")";
private static final String PROPERTY_KEY_NAME = "name";
private static final String PROPERTY_KEY_MT = "multithreading";
private BundleContext context;
private JobListener listener;
private ServiceTracker tracker;
public void setJobListener(JobListener jobListener) {
listener = jobListener;
}
public void setBundleContext(BundleContext bundleContext) {
context = bundleContext;
}
public void bind() {
LOG.fine("bind calling, creating and opening ServiceTracker...");
Filter filter = null;
try {
filter = context.createFilter(FILTER);
} catch (InvalidSyntaxException e) {
LOG.throwing(this.getClass().getName(), "bind", e);
}
tracker = new ServiceTracker(context, filter, new Customizer());
tracker.open();
}
public void unbind() {
LOG.fine("unbind calling, closing ServiceTracker...");
if (tracker != null) {
tracker.close();
}
}
private String getValue(String name, ServiceReference sRef) {
return getValue(name, sRef, true);
}
private String getValue(String name, ServiceReference sRef, boolean mandatory) {
Object val = sRef.getProperty(name);
if (val != null && !(val instanceof String)) {
throw new IllegalArgumentException(
name + " property of TalendJob not of type String");
}
if (val == null && mandatory) {
throw new IllegalArgumentException(
name + " property of TalendJob is mandatory but not defined");
}
return (String) val;
}
private class Customizer implements ServiceTrackerCustomizer {
@Override
public Object addingService(ServiceReference reference) {
LOG.info("Service with reference " + reference + " added");
Object service = context.getService(reference);
if (service != null) {
String name = getValue(PROPERTY_KEY_NAME, reference);
boolean isMultiThreading = Boolean.parseBoolean(getValue(PROPERTY_KEY_MT, reference, false));
if (service instanceof TalendESBJobFactory) {
listener.esbJobFactoryAdded((TalendESBJobFactory) service, name);
} else if (service instanceof TalendESBJob && !isMultiThreading) {
listener.esbJobAdded((TalendESBJob) service, name);
} else if (service instanceof TalendESBRoute) {
listener.routeAdded((TalendESBRoute) service, name);
} else if (service instanceof TalendJob) {
listener.jobAdded((TalendJob)service, name);
}
}
return service;
}
@Override
public void modifiedService(ServiceReference reference, Object job) {
LOG.info("Service " + job + " modified");
}
@Override
public void removedService(ServiceReference reference, Object service) {
LOG.info("Service " + service + " removed");
String name = getValue(PROPERTY_KEY_NAME, reference);
boolean isMultiThreading = Boolean.parseBoolean(getValue(PROPERTY_KEY_MT, reference, false));
if (service instanceof TalendESBJobFactory) {
listener.esbJobFactoryRemoved((TalendESBJobFactory) service, name);
} else if (service instanceof TalendESBJob && !isMultiThreading) {
listener.esbJobRemoved((TalendESBJob) service, name);
} else if (service instanceof TalendESBRoute) {
listener.routeRemoved((TalendESBRoute) service, name);
} else if (service instanceof TalendJob) {
listener.jobRemoved((TalendJob)service, name);
}
context.ungetService(reference);
}
}
}