今天,我正在寻找一种使用dotcmis中包含特定属性的所有文档的好方法。
我在想:
- 使用ephesoft(http://www.ephesoft.com/)捕获文档。
- 使用CMIS集成将Ephesoft与Alfresco连接。
- 配置文档属性与Alfresco模型匹配(元数据文档)
- 在我的WebApplication(ASP.NET)中开发一个模块,以搜索具有特定属性(元数据)的所有文档;使用dotcmis(http://chemistry.apache.org/dotnet/dotcmis.html)
我发现:
- 如何创建会话。
- 如何列出树文件夹
除外...如果已经设置了特定属性(元数据),如何验证每个文档?
你知道怎么样吗?
谢谢Pablochan!在这一刻,我有:
public ISession Connect(string user, string password, string servicesUrl, string repositoryId)
{
IDictionary<string, string> parameter = new Dictionary<string, string>();
parameter.Add(DotCMIS.SessionParameter.User, user);
parameter.Add(DotCMIS.SessionParameter.Password, password);
parameter.Add(DotCMIS.SessionParameter.BindingType, DotCMIS.BindingType.WebServices);
parameter.Add(DotCMIS.SessionParameter.WebServicesAclService, (servicesUrl + "ACLService?wsdl").ToString());
parameter.Add(DotCMIS.SessionParameter.WebServicesDiscoveryService, (servicesUrl + "DiscoveryService?wsdl").ToString());
parameter.Add(DotCMIS.SessionParameter.WebServicesMultifilingService, (servicesUrl + "MultiFilingService?wsdl").ToString());
parameter.Add(DotCMIS.SessionParameter.WebServicesNavigationService, (servicesUrl + "NavigationService?wsdl").ToString());
parameter.Add(DotCMIS.SessionParameter.WebServicesObjectService, (servicesUrl + "ObjectService?wsdl").ToString());
parameter.Add(DotCMIS.SessionParameter.WebServicesPolicyService, (servicesUrl + "PolicyService?wsdl").ToString());
parameter.Add(DotCMIS.SessionParameter.WebServicesRelationshipService, (servicesUrl + "RelationshipService?wsdl").ToString());
parameter.Add(DotCMIS.SessionParameter.WebServicesRepositoryService, (servicesUrl + "RepositoryService?wsdl").ToString());
parameter.Add(DotCMIS.SessionParameter.WebServicesVersioningService, (servicesUrl + "VersioningService?wsdl").ToString());
parameter.Add(DotCMIS.SessionParameter.RepositoryId, (repositoryId));
ISessionFactory factory = DotCMIS.Client.Impl.SessionFactory.NewInstance();
return factory.CreateSession(parameter);
}
public List<CMISIntegrationResponse> GetFiles(CMISIntegrationRequest request)
{
List<CMISIntegrationResponse> cmisIntegrationResponseList = new List<CMISIntegrationResponse>();
ISession session = Connect(request.UserName, request.Password, request.ServicesUrl, request.RepositoryId);
IItemEnumerable<IQueryResult> result = session.Query(@"SELECT
cmis:name, cmis:objectId, cmis:baseTypeId, cmis:objectTypeId, cmis:createdBy,
cmis:lastModifiedBy, cmis:lastModificationDate,cmis:contentStreamMimeType,
cmis:contentStreamFileName,cmis:contentStreamId,cmis:contentStreamLength
FROM cmis:document
ORDER BY
cmis:name, cmis:createdBy", false);
foreach(QueryResult item in result)
{
if (item.AllowableActions.Actions.Contains(DotCMIS.Actions.CanGetContentStream))
{
foreach (DotCMIS.Data.IPropertyData property in item.Properties)
{
/*AccountNumber will be a property/metadata of any document
In this point i can not see any property/metadata called "AccountNumber"
*/
if (property.DisplayName.Equals("AccountNumber"))
{
CMISIntegrationResponse response = new CMISIntegrationResponse();
response.Name = item.GetPropertyValueByQueryName("cmis:name").ToString();
response.ObjectId = item.GetPropertyValueByQueryName("cmis:objectId").ToString();
response.BaseTypeId = item.GetPropertyValueByQueryName("cmis:baseTypeId").ToString();
response.ObjectTypeId = item.GetPropertyValueByQueryName("cmis:objectTypeId").ToString();
response.CreatedBy = item.GetPropertyValueByQueryName("cmis:createdBy").ToString();
response.LastModifiedBy = item.GetPropertyValueByQueryName("cmis:lastModifiedBy").ToString();
response.LastModificationDate = item.GetPropertyValueByQueryName("cmis:lastModificationDate").ToString();
response.ContentStreamMimeType = item.GetPropertyValueByQueryName("cmis:contentStreamMimeType").ToString();
response.ContentStreamFileName = item.GetPropertyValueByQueryName("cmis:contentStreamFileName").ToString();
response.ContentStreamId = item.GetPropertyValueByQueryName("cmis:contentStreamId").ToString();
response.ContentStreamLength = item.GetPropertyValueByQueryName("cmis:contentStreamLength").ToString();
cmisIntegrationResponseList.Add(response);
}
}
}
}
session.Clear();
return cmisIntegrationResponseList;
}
在哪里可以看到虚拟表及其CMIS alfresco的列的列表?
谢谢!
您可以将CMIS查询发送到Alfresco。我建议您首先阅读有关CMIS查询语言的信息。之后,阅读了" dotcmis指南"。
假设您的字段定义了类型或方面,例如我的:expact and my:field。
查询看起来像这样:
SELECT * FROM my:aspect WHERE my:field = "some value"
代码将是:
session.Query("SELECT * FROM my:aspect WHERE my:field = 'some value'", false);
编辑:
好吧,我读了您的代码,还有一件事我没有提及。您没有看到字段(帐号)的原因是因为查询结果仅包含针对查询类型/方面定义的字段(在这种情况下为cmis:object)。如果您想对" AccountNumber"进行查询,则需要知道其定义的类型/方面。
假设" AccountNumber"是在类型的"自定义:mytype"中定义的。查询看起来像这样:
SELECT * from custom:myType
结果将包含"帐户名"。
如果该字段是在某个方面定义的,则可以使用加入进行查询:http://wiki.alfresco.com/wiki/cmis#aspect_query
我希望这会有所帮助。
在哪里可以看到虚拟表及其CMI的列的列表 alfresco?
最好的方法是从Apache Chemistry下载OpencMis Workbench。启动它,连接到alfresco,然后单击类型。然后,工作台将显示存储库所知道的类型的层次列表。
如果您单击您对工作台感兴趣的特定类型,将显示该类型的属性。如果滚动滚动,您会看到一个"可查询"列。如果该列为真,则可以编写测试该属性值的查询。在查询中使用属性的"查询名称"。