001/* 002 * (C) Copyright 2016 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 * Guillaume Renard <[email protected]> 018 */ 019 020package org.nuxeo.ecm.restapi.server.jaxrs.enrichers; 021 022import static org.nuxeo.ecm.core.io.registry.reflect.Instantiations.SINGLETON; 023import static org.nuxeo.ecm.core.io.registry.reflect.Priorities.REFERENCE; 024 025import java.io.IOException; 026 027import org.nuxeo.ecm.collections.api.CollectionManager; 028import org.nuxeo.ecm.core.api.DocumentModel; 029import org.nuxeo.ecm.core.io.marshallers.json.enrichers.AbstractJsonEnricher; 030import org.nuxeo.ecm.core.io.registry.context.RenderingContext.SessionWrapper; 031import org.nuxeo.ecm.core.io.registry.reflect.Setup; 032import org.nuxeo.ecm.core.query.sql.NXQL; 033import org.nuxeo.runtime.api.Framework; 034 035import com.fasterxml.jackson.core.JsonGenerator; 036 037/** 038 * Enricher that tells whether a "Folderish" or a "Collection" has children or members. 039 * 040 * @since 10.3 041 */ 042@Setup(mode = SINGLETON, priority = REFERENCE) 043public class HasContentJsonEnricher extends AbstractJsonEnricher<DocumentModel> { 044 045 public static final String NAME = "hasContent"; 046 047 public static final String FETCH_CHILD_QUERY = "SELECT * FROM Document WHERE ecm:mixinType != 'HiddenInNavigation' AND ecm:isTrashed = 0 AND ecm:parentId = %s"; 048 049 public static final String FETCH_MEMBERS_QUERY = "SELECT * FROM Document WHERE ecm:mixinType != 'HiddenInNavigation' AND ecm:isTrashed = 0 AND collectionMember:collectionIds/* = %s"; 050 051 public HasContentJsonEnricher() { 052 super(NAME); 053 } 054 055 @Override 056 public void write(JsonGenerator jg, DocumentModel document) throws IOException { 057 if (document.isFolder()) { 058 jg.writeBooleanField(NAME, hasContent(document, FETCH_CHILD_QUERY)); 059 } else if (Framework.getService(CollectionManager.class).isCollection(document)) { 060 jg.writeBooleanField(NAME, hasContent(document, FETCH_MEMBERS_QUERY)); 061 } else { 062 jg.writeBooleanField(NAME, false); 063 } 064 } 065 066 protected boolean hasContent(DocumentModel document, String query) throws IOException { 067 try (SessionWrapper wrapper = ctx.getSession(document)) { 068 // Limit result set to 1 as we just want to know if there's at least one child 069 return wrapper.getSession() 070 .queryProjection(String.format(query, NXQL.escapeString(document.getId())), 1, 0) 071 .size() > 0; 072 } 073 } 074 075}