package com.digiarea.closurefx.build.validation; import java.io.File; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import java.util.ResourceBundle; import com.digiarea.closure.core.IPathResolver; import com.digiarea.closure.model.Buildpath; import com.digiarea.closure.model.Check; import com.digiarea.closure.model.CheckType; import com.digiarea.closure.model.Checks; import com.digiarea.closure.model.Closure; import com.digiarea.closure.model.ClosureGss; import com.digiarea.closure.model.ClosureJs; import com.digiarea.closure.model.ClosureSoy; import com.digiarea.closure.model.ExcludeInputFilter; import com.digiarea.closure.model.GssAtRule; import com.digiarea.closure.model.GssAtRules; import com.digiarea.closure.model.GssDefine; import com.digiarea.closure.model.GssDefines; import com.digiarea.closure.model.GssExcludedClass; import com.digiarea.closure.model.GssExcludedClasses; import com.digiarea.closure.model.GssInputOrientation; import com.digiarea.closure.model.GssNonStandardFunction; import com.digiarea.closure.model.GssNonStandardFunctions; import com.digiarea.closure.model.GssOptimizationLevel; import com.digiarea.closure.model.GssOutputFormat; import com.digiarea.closure.model.GssOutputOrientation; import com.digiarea.closure.model.GssOutputRenamingMapFormat; import com.digiarea.closure.model.GssRenamingType; import com.digiarea.closure.model.GssUnrecognizeProperties; import com.digiarea.closure.model.GssUnrecognizeProperty; import com.digiarea.closure.model.GssVendor; import com.digiarea.closure.model.IncludeInputFilter; import com.digiarea.closure.model.Info; import com.digiarea.closure.model.InputFilterPattern; import com.digiarea.closure.model.InputFilterType; import com.digiarea.closure.model.JsDefine; import com.digiarea.closure.model.JsDefineType; import com.digiarea.closure.model.JsDefines; import com.digiarea.closure.model.JsDoc; import com.digiarea.closure.model.JsDocs; import com.digiarea.closure.model.JsFunctionMap; import com.digiarea.closure.model.JsPropertyMap; import com.digiarea.closure.model.JsRenaming; import com.digiarea.closure.model.JsRenamingFunctionPolice; import com.digiarea.closure.model.JsRenamingPropertyPolice; import com.digiarea.closure.model.JsRenamingVariablePolice; import com.digiarea.closure.model.JsSourceMapFormat; import com.digiarea.closure.model.JsVariableMap; import com.digiarea.closure.model.LangType; import com.digiarea.closure.model.Language; import com.digiarea.closure.model.Optimization; import com.digiarea.closure.model.OptimizationType; import com.digiarea.closure.model.Optimizations; import com.digiarea.closure.model.Output; import com.digiarea.closure.model.SeverityType; import com.digiarea.closure.model.Source; import com.digiarea.closure.model.SourceEntity; import com.digiarea.closure.model.SourceEntry; import com.digiarea.closure.model.SoyCodeStyle; import com.digiarea.closure.model.SoyCssSchemeType; import com.digiarea.closure.model.SoyLocale; import com.digiarea.closure.model.SoyLocales; import com.digiarea.closure.model.Warning; import com.digiarea.closure.model.WarningType; import com.digiarea.closure.model.Warnings; import com.digiarea.closure.model.visitor.VoidVisitorAdapter; import com.digiarea.closure.preferences.model.ClosureLibrary; import com.digiarea.closure.preferences.model.Variable; import com.digiarea.closure.preferences.model.bind.PreferencesSerializer; import com.digiarea.closurefx.utils.ValidationUtils; public class BasicValidator extends VoidVisitorAdapter<Object> { public static String JSValidator_Source_Empty = "JSValidator_Source_Empty"; public static String JSValidator_Source_Invalid = "JSValidator_Source_Invalid"; public static String JSValidator_Output_EmptyPath = "JSValidator_Output_EmptyPath"; public static String JSValidator_Output_EmptyFile = "JSValidator_Output_EmptyFile"; public static String SOYValidator_Source_Empty = "SOYValidator_Source_Empty"; public static String SOYValidator_Source_Invalid = "SOYValidator_Source_Invalid"; public static String GSSValidator_Source_Empty = "GSSValidator_Source_Empty"; public static String GSSValidator_Source_Invalid = "GSSValidator_Source_Invalid"; public static String JSValidator_Source_Exist = "JSValidator_Source_Exist"; public static String SOYValidator_Source_Exist = "SOYValidator_Source_Exist"; public static String GSSValidator_Source_Exist = "GSSValidator_Source_Exist"; public static String JSValidator_Closure_Exist = "JSValidator_Closure_Exist"; public static String JSValidator_Variable_Exist = "JSValidator_Variable_Exist"; public static String GSSValidator_Variable_Exist = "GSSValidator_Variable_Exist"; public static String SOYValidator_Variable_Exist = "SOYValidator_Variable_Exist"; public static String JSValidator_ExternExports_Empty = "JSValidator_ExternExports_Empty"; public static String JSValidator_ExternExports_Exist = "JSValidator_ExternExports_Exist"; public static String JSValidator_Charset = "JSValidator_Charset"; public static String JSValidator_VariableRenamingInput_Exist = "JSValidator_VariableRenamingInput_Exist"; public static String JSValidator_PropertyRenamingInput_Exist = "JSValidator_PropertyRenamingInput_Exist"; public static String JSValidator_FunctionRenamingInput_Exist = "JSValidator_FunctionRenamingInput_Exist"; public static String JSValidator_SourceMap_Exist = "JSValidator_SourceMap_Exist"; public static String JSValidator_TranslationFile_Exist = "JSValidator_TranslationFile_Exist"; public static String JSValidator_RenamingMap_Empty = "JSValidator_RenamingMap_Empty"; public static String JSValidator_RenamingMap_Exist = "JSValidator_RenamingMap_Exist"; public static String SOYValidator_MessageFile_Empty = "SOYValidator_MessageFile_Empty"; public static String SOYValidator_MessageFile_Exist = "SOYValidator_MessageFile_Exist"; public static String SOYValidator_Ouput_Empty = "SOYValidator_Ouput_Empty"; @Override public void visit(final Buildpath n, final Object ctx) throws Exception { super.visit(n, ctx); validate(n, ctx); } private void validate(Buildpath n, Object ctx) throws Exception { if (ctx instanceof ClosureJs) { if (n.getSource() == null || n.getSource().isEmpty()) { warnings.add(ValidationUtils.createWarningStatus(bundle .getString(JSValidator_Source_Empty))); } else { for (Source source : n.getSource()) { super.visit(source, ctx); } } } else if (ctx instanceof ClosureSoy) { if (n.getSource() == null || n.getSource().isEmpty()) { warnings.add(ValidationUtils.createWarningStatus(bundle .getString(SOYValidator_Source_Empty))); } else { for (Source source : n.getSource()) { super.visit(source, ctx); } } } else if (ctx instanceof ClosureGss) { if (n.getSource() == null || n.getSource().isEmpty()) { warnings.add(ValidationUtils.createWarningStatus(bundle .getString(GSSValidator_Source_Empty))); } else { for (Source source : n.getSource()) { super.visit(source, ctx); } } } } @Override public void visit(Check n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(Checks n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(CheckType n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(Closure n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(final ClosureGss n, final Object ctx) throws Exception { super.visit(n, n); validate(n, ctx); } private void validate(ClosureGss n, Object ctx) { if (n.getRenamingType() != GssRenamingType.NONE) { if (n.getOutputRenamingMap() == null || n.getOutputRenamingMap().isEmpty()) { warnings.add(ValidationUtils.createWarningStatus(bundle .getString(JSValidator_RenamingMap_Empty))); } else if (!new File(pathResolver.toRealPath(n .getOutputRenamingMap())).exists()) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(JSValidator_RenamingMap_Exist))); } } } @Override public void visit(final ClosureJs n, final Object ctx) throws Exception { super.visit(n, n); validateExternExports(n, ctx); validateCharset(n, ctx); validateSourceMap(n, ctx); validateTranslationFile(n, ctx); } private void validateExternExports(ClosureJs n, Object ctx) { if (n.isExternExports()) { if (n.getExternExportsPath() == null || n.getExternExportsPath().isEmpty()) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(JSValidator_ExternExports_Empty))); } } } private void validateCharset(ClosureJs n, Object ctx) { if (n.getCharset() != null && !n.getCharset().isEmpty()) { if (!Charset.isSupported(n.getCharset())) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(JSValidator_Charset))); } } } private void validateSourceMap(ClosureJs n, Object ctx) { if (n.getSourceMapFile() != null && !n.getSourceMapFile().isEmpty()) { if (!new File(pathResolver.toRealPath(n.getSourceMapFile())) .exists()) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(JSValidator_SourceMap_Exist))); } } } private void validateTranslationFile(ClosureJs n, Object ctx) { if (n.getTranslationsFile() != null && !n.getTranslationsFile().isEmpty()) { if (!new File(pathResolver.toRealPath(n.getTranslationsFile())) .exists()) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(JSValidator_TranslationFile_Exist))); } } } @Override public void visit(final ClosureSoy n, final Object ctx) throws Exception { super.visit(n, n); validateSoyOuputPath(n, ctx); validateSoyLocales(n, ctx); } private void validateSoyOuputPath(ClosureSoy n, Object ctx) { if (n.getOutputPath() == null || n.getOutputPath().isEmpty()) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(SOYValidator_Ouput_Empty))); } } private void validateSoyLocales(ClosureSoy n, Object ctx) { if (n.getMessagesPath() == null || n.getMessagesPath().isEmpty()) { if (n.getSoyLocales() != null) { if (!n.getSoyLocales().getSoyLocale().isEmpty()) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(SOYValidator_MessageFile_Empty))); } } } else if (!new File(pathResolver.toRealPath(n.getMessagesPath())) .exists()) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(SOYValidator_MessageFile_Exist))); } } @Override public void visit(ExcludeInputFilter n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(GssAtRule n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(GssAtRules n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(GssDefine n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(GssDefines n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(GssExcludedClass n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(GssExcludedClasses n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(GssInputOrientation n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(GssNonStandardFunction n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(GssNonStandardFunctions n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(GssOptimizationLevel n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(GssOutputFormat n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(GssOutputOrientation n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(GssOutputRenamingMapFormat n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(GssRenamingType n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(GssUnrecognizeProperties n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(GssUnrecognizeProperty n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(GssVendor n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(IncludeInputFilter n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(Info n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(InputFilterPattern n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(InputFilterType n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(JsDefine n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(JsDefines n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(JsDefineType n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(JsDoc n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(JsDocs n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(JsVariableMap n, Object ctx) throws Exception { super.visit(n, ctx); validateJsVariableRenaming(n, ctx); } @Override public void visit(JsFunctionMap n, Object ctx) throws Exception { super.visit(n, ctx); validateJsFunctionRenaming(n, ctx); } @Override public void visit(JsPropertyMap n, Object ctx) throws Exception { super.visit(n, ctx); validateJsPropertyRenaming(n, ctx); } @Override public void visit(final JsRenaming n, final Object ctx) throws Exception { super.visit(n, ctx); } private void validateJsFunctionRenaming(JsFunctionMap n, Object ctx) { if (n != null && n.getInput() != null && !n.getInput().isEmpty()) { if (!new File(pathResolver.toRealPath(n.getInput())).exists()) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(JSValidator_FunctionRenamingInput_Exist))); } } } private void validateJsPropertyRenaming(JsPropertyMap n, Object ctx) { if (n != null && n.getInput() != null && !n.getInput().isEmpty()) { if (!new File(pathResolver.toRealPath(n.getInput())).exists()) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(JSValidator_PropertyRenamingInput_Exist))); } } } private void validateJsVariableRenaming(JsVariableMap n, Object ctx) { if (n != null && n.getInput() != null && !n.getInput().isEmpty()) { if (!new File(pathResolver.toRealPath(n.getInput())).exists()) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(JSValidator_VariableRenamingInput_Exist))); } } } @Override public void visit(JsRenamingFunctionPolice n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(JsRenamingPropertyPolice n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(JsRenamingVariablePolice n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(JsSourceMapFormat n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(LangType n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(Language n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(Optimization n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(Optimizations n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(OptimizationType n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(final Output n, final Object ctx) throws Exception { super.visit(n, ctx); validateOutputPath(n.getPath()); validateOutputFile(n.getFile()); } private void validateOutputPath(String n) { if (n == null || n.isEmpty()) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(JSValidator_Output_EmptyPath))); } } private void validateOutputFile(String n) { if (n == null || n.isEmpty()) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(JSValidator_Output_EmptyFile))); } } @Override public void visit(SeverityType n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(final Source n, final Object ctx) throws Exception { validate(n, ctx); } private void validate(Source n, Object ctx) { if (ctx instanceof ClosureJs) { if (n.getEntryKind() == SourceEntry.CLOSURE) { ClosureLibrary library = new PreferencesSerializer() .readLibrary(n.getPath()); if (library == null) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(JSValidator_Closure_Exist))); } else { if (!new File(pathResolver.toRealPath(n.getPath())) .exists()) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(JSValidator_Source_Exist))); } } } else if (n.getEntryKind() == SourceEntry.VARIABLE) { Variable library = new PreferencesSerializer().readVariable(n .getPath()); if (library == null) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(JSValidator_Variable_Exist))); } else { if (!new File(pathResolver.toRealPath(n.getPath())) .exists()) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(JSValidator_Source_Exist))); } } } else { if (!new File(pathResolver.toRealPath(n.getPath())).exists()) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(JSValidator_Source_Exist))); } } } else if (ctx instanceof ClosureSoy) { if (n.getEntryKind() == SourceEntry.VARIABLE) { Variable library = new PreferencesSerializer().readVariable(n .getPath()); if (library == null) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(SOYValidator_Variable_Exist))); } else { if (!new File(pathResolver.toRealPath(n.getPath())) .exists()) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(SOYValidator_Source_Exist))); } } } else { if (!new File(pathResolver.toRealPath(n.getPath())).exists()) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(SOYValidator_Source_Exist))); } } } else if (ctx instanceof ClosureGss) { if (n.getEntryKind() == SourceEntry.VARIABLE) { Variable library = new PreferencesSerializer().readVariable(n .getPath()); if (library == null) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(GSSValidator_Variable_Exist))); } else { if (!new File(pathResolver.toRealPath(n.getPath())) .exists()) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(GSSValidator_Source_Exist))); } } } else { if (!new File(pathResolver.toRealPath(n.getPath())).exists()) { errors.add(ValidationUtils.createErrorStatus(bundle .getString(GSSValidator_Source_Exist))); } } } } @Override public void visit(SourceEntity n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(SourceEntry n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(SoyCodeStyle n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(SoyCssSchemeType n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(SoyLocale n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(SoyLocales n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(Warning n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(Warnings n, Object ctx) throws Exception { super.visit(n, ctx); } @Override public void visit(WarningType n, Object ctx) throws Exception { super.visit(n, ctx); } private IPathResolver pathResolver; private ResourceBundle bundle; private List<IStatus> warnings = new ArrayList<IStatus>(); private List<IStatus> errors = new ArrayList<IStatus>(); public BasicValidator(ResourceBundle bundle, IPathResolver pathResolver) { this.pathResolver = pathResolver; this.bundle = bundle; } public boolean isValid() { return errors.isEmpty(); } public List<IStatus> getWarnings() { return warnings; } public List<IStatus> getErrors() { return errors; } }