/*******************************************************************************
* Copyright (c) 2006-2010 eBay Inc. All Rights Reserved.
* 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
*******************************************************************************/
package org.ebayopensource.turmeric.tools.errorlibrary.builders;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.ebayopensource.turmeric.runtime.common.impl.utils.LogManager;
import org.ebayopensource.turmeric.common.v1.types.CommonErrorData;
import org.ebayopensource.turmeric.common.v1.types.ErrorCategory;
import org.ebayopensource.turmeric.common.v1.types.ErrorSeverity;
import org.ebayopensource.turmeric.tools.codegen.exception.CodeGenFailedException;
import org.ebayopensource.turmeric.tools.codegen.exception.PreProcessFailedException;
import org.ebayopensource.turmeric.tools.errorlibrary.ELDomainInfoHolder;
import org.ebayopensource.turmeric.tools.errorlibrary.ErrorLibraryInputOptions;
import org.ebayopensource.turmeric.tools.errorlibrary.SourceGeneratorErrorLib;
import org.ebayopensource.turmeric.tools.errorlibrary.codegen.ErrorLibraryCodeGenContext;
import org.ebayopensource.turmeric.tools.errorlibrary.util.ErrorLibraryUtils;
import org.ebayopensource.turmeric.common.config.Error;
import org.ebayopensource.turmeric.common.config.ErrorBundle;
import com.sun.codemodel.JBlock;
import com.sun.codemodel.JClass;
import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.JDefinedClass;
import com.sun.codemodel.JExpr;
import com.sun.codemodel.JFieldRef;
import com.sun.codemodel.JInvocation;
import com.sun.codemodel.JMethod;
import com.sun.codemodel.JMod;
import com.sun.codemodel.JType;
import com.sun.codemodel.JVar;
public class ErrorDataCollectionGenerator extends ErrorLibraryBaseGenerator
implements SourceGeneratorErrorLib{
private static final String ERRORDATA_FIELD = "errorData";
private static final String ORGANISATION = "ORGANIZATION";
private static final String ARG_ERRORID = "errorId";
private static final String ARG_SEVERITY = "severity";
private static final String ARG_CATEGORY = "category";
private static final String ARG_ERRORNAME = "errorName";
private static final String ARG_SUBDOMAIN = "subDomain";
private static final String ARG_DOMAIN = "domain";
private static final String ARG_ERROR_GROUP = "errorGroup";
private static final String ARG_METHOD_NAME = "createCommonErrorData";
private static final String ENUM_ERROR_SEVERITY = "ErrorSeverity";
private static final String ENUM_ERROR_CATEGORY = "ErrorCategory";
private static final String ERROR_DATA_CLASSNAME = "ErrorDataCollection";
private static Logger s_logger = LogManager.getInstance(ErrorDataCollectionGenerator.class);
private static ErrorDataCollectionGenerator s_errorDataCollectionGenerator =
new ErrorDataCollectionGenerator();
private ErrorDataCollectionGenerator() {
}
public static ErrorDataCollectionGenerator getInstance() {
return s_errorDataCollectionGenerator;
}
private Logger getLogger() {
return s_logger;
}
public boolean continueOnError() {
return false;
}
public void generate(ErrorLibraryCodeGenContext codeGenContext) throws CodeGenFailedException{
ErrorLibraryInputOptions inputOptions = codeGenContext.getInputOptions();
List<String> listOfDomains = inputOptions.getDomainList();
populateCodeGenContext(codeGenContext, listOfDomains);
getLogger().log(Level.FINE, "Populated CodeGenContext with required data");
StringBuffer codegenFailedMessage = new StringBuffer();
boolean codegenFailed = false;
for (String domainName : listOfDomains) {
try {
generateErrorDataCollection(codeGenContext, domainName);
} catch (PreProcessFailedException exception) {
codegenFailed = true;
codegenFailedMessage.append("ErrorConstants generation for the domain \"").append(domainName)
.append("\" failed. ").append(exception.getMessage()).append("\n\n");
}catch (CodeGenFailedException exception) {
codegenFailed = true;
codegenFailedMessage.append("ErrorDataCollection generation for the domain \"").append(domainName)
.append("\" failed. ").append(exception.getMessage()).append("\n\n");
}
}
if(codegenFailed)
throw new CodeGenFailedException("CodeGen failed : " + codegenFailedMessage.toString());
}
private void generateErrorDataCollection(ErrorLibraryCodeGenContext codeGenContext, String domainName)
throws CodeGenFailedException, PreProcessFailedException{
ELDomainInfoHolder holder = codeGenContext.getDomainInfoMap().get(domainName);
String fullyQualifiedClassName = ErrorLibraryUtils.getFullyQualifiedClassName(holder.getPackageName(),
ERROR_DATA_CLASSNAME);
JCodeModel codeModel = new JCodeModel();
JDefinedClass targetClass = createNewClass(codeModel, fullyQualifiedClassName);
validateMetaData(codeGenContext, domainName);
getLogger().log(Level.FINE, "Validation of Metadata files successful for domain " + domainName);
addFields(codeGenContext, codeModel, targetClass, domainName);
addGetErrorData(codeGenContext, codeModel, targetClass, domainName);
generateJavaFile(codeModel, codeGenContext.getGenJavaSrcDestFolder());
getLogger().log(Level.INFO, "Successfully generated " + fullyQualifiedClassName + " for the domain " + domainName);
}
private void addFields(ErrorLibraryCodeGenContext codeGenContext, JCodeModel codeModel,
JDefinedClass targetClass, String domain) throws CodeGenFailedException{
//--------------------------------------------------------------------------------
// creates
//
// public final static String ORGANIZATION = "eBay";
//
// public final static CommonErrorData svc_factory_cannot_create_svc =
// createCommonErrorData(1000L, (ErrorSeverity.ERROR), (ErrorCategory.SYSTEM),
// "svc_factory_cannot_create_svc", "TurmericRuntime", "System", "testGroup");
//--------------------------------------------------------------------------------
ELDomainInfoHolder holder = codeGenContext.getDomainInfoMap().get(domain);
JClass stringJClass = getJClass(String.class, codeModel);
JClass commonErrorDataClazz = getJClass(CommonErrorData.class, codeModel);
targetClass.field(JMod.PRIVATE | JMod.STATIC | JMod.FINAL, stringJClass, ORGANISATION,
JExpr.lit(codeGenContext.getOrganization()));
ErrorBundle tempErrorBundle = holder.getErrorBundle();
if(tempErrorBundle != null && tempErrorBundle.getErrorlist() != null && tempErrorBundle.getErrorlist().getError() != null){
List<Error> errors = tempErrorBundle.getErrorlist().getError();
for (Error error : errors) {
if(error.getName() != null && ErrorLibraryUtils.validateVariableSemantics(error.getName())){
JInvocation createErrorDataMethodInvocation = JExpr.invoke(ARG_METHOD_NAME);
createErrorDataMethodInvocation.arg(JExpr.lit(error.getId()));
createErrorDataMethodInvocation.arg(JExpr.direct(ENUM_ERROR_SEVERITY + "." + error.getSeverity()));
createErrorDataMethodInvocation.arg(JExpr.direct(ENUM_ERROR_CATEGORY + "." + error.getCategory()));
createErrorDataMethodInvocation.arg(error.getName());
createErrorDataMethodInvocation.arg(domain);
if(error.getSubdomain() != null)
createErrorDataMethodInvocation.arg(error.getSubdomain());
else
createErrorDataMethodInvocation.arg(JExpr.direct("null"));
if(error.getErrorGroup() != null)
createErrorDataMethodInvocation.arg(error.getErrorGroup());
else
createErrorDataMethodInvocation.arg(JExpr.direct("null"));
targetClass.field(JMod.PUBLIC | JMod.STATIC | JMod.FINAL, commonErrorDataClazz, error.getName(),
createErrorDataMethodInvocation);
} else{
CodeGenFailedException codeGenFailedException = new
CodeGenFailedException("The name of the error should not contain any whitespace" +
" character. Pls check your ErrorData.xml or Error.properties");
throw codeGenFailedException;
}
}
getLogger().log(Level.INFO, "Total number of ErrorData objects " + errors.size());
}
}
private void addGetErrorData(ErrorLibraryCodeGenContext codeGenContext, JCodeModel codeModel,
JDefinedClass targetClass, String domain){
//--------------------------------------------------------------------------------------
// private static CommonErrorData createCommonErrorData(long id, ErrorSeverity severity, ErrorCategory category,
// String errorName, String subcategory, String domain, String errorGroup){
// CommonErrorData errorData = new CommonErrorData();
// errorData.setErrorId(id);
// errorData.setSeverity(severity);
// errorData.setCategory(category);
// errorData.setSubdomain(subcategory);
// errorData.setDomain(domain);
// errorData.setErrorGroups(errorGroup);
// errorData.setErrorName(errorName);
// errorData.setOrganization(ORGANIZATION);
//
//
// return errorData;
// }
//----------------------------------------------------------------------------------------
JType returnType = getJType(CommonErrorData.class, codeModel);
JMethod jGetErrorDataMethod = addMethod(targetClass, ARG_METHOD_NAME, JMod.PRIVATE | JMod.STATIC , returnType);
jGetErrorDataMethod.param(codeModel.LONG, ARG_ERRORID);
jGetErrorDataMethod.param(ErrorSeverity.class, ARG_SEVERITY);
jGetErrorDataMethod.param(ErrorCategory.class, ARG_CATEGORY);
jGetErrorDataMethod.param(String.class, ARG_ERRORNAME);
jGetErrorDataMethod.param(String.class, ARG_DOMAIN);
jGetErrorDataMethod.param(String.class, ARG_SUBDOMAIN);
jGetErrorDataMethod.param(String.class, ARG_ERROR_GROUP);
JBlock jGetErrorDataMethodBody = jGetErrorDataMethod.body();
JClass commonErrorDataClazz = getJClass(CommonErrorData.class, codeModel);
JVar returnValue = jGetErrorDataMethodBody.decl(commonErrorDataClazz, ERRORDATA_FIELD, JExpr._new(commonErrorDataClazz));
JFieldRef setErrorIdRef = JExpr.ref(ERRORDATA_FIELD);
JInvocation setErrorIdInvocation = setErrorIdRef.invoke("setErrorId");
setErrorIdInvocation.arg(JExpr.ref(ARG_ERRORID));
jGetErrorDataMethodBody.add(setErrorIdInvocation);
JFieldRef setSeverityRef = JExpr.ref(ERRORDATA_FIELD);
JInvocation setSeverityInvocation = setSeverityRef.invoke("setSeverity");
setSeverityInvocation.arg(JExpr.ref(ARG_SEVERITY));
jGetErrorDataMethodBody.add(setSeverityInvocation);
JFieldRef setCategoryRef = JExpr.ref(ERRORDATA_FIELD);
JInvocation setCategoryInvocation = setCategoryRef.invoke("setCategory");
setCategoryInvocation.arg(JExpr.ref(ARG_CATEGORY));
jGetErrorDataMethodBody.add(setCategoryInvocation);
JFieldRef setSubdomainRef = JExpr.ref(ERRORDATA_FIELD);
JInvocation setSubdomainInvocation = setSubdomainRef.invoke("setSubdomain");
setSubdomainInvocation.arg(JExpr.ref(ARG_SUBDOMAIN));
jGetErrorDataMethodBody.add(setSubdomainInvocation);
JFieldRef setDomainRef = JExpr.ref(ERRORDATA_FIELD);
JInvocation setDomainInvocation = setDomainRef.invoke("setDomain");
setDomainInvocation.arg(JExpr.ref(ARG_DOMAIN));
jGetErrorDataMethodBody.add(setDomainInvocation);
JFieldRef setErrorGroupsRef = JExpr.ref(ERRORDATA_FIELD);
JInvocation setErrorGroupsInvocation = setErrorGroupsRef.invoke("setErrorGroups");
setErrorGroupsInvocation.arg(JExpr.ref(ARG_ERROR_GROUP));
jGetErrorDataMethodBody.add(setErrorGroupsInvocation);
JFieldRef setErrorNameRef = JExpr.ref(ERRORDATA_FIELD);
JInvocation setErrorNameInvocation = setErrorNameRef.invoke("setErrorName");
setErrorNameInvocation.arg(JExpr.ref(ARG_ERRORNAME));
jGetErrorDataMethodBody.add(setErrorNameInvocation);
JFieldRef setOrganizationRef = JExpr.ref(ERRORDATA_FIELD);
JInvocation setOrganizationInvocation = setOrganizationRef.invoke("setOrganization");
setOrganizationInvocation.arg(JExpr.ref(ORGANISATION));
jGetErrorDataMethodBody.add(setOrganizationInvocation);
jGetErrorDataMethodBody._return(returnValue);
}
}