// Path: src/main/java/com/indeed/proctor/webapp/db/Environment.java
// public enum Environment {
//     WORKING("trunk", 0),
//     QA("qa", 1),
//     PRODUCTION("production", 2);
// 
//     private final String name;
//     private final int precedence;
//     private Environment(final String name, final int precedence) {
//         this.name = name;
//         this.precedence = precedence;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public int getPrecedence() {
//         return precedence;
//     }
// 
//     private static final Map<String, Environment> LOOKUP = Maps.uniqueIndex(ImmutableList.copyOf(Environment.values()), Functions.toStringFunction());
//     public static Environment fromName(String name) {
//         if(name == null) {
//             return null;
//         } else {
//             return LOOKUP.get(name.toLowerCase());
//         }
//     }
// 
//     @Override
//     public String toString() {
//         return this.getName();
//     }
// }
// 
// Path: src/main/java/com/indeed/proctor/webapp/extensions/DefinitionChangeLog.java
// public class DefinitionChangeLog {
//     private final List<String> log = new ArrayList<String>();
//     private final List<Error> errors = new ArrayList<Error>();
//     private final List<ResultUrl> urls = new ArrayList<ResultUrl>();
// 
//     public void logMessage(final String message) {
//         log.add(message);
//     }
// 
//     public void addError(final Error error) {
//         if (error.getMessage() != null) {
//             log.add(error.getMessage());
//         }
//         errors.add(error);
//     }
// 
//     public void addUrl(final String url, final String text ) {
//         this.addUrl(url, text, "");
//     }
// 
//     public void addUrl(final String url, final String text, final String target ) {
//         this.addUrl(new ResultUrl(url, text, target));
//     }
// 
//     public void addUrl(final ResultUrl url){
//         urls.add(url);
//     }
// 
//     public List<ResultUrl> getUrls() {
//         if (!urls.isEmpty()) {
//             return urls;
//         }
//         return null;
//     }
// 
//     public List<String> getLog() {
//         if (!log.isEmpty()) {
//             return log;
//         }
//         return null;
//     }
// 
//     public List<Error> getErrors() {
//         if (!errors.isEmpty()) {
//             return errors;
//         }
//         return null;
//     }
// 
//     public boolean isErrorsFound(){
//         return !errors.isEmpty();
//     }
// }


import com.google.common.base.CharMatcher;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableMap;
import com.indeed.proctor.store.ProctorStore;
import com.indeed.proctor.webapp.db.Environment;
import com.indeed.proctor.webapp.extensions.DefinitionChangeLog;
import java.util.List;
import java.util.Map;
package com.indeed.proctor.webapp.jobs;



public abstract class AbstractJob {
    private final Map<Environment, ProctorStore> stores;

    public AbstractJob(final ProctorStore trunkStore, final ProctorStore qaStore, final ProctorStore productionStore) {
        this.stores = ImmutableMap.of(
                Environment.WORKING, trunkStore,
                Environment.QA, qaStore,
                Environment.PRODUCTION, productionStore
        );
    }

    protected static void validateUsernamePassword(final String username, final String password) throws IllegalArgumentException {
        if (CharMatcher.WHITESPACE.matchesAllOf(Strings.nullToEmpty(username)) || CharMatcher.WHITESPACE.matchesAllOf(Strings.nullToEmpty(password))) {
            throw new IllegalArgumentException("No username or password provided");
        }
    }

    protected static void validateComment(final String comment) throws IllegalArgumentException {
        if (CharMatcher.WHITESPACE.matchesAllOf(Strings.nullToEmpty(comment))) {
            throw new IllegalArgumentException("Comment is required.");
        }
    }

// Path: src/main/java/com/indeed/proctor/webapp/db/Environment.java
// public enum Environment {
//     WORKING("trunk", 0),
//     QA("qa", 1),
//     PRODUCTION("production", 2);
// 
//     private final String name;
//     private final int precedence;
//     private Environment(final String name, final int precedence) {
//         this.name = name;
//         this.precedence = precedence;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public int getPrecedence() {
//         return precedence;
//     }
// 
//     private static final Map<String, Environment> LOOKUP = Maps.uniqueIndex(ImmutableList.copyOf(Environment.values()), Functions.toStringFunction());
//     public static Environment fromName(String name) {
//         if(name == null) {
//             return null;
//         } else {
//             return LOOKUP.get(name.toLowerCase());
//         }
//     }
// 
//     @Override
//     public String toString() {
//         return this.getName();
//     }
// }
// 
// Path: src/main/java/com/indeed/proctor/webapp/extensions/DefinitionChangeLog.java
// public class DefinitionChangeLog {
//     private final List<String> log = new ArrayList<String>();
//     private final List<Error> errors = new ArrayList<Error>();
//     private final List<ResultUrl> urls = new ArrayList<ResultUrl>();
// 
//     public void logMessage(final String message) {
//         log.add(message);
//     }
// 
//     public void addError(final Error error) {
//         if (error.getMessage() != null) {
//             log.add(error.getMessage());
//         }
//         errors.add(error);
//     }
// 
//     public void addUrl(final String url, final String text ) {
//         this.addUrl(url, text, "");
//     }
// 
//     public void addUrl(final String url, final String text, final String target ) {
//         this.addUrl(new ResultUrl(url, text, target));
//     }
// 
//     public void addUrl(final ResultUrl url){
//         urls.add(url);
//     }
// 
//     public List<ResultUrl> getUrls() {
//         if (!urls.isEmpty()) {
//             return urls;
//         }
//         return null;
//     }
// 
//     public List<String> getLog() {
//         if (!log.isEmpty()) {
//             return log;
//         }
//         return null;
//     }
// 
//     public List<Error> getErrors() {
//         if (!errors.isEmpty()) {
//             return errors;
//         }
//         return null;
//     }
// 
//     public boolean isErrorsFound(){
//         return !errors.isEmpty();
//     }
// }


// Path: src/main/java/com/indeed/proctor/webapp/jobs/AbstractJob.java
import com.google.common.base.CharMatcher;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableMap;
import com.indeed.proctor.store.ProctorStore;
import com.indeed.proctor.webapp.db.Environment;
import com.indeed.proctor.webapp.extensions.DefinitionChangeLog;
import java.util.List;
import java.util.Map;

package com.indeed.proctor.webapp.jobs;



public abstract class AbstractJob {
    private final Map<Environment, ProctorStore> stores;

    public AbstractJob(final ProctorStore trunkStore, final ProctorStore qaStore, final ProctorStore productionStore) {
        this.stores = ImmutableMap.of(
                Environment.WORKING, trunkStore,
                Environment.QA, qaStore,
                Environment.PRODUCTION, productionStore
        );
    }

    protected static void validateUsernamePassword(final String username, final String password) throws IllegalArgumentException {
        if (CharMatcher.WHITESPACE.matchesAllOf(Strings.nullToEmpty(username)) || CharMatcher.WHITESPACE.matchesAllOf(Strings.nullToEmpty(password))) {
            throw new IllegalArgumentException("No username or password provided");
        }
    }

    protected static void validateComment(final String comment) throws IllegalArgumentException {
        if (CharMatcher.WHITESPACE.matchesAllOf(Strings.nullToEmpty(comment))) {
            throw new IllegalArgumentException("Comment is required.");
        }
    }

    protected static void logDefinitionChangeLog(final DefinitionChangeLog definitionChangeLog, final String changeName, BackgroundJob backgroundJob) {