package krasa.console; import java.io.IOException; import krasa.actions.AutotestUtils; import org.jetbrains.annotations.*; import com.intellij.execution.filters.*; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.fileEditor.OpenFileDescriptor; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.*; import com.intellij.openapi.vfs.ex.VirtualFileManagerEx; import com.intellij.psi.*; import com.intellij.ui.awt.RelativePoint; public class MissingRequestFileFilter implements Filter { public static final String PATTERN = "No request defined for ["; Data data; @Nullable @Override public Result applyFilter(final String line, int entireLength) { if (line == null) { return null; } if (line.substring(0, Math.min(line.length(), 120)).contains("DummyRequestService")) { int i = line.indexOf("Actual: "); if (i > 0) { String substring = line.substring(i + "Actual: ".length()); final Data data1 = new Data(substring.trim()); data = data1; data.hyperlinkInfoBase = getHyperlinkInfoBase(data1); return new Result(entireLength - line.length(), entireLength, data.hyperlinkInfoBase); } if (line.substring(0, Math.min(line.length(), 160)).contains(PATTERN)) { final int i2 = line.indexOf(PATTERN); if (i2 > 0) { String substring = line.substring(i2 + PATTERN.length()); final String path = substring.substring(0, substring.indexOf("]")); final String baseFolderName = path.substring(0, path.indexOf("/")); final String relativeFilePath = path.substring(path.indexOf("/") + 1); final String subdirectoryName = relativeFilePath.substring(0, relativeFilePath.lastIndexOf("/")); if (data == null || data.baseFolderName != null) { data = new Data(null); data.hyperlinkInfoBase = getHyperlinkInfoBase(data); } data.baseFolderName = baseFolderName; data.relativeFilePath = relativeFilePath; data.subdirectoryName = subdirectoryName; return new Result(entireLength - line.length(), entireLength, data.hyperlinkInfoBase); } } } return null; } private HyperlinkInfoBase getHyperlinkInfoBase(final Data data1) { return new HyperlinkInfoBase() { @Override public void navigate(@NotNull final Project project, @Nullable RelativePoint hyperlinkLocationPoint) { createFile(project, data1); } }; } private void createFile(final Project project, final Data data) { WriteCommandAction.runWriteCommandAction(project, new Runnable() { @Override public void run() { VirtualFile baseFolder = findDirectoryByName(project.getBaseDir(), data.baseFolderName); if (baseFolder != null) { PsiDirectory file = PsiManager.getInstance(project).findDirectory(baseFolder); assert file != null; PsiDirectory subdirectory = file.findSubdirectory(data.subdirectoryName); if (subdirectory == null) { subdirectory = file.createSubdirectory(data.subdirectoryName); } String fileName = AutotestUtils.getFileName(data.relativeFilePath) + ".xml"; PsiFile createdFile = subdirectory.findFile(fileName); if (createdFile == null) { createdFile = subdirectory.createFile(fileName); } VirtualFile createdFileVF = VirtualFileManagerEx.getInstance().refreshAndFindFileByUrl( createdFile.getVirtualFile().getUrl()); try { String content = data.content; if (content != null) { assert createdFileVF != null; String reformat = FormatUtils.reformat(project, content); createdFileVF.setBinaryContent(reformat.getBytes("UTF-8")); } } catch (IOException e) { throw new RuntimeException(e.getMessage(), e); } new OpenFileDescriptor(project, createdFileVF).navigate(true); } } }); } private VirtualFile findDirectoryByName(VirtualFile virtualFile, final String directoryName) { VirtualFileVisitor visitor = new VirtualFileVisitor() { @NotNull @Override public Result visitFileEx(@NotNull VirtualFile file) { if (file.isDirectory() && file.getName().equals(directoryName)) { throw new FolderFound(file); } return CONTINUE; } }; try { VfsUtilCore.visitChildrenRecursively(virtualFile, visitor); } catch (FolderFound e) { return e.file; } return null; } private class FolderFound extends RuntimeException { private VirtualFile file; public FolderFound(VirtualFile file) { this.file = file; } } private static class Data { String path; HyperlinkInfoBase hyperlinkInfoBase; String baseFolderName; String subdirectoryName; String content; String relativeFilePath; Data(String content) { this.content = content; } @Override public String toString() { final StringBuilder sb = new StringBuilder("Data{"); sb.append("path='").append(path).append('\''); sb.append('}'); return sb.toString(); } } }