001
014
015 package com.liferay.portal.kernel.lar;
016
017 import com.liferay.portal.NoSuchModelException;
018 import com.liferay.portal.kernel.exception.PortalException;
019 import com.liferay.portal.kernel.exception.SystemException;
020 import com.liferay.portal.kernel.util.ArrayUtil;
021 import com.liferay.portal.kernel.util.GetterUtil;
022 import com.liferay.portal.kernel.workflow.WorkflowConstants;
023 import com.liferay.portal.kernel.xml.Element;
024 import com.liferay.portal.model.StagedModel;
025 import com.liferay.portal.model.TrashedModel;
026 import com.liferay.portal.model.WorkflowedModel;
027
028 import java.util.HashMap;
029 import java.util.Map;
030
031
036 public abstract class BaseStagedModelDataHandler<T extends StagedModel>
037 implements StagedModelDataHandler<T> {
038
039 @Override
040 public abstract void deleteStagedModel(
041 String uuid, long groupId, String className, String extraData)
042 throws PortalException, SystemException;
043
044 @Override
045 public void exportStagedModel(
046 PortletDataContext portletDataContext, T stagedModel)
047 throws PortletDataException {
048
049 validateExport(portletDataContext, stagedModel);
050
051 String path = ExportImportPathUtil.getModelPath(stagedModel);
052
053 if (portletDataContext.isPathExportedInScope(path)) {
054 return;
055 }
056
057 try {
058 ManifestSummary manifestSummary =
059 portletDataContext.getManifestSummary();
060
061 PortletDataHandlerStatusMessageSenderUtil.sendStatusMessage(
062 "stagedModel", stagedModel, manifestSummary);
063
064 doExportStagedModel(portletDataContext, (T)stagedModel.clone());
065
066 if (countStagedModel(portletDataContext, stagedModel)) {
067 manifestSummary.incrementModelAdditionCount(
068 stagedModel.getStagedModelType());
069 }
070
071 portletDataContext.cleanUpMissingReferences(stagedModel);
072 }
073 catch (PortletDataException pde) {
074 throw pde;
075 }
076 catch (Exception e) {
077 PortletDataException pde = new PortletDataException(e);
078
079 if (e instanceof NoSuchModelException) {
080 pde.setStagedModel(stagedModel);
081 pde.setType(PortletDataException.MISSING_DEPENDENCY);
082 }
083
084 throw pde;
085 }
086 }
087
088 @Override
089 public abstract String[] getClassNames();
090
091 @Override
092 public String getDisplayName(T stagedModel) {
093 return stagedModel.getUuid();
094 }
095
096 @Override
097 public int[] getExportableStatuses() {
098 return new int[] {WorkflowConstants.STATUS_APPROVED};
099 }
100
101 @Override
102 public Map<String, String> getReferenceAttributes(
103 PortletDataContext portletDataContext, T stagedModel) {
104
105 return new HashMap<String, String>();
106 }
107
108 @Override
109 public void importCompanyStagedModel(
110 PortletDataContext portletDataContext, Element element)
111 throws PortletDataException {
112
113 String uuid = element.attributeValue("uuid");
114 long classPK = GetterUtil.getLong(element.attributeValue("class-pk"));
115
116 importCompanyStagedModel(portletDataContext, uuid, classPK);
117 }
118
119 @Override
120 public void importCompanyStagedModel(
121 PortletDataContext portletDataContext, String uuid, long classPK)
122 throws PortletDataException {
123
124 try {
125 doImportCompanyStagedModel(portletDataContext, uuid, classPK);
126 }
127 catch (PortletDataException pde) {
128 throw pde;
129 }
130 catch (Exception e) {
131 throw new PortletDataException(e);
132 }
133 }
134
135 @Override
136 public void importStagedModel(
137 PortletDataContext portletDataContext, T stagedModel)
138 throws PortletDataException {
139
140 String path = ExportImportPathUtil.getModelPath(stagedModel);
141
142 if (portletDataContext.isPathProcessed(path)) {
143 return;
144 }
145
146 try {
147 ManifestSummary manifestSummary =
148 portletDataContext.getManifestSummary();
149
150 PortletDataHandlerStatusMessageSenderUtil.sendStatusMessage(
151 "stagedModel", stagedModel, manifestSummary);
152
153 if (stagedModel instanceof TrashedModel) {
154 restoreStagedModel(portletDataContext, stagedModel);
155 }
156
157 doImportStagedModel(portletDataContext, stagedModel);
158
159 manifestSummary.incrementModelAdditionCount(
160 stagedModel.getStagedModelType());
161 }
162 catch (PortletDataException pde) {
163 throw pde;
164 }
165 catch (Exception e) {
166 throw new PortletDataException(e);
167 }
168 }
169
170 @Override
171 public void restoreStagedModel(
172 PortletDataContext portletDataContext, T stagedModel)
173 throws PortletDataException {
174
175 try {
176 doRestoreStagedModel(portletDataContext, stagedModel);
177 }
178 catch (PortletDataException pde) {
179 throw pde;
180 }
181 catch (Exception e) {
182 throw new PortletDataException(e);
183 }
184 }
185
186 @Override
187 public boolean validateReference(
188 PortletDataContext portletDataContext, Element referenceElement) {
189
190 String uuid = referenceElement.attributeValue("uuid");
191
192 try {
193 boolean valid = validateMissingReference(
194 uuid, portletDataContext.getCompanyId(),
195 portletDataContext.getScopeGroupId());
196
197 if (!valid) {
198 valid = validateMissingReference(
199 uuid, portletDataContext.getCompanyId(),
200 portletDataContext.getCompanyGroupId());
201 }
202
203 return valid;
204 }
205 catch (Exception e) {
206 return false;
207 }
208 }
209
210 protected boolean countStagedModel(
211 PortletDataContext portletDataContext, T stagedModel) {
212
213 return !portletDataContext.isStagedModelCounted(stagedModel);
214 }
215
216 protected abstract void doExportStagedModel(
217 PortletDataContext portletDataContext, T stagedModel)
218 throws Exception;
219
220 protected void doImportCompanyStagedModel(
221 PortletDataContext portletDataContext, String uuid, long classPK)
222 throws Exception {
223
224 throw new UnsupportedOperationException();
225 }
226
227 protected abstract void doImportStagedModel(
228 PortletDataContext portletDataContext, T stagedModel)
229 throws Exception;
230
231 protected void doRestoreStagedModel(
232 PortletDataContext portletDataContext, T stagedModel)
233 throws Exception {
234
235 throw new UnsupportedOperationException();
236 }
237
238 protected void validateExport(
239 PortletDataContext portletDataContext, T stagedModel)
240 throws PortletDataException {
241
242 if (stagedModel instanceof WorkflowedModel) {
243 WorkflowedModel workflowedModel = (WorkflowedModel)stagedModel;
244
245 if (!ArrayUtil.contains(
246 getExportableStatuses(), workflowedModel.getStatus())) {
247
248 PortletDataException pde = new PortletDataException(
249 PortletDataException.STATUS_UNAVAILABLE);
250
251 pde.setStagedModel(stagedModel);
252
253 throw pde;
254 }
255 }
256
257 if (stagedModel instanceof TrashedModel) {
258 TrashedModel trashedModel = (TrashedModel)stagedModel;
259
260 if (trashedModel.isInTrash()) {
261 PortletDataException pde = new PortletDataException(
262 PortletDataException.STATUS_IN_TRASH);
263
264 pde.setStagedModel(stagedModel);
265
266 throw pde;
267 }
268 }
269 }
270
271 protected boolean validateMissingReference(
272 String uuid, long companyId, long groupId)
273 throws Exception {
274
275 return true;
276 }
277
278 }