/*
* eXist Open Source Native XML Database
* Copyright (C) 2012 The eXist Project
* http://exist-db.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* $Id$
*/
package org.exist.scheduler;
import org.exist.config.Configurable;
import org.exist.config.Configuration;
import org.exist.config.ConfigurationException;
import org.exist.config.Configurator;
import org.exist.config.annotation.ConfigurationClass;
import org.exist.config.annotation.ConfigurationFieldAsAttribute;
import org.exist.config.annotation.ConfigurationFieldAsElement;
import org.exist.security.AbstractAccount;
import org.exist.security.SecurityManager;
import org.exist.security.Subject;
import org.exist.security.internal.SubjectAccreditedImpl;
/**
* @author <a href="mailto:shabanovd@gmail.com">Dmitriy Shabanov</a>
*
*/
@ConfigurationClass("job")
public class Job implements Configurable {
protected static final String DETAILS = "DETAILs";
@ConfigurationFieldAsAttribute("id")
private String id;
@ConfigurationFieldAsElement("name")
private String name;
@ConfigurationFieldAsElement("group")
private String group;
@ConfigurationFieldAsElement("class")
private String clazz;
@ConfigurationFieldAsElement("run-as-account")
private String account;
@ConfigurationFieldAsElement("script-uri")
protected String scriptURI;
@ConfigurationFieldAsElement("cron-expression")
private String cronExpression;
private Configuration configuration;
private SchedulerManager manager;
public Job(final SchedulerManager manager, final Configuration config) throws ConfigurationException {
this.manager = manager;
this.configuration = Configurator.configure(this, config);
final JobDescription jobDescription;
if(scriptURI != null && !scriptURI.isEmpty()) {
jobDescription = new UserXQueryJob(name, scriptURI, getSubject());
} else {
//TODO implement support for Java Jobs
try {
final Class<?> jobClass = Class.forName(clazz);
final Object jobObject = jobClass.newInstance();
if(jobObject instanceof UserJavaJob) {
jobDescription = (JobDescription)jobClass.newInstance();
if(jobDescription.getName() == null) {
jobDescription.setName(name);
}
} else {
throw new ConfigurationException("Java Jobs must extend org.exist.scheduler.UserJavaJob");
}
} catch(final ClassNotFoundException cnfe) {
throw new ConfigurationException("No such class: " + clazz, cnfe);
} catch(final InstantiationException ie) {
throw new ConfigurationException("Cannot instantiate class: " + clazz, ie);
} catch(final IllegalAccessException ie) {
throw new ConfigurationException("Cannot instantiate class: " + clazz, ie);
}
}
manager.getScheduler().createCronJob(cronExpression, jobDescription, null, true);
}
private Subject getSubject() {
final Subject subject;
final SecurityManager sm = manager.getDatabase().getSecurityManager();
if(account == null || account.isEmpty()) {
subject = manager.getDatabase().getSecurityManager().getGuestSubject();
} else {
final AbstractAccount acc = (AbstractAccount) sm.getAccount(account);
if(acc == null) {
//UNDERSTAND: error better here?
subject = sm.getGuestSubject();
} else {
subject = new SubjectAccreditedImpl(acc, this);
}
}
return subject;
}
@Override
public boolean isConfigured() {
return configuration != null;
}
@Override
public Configuration getConfiguration() {
return configuration;
}
}