001/*
002 * (C) Copyright 2006-2007 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 * $Id: JOOoConvertPluginImpl.java 18651 2007-05-13 20:28:53Z sfermigier $
020 */
021
022package org.nuxeo.ecm.directory;
023
024import java.util.List;
025
026/**
027 * Reference that uses the matching reference of the target directory to actually do the job.
028 *
029 * @author ogrisel
030 */
031public class InverseReference extends AbstractReference {
032
033    /**
034     * Indicates if the target directory can be updated from the current reference
035     *
036     * @since 5.7
037     */
038    protected boolean readOnly = false;
039
040    protected String dualReferenceName;
041
042    protected Reference dualReference;
043
044    public InverseReference(InverseReferenceDescriptor referenceDescriptor) {
045        super(referenceDescriptor.getFieldName(), referenceDescriptor.getDirectory());
046        dualReferenceName = referenceDescriptor.getDualReferenceName();
047        readOnly = referenceDescriptor.isReadOnly();
048    }
049
050    public void setReadOnly(boolean readOnly) {
051        this.readOnly = readOnly;
052    }
053
054    public boolean isReadOnly() {
055        return readOnly;
056    }
057
058    public void initialize() {
059        List<Reference> references = getTargetDirectory().getReferences(dualReferenceName);
060        if (references == null || references.isEmpty()) {
061            dualReference = null;
062        } else if (references.size() == 1) {
063            dualReference = references.get(0);
064        } else {
065            for (Reference ref : references) {
066                if (!(ref instanceof InverseReference) //
067                        && sourceDirectoryName.equals(ref.getTargetDirectory().getName())
068                        && targetDirectoryName.equals(ref.getSourceDirectory().getName())) {
069                    if (dualReference != null) {
070                        throw new DirectoryException(
071                                "More than one reference: could not find reference " + dualReferenceName);
072                    }
073                    dualReference = ref;
074                }
075            }
076        }
077        if (dualReference == null) {
078            throw new DirectoryException("could not find reference " + dualReferenceName);
079        }
080        if (dualReference instanceof InverseReference) {
081            throw new DirectoryException(String.format("InverseReference %s cannot refer to InverseReference %s",
082                    getFieldName(), dualReferenceName));
083        }
084    }
085
086    @Override
087    public void addLinks(String sourceId, List<String> targetIds) {
088        if (readOnly) {
089            return;
090        }
091        dualReference.addLinks(targetIds, sourceId);
092    }
093
094    @Override
095    public void addLinks(List<String> sourceIds, String targetId) {
096        if (readOnly) {
097            return;
098        }
099        dualReference.addLinks(targetId, sourceIds);
100    }
101
102    @Override
103    public void removeLinksForTarget(String targetId) {
104        if (readOnly) {
105            return;
106        }
107        dualReference.removeLinksForSource(targetId);
108    }
109
110    @Override
111    public void removeLinksForTarget(String targetId, Session session) {
112        if (readOnly) {
113            return;
114        }
115        dualReference.removeLinksForSource(targetId, session);
116    }
117
118    @Override
119    public void removeLinksForSource(String sourceId) {
120        if (readOnly) {
121            return;
122        }
123        dualReference.removeLinksForTarget(sourceId);
124    }
125
126    @Override
127    public void removeLinksForSource(String sourceId, Session session) {
128        if (readOnly) {
129            return;
130        }
131        dualReference.removeLinksForTarget(sourceId, session);
132    }
133
134    @Override
135    public List<String> getSourceIdsForTarget(String targetId) {
136        return dualReference.getTargetIdsForSource(targetId);
137    }
138
139    @Override
140    public List<String> getTargetIdsForSource(String sourceId) {
141        return dualReference.getSourceIdsForTarget(sourceId);
142    }
143
144    @Override
145    public void setTargetIdsForSource(String sourceId, List<String> targetIds) {
146        if (readOnly) {
147            return;
148        }
149        dualReference.setSourceIdsForTarget(sourceId, targetIds);
150    }
151
152    @Override
153    public void setTargetIdsForSource(String sourceId, List<String> targetIds, Session session) {
154        if (readOnly) {
155            return;
156        }
157        dualReference.setSourceIdsForTarget(sourceId, targetIds, session);
158    }
159
160    @Override
161    public void setSourceIdsForTarget(String targetId, List<String> sourceIds) {
162        if (readOnly) {
163            return;
164        }
165        dualReference.setTargetIdsForSource(targetId, sourceIds);
166    }
167
168    @Override
169    public void setSourceIdsForTarget(String targetId, List<String> sourceIds, Session session) {
170        if (readOnly) {
171            return;
172        }
173        dualReference.setTargetIdsForSource(targetId, sourceIds, session);
174    }
175
176    @Override
177    public void addLinks(String sourceId, List<String> targetIds, Session session) {
178        if (readOnly) {
179            return;
180        }
181        dualReference.addLinks(targetIds, sourceId, session);
182    }
183
184    @Override
185    public void addLinks(List<String> sourceIds, String targetId, Session session) {
186        if (readOnly) {
187            return;
188        }
189        dualReference.addLinks(targetId, sourceIds, session);
190    }
191}