Skip to content
This repository has been archived by the owner on Oct 16, 2020. It is now read-only.

Created an Annotation for Registering Apps #131

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 48 additions & 46 deletions src/main/java/com/mrcrayfish/device/MrCrayfishDeviceMod.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.mrcrayfish.device;

import com.mrcrayfish.device.api.ApplicationManager;
import com.mrcrayfish.device.api.registry.DeviceModRegistry;
import com.mrcrayfish.device.api.registry.app.ApplicationRegistry;
import com.mrcrayfish.device.api.print.PrintingManager;
import com.mrcrayfish.device.api.task.TaskManager;
import com.mrcrayfish.device.core.io.task.*;
Expand All @@ -17,10 +19,8 @@
import com.mrcrayfish.device.init.RegistrationHandler;
import com.mrcrayfish.device.network.PacketHandler;
import com.mrcrayfish.device.programs.*;
import com.mrcrayfish.device.programs.debug.ApplicationTextArea;
import com.mrcrayfish.device.programs.email.ApplicationEmail;
import com.mrcrayfish.device.programs.email.task.*;
import com.mrcrayfish.device.programs.example.ApplicationExample;
import com.mrcrayfish.device.programs.example.task.TaskNotificationTest;
import com.mrcrayfish.device.programs.gitweb.ApplicationGitWeb;
import com.mrcrayfish.device.programs.system.ApplicationAppStore;
Expand All @@ -37,6 +37,7 @@
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.Mod.Instance;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.discovery.ASMDataTable;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
Expand All @@ -59,6 +60,8 @@ public class MrCrayfishDeviceMod

public static final boolean DEVELOPER_MODE = true;

public static ASMDataTable asmTable;

@EventHandler
public void preInit(FMLPreInitializationEvent event) throws LaunchException
{
Expand All @@ -72,7 +75,7 @@ public void preInit(FMLPreInitializationEvent event) throws LaunchException
MinecraftForge.EVENT_BUS.register(new DeviceConfig());

RegistrationHandler.init();

asmTable = event.getAsmData();
proxy.preInit();
}

Expand Down Expand Up @@ -106,46 +109,46 @@ public void postInit(FMLPostInitializationEvent event)
private void registerApplications()
{
// Applications (Both)
ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "settings"), ApplicationSettings.class);
ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "bank"), ApplicationBank.class);
ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "file_browser"), ApplicationFileBrowser.class);
ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "gitweb"), ApplicationGitWeb.class);
ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "note_stash"), ApplicationNoteStash.class);
ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "pixel_painter"), ApplicationPixelPainter.class);
ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "ender_mail"), ApplicationEmail.class);
ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "app_store"), ApplicationAppStore.class);
// ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "settings"), ApplicationSettings.class);
// ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "bank"), ApplicationBank.class);
// ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "file_browser"), ApplicationFileBrowser.class);
// ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "gitweb"), ApplicationGitWeb.class);
// ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "note_stash"), ApplicationNoteStash.class);
// ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "pixel_painter"), ApplicationPixelPainter.class);
// ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "ender_mail"), ApplicationEmail.class);
// ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "app_store"), ApplicationAppStore.class);

// Core
TaskManager.registerTask(TaskInstallApp.class);
TaskManager.registerTask(TaskUpdateApplicationData.class);
TaskManager.registerTask(TaskPrint.class);
TaskManager.registerTask(TaskUpdateSystemData.class);
TaskManager.registerTask(TaskConnect.class);
TaskManager.registerTask(TaskPing.class);
TaskManager.registerTask(TaskGetDevices.class);

//Bank
TaskManager.registerTask(TaskDeposit.class);
TaskManager.registerTask(TaskWithdraw.class);
TaskManager.registerTask(TaskGetBalance.class);
TaskManager.registerTask(TaskPay.class);
TaskManager.registerTask(TaskAdd.class);
TaskManager.registerTask(TaskRemove.class);

//File browser
TaskManager.registerTask(TaskSendAction.class);
TaskManager.registerTask(TaskSetupFileBrowser.class);
TaskManager.registerTask(TaskGetFiles.class);
TaskManager.registerTask(TaskGetStructure.class);
TaskManager.registerTask(TaskGetMainDrive.class);

