1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.commands.impl;
35
36 import info.magnolia.cms.security.AccessDeniedException;
37 import info.magnolia.cms.security.AccessManager;
38 import info.magnolia.cms.security.Permission;
39 import info.magnolia.context.Context;
40 import info.magnolia.context.MgnlContext;
41 import info.magnolia.importexport.DataTransporter;
42 import info.magnolia.repository.RepositoryConstants;
43
44 import java.io.OutputStream;
45
46 import org.apache.commons.io.IOUtils;
47 import org.apache.commons.lang3.StringEscapeUtils;
48 import org.apache.commons.lang3.StringUtils;
49 import org.slf4j.Logger;
50 import org.slf4j.LoggerFactory;
51
52
53
54
55
56
57
58
59
60
61
62
63 public class ExportCommand extends BaseRepositoryCommand {
64
65 private static final Logger log = LoggerFactory.getLogger(ExportCommand.class);
66
67 public static final String MIME_TEXT_XML = "application/xml";
68 public static final String MIME_GZIP = "application/x-gzip";
69 public static final String MIME_APPLICATION_ZIP = "application/zip";
70
71 private String ext = ".xml";
72 public static final String EXPORT_EXTENSION = "ext";
73 private boolean format = true;
74 public static final String EXPORT_FORMAT = "format";
75 private boolean keepHistory = true;
76 public static final String EXPORT_KEEP_HISTORY = "keepHistory";
77 private String fileName;
78 public static final String EXPORT_FILE_NAME = "fileName";
79 private String mimeExtension;
80 public static final String EXPORT_MIME_EXTENSION = "mimeExtension";
81 private OutputStream outputStream;
82 public static final String EXPORT_OUTPUT_STREAM = "outputStream";
83
84 @Override
85 public boolean execute(Context context) throws Exception {
86 setRepository(StringUtils.isBlank(getRepository()) ? RepositoryConstants.WEBSITE : getRepository());
87 setPath(StringUtils.isBlank(getPath()) ? "/" : getPath());
88
89 log.debug("Will export content from {} repository with uuid {} and path {}", getRepository(), getUuid(), getPath());
90
91
92 if (!checkPermissions(getRepository(), getPath(), Permission.READ)) {
93
94 throw new AccessDeniedException("Read permission needed for export. User not allowed to READ path [" + StringEscapeUtils.escapeHtml4(getPath()) + "]");
95 }
96
97 setMimeExtension(getContentType(ext));
98
99 String pathName = DataTransporter.createExportPath(getPath());
100 pathName = DataTransporter.encodePath(pathName, DataTransporter.DOT, DataTransporter.UTF8);
101 if (DataTransporter.DOT.equals(pathName)) {
102
103 pathName = StringUtils.EMPTY;
104 }
105
106 try {
107
108 DataTransporter.executeExport(getOutputStream(), keepHistory, format, MgnlContext.getJCRSession(getRepository()), getPath(), getRepository(), getExt());
109
110 setFileName(getRepository() + pathName + getExt());
111 } catch (RuntimeException e) {
112 throw e;
113 } finally {
114 IOUtils.closeQuietly(outputStream);
115 }
116
117 return true;
118 }
119
120
121
122
123
124
125 public boolean checkPermissions(String repository, String basePath, long permissionType) {
126
127 AccessManager accessManager = MgnlContext.getAccessManager(repository);
128 if (accessManager != null) {
129 if (!accessManager.isGranted(basePath, permissionType)) {
130 return false;
131 }
132 }
133 return true;
134 }
135
136
137
138
139 private String getContentType(String ext) {
140 if (ext.equalsIgnoreCase(DataTransporter.ZIP)) {
141 return MIME_APPLICATION_ZIP;
142 } else if (ext.equalsIgnoreCase(DataTransporter.GZ)) {
143 return MIME_GZIP;
144 } else {
145 return MIME_TEXT_XML;
146 }
147 }
148
149
150
151
152 public String getExt() {
153 return ext;
154 }
155
156
157
158
159 public void setExt(String ext) {
160 this.ext = ext;
161 }
162
163
164
165
166 public boolean isFormat() {
167 return format;
168 }
169
170
171
172
173 public void setFormat(boolean format) {
174 this.format = format;
175 }
176
177
178
179
180 public boolean isKeepHistory() {
181 return keepHistory;
182 }
183
184
185
186
187 public void setKeepHistory(boolean keepHistory) {
188 this.keepHistory = keepHistory;
189 }
190
191
192
193
194 public String getFileName() {
195 return fileName;
196 }
197
198
199
200
201 public void setFileName(String fileName) {
202 this.fileName = fileName;
203 }
204
205
206
207
208 public OutputStream getOutputStream() {
209 return outputStream;
210 }
211
212
213
214
215 public void setOutputStream(OutputStream outputStream) {
216 this.outputStream = outputStream;
217 }
218
219
220
221
222 public String getMimeExtension() {
223 return mimeExtension;
224 }
225
226
227
228
229 public void setMimeExtension(String mimeExtension) {
230 this.mimeExtension = mimeExtension;
231 }
232
233 }