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