//Ender Mail
TaskManager.registerTask(TaskUpdateInbox.class);
TaskManager.registerTask(TaskSendEmail.class);
TaskManager.registerTask(TaskCheckEmailAccount.class);
TaskManager.registerTask(TaskRegisterEmailAccount.class);
TaskManager.registerTask(TaskDeleteEmail.class);
TaskManager.registerTask(TaskViewEmail.class);
// TaskManager.registerTask(TaskInstallApp.class);
// TaskManager.registerTask(TaskUpdateApplicationData.class);
// TaskManager.registerTask(TaskPrint.class);
// TaskManager.registerTask(TaskUpdateSystemData.class);
// TaskManager.registerTask(TaskConnect.class);
// TaskManager.registerTask(TaskPing.class);
// TaskManager.registerTask(TaskGetDevices.class);
//
// Bank
// TaskManager.registerTask(TaskDeposit.class);
// TaskManager.registerTask(TaskWithdraw.class);
// TaskManager.registerTask(TaskGetBalance.class);
// TaskManager.registerTask(TaskPay.class);
// TaskManager.registerTask(TaskAdd.class);
// TaskManager.registerTask(TaskRemove.class);
//
// File browser
// TaskManager.registerTask(TaskSendAction.class);
// TaskManager.registerTask(TaskSetupFileBrowser.class);
// TaskManager.registerTask(TaskGetFiles.class);
// TaskManager.registerTask(TaskGetStructure.class);
// TaskManager.registerTask(TaskGetMainDrive.class);
//
// Ender Mail
// TaskManager.registerTask(TaskUpdateInbox.class);
// TaskManager.registerTask(TaskSendEmail.class);
// TaskManager.registerTask(TaskCheckEmailAccount.class);
// TaskManager.registerTask(TaskRegisterEmailAccount.class);
// TaskManager.registerTask(TaskDeleteEmail.class);
// TaskManager.registerTask(TaskViewEmail.class);

if(!DEVELOPER_MODE)
{
Expand All @@ -161,12 +164,11 @@ private void registerApplications()
else
{
// Applications (Developers)
ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "example"), ApplicationExample.class);
ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "icons"), ApplicationIcons.class);
ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "text_area"), ApplicationTextArea.class);
ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "test"), ApplicationTest.class);
// ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "icons"), ApplicationIcons.class);
// ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "text_area"), ApplicationTextArea.class);
// ApplicationManager.registerApplication(new ResourceLocation(Reference.MOD_ID, "test"), ApplicationTest.class);

TaskManager.registerTask(TaskNotificationTest.class);
// TaskManager.registerTask(TaskNotificationTest.class);
}

PrintingManager.registerPrint(new ResourceLocation(Reference.MOD_ID, "picture"), ApplicationPixelPainter.PicturePrint.class);
Expand Down
18 changes: 15 additions & 3 deletions src/main/java/com/mrcrayfish/device/api/ApplicationManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.mrcrayfish.device.MrCrayfishDeviceMod;
import com.mrcrayfish.device.api.app.Application;
import com.mrcrayfish.device.api.registry.BasicContainer;
import com.mrcrayfish.device.object.AppInfo;
import net.minecraft.util.ResourceLocation;

