001/*
002 * (C) Copyright 2006-2007 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 *
016 * Contributors:
017 *     Nuxeo - initial API and implementation
018 *
019 * $Id: JOOoConvertPluginImpl.java 18651 2007-05-13 20:28:53Z sfermigier $
020 */
021
022package org.nuxeo.ecm.platform.ui.web.restAPI;
023
024import java.io.Serializable;
025
026import org.dom4j.dom.DOMDocument;
027import org.dom4j.dom.DOMDocumentFactory;
028import org.nuxeo.ecm.core.api.DocumentModel;
029import org.nuxeo.ecm.core.api.DocumentModelList;
030import org.nuxeo.ecm.core.api.IdRef;
031import org.nuxeo.ecm.core.api.NuxeoException;
032import org.nuxeo.ecm.core.api.repository.RepositoryManager;
033import org.nuxeo.runtime.api.Framework;
034import org.restlet.data.CharacterSet;
035import org.restlet.data.MediaType;
036import org.restlet.data.Request;
037import org.restlet.data.Response;
038import org.w3c.dom.DOMException;
039import org.w3c.dom.Element;
040
041public class BrowseRestlet extends BaseStatelessNuxeoRestlet implements Serializable {
042
043    private static final long serialVersionUID = -4518256101431979971L;
044
045    @Override
046    protected void doHandleStatelessRequest(Request req, Response res) {
047        String repo = (String) req.getAttributes().get("repo");
048        String docid = (String) req.getAttributes().get("docid");
049
050        DOMDocumentFactory domFactory = new DOMDocumentFactory();
051
052        DOMDocument result = (DOMDocument) domFactory.createDocument();
053
054        if (repo == null || repo.equals("*")) {
055            try {
056                Element serversNode = result.createElement("avalaibleServers");
057                result.setRootElement((org.dom4j.Element) serversNode);
058
059                RepositoryManager repositoryManager = Framework.getService(RepositoryManager.class);
060                for (String repositoryName : repositoryManager.getRepositoryNames()) {
061                    Element server = result.createElement("server");
062                    server.setAttribute("title", repositoryName);
063                    server.setAttribute("url", getRelURL(repositoryName, "*"));
064                    serversNode.appendChild(server);
065                }
066                res.setEntity(result.asXML(), MediaType.TEXT_XML);
067                res.getEntity().setCharacterSet(CharacterSet.UTF_8);
068                return;
069            } catch (DOMException e) {
070                handleError(result, res, e);
071                return;
072            }
073        } else {
074            DocumentModel dm;
075
076            boolean init = initRepository(res, repo);
077            boolean isRoot = false;
078            try {
079                if (init) {
080                    if (docid == null || docid.equals("*")) {
081                        dm = session.getRootDocument();
082                        isRoot = true;
083                    } else {
084                        dm = session.getDocument(new IdRef(docid));
085                    }
086                } else {
087                    handleError(res, "Unable to init repository");
088                    return;
089                }
090            } catch (NuxeoException e) {
091                handleError(res, e);
092                return;
093            }
094
095            Element current = result.createElement("document");
096            try {
097                current.setAttribute("title", dm.getTitle());
098            } catch (DOMException | NuxeoException e) {
099                handleError(res, e);
100            }
101            current.setAttribute("type", dm.getType());
102            current.setAttribute("id", dm.getId());
103            current.setAttribute("name", dm.getName());
104            if (isRoot) {
105                current.setAttribute("url", getRelURL(repo, ""));
106            } else {
107                current.setAttribute("url", getRelURL(repo, dm.getRef().toString()));
108            }
109            result.setRootElement((org.dom4j.Element) current);
110
111            if (dm.isFolder()) {
112                // Element childrenElem = result.createElement("children");
113                // root.appendChild(childrenElem);
114
115                DocumentModelList children;
116                try {
117                    children = session.getChildren(dm.getRef());
118                } catch (NuxeoException e) {
119                    handleError(result, res, e);
120                    return;
121                }
122
123                for (DocumentModel child : children) {
124                    Element el = result.createElement("document");
125                    try {
126                        el.setAttribute("title", child.getTitle());
127                    } catch (DOMException e) {
128                        handleError(res, e);
129                    } catch (NuxeoException e) {
130                        handleError(res, e);
131                    }
132                    el.setAttribute("type", child.getType());
133                    el.setAttribute("id", child.getId());
134                    el.setAttribute("name", child.getName());
135                    el.setAttribute("url", getRelURL(repo, child.getRef().toString()));
136                    current.appendChild(el);
137                }
138            }
139
140            res.setEntity(result.asXML(), MediaType.TEXT_XML);
141            res.getEntity().setCharacterSet(CharacterSet.UTF_8);
142        }
143    }
144
145    private static String getRelURL(String repo, String uuid) {
146        return '/' + repo + '/' + uuid;
147    }
148
149}