package org.apache.axis2.schema;

import org.apache.axis2.schema.i18n.SchemaCompilerMessages;

import java.io.File;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Map;
import java.util.HashMap;
/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * 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.
 */

/**
 * This is a bean class that captures all the compiler options.
 * Right now the compiler options consist of the following
 * 1. output file location - A folder with necessary rights for the
 * schema compiler to write the files
 * 2.package name
 * 3.namespace to package map
 * 4.boolean flag marking whether to wrap or unwrap
 * 4.boolean flag marking whether to write classes or not
 */
public class CompilerOptions {

    /**
     * Generated output file
     */
    private File outputLocation;
    private String packageName = null;
    private boolean generateAll = false;

    /**
     * Package for the mapper
     */
    private String mapperClassPackage = null;

    public String getMapperClassPackage() {
        return mapperClassPackage;
    }

    public void setMapperClassPackage(String mapperClassPackage) {
        this.mapperClassPackage = mapperClassPackage;
    }

    /**
     * get whether the mapper class package
     * name is present
     */
    public boolean isMapperClassPackagePresent(){
        return   (mapperClassPackage!=null &&
                       !"".equals(mapperClassPackage));
    }
    /**
     * The flag keeping whether seperate helpers
     * need to be generated or not
     */
    private boolean helperMode = false;
    
    public boolean isHelperMode() {
        return helperMode;
    }

    public void setHelperMode(boolean helperMode) {
        this.helperMode = helperMode;
    }
    
    /**
     * Keep track of the namespace and packages mapping
     */
    private Map ns2PackageMap = new HashMap();

    public Map getNs2PackageMap() {
        return ns2PackageMap;
    }

    public void setNs2PackageMap(Map ns2PackageMap) {
        this.ns2PackageMap = ns2PackageMap;
    }

    /**
     * This flag tells the databinder to either write the output or
     * not. if this is set to true it will write the output at once.
     * if not the outputter will populate the 
     */
    private boolean writeOutput = false;

    /**
     * This flag determines whether the generated classes are wrapped or not
     * if the wrapper flag is true, then only a single file will be generated
     */
    private boolean wrapClasses = false;

    public boolean isWriteOutput() {
        return writeOutput;
    }

    public void setWriteOutput(boolean writeOutput) {
        this.writeOutput = writeOutput;
    }

    public boolean isWrapClasses() {
        return wrapClasses;
    }

    public void setWrapClasses(boolean wrapClasses) {
        this.wrapClasses = wrapClasses;
    }

    public String getPackageName() {
        return packageName;
    }

    public CompilerOptions setPackageName(String packageName) {
        // Validate the package name.
        if (packageName != null && testValue(packageName)) {
            this.packageName = packageName;
        } else {
            throw new RuntimeException(SchemaCompilerMessages.getMessage("schema.unsupportedvalue"));
        }
        return this;
    }

    public File getOutputLocation() {
        return outputLocation;
    }

    public CompilerOptions setOutputLocation(File outputLocation) {
        this.outputLocation = outputLocation;
        return this;
    }

    private boolean testValue(String wordToMatch) {
        Pattern pat = Pattern.compile("^(\\w+\\.)+$");
        Matcher m = pat.matcher(wordToMatch);
        return m.matches();
    }
    
    public boolean isGenerateAll() {
        return generateAll;
    }

    public void setGenerateAll(boolean generateAll) {
        this.generateAll = generateAll;
    }
	/**
	 * This flag determines whether the generated classes are expected to be
	 * backword compatible with Axis 1.x
	 */
	private boolean backwordCompatibilityMode = false;

	public boolean isBackwordCompatibilityMode() {
		return backwordCompatibilityMode;
	}

	public void setBackwordCompatibilityMode(boolean backwordCompatibilityMode) {
		this.backwordCompatibilityMode = backwordCompatibilityMode;
	}

    /**
     * Should we suppress namespace prefixes
     */
    private boolean suppressPrefixesMode = false;

    public boolean isSuppressPrefixesMode() {
        return suppressPrefixesMode;
    }

    public void setSuppressPrefixesMode(boolean suppressPrefixesMode) {
        this.suppressPrefixesMode = suppressPrefixesMode;
    }
}
