Skip to content

Commit

Permalink
+just a simple export to java base on diagram
Browse files Browse the repository at this point in the history
  • Loading branch information
Jerson2000 committed Dec 29, 2023
1 parent 414499f commit 9f67a9b
Show file tree
Hide file tree
Showing 6 changed files with 227 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,27 @@
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.pdf.PdfDocument;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.nathaniel.motus.umlclasseditor.model.MethodParameter;
import com.nathaniel.motus.umlclasseditor.model.UmlClass;
import com.nathaniel.motus.umlclasseditor.model.UmlClassAttribute;
import com.nathaniel.motus.umlclasseditor.model.UmlClassMethod;
import com.nathaniel.motus.umlclasseditor.model.UmlEnumValue;
import com.nathaniel.motus.umlclasseditor.model.UmlProject;
import com.nathaniel.motus.umlclasseditor.view.GraphView;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
Expand All @@ -30,6 +39,8 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
import java.util.Objects;

public class IOUtils {
Expand Down Expand Up @@ -189,6 +200,175 @@ public static Bitmap getBitmapFromView(GraphView view) {

}

// **********************************************************************************************
// Code Generation
// **********************************************************************************************

public static boolean export2Java(Context context,UmlProject project){
List<Boolean> list = new ArrayList<>();
if (project.getUmlClasses().size() == 0) {
Toast.makeText(context, "The project has no existing classes, do make one to generate.", Toast.LENGTH_SHORT).show();
return false;
}
for (UmlClass umlClass:project.getUmlClasses()){
StringBuilder javaClass = new StringBuilder();
switch (umlClass.getUmlClassType()){
case INTERFACE:
javaClass.append("public interface ").append(umlClass.getName()).append(" {\n");
javaClass.append(extractAttrib(umlClass.getAttributes()));
javaClass.append(extractMethods(umlClass.getMethods(),true));
javaClass.append("\n\n}");
break;
case ENUM:
javaClass.append("public enum ").append(umlClass.getName()).append(" {\n");
int i=1;
for (UmlEnumValue x:umlClass.getValues()){
javaClass.append(x.getName());
if(umlClass.getValues().size() >1 && i!=umlClass.getValues().size()) javaClass.append(",");
javaClass.append("\n");
i++;
}
javaClass.append("}");
break;
case ABSTRACT_CLASS:
javaClass.append("public abstract class ").append(umlClass.getName()).append(" {\n");
javaClass.append(extractAttrib(umlClass.getAttributes()));
javaClass.append(extractMethods(umlClass.getMethods(),false));
javaClass.append("\n\n}");
break;
default:
javaClass.append("public class ").append(umlClass.getName()).append(" {\n");
javaClass.append(extractAttrib(umlClass.getAttributes()));
javaClass.append(extractMethods(umlClass.getMethods(),false));
javaClass.append("\n\n}");
break;
}
list.add(saveFiles(context,javaClass.toString(),project.getName(),umlClass.getName()));
}
return !list.contains(false);
}

static StringBuilder extractAttrib(ArrayList<UmlClassAttribute> listOfAttrib){
StringBuilder attrib = new StringBuilder();
for (UmlClassAttribute x:listOfAttrib){
attrib.append("\t").append(x.getVisibility().toString().toLowerCase(Locale.ROOT)).append(x.isStatic() ? " static" : "").append(x.isFinal() ? " final" : "").append(" ");

switch (x.getTypeMultiplicity()){
case ARRAY:
attrib.append(x.getUmlType().getName()).append("[").append(x.getArrayDimension()).append("]").append(" ").append(x.getName());
break;
case COLLECTION:
attrib.append("List<").append(x.getUmlType().getName()).append(">").append(" ").append(x.getName());
break;
default:
attrib.append(x.getUmlType().getName()).append(" ").append(x.getName());
break;
}
attrib.append(";\n");
}

return attrib;
}

static StringBuilder extractMethods(ArrayList<UmlClassMethod> methods,boolean isInterface){
StringBuilder meths = new StringBuilder();
for (UmlClassMethod x:methods){
meths.append(x.getVisibility().toString().toLowerCase(Locale.ROOT)).append(x.isStatic()?" static":"").append(" ");
switch (x.getTypeMultiplicity()){
case COLLECTION:
meths.append("List<").append(x.getUmlType().getName()).append("> ").append(x.getName());
break;
case ARRAY:
meths.append(x.getUmlType().getName()).append("[] ").append(x.getName());
break;
default:
meths.append(x.getUmlType().getName()).append(" ").append(x.getName());
break;
}
if(!isInterface){
if(x.getParameterCount()==0) meths.append("() {");
else{
meths.append("(");
int i = 1;
for (MethodParameter y:x.getParameters()){
meths.append(y.getUmlType().getName()).append(" ").append(y.getName());
if(x.getParameters().size()>1 && i != x.getParameters().size()) meths.append(",");
i++;
}
meths.append(") {");
}
if(!x.getUmlType().getName().equalsIgnoreCase("void")){
String type = x.getUmlType().getName();
if(type.equalsIgnoreCase("int")||
type.equalsIgnoreCase("double")||
type.equalsIgnoreCase("float")||
type.equalsIgnoreCase("long")
)
meths.append("return 0;");
else if(type.equalsIgnoreCase("boolean")) meths.append("\nreturn false;");
else meths.append("\nreturn null;");

}else{
meths.append("\n// please complete your code");
}
meths.append("\n");
meths.append(" }\n");
}else{
meths.append("(");
int i = 1;
for (MethodParameter y:x.getParameters()){
meths.append(y.getUmlType().getName()).append(" ").append(y.getName());
if(x.getParameters().size()>1 && i != x.getParameters().size()) meths.append(",");
i++;
}
meths.append(");\n");

}
}

return meths;
}

static boolean saveFiles(Context context, String data,String projectName, String name) {
try {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
File dir = Environment.getExternalStorageDirectory();

File base = new File(dir, "UmlClassEditor");
if (!base.exists()) {
if (!base.mkdirs()) {
Log.e("TEST", "Failed to create directory");
return false;
}
}
File folder = new File(base, projectName);
if (!folder.exists()) {
if (!folder.mkdirs()) {
Log.e("TEST", "Failed to create directory");
return false;
}
}

File file = new File(folder, name + ".java");
FileOutputStream outputStream = new FileOutputStream(file);
outputStream.write(data.getBytes());
outputStream.close();
MediaScannerConnection.scanFile(context, new String[]{file.getAbsolutePath()}, null, null);

Log.i("IOUtils", "File saved: " + file.getAbsolutePath());
return true;
} else {
Log.e("IOUtils", "External storage not available for writing");
return false;
}
} catch (IOException e) {
Log.e("TEST", e.getMessage(), e);
return false;
}
}


