/**
* Copyright (c) 2009 Farata Systems http://www.faratasystems.com
*
* Licensed under The MIT License
* Re-distributions of files must retain the above copyright notice.
*
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
*
*/
package com.farata.dto2extjs.asap;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import com.farata.dto2extjs.annotations.JSClassKind;
import com.farata.dto2extjs.asap.env.IEnvironmentInspector;
import com.sun.mirror.apt.AnnotationProcessorEnvironment;
import com.sun.mirror.apt.Messager;
public class JSAnnotationProcessorOptions {
final private AnnotationProcessorEnvironment _env;
final private IEnvironmentInspector _inspector;
private File _output;
private boolean _reconcile = false;
private boolean _dumpMetadata = false;
private boolean _numberAsString = false;
private JSClassKind _defaultClassKind = JSClassKind.DEFAULT;
private JSClassKind _defaultEnumKind = JSClassKind.STRING_CONSTANTS;
private INameTransformer _classNameTransformer = INameTransformer.NOP;
private INameTransformer _packagePathTransformer = INameTransformer.NOP;
public JSAnnotationProcessorOptions(final AnnotationProcessorEnvironment env, final IEnvironmentInspector inspector) {
_env = env;
_inspector = inspector;
}
public boolean parse() {
boolean isValid = true;
final Map<String, String> options = antFix( _env.getOptions() );
final Messager messager = _env.getMessager();
final String reconsiliationOption = options.get(RECONCILE_PARAM);
if (null != reconsiliationOption) {
if ("yes".equalsIgnoreCase(reconsiliationOption) || "true".equalsIgnoreCase(reconsiliationOption) )
_reconcile = true;
else if ("no".equalsIgnoreCase(reconsiliationOption) || "false".equalsIgnoreCase(reconsiliationOption))
_reconcile = false;
else {
messager.printError(
"Invalid value of reconsilation option. " +
"Please use true/false/yes/no as " + RECONCILE_PARAM + " value."
);
isValid = false;
}
}
final String output = options.get(OUTPUT_DIR_PARAM);
if (null == output) {
messager.printError(
"Output directory is not specified. " +
"Please use " + OUTPUT_DIR_PARAM + " option of APT " +
"define full or workspace relative path to output directory."
);
isValid = false;
} else {
_output = _inspector.resolveOutputFolder(output);
try {
if (_output.exists() ) {
if ( !_output.isDirectory() ) {
messager.printError(
"Path specified via " + OUTPUT_DIR_PARAM + " option " +
"is a file rather then directory (" + _output.getCanonicalPath() + ")."
);
isValid = false;
}
} else {
isValid = _output.mkdirs();
if (!isValid)
messager.printError(
"Unable to create directory defined via " + OUTPUT_DIR_PARAM + " option " +
"(" + _output.getCanonicalPath() + ")."
);
}
} catch (final IOException ex) {
messager.printError( ex.getLocalizedMessage() );
}
}
final String defaultClassKind = options.get(DEFAULT_CLASS_KIND_PARAM);
if (null != defaultClassKind && defaultClassKind.length() > 0) {
if ( "ext-js".equalsIgnoreCase(defaultClassKind) )
_defaultClassKind = JSClassKind.EXT_JS;
else if ( "classic".equalsIgnoreCase(defaultClassKind) )
_defaultClassKind = JSClassKind.CLASSIC;
else {
messager.printError(
"Invalid value of default class kind option. " +
"Please use ext-js/classic as " + DEFAULT_CLASS_KIND_PARAM + " value."
);
isValid = false;
}
}
final String defaultEnumKind = options.get(DEFAULT_ENUM_KIND_PARAM);
if (null != defaultEnumKind && defaultEnumKind.length() > 0) {
if ( "ext-js".equalsIgnoreCase(defaultEnumKind) )
_defaultEnumKind = JSClassKind.EXT_JS;
else if ( "string-constants".equalsIgnoreCase(defaultEnumKind) )
_defaultEnumKind = JSClassKind.STRING_CONSTANTS;
else {
messager.printError(
"Invalid value of default enum kind option. " +
"Please use ext-js/string-constants as " + DEFAULT_ENUM_KIND_PARAM + " value."
);
isValid = false;
}
}
final String dumpMetadata = options.get(MDDUMP_PARAM);
if (null != dumpMetadata) {
if ("yes".equalsIgnoreCase(dumpMetadata) || "true".equalsIgnoreCase(dumpMetadata))
_dumpMetadata = true;
else if ("no".equalsIgnoreCase(dumpMetadata) || "false".equalsIgnoreCase(dumpMetadata))
_dumpMetadata = false;
else {
messager.printError(
"Invalid value of metadata dump option. " +
"Please use true/false/yes/no as " + MDDUMP_PARAM + " value."
);
isValid = false;
}
}
final String numberAsString = options.get(NUMBER_AS_STRING);
if (null != numberAsString) {
if ("yes".equalsIgnoreCase(numberAsString) || "true".equalsIgnoreCase(numberAsString))
_numberAsString = true;
else if ("no".equalsIgnoreCase(numberAsString) || "false".equalsIgnoreCase(numberAsString))
_numberAsString = false;
else {
messager.printError(
"Invalid value of number as string option. " +
"Please use true/false/yes/no as " + NUMBER_AS_STRING + " value."
);
isValid = false;
}
}
final String classNameTransformer = options.get(CLASS_NAME_TRANSFORMER);
if (null != classNameTransformer && classNameTransformer.trim().length() > 0) {
_classNameTransformer = new PatternClassNameTransformer(classNameTransformer);
}
final String packagePathTransformer = options.get(PACKAGE_PATH_TRANSFORMER);
if (null != packagePathTransformer && packagePathTransformer.trim().length() > 0) {
_packagePathTransformer = new PatternPackageNameTransformer(packagePathTransformer);
}
return isValid;
}
public File output() { return _output; }
public boolean reconcile() { return _reconcile; }
public boolean dumpMetadata() { return _dumpMetadata; }
public boolean numberAsString() { return _numberAsString; }
public JSClassKind defaultClassKind() { return _defaultClassKind; }
public JSClassKind defaultEnumKind() { return _defaultEnumKind; }
public INameTransformer classNameTransformer() { return _classNameTransformer; }
public INameTransformer packagePathTransformer() { return _packagePathTransformer; }
private static Map<String,String> antFix(final Map<String,String> options) {
final Map<String, String> result = new HashMap<String, String>( options.size() );
for (final Map.Entry<String, String> e : options.entrySet()) {
final String key = e.getKey();
final String value = e.getValue();
if ( null == value ) {
final int pos = key.indexOf('=');
if (pos > 0 && pos < key.length() - 1) {
final String realKey = key.substring(0, pos);
final String realValue = key.substring(pos + 1);
result.put(realKey, realValue);
}
else
result.put(key, value);
} else
result.put( key, value );
}
return result;
}
final public static String OUTPUT_DIR_PARAM
= "-Acom.faratasystems.dto2extjs.output";
final public static String RECONCILE_PARAM
= "-Acom.faratasystems.dto2extjs.reconcile";
final public static String DEFAULT_CLASS_KIND_PARAM
= "-Acom.faratasystems.dto2extjs.default-class-kind";
final public static String DEFAULT_ENUM_KIND_PARAM
= "-Acom.faratasystems.dto2extjs.default-enum-kind";
final public static String MDDUMP_PARAM
= "-Acom.faratasystems.dto2extjs.md_dump";
final public static String NUMBER_AS_STRING
= "-Acom.faratasystems.dto2extjs.number-as-string";
final public static String CLASS_NAME_TRANSFORMER
= "-Acom.faratasystems.dto2extjs.class-name-transformer";
final public static String PACKAGE_PATH_TRANSFORMER
= "-Acom.faratasystems.dto2extjs.package-path-transformer";
final public static Collection<String> SUPPORTED_OPTIONS
= Arrays.asList(
OUTPUT_DIR_PARAM,
RECONCILE_PARAM,
DEFAULT_CLASS_KIND_PARAM, DEFAULT_ENUM_KIND_PARAM,
NUMBER_AS_STRING,
CLASS_NAME_TRANSFORMER,
PACKAGE_PATH_TRANSFORMER,
MDDUMP_PARAM
);
}