Skip to content

Commit e2f6ef5

Browse files
committed
ongoing work on GraalVM support
Signed-off-by: Ceki Gulcu <[email protected]>
1 parent 0d16784 commit e2f6ef5

File tree

13 files changed

+71
-76
lines changed

13 files changed

+71
-76
lines changed

logback-classic/src/main/java/ch/qos/logback/classic/BasicConfigurator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
*
3030
* @author Ceki G&uuml;lc&uuml;
3131
*/
32-
@ConfiguratorRank(value = ConfiguratorRank.Value.FALLBACK)
32+
@ConfiguratorRank(value = ConfiguratorRank.FALLBACK)
3333
public class BasicConfigurator extends ContextAwareBase implements Configurator {
3434

3535
public BasicConfigurator() {

logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class ClassicConstants {
2828
* property name for the model file used for configuration
2929
* @since 1.3.9/1.4.9
3030
*/
31-
public static final String MODEL_CONFIG_FILE_PROPERTY = "logback.modelFile";
31+
public static final String MODEL_CONFIG_FILE_PROPERTY = "logback.serializedModelFilew";
3232

3333
public static final String JNDI_CONFIGURATION_RESOURCE = JNDI_JAVA_NAMESPACE
3434
+ "comp/env/logback/configuration-resource";

logback-classic/src/main/java/ch/qos/logback/classic/joran/SerializedModelConfigurator.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import ch.qos.logback.classic.ClassicConstants;
1818
import ch.qos.logback.classic.joran.serializedModel.HardenedModelInputStream;
1919
import ch.qos.logback.classic.model.processor.LogbackClassicDefaultNestedComponentRules;
20+
import ch.qos.logback.classic.spi.ConfiguratorRank;
2021
import ch.qos.logback.core.Context;
2122
import ch.qos.logback.core.LogbackException;
2223
import ch.qos.logback.core.model.Model;
@@ -43,6 +44,7 @@
4344
*/
4445

4546
// BEWARE: the fqcn is used in SerializedModelModelHandler
47+
@ConfiguratorRank(value = ConfiguratorRank.SERIALIZED_MODEL)
4648
public class SerializedModelConfigurator extends ContextAwareBase implements Configurator {
4749

4850
final public static String AUTOCONFIG_MODEL_FILE = "logback"+ MODEL_CONFIG_FILE_EXTENSION;

logback-classic/src/main/java/ch/qos/logback/classic/model/processor/ConfigurationModelHandler.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ public void handle(ModelInterpretationContext mic, Model model) {
8686
}
8787

8888
protected void processScanAttrib(ModelInterpretationContext mic, ConfigurationModel configurationModel) {
89-
System.out.println("This is overriden processScanAttrib");
9089
String scanStr = mic.subst(configurationModel.getScanStr());
9190
if (!OptionHelper.isNullOrEmpty(scanStr) && !"false".equalsIgnoreCase(scanStr)) {
9291
addInfo("Skipping ReconfigureOnChangeTask registration");

logback-classic/src/main/java/ch/qos/logback/classic/spi/ConfiguratorRank.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,19 @@
2424
@Retention(RetentionPolicy.RUNTIME)
2525
@Target(ElementType.TYPE)
2626
public @interface ConfiguratorRank {
27-
enum Value {
28-
FIRST,
29-
REGULAR,
30-
FALLBACK;
31-
}
3227

33-
Value value() default Value.REGULAR;
28+
static public int FALLBACK = -10;
29+
static public int NOMINAL = 0;
30+
static public int SERIALIZED_MODEL = 10;
3431

32+
static public int DEFAULT = 20;
33+
34+
static public int CUSTOM_LOW_PRIORITY = DEFAULT;
35+
36+
static public int CUSTOM_NORMAL_PRIORITY = 30;
37+
38+
static public int CUSTOM_HIGH_PRIORITY = 40;
39+
40+
static public int CUSTOM_TOP_PRIORITY = 50;
41+
public int value() default DEFAULT;
3542
}

logback-classic/src/main/java/ch/qos/logback/classic/util/ContextInitializer.java

Lines changed: 33 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,6 @@ public class ContextInitializer {
4343
* @deprecated Please use ClassicConstants.CONFIG_FILE_PROPERTY instead
4444
*/
4545
final public static String CONFIG_FILE_PROPERTY = ClassicConstants.CONFIG_FILE_PROPERTY;
46-
private static final String JORAN_CONFIGURATION_DURATION_MSG = "JoranConfiguration duration ";
47-
private static final String CONFIGURATION_AS_A_SERVICE_DURATION_MSG = "Configuration as a service duration ";
4846

4947
final LoggerContext loggerContext;
5048

@@ -67,18 +65,21 @@ public void autoConfig(ClassLoader classLoader) throws JoranException {
6765
loggerContext.getStatusManager().add(new InfoStatus(CoreConstants.LOGBACK_CLASSIC_VERSION_MESSAGE + versionStr, loggerContext));
6866
StatusListenerConfigHelper.installIfAsked(loggerContext);
6967

70-
long startConfigurationAsAService = System.currentTimeMillis();
68+
7169
List<Configurator> configuratorList = ClassicEnvUtil.loadFromServiceLoader(Configurator.class, classLoader);
7270

7371
configuratorList.sort(rankComparator);
7472

73+
printConfiguratorOrder(configuratorList);
74+
7575
for (Configurator c : configuratorList) {
7676
try {
77+
long start = System.currentTimeMillis();
7778
contextAware.addInfo("Constructed configurator of type " + c.getClass());
7879
c.setContext(loggerContext);
7980
Configurator.ExecutionStatus status = c.configure(loggerContext);
81+
printDuration(start, c, status);
8082
if (status == Configurator.ExecutionStatus.DO_NOT_INVOKE_NEXT_IF_ANY) {
81-
printDuration(startConfigurationAsAService, CONFIGURATION_AS_A_SERVICE_DURATION_MSG, true);
8283
return;
8384
}
8485
} catch (Exception e) {
@@ -87,25 +88,33 @@ public void autoConfig(ClassLoader classLoader) throws JoranException {
8788
}
8889
}
8990

90-
printDuration(startConfigurationAsAService, CONFIGURATION_AS_A_SERVICE_DURATION_MSG, false);
9191

92-
long startJoranConfiguration = System.currentTimeMillis();
93-
Configurator.ExecutionStatus es = attemptConfigurationUsingJoranUsingReflexion(classLoader);
9492

95-
if (es == Configurator.ExecutionStatus.DO_NOT_INVOKE_NEXT_IF_ANY) {
96-
printDuration(startJoranConfiguration, JORAN_CONFIGURATION_DURATION_MSG, true);
97-
return;
98-
}
99-
printDuration(startJoranConfiguration, JORAN_CONFIGURATION_DURATION_MSG, false);
93+
// long startJoranConfiguration = System.currentTimeMillis();
94+
// Configurator.ExecutionStatus es = attemptConfigurationUsingJoranUsingReflexion(classLoader);
95+
//
96+
// if (es == Configurator.ExecutionStatus.DO_NOT_INVOKE_NEXT_IF_ANY) {
97+
// printDuration(startJoranConfiguration, JORAN_CONFIGURATION_DURATION_MSG, true);
98+
// return;
99+
// }
100+
// printDuration(startJoranConfiguration, JORAN_CONFIGURATION_DURATION_MSG, false);
101+
//
102+
// // at this stage invoke basicConfigurator
103+
// fallbackOnToBasicConfigurator();
104+
}
100105

101-
// at this stage invoke basicConfigurator
102-
fallbackOnToBasicConfigurator();
106+
private void printConfiguratorOrder(List<Configurator> configuratorList) {
107+
contextAware.addInfo("Here is a list of configurators discovered as a service, by rank: ");
108+
for(Configurator c: configuratorList) {
109+
contextAware.addInfo(" "+c.getClass().getName());
110+
}
111+
contextAware.addInfo("They will be invoked in order until ExecutionStatus.DO_NOT_INVOKE_NEXT_IF_ANY is returned.");
103112
}
104113

105-
private void printDuration(long start, String message, boolean success) {
114+
private void printDuration(long start, Configurator configurator, Configurator.ExecutionStatus executionStatus) {
106115
long end = System.currentTimeMillis();
107-
long configurationAsAServiceDuration = end - start;
108-
contextAware.addInfo(message+configurationAsAServiceDuration + " milliseconds. Success status="+success);
116+
long diff = end - start;
117+
contextAware.addInfo( configurator.getClass().getName()+".configure() call lasted "+diff + " milliseconds. ExecutionStatus="+executionStatus);
109118
}
110119

111120
private Configurator.ExecutionStatus attemptConfigurationUsingJoranUsingReflexion(ClassLoader classLoader) {
@@ -128,21 +137,6 @@ private void fallbackOnToBasicConfigurator() {
128137
basicConfigurator.configure(loggerContext);
129138
}
130139

131-
// private void sortByPriority(List<Configurator> configuratorList) {
132-
// configuratorList.sort(new Comparator<Configurator>() {
133-
// @Override
134-
// public int compare(Configurator o1, Configurator o2) {
135-
// if (o1.getClass() == o2.getClass())
136-
// return 0;
137-
// if (o1 instanceof DefaultJoranConfigurator) {
138-
// return 1;
139-
// }
140-
//
141-
// // otherwise do not intervene
142-
// return 0;
143-
// }
144-
// });
145-
// }
146140

147141
Comparator<Configurator> rankComparator = new Comparator<Configurator>() {
148142
@Override
@@ -151,39 +145,21 @@ public int compare(Configurator c1, Configurator c2) {
151145
ConfiguratorRank r1 = c1.getClass().getAnnotation(ConfiguratorRank.class);
152146
ConfiguratorRank r2 = c2.getClass().getAnnotation(ConfiguratorRank.class);
153147

154-
ConfiguratorRank.Value value1 = r1 == null ? ConfiguratorRank.Value.REGULAR : r1.value();
155-
ConfiguratorRank.Value value2 = r2 == null ? ConfiguratorRank.Value.REGULAR : r2.value();
148+
int value1 = r1 == null ? ConfiguratorRank.DEFAULT : r1.value();
149+
int value2 = r2 == null ? ConfiguratorRank.DEFAULT : r2.value();
156150

157151
int result = compareRankValue(value1, value2);
158152
// reverse the result for high to low sort
159153
return (-result);
160154
}
161155
};
162156

163-
private int compareRankValue(ConfiguratorRank.Value value1, ConfiguratorRank.Value value2) {
164-
165-
switch (value1) {
166-
case FIRST:
167-
if (value2 == ConfiguratorRank.Value.FIRST)
168-
return 0;
169-
else
170-
return 1;
171-
case REGULAR:
172-
if (value2 == ConfiguratorRank.Value.FALLBACK)
173-
return 1;
174-
else if (value2 == ConfiguratorRank.Value.REGULAR)
175-
return 0;
176-
else
177-
return -1;
178-
case FALLBACK:
179-
if (value2 == ConfiguratorRank.Value.FALLBACK)
180-
return 0;
181-
else
182-
return -1;
183-
184-
default:
157+
private int compareRankValue(int value1, int value2) {
158+
if(value1 > value2)
159+
return 1;
160+
else if (value1 == value2)
185161
return 0;
186-
}
162+
else return -1;
187163

188164
}
189165
}

logback-classic/src/main/java/ch/qos/logback/classic/util/DefaultJoranConfigurator.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222
/**
2323
* @since 1.3.0-beta1
2424
*/
25-
@ConfiguratorRank(value = ConfiguratorRank.Value.REGULAR)
25+
// Note that DefaultJoranConfigurator is invoked via reflection
26+
27+
@ConfiguratorRank(value = ConfiguratorRank.NOMINAL)
2628
public class DefaultJoranConfigurator extends ContextAwareBase implements Configurator {
2729

2830
final public static String AUTOCONFIG_FILE = "logback.xml";
@@ -37,7 +39,7 @@ public ExecutionStatus configure(Context context) {
3739
} catch (JoranException e) {
3840
e.printStackTrace();
3941
}
40-
// we tried and that counts Mary.
42+
// You tried and that counts Mary.
4143
return ExecutionStatus.DO_NOT_INVOKE_NEXT_IF_ANY;
4244
} else {
4345
return ExecutionStatus.INVOKE_NEXT_IF_ANY;
Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,9 @@
1-
ch.qos.logback.classic.joran.SerializedModelConfigurator
1+
# Configurators are invoked according to their rank, highest rank is invoked first
2+
# SerializedModelConfigurator has rank 10
3+
# DefaultJoranConfigurator has rank 0 (NOMINAL)
4+
# BasicConfigurator has rank -10 (FALLBACK)
5+
#
6+
ch.qos.logback.classic.joran.SerializedModelConfigurator
7+
ch.qos.logback.classic.util.DefaultJoranConfigurator
8+
ch.qos.logback.classic.BasicConfigurator
9+

logback-classic/src/test/input/joran/model/minimal.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
<configuration debug="false">
55

6-
<serializeModel file="${target.smo}"/>
6+
<serializeModel file="${targetModelFile}"/>
77

88
<logger name="ModelSerializationTest" level="DEBUG"/>
99
</configuration>

logback-classic/src/test/java/ch/qos/logback/classic/joran/JoranConfiguratorTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
package ch.qos.logback.classic.joran;
1515

1616
import ch.qos.logback.classic.AsyncAppender;
17+
import ch.qos.logback.classic.ClassicConstants;
1718
import ch.qos.logback.classic.ClassicTestConstants;
1819
import ch.qos.logback.classic.Level;
1920
import ch.qos.logback.classic.Logger;
@@ -728,7 +729,7 @@ public void dateConverterWithLocale() throws JoranException {
728729
public void modelSerialization() throws JoranException, IOException, ClassNotFoundException {
729730
String outputPath = OUTPUT_DIR_PREFIX+"minimal_"+diff+ MODEL_CONFIG_FILE_EXTENSION;
730731

731-
loggerContext.putProperty("target.smo", outputPath);
732+
loggerContext.putProperty("targetModelFile", outputPath);
732733
configure(ClassicTestConstants.JORAN_INPUT_PREFIX + "model/minimal.xml");
733734
StatusPrinter.print(loggerContext);
734735

@@ -747,13 +748,13 @@ public void modelSerialization() throws JoranException, IOException, ClassNotFou
747748
assertEquals(2, configurationModel.getSubModels().size());
748749

749750
SerializeModelModel smm = (SerializeModelModel) configurationModel.getSubModels().get(0);
750-
assertEquals("${target.smo}", smm.getFile());
751+
assertEquals("${targetModelFile}", smm.getFile());
751752

752753

753754
LoggerModel loggerModel = (LoggerModel) configurationModel.getSubModels().get(1);
754755
assertEquals("ModelSerializationTest", loggerModel.getName());
755756

756-
// <serializeModel file="${target.smo}"/>
757+
// <serializeModel file="${targetModelFile}"/>
757758
// <logger name="ModelSerializationTest" level="DEBUG"/>
758759

759760

logback-classic/src/test/java/ch/qos/logback/classic/util/MockConfigurator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import ch.qos.logback.core.Context;
1919
import ch.qos.logback.core.spi.ContextAwareBase;
2020

21-
@ConfiguratorRank(ConfiguratorRank.Value.REGULAR)
21+
@ConfiguratorRank(ConfiguratorRank.CUSTOM_LOW_PRIORITY)
2222
public class MockConfigurator extends ContextAwareBase implements Configurator {
2323

2424
static Context context = null;

logback-core/src/main/java/ch/qos/logback/core/CoreConstants.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,5 +227,5 @@ public class CoreConstants {
227227

228228
public static final String LOGBACK_CLASSIC_VERSION_MESSAGE = "This is logback-classic version ";
229229
public static final char JSON_LINE_SEPARATOR = '\n';
230-
final public static String MODEL_CONFIG_FILE_EXTENSION = ".smo";
230+
final public static String MODEL_CONFIG_FILE_EXTENSION = ".scmo";
231231
}

logback-core/src/main/java/ch/qos/logback/core/model/processor/SerializeModelModelHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public void handle(ModelInterpretationContext modelInterpretationContext, Model
4545
Object configuratorHint = modelInterpretationContext.getConfiguratorHint();
4646

4747
if(configuratorHint != null && configuratorHint.getClass().getName().equals("ch.qos.logback.classic.joran.SerializedModelConfigurator")) {
48-
addInfo("Skipping model serialization as calling configurator is model based.");
48+
addInfo("Skipping model serialization as calling configurator is already model based.");
4949
return;
5050
}
5151

0 commit comments

Comments
 (0)