Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
f97a3dcc
Unverified
提交
f97a3dcc
authored
6月 21, 2018
作者:
Evgenij Ryazanov
提交者:
GitHub
6月 21, 2018
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #1223 from katzyn/tests
Fix issues with testing on latest Java versions
上级
1505ffe8
ec04367b
隐藏空白字符变更
内嵌
并排
正在显示
24 个修改的文件
包含
107 行增加
和
54 行删除
+107
-54
MetaRecord.java
h2/src/main/org/h2/engine/MetaRecord.java
+8
-0
DbException.java
h2/src/main/org/h2/message/DbException.java
+2
-1
TxDecisionMaker.java
h2/src/main/org/h2/mvstore/tx/TxDecisionMaker.java
+28
-20
H2AuthConfig.java
h2/src/main/org/h2/security/auth/H2AuthConfig.java
+1
-1
H2AuthConfigXml.java
h2/src/main/org/h2/security/auth/H2AuthConfigXml.java
+4
-4
HasConfigProperties.java
h2/src/main/org/h2/security/auth/HasConfigProperties.java
+3
-0
RealmConfig.java
h2/src/main/org/h2/security/auth/RealmConfig.java
+5
-1
UserToRolesMapperConfig.java
...rc/main/org/h2/security/auth/UserToRolesMapperConfig.java
+5
-1
TestAll.java
h2/src/test/org/h2/test/TestAll.java
+1
-1
TestBase.java
h2/src/test/org/h2/test/TestBase.java
+11
-0
TestDb.java
h2/src/test/org/h2/test/TestDb.java
+0
-11
TestAuthentication.java
h2/src/test/org/h2/test/auth/TestAuthentication.java
+2
-2
TaskProcess.java
h2/src/test/org/h2/test/db/TaskProcess.java
+3
-1
TestRecoverKillLoop.java
h2/src/test/org/h2/test/poweroff/TestRecoverKillLoop.java
+1
-1
TestTransactionStore.java
h2/src/test/org/h2/test/store/TestTransactionStore.java
+2
-2
TestHalt.java
h2/src/test/org/h2/test/synth/TestHalt.java
+1
-1
TestKill.java
h2/src/test/org/h2/test/synth/TestKill.java
+1
-1
TestKillRestart.java
h2/src/test/org/h2/test/synth/TestKillRestart.java
+1
-2
TestKillRestartMulti.java
h2/src/test/org/h2/test/synth/TestKillRestartMulti.java
+1
-1
TestExit.java
h2/src/test/org/h2/test/unit/TestExit.java
+2
-2
TestFileLockProcess.java
h2/src/test/org/h2/test/unit/TestFileLockProcess.java
+1
-1
Build.java
h2/src/tools/org/h2/build/Build.java
+4
-0
BuildBase.java
h2/src/tools/org/h2/build/BuildBase.java
+19
-0
dictionary.txt
h2/src/tools/org/h2/build/doc/dictionary.txt
+1
-0
没有找到文件。
h2/src/main/org/h2/engine/MetaRecord.java
浏览文件 @
f97a3dcc
...
...
@@ -24,6 +24,14 @@ public class MetaRecord implements Comparable<MetaRecord> {
private
final
int
objectType
;
private
final
String
sql
;
/**
* Copy metadata from the specified object into specified search row.
*
* @param obj
* database object
* @param r
* search row
*/
public
static
void
populateRowFromDBObject
(
DbObject
obj
,
SearchRow
r
)
{
r
.
setValue
(
0
,
ValueInt
.
get
(
obj
.
getId
()));
r
.
setValue
(
1
,
ValueInt
.
get
(
0
));
...
...
h2/src/main/org/h2/message/DbException.java
浏览文件 @
f97a3dcc
...
...
@@ -311,7 +311,8 @@ public class DbException extends RuntimeException {
return
get
(
ErrorCode
.
GENERAL_ERROR_1
,
e
,
e
.
toString
());
}
catch
(
Throwable
ex
)
{
try
{
DbException
dbException
=
new
DbException
(
new
SQLException
(
"GeneralError"
,
"HY000"
,
ErrorCode
.
GENERAL_ERROR_1
,
e
));
DbException
dbException
=
new
DbException
(
new
SQLException
(
"GeneralError"
,
"HY000"
,
ErrorCode
.
GENERAL_ERROR_1
,
e
));
dbException
.
addSuppressed
(
ex
);
return
dbException
;
}
catch
(
OutOfMemoryError
ignore
)
{
...
...
h2/src/main/org/h2/mvstore/tx/TxDecisionMaker.java
浏览文件 @
f97a3dcc
...
...
@@ -49,16 +49,19 @@ public abstract class TxDecisionMaker extends MVMap.DecisionMaker<VersionedValue
// because a tree root has definitely been changed.
logIt
(
existingValue
.
value
==
null
?
null
:
VersionedValue
.
getInstance
(
existingValue
.
value
));
decision
=
MVMap
.
Decision
.
PUT
;
}
else
if
(
fetchTransaction
(
blockingId
)
!=
null
)
{
// this entry comes from a different transaction, and this transaction is not committed yet
}
else
if
(
fetchTransaction
(
blockingId
)
!=
null
)
{
// this entry comes from a different transaction, and this
// transaction is not committed yet
// should wait on blockingTransaction that was determined earlier
decision
=
MVMap
.
Decision
.
ABORT
;
}
else
if
(
id
==
lastOperationId
)
{
// There is no transaction with that id, and we've tried it just before,
// but map root has not changed (which must be the case if we just missed a closed transaction),
// therefore we came back here again.
// Now we assume it's a leftover after unclean shutdown (map update was written but not undo log),
// and will effectively roll it back (just assume committed value and overwrite).
}
else
if
(
id
==
lastOperationId
)
{
// There is no transaction with that id, and we've tried it just
// before, but map root has not changed (which must be the case if
// we just missed a closed transaction), therefore we came back here
// again.
// Now we assume it's a leftover after unclean shutdown (map update
// was written but not undo log), and will effectively roll it back
// (just assume committed value and overwrite).
Object
committedValue
=
existingValue
.
getCommittedValue
();
logIt
(
committedValue
==
null
?
null
:
VersionedValue
.
getInstance
(
committedValue
));
decision
=
MVMap
.
Decision
.
PUT
;
...
...
@@ -164,26 +167,31 @@ public abstract class TxDecisionMaker extends MVMap.DecisionMaker<VersionedValue
// and therefore will be committed soon
logIt
(
null
);
return
setDecision
(
MVMap
.
Decision
.
PUT
);
}
else
if
(
fetchTransaction
(
blockingId
)
!=
null
)
{
// this entry comes from a different transaction, and this transaction is not committed yet
// should wait on blockingTransaction that was determined earlier and then try again
}
else
if
(
fetchTransaction
(
blockingId
)
!=
null
)
{
// this entry comes from a different transaction, and this
// transaction is not committed yet
// should wait on blockingTransaction that was determined
// earlier and then try again
return
setDecision
(
MVMap
.
Decision
.
ABORT
);
}
else
if
(
id
==
lastOperationId
)
{
// There is no transaction with that id, and we've tried it just before,
// but map root has not changed (which must be the case if we just missed a closed transaction),
}
else
if
(
id
==
lastOperationId
)
{
// There is no transaction with that id, and we've tried it
// just before, but map root has not changed (which must be
// the case if we just missed a closed transaction),
// therefore we came back here again.
// Now we assume it's a leftover after unclean shutdown (map update was written but not undo log),
// and will effectively roll it back (just assume committed value and overwrite).
// Now we assume it's a leftover after unclean shutdown (map
// update was written but not undo log), and will
// effectively roll it back (just assume committed value and
// overwrite).
Object
committedValue
=
existingValue
.
getCommittedValue
();
if
(
committedValue
!=
null
)
{
if
(
committedValue
!=
null
)
{
return
setDecision
(
MVMap
.
Decision
.
ABORT
);
}
logIt
(
null
);
return
setDecision
(
MVMap
.
Decision
.
PUT
);
}
else
{
// transaction has been committed/rolled back and is closed
by now, so
//
we can retry immediately and either that entry become committed
// or we'll hit case above
// transaction has been committed/rolled back and is closed
//
by now, so we can retry immediately and either that entry
//
become committed
or we'll hit case above
lastOperationId
=
id
;
return
setDecision
(
MVMap
.
Decision
.
REPEAT
);
}
...
...
h2/src/main/org/h2/security/auth/H2AuthConfig.java
浏览文件 @
f97a3dcc
...
...
@@ -22,7 +22,7 @@ public class H2AuthConfig {
public
void
setAllowUserRegistration
(
boolean
allowUserRegistration
)
{
this
.
allowUserRegistration
=
allowUserRegistration
;
}
boolean
createMissingRoles
=
true
;
public
boolean
isCreateMissingRoles
()
{
...
...
h2/src/main/org/h2/security/auth/H2AuthConfigXml.java
浏览文件 @
f97a3dcc
...
...
@@ -58,7 +58,7 @@ public class H2AuthConfigXml extends DefaultHandler{
default
:
throw
new
SAXException
(
"unexpected element "
+
qName
);
}
}
@Override
...
...
@@ -74,7 +74,7 @@ public class H2AuthConfigXml extends DefaultHandler{
throw
new
SAXException
(
"missing attribute "
+
attributeName
);
}
return
attributeValue
;
}
static
String
getAttributeValueOr
(
String
attributeName
,
Attributes
attributes
,
String
defaultValue
)
{
...
...
@@ -90,7 +90,7 @@ public class H2AuthConfigXml extends DefaultHandler{
}
/**
* Parse the xml
* Parse the xml
* @param url
* @return
* @throws Exception
...
...
@@ -102,7 +102,7 @@ public class H2AuthConfigXml extends DefaultHandler{
}
public
static
H2AuthConfig
parseFrom
(
InputStream
inputStream
)
throws
Exception
{
SAXParser
saxParser
=
SAXParserFactory
.
newInstance
().
newSAXParser
();
SAXParser
saxParser
=
SAXParserFactory
.
newInstance
().
newSAXParser
();
H2AuthConfigXml
xmlHandler
=
new
H2AuthConfigXml
();
saxParser
.
parse
(
inputStream
,
xmlHandler
);
return
xmlHandler
.
getResult
();
...
...
h2/src/main/org/h2/security/auth/HasConfigProperties.java
浏览文件 @
f97a3dcc
...
...
@@ -7,6 +7,9 @@ package org.h2.security.auth;
import
java.util.List
;
/**
* Interface for objects with configuration properties.
*/
public
interface
HasConfigProperties
{
List
<
PropertyConfig
>
getProperties
();
}
h2/src/main/org/h2/security/auth/RealmConfig.java
浏览文件 @
f97a3dcc
...
...
@@ -8,7 +8,10 @@ package org.h2.security.auth;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
RealmConfig
implements
HasConfigProperties
{
/**
* Configuration for authentication realm.
*/
public
class
RealmConfig
implements
HasConfigProperties
{
private
String
name
;
...
...
@@ -32,6 +35,7 @@ public class RealmConfig implements HasConfigProperties{
List
<
PropertyConfig
>
properties
;
@Override
public
List
<
PropertyConfig
>
getProperties
()
{
if
(
properties
==
null
)
{
properties
=
new
ArrayList
<>();
...
...
h2/src/main/org/h2/security/auth/UserToRolesMapperConfig.java
浏览文件 @
f97a3dcc
...
...
@@ -8,7 +8,10 @@ package org.h2.security.auth;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
UserToRolesMapperConfig
implements
HasConfigProperties
{
/**
* Configuration for class that maps users to their roles.
*/
public
class
UserToRolesMapperConfig
implements
HasConfigProperties
{
private
String
className
;
...
...
@@ -22,6 +25,7 @@ public class UserToRolesMapperConfig implements HasConfigProperties{
this
.
className
=
className
;
}
@Override
public
List
<
PropertyConfig
>
getProperties
()
{
if
(
properties
==
null
)
{
properties
=
new
ArrayList
<>();
...
...
h2/src/test/org/h2/test/TestAll.java
浏览文件 @
f97a3dcc
...
...
@@ -889,7 +889,7 @@ kill -9 `jps -l | grep "org.h2.test." | cut -d " " -f 1`
*/
private
void
testAdditional
()
{
if
(
networked
)
{
throw
new
RuntimeException
(
"testAditional() is not allowed in networked mode"
);
throw
new
RuntimeException
(
"testAd
d
itional() is not allowed in networked mode"
);
}
addTest
(
new
TestMVTableEngine
());
...
...
h2/src/test/org/h2/test/TestBase.java
浏览文件 @
f97a3dcc
...
...
@@ -6,6 +6,7 @@
package
org
.
h2
.
test
;
import
java.io.ByteArrayInputStream
;
import
java.io.File
;
import
java.io.FileWriter
;
import
java.io.IOException
;
import
java.io.InputStream
;
...
...
@@ -1317,6 +1318,16 @@ public abstract class TestBase {
return
System
.
getProperty
(
"java.class.path"
);
}
/**
* Get the path to a java executable of the current process
*
* @return the path to java
*/
public
static
String
getJVM
()
{
return
System
.
getProperty
(
"java.home"
)
+
File
.
separatorChar
+
"bin"
+
File
.
separator
+
"java"
;
}
/**
* Use up almost all memory.
*
...
...
h2/src/test/org/h2/test/TestDb.java
浏览文件 @
f97a3dcc
...
...
@@ -5,7 +5,6 @@
*/
package
org
.
h2
.
test
;
import
java.io.File
;
import
java.sql.Connection
;
import
java.sql.DriverManager
;
import
java.sql.SQLException
;
...
...
@@ -191,16 +190,6 @@ public abstract class TestDb extends TestBase {
// }
}
/**
* Get the path to a java executable of the current process
*
* @return the path to java
*/
private
static
String
getJVM
()
{
return
System
.
getProperty
(
"java.home"
)
+
File
.
separatorChar
+
"bin"
+
File
.
separator
+
"java"
;
}
/**
* Build a child process.
*
...
...
h2/src/test/org/h2/test/auth/TestAuthentication.java
浏览文件 @
f97a3dcc
...
...
@@ -278,7 +278,7 @@ public class TestAuthentication extends TestBase {
}
testExternalUser
();
}
static
final
String
TESTXML
=
"<h2Auth allowUserRegistration=\"true\" createMissingRoles=\"false\">"
+
"<realm name=\"ciao\" validatorClass=\"myclass\"/>"
+
"<realm name=\"miao\" validatorClass=\"myclass1\">"
...
...
@@ -288,7 +288,7 @@ public class TestAuthentication extends TestBase {
+
"</userToRolesMapper>"
+
"</realm>"
+
"</h2Auth>"
;
protected
void
testXmlConfig
()
throws
Exception
{
ByteArrayInputStream
inputStream
=
new
ByteArrayInputStream
(
TESTXML
.
getBytes
());
H2AuthConfig
config
=
H2AuthConfigXml
.
parseFrom
(
inputStream
);
...
...
h2/src/test/org/h2/test/db/TaskProcess.java
浏览文件 @
f97a3dcc
...
...
@@ -15,6 +15,8 @@ import java.io.OutputStream;
import
java.io.OutputStreamWriter
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
org.h2.test.TestBase
;
import
org.h2.test.utils.SelfDestructor
;
import
org.h2.util.StringUtils
;
import
org.h2.util.Task
;
...
...
@@ -48,7 +50,7 @@ public class TaskProcess {
try
{
String
selfDestruct
=
SelfDestructor
.
getPropertyString
(
60
);
ArrayList
<
String
>
list
=
new
ArrayList
<>();
list
.
add
(
"java"
);
list
.
add
(
TestBase
.
getJVM
()
);
list
.
add
(
selfDestruct
);
list
.
add
(
"-cp"
);
list
.
add
(
"bin"
+
File
.
pathSeparator
+
"."
);
...
...
h2/src/test/org/h2/test/poweroff/TestRecoverKillLoop.java
浏览文件 @
f97a3dcc
...
...
@@ -37,7 +37,7 @@ public class TestRecoverKillLoop extends TestBase {
Random
random
=
new
Random
(
1
);
for
(
int
i
=
0
;
i
<
count
;
i
++)
{
String
[]
procDef
=
{
"java"
,
"-cp"
,
getClassPath
(),
getJVM
()
,
"-cp"
,
getClassPath
(),
"-Dtest.dir=data/db"
,
TestRecover
.
class
.
getName
()
};
...
...
h2/src/test/org/h2/test/store/TestTransactionStore.java
浏览文件 @
f97a3dcc
...
...
@@ -421,9 +421,9 @@ public class TestTransactionStore extends TestBase {
}
}
private
boolean
hasDataUndoLog
(
MVStore
s
)
{
private
static
boolean
hasDataUndoLog
(
MVStore
s
)
{
for
(
int
i
=
0
;
i
<
255
;
i
++)
{
if
(
s
.
hasData
(
TransactionStore
.
getUndoLogName
(
true
,
1
)))
{
if
(
s
.
hasData
(
TransactionStore
.
getUndoLogName
(
true
,
1
)))
{
return
true
;
}
}
...
...
h2/src/test/org/h2/test/synth/TestHalt.java
浏览文件 @
f97a3dcc
...
...
@@ -226,7 +226,7 @@ public abstract class TestHalt extends TestBase {
// String classPath = "-cp
// .;D:/data/java/hsqldb.jar;D:/data/java/derby.jar";
String
selfDestruct
=
SelfDestructor
.
getPropertyString
(
60
);
String
[]
procDef
=
{
"java"
,
selfDestruct
,
String
[]
procDef
=
{
getJVM
()
,
selfDestruct
,
"-cp"
,
getClassPath
(),
getClass
().
getName
(),
""
+
operations
,
""
+
flags
,
""
+
testValue
};
traceOperation
(
"start: "
+
StringUtils
.
arrayCombine
(
procDef
,
' '
));
...
...
h2/src/test/org/h2/test/synth/TestKill.java
浏览文件 @
f97a3dcc
...
...
@@ -50,7 +50,7 @@ public class TestKill extends TestDb {
String
password
=
getPassword
();
String
selfDestruct
=
SelfDestructor
.
getPropertyString
(
60
);
String
[]
procDef
=
{
"java"
,
selfDestruct
,
getJVM
()
,
selfDestruct
,
"-cp"
,
getClassPath
(),
"org.h2.test.synth.TestKillProcess"
,
url
,
user
,
password
,
getBaseDir
(),
""
+
ACCOUNTS
};
...
...
h2/src/test/org/h2/test/synth/TestKillRestart.java
浏览文件 @
f97a3dcc
...
...
@@ -16,7 +16,6 @@ import java.sql.Statement;
import
java.util.Random
;
import
java.util.concurrent.CountDownLatch
;
import
java.util.concurrent.TimeUnit
;
import
org.h2.test.TestBase
;
import
org.h2.test.TestDb
;
import
org.h2.test.utils.SelfDestructor
;
...
...
@@ -40,7 +39,7 @@ public class TestKillRestart extends TestDb {
// "killRestart;CACHE_SIZE=2048;WRITE_DELAY=0", true);
String
user
=
getUser
(),
password
=
getPassword
();
String
selfDestruct
=
SelfDestructor
.
getPropertyString
(
60
);
String
[]
procDef
=
{
"java"
,
selfDestruct
,
String
[]
procDef
=
{
getJVM
()
,
selfDestruct
,
"-cp"
,
getClassPath
(),
getClass
().
getName
(),
"-url"
,
url
,
"-user"
,
user
,
"-password"
,
password
};
...
...
h2/src/test/org/h2/test/synth/TestKillRestartMulti.java
浏览文件 @
f97a3dcc
...
...
@@ -83,7 +83,7 @@ public class TestKillRestartMulti extends TestDb {
// Inherit error so that the stacktraces reported from SelfDestructor
// show up in our log.
ProcessBuilder
pb
=
new
ProcessBuilder
().
redirectError
(
Redirect
.
INHERIT
)
.
command
(
"java"
,
selfDestruct
,
"-cp"
,
getClassPath
(),
.
command
(
getJVM
()
,
selfDestruct
,
"-cp"
,
getClassPath
(),
"-ea"
,
getClass
().
getName
(),
"-url"
,
url
,
"-user"
,
user
,
"-password"
,
password
);
...
...
h2/src/test/org/h2/test/unit/TestExit.java
浏览文件 @
f97a3dcc
...
...
@@ -37,7 +37,7 @@ public class TestExit extends TestDb {
deleteDb
(
"exit"
);
String
url
=
getURL
(
OPEN_WITH_CLOSE_ON_EXIT
);
String
selfDestruct
=
SelfDestructor
.
getPropertyString
(
60
);
String
[]
procDef
=
{
"java"
,
selfDestruct
,
"-cp"
,
getClassPath
(),
String
[]
procDef
=
{
getJVM
()
,
selfDestruct
,
"-cp"
,
getClassPath
(),
getClass
().
getName
(),
url
};
Process
proc
=
Runtime
.
getRuntime
().
exec
(
procDef
);
while
(
true
)
{
...
...
@@ -60,7 +60,7 @@ public class TestExit extends TestDb {
fail
(
"did not close database"
);
}
url
=
getURL
(
OPEN_WITHOUT_CLOSE_ON_EXIT
);
procDef
=
new
String
[]
{
"java"
,
"-cp"
,
getClassPath
(),
procDef
=
new
String
[]
{
getJVM
()
,
"-cp"
,
getClassPath
(),
getClass
().
getName
(),
url
};
proc
=
Runtime
.
getRuntime
().
exec
(
procDef
);
proc
.
waitFor
();
...
...
h2/src/test/org/h2/test/unit/TestFileLockProcess.java
浏览文件 @
f97a3dcc
...
...
@@ -74,7 +74,7 @@ public class TestFileLockProcess extends TestDb {
url
=
getURL
(
url
,
true
);
Connection
conn
=
getConnection
(
url
);
String
selfDestruct
=
SelfDestructor
.
getPropertyString
(
60
);
String
[]
procDef
=
{
"java"
,
selfDestruct
,
String
[]
procDef
=
{
getJVM
()
,
selfDestruct
,
"-cp"
,
getClassPath
(),
getClass
().
getName
(),
url
};
ArrayList
<
Process
>
processes
=
new
ArrayList
<>(
count
);
...
...
h2/src/tools/org/h2/build/Build.java
浏览文件 @
f97a3dcc
...
...
@@ -1013,6 +1013,10 @@ public class Build extends BuildBase {
File
.
pathSeparator
+
"ext/slf4j-api-1.6.0.jar"
+
File
.
pathSeparator
+
"ext/slf4j-nop-1.6.0.jar"
+
File
.
pathSeparator
+
javaToolsJar
;
int
version
=
getJavaVersion
();
if
(
version
>=
9
)
{
cp
=
"src/java9/precompiled"
+
File
.
pathSeparator
+
cp
;
}
int
ret
;
if
(
travis
)
{
ret
=
execJava
(
args
(
...
...
h2/src/tools/org/h2/build/BuildBase.java
浏览文件 @
f97a3dcc
...
...
@@ -925,6 +925,25 @@ public class BuildBase {
return
System
.
getProperty
(
"java.specification.version"
);
}
/**
* Get the current Java version as integer value.
*
* @return the Java version (7, 8, 9, 10, 11, etc)
*/
protected
static
int
getJavaVersion
()
{
int
version
=
7
;
String
v
=
getJavaSpecVersion
();
if
(
v
!=
null
)
{
int
idx
=
v
.
indexOf
(
'.'
);
if
(
idx
>=
0
)
{
// 1.7, 1.8
v
=
v
.
substring
(
idx
+
1
);
}
version
=
Integer
.
parseInt
(
v
);
}
return
version
;
}
private
static
List
<
String
>
getPaths
(
FileList
files
)
{
StringList
list
=
new
StringList
();
for
(
File
f
:
files
)
{
...
...
h2/src/tools/org/h2/build/doc/dictionary.txt
浏览文件 @
f97a3dcc
...
...
@@ -783,3 +783,4 @@ intentionally authenticator authrealm ventura credentials alessandro validator a
ewkt ewkb informations authzpwd realms mappers jaxb realmname configurationfile unmarshal jaas externals customize
authenticators appname interrogate metatable barrier preliminary staticuser staticpassword unregistered inquiry
ldapexample remoteuser assignments djava validators mock relate mapid tighten
retried helpers unclean missed parsers sax myclass suppose mandatory testxml miao ciao
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论