001/*
002 * (C) Copyright 2015 Nuxeo SA (http://nuxeo.com/) and contributors.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the GNU Lesser General Public License
006 * (LGPL) version 2.1 which accompanies this distribution, and is available at
007 * http://www.gnu.org/licenses/lgpl-2.1.html
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * Contributors:
015 *      Nelson Silva
016 */
017
018package org.nuxeo.ecm.media.publishing.adapter;
019
020import org.nuxeo.ecm.core.api.Blob;
021import org.nuxeo.ecm.core.api.DocumentModel;
022import org.nuxeo.ecm.core.api.blobholder.BlobHolder;
023import org.nuxeo.ecm.media.publishing.MediaPublishingProvider;
024import org.nuxeo.ecm.media.publishing.MediaPublishingService;
025import org.nuxeo.runtime.api.Framework;
026
027import static org.nuxeo.ecm.media.publishing.MediaPublishingConstants.ACCOUNT_PROPERTY_NAME;
028import static org.nuxeo.ecm.media.publishing.MediaPublishingConstants.ID_PROPERTY_NAME;
029import static org.nuxeo.ecm.media.publishing.MediaPublishingConstants.PROVIDER_PROPERTY_NAME;
030import static org.nuxeo.ecm.media.publishing.MediaPublishingConstants.PROVIDERS_PROPERTY_NAME;
031
032import java.io.Serializable;
033import java.util.List;
034import java.util.Map;
035
036/**
037 * @since 7.3
038 */
039public class PublishableMediaAdapter implements PublishableMedia {
040    final DocumentModel doc;
041
042    public PublishableMediaAdapter(DocumentModel doc) {
043        this.doc = doc;
044    }
045
046    @Override
047    public Map<String, Object> getProvider(String provider) {
048        List<Map<String, Object>> providers = getProviders();
049        for (Map<String, Object> entry : providers) {
050            if (entry.get(PROVIDER_PROPERTY_NAME).equals(provider)) {
051                return entry;
052            }
053        }
054        return null;
055    }
056
057    @Override
058    public void putProvider(Map<String, Object> provider) {
059        // Check if provider already exists
060        // if so replace entry fields, otherwise add
061        List<Map<String, Object>> providers = getProviders();
062        boolean providerExists = false;
063        for (Map<String, Object> entry : providers) {
064            if (entry.get(PROVIDER_PROPERTY_NAME).equals(provider.get(PROVIDER_PROPERTY_NAME))) {
065                entry.put(ID_PROPERTY_NAME, provider.get(ID_PROPERTY_NAME));
066                entry.put(ACCOUNT_PROPERTY_NAME, provider.get(ACCOUNT_PROPERTY_NAME));
067                providerExists = true;
068                break;
069            }
070        }
071        if (!providerExists) {
072            providers.add(provider);
073        }
074        doc.setPropertyValue(PROVIDERS_PROPERTY_NAME, (Serializable) providers);
075    }
076
077    @Override
078    public void removeProvider(String provider) {
079        List<Map<String, Object>> providers = getProviders();
080        Map<String, Object> providerEntry = getProvider(provider);
081        providers.remove(providerEntry);
082        setProviders(providers);
083    }
084
085    @Override
086    public boolean isPublishedByProvider(String provider) {
087        List<Map<String, Object>> providers = getProviders();
088        for (Map<String, Object> entry : providers) {
089            if (entry.get(PROVIDER_PROPERTY_NAME).equals(provider)) {
090                String mediaId = (String) entry.get(ID_PROPERTY_NAME);
091                String account = (String) entry.get(ACCOUNT_PROPERTY_NAME);
092                if (getMediaPublishingProvider(provider).isMediaPublished(mediaId, account)) {
093                    return true;
094                }
095            }
096        }
097        return false;
098    }
099
100    @Override
101    public List<Map<String, Object>> getProviders() {
102        return (List<Map<String, Object>>) doc.getPropertyValue(PROVIDERS_PROPERTY_NAME);
103    }
104
105    @Override
106    public void setProviders(List<Map<String, Object>> providers) {
107        doc.setPropertyValue(PROVIDERS_PROPERTY_NAME, (Serializable) providers);
108    }
109
110    @Override
111    public String getId(String provider) {
112        Map<String, Object> entry = getProvider(provider);
113        if (entry == null) {
114            return null;
115        }
116        return (String) entry.get(ID_PROPERTY_NAME);
117    }
118
119    @Override
120    public String getAccount(String provider) {
121        Map<String, Object> entry = getProvider(provider);
122        if (entry == null) {
123            return null;
124        }
125        return (String) entry.get(ACCOUNT_PROPERTY_NAME);
126    }
127
128    @Override
129    public void setId(String id) {
130
131    }
132
133    @Override
134    public String getTitle() {
135        return doc.getTitle();
136    }
137
138    @Override
139    public String getDescription() {
140        return (String) doc.getPropertyValue("dc:description");
141    }
142
143    @Override
144    public Blob getBlob() {
145        return doc.getAdapter(BlobHolder.class).getBlob();
146    }
147
148    @Override
149    public String getUrl(String provider) {
150
151        return getMediaPublishingProvider(provider).getPublishedUrl(getId(provider), getAccount(provider));
152    }
153
154    @Override
155    public String getEmbedCode(String provider) {
156        return getMediaPublishingProvider(provider).getEmbedCode(getId(provider), getAccount(provider));
157    }
158
159    @Override
160    public Map<String, String> getStats(String provider) {
161        return getMediaPublishingProvider(provider).getStats(getId(provider), getAccount(provider));
162    }
163
164    private MediaPublishingProvider getMediaPublishingProvider(String provider) {
165        return getMediaPublishingService().getProvider(provider);
166    }
167
168    private MediaPublishingService getMediaPublishingService() {
169        return Framework.getService(MediaPublishingService.class);
170    }
171}