use of org.apache.manifoldcf.core.common.XMLDoc in project manifoldcf by apache.
the class SPSProxyHelper method getFieldValues.
/**
* Gets a list of field values of the given document
* @param fieldNames
* @param site
* @param docId
* @return set of the field values
*/
public Map<String, String> getFieldValues(String[] fieldNames, String site, String docLibrary, String docId, boolean dspStsWorks) throws ManifoldCFException, ServiceInterruption {
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: In getFieldValues; fieldNames=" + fieldNames + ", site='" + site + "', docLibrary='" + docLibrary + "', docId='" + docId + "', dspStsWorks=" + dspStsWorks);
long currentTime;
try {
HashMap<String, String> result = new HashMap<String, String>();
// root case
if (site.compareTo("/") == 0)
site = "";
if (dspStsWorks) {
StsAdapterWS listService = new StsAdapterWS(baseUrl + site, userName, password, configuration, httpClient);
StsAdapterSoapStub stub = (StsAdapterSoapStub) listService.getStsAdapterSoapHandler();
String[] vArray = new String[1];
vArray[0] = "1.0";
VersionsHeader myVersion = new VersionsHeader();
myVersion.setVersion(vArray);
stub.setHeader("http://schemas.microsoft.com/sharepoint/dsp", "versions", myVersion);
RequestHeader reqHeader = new RequestHeader();
reqHeader.setDocument(DocumentType.content);
reqHeader.setMethod(MethodType.query);
stub.setHeader("http://schemas.microsoft.com/sharepoint/dsp", "request", reqHeader);
QueryRequest myRequest = new QueryRequest();
DSQuery sQuery = new DSQuery();
sQuery.setSelect("/list[@id='" + docLibrary + "']");
sQuery.setResultContent(ResultContentType.dataOnly);
myRequest.setDsQuery(sQuery);
DspQuery spQuery = new DspQuery();
spQuery.setRowLimit(1);
// For the Requested Fields
if (fieldNames.length > 0) {
Fields spFields = new Fields();
Field[] fieldArray = new Field[0];
ArrayList fields = new ArrayList();
Field spField = new Field();
for (String fieldName : fieldNames) {
spField = new Field();
spField.setName(fieldName);
spField.setAlias(fieldName);
fields.add(spField);
}
spFields.setField((Field[]) fields.toArray(fieldArray));
spQuery.setFields(spFields);
}
// Of this document
DspQueryWhere spWhere = new DspQueryWhere();
org.apache.axis.message.MessageElement criterion = new org.apache.axis.message.MessageElement((String) null, "Contains");
SOAPElement seFieldRef = criterion.addChildElement("FieldRef");
seFieldRef.addAttribute(SOAPFactory.newInstance().createName("Name"), "FileRef");
SOAPElement seValue = criterion.addChildElement("Value");
seValue.addAttribute(SOAPFactory.newInstance().createName("Type"), "String");
seValue.setValue(docId);
org.apache.axis.message.MessageElement[] criteria = { criterion };
spWhere.set_any(criteria);
spQuery.setWhere((DspQueryWhere) spWhere);
// Set Criteria
myRequest.getDsQuery().setQuery(spQuery);
StsAdapterSoap call = stub;
// Make Request
QueryResponse resp = call.query(myRequest);
org.apache.axis.message.MessageElement[] list = resp.get_any();
final String xmlResponse = list[0].toString();
if (Logging.connectors.isDebugEnabled()) {
Logging.connectors.debug("SharePoint: getFieldValues xml response: '" + xmlResponse + "'");
}
final XMLDoc doc;
try {
doc = new XMLDoc(xmlResponse);
} catch (ManifoldCFException e) {
return null;
}
ArrayList nodeList = new ArrayList();
doc.processPath(nodeList, "*", null);
if (nodeList.size() != 1) {
throw new ManifoldCFException("Bad xml - missing outer 'ns1:dsQueryResponse' node - there are " + Integer.toString(nodeList.size()) + " nodes");
}
Object parent = nodeList.get(0);
// System.out.println( "Outer NodeName = " + doc.getNodeName(parent) );
if (!doc.getNodeName(parent).equals("ns1:dsQueryResponse"))
throw new ManifoldCFException("Bad xml - outer node is not 'ns1:dsQueryResponse'");
nodeList.clear();
doc.processPath(nodeList, "*", parent);
// <Shared_X0020_Documents />
parent = nodeList.get(0);
nodeList.clear();
doc.processPath(nodeList, "*", parent);
// Get each childs Value and add to return array
for (int i = 0; i < nodeList.size(); i++) {
Object documentNode = nodeList.get(i);
ArrayList fieldList = new ArrayList();
doc.processPath(fieldList, "*", documentNode);
for (int j = 0; j < fieldList.size(); j++) {
Object field = fieldList.get(j);
String fieldData = doc.getData(field);
String fieldName = doc.getNodeName(field);
// Right now this really only works right for single-valued fields. For multi-valued
// fields, we'd need to know in advance that they were multivalued
// so that we could interpret commas as value separators.
result.put(fieldName, fieldData);
}
}
} else {
// SharePoint 2010: Get field values some other way
// Sharepoint 2010; use Lists service instead
ListsWS lservice = new ListsWS(baseUrl + site, userName, password, configuration, httpClient);
ListsSoapStub stub1 = (ListsSoapStub) lservice.getListsSoapHandler();
String sitePlusDocId = serverLocation + site + docId;
if (sitePlusDocId.startsWith("/"))
sitePlusDocId = sitePlusDocId.substring(1);
GetListItemsQuery q = buildMatchQuery("FileRef", "Text", sitePlusDocId);
GetListItemsViewFields viewFields = buildViewFields(fieldNames);
GetListItemsResponseGetListItemsResult items = stub1.getListItems(docLibrary, "", q, viewFields, "1", buildNonPagingQueryOptions(), null);
if (items == null)
return result;
MessageElement[] list = items.get_any();
final String xmlResponse = list[0].toString();
if (Logging.connectors.isDebugEnabled()) {
Logging.connectors.debug("SharePoint: getListItems FileRef value '" + sitePlusDocId + "', xml response: '" + xmlResponse + "'");
}
ArrayList nodeList = new ArrayList();
final XMLDoc doc;
try {
doc = new XMLDoc(xmlResponse);
} catch (ManifoldCFException e) {
return null;
}
doc.processPath(nodeList, "*", null);
if (nodeList.size() != 1)
throw new ManifoldCFException("Bad xml - expecting one outer 'ns1:listitems' node - there are " + Integer.toString(nodeList.size()) + " nodes");
Object parent = nodeList.get(0);
if (!"ns1:listitems".equals(doc.getNodeName(parent)))
throw new ManifoldCFException("Bad xml - outer node is not 'ns1:listitems'");
nodeList.clear();
doc.processPath(nodeList, "*", parent);
if (nodeList.size() != 1)
throw new ManifoldCFException("Expected rsdata result but no results found.");
Object rsData = nodeList.get(0);
int itemCount = Integer.parseInt(doc.getValue(rsData, "ItemCount"));
if (itemCount == 0)
return result;
// Now, extract the files from the response document
ArrayList nodeDocs = new ArrayList();
doc.processPath(nodeDocs, "*", rsData);
if (nodeDocs.size() != itemCount)
throw new ManifoldCFException("itemCount does not match with nodeDocs.size()");
if (itemCount != 1)
throw new ManifoldCFException("Expecting only one item, instead saw '" + itemCount + "'");
Object o = nodeDocs.get(0);
// Look for all the specified attributes in the record
for (Object attrName : fieldNames) {
String attrValue = doc.getValue(o, "ows_" + (String) attrName);
if (attrValue != null) {
result.put(attrName.toString(), valueMunge(attrValue));
}
}
}
return result;
} catch (javax.xml.soap.SOAPException e) {
throw new ManifoldCFException("Soap exception: " + e.getMessage(), e);
} catch (java.net.MalformedURLException e) {
throw new ManifoldCFException("Bad SharePoint url: " + e.getMessage(), e);
} catch (javax.xml.rpc.ServiceException e) {
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: Got a service exception getting field values for site " + site + " library " + docLibrary + " document '" + docId + "' - retrying", e);
currentTime = System.currentTimeMillis();
throw new ServiceInterruption("Service exception: " + e.getMessage(), e, currentTime + 300000L, currentTime + 12 * 60 * 60000L, -1, true);
} catch (org.apache.axis.AxisFault e) {
// Bad XML can come from Microsoft.
if (e.getCause() != null && (e.getCause() instanceof org.xml.sax.SAXParseException)) {
return null;
}
if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/", "HTTP"))) {
org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/", "HttpErrorCode"));
if (elem != null) {
elem.normalize();
String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
// 302 is what SharePoint returns for external sites
if (httpErrorCode.equals("404") || httpErrorCode.equals("302"))
return null;
else if (httpErrorCode.equals("403"))
throw new ManifoldCFException("Remote procedure exception: " + e.getMessage(), e);
else if (httpErrorCode.equals("401")) {
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: Crawl user does not have sufficient privileges to get field values for site " + site + " library " + docLibrary + " - skipping", e);
return null;
}
throw new ManifoldCFException("Unexpected http error code " + httpErrorCode + " accessing SharePoint at " + baseUrl + site + ": " + e.getMessage(), e);
}
throw new ManifoldCFException("Unknown http error occurred: " + e.getMessage(), e);
}
if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/", "Server.userException"))) {
String exceptionName = e.getFaultString();
if (exceptionName.equals("java.lang.InterruptedException"))
throw new ManifoldCFException("Interrupted", ManifoldCFException.INTERRUPTED);
}
// I don't know if this is what you get when the library is missing, but here's hoping.
if (e.getMessage().indexOf("List does not exist") != -1)
return null;
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: Got a remote exception getting field values for site " + site + " library " + docLibrary + " document [" + docId + "] - retrying", e);
currentTime = System.currentTimeMillis();
throw new ServiceInterruption("Remote procedure exception: " + e.getMessage(), e, currentTime + 300000L, currentTime + 3 * 60 * 60000L, -1, false);
} catch (java.rmi.RemoteException e) {
throw new ManifoldCFException("Unexpected remote exception occurred: " + e.getMessage(), e);
}
}
use of org.apache.manifoldcf.core.common.XMLDoc in project manifoldcf by apache.
the class SPSProxyHelper method getLists.
/**
* Gets a list of lists given a parent site
* @param parentSite the site to search for lists, empty string for root
* @return lists of NameValue objects, representing lists
*/
public List<NameValue> getLists(String parentSite, String parentSiteDecoded) throws ManifoldCFException, ServiceInterruption {
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: In getLists; parentSite='" + parentSite + "', parentSiteDecoded='" + parentSiteDecoded + "'");
long currentTime;
try {
ArrayList<NameValue> result = new ArrayList<NameValue>();
String parentSiteRequest = parentSite;
if (parentSiteRequest.equals("/")) {
// root case
parentSiteRequest = "";
parentSiteDecoded = "";
}
ListsWS listsService = new ListsWS(baseUrl + parentSiteRequest, userName, password, configuration, httpClient);
ListsSoap listsCall = listsService.getListsSoapHandler();
GetListCollectionResponseGetListCollectionResult listResp = listsCall.getListCollection();
org.apache.axis.message.MessageElement[] lists = listResp.get_any();
final String xmlResponse = lists[0].toString();
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: getLists xml response: " + xmlResponse);
final XMLDoc doc;
try {
doc = new XMLDoc(xmlResponse);
} catch (ManifoldCFException e) {
return null;
}
ArrayList nodeList = new ArrayList();
doc.processPath(nodeList, "*", null);
if (nodeList.size() != 1) {
throw new ManifoldCFException("Bad xml - missing outer 'ns1:Lists' node - there are " + Integer.toString(nodeList.size()) + " nodes");
}
Object parent = nodeList.get(0);
if (!doc.getNodeName(parent).equals("ns1:Lists"))
throw new ManifoldCFException("Bad xml - outer node is not 'ns1:Lists'");
nodeList.clear();
// <ns1:Lists>
doc.processPath(nodeList, "*", parent);
String prefixPath = decodedServerLocation + parentSiteDecoded + "/";
int i = 0;
while (i < nodeList.size()) {
Object o = nodeList.get(i++);
String baseType = doc.getValue(o, "BaseType");
if (baseType.equals("0")) {
// We think it's a list
// This is how we display it, so this has the right path extension
String urlPath = doc.getValue(o, "DefaultViewUrl");
// This is the pretty name
String title = doc.getValue(o, "Title");
// Leave this in for the moment
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: List: '" + urlPath + "', '" + title + "'");
// If it has no view url, we don't have any idea what to do with it
if (urlPath != null && urlPath.length() > 0) {
// Normalize conditionally
if (!urlPath.startsWith("/"))
urlPath = prefixPath + urlPath;
// Get rid of what we don't want, unconditionally
if (urlPath.startsWith(prefixPath)) {
urlPath = urlPath.substring(prefixPath.length());
// We're at the /Lists/listname part of the name. Figure out where the end of it is.
int index = urlPath.indexOf("/");
if (index == -1)
continue;
// throw new ManifoldCFException("Bad list view url without site: '"+urlPath+"'");
String pathpart = urlPath.substring(0, index);
if ("Lists".equals(pathpart)) {
int k = urlPath.indexOf("/", index + 1);
if (k == -1)
continue;
// throw new ManifoldCFException("Bad list view url without 'Lists': '"+urlPath+"'");
pathpart = urlPath.substring(index + 1, k);
}
if (pathpart.length() != 0 && !pathpart.equals("_catalogs")) {
if (title == null || title.length() == 0)
title = pathpart;
result.add(new NameValue(pathpart, title));
}
} else {
Logging.connectors.warn("SharePoint: List view url is not in the expected form: '" + urlPath + "'; expected something beginning with '" + prefixPath + "'; skipping");
}
}
}
}
return result;
} catch (java.net.MalformedURLException e) {
throw new ManifoldCFException("Bad SharePoint url: " + e.getMessage(), e);
} catch (javax.xml.rpc.ServiceException e) {
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: Got a service exception getting lists for site " + parentSite + " - retrying", e);
currentTime = System.currentTimeMillis();
throw new ServiceInterruption("Service exception: " + e.getMessage(), e, currentTime + 300000L, currentTime + 12 * 60 * 60000L, -1, true);
} catch (org.apache.axis.AxisFault e) {
// Bad XML can come from Microsoft.
if (e.getCause() != null && (e.getCause() instanceof org.xml.sax.SAXParseException)) {
return null;
}
if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/", "HTTP"))) {
org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/", "HttpErrorCode"));
if (elem != null) {
elem.normalize();
String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
// 302 is what SharePoint returns for external sites
if (httpErrorCode.equals("404") || httpErrorCode.equals("302"))
return null;
else if (httpErrorCode.equals("403"))
throw new ManifoldCFException("Remote procedure exception: " + e.getMessage(), e);
else if (httpErrorCode.equals("401")) {
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: Crawl user does not have sufficient privileges to read lists for site " + parentSite + " - skipping", e);
return null;
}
throw new ManifoldCFException("Unexpected http error code " + httpErrorCode + " accessing SharePoint at " + baseUrl + parentSite + ": " + e.getMessage(), e);
}
throw new ManifoldCFException("Unknown http error occurred: " + e.getMessage(), e);
}
if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/", "Server.userException"))) {
String exceptionName = e.getFaultString();
if (exceptionName.equals("java.lang.InterruptedException"))
throw new ManifoldCFException("Interrupted", ManifoldCFException.INTERRUPTED);
}
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: Got a remote exception reading lists for site " + parentSite + " - retrying", e);
currentTime = System.currentTimeMillis();
throw new ServiceInterruption("Remote procedure exception: " + e.getMessage(), e, currentTime + 300000L, currentTime + 3 * 60 * 60000L, -1, false);
} catch (java.rmi.RemoteException e) {
throw new ManifoldCFException("Unexpected remote exception occurred: " + e.getMessage(), e);
}
}
use of org.apache.manifoldcf.core.common.XMLDoc in project manifoldcf by apache.
the class SPSProxyHelper method getSites.
/**
* Gets a list of sites given a parent site
* @param parentSite the site to search for subsites, empty string for root
* @return lists of sites as an arraylist of NameValue objects
*/
public List<NameValue> getSites(String parentSite) throws ManifoldCFException, ServiceInterruption {
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: In getSites; parentSite='" + parentSite + "'");
long currentTime;
try {
ArrayList<NameValue> result = new ArrayList<NameValue>();
// Call the webs service
if (parentSite.equals("/"))
parentSite = "";
WebsWS webService = new WebsWS(baseUrl + parentSite, userName, password, configuration, httpClient);
WebsSoap webCall = webService.getWebsSoapHandler();
GetWebCollectionResponseGetWebCollectionResult webResp = webCall.getWebCollection();
org.apache.axis.message.MessageElement[] webList = webResp.get_any();
final String xmlResponse = webList[0].toString();
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: getSites xml response: " + xmlResponse);
final XMLDoc doc;
try {
doc = new XMLDoc(xmlResponse);
} catch (ManifoldCFException e) {
return null;
}
ArrayList nodeList = new ArrayList();
doc.processPath(nodeList, "*", null);
if (nodeList.size() != 1) {
throw new ManifoldCFException("Bad xml - missing outer 'ns1:Webs' node - there are " + Integer.toString(nodeList.size()) + " nodes");
}
Object parent = nodeList.get(0);
if (!doc.getNodeName(parent).equals("ns1:Webs"))
throw new ManifoldCFException("Bad xml - outer node is not 'ns1:Webs'");
nodeList.clear();
// <ns1:Webs>
doc.processPath(nodeList, "*", parent);
int i = 0;
while (i < nodeList.size()) {
Object o = nodeList.get(i++);
// Logging.connectors.debug( i + ": " + o );
// System.out.println( i + ": " + o );
String url = doc.getValue(o, "Url");
String title = doc.getValue(o, "Title");
// Leave here for now
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: Subsite list: '" + url + "', '" + title + "'");
// the server name part of the path will actually match what got passed in. Therefore, we want to look only at the last path segment, whatever that is.
if (url != null && url.length() > 0) {
int lastSlash = url.lastIndexOf("/");
if (lastSlash != -1) {
String pathValue = url.substring(lastSlash + 1);
if (pathValue.length() > 0) {
if (title == null || title.length() == 0)
title = pathValue;
result.add(new NameValue(pathValue, title));
}
}
}
}
return result;
} catch (java.net.MalformedURLException e) {
throw new ManifoldCFException("Bad SharePoint url: " + e.getMessage(), e);
} catch (javax.xml.rpc.ServiceException e) {
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: Got a service exception getting subsites for site " + parentSite + " - retrying", e);
currentTime = System.currentTimeMillis();
throw new ServiceInterruption("Service exception: " + e.getMessage(), e, currentTime + 300000L, currentTime + 12 * 60 * 60000L, -1, true);
} catch (org.apache.axis.AxisFault e) {
// Bad XML can come from Microsoft.
if (e.getCause() != null && (e.getCause() instanceof org.xml.sax.SAXParseException)) {
return null;
}
if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/", "HTTP"))) {
org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/", "HttpErrorCode"));
if (elem != null) {
elem.normalize();
String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
// 302 is what SharePoint returns for external sites
if (httpErrorCode.equals("404") || httpErrorCode.equals("302"))
return null;
else if (httpErrorCode.equals("403"))
throw new ManifoldCFException("Remote procedure exception: " + e.getMessage(), e);
else if (httpErrorCode.equals("401")) {
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: Crawl user does not have sufficient privileges to get subsites of site " + parentSite + " - skipping", e);
return null;
}
throw new ManifoldCFException("Unexpected http error code " + httpErrorCode + " accessing SharePoint at " + baseUrl + parentSite + ": " + e.getMessage(), e);
}
throw new ManifoldCFException("Unknown http error occurred: " + e.getMessage(), e);
}
if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/", "Server.userException"))) {
String exceptionName = e.getFaultString();
if (exceptionName.equals("java.lang.InterruptedException"))
throw new ManifoldCFException("Interrupted", ManifoldCFException.INTERRUPTED);
}
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: Got a remote exception getting subsites for site " + parentSite + " - retrying", e);
currentTime = System.currentTimeMillis();
throw new ServiceInterruption("Remote procedure exception: " + e.getMessage(), e, currentTime + 300000L, currentTime + 3 * 60 * 60000L, -1, false);
} catch (java.rmi.RemoteException e) {
throw new ManifoldCFException("Unexpected remote exception occurred: " + e.getMessage(), e);
}
}
use of org.apache.manifoldcf.core.common.XMLDoc in project manifoldcf by apache.
the class SPSProxyHelper method getDocumentACLs.
/**
* Get the acls for a document.
* NOTE that this function only works for SharePoint 2007+ with the MCPermissions web service installed.
* @param site is the encoded subsite path
* @param file is the encoded file url (not including protocol or server or location, but including encoded subsite, library and folder/file path)
* @return array of document SIDs
* @throws ManifoldCFException
* @throws ServiceInterruption
*/
public String[] getDocumentACLs(String site, String file, boolean activeDirectoryAuthority) throws ManifoldCFException, ServiceInterruption {
long currentTime;
try {
// root case
if (site.compareTo("/") == 0)
site = "";
// Calculate the full server-relative path of the file
String encodedRelativePath = serverLocation + file;
if (encodedRelativePath.startsWith("/"))
encodedRelativePath = encodedRelativePath.substring(1);
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: In getDocumentACLs for site '" + site + "', file '" + file + "': Encoded relative path is '" + encodedRelativePath + "'");
UserGroupWS userService = new UserGroupWS(baseUrl + site, userName, password, configuration, httpClient);
com.microsoft.schemas.sharepoint.soap.directory.UserGroupSoap userCall = userService.getUserGroupSoapHandler();
MCPermissionsWS aclService = new MCPermissionsWS(baseUrl + site, userName, password, configuration, httpClient);
com.microsoft.sharepoint.webpartpages.PermissionsSoap aclCall = aclService.getPermissionsSoapHandler();
com.microsoft.sharepoint.webpartpages.GetPermissionCollectionResponseGetPermissionCollectionResult aclResult = aclCall.getPermissionCollection(encodedRelativePath, "Item");
if (aclResult == null) {
Logging.connectors.debug("SharePoint: getDocumentACLs: document acls were null");
return null;
}
org.apache.axis.message.MessageElement[] aclList = aclResult.get_any();
final String xmlResponse = aclList[0].toString();
if (Logging.connectors.isDebugEnabled()) {
Logging.connectors.debug("SharePoint: getDocumentACLs xml response: " + xmlResponse);
}
final XMLDoc doc;
try {
doc = new XMLDoc(xmlResponse);
} catch (ManifoldCFException e) {
return null;
}
ArrayList nodeList = new ArrayList();
doc.processPath(nodeList, "*", null);
if (nodeList.size() != 1) {
throw new ManifoldCFException("Bad xml - missing outer 'ns1:GetPermissionCollection' node - there are " + Integer.toString(nodeList.size()) + " nodes");
}
Object parent = nodeList.get(0);
if (!doc.getNodeName(parent).equals("GetPermissionCollection"))
throw new ManifoldCFException("Bad xml - outer node is not 'GetPermissionCollection'");
nodeList.clear();
doc.processPath(nodeList, "*", parent);
if (nodeList.size() != 1) {
throw new ManifoldCFException(" No results found.");
}
parent = nodeList.get(0);
nodeList.clear();
doc.processPath(nodeList, "*", parent);
Set<String> sids = new HashSet<String>();
int i = 0;
for (; i < nodeList.size(); i++) {
Object node = nodeList.get(i);
String mask = doc.getValue(node, "Mask");
long maskValue = new Long(mask).longValue();
if ((maskValue & 1L) == 1L) {
// Permission to view
String isUser = doc.getValue(node, "MemberIsUser");
if (isUser.compareToIgnoreCase("True") == 0) {
// Use AD user or group
String userLogin = doc.getValue(node, "UserLogin");
String userSid = getSidForUser(userCall, userLogin, activeDirectoryAuthority);
sids.add(userSid);
} else {
// Role
List<String> roleSids;
String roleName = doc.getValue(node, "RoleName");
if (roleName.length() == 0) {
roleName = doc.getValue(node, "GroupName");
roleSids = getSidsForGroup(userCall, roleName, activeDirectoryAuthority);
} else {
roleSids = getSidsForRole(userCall, roleName, activeDirectoryAuthority);
}
for (String sid : roleSids) {
sids.add(sid);
}
}
}
}
return sids.toArray(new String[0]);
} catch (java.net.MalformedURLException e) {
throw new ManifoldCFException("Bad SharePoint url: " + e.getMessage(), e);
} catch (javax.xml.rpc.ServiceException e) {
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: Got a service exception getting the acls for site " + site + " file " + file + " - retrying", e);
currentTime = System.currentTimeMillis();
throw new ServiceInterruption("Service exception: " + e.getMessage(), e, currentTime + 300000L, currentTime + 12 * 60 * 60000L, -1, true);
} catch (org.apache.axis.AxisFault e) {
// Bad XML can come from Microsoft.
if (e.getCause() != null && (e.getCause() instanceof org.xml.sax.SAXParseException)) {
return null;
}
currentTime = System.currentTimeMillis();
if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/", "HTTP"))) {
org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/", "HttpErrorCode"));
if (elem != null) {
elem.normalize();
String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
// 302 is what SharePoint returns for external sites
if (httpErrorCode.equals("404") || httpErrorCode.equals("302")) {
// Page did not exist
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: The page at " + baseUrl + site + " did not exist or was external; skipping library");
return null;
} else if (httpErrorCode.equals("401")) {
// User did not have permissions for this library to get the acls
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: The crawl user did not have access to the MCPermissions service for " + baseUrl + site + "; skipping documents within");
return null;
} else if (httpErrorCode.equals("403"))
throw new ManifoldCFException("Http error " + httpErrorCode + " while reading from " + baseUrl + site + " - check IIS and SharePoint security settings! " + e.getMessage(), e);
else
throw new ManifoldCFException("Unexpected http error code " + httpErrorCode + " accessing SharePoint at " + baseUrl + site + ": " + e.getMessage(), e);
}
throw new ManifoldCFException("Unknown http error occurred: " + e.getMessage(), e);
} else if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/", "Server"))) {
org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/", "errorcode"));
if (elem != null) {
elem.normalize();
String sharepointErrorCode = elem.getFirstChild().getNodeValue().trim();
if (sharepointErrorCode.equals("0x82000006")) {
// List did not exist
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: The file " + file + " in site " + site + " did not exist or was external; skipping file");
return null;
} else {
if (Logging.connectors.isDebugEnabled()) {
org.w3c.dom.Element elem2 = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/", "errorstring"));
String errorString = "";
if (elem != null)
errorString = elem2.getFirstChild().getNodeValue().trim();
Logging.connectors.debug("SharePoint: Getting permissions for the file " + file + " in site " + site + " failed with unexpected SharePoint error code " + sharepointErrorCode + ": " + errorString + " - Skipping", e);
}
return null;
}
}
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: Unknown SharePoint server error getting the acls for site " + site + " file " + file + " - axis fault = " + e.getFaultCode().getLocalPart() + ", detail = " + e.getFaultString() + " - retrying", e);
throw new ServiceInterruption("Unknown SharePoint server error: " + e.getMessage() + " - retrying", e, currentTime + 300000L, currentTime + 3 * 60 * 60000L, -1, false);
}
if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/", "Server.userException"))) {
String exceptionName = e.getFaultString();
if (exceptionName.equals("java.lang.InterruptedException"))
throw new ManifoldCFException("Interrupted", ManifoldCFException.INTERRUPTED);
}
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: Got an unknown remote exception getting the acls for site " + site + " file " + file + " - axis fault = " + e.getFaultCode().getLocalPart() + ", detail = " + e.getFaultString() + " - retrying", e);
throw new ServiceInterruption("Remote procedure exception: " + e.getMessage(), e, currentTime + 300000L, currentTime + 3 * 60 * 60000L, -1, false);
} catch (java.rmi.RemoteException e) {
// So, fail hard if we see it.
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: Got an unexpected remote exception getting the acls for site " + site + " file " + file, e);
throw new ManifoldCFException("Unexpected remote procedure exception: " + e.getMessage(), e);
}
}
use of org.apache.manifoldcf.core.common.XMLDoc in project manifoldcf by apache.
the class SPSProxyHelper method getVersions.
/**
* @param site
* @param docPath
* @return an XML document
* @throws ManifoldCFException
* @throws ServiceInterruption
*/
public XMLDoc getVersions(String site, String docPath) throws ServiceInterruption, ManifoldCFException {
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: In getVersions; site='" + site + "', docPath='" + docPath + "'");
long currentTime;
try {
// root case
if (site.compareTo("/") == 0)
site = "";
VersionsWS versionsService = new VersionsWS(baseUrl + site, userName, password, configuration, httpClient);
VersionsSoap versionsCall = versionsService.getVersionsSoapHandler();
GetVersionsResponseGetVersionsResult versionsResp = versionsCall.getVersions(docPath);
org.apache.axis.message.MessageElement[] lists = versionsResp.get_any();
final String xmlResponse = lists[0].toString();
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: getVersions response: " + xmlResponse);
final XMLDoc doc;
try {
doc = new XMLDoc(xmlResponse);
} catch (ManifoldCFException e) {
return null;
}
ArrayList nodeList = new ArrayList();
doc.processPath(nodeList, "*", null);
if (nodeList.size() != 1) {
throw new ManifoldCFException("Bad xml - missing outer 'results' node - there are " + Integer.toString(nodeList.size()) + " nodes");
}
Object parent = nodeList.get(0);
if (!doc.getNodeName(parent).equals("results"))
throw new ManifoldCFException("Bad xml - outer node is not 'results'");
return doc;
} catch (java.net.MalformedURLException e) {
throw new ManifoldCFException("Bad SharePoint url: " + e.getMessage(), e);
} catch (javax.xml.rpc.ServiceException e) {
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: Got a service exception getting versions for site " + site + " docpath " + docPath + " - retrying", e);
currentTime = System.currentTimeMillis();
throw new ServiceInterruption("Service exception: " + e.getMessage(), e, currentTime + 300000L, currentTime + 12 * 60 * 60000L, -1, true);
} catch (org.apache.axis.AxisFault e) {
// Bad XML can come from Microsoft.
if (e.getCause() != null && (e.getCause() instanceof org.xml.sax.SAXParseException)) {
return null;
}
currentTime = System.currentTimeMillis();
if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://xml.apache.org/axis/", "HTTP"))) {
org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://xml.apache.org/axis/", "HttpErrorCode"));
if (elem != null) {
elem.normalize();
String httpErrorCode = elem.getFirstChild().getNodeValue().trim();
// 302 is what SharePoint returns for external sites
if (httpErrorCode.equals("404") || httpErrorCode.equals("302")) {
// Page did not exist
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: The page at " + baseUrl + site + " did not exist or was external; skipping library");
return null;
} else if (httpErrorCode.equals("401")) {
// User did not have permissions for this library to get the acls
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: The crawl user did not have access to get versions for " + baseUrl + site + "; skipping");
return null;
} else if (httpErrorCode.equals("403"))
throw new ManifoldCFException("Http error " + httpErrorCode + " while reading from " + baseUrl + site + " - check IIS and SharePoint security settings! " + e.getMessage(), e);
else
throw new ManifoldCFException("Unexpected http error code " + httpErrorCode + " accessing SharePoint at " + baseUrl + site + ": " + e.getMessage(), e);
}
throw new ManifoldCFException("Unknown http error occurred: " + e.getMessage(), e);
} else if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/", "Server"))) {
org.w3c.dom.Element elem = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/", "errorcode"));
if (elem != null) {
elem.normalize();
String sharepointErrorCode = elem.getFirstChild().getNodeValue().trim();
if (sharepointErrorCode.equals("0x82000006")) {
// List did not exist
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: The docpath " + docPath + " in site " + site + " did not exist or was external; skipping library");
return null;
} else {
if (Logging.connectors.isDebugEnabled()) {
org.w3c.dom.Element elem2 = e.lookupFaultDetail(new javax.xml.namespace.QName("http://schemas.microsoft.com/sharepoint/soap/", "errorstring"));
String errorString = "";
if (elem != null)
errorString = elem2.getFirstChild().getNodeValue().trim();
Logging.connectors.debug("SharePoint: Getting versions for the docpath " + docPath + " in site " + site + " failed with unexpected SharePoint error code " + sharepointErrorCode + ": " + errorString + " - Skipping", e);
}
return null;
}
}
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: Unknown SharePoint server error getting versions for site " + site + " docpath " + docPath + " - axis fault = " + e.getFaultCode().getLocalPart() + ", detail = " + e.getFaultString() + " - retrying", e);
throw new ServiceInterruption("Unknown SharePoint server error: " + e.getMessage() + " - retrying", e, currentTime + 300000L, currentTime + 3 * 60 * 60000L, -1, false);
}
if (e.getFaultCode().equals(new javax.xml.namespace.QName("http://schemas.xmlsoap.org/soap/envelope/", "Server.userException"))) {
String exceptionName = e.getFaultString();
if (exceptionName.equals("java.lang.InterruptedException"))
throw new ManifoldCFException("Interrupted", ManifoldCFException.INTERRUPTED);
}
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: Got an unknown remote exception getting versions for site " + site + " docpath " + docPath + " - axis fault = " + e.getFaultCode().getLocalPart() + ", detail = " + e.getFaultString() + " - retrying", e);
throw new ServiceInterruption("Remote procedure exception: " + e.getMessage(), e, currentTime + 300000L, currentTime + 3 * 60 * 60000L, -1, false);
} catch (java.rmi.RemoteException e) {
// So, fail hard if we see it.
if (Logging.connectors.isDebugEnabled())
Logging.connectors.debug("SharePoint: Got an unexpected remote exception getting versions for site " + site + " docpath " + docPath, e);
throw new ManifoldCFException("Unexpected remote procedure exception: " + e.getMessage(), e);
}
}
Aggregations