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 *     Florent Guillaume
018 */
019package org.nuxeo.ecm.platform.ui.web.component.file;
020
021import java.util.ArrayList;
022import java.util.Collections;
023import java.util.List;
024
025import org.nuxeo.runtime.model.ComponentInstance;
026import org.nuxeo.runtime.model.DefaultComponent;
027import org.nuxeo.runtime.model.SimpleContributionRegistry;
028
029/**
030 * Service holding the registered JSF Blob Uploaders.
031 *
032 * @since 7.2
033 */
034public class JSFBlobUploaderService extends DefaultComponent {
035
036    public static final String XP_UPLOADER = "uploader";
037
038    protected JSFBlobUploaderDescriptorRegistry registry = new JSFBlobUploaderDescriptorRegistry();
039
040    protected static class JSFBlobUploaderDescriptorRegistry extends
041            SimpleContributionRegistry<JSFBlobUploaderDescriptor> {
042
043        @Override
044        public String getContributionId(JSFBlobUploaderDescriptor contrib) {
045            return contrib.id;
046        }
047
048        @Override
049        public JSFBlobUploaderDescriptor clone(JSFBlobUploaderDescriptor orig) {
050            return new JSFBlobUploaderDescriptor(orig);
051        }
052
053        @Override
054        public void merge(JSFBlobUploaderDescriptor src, JSFBlobUploaderDescriptor dst) {
055            dst.merge(src);
056        }
057
058        @Override
059        public boolean isSupportingMerge() {
060            return true;
061        }
062
063        public List<JSFBlobUploader> getJSFBlobUploaders() {
064            List<JSFBlobUploader> uploaders = new ArrayList<>(currentContribs.size());
065            List<JSFBlobUploaderDescriptor> descs = new ArrayList<>(currentContribs.values());
066            Collections.sort(descs); // sort according to order
067            for (JSFBlobUploaderDescriptor desc : descs) {
068                JSFBlobUploader uploader = desc.getJSFBlobUploader();
069                if (uploader != null && uploader.isEnabled()) {
070                    uploaders.add(uploader);
071                }
072            }
073            return uploaders;
074        }
075
076        public JSFBlobUploader getJSFBlobUploader(String choice) {
077            for (JSFBlobUploaderDescriptor desc : currentContribs.values()) {
078                JSFBlobUploader uploader = desc.getJSFBlobUploader();
079                if (uploader != null && uploader.getChoice().equals(choice) && uploader.isEnabled()) {
080                    return uploader;
081                }
082            }
083            return null;
084        }
085    }
086
087    @Override
088    public void registerContribution(Object contrib, String xpoint, ComponentInstance contributor) {
089        if (XP_UPLOADER.equals(xpoint)) {
090            registry.addContribution((JSFBlobUploaderDescriptor) contrib);
091        } else {
092            throw new RuntimeException("Unknown extension point: " + xpoint);
093        }
094    }
095
096    @Override
097    public void unregisterContribution(Object contrib, String xpoint, ComponentInstance contributor) {
098        if (XP_UPLOADER.equals(xpoint)) {
099            registry.removeContribution((JSFBlobUploaderDescriptor) contrib);
100        } else {
101            throw new RuntimeException("Unknown extension point: " + xpoint);
102        }
103    }
104
105    public List<JSFBlobUploader> getJSFBlobUploaders() {
106        return registry.getJSFBlobUploaders();
107    }
108
109    public JSFBlobUploader getJSFBlobUploader(String choice) {
110        return registry.getJSFBlobUploader(choice);
111    }
112
113}