// Path: src/main/java/org/mybatis/generator/exception/InvalidConfigurationException.java
// public class InvalidConfigurationException extends Exception {
//     static final long serialVersionUID = 4902307610148543411L;
// 
//     private List<String> errors;
// 
//     /**
//      *  
//      */
//     public InvalidConfigurationException(List<String> errors) {
//         super();
//         this.errors = errors;
//     }
// 
//     public List<String> getErrors() {
//         return errors;
//     }
// 
//     @Override
//     public String getMessage() {
//         if (errors != null && errors.size() > 0) {
//             return errors.get(0);
//         }
// 
//         return super.getMessage();
//     }
// }
// 
// Path: src/main/java/org/mybatis/generator/exception/XMLParserException.java
// public class XMLParserException extends Exception {
// 
//     private static final long serialVersionUID = 5172525430401340573L;
// 
//     private List<String> errors;
// 
//     /**
// 	 *  
// 	 */
//     public XMLParserException(List<String> errors) {
//         super();
//         this.errors = errors;
//     }
// 
//     public XMLParserException(String error) {
//         super(error);
//         this.errors = new ArrayList<String>();
//         errors.add(error);
//     }
// 
//     public List<String> getErrors() {
//         return errors;
//     }
// 
//     @Override
//     public String getMessage() {
//         if (errors != null && errors.size() > 0) {
//             return errors.get(0);
//         }
// 
//         return super.getMessage();
//     }
// }
// 
// Path: src/main/java/org/mybatis/generator/internal/DefaultShellCallback.java
// public class DefaultShellCallback implements ShellCallback {
//     private boolean overwrite;
// 
//     /**
//      *  
//      */
//     public DefaultShellCallback(boolean overwrite) {
//         super();
//         this.overwrite = overwrite;
//     }
// 
//     public File getDirectory(String targetProject, String targetPackage)
//             throws ShellException {
//         // targetProject is interpreted as a directory that must exist
//         //
//         // targetPackage is interpreted as a sub directory, but in package
//         // format (with dots instead of slashes). The sub directory will be
//         // created
//         // if it does not already exist
// 
//         File project = new File(targetProject);
//         if (!project.isDirectory()) {
//             throw new ShellException(getString("Warning.9", //$NON-NLS-1$
//                     targetProject));
//         }
// 
//         StringBuilder sb = new StringBuilder();
//         StringTokenizer st = new StringTokenizer(targetPackage, "."); //$NON-NLS-1$
//         while (st.hasMoreTokens()) {
//             sb.append(st.nextToken());
//             sb.append(File.separatorChar);
//         }
// 
//         File directory = new File(project, sb.toString());
//         if (!directory.isDirectory()) {
//             boolean rc = directory.mkdirs();
//             if (!rc) {
//                 throw new ShellException(getString("Warning.10", //$NON-NLS-1$
//                         directory.getAbsolutePath()));
//             }
//         }
// 
//         return directory;
//     }
// 
//     public void refreshProject(String project) {
//         // nothing to do in the default shell callback
//     }
// 
//     public boolean isMergeSupported() {
//         return false;
//     }
// 
//     public boolean isOverwriteEnabled() {
//         return overwrite;
//     }
// 
//     public String mergeJavaFile(String newFileSource,
//             String existingFileFullPath, String[] javadocTags, String fileEncoding)
//             throws ShellException {
//         throw new UnsupportedOperationException();
//     }
// }


