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 importStagedModel(
085 PortletDataContext portletDataContext, T stagedModel)
086 throws PortletDataException {
087
088 String path = ExportImportPathUtil.getModelPath(stagedModel);
089
090 if (portletDataContext.isPathProcessed(path)) {
091 return;
092 }
093
094 try {
095 ManifestSummary manifestSummary =
096 portletDataContext.getManifestSummary();
097
098 PortletDataHandlerStatusMessageSenderUtil.sendStatusMessage(
099 "stagedModel", stagedModel, manifestSummary);
100
101 doImportStagedModel(portletDataContext, stagedModel);
102
103 manifestSummary.incrementModelAdditionCount(
104 stagedModel.getStagedModelType());
105 }
106 catch (Exception e) {
107 throw new PortletDataException(e);
108 }
109 }
110
111 @Override
112 public boolean validateReference(
113 PortletDataContext portletDataContext, Element rootElement,
114 Element referenceElement) {
115
116 String elementName = referenceElement.getName();
117
118 if (elementName.equals("missing-reference")) {
119 String uuid = referenceElement.attributeValue("uuid");
120
121 try {
122 boolean valid = validateMissingReference(
123 uuid, portletDataContext.getCompanyId(),
124 portletDataContext.getScopeGroupId());
125
126 if (!valid) {
127 valid = validateMissingReference(
128 uuid, portletDataContext.getCompanyId(),
129 portletDataContext.getCompanyGroupId());
130 }
131
132 return valid;
133 }
134 catch (Exception e) {
135 return false;
136 }
137 }
138
139 return true;
140 }
141
142 protected boolean countStagedModel(
143 PortletDataContext portletDataContext, T stagedModel) {
144
145 return true;
146 }
147
148 protected abstract void doExportStagedModel(
149 PortletDataContext portletDataContext, T stagedModel)
150 throws Exception;
151
152 protected abstract void doImportStagedModel(
153 PortletDataContext portletDataContext, T stagedModel)
154 throws Exception;
155
156 protected boolean isExportable(
157 PortletDataContext portletDataContext, T stagedModel) {
158
159 String path = ExportImportPathUtil.getModelPath(stagedModel);
160
161 if (portletDataContext.isPathExportedInScope(path)) {
162 return false;
163 }
164
165 if (stagedModel instanceof WorkflowedModel) {
166 WorkflowedModel workflowedModel = (WorkflowedModel)stagedModel;
167
168 if (!ArrayUtil.contains(
169 getExportableStatuses(), workflowedModel.getStatus())) {
170
171 return false;
172 }
173 }
174
175 TrashHandler trashHandler = TrashHandlerRegistryUtil.getTrashHandler(
176 stagedModel.getModelClassName());
177
178 if (trashHandler != null) {
179 try {
180 long classPK = (Long)stagedModel.getPrimaryKeyObj();
181
182 if (trashHandler.isInTrash(classPK) ||
183 trashHandler.isInTrashContainer(classPK)) {
184
185 return false;
186 }
187 }
188 catch (Exception e) {
189 if (_log.isWarnEnabled()) {
190 _log.warn(
191 "Unable to check trash status for " +
192 stagedModel.getModelClassName());
193 }
194 }
195 }
196
197 return true;
198 }
199
200 protected boolean validateMissingReference(
201 String uuid, long companyId, long groupId)
202 throws Exception {
203
204 return true;
205 }
206
207 private static Log _log = LogFactoryUtil.getLog(
208 BaseStagedModelDataHandler.class);
209
210 }