// **********************************************************************************************
// Side utilities
// **********************************************************************************************
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.text.Html;
import android.util.Log;
import android.util.SparseBooleanArray;
Expand All @@ -22,6 +23,7 @@
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
Expand All @@ -38,11 +40,13 @@
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.GravityCompat;
import androidx.core.view.MenuCompat;
import androidx.documentfile.provider.DocumentFile;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;

import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.navigation.NavigationView;
import com.google.android.material.progressindicator.CircularProgressIndicator;
import com.nathaniel.motus.umlclasseditor.R;
import com.nathaniel.motus.umlclasseditor.model.TypeNameComparator;
import com.nathaniel.motus.umlclasseditor.model.UmlClass;
Expand All @@ -67,6 +71,7 @@
public class MainActivity extends AppCompatActivity implements FragmentObserver,
GraphView.GraphViewObserver,
NavigationView.OnNavigationItemSelectedListener {
private static final String TAG = "MainActivity";

private UmlProject mProject;
private boolean mExpectingTouchLocation = false;
Expand Down Expand Up @@ -151,19 +156,23 @@ protected void onStart() {

mGraphView = findViewById(R.id.graphview);
mGraphView.setUmlProject(mProject);
Log.i("TEST", "onStart");
}

@Override
protected void onDestroy() {
super.onDestroy();

mProject.save(getApplicationContext());
Log.i("TEST", "save : project");
savePreferences();
Log.i("TEST", "save : preferences");
UmlType.saveCustomUmlTypes(this);
Log.i("TEST", "save : custom types");
}

@Override
protected void onPause() {
super.onPause();
mProject.save(getApplicationContext());
savePreferences();
UmlType.saveCustomUmlTypes(this);
}

@RequiresApi(api = Build.VERSION_CODES.M)
Expand Down Expand Up @@ -228,7 +237,7 @@ private void savePreferences() {
private void getPreferences() {
SharedPreferences preferences = getPreferences(MODE_PRIVATE);
String projectName = preferences.getString(SHARED_PREFERENCES_PROJECT_NAME, null);
Log.i("TEST", "Loaded preferences");
Log.d(TAG, "getPreferences: ");
if (projectName != null) {
mProject = UmlProject.load(getApplicationContext(), projectName);
} else {
Expand Down Expand Up @@ -568,7 +577,11 @@ public boolean onOptionsItemSelected(MenuItem menuItem) {
} else if (itemId == R.id.toolbar_menu_export_pdf) {
if (sWriteExternalStoragePermission)
menuExportPdf();
}else if (itemId == R.id.toolbar_menu_import) {
} else if (itemId == R.id.toolbar_menu_export2java) {
if (sWriteExternalStoragePermission)
menuExport2Java();
}
else if (itemId == R.id.toolbar_menu_import) {
if (sReadExternalStoragePermission)
menuItemImport();
} else if (itemId == R.id.toolbar_menu_create_custom_type) {
Expand Down Expand Up @@ -617,6 +630,23 @@ private void menuItemImport() {
intent.setType("*/*");
importProjectLauncher.launch(intent);
}
/* export2 java */

private void menuExport2Java() {
dialog = new MaterialAlertDialogBuilder(this)
.setTitle("Generating..")
.setMessage("Please wait code is being generating!")
.setView(new ProgressBar(this))
.show();
dialog.setCancelable(false);
dialog.setCanceledOnTouchOutside(false);
new Handler().postDelayed(() -> {
if(mProject.export2Java(getApplicationContext())) {
dialog.dismiss();
Toast.makeText(this, "Generated! See the files in the app folder in your storage.", Toast.LENGTH_LONG).show();
}
},2000);
}

private void menuCreateCustomType() {
final EditText editText = new EditText(this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ public String getAttributeCompleteString() {

switch (mTypeMultiplicity) {
case COLLECTION:
completeString=completeString+mName+" : <"+mUmlType.getName()+">";
completeString=completeString+mName+" : List<"+mUmlType.getName()+">";
break;
case ARRAY:
completeString=completeString+mName+" : ["+mUmlType.getName()+"]^"+ mArrayDimension;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ public String getMethodCompleteString() {

switch (mTypeMultiplicity) {
case COLLECTION:
completeString.append("<").append(mUmlType.getName()).append(">");
completeString.append("List<").append(mUmlType.getName()).append(">");
break;
case ARRAY:
completeString.append("[").append(mUmlType.getName()).append("]^").append(mArrayDimension);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,10 @@ public void exportProject(Context context, Uri toDestination) {
public void exportProjectPDF(Context context, GraphView graphView, Uri toDestination) {
IOUtils.savePdfToExternalStorage(context,graphView,toDestination);
}
/* export2java*/
public boolean export2Java(Context context){
return IOUtils.export2Java(context,this);
}

public static UmlProject importProject(Context context, Uri fromFileUri) {
UmlProject umlProject;
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/res/menu/activity_main_toolbar_menu.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@
app:showAsAction="never"
android:title="Export as PDF"
android:icon="@drawable/ic_export"/>
<item
android:id="@+id/toolbar_menu_export2java"
app:showAsAction="never"
android:title="Export to java"
android:icon="@drawable/ic_export"/>
<item
android:id="@+id/toolbar_menu_import"
app:showAsAction="never"
Expand Down

0 comments on commit 9f67a9b

Please sign in to comment.