// Path: src/main/java/com/leansoft/mxjc/model/FileInfo.java
// public class FileInfo {
// 
// 	// name of the file
// 	private String name;
// 
// 	// suffix of the file name
// 	private String suffix;
// 
// 	// relative path of the file
// 	private String path;
// 
// 	// content of the file
// 	private byte[] content;
// 
// 	public String getName() {
// 		return name;
// 	}
// 
// 	/**
// 	 * Set the name of the file
// 	 * 
// 	 * @param name
// 	 */
// 	public void setName(String name) {
// 		this.name = name;
// 	}
// 
// 	public String getSuffix() {
// 		return suffix;
// 	}
// 
// 	/**
// 	 * Set the suffix of the file
// 	 * 
// 	 * @param suffix
// 	 */
// 	public void setSuffix(String suffix) {
// 		this.suffix = suffix;
// 	}
// 
// 	/**
// 	 * The relative path of this file, derived from package name,
// 	 * 
// 	 * may return null if the file resides in default pacakge.
// 	 * 
// 	 * @return
// 	 */
// 	public String getPath() {
// 		return path;
// 	}
// 
// 	/**
// 	 * Set the relative path of the file
// 	 * 
// 	 * @param path
// 	 */
// 	public void setPath(String path) {
// 		this.path = path;
// 	}
// 
// 	public byte[] getContent() {
// 		return content;
// 	}
// 	
// 	/**
// 	 * Set the content of the file
// 	 * 
// 	 * @param content
// 	 */
// 	public void setContent(byte[] content) {
// 		this.content = content;
// 	}
// 	
// 	/**
// 	 * full name of the file(name.suffix)
// 	 * @return full name
// 	 */
// 	public String getFullname() {
// 		return name + "." + suffix;
// 	}
// 	
// 	/**
// 	 * Does this file resides in the default package
// 	 * 
// 	 * @return true if this file resides in the default package, false otherwise
// 	 */
// 	public boolean isInDefaultPackage() {
// 		if (path == null || path.trim().length() == 0) {
// 			return true;
// 		} else {
// 			return false;
// 		}
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		final int prime = 31;
// 		int result = 1;
// 		result = prime * result + ((name == null) ? 0 : name.hashCode());
// 		result = prime * result + ((path == null) ? 0 : path.hashCode());
// 		result = prime * result + ((suffix == null) ? 0 : suffix.hashCode());
// 		return result;
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		if (this == obj)
// 			return true;
// 		if (obj == null)
// 			return false;
// 		if (getClass() != obj.getClass())
// 			return false;
// 		FileInfo other = (FileInfo) obj;
// 		if (name == null) {
// 			if (other.name != null)
// 				return false;
// 		} else if (!name.equals(other.name))
// 			return false;
// 		if (path == null) {
// 			if (other.path != null)
// 				return false;
// 		} else if (!path.equals(other.path))
// 			return false;
// 		if (suffix == null) {
// 			if (other.suffix != null)
// 				return false;
// 		} else if (!suffix.equals(other.suffix))
// 			return false;
// 		return true;
// 	}
// }


import java.io.ByteArrayOutputStream;
import java.net.URL;
import org.xml.sax.helpers.LocatorImpl;
import com.leansoft.mxjc.model.FileInfo;
import com.sun.tools.xjc.ErrorReceiver;
import freemarker.template.SimpleHash;
package com.leansoft.mxjc.module;





/**
 * Common client module
 * 
 * @author bulldog
 * 
 */
public abstract class AbstractClientModule implements ClientModule {
	
	private ErrorReceiver errorReceiver;

	/**
	 * Get freemarker datamodel
	 * 
	 * @return a new SimpleHash instance
	 */
	protected SimpleHash getFreemarkerModel() {
		return new SimpleHash();
	}
	
	/**
	 * Set ErrorReceiver instance to be used for error reporting
	 */
	public void setErrorReceiver(ErrorReceiver errorReceiver) {
		this.errorReceiver = errorReceiver;
	}
	
	/**
	 * Get a template URL for the template of the given name.
	 * 
	 * @param template
	 *            The specified template.
	 * @return The URL to the specified template.
	 * @throws XjcModuleException
	 */
	abstract protected URL getTemplateURL(String template) throws XjcModuleException;
	

