View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   * http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.chemistry.opencmis.client.bindings.spi.webservices;
20  
21  import static org.apache.chemistry.opencmis.commons.impl.WSConverter.convert;
22  import static org.apache.chemistry.opencmis.commons.impl.WSConverter.convertExtensionHolder;
23  import static org.apache.chemistry.opencmis.commons.impl.WSConverter.convertTypeContainerList;
24  import static org.apache.chemistry.opencmis.commons.impl.WSConverter.setExtensionValues;
25  
26  import java.math.BigInteger;
27  import java.util.ArrayList;
28  import java.util.List;
29  
30  import org.apache.chemistry.opencmis.client.bindings.impl.CmisBindingsHelper;
31  import org.apache.chemistry.opencmis.client.bindings.spi.BindingSession;
32  import org.apache.chemistry.opencmis.commons.data.ExtensionsData;
33  import org.apache.chemistry.opencmis.commons.data.RepositoryInfo;
34  import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
35  import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionContainer;
36  import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionList;
37  import org.apache.chemistry.opencmis.commons.enums.CmisVersion;
38  import org.apache.chemistry.opencmis.commons.exceptions.CmisBaseException;
39  import org.apache.chemistry.opencmis.commons.exceptions.CmisNotSupportedException;
40  import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
41  import org.apache.chemistry.opencmis.commons.impl.dataobjects.RepositoryInfoImpl;
42  import org.apache.chemistry.opencmis.commons.impl.jaxb.CmisException;
43  import org.apache.chemistry.opencmis.commons.impl.jaxb.CmisExtensionType;
44  import org.apache.chemistry.opencmis.commons.impl.jaxb.CmisRepositoryEntryType;
45  import org.apache.chemistry.opencmis.commons.impl.jaxb.CmisRepositoryInfoType;
46  import org.apache.chemistry.opencmis.commons.impl.jaxb.CmisTypeDefinitionType;
47  import org.apache.chemistry.opencmis.commons.impl.jaxb.RepositoryServicePort;
48  import org.apache.chemistry.opencmis.commons.spi.RepositoryService;
49  
50  /**
51   * Repository Service Web Services client.
52   */
53  public class RepositoryServiceImpl extends AbstractWebServicesService implements RepositoryService {
54  
55      private final AbstractPortProvider portProvider;
56  
57      /**
58       * Constructor.
59       */
60      public RepositoryServiceImpl(BindingSession session, AbstractPortProvider portProvider) {
61          setSession(session);
62          this.portProvider = portProvider;
63      }
64  
65      @Override
66      public List<RepositoryInfo> getRepositoryInfos(ExtensionsData extension) {
67          CmisVersion cmisVersion = CmisBindingsHelper.getForcedCmisVersion(getSession());
68          if (cmisVersion == null) {
69              cmisVersion = CmisVersion.CMIS_1_1;
70          }
71  
72          RepositoryServicePort port = portProvider.getRepositoryServicePort(cmisVersion, "getRepositories");
73  
74          List<CmisRepositoryEntryType> entries = null;
75          try {
76              // get the list of repositories
77              entries = port.getRepositories(convert(extension));
78          } catch (CmisException e) {
79              throw convertException(e);
80          } catch (Exception e) {
81              throw new CmisRuntimeException("Error: " + e.getMessage(), e);
82          } finally {
83              portProvider.endCall(port);
84          }
85  
86          List<RepositoryInfo> infos = null;
87          if (entries != null) {
88              port = portProvider.getRepositoryServicePort(cmisVersion, "getRepositoryInfo");
89  
90              try {
91                  infos = new ArrayList<RepositoryInfo>();
92  
93                  // iterate through the list and fetch repository infos
94                  for (CmisRepositoryEntryType entry : entries) {
95                      try {
96                          CmisRepositoryInfoType info = port.getRepositoryInfo(entry.getRepositoryId(), null);
97                          infos.add(convert(info));
98                      } catch (CmisBaseException e) {
99                          // getRepositoryInfo() failed for whatever reason
100                         // -> provide at least a repository info stub
101                         RepositoryInfoImpl info = new RepositoryInfoImpl();
102                         info.setId(entry.getRepositoryId());
103                         info.setName(entry.getRepositoryName());
104                         infos.add(info);
105                     }
106                 }
107             } catch (CmisException e) {
108                 throw convertException(e);
109             } catch (Exception e) {
110                 throw new CmisRuntimeException("Error: " + e.getMessage(), e);
111             } finally {
112                 portProvider.endCall(port);
113             }
114         }
115 
116         return infos;
117     }
118 
119     @Override
120     public RepositoryInfo getRepositoryInfo(String repositoryId, ExtensionsData extension) {
121         CmisVersion cmisVersion = CmisBindingsHelper.getForcedCmisVersion(getSession());
122         if (cmisVersion == null) {
123             cmisVersion = CmisVersion.CMIS_1_1;
124         }
125 
126         RepositoryServicePort port = portProvider.getRepositoryServicePort(cmisVersion, "getRepositoryInfo");
127 
128         try {
129             return convert(port.getRepositoryInfo(repositoryId, convert(extension)));
130         } catch (CmisException e) {
131             throw convertException(e);
132         } catch (Exception e) {
133             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
134         } finally {
135             portProvider.endCall(port);
136         }
137     }
138 
139     @Override
140     public TypeDefinition getTypeDefinition(String repositoryId, String typeId, ExtensionsData extension) {
141         RepositoryServicePort port = portProvider.getRepositoryServicePort(getCmisVersion(repositoryId),
142                 "getTypeDefinition");
143 
144         try {
145             return convert(port.getTypeDefinition(repositoryId, typeId, convert(extension)));
146         } catch (CmisException e) {
147             throw convertException(e);
148         } catch (Exception e) {
149             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
150         } finally {
151             portProvider.endCall(port);
152         }
153     }
154 
155     @Override
156     public TypeDefinitionList getTypeChildren(String repositoryId, String typeId, Boolean includePropertyDefinitions,
157             BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
158         RepositoryServicePort port = portProvider.getRepositoryServicePort(getCmisVersion(repositoryId),
159                 "getTypeChildren");
160 
161         try {
162             return convert(port.getTypeChildren(repositoryId, typeId, includePropertyDefinitions, maxItems, skipCount,
163                     convert(extension)));
164         } catch (CmisException e) {
165             throw convertException(e);
166         } catch (Exception e) {
167             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
168         } finally {
169             portProvider.endCall(port);
170         }
171     }
172 
173     @Override
174     public List<TypeDefinitionContainer> getTypeDescendants(String repositoryId, String typeId, BigInteger depth,
175             Boolean includePropertyDefinitions, ExtensionsData extension) {
176         RepositoryServicePort port = portProvider.getRepositoryServicePort(getCmisVersion(repositoryId),
177                 "getTypeDescendants");
178 
179         try {
180             return convertTypeContainerList(port.getTypeDescendants(repositoryId, typeId, depth,
181                     includePropertyDefinitions, convert(extension)));
182         } catch (CmisException e) {
183             throw convertException(e);
184         } catch (Exception e) {
185             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
186         } finally {
187             portProvider.endCall(port);
188         }
189     }
190 
191     @Override
192     public TypeDefinition createType(String repositoryId, TypeDefinition type, ExtensionsData extension) {
193         if (getCmisVersion(repositoryId) == CmisVersion.CMIS_1_0) {
194             throw new CmisNotSupportedException("Repository is a CMIS 1.0 repository!");
195         }
196 
197         RepositoryServicePort port = portProvider.getRepositoryServicePort(CmisVersion.CMIS_1_1, "createType");
198 
199         try {
200             javax.xml.ws.Holder<CmisTypeDefinitionType> typeDef = new javax.xml.ws.Holder<CmisTypeDefinitionType>(
201                     convert(type));
202 
203             port.createType(repositoryId, typeDef, convert(extension));
204 
205             return convert(typeDef.value);
206         } catch (CmisException e) {
207             throw convertException(e);
208         } catch (Exception e) {
209             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
210         } finally {
211             portProvider.endCall(port);
212         }
213     }
214 
215     @Override
216     public TypeDefinition updateType(String repositoryId, TypeDefinition type, ExtensionsData extension) {
217         if (getCmisVersion(repositoryId) == CmisVersion.CMIS_1_0) {
218             throw new CmisNotSupportedException("Repository is a CMIS 1.0 repository!");
219         }
220 
221         RepositoryServicePort port = portProvider.getRepositoryServicePort(CmisVersion.CMIS_1_1, "updateType");
222 
223         try {
224             javax.xml.ws.Holder<CmisTypeDefinitionType> typeDef = new javax.xml.ws.Holder<CmisTypeDefinitionType>(
225                     convert(type));
226 
227             port.updateType(repositoryId, typeDef, convert(extension));
228 
229             return convert(typeDef.value);
230         } catch (CmisException e) {
231             throw convertException(e);
232         } catch (Exception e) {
233             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
234         } finally {
235             portProvider.endCall(port);
236         }
237     }
238 
239     @Override
240     public void deleteType(String repositoryId, String typeId, ExtensionsData extension) {
241         if (getCmisVersion(repositoryId) == CmisVersion.CMIS_1_0) {
242             throw new CmisNotSupportedException("Repository is a CMIS 1.0 repository!");
243         }
244 
245         RepositoryServicePort port = portProvider.getRepositoryServicePort(CmisVersion.CMIS_1_1, "deleteType");
246 
247         try {
248             javax.xml.ws.Holder<CmisExtensionType> portExtension = convertExtensionHolder(extension);
249 
250             port.deleteType(repositoryId, typeId, portExtension);
251 
252             setExtensionValues(portExtension, extension);
253         } catch (CmisException e) {
254             throw convertException(e);
255         } catch (Exception e) {
256             throw new CmisRuntimeException("Error: " + e.getMessage(), e);
257         } finally {
258             portProvider.endCall(port);
259         }
260     }
261 }