我几乎找不到任何关于如何为多个用户设计和构建存储库的文档.
我是Jackrabbit的新手,我总是使用一个主用户凭证来构建一个只有一个主用户访问的存储库.
现在我需要一个由成千上万的用户共享的存储库,每个用户都可以使用他的节点,并且没有其他用户的权限.
SimpleAccessManager非常简单:
public boolean isGranted(ItemId id, int permissions) throws RepositoryException {
checkInitialized();
if (system) {
// system has always all permissions
return true;
} else if (anonymous) {
// anonymous is always denied WRITE & REMOVE permissions
if ((permissions & WRITE) == WRITE
|| (permissions & REMOVE) == REMOVE) {
return false;
}
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
看起来无法使用SimpleLoginModule和SimpleAccessManager创建这样的多用户存储库.因为它只区分ADMIN和匿名用户,它们可以读取所有内容但无法写入...
所以必须使用DefaultAccessManager,也许这样做:
Session session = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
UserManager um = ((JackrabbitSession) session).getUserManager();
User user = um.createUser("john", "doe");
/* And assign …Run Code Online (Sandbox Code Playgroud) 我正在使用以下JCR-SQL2查询从jackrabbit存储库中检索一些文件
SELECT id FROM [nt:file]
WHERE ISDESCENDANTNODE([/repo/cms])
Run Code Online (Sandbox Code Playgroud)
如何在jackrabbit中使用分页来仅检索限制数量的文件.
我指的是MS-SQL中的COUNT或MySQL中的LIMIT
我使用一个应用程序,我们可以在其中操作 JCR 节点,通常您会重命名、删除、删除或移动它们。
使用 JCR API,我可以访问存储库中的节点并按照它们在 JCR 中的顺序返回一组节点。
我希望能够使用 JCR SQL2 查询来做同样的事情。我没有发现任何关于此的信息,现在开始相信这是不可能的。
例如,如果我有一个 JCR 树,例如:
parentNode
|_childNode1
|_childNode2
|_childNode3
|_childNode4
Run Code Online (Sandbox Code Playgroud)
当使用 JCR SQL2 查询时,它会以不同的顺序返回它们:childNode1、childNode2、childNode3、childNode4
我查看这些文档等: http: //docs.jboss.org/jbossdna/0.7/manuals/reference/html/jcr-query-and-search.html#jcr-sql2-query-language http://www .day.com/specs/jcr/2.0/6_Query.html
提前致谢
编辑:如果Java用于您的搜索是一个选项,您可能想通过java查看JCR repo中的递归搜索
不过可能不是最有效的,所以请注意性能损失。
我的pom.xml中有以下插件配置:
<plugin>
<groupId>com.day.jcr.vault</groupId>
<artifactId>maven-vault-plugin</artifactId>
<extensions>true</extensions>
<executions>
<execution>
...
<configuration>
...
<embeddeds>
<embedded>
<groupId>foo</groupId>
<artifactId>bar</artifactId>
<filter>true</filter>
</embedded>
...
Run Code Online (Sandbox Code Playgroud)
我不明白这个参数的含义:
<filter>true</filter>
Run Code Online (Sandbox Code Playgroud)
我注意到如果我把它变成假,那么对应的jar没有安装到jcr(在cq 5.6.1中)
PS
在CQ 5.5中,无论此参数如何,都安装了此jar.
请澄清.
我正在尝试将二进制数据存储在 JCR 中,这是动态创建的。我的问题是 JCR API 提供的唯一方法是通过InputStream:
Session session = request.getResourceResolver().adaptTo(Session.class);
ValueFactory valueFactory = session.getValueFactory();
Binary bin = valueFactory.createBinary(is);
Run Code Online (Sandbox Code Playgroud)
由于 CQ/Sling 是 RESTful,我可以理解为什么会出现这种情况,因为您通常会收到一个表单帖子或一个到另一个源的 httprequest,您总是可以InputStream使用它。但就我而言,我正在动态创建二进制文件,它通常表示为OutputStream.
OutputStream直接在 nt:file 节点上创建一个,就像一个FileOutputStream?OutpuStream转换为 a InputStream?我知道 Apache Commons 提供了另一种方法IOUtils.copy()。我见过一些关于 SO 的例子,他们只是使用来ByteArrayOutputStream.toByteArray()创建一个InputStream. 但由于数据可能变得相当大,这不是一个好的解决方案。此外,我尝试了它,但不知何故,流不完整,所以似乎存在缓冲区限制。下一个方法是使用管道流,但是我还有其他问题,我提出了另一个问题:Multiple Quotes Cause PipedOutputStream/OutputStreamWriter to failed
编辑:删除了 PipedStream 代码示例,因为我在另一个问题中发布了该问题。所以在这里我仍然只是在寻找一种简单的方法来创建 nt:file,其中输入不是InputStream.
我正在为AEM中的项目使用吊索模型.我有我的吊索模型设置为变量注入值.只要属性具有不破坏java语法的名称,我就可以设置getter以从已调整的资源中检索属性.(例如:标题)
我的问题是我需要破解java语法的属性(例如jcr:title等).我知道图像servlet的get servlet使用下划线代替句点(文件名为img.GET.java,类名为img_GET)并且好奇是否有一些我可以使用的字符是有效的java语法,注射策略可识别用冒号代替.
我知道我可以通过其他方式检索这些属性,但我想知道是否有办法使用注入检索它们以保持我的代码干燥.
我正在尝试使用JackRabbit 2.11.1连接到远程仓库(使用jackrabbit-jcr-rmi).这些捆绑包在JBoss Fuse 6.2中运行,其中引用了Apache Karaf 2.4/Felix 4.4.在启动时,我得到以下例外.如果我尝试使用jackrabbit-bundle我得到"Missing Constraint:Import-Package:com.ibm.db2.jcc; version ="0.0.0""所以我很困惑,JackRabbit 2.x OSGi准备好了吗?或者我需要使用吊带或橡木,还是......?
Caused by: org.osgi.framework.BundleException: Uses constraint violation. Unable to resolve bundle revision wrap_mvn_org.apache.jackrabbit_jackrabbit-core_2.11.1 [270.0] because it exports package 'org.apache.jackrabbit.core.config' and is also exposed to it from bundle revision org.apache.jackrabbit.jackrabbit-data [276.0] via the following dependency chain:
wrap_mvn_org.apache.jackrabbit_jackrabbit-core_2.11.1 [270.0]
import: (osgi.wiring.package=org.apache.jackrabbit.core.data.db)
export: osgi.wiring.package=org.apache.jackrabbit.core.data.db; uses:=org.apache.jackrabbit.core.config
export: osgi.wiring.package=org.apache.jackrabbit.core.config
org.apache.jackrabbit.jackrabbit-data [276.0]
at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:4006)[org.apache.felix.framework-4.4.1.jar:]
at org.apache.felix.framework.Felix.startBundle(Felix.java:2045)[org.apache.felix.framework-4.4.1.jar:]
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:976)[org.apache.felix.framework-4.4.1.jar:]
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:963)[org.apache.felix.framework-4.4.1.jar:]
at org.apache.karaf.features.internal.FeaturesServiceImpl.doInstallFeatures(FeaturesServiceImpl.java:546)[9:org.apache.karaf.features.core:2.4.0.redhat-620133]
Run Code Online (Sandbox Code Playgroud)
目前处于使用Apache Jackrabbit与Oracle DB进行评估的早期阶段.测试repository.xml配置的初始设置时,收到此错误:
15:18:32.281 [main] ERROR o.a.j.c.p.p.BundleDbPersistenceManager - FATAL error while writing the bundle: deadbeef-cafe-babe-cafe-babecafebabe
java.sql.SQLException: ORA-00001: unique constraint (REPO_BUNDLE_IDX) violated
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:113) ~[ojdbc14-10.2.0.4.jar:Oracle JDBC Driver version - "10.2.0.5.0"]
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331) ~[ojdbc14-10.2.0.4.jar:Oracle JDBC Driver version - "10.2.0.5.0"]
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288) ~[ojdbc14-10.2.0.4.jar:Oracle JDBC Driver version - "10.2.0.5.0"]
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:754) ~[ojdbc14-10.2.0.4.jar:Oracle JDBC Driver version - "10.2.0.5.0"]
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:219) ~[ojdbc14-10.2.0.4.jar:Oracle JDBC Driver version - "10.2.0.5.0"]
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:972) ~[ojdbc14-10.2.0.4.jar:Oracle JDBC Driver version - "10.2.0.5.0"]
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1192) ~[ojdbc14-10.2.0.4.jar:Oracle JDBC Driver version - "10.2.0.5.0"]
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3415) ~[ojdbc14-10.2.0.4.jar:Oracle …Run Code Online (Sandbox Code Playgroud) 我需要查询jcr存储库以查找日期属性(例如jcr:created)比特定日期更年轻的节点.
使用SQL2,我像这样检查"jcr:created> date"(工作正常):
SELECT * FROM [nt:base] AS s WHERE s.[jcr:created] > CAST('2012-01-05T00:00:00.000Z' AS DATE)
现在棘手的部分:
还有一个额外的属性声明需要动态添加到jcr:created日期的天数.
假设该属性包含5(天),那么查询不应该检查"jcr:created> date"而是"(jcr:created + 5)> date".包含属性值10的下一个节点应通过"(jcr:created + 10)> date"进行检查.
是否有任何智能/动态操作数可以做到这一点?由于属性是特定于节点的,因此我无法将其静态添加到查询中,但必须读取每个节点的属性.