	/**
	 * Generate files according to specific template, datamodel and file
	 * information,
	 * 
	 * No cache for this interface
	 * 
	 * @param template
	 *            , template URL
	 * @param fmModel
	 *            , freemarker datamodel
	 * @param fileName
	 *            , file name
	 * @param suffix
	 *            , file suffix
	 * @param relativePath
	 *            , file relative path(such as a\b\c)         
	 * @return FileInfo instance
	 * @throws XjcModuleException
	 */
// Path: src/main/java/com/leansoft/mxjc/model/FileInfo.java
// public class FileInfo {
// 
// 	// name of the file
// 	private String name;
// 
// 	// suffix of the file name
// 	private String suffix;
// 
// 	// relative path of the file
// 	private String path;
// 
// 	// content of the file
// 	private byte[] content;
// 
// 	public String getName() {
// 		return name;
// 	}
// 
// 	/**
// 	 * Set the name of the file
// 	 * 
// 	 * @param name
// 	 */
// 	public void setName(String name) {
// 		this.name = name;
// 	}
// 
// 	public String getSuffix() {
// 		return suffix;
// 	}
// 
// 	/**
// 	 * Set the suffix of the file
// 	 * 
// 	 * @param suffix
// 	 */
// 	public void setSuffix(String suffix) {
// 		this.suffix = suffix;
// 	}
// 
// 	/**
// 	 * The relative path of this file, derived from package name,
// 	 * 
// 	 * may return null if the file resides in default pacakge.
// 	 * 
// 	 * @return
// 	 */
// 	public String getPath() {
// 		return path;
// 	}
// 
// 	/**
// 	 * Set the relative path of the file
// 	 * 
// 	 * @param path
// 	 */
// 	public void setPath(String path) {
// 		this.path = path;
// 	}
// 
// 	public byte[] getContent() {
// 		return content;
// 	}
// 	
// 	/**
// 	 * Set the content of the file
// 	 * 
// 	 * @param content
// 	 */
// 	public void setContent(byte[] content) {
// 		this.content = content;
// 	}
// 	
// 	/**
// 	 * full name of the file(name.suffix)
// 	 * @return full name
// 	 */
// 	public String getFullname() {
// 		return name + "." + suffix;
// 	}
// 	
// 	/**
// 	 * Does this file resides in the default package
// 	 * 
// 	 * @return true if this file resides in the default package, false otherwise
// 	 */
// 	public boolean isInDefaultPackage() {
// 		if (path == null || path.trim().length() == 0) {
// 			return true;
// 		} else {
// 			return false;
// 		}
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		final int prime = 31;
// 		int result = 1;
// 		result = prime * result + ((name == null) ? 0 : name.hashCode());
// 		result = prime * result + ((path == null) ? 0 : path.hashCode());
// 		result = prime * result + ((suffix == null) ? 0 : suffix.hashCode());
// 		return result;
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		if (this == obj)
// 			return true;
// 		if (obj == null)
// 			return false;
// 		if (getClass() != obj.getClass())
// 			return false;
// 		FileInfo other = (FileInfo) obj;
// 		if (name == null) {
// 			if (other.name != null)
// 				return false;
// 		} else if (!name.equals(other.name))
// 			return false;
// 		if (path == null) {
// 			if (other.path != null)
// 				return false;
// 		} else if (!path.equals(other.path))
// 			return false;
// 		if (suffix == null) {
// 			if (other.suffix != null)
// 				return false;
// 		} else if (!suffix.equals(other.suffix))
// 			return false;
// 		return true;
// 	}
// }


// Path: src/main/java/com/leansoft/mxjc/module/AbstractClientModule.java
import java.io.ByteArrayOutputStream;
import java.net.URL;
import org.xml.sax.helpers.LocatorImpl;
import com.leansoft.mxjc.model.FileInfo;
import com.sun.tools.xjc.ErrorReceiver;
import freemarker.template.SimpleHash;

package com.leansoft.mxjc.module;





/**
 * Common client module
 * 
 * @author bulldog
 * 
 */
public abstract class AbstractClientModule implements ClientModule {
	
	private ErrorReceiver errorReceiver;

	/**
	 * Get freemarker datamodel
	 * 
	 * @return a new SimpleHash instance
	 */
	protected SimpleHash getFreemarkerModel() {
		return new SimpleHash();
	}
	
	/**
	 * Set ErrorReceiver instance to be used for error reporting
	 */
	public void setErrorReceiver(ErrorReceiver errorReceiver) {
		this.errorReceiver = errorReceiver;
	}
	
	/**
	 * Get a template URL for the template of the given name.
	 * 
	 * @param template
	 *            The specified template.
	 * @return The URL to the specified template.
	 * @throws XjcModuleException
	 */
	abstract protected URL getTemplateURL(String template) throws XjcModuleException;
	

	/**
	 * Generate files according to specific template, datamodel and file
	 * information,
	 * 
	 * No cache for this interface
	 * 
	 * @param template
	 *            , template URL
	 * @param fmModel
	 *            , freemarker datamodel
	 * @param fileName
	 *            , file name
	 * @param suffix
	 *            , file suffix
	 * @param relativePath
	 *            , file relative path(such as a\b\c)         
	 * @return FileInfo instance
	 * @throws XjcModuleException
	 */
	protected FileInfo generateFile(URL template, Object fmModel,