mirror of
https://github.com/wassname/ray.git
synced 2026-06-29 23:42:25 +08:00
[JavaWorker] Java code lint check and binding to CI (#2225)
* add java code lint check and fix the java code lint error * add java doc lint check and fix the java doc lint error * add java code and doc lint to the CI
This commit is contained in:
committed by
Philipp Moritz
parent
5789a247f9
commit
3b5e700fd7
+32
-32
@@ -1,40 +1,40 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<parent>
|
||||
<groupId>org.ray.parent</groupId>
|
||||
<artifactId>ray-superpom</artifactId>
|
||||
<version>1.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<parent>
|
||||
<groupId>org.ray.parent</groupId>
|
||||
<artifactId>ray-superpom</artifactId>
|
||||
<version>1.0</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>org.ray</groupId>
|
||||
<artifactId>ray-common</artifactId>
|
||||
<name>java common and util for ray</name>
|
||||
<description>java common and util for ray</description>
|
||||
<url></url>
|
||||
<groupId>org.ray</groupId>
|
||||
<artifactId>ray-common</artifactId>
|
||||
<name>java common and util for ray</name>
|
||||
<description>java common and util for ray</description>
|
||||
<url></url>
|
||||
|
||||
<packaging>jar</packaging>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
<version>1.2.17</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>quartz</groupId>
|
||||
<artifactId>quartz</artifactId>
|
||||
<version>1.5.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.ini4j</groupId>
|
||||
<artifactId>ini4j</artifactId>
|
||||
<version>0.5.2</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
<version>1.2.17</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>quartz</groupId>
|
||||
<artifactId>quartz</artifactId>
|
||||
<version>1.5.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.ini4j</groupId>
|
||||
<artifactId>ini4j</artifactId>
|
||||
<version>0.5.2</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
||||
</project>
|
||||
|
||||
@@ -3,14 +3,14 @@ package org.ray.util;
|
||||
import java.util.Random;
|
||||
|
||||
/**
|
||||
* Common utilities
|
||||
* Common utilities.
|
||||
*/
|
||||
public class CommonUtil {
|
||||
|
||||
private static final Random seed = new Random();
|
||||
|
||||
/**
|
||||
* Get random number between 0 and (max-1)
|
||||
* Get random number between 0 and (max-1).
|
||||
*/
|
||||
public static int getRandom(int max) {
|
||||
return Math.abs(seed.nextInt() % max);
|
||||
|
||||
@@ -53,10 +53,8 @@ public class NetworkUtil {
|
||||
ds.setReuseAddress(true);
|
||||
return true;
|
||||
} catch (IOException ignored) {
|
||||
/* should not be thrown */
|
||||
return false;
|
||||
}
|
||||
|
||||
/* should not be thrown */
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,8 @@ public class ObjectUtil {
|
||||
public static <T> T newObject(Class<T> cls) {
|
||||
try {
|
||||
return cls.getConstructor().newInstance();
|
||||
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
|
||||
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException
|
||||
| InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -6,29 +6,15 @@ import java.util.Vector;
|
||||
|
||||
public class StringUtil {
|
||||
|
||||
// Holds the start of an element and which brace started it.
|
||||
private static class Start {
|
||||
|
||||
// The brace number from the braces string in use.
|
||||
final int brace;
|
||||
// The position in the string it was seen.
|
||||
final int pos;
|
||||
|
||||
// Constructor.
|
||||
public Start(int brace, int pos) {
|
||||
this.brace = brace;
|
||||
this.pos = pos;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param s input string
|
||||
* split.
|
||||
* @param s input string
|
||||
* @param splitters common splitters
|
||||
* @param open open braces
|
||||
* @param close close braces
|
||||
* @param open open braces
|
||||
* @param close close braces
|
||||
* @return output array list
|
||||
*/
|
||||
public static Vector<String> Split(String s, String splitters, String open, String close) {
|
||||
public static Vector<String> split(String s, String splitters, String open, String close) {
|
||||
// The splits.
|
||||
Vector<String> split = new Vector<>();
|
||||
// The stack.
|
||||
@@ -130,5 +116,20 @@ public class StringUtil {
|
||||
}
|
||||
return objs.length == 0 ? "" : sb.substring(0, sb.length() - concatenator.length());
|
||||
}
|
||||
|
||||
// Holds the start of an element and which brace started it.
|
||||
private static class Start {
|
||||
|
||||
// The brace number from the braces string in use.
|
||||
final int brace;
|
||||
// The position in the string it was seen.
|
||||
final int pos;
|
||||
|
||||
// Constructor.
|
||||
public Start(int brace, int pos) {
|
||||
this.brace = brace;
|
||||
this.pos = pos;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,10 +6,13 @@ import java.util.concurrent.locks.ReentrantLock;
|
||||
import org.ray.util.logger.RayLog;
|
||||
|
||||
/**
|
||||
* some utilities for system process
|
||||
* some utilities for system process.
|
||||
*/
|
||||
public class SystemUtil {
|
||||
|
||||
static final ReentrantLock pidlock = new ReentrantLock();
|
||||
static Integer pid;
|
||||
|
||||
public static String userHome() {
|
||||
return System.getProperty("user.home");
|
||||
}
|
||||
@@ -36,9 +39,6 @@ public class SystemUtil {
|
||||
}
|
||||
}
|
||||
|
||||
static Integer pid;
|
||||
static final ReentrantLock pidlock = new ReentrantLock();
|
||||
|
||||
public static int pid() {
|
||||
if (pid == null) {
|
||||
pidlock.lock();
|
||||
|
||||
@@ -13,24 +13,24 @@ import java.lang.annotation.Target;
|
||||
public @interface AConfig {
|
||||
|
||||
/**
|
||||
* comments for this configuration field
|
||||
* comments for this configuration field.
|
||||
*/
|
||||
String comment();
|
||||
|
||||
/**
|
||||
* when the config is an array list, a splitter set is specified, e.g., " \t" to use ' ' and '\t'
|
||||
* as possible splits
|
||||
* as possible splits.
|
||||
*/
|
||||
String splitters() default ", \t";
|
||||
|
||||
/**
|
||||
* indirect with value as the new section name, the field name remains the same
|
||||
* indirect with value as the new section name, the field name remains the same.
|
||||
*/
|
||||
String defaultIndirectSectionName() default "";
|
||||
|
||||
/**
|
||||
* see ConfigReader.getIndirectStringArray this config tells which is the default
|
||||
* indirectSectionName in that function
|
||||
* indirectSectionName in that function.
|
||||
*/
|
||||
String defaultArrayIndirectSectionName() default "";
|
||||
}
|
||||
|
||||
@@ -43,10 +43,6 @@ public class ConfigReader {
|
||||
|
||||
}
|
||||
|
||||
public String filePath() {
|
||||
return file;
|
||||
}
|
||||
|
||||
private void loadConfigFile(String filePath) throws Exception {
|
||||
|
||||
this.currentUseConfig.filePath = filePath;
|
||||
@@ -106,46 +102,16 @@ public class ConfigReader {
|
||||
}
|
||||
}
|
||||
|
||||
public String filePath() {
|
||||
return file;
|
||||
}
|
||||
|
||||
public CurrentUseConfig getCurrentUseConfig() {
|
||||
return currentUseConfig;
|
||||
}
|
||||
|
||||
private synchronized <T> String getOriValue(String sectionKey, String configKey, T defaultValue,
|
||||
String deptr) {
|
||||
if (null == deptr) {
|
||||
throw new RuntimeException("desc must not be empty of the key:" + configKey);
|
||||
}
|
||||
Profile.Section section = ini.get(sectionKey);
|
||||
String oriValue = null;
|
||||
if (section != null && section.containsKey(configKey)) {
|
||||
oriValue = section.get(configKey);
|
||||
}
|
||||
|
||||
if (!currentUseConfig.sectionMap.containsKey(sectionKey)) {
|
||||
ConfigSection configSection = new ConfigSection();
|
||||
configSection.sectionKey = sectionKey;
|
||||
updateConfigSection(configSection, configKey, defaultValue, deptr, oriValue);
|
||||
currentUseConfig.sectionMap.put(sectionKey, configSection);
|
||||
} else if (!currentUseConfig.sectionMap.get(sectionKey).itemMap.containsKey(configKey)) {
|
||||
ConfigSection configSection = currentUseConfig.sectionMap.get(sectionKey);
|
||||
updateConfigSection(configSection, configKey, defaultValue, deptr, oriValue);
|
||||
}
|
||||
return oriValue;
|
||||
}
|
||||
|
||||
private <T> void updateConfigSection(ConfigSection configSection, String configKey,
|
||||
T defaultValue, String deptr, String oriValue) {
|
||||
ConfigItem<T> configItem = new ConfigItem<>();
|
||||
configItem.defaultValue = defaultValue;
|
||||
configItem.key = configKey;
|
||||
configItem.oriValue = oriValue;
|
||||
configItem.desc = deptr;
|
||||
configSection.itemMap.put(configKey, configItem);
|
||||
}
|
||||
|
||||
|
||||
public String getStringValue(String sectionKey, String configKey, String defaultValue,
|
||||
String dsptr) {
|
||||
String dsptr) {
|
||||
String value = getOriValue(sectionKey, configKey, defaultValue, dsptr);
|
||||
if (value != null) {
|
||||
return value;
|
||||
@@ -155,7 +121,7 @@ public class ConfigReader {
|
||||
}
|
||||
|
||||
public boolean getBooleanValue(String sectionKey, String configKey, boolean defaultValue,
|
||||
String dsptr) {
|
||||
String dsptr) {
|
||||
String value = getOriValue(sectionKey, configKey, defaultValue, dsptr);
|
||||
if (value != null) {
|
||||
if (value.length() == 0) {
|
||||
@@ -181,6 +147,39 @@ public class ConfigReader {
|
||||
}
|
||||
}
|
||||
|
||||
private synchronized <T> String getOriValue(String sectionKey, String configKey, T defaultValue,
|
||||
String deptr) {
|
||||
if (null == deptr) {
|
||||
throw new RuntimeException("desc must not be empty of the key:" + configKey);
|
||||
}
|
||||
Profile.Section section = ini.get(sectionKey);
|
||||
String oriValue = null;
|
||||
if (section != null && section.containsKey(configKey)) {
|
||||
oriValue = section.get(configKey);
|
||||
}
|
||||
|
||||
if (!currentUseConfig.sectionMap.containsKey(sectionKey)) {
|
||||
ConfigSection configSection = new ConfigSection();
|
||||
configSection.sectionKey = sectionKey;
|
||||
updateConfigSection(configSection, configKey, defaultValue, deptr, oriValue);
|
||||
currentUseConfig.sectionMap.put(sectionKey, configSection);
|
||||
} else if (!currentUseConfig.sectionMap.get(sectionKey).itemMap.containsKey(configKey)) {
|
||||
ConfigSection configSection = currentUseConfig.sectionMap.get(sectionKey);
|
||||
updateConfigSection(configSection, configKey, defaultValue, deptr, oriValue);
|
||||
}
|
||||
return oriValue;
|
||||
}
|
||||
|
||||
private <T> void updateConfigSection(ConfigSection configSection, String configKey,
|
||||
T defaultValue, String deptr, String oriValue) {
|
||||
ConfigItem<T> configItem = new ConfigItem<>();
|
||||
configItem.defaultValue = defaultValue;
|
||||
configItem.key = configKey;
|
||||
configItem.oriValue = oriValue;
|
||||
configItem.desc = deptr;
|
||||
configSection.itemMap.put(configKey, configItem);
|
||||
}
|
||||
|
||||
public long getLongValue(String sectionKey, String configKey, long defaultValue, String dsptr) {
|
||||
String value = getOriValue(sectionKey, configKey, defaultValue, dsptr);
|
||||
if (value != null) {
|
||||
@@ -195,7 +194,7 @@ public class ConfigReader {
|
||||
}
|
||||
|
||||
public double getDoubleValue(String sectionKey, String configKey, double defaultValue,
|
||||
String dsptr) {
|
||||
String dsptr) {
|
||||
String value = getOriValue(sectionKey, configKey, defaultValue, dsptr);
|
||||
if (value != null) {
|
||||
if (value.length() == 0) {
|
||||
@@ -210,7 +209,7 @@ public class ConfigReader {
|
||||
|
||||
|
||||
public int[] getIntegerArray(String sectionKey, String configKey, int[] defaultValue,
|
||||
String dsptr) {
|
||||
String dsptr) {
|
||||
String value = getOriValue(sectionKey, configKey, defaultValue, dsptr);
|
||||
int[] array = defaultValue;
|
||||
if (value != null) {
|
||||
@@ -226,24 +225,22 @@ public class ConfigReader {
|
||||
/**
|
||||
* get a string list from a whole section as keys e.g., [core] data_dirs = local.dirs # or
|
||||
* cluster.dirs
|
||||
*
|
||||
* [local.dirs] /home/xxx/1 /home/yyy/2
|
||||
*
|
||||
* [cluster.dirs] ...
|
||||
*
|
||||
* @param sectionKey e.g., core
|
||||
* @param configKey e.g., data_dirs
|
||||
* @param sectionKey e.g., core
|
||||
* @param configKey e.g., data_dirs
|
||||
* @param indirectSectionName e.g., cluster.dirs
|
||||
* @return string list
|
||||
*/
|
||||
public String[] getIndirectStringArray(String sectionKey, String configKey,
|
||||
String indirectSectionName, String dsptr) {
|
||||
String indirectSectionName, String dsptr) {
|
||||
String s = getStringValue(sectionKey, configKey, indirectSectionName, dsptr);
|
||||
Profile.Section section = ini.get(s);
|
||||
if (section == null) {
|
||||
return new String[]{};
|
||||
return new String[] {};
|
||||
} else {
|
||||
return section.keySet().toArray(new String[]{});
|
||||
return section.keySet().toArray(new String[] {});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -326,8 +323,9 @@ public class ConfigReader {
|
||||
String sv = getStringValue(section, fld.getName(), defaultFldValue.toString(), comment);
|
||||
Object v;
|
||||
try {
|
||||
v = fld.getType().getConstructor(new Class<?>[]{String.class}).newInstance(sv);
|
||||
} catch (NoSuchMethodException | SecurityException | InstantiationException | InvocationTargetException e) {
|
||||
v = fld.getType().getConstructor(new Class<?>[] {String.class}).newInstance(sv);
|
||||
} catch (NoSuchMethodException | SecurityException | InstantiationException
|
||||
| InvocationTargetException e) {
|
||||
System.err.println(
|
||||
section + "." + fld.getName() + "'s format (" + sv + ") is invalid, default to "
|
||||
+ defaultFldValue.toString());
|
||||
@@ -340,7 +338,7 @@ public class ConfigReader {
|
||||
if (null == ss) {
|
||||
fld.set(obj, defaultFldValue);
|
||||
} else {
|
||||
Vector<String> ls = StringUtil.Split(ss, splitters, "", "");
|
||||
Vector<String> ls = StringUtil.split(ss, splitters, "", "");
|
||||
if (ccls.equals(boolean.class)) {
|
||||
boolean[] v = ObjectUtil
|
||||
.toBooleanArray(ls.stream().map(Boolean::parseBoolean).toArray());
|
||||
@@ -357,7 +355,7 @@ public class ConfigReader {
|
||||
} else if (ccls.equals(String.class)) {
|
||||
String[] v;
|
||||
if (StringUtil.isNullOrEmpty(defaultArrayIndirectSectionName)) {
|
||||
v = ls.toArray(new String[]{});
|
||||
v = ls.toArray(new String[] {});
|
||||
} else {
|
||||
v = this
|
||||
.getIndirectStringArray(section, fld.getName(),
|
||||
|
||||
@@ -8,7 +8,6 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||
*/
|
||||
public class ConfigSection {
|
||||
|
||||
public String sectionKey;
|
||||
|
||||
public final Map<String, ConfigItem<?>> itemMap = new ConcurrentHashMap<>();
|
||||
public String sectionKey;
|
||||
}
|
||||
|
||||
@@ -9,8 +9,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||
*/
|
||||
public class CurrentUseConfig {
|
||||
|
||||
public final Map<String, ConfigSection> sectionMap = new ConcurrentHashMap<>();
|
||||
public String filePath;
|
||||
|
||||
public final Map<String, ConfigSection> sectionMap = new ConcurrentHashMap<>();
|
||||
|
||||
}
|
||||
|
||||
@@ -9,20 +9,8 @@ import java.util.List;
|
||||
*/
|
||||
public class Composition {
|
||||
|
||||
public static class TR {
|
||||
|
||||
public final int Tcount;
|
||||
public final int Rcount;
|
||||
|
||||
public TR(int tcount, int rcount) {
|
||||
super();
|
||||
Tcount = tcount;
|
||||
Rcount = rcount;
|
||||
}
|
||||
}
|
||||
|
||||
public static List<TR> calculate(int maxT, int maxR) {
|
||||
List<TR> ret = new ArrayList<>();
|
||||
public static List<Tr> calculate(int maxT, int maxR) {
|
||||
List<Tr> ret = new ArrayList<>();
|
||||
for (int t = 0; t <= maxT; t++) {
|
||||
|
||||
// <= 0 for dynamic return count
|
||||
@@ -30,9 +18,21 @@ public class Composition {
|
||||
// -1 for call_n returns RayObject<>[N]
|
||||
|
||||
for (int r = -1; r <= maxR; r++) {
|
||||
ret.add(new TR(t, r));
|
||||
ret.add(new Tr(t, r));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static class Tr {
|
||||
|
||||
public final int tcount;
|
||||
public final int rcount;
|
||||
|
||||
public Tr(int tcount, int rcount) {
|
||||
super();
|
||||
this.tcount = tcount;
|
||||
this.rcount = rcount;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ package org.ray.util.generator;
|
||||
|
||||
import java.io.IOException;
|
||||
import org.ray.util.FileUtil;
|
||||
import org.ray.util.generator.Composition.TR;
|
||||
import org.ray.util.generator.Composition.Tr;
|
||||
|
||||
/**
|
||||
* Generate all classes in org.ray.api.funcs
|
||||
@@ -16,10 +16,10 @@ public class FuncsGenerator {
|
||||
}
|
||||
|
||||
private static void generate(String rootdir) throws IOException {
|
||||
for (TR tr : Composition.calculate(Share.MAX_T, Share.MAX_R)) {
|
||||
String str = build(tr.Tcount, tr.Rcount);
|
||||
String file = rootdir + "/RayFunc_" + tr.Tcount + "_"
|
||||
+ (tr.Rcount <= 0 ? (tr.Rcount == 0 ? "n" : "n_list") : tr.Rcount) + ".java";
|
||||
for (Tr tr : Composition.calculate(Share.MAX_T, Share.MAX_R)) {
|
||||
String str = build(tr.tcount, tr.rcount);
|
||||
String file = rootdir + "/RayFunc_" + tr.tcount + "_"
|
||||
+ (tr.rcount <= 0 ? (tr.rcount == 0 ? "n" : "n_list") : tr.rcount) + ".java";
|
||||
FileUtil.overrideFile(file, str);
|
||||
System.err.println("override " + file);
|
||||
}
|
||||
@@ -34,20 +34,21 @@ public class FuncsGenerator {
|
||||
*
|
||||
* public static <R0> R0 execute(Object[] args) throws Throwable { String name =
|
||||
* (String)args[args.length - 2]; assert (name.equals(RayFunc_0_1.class.getName())); byte[]
|
||||
* funcBytes = (byte[])args[args.length - 1]; RayFunc_0_1<R0> f = (RayFunc_0_1<R0>)SerializationUtils.deserialize(funcBytes);
|
||||
* funcBytes = (byte[])args[args.length - 1]; RayFunc_0_1<R0> f = (RayFunc_0_1<R0>)
|
||||
* SerializationUtils.deserialize(funcBytes);
|
||||
* return f.apply(); } }
|
||||
*/
|
||||
private static String build(int Tcount, int Rcount) {
|
||||
private static String build(int tcount, int rcount) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
String tname =
|
||||
"Ray" + "Func_" + Tcount + "_" + (Rcount <= 0 ? (Rcount == 0 ? "n" : "n_list") : Rcount);
|
||||
String gname = tname + "<" + Share.buildClassDeclare(Tcount, Rcount) + ">";
|
||||
"Ray" + "Func_" + tcount + "_" + (rcount <= 0 ? (rcount == 0 ? "n" : "n_list") : rcount);
|
||||
final String gname = tname + "<" + Share.buildClassDeclare(tcount, rcount) + ">";
|
||||
|
||||
sb.append("package org.ray.api.funcs;").append("\n");
|
||||
if (Rcount > 1) {
|
||||
if (rcount > 1) {
|
||||
sb.append("import org.ray.api.returns.*;").append("\n");
|
||||
}
|
||||
if (Rcount <= 0) {
|
||||
if (rcount <= 0) {
|
||||
sb.append("import java.util.Collection;").append("\n");
|
||||
sb.append("import java.util.List;").append("\n");
|
||||
sb.append("import java.util.Map;").append("\n");
|
||||
@@ -60,14 +61,14 @@ public class FuncsGenerator {
|
||||
sb.append("@FunctionalInterface").append("\n");
|
||||
sb.append("public interface ").append(gname).append(" extends RayFunc {")
|
||||
.append("\n");
|
||||
sb.append("\t").append(Share.buildFuncReturn(Rcount)).append(" apply(")
|
||||
.append(Rcount == 0 ? ("Collection<RID> returnids" + (Tcount > 0 ? ", " : "")) : "")
|
||||
.append(Share.buildParameter(Tcount, "T", null)).append(") throws Throwable;")
|
||||
sb.append("\t").append(Share.buildFuncReturn(rcount)).append(" apply(")
|
||||
.append(rcount == 0 ? ("Collection<RID> returnids" + (tcount > 0 ? ", " : "")) : "")
|
||||
.append(Share.buildParameter(tcount, "T", null)).append(") throws Throwable;")
|
||||
.append("\n");
|
||||
|
||||
sb.append("\t\n");
|
||||
sb.append("\tpublic static " + "<").append(Share.buildClassDeclare(Tcount, Rcount))
|
||||
.append(">").append(" ").append(Share.buildFuncReturn(Rcount))
|
||||
sb.append("\tpublic static " + "<").append(Share.buildClassDeclare(tcount, rcount))
|
||||
.append(">").append(" ").append(Share.buildFuncReturn(rcount))
|
||||
.append(" execute(Object[] args) throws Throwable {").append("\n");
|
||||
sb.append("\t\tString name = (String)args[args.length - 2];").append("\n");
|
||||
sb.append("\t\tassert (name.equals(").append(tname).append(".class.getName()));").append("\n");
|
||||
@@ -75,8 +76,8 @@ public class FuncsGenerator {
|
||||
sb.append("\t\t").append(gname).append(" f = SerializationUtils.deserialize(funcBytes);")
|
||||
.append("\n");
|
||||
sb.append("\t\treturn f.apply(")
|
||||
.append(Rcount == 0 ? ("(Collection<RID>)args[0]" + (Tcount > 0 ? ", " : "")) : "")
|
||||
.append(Share.buildParameterUse2(Tcount, Rcount == 0 ? 1 : 0, "T", "args[", "]"))
|
||||
.append(rcount == 0 ? ("(Collection<RID>)args[0]" + (tcount > 0 ? ", " : "")) : "")
|
||||
.append(Share.buildParameterUse2(tcount, rcount == 0 ? 1 : 0, "T", "args[", "]"))
|
||||
.append(");").append("\n");
|
||||
sb.append("\t}").append("\n");
|
||||
sb.append("\t\n");
|
||||
|
||||
@@ -20,35 +20,25 @@ public class MultipleReturnGenerator {
|
||||
}
|
||||
|
||||
/**
|
||||
* package org.ray.api.returns;
|
||||
*
|
||||
* public class MultipleReturns2<R0, R1> extends MultipleReturns {
|
||||
*
|
||||
* public MultipleReturns2(R0 r0, R1 r1) { super(new Object[] { r0, r1 }); }
|
||||
*
|
||||
* public R0 get0() { return (R0) this.values[0]; }
|
||||
*
|
||||
* public R1 get1() { return (R1) this.values[1]; }
|
||||
*
|
||||
* }
|
||||
* package org.ray.api.returns.
|
||||
*/
|
||||
private static String build(int Rcount) {
|
||||
private static String build(int rcount) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("package org.ray.api.returns;").append("\n");
|
||||
sb.append("import org.ray.api.*;").append("\n");
|
||||
sb.append("@SuppressWarnings(\"unchecked\")");
|
||||
sb.append("public class MultipleReturns").append(Rcount).append("<")
|
||||
.append(Share.buildClassDeclare(0, Rcount)).append("> extends MultipleReturns {")
|
||||
sb.append("public class MultipleReturns").append(rcount).append("<")
|
||||
.append(Share.buildClassDeclare(0, rcount)).append("> extends MultipleReturns {")
|
||||
.append("\n");
|
||||
sb.append("\tpublic MultipleReturns").append(Rcount).append("(")
|
||||
.append(Share.buildParameter(Rcount, "R", null)).append(") {")
|
||||
sb.append("\tpublic MultipleReturns").append(rcount).append("(")
|
||||
.append(Share.buildParameter(rcount, "R", null)).append(") {")
|
||||
.append("\n");
|
||||
sb.append("\t\tsuper(new Object[] { ").append(Share.buildParameterUse(Rcount, "R"))
|
||||
sb.append("\t\tsuper(new Object[] { ").append(Share.buildParameterUse(rcount, "R"))
|
||||
.append(" });")
|
||||
.append("\n");
|
||||
sb.append("\t}").append("\n");
|
||||
|
||||
for (int k = 0; k < Rcount; k++) {
|
||||
for (int k = 0; k < rcount; k++) {
|
||||
sb.append(buildGetter(k));
|
||||
}
|
||||
|
||||
|
||||
@@ -35,23 +35,23 @@ public class RayObjectsGenerator {
|
||||
*
|
||||
* public RayObject<R1> r1() { return objs[1]; } }
|
||||
*/
|
||||
private static String build(int Rcount) {
|
||||
private static String build(int rcount) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("package org.ray.api.returns;\n");
|
||||
sb.append("import org.ray.api.*;\n");
|
||||
sb.append("import org.ray.spi.model.UniqueID;\n");
|
||||
sb.append("@SuppressWarnings({\"rawtypes\", \"unchecked\"})");
|
||||
sb.append("public class RayObjects").append(Rcount).append("<")
|
||||
.append(Share.buildClassDeclare(0, Rcount)).append("> extends RayObjects {")
|
||||
sb.append("public class RayObjects").append(rcount).append("<")
|
||||
.append(Share.buildClassDeclare(0, rcount)).append("> extends RayObjects {")
|
||||
.append("\n");
|
||||
sb.append("\tpublic RayObjects").append(Rcount).append("(UniqueID[] ids) {").append("\n");
|
||||
sb.append("\tpublic RayObjects").append(rcount).append("(UniqueID[] ids) {").append("\n");
|
||||
sb.append("\t\tsuper(ids);").append("\n");
|
||||
sb.append("\t}").append("\n");
|
||||
sb.append("\tpublic RayObjects").append(Rcount).append("(RayObject objs[]) {").append("\n");
|
||||
sb.append("\tpublic RayObjects").append(rcount).append("(RayObject objs[]) {").append("\n");
|
||||
sb.append("\t\tsuper(objs);").append("\n");
|
||||
sb.append("\t}").append("\n");
|
||||
|
||||
for (int k = 0; k < Rcount; k++) {
|
||||
for (int k = 0; k < rcount; k++) {
|
||||
sb.append(buildGetter(k));
|
||||
}
|
||||
|
||||
@@ -59,9 +59,6 @@ public class RayObjectsGenerator {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* public RayObject<R0> r0() { return objs[0]; }
|
||||
*/
|
||||
private static String buildGetter(int index) {
|
||||
return "\tpublic RayObject<R" + index + "> r" + index + "() {\n"
|
||||
+ "\t\treturn objs[" + index + "];\n"
|
||||
|
||||
@@ -4,7 +4,7 @@ import java.io.IOException;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import org.ray.util.FileUtil;
|
||||
import org.ray.util.generator.Composition.TR;
|
||||
import org.ray.util.generator.Composition.Tr;
|
||||
|
||||
/**
|
||||
* Generate Rpc.java
|
||||
@@ -29,90 +29,75 @@ public class RpcGenerator {
|
||||
|
||||
sb.append("@SuppressWarnings({\"rawtypes\", \"unchecked\"})\n");
|
||||
sb.append("class Rpc {\n");
|
||||
for (TR tr : Composition.calculate(Share.MAX_T, Share.MAX_R)) {
|
||||
buildCall(sb, tr.Tcount, tr.Rcount);
|
||||
for (Tr tr : Composition.calculate(Share.MAX_T, Share.MAX_R)) {
|
||||
buildCall(sb, tr.tcount, tr.rcount);
|
||||
}
|
||||
sb.append("}\n");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private static void buildCall(StringBuilder sb, int Tcount, int Rcount) {
|
||||
for (Set<Integer> whichTisFuture : whichTisFutureComposition(Tcount)) {
|
||||
sb.append(buildCall(Tcount, Rcount, whichTisFuture));
|
||||
private static void buildCall(StringBuilder sb, int tcount, int rcount) {
|
||||
for (Set<Integer> whichTisFuture : whichTisFutureComposition(tcount)) {
|
||||
sb.append(buildCall(tcount, rcount, whichTisFuture));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* public static <T0, R0> RayObject<R0> call(RayFunc_1_1<T0, R0> f, RayObject<T0> arg) { return
|
||||
* Ray.runtime().rpc(() -> f.apply(null), arg).objs[0]; }
|
||||
*/
|
||||
private static String buildCall(int Tcount, int Rcount, Set<Integer> whichTisFuture) {
|
||||
private static String buildCall(int tcount, int rcount, Set<Integer> whichTisFuture) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
String parameter = (Tcount == 0 ? ""
|
||||
: ", " + Share.buildParameter(Tcount, "T", whichTisFuture));
|
||||
sb.append("\tpublic static <").append(Share.buildClassDeclare(Tcount, Rcount)).append("> ")
|
||||
.append(Share.buildRpcReturn(Rcount)).append(" call")
|
||||
.append(Rcount == 1 ? "" : (Rcount <= 0 ? "_n" : ("_" + Rcount))).append("(RayFunc_")
|
||||
.append(Tcount).append("_")
|
||||
.append(Rcount <= 0 ? (Rcount == 0 ? "n" : "n_list") : Rcount).append("<")
|
||||
.append(Share.buildClassDeclare(Tcount, Rcount)).append("> f").append(
|
||||
Rcount <= 0 ? (Rcount == 0 ? ", Collection<RID> returnids" : ", Integer returnCount")
|
||||
String parameter = (tcount == 0 ? ""
|
||||
: ", " + Share.buildParameter(tcount, "T", whichTisFuture));
|
||||
sb.append("\tpublic static <").append(Share.buildClassDeclare(tcount, rcount)).append("> ")
|
||||
.append(Share.buildRpcReturn(rcount)).append(" call")
|
||||
.append(rcount == 1 ? "" : (rcount <= 0 ? "_n" : ("_" + rcount))).append("(RayFunc_")
|
||||
.append(tcount).append("_")
|
||||
.append(rcount <= 0 ? (rcount == 0 ? "n" : "n_list") : rcount).append("<")
|
||||
.append(Share.buildClassDeclare(tcount, rcount)).append("> f").append(
|
||||
rcount <= 0 ? (rcount == 0 ? ", Collection<RID> returnids" : ", Integer returnCount")
|
||||
: "").append(parameter).append(") {\n");
|
||||
|
||||
/*
|
||||
* public static <R0> RayObject<R0> call(RayFunc_0_1<R0> f) {
|
||||
if (Ray.Parameters().remoteLambda()) {
|
||||
return Ray.internal().call(RayFunc_0_1.class, f, 1).objs[0];
|
||||
}
|
||||
else {
|
||||
return Ray.internal().call(() -> f.apply(), 1).objs[0];
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
String nulls = Share.buildRepeat("null",
|
||||
Tcount + (Rcount == 0 ? 1/*for first arg map*/ : 0));
|
||||
String parameterUse = (Tcount == 0 ? "" : (", " + Share.buildParameterUse(Tcount, "T")));
|
||||
tcount + (rcount == 0 ? 1/*for first arg map*/ : 0));
|
||||
String parameterUse = (tcount == 0 ? "" : (", " + Share.buildParameterUse(tcount, "T")));
|
||||
String labmdaUse = "RayFunc_"
|
||||
+ Tcount + "_" + (Rcount <= 0 ? (Rcount == 0 ? "n" : "n_list") : Rcount)
|
||||
+ tcount + "_" + (rcount <= 0 ? (rcount == 0 ? "n" : "n_list") : rcount)
|
||||
+ ".class, f";
|
||||
|
||||
sb.append("\t\tif (Ray.Parameters().remoteLambda()) {\n");
|
||||
if (Rcount == 1) {
|
||||
if (rcount == 1) {
|
||||
sb.append("\t\t\treturn Ray.internal().call(null, ").append(labmdaUse).append(", 1")
|
||||
.append(parameterUse).append(").objs[0];")
|
||||
.append("\n");
|
||||
} else if (Rcount == 0) {
|
||||
} else if (rcount == 0) {
|
||||
sb.append("\t\t\treturn Ray.internal().callWithReturnLabels(null, ")
|
||||
.append(labmdaUse).append(", returnids").append(parameterUse).append(");")
|
||||
.append("\n");
|
||||
} else if (Rcount < 0) {
|
||||
} else if (rcount < 0) {
|
||||
sb.append("\t\t\treturn Ray.internal().callWithReturnIndices(null, ")
|
||||
.append(labmdaUse).append(", returnCount").append(parameterUse).append(");")
|
||||
.append("\n");
|
||||
} else {
|
||||
sb.append("\t\t\treturn new RayObjects").append(Rcount)
|
||||
.append("(Ray.internal().call(null, ").append(labmdaUse).append(", ").append(Rcount)
|
||||
sb.append("\t\t\treturn new RayObjects").append(rcount)
|
||||
.append("(Ray.internal().call(null, ").append(labmdaUse).append(", ").append(rcount)
|
||||
.append(parameterUse).append(").objs);")
|
||||
.append("\n");
|
||||
}
|
||||
sb.append("\t\t} else {\n");
|
||||
if (Rcount == 1) {
|
||||
if (rcount == 1) {
|
||||
sb.append("\t\t\treturn Ray.internal().call(null, () -> f.apply(").append(nulls)
|
||||
.append("), 1").append(parameterUse).append(").objs[0];")
|
||||
.append("\n");
|
||||
} else if (Rcount == 0) {
|
||||
} else if (rcount == 0) {
|
||||
sb.append("\t\t\treturn Ray.internal().callWithReturnLabels(null, () -> f.apply(")
|
||||
.append(nulls).append("), returnids").append(parameterUse).append(");")
|
||||
.append("\n");
|
||||
} else if (Rcount < 0) {
|
||||
} else if (rcount < 0) {
|
||||
sb.append("\t\t\treturn Ray.internal().callWithReturnIndices(null, () -> f.apply(")
|
||||
.append(nulls).append("), returnCount").append(parameterUse).append(");")
|
||||
.append("\n");
|
||||
} else {
|
||||
sb.append("\t\t\treturn new RayObjects").append(Rcount)
|
||||
sb.append("\t\t\treturn new RayObjects").append(rcount)
|
||||
.append("(Ray.internal().call(null, () -> f.apply(").append(nulls).append("), ")
|
||||
.append(Rcount).append(parameterUse).append(").objs);")
|
||||
.append(rcount).append(parameterUse).append(").objs);")
|
||||
.append("\n");
|
||||
}
|
||||
sb.append("\t\t}\n");
|
||||
@@ -120,34 +105,34 @@ public class RpcGenerator {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private static Set<Set<Integer>> whichTisFutureComposition(int Tcount) {
|
||||
private static Set<Set<Integer>> whichTisFutureComposition(int tcount) {
|
||||
Set<Set<Integer>> ret = new HashSet<>();
|
||||
Set<Integer> N = new HashSet<>();
|
||||
for (int k = 0; k < Tcount; k++) {
|
||||
N.add(k);
|
||||
Set<Integer> n = new HashSet<>();
|
||||
for (int k = 0; k < tcount; k++) {
|
||||
n.add(k);
|
||||
}
|
||||
for (int k = 0; k <= Tcount; k++) {
|
||||
ret.addAll(CNn(N, k));
|
||||
for (int k = 0; k <= tcount; k++) {
|
||||
ret.addAll(cnn(n, k));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
//pick n numbers in N
|
||||
private static Set<Set<Integer>> CNn(Set<Integer> N, int n) {
|
||||
private static Set<Set<Integer>> cnn(Set<Integer> bigN, int n) {
|
||||
C c = new C();
|
||||
for (int k = 0; k < n; k++) {
|
||||
c.mul(N);
|
||||
c.mul(bigN);
|
||||
}
|
||||
return c.v;
|
||||
return c.vc;
|
||||
}
|
||||
|
||||
static class C {
|
||||
|
||||
Set<Set<Integer>> v;
|
||||
Set<Set<Integer>> vc;
|
||||
|
||||
public C() {
|
||||
v = new HashSet<>();
|
||||
v.add(new HashSet<>());
|
||||
vc = new HashSet<>();
|
||||
vc.add(new HashSet<>());
|
||||
}
|
||||
|
||||
void mul(Set<Integer> ns) {
|
||||
@@ -155,12 +140,12 @@ public class RpcGenerator {
|
||||
for (int n : ns) {
|
||||
ret.addAll(mul(n));
|
||||
}
|
||||
this.v = ret;
|
||||
this.vc = ret;
|
||||
}
|
||||
|
||||
Set<Set<Integer>> mul(int n) {
|
||||
Set<Set<Integer>> ret = new HashSet<>();
|
||||
for (Set<Integer> s : v) {
|
||||
for (Set<Integer> s : vc) {
|
||||
if (s.contains(n)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ package org.ray.util.generator;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Share util for generators
|
||||
* Share util for generators.
|
||||
*/
|
||||
public class Share {
|
||||
|
||||
@@ -11,20 +11,20 @@ public class Share {
|
||||
public static final int MAX_R = 4;
|
||||
|
||||
/**
|
||||
* T0, T1, T2, T3, R
|
||||
* T0, T1, T2, T3, R.
|
||||
*/
|
||||
public static String buildClassDeclare(int Tcount, int Rcount) {
|
||||
public static String buildClassDeclare(int tcount, int rcount) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int k = 0; k < Tcount; k++) {
|
||||
for (int k = 0; k < tcount; k++) {
|
||||
sb.append("T").append(k).append(", ");
|
||||
}
|
||||
if (Rcount == 0) {
|
||||
if (rcount == 0) {
|
||||
sb.append("R, RID");
|
||||
} else if (Rcount < 0) {
|
||||
assert (Rcount == -1);
|
||||
} else if (rcount < 0) {
|
||||
assert (rcount == -1);
|
||||
sb.append("R");
|
||||
} else {
|
||||
for (int k = 0; k < Rcount; k++) {
|
||||
for (int k = 0; k < rcount; k++) {
|
||||
sb.append("R").append(k).append(", ");
|
||||
}
|
||||
sb.deleteCharAt(sb.length() - 1);
|
||||
@@ -34,16 +34,16 @@ public class Share {
|
||||
}
|
||||
|
||||
/**
|
||||
* T0 t0, T1 t1, T2 t2, T3 t3
|
||||
* T0 t0, T1 t1, T2 t2, T3 t3.
|
||||
*/
|
||||
public static String buildParameter(int Tcount, String TR, Set<Integer> whichTisFuture) {
|
||||
public static String buildParameter(int tcount, String tr, Set<Integer> whichTisFuture) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int k = 0; k < Tcount; k++) {
|
||||
for (int k = 0; k < tcount; k++) {
|
||||
sb.append(whichTisFuture != null && whichTisFuture.contains(k)
|
||||
? "RayObject<" + (TR + k) + ">" : (TR + k)).append(" ").append(TR.toLowerCase())
|
||||
? "RayObject<" + (tr + k) + ">" : (tr + k)).append(" ").append(tr.toLowerCase())
|
||||
.append(k).append(", ");
|
||||
}
|
||||
if (Tcount > 0) {
|
||||
if (tcount > 0) {
|
||||
sb.deleteCharAt(sb.length() - 1);
|
||||
sb.deleteCharAt(sb.length() - 1);
|
||||
}
|
||||
@@ -51,77 +51,72 @@ public class Share {
|
||||
}
|
||||
|
||||
/**
|
||||
* t0, t1, t2
|
||||
* t0, t1, t2.
|
||||
*/
|
||||
public static String buildParameterUse(int Tcount, String TR) {
|
||||
public static String buildParameterUse(int tcount, String tr) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int k = 0; k < Tcount; k++) {
|
||||
sb.append(TR.toLowerCase()).append(k).append(", ");
|
||||
for (int k = 0; k < tcount; k++) {
|
||||
sb.append(tr.toLowerCase()).append(k).append(", ");
|
||||
}
|
||||
if (Tcount > 0) {
|
||||
if (tcount > 0) {
|
||||
sb.deleteCharAt(sb.length() - 1);
|
||||
sb.deleteCharAt(sb.length() - 1);
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public static String buildParameterUse2(int Tcount, int startIndex, String TR, String pre,
|
||||
String post) {
|
||||
public static String buildParameterUse2(int tcount, int startIndex, String tr, String pre,
|
||||
String post) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int k = 0; k < Tcount; k++) {
|
||||
sb.append("(").append(TR).append(k).append(")").append(pre).append(k + startIndex)
|
||||
for (int k = 0; k < tcount; k++) {
|
||||
sb.append("(").append(tr).append(k).append(")").append(pre).append(k + startIndex)
|
||||
.append(post).append(", ");
|
||||
}
|
||||
if (Tcount > 0) {
|
||||
if (tcount > 0) {
|
||||
sb.deleteCharAt(sb.length() - 1);
|
||||
sb.deleteCharAt(sb.length() - 1);
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* MultipleReturns2<R0, R1> apply(); R0
|
||||
*/
|
||||
public static String buildFuncReturn(int Rcount) {
|
||||
if (Rcount == 0) {
|
||||
public static String buildFuncReturn(int rcount) {
|
||||
if (rcount == 0) {
|
||||
return "Map<RID, R>";
|
||||
} else if (Rcount < 0) {
|
||||
assert (-1 == Rcount);
|
||||
} else if (rcount < 0) {
|
||||
assert (-1 == rcount);
|
||||
return "List<R>";
|
||||
}
|
||||
if (Rcount == 1) {
|
||||
if (rcount == 1) {
|
||||
return "R0";
|
||||
}
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int k = 0; k < Rcount; k++) {
|
||||
for (int k = 0; k < rcount; k++) {
|
||||
sb.append("R").append(k).append(", ");
|
||||
}
|
||||
sb.deleteCharAt(sb.length() - 1);
|
||||
sb.deleteCharAt(sb.length() - 1);
|
||||
return "MultipleReturns" + Rcount + "<" + sb.toString() + ">";
|
||||
return "MultipleReturns" + rcount + "<" + sb.toString() + ">";
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
public static String buildRpcReturn(int Rcount) {
|
||||
if (Rcount == 0) {
|
||||
public static String buildRpcReturn(int rcount) {
|
||||
if (rcount == 0) {
|
||||
return "RayMap<RID, R>";
|
||||
} else if (Rcount < 0) {
|
||||
assert (Rcount == -1);
|
||||
} else if (rcount < 0) {
|
||||
assert (rcount == -1);
|
||||
return "RayList<R>";
|
||||
}
|
||||
|
||||
if (Rcount == 1) {
|
||||
if (rcount == 1) {
|
||||
return "RayObject<R0>";
|
||||
}
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int k = 0; k < Rcount; k++) {
|
||||
for (int k = 0; k < rcount; k++) {
|
||||
sb.append("R").append(k).append(", ");
|
||||
}
|
||||
sb.deleteCharAt(sb.length() - 1);
|
||||
sb.deleteCharAt(sb.length() - 1);
|
||||
return "RayObjects" + Rcount + "<" + sb.toString() + ">";
|
||||
return "RayObjects" + rcount + "<" + sb.toString() + ">";
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ package org.ray.util.logger;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
/**
|
||||
* A logger which prints output to console
|
||||
* A logger which prints output to console.
|
||||
*/
|
||||
public class ConsoleLogger extends Logger {
|
||||
|
||||
@@ -14,21 +14,6 @@ public class ConsoleLogger extends Logger {
|
||||
this.realLogger = realLogger;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void info(Object log) {
|
||||
realLogger.info("(" + this.getName() + ") " + log);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void warn(Object log) {
|
||||
realLogger.warn("(" + this.getName() + ") " + log);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void warn(Object log, Throwable e) {
|
||||
realLogger.warn("(" + this.getName() + ") " + log, e);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void debug(Object log) {
|
||||
realLogger.debug("(" + this.getName() + ") " + log);
|
||||
@@ -43,4 +28,19 @@ public class ConsoleLogger extends Logger {
|
||||
public void error(Object log, Throwable e) {
|
||||
realLogger.error("(" + this.getName() + ") " + log, e);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void info(Object log) {
|
||||
realLogger.info("(" + this.getName() + ") " + log);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void warn(Object log) {
|
||||
realLogger.warn("(" + this.getName() + ") " + log);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void warn(Object log, Throwable e) {
|
||||
realLogger.warn("(" + this.getName() + ") " + log, e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ import org.apache.log4j.Logger;
|
||||
import org.ray.util.CommonUtil;
|
||||
|
||||
/**
|
||||
* Dynamic logger without properties configuration file
|
||||
* Dynamic logger without properties configuration file.
|
||||
*/
|
||||
public class DynamicLog {
|
||||
|
||||
@@ -16,12 +16,11 @@ public class DynamicLog {
|
||||
private static LogLevel logLevel = LogLevel.DEBUG;
|
||||
|
||||
private static Boolean logLevelSetFlag = false;
|
||||
private static Map<String/*Samplekey*/, SampleStatis> sampleStatis = new ConcurrentHashMap<>();
|
||||
private final String key;
|
||||
|
||||
/**
|
||||
* set the context prefix for all logs
|
||||
*/
|
||||
public static void setContextPrefix(String prefix) {
|
||||
PREFIX.set(prefix);
|
||||
private DynamicLog(String key) {
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
public static String getContextPrefix() {
|
||||
@@ -29,7 +28,14 @@ public class DynamicLog {
|
||||
}
|
||||
|
||||
/**
|
||||
* set the level for all logs
|
||||
* set the context prefix for all logs.
|
||||
*/
|
||||
public static void setContextPrefix(String prefix) {
|
||||
PREFIX.set(prefix);
|
||||
}
|
||||
|
||||
/**
|
||||
* set the level for all logs.
|
||||
*/
|
||||
public static void setLogLevel(String level) {
|
||||
if (logLevelSetFlag) { /* one shot, avoid the risk of multithreading */
|
||||
@@ -39,13 +45,17 @@ public class DynamicLog {
|
||||
logLevel = LogLevel.of(level);
|
||||
}
|
||||
|
||||
private static LogLevel getenumLogLevel() {
|
||||
return logLevel;
|
||||
public static DynamicLog registerName(String name) {
|
||||
return DynamicLogNameRegister.registerName(name);
|
||||
}
|
||||
|
||||
public static Collection<DynamicLog> values() {
|
||||
return DynamicLogNameRegister.names.values();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.getKey();
|
||||
public int hashCode() {
|
||||
return this.toString().hashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -54,12 +64,31 @@ public class DynamicLog {
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return this.toString().hashCode();
|
||||
public String toString() {
|
||||
return this.getKey();
|
||||
}
|
||||
|
||||
public String getKey() {
|
||||
return this.key;
|
||||
}
|
||||
|
||||
public void debug(String log) {
|
||||
if (!getenumLogLevel().needLog(LogLevel.DEBUG)) {
|
||||
return;
|
||||
}
|
||||
log = wrap("debug", log);
|
||||
Logger[] loggers = DynamicLogManager.getLogs(this);
|
||||
for (Logger logger : loggers) {
|
||||
logger.debug(log);
|
||||
}
|
||||
}
|
||||
|
||||
private static LogLevel getenumLogLevel() {
|
||||
return logLevel;
|
||||
}
|
||||
|
||||
private String wrap(String level, String log) {
|
||||
StackTraceElement stes[] = Thread.currentThread().getStackTrace();
|
||||
StackTraceElement[] stes = Thread.currentThread().getStackTrace();
|
||||
String ret = "[" + level + "]" + "[" + stes[3].getFileName() + ":" + stes[3].getLineNumber()
|
||||
+ "] - " + (log == null ? "" : log);
|
||||
String prefix = PREFIX.get();
|
||||
@@ -69,23 +98,12 @@ public class DynamicLog {
|
||||
return ret;
|
||||
}
|
||||
|
||||
public void debug(String log) {
|
||||
if (!getenumLogLevel().needLog(LogLevel.DEBUG)) {
|
||||
return;
|
||||
}
|
||||
log = wrap("debug", log);
|
||||
Logger loggers[] = DynamicLogManager.getLogs(this);
|
||||
for (Logger logger : loggers) {
|
||||
logger.debug(log);
|
||||
}
|
||||
}
|
||||
|
||||
public void info(String log) {
|
||||
if (!getenumLogLevel().needLog(LogLevel.INFO)) {
|
||||
return;
|
||||
}
|
||||
log = wrap("info", log);
|
||||
Logger loggers[] = DynamicLogManager.getLogs(this);
|
||||
Logger[] loggers = DynamicLogManager.getLogs(this);
|
||||
for (Logger logger : loggers) {
|
||||
logger.info(log);
|
||||
}
|
||||
@@ -96,7 +114,7 @@ public class DynamicLog {
|
||||
return;
|
||||
}
|
||||
log = wrap("warn", log);
|
||||
Logger loggers[] = DynamicLogManager.getLogs(this);
|
||||
Logger[] loggers = DynamicLogManager.getLogs(this);
|
||||
for (Logger logger : loggers) {
|
||||
logger.warn(log);
|
||||
}
|
||||
@@ -107,23 +125,12 @@ public class DynamicLog {
|
||||
return;
|
||||
}
|
||||
log = wrap("warn", log);
|
||||
Logger loggers[] = DynamicLogManager.getLogs(this);
|
||||
Logger[] loggers = DynamicLogManager.getLogs(this);
|
||||
for (Logger logger : loggers) {
|
||||
logger.warn(log, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void error(String log) {
|
||||
if (!getenumLogLevel().needLog(LogLevel.ERROR)) {
|
||||
return;
|
||||
}
|
||||
log = wrap("error", log);
|
||||
Logger loggers[] = DynamicLogManager.getLogs(this);
|
||||
for (Logger logger : loggers) {
|
||||
logger.error(log);
|
||||
}
|
||||
}
|
||||
|
||||
public void error(String log, Throwable e) {
|
||||
if (!getenumLogLevel().needLog(LogLevel.ERROR)) {
|
||||
return;
|
||||
@@ -134,12 +141,23 @@ public class DynamicLog {
|
||||
return;
|
||||
}
|
||||
|
||||
Logger loggers[] = DynamicLogManager.getLogs(this);
|
||||
Logger[] loggers = DynamicLogManager.getLogs(this);
|
||||
for (Logger logger : loggers) {
|
||||
logger.error(log, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void error(String log) {
|
||||
if (!getenumLogLevel().needLog(LogLevel.ERROR)) {
|
||||
return;
|
||||
}
|
||||
log = wrap("error", log);
|
||||
Logger[] loggers = DynamicLogManager.getLogs(this);
|
||||
for (Logger logger : loggers) {
|
||||
logger.error(log);
|
||||
}
|
||||
}
|
||||
|
||||
public void error(Throwable e) {
|
||||
if (!getenumLogLevel().needLog(LogLevel.ERROR)) {
|
||||
return;
|
||||
@@ -149,12 +167,43 @@ public class DynamicLog {
|
||||
error(log);
|
||||
return;
|
||||
}
|
||||
Logger loggers[] = DynamicLogManager.getLogs(this);
|
||||
Logger[] loggers = DynamicLogManager.getLogs(this);
|
||||
for (Logger logger : loggers) {
|
||||
logger.error(log, e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Print sample error log.
|
||||
*/
|
||||
public boolean sampleError(Object sampleKeyO, String log, Throwable e) {
|
||||
String sampleKey = sampleKeyO.toString();
|
||||
try {
|
||||
SampleStatis ss = sampleStatis.computeIfAbsent(sampleKey, k -> new SampleStatis());
|
||||
if (ss.gamble()) {
|
||||
Logger[] loggers = DynamicLogManager.getLogs(this);
|
||||
for (Logger logger : loggers) {
|
||||
if (e != null) {
|
||||
logger.error("[" + sampleKey + "] - " + log, e);
|
||||
} else {
|
||||
logger.error("[" + sampleKey + "] - " + log);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} finally {
|
||||
if (sampleStatis.size() > 100000) {
|
||||
sampleStatis = new ConcurrentHashMap<>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public String getDefaultLogFileName() {
|
||||
return this.key + ".log";
|
||||
}
|
||||
|
||||
//statistic for sampling
|
||||
private static class SampleStatis {
|
||||
|
||||
@@ -185,57 +234,6 @@ public class DynamicLog {
|
||||
}
|
||||
}
|
||||
|
||||
private static Map<String/*Samplekey*/, SampleStatis> sampleStatis = new ConcurrentHashMap<>();
|
||||
|
||||
/**
|
||||
* Print sample error log
|
||||
*/
|
||||
public boolean sampleError(Object sampleKeyO, String log, Throwable e) {
|
||||
String sampleKey = sampleKeyO.toString();
|
||||
try {
|
||||
SampleStatis ss = sampleStatis.computeIfAbsent(sampleKey, k -> new SampleStatis());
|
||||
if (ss.gamble()) {
|
||||
Logger loggers[] = DynamicLogManager.getLogs(this);
|
||||
for (Logger logger : loggers) {
|
||||
if (e != null) {
|
||||
logger.error("[" + sampleKey + "] - " + log, e);
|
||||
} else {
|
||||
logger.error("[" + sampleKey + "] - " + log);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} finally {
|
||||
if (sampleStatis.size() > 100000) {
|
||||
sampleStatis = new ConcurrentHashMap<>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private final String key;
|
||||
|
||||
private DynamicLog(String key) {
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
public String getKey() {
|
||||
return this.key;
|
||||
}
|
||||
|
||||
public String getDefaultLogFileName() {
|
||||
return this.key + ".log";
|
||||
}
|
||||
|
||||
public static DynamicLog registerName(String name) {
|
||||
return DynamicLogNameRegister.registerName(name);
|
||||
}
|
||||
|
||||
public static Collection<DynamicLog> values() {
|
||||
return DynamicLogNameRegister.names.values();
|
||||
}
|
||||
|
||||
public static class DynamicLogNameRegister {
|
||||
|
||||
static final Map<String, DynamicLog> names = new ConcurrentHashMap<>();
|
||||
|
||||
@@ -11,27 +11,26 @@ import org.apache.log4j.RollingFileAppender;
|
||||
import org.ray.util.SystemUtil;
|
||||
|
||||
/**
|
||||
* Manager for dynamic loggers
|
||||
* Manager for dynamic loggers.
|
||||
*/
|
||||
public class DynamicLogManager {
|
||||
|
||||
protected static final String DAY_DATE_PATTERN = "'.'yyyy-MM-dd";
|
||||
private static final int LOG_CACHE_SIZE = 32 * 1024;
|
||||
// private final static String HOUR_DATE_PATTERN = "'
|
||||
// .'yyyy-MM-dd_HH";
|
||||
// private final static String GBK = "GBK";
|
||||
private static final String DAILY_APPENDER_NAME = "_DAILY_APPENDER_NAME";
|
||||
// private final static String CONSOLE_APPENDER_NAME =
|
||||
// "_CONSOLE_APPENDER_NAME";
|
||||
private static final String LAYOUT_PATTERN = "%d [%t]%m%n";
|
||||
private static final ConcurrentHashMap<DynamicLog, Logger> loggers = new ConcurrentHashMap<>();
|
||||
//whether to print the log on std(ie. console)
|
||||
public static boolean printOnStd = false;
|
||||
//the root directory of log files
|
||||
public static String logsDir;
|
||||
public static String logsSuffix;
|
||||
public static Level level = Level.DEBUG; //Level.INFO;
|
||||
/** */
|
||||
private static final int LOG_CACHE_SIZE = 32 * 1024;
|
||||
protected final static String DAY_DATE_PATTERN = "'.'yyyy-MM-dd";
|
||||
// private final static String HOUR_DATE_PATTERN = "'.'yyyy-MM-dd_HH";
|
||||
// private final static String GBK = "GBK";
|
||||
private final static String DAILY_APPENDER_NAME = "_DAILY_APPENDER_NAME";
|
||||
// private final static String CONSOLE_APPENDER_NAME = "_CONSOLE_APPENDER_NAME";
|
||||
private final static String LAYOUT_PATTERN = "%d [%t]%m%n";
|
||||
|
||||
private static final ConcurrentHashMap<DynamicLog, Logger> loggers = new ConcurrentHashMap<>();
|
||||
|
||||
private static int MAX_FILE_NUM = 10;
|
||||
|
||||
private static String MAX_FILE_SIZE = "500MB";
|
||||
@@ -98,13 +97,13 @@ public class DynamicLogManager {
|
||||
}
|
||||
}
|
||||
}
|
||||
return new Logger[]{logger};
|
||||
return new Logger[] {logger};
|
||||
}
|
||||
|
||||
private static Logger initLogger(DynamicLog dynLog) {
|
||||
if (printOnStd) {
|
||||
Logger reallogger = Logger.getLogger(dynLog.getKey());
|
||||
ConsoleLogger logger = new ConsoleLogger(dynLog.getKey(), reallogger);
|
||||
final ConsoleLogger logger = new ConsoleLogger(dynLog.getKey(), reallogger);
|
||||
PatternLayout layout = new PatternLayout(LAYOUT_PATTERN);
|
||||
ConsoleAppender appender = new ConsoleAppender(layout, ConsoleAppender.SYSTEM_OUT);
|
||||
reallogger.removeAllAppenders();
|
||||
@@ -122,7 +121,7 @@ public class DynamicLogManager {
|
||||
}
|
||||
|
||||
protected static Logger makeLogger(String loggerName, String filename) {
|
||||
Logger logger = Logger.getLogger(loggerName);
|
||||
final Logger logger = Logger.getLogger(loggerName);
|
||||
PatternLayout layout = new PatternLayout(LAYOUT_PATTERN);
|
||||
File dir = new File(logsDir);
|
||||
if (!dir.exists()) {
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
package org.ray.util.logger;
|
||||
|
||||
/**
|
||||
* Dynamic loggers in Ray
|
||||
* Dynamic loggers in Ray.
|
||||
*/
|
||||
public class RayLog {
|
||||
|
||||
/**
|
||||
* for ray itself
|
||||
* for ray itself.
|
||||
*/
|
||||
public static final DynamicLog core = DynamicLog.registerName("core");
|
||||
|
||||
/**
|
||||
* for ray's app's log
|
||||
* for ray's app's log.
|
||||
*/
|
||||
public static DynamicLog rapp = core; //DynamicLog.registerName("rapp");
|
||||
}
|
||||
|
||||
+6
-6
@@ -7,11 +7,15 @@ import org.apache.log4j.Layout;
|
||||
import org.apache.log4j.RollingFileAppender;
|
||||
|
||||
/**
|
||||
* Normal log appender
|
||||
* Normal log appender.
|
||||
*/
|
||||
public class TimedFlushDailyRollingFileAppender extends RollingFileAppender {
|
||||
|
||||
private final static Set<TimedFlushDailyRollingFileAppender> all = new HashSet<>();
|
||||
private static final Set<TimedFlushDailyRollingFileAppender> all = new HashSet<>();
|
||||
|
||||
static {
|
||||
new TimedFlushLogThread().start();
|
||||
}
|
||||
|
||||
public TimedFlushDailyRollingFileAppender() {
|
||||
super();
|
||||
@@ -27,10 +31,6 @@ public class TimedFlushDailyRollingFileAppender extends RollingFileAppender {
|
||||
}
|
||||
}
|
||||
|
||||
static {
|
||||
new TimedFlushLogThread().start();
|
||||
}
|
||||
|
||||
private void flush() {
|
||||
try {
|
||||
if (!checkEntryConditions()) {
|
||||
|
||||
Reference in New Issue
Block a user