-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
use installed java instead of webservice
- Loading branch information
Showing
9 changed files
with
195 additions
and
101 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,36 +1,21 @@ | ||
package controllers | ||
|
||
import play.api.mvc._ | ||
import play.api.libs.json._ | ||
import play.api.libs.functional.syntax._ | ||
import play.api.Logger | ||
import models._ | ||
|
||
object Application extends Controller { | ||
|
||
implicit val codeReads: Reads[Code] = ( | ||
(JsPath \ "code").read[String] and | ||
(JsPath \ "version").read[String] | ||
)(Code.apply _) | ||
|
||
def index = Action { | ||
Ok(views.html.index("")) | ||
} | ||
|
||
def submitCode = Action(BodyParsers.parse.json) { request => | ||
Logger.debug("submit code") | ||
|
||
val codeResult = request.body.validate[Code] | ||
codeResult.fold( | ||
errors => { | ||
BadRequest(Json.obj("status" ->"ERROR", "message" -> JsError.toFlatJson(errors))) | ||
}, | ||
code => { | ||
val helper = new DisassemblerService() | ||
val diss = helper.disassemble(code.version, code.code) | ||
Ok(diss) | ||
} | ||
) | ||
def submitCode = Action(parse.json) { request => | ||
(request.body \ "code").asOpt[String].map { code => | ||
val helper = new Disassembler() | ||
val diss = helper.disassemble(code) | ||
Ok(diss) | ||
}.getOrElse { | ||
BadRequest("Missing parameter [code]") | ||
} | ||
} | ||
|
||
} |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,161 @@ | ||
package models | ||
import java.util.UUID | ||
import java.io._ | ||
import java.nio.file._ | ||
import java.util.regex._ | ||
import scala.sys.process._ | ||
import scalax.io._ | ||
|
||
class Disassembler { | ||
val tmpDir = "/tmp/javabytes/" | ||
|
||
def disassemble(code:String):String = { | ||
val logger = new Logger() | ||
var error = false | ||
var message = "" | ||
|
||
//generate UUID | ||
val rawId = "t" + UUID.randomUUID().toString() | ||
val id = rawId.replaceAll("-", "").replaceAll("/", "").replaceAll("\\\\", "").replaceAll(":", "") | ||
|
||
//create tmpDir | ||
val userTmpDirName = tmpDir + id | ||
val userTmpDir = createDir(userTmpDirName) | ||
|
||
//try and extract name of class | ||
val className = extractClassname(code) | ||
if (className == "" || className == null) { | ||
message += clean(logger.err, userTmpDirName) | ||
error = true | ||
removeDir(userTmpDir) | ||
return message | ||
} | ||
|
||
//create tmp file | ||
val javaFilename = userTmpDirName + "/" + className + ".java" | ||
val classFilename = userTmpDirName + "/" + className + ".class" | ||
val fw = new FileWriter(javaFilename) | ||
|
||
//write code out to that file | ||
try { | ||
fw.write(code) | ||
fw.flush() | ||
} | ||
catch { | ||
case e: Exception => | ||
message += "Unable to create source.<br>" | ||
error = true | ||
} | ||
finally { | ||
fw.close() | ||
} | ||
if (error) return message | ||
|
||
//run compiler | ||
try { | ||
val compilationCommand = "javac " + javaFilename | ||
compilationCommand !! logger.log | ||
} | ||
catch { | ||
case e: Exception => | ||
message += clean(logger.err, userTmpDirName) | ||
error = true | ||
quietRemoveFile(javaFilename, classFilename, userTmpDir) | ||
return message | ||
} | ||
|
||
//dissassemble | ||
var decomp = "An unknown error has occurred" | ||
try { | ||
val decompCommand = "javap -c " + classFilename | ||
decomp = decompCommand !! logger.log | ||
decomp = clean(decomp, userTmpDirName) | ||
} | ||
catch { | ||
case e: Exception => | ||
message += clean(logger.err, userTmpDirName) | ||
error = true | ||
quietRemoveFile(javaFilename, classFilename, userTmpDir) | ||
return message | ||
} | ||
|
||
//remove all junk files created | ||
try { | ||
removeFile(javaFilename, classFilename, userTmpDir) | ||
} | ||
catch { | ||
case e: Exception => | ||
message += "Unable to cleanup.<br>" | ||
error = true | ||
return message | ||
} | ||
|
||
if (error) return message | ||
else return decomp | ||
} | ||
|
||
def createDir(str:String):Path = { | ||
val folderPath = Paths.get(str) | ||
Files.createDirectories(folderPath) | ||
} | ||
|
||
def removeDir(userTmpDir:Path) = { | ||
Files.delete(userTmpDir) | ||
} | ||
|
||
def clean(str:StringBuilder, dirPrefix:String):String = { | ||
clean(str.toString(), dirPrefix) | ||
} | ||
|
||
def clean(str:String, dirPrefix:String):String = { | ||
var decomp = str.replaceAll("\\{", "{{") | ||
decomp = decomp.replaceAll(dirPrefix+ "/", "") | ||
decomp = decomp.replaceAll("\\}", "}}") | ||
decomp = decomp.replaceAll("\"", "'") | ||
decomp = decomp.replaceAll("\n", "<br>") | ||
decomp = decomp.replaceAll("\t", " ") | ||
decomp = decomp.replaceAll("\u005E", " ") | ||
decomp = decomp.replaceAll("\u2038", " ") | ||
decomp = decomp.replaceAll("\\^", " ") | ||
decomp = decomp.replaceAll("\\s\\s\\s\\s\\s+", "<br>") | ||
decomp = decomp.replaceAll("\u001A", "") | ||
decomp = decomp.replaceAll("^\\s+", "") | ||
decomp | ||
} | ||
|
||
def quietRemoveFile(filename:String, classname:String, userTmpDir:Path) = { | ||
try { | ||
val sourceFile = new File(filename) | ||
sourceFile.delete() | ||
|
||
val classFile = new File(classname) | ||
classFile.delete() | ||
|
||
Files.delete(userTmpDir) | ||
} | ||
catch { | ||
case e: Exception => System.out.println("Couldn't remove file") | ||
} | ||
} | ||
|
||
def removeFile(filename:String, classname:String, userTmpDir:Path) = { | ||
val sourceFile = new File(filename) | ||
sourceFile.delete() | ||
|
||
val classFile = new File(classname) | ||
classFile.delete() | ||
|
||
Files.delete(userTmpDir) | ||
} | ||
|
||
def extractClassname(code:String):String = { | ||
val pattern = Pattern.compile("\\s*(public|private)\\s+class\\s+(\\w+)\\s+((extends\\s+\\w+)|(implements\\s+\\w+( ,\\w+)*))?\\s*\\{"); | ||
val m = pattern.matcher(code) | ||
|
||
if (m.find()) { | ||
m.group(2) | ||
} else { | ||
null | ||
} | ||
} | ||
} |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
package models | ||
import sys.process._ | ||
|
||
class Logger { | ||
val out = new StringBuilder | ||
val err = new StringBuilder | ||
|
||
val log = ProcessLogger( | ||
(o: String) => out.append(o), | ||
(e: String) => err.append(e) | ||
) | ||
|
||
def getLog(): ProcessLogger = { | ||
return log | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters