package org.openflexo.builders; import java.io.File; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.openflexo.builders.exception.MissingArgumentException; import org.openflexo.builders.utils.FlexoBuilderListener; import org.openflexo.foundation.CodeType; import org.openflexo.foundation.FlexoEditor; import org.openflexo.foundation.rm.FlexoProject; import org.openflexo.foundation.toc.TOCData; import org.openflexo.foundation.toc.TOCRepository; import org.openflexo.foundation.utils.ProjectInitializerException; import org.openflexo.foundation.utils.ProjectLoadingCancelledException; import org.openflexo.foundation.validation.ValidationError; import org.openflexo.foundation.validation.ValidationReport; import org.openflexo.logging.FlexoLogger; /** * This class allows to check the consistency of a project. * * @author gpolet * */ public class FlexoConsistencyCheckerMain extends FlexoExternalMainWithProject { private static final Logger logger = FlexoLogger.getLogger(FlexoConsistencyCheckerMain.class.getPackage().getName()); public static final int CONSISTENCY_FAILED_RETURN_CODE = 1; public static final String CODE_TYPE_ARGUMENT_PREFIX = "-CodeType="; private String codeType; private ValidationReport[] reports; public FlexoConsistencyCheckerMain() { } @Override protected void init(String[] args) throws MissingArgumentException { super.init(args); if (args.length > 0) { for (int i = 0; i < args.length; i++) { if (args[i].startsWith(CODE_TYPE_ARGUMENT_PREFIX)) { codeType = args[i].substring(CODE_TYPE_ARGUMENT_PREFIX.length()); } } } } @Override protected void doRun() { CodeType target = CodeType.get(codeType); if (target == null) { target = CodeType.PROTOTYPE; } reports = checkConsistency(projectDirectory, target); StringBuilder sb = new StringBuilder(); for (int i = 0; i < reports.length; i++) { ValidationReport report = reports[i]; for (ValidationError error : report.getErrors()) { addError(error, sb); } } if (sb.length() > 0) { reportMessage(sb.toString()); setExitCodeCleanUpAndExit(CONSISTENCY_FAILED_RETURN_CODE); } setExitCodeCleanUpAndExit(0); } public ValidationReport[] getReports() { return reports; } private void printTOCRepositories(FlexoEditor editor) throws ProjectInitializerException { if (editor.getProject().getTOCData() != null) { TOCData tocData = editor.getProject().getTOCData(); if (tocData.getRepositories().size() > 0) { StringBuffer buffer = new StringBuffer(""); Enumeration<TOCRepository> en = tocData.getRepositories().elements(); while (en.hasMoreElements()) { TOCRepository rep = en.nextElement(); buffer.append(rep.getTitle()).append(";"); buffer.append(rep.getUserIdentifier()).append(";"); buffer.append(rep.getFlexoID()); if (en.hasMoreElements()) { buffer.append(";"); } } writeToConsole(FlexoBuilderListener.TOCS_START_TAG); writeToConsole(buffer.toString()); writeToConsole(FlexoBuilderListener.TOCS_END_TAG); } } } private void addError(ValidationError error, StringBuilder sb) { if (sb.length() == 0) { sb.append("The following issues have been found within your project:\n"); } if (error.getCause() != null) { sb.append("* ").append(error.getCause().getLocalizedName()).append(": ").append(error.getLocalizedMessage()).append("\n"); } else { sb.append("* ").append(error.getLocalizedMessage()).append("\n"); } } @Override protected String getName() { return "Consistency checker"; } /** * This method checks the consistency for the project located within <code>projectDirectory</code> for the specified <code>target</code> * * @param projectDirectory * the directory containing the project (the .rmxml file) * @param target * the target to check against * @return true if the consistency checks pass for the specified target. * @throws CorruptedProjectException * @throws ProjectLoadingCancelledException */ private ValidationReport[] checkConsistency(File projectDirectory, CodeType target) { long start = System.currentTimeMillis(); FlexoProject project = editor.getProject(); try { project.setTargetType(target); List<ValidationReport> reports = new ArrayList<ValidationReport>(); if (project.getFlexoComponentLibrary(false) != null) { reports.add(project.getFlexoComponentLibrary().validate()); } if (project.getFlexoWorkflow(false) != null) { reports.add(project.getFlexoWorkflow().validate()); } if (project.getDataModel(false) != null) { reports.add(project.getDataModel().validate()); } if (project.getDKVModel(false) != null) { reports.add(project.getDKVModel().validate()); } long end = System.currentTimeMillis(); boolean success = true; for (ValidationReport report : reports) { success &= report.getErrorNb() == 0; if (!success) { break; } } if (logger.isLoggable(Level.INFO)) { logger.info("Consistency checking took " + (end - start) / 1000 + " seconds for project located at: " + projectDirectory.getAbsolutePath() + "\nResult: " + (success ? "Success" : "Failure")); } printTOCRepositories(editor); return reports.toArray(new ValidationReport[reports.size()]); } catch (ProjectInitializerException e) { e.printStackTrace(); setExitCodeCleanUpAndExit(CORRUPTED_PROJECT_EXCEPTION); } finally { // Only executed if no error occur if (editor != null) { project.close(); } } return null; } public static void main(String[] args) { launch(FlexoConsistencyCheckerMain.class, args); } }