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