import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
import org.mybatis.generator.logging.LogFactory;
import static org.mybatis.generator.internal.util.messages.Messages.getString;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
        	
        	//配置文件构建对象
            ConfigurationParser cp = new ConfigurationParser(warnings);
            Configuration config = cp.parseConfiguration(configurationFile);

            DefaultShellCallback shellCallback = new DefaultShellCallback(
                    arguments.containsKey(OVERWRITE));

            MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, shellCallback, warnings);

            ProgressCallback progressCallback = arguments.containsKey(VERBOSE) ? new VerboseProgressCallback()
                    : null;

            //传入文件名啊fullyqualifiedTables
            myBatisGenerator.generate(progressCallback, contexts, fullyqualifiedTables);

        } catch (XMLParserException e) {
            writeLine(getString("Progress.3")); //$NON-NLS-1$
            writeLine();
            for (String error : e.getErrors()) {
                writeLine(error);
            }

            return;
        } catch (SQLException e) {
            e.printStackTrace();
            return;
        } catch (IOException e) {
            e.printStackTrace();
            return;
// Path: src/main/java/org/mybatis/generator/exception/InvalidConfigurationException.java
// public class InvalidConfigurationException extends Exception {
//     static final long serialVersionUID = 4902307610148543411L;
// 
//     private List<String> errors;
// 
//     /**
//      *  
//      */
//     public InvalidConfigurationException(List<String> errors) {
//         super();
//         this.errors = errors;
//     }
// 
//     public List<String> getErrors() {
//         return errors;
//     }
// 
//     @Override
//     public String getMessage() {
//         if (errors != null && errors.size() > 0) {
//             return errors.get(0);
//         }
// 
//         return super.getMessage();
//     }
// }
// 
// Path: src/main/java/org/mybatis/generator/exception/XMLParserException.java
// public class XMLParserException extends Exception {
// 
//     private static final long serialVersionUID = 5172525430401340573L;
// 
//     private List<String> errors;
// 
//     /**
// 	 *  
// 	 */
//     public XMLParserException(List<String> errors) {
//         super();
//         this.errors = errors;
//     }
// 
//     public XMLParserException(String error) {
//         super(error);
//         this.errors = new ArrayList<String>();
//         errors.add(error);
//     }
// 
//     public List<String> getErrors() {
//         return errors;
//     }
// 
//     @Override
//     public String getMessage() {
//         if (errors != null && errors.size() > 0) {
//             return errors.get(0);
//         }
// 
//         return super.getMessage();
//     }
// }
// 
// Path: src/main/java/org/mybatis/generator/internal/DefaultShellCallback.java
// public class DefaultShellCallback implements ShellCallback {
//     private boolean overwrite;
// 
//     /**
//      *  
//      */
//     public DefaultShellCallback(boolean overwrite) {
//         super();
//         this.overwrite = overwrite;
//     }
// 
//     public File getDirectory(String targetProject, String targetPackage)
//             throws ShellException {
//         // targetProject is interpreted as a directory that must exist
//         //
//         // targetPackage is interpreted as a sub directory, but in package
//         // format (with dots instead of slashes). The sub directory will be
//         // created
//         // if it does not already exist
// 
//         File project = new File(targetProject);
//         if (!project.isDirectory()) {
//             throw new ShellException(getString("Warning.9", //$NON-NLS-1$
//                     targetProject));
//         }
// 
//         StringBuilder sb = new StringBuilder();
//         StringTokenizer st = new StringTokenizer(targetPackage, "."); //$NON-NLS-1$
//         while (st.hasMoreTokens()) {
//             sb.append(st.nextToken());
//             sb.append(File.separatorChar);
//         }
// 
//         File directory = new File(project, sb.toString());
//         if (!directory.isDirectory()) {
//             boolean rc = directory.mkdirs();
//             if (!rc) {
//                 throw new ShellException(getString("Warning.10", //$NON-NLS-1$
//                         directory.getAbsolutePath()));
//             }
//         }
// 
//         return directory;
//     }
// 
//     public void refreshProject(String project) {
//         // nothing to do in the default shell callback
//     }
// 
//     public boolean isMergeSupported() {
//         return false;
//     }
// 
//     public boolean isOverwriteEnabled() {
//         return overwrite;
//     }
// 
//     public String mergeJavaFile(String newFileSource,
//             String existingFileFullPath, String[] javadocTags, String fileEncoding)
//             throws ShellException {
//         throw new UnsupportedOperationException();
//     }
// }


// Path: src/main/java/org/mybatis/generator/api/ShellRunner.java
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
import org.mybatis.generator.logging.LogFactory;
import static org.mybatis.generator.internal.util.messages.Messages.getString;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;

        	
        	//配置文件构建对象
            ConfigurationParser cp = new ConfigurationParser(warnings);
            Configuration config = cp.parseConfiguration(configurationFile);

            DefaultShellCallback shellCallback = new DefaultShellCallback(
                    arguments.containsKey(OVERWRITE));

            MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, shellCallback, warnings);

            ProgressCallback progressCallback = arguments.containsKey(VERBOSE) ? new VerboseProgressCallback()
                    : null;

            //传入文件名啊fullyqualifiedTables
            myBatisGenerator.generate(progressCallback, contexts, fullyqualifiedTables);

        } catch (XMLParserException e) {
            writeLine(getString("Progress.3")); //$NON-NLS-1$
            writeLine();
            for (String error : e.getErrors()) {
                writeLine(error);
            }

            return;
        } catch (SQLException e) {
            e.printStackTrace();
            return;
        } catch (IOException e) {
            e.printStackTrace();
            return;
        } catch (InvalidConfigurationException e) {