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