Expand All @@ -23,13 +24,13 @@ private ApplicationManager() {}
* <p>
* Example: {@code new ResourceLocation("modid:appid");}
*
* @param identifier the
* @param clazz
* @param identifier the ID of the application. A resource location
* @param clazz the application class being registered
*/
@Nullable
public static Application registerApplication(ResourceLocation identifier, Class<? extends Application> clazz)
{
Application application = MrCrayfishDeviceMod.proxy.registerApplication(identifier, clazz);
Application application = MrCrayfishDeviceMod.proxy.registerApplication(new AppInfo(identifier, Application.class.isAssignableFrom(clazz)), clazz);
if(application != null)
{
APP_INFO.put(identifier, application.getInfo());
Expand All @@ -38,6 +39,17 @@ public static Application registerApplication(ResourceLocation identifier, Class
return null;
}


@Nullable
public static Application registerApplication(BasicContainer app){
Application application = MrCrayfishDeviceMod.proxy.registerApplication(app);
if(application != null){
APP_INFO.put(app.getId(), application.getInfo());
return application;
}
return null;
}

/**
* Get all applications that are registered. The returned collection does not include system
* applications, see {@link #getSystemApplications()} or {@link #getAllApplications()}. Please
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.mrcrayfish.device.api.registry;

import com.mrcrayfish.device.api.app.Application;
import net.minecraft.util.ResourceLocation;

public interface BasicContainer<T> extends ICDMRegistryItem<BasicContainer<T>>{
Class<? extends T> getContainedClass();
ResourceLocation getId();
boolean isSystem();
}
15 changes: 15 additions & 0 deletions src/main/java/com/mrcrayfish/device/api/registry/CDMRegister.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.mrcrayfish.device.api.registry;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface CDMRegister {
String modId();
String uid();
boolean isDebug() default false;
boolean isSystem() default false;
}
39 changes: 39 additions & 0 deletions src/main/java/com/mrcrayfish/device/api/registry/CDMRegistry.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.mrcrayfish.device.api.registry;

import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.discovery.ASMDataTable;

import java.lang.annotation.Annotation;
import java.util.HashSet;
import java.util.Set;

public abstract class CDMRegistry<T extends ICDMRegistryItem<T>, R> {
public Set<T> registry = new HashSet<>();

public void populate(ASMDataTable dataTable){
Set<ASMDataTable.ASMData> anns = dataTable.getAll(CDMRegister.class.getCanonicalName());
for(ASMDataTable.ASMData data : anns){
try {
final String name = data.getClassName();
final Class<?> clazz = Class.forName(name);
for(Annotation a : clazz.getDeclaredAnnotations()){
final String n = a.annotationType().getCanonicalName();
if(n.equals(CDMRegister.class.getCanonicalName())){
final CDMRegister ann = (CDMRegister)a;
if(getRequiredSuperclass().isAssignableFrom(clazz)){
final Class<? extends R> cls = clazz.asSubclass(getRequiredSuperclass());
addItem(ann, cls);
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}

public abstract void addItem(CDMRegister annotation, Class<? extends R> annotatedClass);
public abstract void registerItems(Set<? extends ICDMRegistryItem> items);
public abstract Class<R> getRequiredSuperclass();
public abstract ResourceLocation getRegistryId();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.mrcrayfish.device.api.registry;

import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.discovery.ASMDataTable;

import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

public class DeviceModRegistry {
private static final Map<ResourceLocation, CDMRegistry<? extends ICDMRegistryItem<?>, ?>> REGISTRIES = new HashMap<>();

public static void addCDMRegistry(Class<? extends CDMRegistry<? extends ICDMRegistryItem<?>, ?>> cls){
try {
final CDMRegistry<? extends ICDMRegistryItem<?>, ?> instance = cls.newInstance();
REGISTRIES.put(instance.getRegistryId(), instance);
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
}

public static void startRegistries(ASMDataTable dataTable){
for(CDMRegistry<? extends ICDMRegistryItem, ?> reg : REGISTRIES.values()){
reg.populate(dataTable);
reg.registerItems(reg.registry);
}
}

@Nullable
public static CDMRegistry<? extends ICDMRegistryItem<?>, ?> getRegistry(String name){
final Optional optional = REGISTRIES.values().stream().filter(it -> it.getRegistryId().getResourcePath().equals(name)).findFirst();
if(optional.isPresent()){
return (CDMRegistry<? extends ICDMRegistryItem<?>, ?>) optional.get();
}
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.mrcrayfish.device.api.registry;

public interface ICDMRegistryItem<T> {
T getType();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.mrcrayfish.device.api.registry.app;

import com.mrcrayfish.device.MrCrayfishDeviceMod;
import com.mrcrayfish.device.Reference;
import com.mrcrayfish.device.api.ApplicationManager;
import com.mrcrayfish.device.api.app.Application;
import com.mrcrayfish.device.api.registry.BasicContainer;
import com.mrcrayfish.device.api.registry.CDMRegister;
import com.mrcrayfish.device.api.registry.CDMRegistry;
import com.mrcrayfish.device.api.registry.ICDMRegistryItem;
import net.minecraft.util.ResourceLocation;
import java.util.*;

public class ApplicationRegistry extends CDMRegistry<BasicContainer<Application>, Application> {

@Override
public void addItem(CDMRegister item, Class<? extends Application> annotatedClass) {
final BasicContainer<Application> app = newAppContainer(item, annotatedClass);
this.registry.add(app);
}

@Override
public Class<Application> getRequiredSuperclass() {
return Application.class;
}

@Override
public void registerItems(Set<? extends ICDMRegistryItem> items) {
for(ICDMRegistryItem item : items){
if(item.getType() instanceof BasicContainer){
BasicContainer app = (BasicContainer)item.getType();
ApplicationManager.registerApplication(app);
}
}
}

private static BasicContainer<Application> newAppContainer(CDMRegister app, Class<? extends Application> clazz){
MrCrayfishDeviceMod.getLogger().info("Constructing new app container...");
final BasicContainer<Application> ret = new BasicContainer<Application>(){

@Override
public BasicContainer<Application> getType() {
return this;
}

@Override
public Class<? extends Application> getContainedClass() {
return clazz;
}

@Override
public ResourceLocation getId() {
return new ResourceLocation(app.modId(), app.uid());
}

@Override
public boolean isSystem() {
return app.isSystem();
}
};
MrCrayfishDeviceMod.getLogger().info("\tDone!");
return ret;
}

@Override
public ResourceLocation getRegistryId() {
return new ResourceLocation(Reference.MOD_ID, "apps_registry");
}
}
Loading