001/*
002 * (C) Copyright 2006 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 *     Nuxeo - initial API and implementation
018 *
019 *
020 * $Id: PluginExtension.java 3036 2006-09-18 17:32:20Z janguenot $
021 */
022
023package org.nuxeo.ecm.platform.filemanager.service.extension;
024
025import java.util.ArrayList;
026import java.util.List;
027
028import org.nuxeo.common.xmap.annotation.XNode;
029import org.nuxeo.common.xmap.annotation.XNodeList;
030import org.nuxeo.common.xmap.annotation.XObject;
031import org.nuxeo.ecm.core.api.NuxeoException;
032import org.nuxeo.ecm.platform.filemanager.service.FileManagerService;
033import org.nuxeo.runtime.model.Descriptor;
034
035/**
036 * @author akalogeropoulos
037 */
038@XObject("plugin")
039public class FileImporterDescriptor implements Descriptor {
040
041    public static final List<String> DEFAULT_FILTER = new ArrayList<>();
042
043    @XNode("@enabled")
044    boolean enabled = true;
045
046    @XNode("@name")
047    protected String name;
048
049    /**
050     * @deprecated since 11.1.
051     */
052    @Deprecated(since = "11.1")
053    @XNode("@class")
054    protected String className;
055
056    /**
057     * @since 11.1
058     */
059    @XNode("@class")
060    protected Class<? extends FileImporter> klass;
061
062    @XNode("@docType")
063    protected String docType;
064
065    @XNodeList(value = "filter", type = ArrayList.class, componentType = String.class)
066    protected List<String> filters = DEFAULT_FILTER;
067
068    @XNode("@filter")
069    protected String filter;
070
071    @XNode("@order")
072    private Integer order;
073
074    @XNode("@merge")
075    private boolean merge = false;
076
077    public String getName() {
078        return name;
079    }
080
081    public void setName(String name) {
082        this.name = name;
083    }
084
085    /**
086     * @deprecated since 11.1. Use {@link #klass}.
087     */
088    @Deprecated(since = "11.1")
089    public String getClassName() {
090        return className;
091    }
092
093    /**
094     * @deprecated since 11.1. Use {@link #klass}.
095     */
096    @Deprecated(since = "11.1")
097    public void setClassName(String className) {
098        this.className = className;
099    }
100
101    /**
102     * Returns the configured document type to be created when using the importer
103     *
104     * @since 5.5
105     */
106    public String getDocType() {
107        return docType;
108    }
109
110    public String getFilter() {
111        return filter;
112    }
113
114    public void setFilter(String filter) {
115        this.filter = filter;
116    }
117
118    public List<String> getFilters() {
119        return filters;
120    }
121
122    public void setFilters(List<String> filters) {
123        this.filters = filters;
124    }
125
126    public boolean isEnabled() {
127        return enabled;
128    }
129
130    public Integer getOrder() {
131        return order;
132    }
133
134    /**
135     * Returns {@code true} if this {@code FileImporterDescriptor} should be merged with an existing one, {@code false}
136     * otherwise.
137     *
138     * @since 5.5
139     */
140    public boolean isMerge() {
141        return merge;
142    }
143
144    /**
145     * @since 11.1
146     */
147    public FileImporter newInstance() {
148        try {
149            FileImporter fileImporter = klass.getDeclaredConstructor().newInstance();
150            fileImporter.setName(name);
151            fileImporter.setEnabled(enabled);
152            fileImporter.setDocType(docType);
153            fileImporter.setFilters(filters);
154            fileImporter.setOrder(order);
155            return fileImporter;
156        } catch (ReflectiveOperationException e) {
157            throw new NuxeoException(e);
158        }
159    }
160
161    @Override
162    public String getId() {
163        return name;
164    }
165
166    @Override
167    public Descriptor merge(Descriptor o) {
168        FileImporterDescriptor other = (FileImporterDescriptor) o;
169        if (!other.merge) {
170            return other;
171        }
172
173        FileImporterDescriptor merged = new FileImporterDescriptor();
174        merged.name = other.name;
175        merged.enabled = other.enabled;
176        merged.klass = defaultValue(other.klass, klass);
177        merged.className = defaultValue(other.className, className);
178        merged.docType = defaultValue(other.docType, docType);
179        merged.filters = new ArrayList<>();
180        merged.filters.addAll(filters);
181        merged.filters.addAll(other.filters);
182        merged.order = defaultValue(other.order, order);
183        return merged;
184    }
185
186    protected <T> T defaultValue(T value, T defaultValue) {
187        return value == null ? defaultValue : value;
188    }
189
190    @Override
191    public boolean doesRemove() {
192        return !enabled;
193    }
194}