001/*
002 * (C) Copyright 2006-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 *     Tiago Cardoso <tcardoso@nuxeo.com>
018 */
019package org.nuxeo.ecm.platform.threed.rendition;
020
021import org.nuxeo.ecm.core.api.Blob;
022import org.nuxeo.ecm.core.api.DocumentModel;
023import org.nuxeo.ecm.platform.mimetype.interfaces.MimetypeEntry;
024import org.nuxeo.ecm.platform.mimetype.interfaces.MimetypeRegistry;
025import org.nuxeo.ecm.platform.rendition.extension.RenditionProvider;
026import org.nuxeo.ecm.platform.rendition.service.RenditionDefinition;
027import org.nuxeo.ecm.platform.rendition.service.RenditionDefinitionProvider;
028import org.nuxeo.ecm.platform.threed.ThreeDDocument;
029import org.nuxeo.ecm.platform.threed.service.AutomaticLOD;
030import org.nuxeo.ecm.platform.threed.service.RenderView;
031import org.nuxeo.ecm.platform.threed.service.ThreeDService;
032import org.nuxeo.runtime.api.Framework;
033
034import java.util.ArrayList;
035import java.util.Collections;
036import java.util.List;
037import java.util.stream.Collectors;
038
039/**
040 * Provides rendition definitions based on the existing render views and transmission formats.
041 *
042 * @since 8.4
043 */
044public class ThreeDRenditionDefinitionProvider implements RenditionDefinitionProvider {
045
046    public static final String THREED_RENDER_VIEW_RENDITION_KIND = "nuxeo:threedRenderView:conversion";
047
048    public static final String THREED_TRANSMISSION_RENDITION_KIND = "nuxeo:threedTransmission:conversion";
049
050    public static final String THREED_RENDER_VIEW_RENDITION_TYPE = "Render";
051
052    public static final String THREED_TRANSMISSION_RENDITION_TYPE = "LoD";
053
054    protected RenditionDefinition buildRenditionDefinition(String title, String name, Blob blob, String kind,
055            RenditionProvider provider, boolean visible, String iconPath) {
056        RenditionDefinition renditionDefinition = new RenditionDefinition();
057        renditionDefinition.setEnabled(true);
058        renditionDefinition.setName(name);
059        renditionDefinition.setKind(kind);
060        renditionDefinition.setProvider(provider);
061        renditionDefinition.setVisible(visible);
062        renditionDefinition.setLabel(title);
063        renditionDefinition.setIcon("/icons/" + iconPath);
064        return renditionDefinition;
065    }
066
067    @Override
068    public List<RenditionDefinition> getRenditionDefinitions(DocumentModel doc) {
069        ThreeDDocument threeD = doc.getAdapter(ThreeDDocument.class);
070        if (threeD == null) {
071            return Collections.emptyList();
072        }
073
074        ThreeDService threeDService = Framework.getService(ThreeDService.class);
075        MimetypeRegistry mimetypeRegistry = Framework.getService(MimetypeRegistry.class);
076        List<RenditionDefinition> renditionDefinitions = new ArrayList<>();
077
078        // Render View Renditions
079        renditionDefinitions.addAll(threeD.getRenderViews().stream().filter(threeDRenderView -> {
080
081            RenderView renderView = threeDService.getRenderView(threeDRenderView.getAzimuth(),
082                    threeDRenderView.getZenith());
083            return renderView != null && renderView.isEnabled() && renderView.isRendition()
084                    && threeDRenderView.getContent() != null;
085
086        }).map(threeDRenderView -> {
087
088            RenderView renderView = threeDService.getRenderView(threeDRenderView.getAzimuth(),
089                    threeDRenderView.getZenith());
090            MimetypeEntry mimeType = mimetypeRegistry.getMimetypeEntryByMimeType(
091                    threeDRenderView.getContent().getMimeType());
092            return buildRenditionDefinition(THREED_RENDER_VIEW_RENDITION_TYPE + threeDRenderView.getTitle(),
093                    threeDRenderView.getTitle(), threeDRenderView.getContent(), THREED_RENDER_VIEW_RENDITION_KIND,
094                    new RenderViewRenditionProvider(), renderView.isRenditionVisible(), mimeType.getIconPath());
095        }).collect(Collectors.toList()));
096
097        // Transmission Renditions
098        renditionDefinitions.addAll(threeD.getTransmissionThreeDs().stream().filter(transmissionThreeD -> {
099
100            AutomaticLOD automaticLOD = threeDService.getAutomaticLOD(transmissionThreeD.getId());
101            return automaticLOD != null && automaticLOD.isEnabled() && automaticLOD.isRendition()
102                    && transmissionThreeD.getBlob() != null;
103
104        }).map(transmissionThreeD -> {
105
106            AutomaticLOD automaticLOD = threeDService.getAutomaticLOD(transmissionThreeD.getId());
107            MimetypeEntry mimeType = mimetypeRegistry.getMimetypeEntryByMimeType(
108                    transmissionThreeD.getBlob().getMimeType());
109            return buildRenditionDefinition(THREED_TRANSMISSION_RENDITION_TYPE + transmissionThreeD.getTitle(),
110                    transmissionThreeD.getTitle(), transmissionThreeD.getBlob(), THREED_TRANSMISSION_RENDITION_KIND,
111                    new TransmissionThreeDRenditionProvider(), automaticLOD.isRenditionVisible(),
112                    mimeType.getIconPath());
113
114        }).collect(Collectors.toList()));
115        return renditionDefinitions;
116    }
117
118}