8 changed files with 136 additions and 8 deletions
-
7src/src/main/java/com/my/graphiteDigesterBg/diframe/DiApplicationRunner.java
-
8src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDevice.java
-
3src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTask.java
-
10src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskBase.java
-
59src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskManager.java
-
9src/src/main/java/com/my/graphiteDigesterBg/diframe/Task.java
-
46src/src/main/java/com/my/graphiteDigesterBg/diframe/util/ClassHelper.java
-
2src/src/main/java/com/my/graphiteDigesterBg/task/TaskDigestion.java
@ -1,5 +1,8 @@ |
|||
package com.my.graphiteDigesterBg.diframe; |
|||
public interface DiTask { |
|||
// set parameter |
|||
void setParameter(Object parameter); |
|||
|
|||
// run |
|||
void run(); |
|||
} |
@ -1,15 +1,21 @@ |
|||
package com.my.graphiteDigesterBg.diframe; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
abstract public class DiTaskBase { |
|||
abstract public class DiTaskBase implements DiTask { |
|||
// parameter |
|||
private Map<String,Object> parameter; |
|||
private Object parameter; |
|||
// steps |
|||
private List<DiTaskStep> steps; |
|||
// step index |
|||
private Integer stepIndex; |
|||
|
|||
@Override |
|||
public void setParameter(Object parameter) { |
|||
this.parameter = parameter; |
|||
} |
|||
|
|||
// run |
|||
@Override |
|||
public void run() { |
|||
// do something |
|||
} |
|||
|
@ -0,0 +1,59 @@ |
|||
package com.my.graphiteDigesterBg.diframe; |
|||
import com.my.graphiteDigesterBg.diframe.util.ClassHelper; |
|||
import org.slf4j.Logger; |
|||
import org.slf4j.LoggerFactory; |
|||
import java.lang.reflect.Constructor; |
|||
import java.lang.reflect.InvocationTargetException; |
|||
import java.util.HashMap; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
public class DiTaskManager { |
|||
// logger |
|||
public static final Logger LOG = LoggerFactory.getLogger(DiTaskManager.class); |
|||
// task classes |
|||
private Map<String, Class<?>> taskClasses; |
|||
|
|||
// constructor |
|||
public DiTaskManager() { |
|||
this.taskClasses = new HashMap<>(); |
|||
} |
|||
|
|||
// get scan task classes |
|||
public void scanTaskClasses( String packageName ) { |
|||
List<Class<?>> taskClasses = ClassHelper.getAllClassesInPackage(packageName); |
|||
for ( Class<?> taskClass : taskClasses ) { |
|||
if ( DiTaskBase.class.isAssignableFrom(taskClass) ) { |
|||
Task task = taskClass.getAnnotation(Task.class); |
|||
if ( task != null ) { |
|||
this.taskClasses.put(task.name(), taskClass); |
|||
LOG.info("(Task) {} => {}", task.name(), taskClass.getName()); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// generate task |
|||
public DiTask generateTask( String name, Object parameter ) { |
|||
Class<?> taskClass = this.taskClasses.get(name); |
|||
if (null == taskClass) { |
|||
throw new RuntimeException("Task not found: " + name); |
|||
} |
|||
|
|||
Constructor<?> taskConstructor = null; |
|||
try { |
|||
taskConstructor = taskClass.getDeclaredConstructor(); |
|||
} catch (NoSuchMethodException e) { |
|||
throw new RuntimeException(e); |
|||
} |
|||
|
|||
DiTask task = null; |
|||
try { |
|||
task = (DiTask) taskConstructor.newInstance(); |
|||
} catch (InvocationTargetException | InstantiationException | IllegalAccessException e) { |
|||
throw new RuntimeException(e); |
|||
} |
|||
|
|||
task.setParameter(parameter); |
|||
return task; |
|||
} |
|||
} |
@ -0,0 +1,9 @@ |
|||
package com.my.graphiteDigesterBg.diframe; |
|||
import java.lang.annotation.Retention; |
|||
import java.lang.annotation.RetentionPolicy; |
|||
import java.lang.annotation.Target; |
|||
@Retention(RetentionPolicy.RUNTIME) |
|||
@Target({java.lang.annotation.ElementType.TYPE}) |
|||
public @interface Task { |
|||
String name(); |
|||
} |
@ -0,0 +1,46 @@ |
|||
package com.my.graphiteDigesterBg.diframe.util; |
|||
import java.io.File; |
|||
import java.io.IOException; |
|||
import java.net.URL; |
|||
import java.util.ArrayList; |
|||
import java.util.Collections; |
|||
import java.util.List; |
|||
public class ClassHelper { |
|||
// get all classes in package |
|||
public static List<Class<?>> getAllClassesInPackage(String packageName) { |
|||
List<Class<?>> classes = new ArrayList<>(); |
|||
try { |
|||
String packagePath = packageName.replace(".", "/"); |
|||
List<URL> resources = Collections.list(Thread.currentThread().getContextClassLoader().getResources(packagePath)); |
|||
for (URL resource : resources) { |
|||
if ( "file".equals(resource.getProtocol()) ) { |
|||
ClassHelper.getClassListByGivenFilePath(packageName,resource.getFile(), classes); |
|||
} else { |
|||
throw new RuntimeException("Unsupported protocol: " + resource.getProtocol()); |
|||
} |
|||
} |
|||
} catch (IOException e) { |
|||
throw new RuntimeException(e); |
|||
} |
|||
return classes; |
|||
} |
|||
|
|||
// get class list by given file path |
|||
private static void getClassListByGivenFilePath( String packageName, String filePath, List<Class<?>> classes ) { |
|||
File file = new File(filePath); |
|||
if ( file.isDirectory() ) { |
|||
for ( File subFile : file.listFiles() ) { |
|||
ClassHelper.getClassListByGivenFilePath(packageName + "." + subFile.getName(), subFile.getAbsolutePath(), classes); |
|||
} |
|||
} else { |
|||
if ( file.getName().endsWith(".class") ) { |
|||
try { |
|||
String className = packageName.substring(0, packageName.length() - 6); |
|||
classes.add(Class.forName(className)); |
|||
} catch (ClassNotFoundException e) { |
|||
throw new RuntimeException(e); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue