Search in sources :

Example 1 with XMLDoc

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);
    }
}
Also used : HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) MessageElement(org.apache.axis.message.MessageElement) MessageElement(org.apache.axis.message.MessageElement) javax.xml.soap(javax.xml.soap) com.microsoft.schemas.sharepoint.soap(com.microsoft.schemas.sharepoint.soap) MessageElement(org.apache.axis.message.MessageElement) XMLDoc(org.apache.manifoldcf.core.common.XMLDoc) ServiceInterruption(org.apache.manifoldcf.agents.interfaces.ServiceInterruption) QName(javax.xml.namespace.QName) ManifoldCFException(org.apache.manifoldcf.core.interfaces.ManifoldCFException)

Example 2 with XMLDoc

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);
    }
}
Also used : MessageElement(org.apache.axis.message.MessageElement) ArrayList(java.util.ArrayList) XMLDoc(org.apache.manifoldcf.core.common.XMLDoc) ServiceInterruption(org.apache.manifoldcf.agents.interfaces.ServiceInterruption) QName(javax.xml.namespace.QName) MessageElement(org.apache.axis.message.MessageElement) ManifoldCFException(org.apache.manifoldcf.core.interfaces.ManifoldCFException)

Example 3 with XMLDoc

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);
    }
}
Also used : MessageElement(org.apache.axis.message.MessageElement) ArrayList(java.util.ArrayList) XMLDoc(org.apache.manifoldcf.core.common.XMLDoc) ServiceInterruption(org.apache.manifoldcf.agents.interfaces.ServiceInterruption) QName(javax.xml.namespace.QName) MessageElement(org.apache.axis.message.MessageElement) ManifoldCFException(org.apache.manifoldcf.core.interfaces.ManifoldCFException)

Example 4 with XMLDoc

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);
    }
}
Also used : MessageElement(org.apache.axis.message.MessageElement) ArrayList(java.util.ArrayList) XMLDoc(org.apache.manifoldcf.core.common.XMLDoc) ServiceInterruption(org.apache.manifoldcf.agents.interfaces.ServiceInterruption) HashSet(java.util.HashSet) QName(javax.xml.namespace.QName) MessageElement(org.apache.axis.message.MessageElement) ManifoldCFException(org.apache.manifoldcf.core.interfaces.ManifoldCFException) QName(javax.xml.namespace.QName)

Example 5 with XMLDoc

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);
    }
}
Also used : MessageElement(org.apache.axis.message.MessageElement) ArrayList(java.util.ArrayList) XMLDoc(org.apache.manifoldcf.core.common.XMLDoc) ServiceInterruption(org.apache.manifoldcf.agents.interfaces.ServiceInterruption) QName(javax.xml.namespace.QName) MessageElement(org.apache.axis.message.MessageElement) ManifoldCFException(org.apache.manifoldcf.core.interfaces.ManifoldCFException) QName(javax.xml.namespace.QName)

Aggregations

XMLDoc (org.apache.manifoldcf.core.common.XMLDoc)15 ArrayList (java.util.ArrayList)12 QName (javax.xml.namespace.QName)12 MessageElement (org.apache.axis.message.MessageElement)12 ServiceInterruption (org.apache.manifoldcf.agents.interfaces.ServiceInterruption)12 ManifoldCFException (org.apache.manifoldcf.core.interfaces.ManifoldCFException)12 HashMap (java.util.HashMap)2 HashSet (java.util.HashSet)2 com.microsoft.schemas.sharepoint.soap (com.microsoft.schemas.sharepoint.soap)1 Iterator (java.util.Iterator)1 javax.xml.soap (javax.xml.soap)1 JSONObject (org.json.simple.JSONObject)1