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.lang.StringEscapeUtils;
47 import org.apache.commons.lang.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 {}", new Object[] { 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.escapeHtml(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
157 public void setExt(String ext) {
158 this.ext = ext;
159 }
160
161
162
163
164 public boolean isFormat() {
165 return format;
166 }
167
168
169
170
171
172 public void setFormat(boolean format) {
173 this.format = format;
174 }
175
176
177
178
179 public boolean isKeepHistory() {
180 return keepHistory;
181 }
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
202 public void setFileName(String fileName) {
203 this.fileName = fileName;
204 }
205
206
207
208
209 public OutputStream getOutputStream() {
210 return outputStream;
211 }
212
213
214
215
216
217 public void setOutputStream(OutputStream outputStream) {
218 this.outputStream = outputStream;
219 }
220
221
222
223
224 public String getMimeExtension() {
225 return mimeExtension;
226 }
227
228
229
230
231
232 public void setMimeExtension(String mimeExtension) {
233 this.mimeExtension = mimeExtension;
234 }
235
236 }