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}