package gdxstudio;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.Attributes;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import javax.swing.JOptionPane;
import scene2d.Scene;
import com.badlogic.gdx.utils.ArrayMap;
public class Export {
private static final String[] frameWorkClasses = {
"scene2d", "scene3d",
"com/badlogic", "com/esotericsoftware", "gdx",
"com/jcraft", "javazoom", "org/lwjgl", "sfd.ser",
"lwjgl", "OpenAL", "openal",
};
private static final String[] excludeClasses = {
"org/fife", "org/eclipse" , "com/threerings", "gdxstudio", "tools", "web/laf",
"android", "antlr"
};
private static final String eclipse_project =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+"<projectDescription>"
+ "<name>$$$</name>"
+ "<comment></comment>"
+ "<projects>"
+ "</projects>"
+ "<buildSpec>"
+ "<buildCommand>"
+ "<name>org.eclipse.jdt.core.javabuilder</name>"
+ "<arguments>"
+ "</arguments>"
+ "</buildCommand>"
+ "</buildSpec>"
+ "<natures>"
+ "<nature>org.eclipse.jdt.core.javanature</nature>"
+ "</natures>"
+"</projectDescription>";
/*private static final String eclipse_cp =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+"<classpath>"
<classpathentry kind="src" path="atlas"/>"
<classpathentry kind="src" path="font"/>
<classpathentry kind="src" path="map"/>
<classpathentry kind="src" path="model"/>
<classpathentry kind="src" path="music"/>
<classpathentry kind="src" path="particle"/>
<classpathentry kind="src" path="skin"/>
<classpathentry kind="src" path="sound"/>
<classpathentry kind="src" path="source"/>
<classpathentry kind="src" path="splash"/>
<classpathentry kind="src" path="actor"/>
<classpathentry kind="src" path="asset"/>
<classpathentry kind="src" path="config"/>
<classpathentry kind="src" path="scene"/>
<classpathentry kind="src" path="icon"/>
<classpathentry kind="lib" path="pathtogdxsutiod.jar"/>
<classpathentry kind="output" path="bin"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+"</classpath>";*/
public static void createProject(String foldername){
GdxStudio.log("Creating Project: "+Content.getProject());
Content.setProject(foldername);
new File(Content.getProject()+"atlas").mkdir();
new File(Content.getProject()+"font").mkdir();
new File(Content.getProject()+"map").mkdir();
new File(Content.getProject()+"model").mkdir();
new File(Content.getProject()+"music").mkdir();
new File(Content.getProject()+"sound").mkdir();
new File(Content.getProject()+"source").mkdir();
new File(Content.getProject()+"skin").mkdir();
new File(Content.getProject()+"pack").mkdir();
new File(Content.getProject()+"particle").mkdir();
new File(Content.getProject()+"META-INF").mkdir();
ArrayMap<String, String> map = new ArrayMap<String, String>();
map.put("Title", "");
map.put("TargetSize", "");
map.put("ScreenSize", "");
map.put("AudioBufferCount", "");
map.put("Resize", "");
map.put("ForceExit", "");
map.put("FullScreen", "");
map.put("UseGL20", "");
map.put("VSync", "");
map.put("DisableAudio", "");
map.put("KeepAspectRatio", "");
map.put("ShowFPS", "");
map.put("LoggingEnabled", "");
map.put("Version", "");
map.put("Target", "");
File prjFile = new File(Content.getProject());
Export.writeFile("config", Scene.json.toJson(map, ArrayMap.class));
Export.writeFile(".project", eclipse_project.replace("$$$", prjFile.getName()));
Frame.setEnabledProject();
createJar();
}
public static void openProject(String foldername){
GdxStudio.log("Opening Project: "+foldername);
Content.setProject(foldername);
Frame.setEnabledProject();
}
public static void writeFile(String filename, String data){
if(!Content.projectExists())
return;
GdxStudio.log("Writing File: "+filename);
File file = new File(Content.getProject()+filename);
try {
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
fos.write(data.getBytes());
fos.close();
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "Couldn't Save File: "+filename, "Error",
JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}
}
public static String readFile(String filename){
if(!Content.projectExists())
return "";
GdxStudio.log("Reading File: "+filename);
StringBuffer sb = new StringBuffer();
File file = new File(Content.getProject()+filename);
if(!file.exists())
return "";
BufferedReader br = null;
try {
FileReader fr = new FileReader(file);
br = new BufferedReader(fr);
String line;
while ((line=br.readLine())!=null){
sb.append(line);
sb.append(System.lineSeparator());;
}
br.close();
fr.close();
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "Couldn't Read File: "+filename, "Error",
JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}
return sb.toString();
}
public static String readFileFromClassPath(String filename){
StringBuffer sb = new StringBuffer();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(
Export.class.getClassLoader().getResourceAsStream(filename)));
for (int c = br.read(); c != -1; c = br.read())
sb.append((char)c);
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
public static ArrayList<String> listFiles(String foldername){
if(!Content.projectExists())
return null;
ArrayList<String> list = new ArrayList<String>();
File folder = new File(Content.getProject()+foldername);
if(folder.exists())
for (String member : folder.list())
list.add(member);
return list;
}
public static void deleteFile(String filename){
if(!Content.projectExists())
return;
GdxStudio.log("Deleting File: "+filename);
try {
Files.delete(new File(Content.getProject()+filename).toPath());
} catch (IOException e) {
e.printStackTrace();
}
}
static File prjFile;
static List<File> fileList = new ArrayList<File>();
static Manifest manifest = new Manifest();
static{
manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
manifest.getMainAttributes().put(Attributes.Name.CLASS_PATH, ". ");
manifest.getMainAttributes().put(Attributes.Name.MAIN_CLASS, "scene2d.desktop.Main");
manifest.getMainAttributes().put(Attributes.Name.IMPLEMENTATION_VENDOR, "pyros2097");
}
public static void createJar(){
if(!Content.projectExists())
return;
String filename = Export.class.getProtectionDomain().getCodeSource().getLocation().getFile();
if(!filename.endsWith(".jar"))
return;
GdxStudio.log("Exporting Project: "+Content.getProject());
fileList.clear();
prjFile = new File(Content.getProject());
generateFileList(prjFile);
byte[] buffer = new byte[1024];
try{
FileOutputStream fos = new FileOutputStream(Content.getProject()+prjFile.getName()+".jar");
JarOutputStream jos = new JarOutputStream(fos, manifest);
JarEntry je;
for(File file : fileList){
if(file.getParentFile().equals(prjFile) || file.getParentFile().getName().equals("bin"))
je = new JarEntry(file.getName());
else
je = new JarEntry(file.getParentFile().getName()+"/"+file.getName());
jos.putNextEntry(je);
FileInputStream in = new FileInputStream(file);
int len;
while ((len = in.read(buffer)) > 0) {
jos.write(buffer, 0, len);
}
in.close();
jos.closeEntry();
}
addLibrary(jos);
jos.close();
}catch(IOException ex){
ex.printStackTrace();
}
JOptionPane.showMessageDialog(null, "Exported: "+prjFile.getName()
+" to "+Content.getProject()+prjFile.getName()+".jar", "Export",
JOptionPane.INFORMATION_MESSAGE);
}
private static void generateFileList(File node){
if(node.isFile()){
if(!node.getName().endsWith(".java") && !node.getName().equals(prjFile.getName()+".jar")
&& !node.getName().equals(prjFile.getName()+".apk")){
fileList.add(node);
}
}
else{
for(String filename : node.list()){
if(!filename.equals("pack"))
generateFileList(new File(node, filename));
}
}
}
private static void addLibrary(JarOutputStream jos){
String filename = Export.class.getProtectionDomain().getCodeSource().getLocation().getFile();
if(!filename.endsWith(".jar"))
return;
ZipFile jf = null;
byte[] buffer = new byte[512];
try {
jf = new ZipFile(filename);
Enumeration<? extends ZipEntry> e = jf.entries();
while (e.hasMoreElements())
{
ZipEntry je = (ZipEntry) e.nextElement();
String entryName = je.getName();
for(String name: frameWorkClasses){
if(!entryName.contains(excludeClasses[0]) && !entryName.contains(excludeClasses[1])
&& !entryName.contains(excludeClasses[2]) && !entryName.contains(excludeClasses[3])
&& !entryName.contains(excludeClasses[4]) && !entryName.contains(excludeClasses[5])
&& !entryName.contains(excludeClasses[6]) && !entryName.contains(excludeClasses[7])
&& entryName.contains(name)) {
//GdxStudio.log(entryName);
ZipEntry newEntry = new ZipEntry(entryName);
jos.putNextEntry(newEntry);
InputStream in = jf.getInputStream(je);
while (0 < in.available()){
int read = in.read(buffer);
jos.write(buffer,0,read);
}
in.close();
jos.closeEntry();
break;
}
}
}
} catch (IOException e1) {
e1.printStackTrace();
}
finally{
try {
if(jf != null)
jf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void createDex(){
File prjFile = new File(Content.getProject());
String name = prjFile.getName();
String buildArgs = "--no-strict --output="+Content.getProject()+name+".apk "+Content.getProject()+"/bin";
try {
com.android.dx.command.dexer.Main.main(buildArgs.split(" "));
} catch (IOException e) {
e.printStackTrace();
}
JOptionPane.showMessageDialog(null, "Exported: "+name+" to "+Content.getProject()+name+".apk",
"Export", JOptionPane.INFORMATION_MESSAGE);
}
}