This project has retired. For details please refer to its Attic page.
VersioningService xref

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.server.impl.atompub;
20  
21  import static org.apache.chemistry.opencmis.server.impl.atompub.AtomPubUtils.RESOURCE_ENTRY;
22  import static org.apache.chemistry.opencmis.server.impl.atompub.AtomPubUtils.compileBaseUrl;
23  import static org.apache.chemistry.opencmis.server.impl.atompub.AtomPubUtils.compileUrl;
24  import static org.apache.chemistry.opencmis.server.impl.atompub.AtomPubUtils.writeObjectEntry;
25  import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getBooleanParameter;
26  import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getStringParameter;
27  
28  import java.util.List;
29  
30  import javax.servlet.http.HttpServletRequest;
31  import javax.servlet.http.HttpServletResponse;
32  
33  import org.apache.chemistry.opencmis.commons.data.ObjectData;
34  import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
35  import org.apache.chemistry.opencmis.commons.impl.Constants;
36  import org.apache.chemistry.opencmis.commons.impl.UrlBuilder;
37  import org.apache.chemistry.opencmis.commons.server.CallContext;
38  import org.apache.chemistry.opencmis.commons.server.CmisService;
39  import org.apache.chemistry.opencmis.commons.server.ObjectInfo;
40  import org.apache.chemistry.opencmis.commons.spi.Holder;
41  
42  /**
43   * Versioning Service operations.
44   */
45  public class VersioningService {
46  
47      private VersioningService() {
48      }
49  
50      /**
51       * Check Out.
52       */
53      public static void checkOut(CallContext context, CmisService service, String repositoryId,
54              HttpServletRequest request, HttpServletResponse response) throws Exception {
55          // get parameters
56          AtomEntryParser parser = new AtomEntryParser(context.getTempDirectory(), context.getMemoryThreshold());
57          parser.setIgnoreAtomContentSrc(true); // needed for some clients
58          parser.parse(request.getInputStream());
59  
60          // execute
61          Holder<String> checkOutId = new Holder<String>(parser.getId());
62          service.checkOut(repositoryId, checkOutId, null, null);
63  
64          ObjectInfo objectInfo = service.getObjectInfo(repositoryId, checkOutId.getValue());
65          if (objectInfo == null) {
66              throw new CmisRuntimeException("Object Info is missing!");
67          }
68  
69          ObjectData object = objectInfo.getObject();
70          if (object == null) {
71              throw new CmisRuntimeException("Object is null!");
72          }
73  
74          if (object.getId() == null) {
75              throw new CmisRuntimeException("Object Id is null!");
76          }
77  
78          // set headers
79          UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
80          String location = compileUrl(baseUrl, RESOURCE_ENTRY, object.getId());
81  
82          response.setStatus(HttpServletResponse.SC_CREATED);
83          response.setContentType(Constants.MEDIATYPE_ENTRY);
84          response.setHeader("Content-Location", location);
85          response.setHeader("Location", location);
86  
87          // write XML
88          AtomEntry entry = new AtomEntry();
89          entry.startDocument(response.getOutputStream());
90          writeObjectEntry(service, entry, object, null, repositoryId, null, null, baseUrl, true);
91          entry.endDocument();
92      }
93  
94      /**
95       * Get all versions.
96       */
97      public static void getAllVersions(CallContext context, CmisService service, String repositoryId,
98              HttpServletRequest request, HttpServletResponse response) throws Exception {
99          // get parameters
100         String objectId = getStringParameter(request, Constants.PARAM_ID);
101         String versionSeriesId = getStringParameter(request, Constants.PARAM_VERSION_SERIES_ID);
102         String filter = getStringParameter(request, Constants.PARAM_FILTER);
103         Boolean includeAllowableActions = getBooleanParameter(request, Constants.PARAM_ALLOWABLE_ACTIONS);
104 
105         // execute
106         List<ObjectData> versions = service.getAllVersions(repositoryId, objectId, versionSeriesId, filter,
107                 includeAllowableActions, null);
108 
109         if (versions == null || versions.isEmpty()) {
110             throw new CmisRuntimeException("Version list is null or empty!");
111         }
112 
113         // set headers
114         response.setStatus(HttpServletResponse.SC_OK);
115         response.setContentType(Constants.MEDIATYPE_FEED);
116 
117         // write XML
118         AtomFeed feed = new AtomFeed();
119         feed.startDocument(response.getOutputStream());
120         feed.startFeed(true);
121 
122         // write basic Atom feed elements
123         ObjectInfo latestObjectInfo = service.getObjectInfo(repositoryId, versions.get(0).getId());
124         ObjectInfo firstObjectInfo = service.getObjectInfo(repositoryId, versions.get(versions.size() - 1).getId());
125 
126         feed.writeFeedElements(versionSeriesId, firstObjectInfo.getCreatedBy(), latestObjectInfo.getName(),
127                 latestObjectInfo.getLastModificationDate(), null, null);
128 
129         // write links
130         UrlBuilder baseUrl = compileBaseUrl(request, repositoryId);
131 
132         feed.writeServiceLink(baseUrl.toString(), repositoryId);
133 
134         if (objectId != null) {
135             feed.writeViaLink(compileUrl(baseUrl, RESOURCE_ENTRY, objectId));
136         }
137 
138         // write entries
139         AtomEntry entry = new AtomEntry(feed.getWriter());
140         for (ObjectData object : versions) {
141             if (object == null) {
142                 continue;
143             }
144             writeObjectEntry(service, entry, object, null, repositoryId, null, null, baseUrl, false);
145         }
146 
147         // we are done
148         feed.endFeed();
149         feed.endDocument();
150     }
151 
152     /**
153      * Delete object.
154      */
155     public static void deleteAllVersions(CallContext context, CmisService service, String repositoryId,
156             HttpServletRequest request, HttpServletResponse response) {
157         // get parameters
158         String objectId = getStringParameter(request, Constants.PARAM_ID);
159 
160         // execute
161         service.deleteObjectOrCancelCheckOut(repositoryId, objectId, Boolean.TRUE, null);
162 
163         // set headers
164         response.setStatus(HttpServletResponse.SC_NO_CONTENT);
165     }
166 }