001/*
002 * (C) Copyright 2015 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 *      Nelson Silva
018 */
019
020package org.nuxeo.ecm.media.publishing.adapter;
021
022import org.nuxeo.ecm.core.api.Blob;
023import org.nuxeo.ecm.core.api.DocumentModel;
024import org.nuxeo.ecm.core.api.blobholder.BlobHolder;
025import org.nuxeo.ecm.media.publishing.MediaPublishingProvider;
026import org.nuxeo.ecm.media.publishing.MediaPublishingService;
027import org.nuxeo.runtime.api.Framework;
028
029import static org.nuxeo.ecm.media.publishing.MediaPublishingConstants.ACCOUNT_PROPERTY_NAME;
030import static org.nuxeo.ecm.media.publishing.MediaPublishingConstants.ID_PROPERTY_NAME;
031import static org.nuxeo.ecm.media.publishing.MediaPublishingConstants.PROVIDER_PROPERTY_NAME;
032import static org.nuxeo.ecm.media.publishing.MediaPublishingConstants.PROVIDERS_PROPERTY_NAME;
033
034import java.io.Serializable;
035import java.util.List;
036import java.util.Map;
037
038/**
039 * @since 7.3
040 */
041public class PublishableMediaAdapter implements PublishableMedia {
042    final DocumentModel doc;
043
044    public PublishableMediaAdapter(DocumentModel doc) {
045        this.doc = doc;
046    }
047
048    @Override
049    public Map<String, Object> getProvider(String provider) {
050        List<Map<String, Object>> providers = getProviders();
051        for (Map<String, Object> entry : providers) {
052            if (entry.get(PROVIDER_PROPERTY_NAME).equals(provider)) {
053                return entry;
054            }
055        }
056        return null;
057    }
058
059    @Override
060    public void putProvider(Map<String, Object> provider) {
061        // Check if provider already exists
062        // if so replace entry fields, otherwise add
063        List<Map<String, Object>> providers = getProviders();
064        boolean providerExists = false;
065        for (Map<String, Object> entry : providers) {
066            if (entry.get(PROVIDER_PROPERTY_NAME).equals(provider.get(PROVIDER_PROPERTY_NAME))) {
067                entry.put(ID_PROPERTY_NAME, provider.get(ID_PROPERTY_NAME));
068                entry.put(ACCOUNT_PROPERTY_NAME, provider.get(ACCOUNT_PROPERTY_NAME));
069                providerExists = true;
070                break;
071            }
072        }
073        if (!providerExists) {
074            providers.add(provider);
075        }
076        doc.setPropertyValue(PROVIDERS_PROPERTY_NAME, (Serializable) providers);
077    }
078
079    @Override
080    public void removeProvider(String provider) {
081        List<Map<String, Object>> providers = getProviders();
082        Map<String, Object> providerEntry = getProvider(provider);
083        providers.remove(providerEntry);
084        setProviders(providers);
085    }
086
087    @Override
088    public boolean isPublishedByProvider(String provider) {
089        List<Map<String, Object>> providers = getProviders();
090        for (Map<String, Object> entry : providers) {
091            if (entry.get(PROVIDER_PROPERTY_NAME).equals(provider)) {
092                String mediaId = (String) entry.get(ID_PROPERTY_NAME);
093                String account = (String) entry.get(ACCOUNT_PROPERTY_NAME);
094                if (getMediaPublishingProvider(provider).isMediaPublished(mediaId, account)) {
095                    return true;
096                }
097            }
098        }
099        return false;
100    }
101
102    @Override
103    public List<Map<String, Object>> getProviders() {
104        return (List<Map<String, Object>>) doc.getPropertyValue(PROVIDERS_PROPERTY_NAME);
105    }
106
107    @Override
108    public void setProviders(List<Map<String, Object>> providers) {
109        doc.setPropertyValue(PROVIDERS_PROPERTY_NAME, (Serializable) providers);
110    }
111
112    @Override
113    public String getId(String provider) {
114        Map<String, Object> entry = getProvider(provider);
115        if (entry == null) {
116            return null;
117        }
118        return (String) entry.get(ID_PROPERTY_NAME);
119    }
120
121    @Override
122    public String getAccount(String provider) {
123        Map<String, Object> entry = getProvider(provider);
124        if (entry == null) {
125            return null;
126        }
127        return (String) entry.get(ACCOUNT_PROPERTY_NAME);
128    }
129
130    @Override
131    public void setId(String id) {
132
133    }
134
135    @Override
136    public String getTitle() {
137        return doc.getTitle();
138    }
139
140    @Override
141    public String getDescription() {
142        return (String) doc.getPropertyValue("dc:description");
143    }
144
145    @Override
146    public Blob getBlob() {
147        return doc.getAdapter(BlobHolder.class).getBlob();
148    }
149
150    @Override
151    public String getUrl(String provider) {
152
153        return getMediaPublishingProvider(provider).getPublishedUrl(getId(provider), getAccount(provider));
154    }
155
156    @Override
157    public String getEmbedCode(String provider) {
158        return getMediaPublishingProvider(provider).getEmbedCode(getId(provider), getAccount(provider));
159    }
160
161    @Override
162    public Map<String, String> getStats(String provider) {
163        return getMediaPublishingProvider(provider).getStats(getId(provider), getAccount(provider));
164    }
165
166    private MediaPublishingProvider getMediaPublishingProvider(String provider) {
167        return getMediaPublishingService().getProvider(provider);
168    }
169
170    private MediaPublishingService getMediaPublishingService() {
171        return Framework.getService(MediaPublishingService.class);
172    }
173}