/* * 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. */ package org.ngrinder.script.service; import net.grinder.engine.agent.LocalScriptTestDriveService; import net.grinder.util.thread.Condition; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.output.ByteArrayOutputStream; import org.apache.commons.lang.StringUtils; import org.ngrinder.common.util.Preconditions; import org.ngrinder.infra.config.Config; import org.ngrinder.model.IFileEntry; import org.ngrinder.model.User; import org.ngrinder.script.handler.ProcessingResultPrintStream; import org.ngrinder.script.handler.ScriptHandler; import org.ngrinder.script.handler.ScriptHandlerFactory; import org.ngrinder.script.model.FileEntry; import org.ngrinder.service.AbstractScriptValidationService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.File; import java.util.List; import static org.ngrinder.common.constant.ControllerConstants.PROP_CONTROLLER_VALIDATION_SYNTAX_CHECK; import static org.ngrinder.common.constant.ControllerConstants.PROP_CONTROLLER_VALIDATION_TIMEOUT; import static org.ngrinder.common.util.ExceptionUtils.processException; import static org.ngrinder.common.util.Preconditions.checkNotEmpty; import static org.ngrinder.common.util.Preconditions.checkNotNull; import static org.ngrinder.common.util.TypeConvertUtils.cast; /** * Script Validation Service. * * @author JunHo Yoon * @since 3.0 */ @Service public class ScriptValidationService extends AbstractScriptValidationService { private static final Logger LOGGER = LoggerFactory.getLogger(ScriptValidationService.class); @Autowired private LocalScriptTestDriveService localScriptTestDriveService; @Autowired private FileEntryService fileEntryService; @Autowired private Config config; @Autowired private ScriptHandlerFactory scriptHandlerFactory; /* * (non-Javadoc) * * @see * org.ngrinder.script.service.IScriptValidationService#validate(org * .ngrinder.model.User, org.ngrinder.model.IFileEntry, boolean, * java.lang.String) */ @Override public String validate(User user, IFileEntry scriptIEntry, boolean useScriptInSVN, String hostString) { FileEntry scriptEntry = cast(scriptIEntry); try { checkNotNull(scriptEntry, "scriptEntity should be not null"); checkNotEmpty(scriptEntry.getPath(), "scriptEntity path should be provided"); if (!useScriptInSVN) { checkNotEmpty(scriptEntry.getContent(), "scriptEntity content should be provided"); } checkNotNull(user, "user should be provided"); // String result = checkSyntaxErrors(scriptEntry.getContent()); ScriptHandler handler = scriptHandlerFactory.getHandler(scriptEntry); if (config.getControllerProperties().getPropertyBoolean(PROP_CONTROLLER_VALIDATION_SYNTAX_CHECK)) { String result = handler.checkSyntaxErrors(scriptEntry.getPath(), scriptEntry.getContent()); LOGGER.info("Perform Syntax Check by {} for {}", user.getUserId(), scriptEntry.getPath()); if (result != null) { return result; } } File scriptDirectory = config.getHome().getScriptDirectory(user); FileUtils.deleteDirectory(scriptDirectory); Preconditions.checkTrue(scriptDirectory.mkdirs(), "Script directory {} creation is failed."); ProcessingResultPrintStream processingResult = new ProcessingResultPrintStream(new ByteArrayOutputStream()); handler.prepareDist(0L, user, scriptEntry, scriptDirectory, config.getControllerProperties(), processingResult); if (!processingResult.isSuccess()) { return new String(processingResult.getLogByteArray()); } File scriptFile = new File(scriptDirectory, FilenameUtils.getName(scriptEntry.getPath())); if (useScriptInSVN) { fileEntryService.writeContentTo(user, scriptEntry.getPath(), scriptDirectory); } else { FileUtils.writeStringToFile(scriptFile, scriptEntry.getContent(), StringUtils.defaultIfBlank(scriptEntry.getEncoding(), "UTF-8")); } File doValidate = localScriptTestDriveService.doValidate(scriptDirectory, scriptFile, new Condition(), config.isSecurityEnabled(), hostString, getTimeout()); List<String> readLines = FileUtils.readLines(doValidate); StringBuilder output = new StringBuilder(); String path = config.getHome().getDirectory().getAbsolutePath(); for (String each : readLines) { if (!each.startsWith("*sys-package-mgr")) { each = each.replace(path, "${NGRINDER_HOME}"); output.append(each).append("\n"); } } return output.toString(); } catch (Exception e) { throw processException(e); } } protected int getTimeout() { return Math.max(config.getControllerProperties().getPropertyInt(PROP_CONTROLLER_VALIDATION_TIMEOUT), 10); } }