|
Java example source code file (CompilerThread.java)
The CompilerThread.java Java example source code/* * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.tools.sjavac.server; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StringWriter; import java.net.Socket; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.Map; import java.util.concurrent.Future; import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; import javax.tools.StandardJavaFileManager; import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.Log; import com.sun.tools.javac.util.BaseFileManager; import com.sun.tools.sjavac.comp.Dependencies; import com.sun.tools.sjavac.comp.JavaCompilerWithDeps; import com.sun.tools.sjavac.comp.SmartFileManager; import com.sun.tools.sjavac.comp.ResolveWithDeps; /** * The compiler thread maintains a JavaCompiler instance and * can receive a request from the client, perform the compilation * requested and report back the results. * * * <p>This is NOT part of any supported API. * If you write code that depends on this, you do so at your own * risk. This code and its internal interfaces are subject to change * or deletion without notice.</b> */ public class CompilerThread implements Runnable { private JavacServer javacServer; private CompilerPool compilerPool; private List<Future>> subTasks; // Communicating over this socket. private Socket socket; // The necessary classes to do a compilation. private com.sun.tools.javac.api.JavacTool compiler; private StandardJavaFileManager fileManager; private BaseFileManager fileManagerBase; private SmartFileManager smartFileManager; private Context context; // If true, then this thread is serving a request. private boolean inUse = false; CompilerThread(CompilerPool cp) { compilerPool = cp; javacServer = cp.getJavacServer(); } /** * Execute a minor task, for example generating bytecodes and writing them to disk, * that belong to a major compiler thread task. */ public synchronized void executeSubtask(Runnable r) { subTasks.add(compilerPool.executeSubtask(this, r)); } /** * Count the number of active sub tasks. */ public synchronized int numActiveSubTasks() { int c = 0; for (Future<?> f : subTasks) { if (!f.isDone() && !f.isCancelled()) { c++; } } return c; } /** * Use this socket for the upcoming request. */ public void setSocket(Socket s) { socket = s; } /** * Prepare the compiler thread for use. It is not yet started. * It will be started by the executor service. */ public synchronized void use() { assert(!inUse); inUse = true; compiler = com.sun.tools.javac.api.JavacTool.create(); fileManager = compiler.getStandardFileManager(null, null, null); fileManagerBase = (BaseFileManager)fileManager; smartFileManager = new SmartFileManager(fileManager); context = new Context(); context.put(JavaFileManager.class, smartFileManager); ResolveWithDeps.preRegister(context); JavaCompilerWithDeps.preRegister(context, this); subTasks = new ArrayList<Future>>(); } /** * Prepare the compiler thread for idleness. */ public synchronized void unuse() { assert(inUse); inUse = false; compiler = null; fileManager = null; fileManagerBase = null; smartFileManager = null; context = null; subTasks = null; } /** * Expect this key on the next line read from the reader. */ private static boolean expect(BufferedReader in, String key) throws IOException { String s = in.readLine(); if (s != null && s.equals(key)) { return true; } return false; } // The request identifier, for example GENERATE_NEWBYTECODE String id = ""; public String currentRequestId() { return id; } PrintWriter stdout; PrintWriter stderr; int forcedExitCode = 0; public void logError(String msg) { stderr.println(msg); forcedExitCode = -1; } /** * Invoked by the executor service. */ public void run() { // Unique nr that identifies this request. int thisRequest = compilerPool.startRequest(); long start = System.currentTimeMillis(); int numClasses = 0; StringBuilder compiledPkgs = new StringBuilder(); use(); PrintWriter out = null; try { javacServer.log("<"+thisRequest+"> Connect from "+socket.getRemoteSocketAddress()+" activethreads="+compilerPool.numActiveRequests()); BufferedReader in = new BufferedReader(new InputStreamReader( socket.getInputStream())); out = new PrintWriter(new OutputStreamWriter( socket.getOutputStream())); if (!expect(in, JavacServer.PROTOCOL_COOKIE_VERSION)) { javacServer.log("<"+thisRequest+"> Bad protocol from ip "+socket.getRemoteSocketAddress()); return; } String cookie = in.readLine(); if (cookie == null || !cookie.equals(""+javacServer.getCookie())) { javacServer.log("<"+thisRequest+"> Bad cookie from ip "+socket.getRemoteSocketAddress()); return; } if (!expect(in, JavacServer.PROTOCOL_CWD)) { return; } String cwd = in.readLine(); if (cwd == null) return; if (!expect(in, JavacServer.PROTOCOL_ID)) { return; } id = in.readLine(); if (id == null) return; if (!expect(in, JavacServer.PROTOCOL_ARGS)) { return; } ArrayList<String> the_options = new ArrayList Other Java examples (source code examples)Here is a short list of links related to this Java CompilerThread.java source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.