package jetbrains.mps.ide.httpsupport.nodeaccess.plugin; /*Generated by MPS */ import jetbrains.mps.ide.httpsupport.runtime.base.HttpRequestHandlerBase; import java.util.List; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.ArrayList; import jetbrains.mps.project.Project; import jetbrains.mps.ide.httpsupport.manager.plugin.HttpRequest; import jetbrains.mps.ide.httpsupport.runtime.base.HttpSupportUtil; import jetbrains.mps.project.ProjectManager; import jetbrains.mps.project.MPSProject; import java.util.Iterator; import jetbrains.mps.textgen.trace.DebugInfo; import jetbrains.mps.textgen.trace.DefaultTraceInfoProvider; import org.jetbrains.mps.openapi.model.SNodeReference; import jetbrains.mps.textgen.trace.BaseLanguageNodeLookup; import io.netty.handler.codec.http.HttpResponseStatus; import io.netty.buffer.Unpooled; import jetbrains.mps.textgen.trace.DebugInfoRoot; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import com.intellij.openapi.vfs.VirtualFile; import jetbrains.mps.ide.common.FileOpenUtil; public class JavaFileOpener_RequestHandler extends HttpRequestHandlerBase { private static final List<String> QUERY_PREFIX = ListSequence.fromListAndArray(new ArrayList<String>(), "file"); private final boolean myCorrectRequest; private final String file; private final Integer line; private final Project project; public JavaFileOpener_RequestHandler(HttpRequest request) { super(request); boolean correctRequest = true; { String file_serialized = ListSequence.fromList(this.request.getParameterValue("file")).getElement(0); if (file_serialized != null) { this.file = file_serialized; } else { correctRequest = false; this.file = null; } } { String line_serialized = ListSequence.fromList(this.request.getParameterValue("line")).getElement(0); if (line_serialized != null) { this.line = HttpSupportUtil.parseInt(line_serialized); } else { this.line = null; } } { String project_serialized = ListSequence.fromList(this.request.getParameterValue("project")).getElement(0); if (project_serialized != null) { this.project = HttpSupportUtil.getProjectByName(project_serialized); } else { this.project = ProjectManager.getInstance().getOpenedProjects().get(0); } } myCorrectRequest = correctRequest; } @Override protected List<String> getQueryPrefix() { return QUERY_PREFIX; } @Override public boolean canHandle() { if (!(myCorrectRequest) || !(super.canHandle())) { return false; } return this.file.endsWith(".java"); } @Override public void handle() throws Exception { if (this.project != null) { final com.intellij.openapi.project.Project ideaProject = ((this.project instanceof MPSProject) ? ((MPSProject) this.project).getProject() : null); int sourceGen = this.file.lastIndexOf(HandlerUtil.SOURCE_GEN); int unitNamePosition = (sourceGen == -1 ? 0 : sourceGen + HandlerUtil.SOURCE_GEN.length()); int unitNameEndPostion = this.file.length() - ".java".length(); String unitName = this.file.substring(unitNamePosition, unitNameEndPostion).replace('/', '.'); String namespace = unitName.substring(0, unitName.lastIndexOf(".")); final String fileName = this.file.substring(this.file.lastIndexOf("/") + 1); Iterator<DebugInfo> it = new DefaultTraceInfoProvider(this.project.getRepository()).debugInfo(namespace).iterator(); if (this.line != null) { while (it.hasNext()) { final SNodeReference nodeReference = new BaseLanguageNodeLookup(it.next()).getNodeAt(fileName, this.line); if (HandlerUtil.openNode(this.project, nodeReference) != null) { this.request.sendResponse(HttpResponseStatus.OK, "image/gif", Unpooled.copiedBuffer(HandlerUtil.SUCCESS_STREAM)); return; } } } else { while (it.hasNext()) { Iterable<DebugInfoRoot> debugInfoRoots = it.next().getRoots(); SNodeReference nodeReference = Sequence.fromIterable(debugInfoRoots).where(new IWhereFilter<DebugInfoRoot>() { public boolean accept(DebugInfoRoot debugInfoRoot) { return debugInfoRoot.getFileNames().contains(fileName); } }).first().getNodeRef(); if (HandlerUtil.openNode(this.project, nodeReference) != null) { this.request.sendResponse(HttpResponseStatus.OK, "image/gif", Unpooled.copiedBuffer(HandlerUtil.SUCCESS_STREAM)); return; } } } final VirtualFile virtualFile = FileOpenUtil.findFile(ideaProject, unitName, fileName); if (virtualFile != null) { this.request.sendResponse(HttpResponseStatus.OK, "image/gif", Unpooled.copiedBuffer(HandlerUtil.SUCCESS_STREAM)); this.project.getModelAccess().runWriteInEDT(new Runnable() { public void run() { FileOpenUtil.openFile(ideaProject, virtualFile, (JavaFileOpener_RequestHandler.this.line == null ? 1 : JavaFileOpener_RequestHandler.this.line)); HandlerUtil.requestFocus(JavaFileOpener_RequestHandler.this.project); } }); return; } this.request.sendResponse(HttpResponseStatus.OK, "image/gif", Unpooled.copiedBuffer(HandlerUtil.FAILURE_STREAM)); } else { HandlerUtil.showNoProjectIsAvailablePopup(); this.request.sendResponse(HttpResponseStatus.OK, "image/gif", Unpooled.copiedBuffer(HandlerUtil.FAILURE_STREAM)); } } }