KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > dotmarketing > portlets > structure > action > EditFieldAction


1 package com.dotmarketing.portlets.structure.action;
2
3 import java.net.URLDecoder JavaDoc;
4 import java.util.ArrayList JavaDoc;
5 import java.util.Enumeration JavaDoc;
6 import java.util.Iterator JavaDoc;
7 import java.util.List JavaDoc;
8 import javax.portlet.ActionRequest;
9 import javax.portlet.ActionResponse;
10 import javax.portlet.PortletConfig;
11 import org.apache.commons.beanutils.BeanUtils;
12 import org.apache.lucene.search.FieldCache;
13 import org.apache.struts.action.ActionForm;
14 import org.apache.struts.action.ActionMapping;
15
16 import com.dotmarketing.cache.FieldsCache;
17 import com.dotmarketing.cache.StructureCache;
18 import com.dotmarketing.db.DotHibernate;
19 import com.dotmarketing.portal.struts.DotPortletAction;
20 import com.dotmarketing.portlets.contentlet.factories.ContentletFactory;
21 import com.dotmarketing.portlets.structure.factories.FieldFactory;
22 import com.dotmarketing.portlets.structure.factories.StructureFactory;
23 import com.dotmarketing.portlets.structure.model.Field;
24 import com.dotmarketing.portlets.structure.model.Structure;
25 import com.dotmarketing.portlets.structure.struts.FieldForm;
26 import com.dotmarketing.util.Logger;
27 import com.dotmarketing.util.UtilMethods;
28 import com.dotmarketing.util.Validator;
29 import com.dotmarketing.util.WebKeys;
30 import com.liferay.portal.util.Constants;
31 import com.liferay.util.servlet.SessionMessages;
32
33 public class EditFieldAction extends DotPortletAction {
34
35     public void processAction(
36             ActionMapping mapping, ActionForm form, PortletConfig config,
37             ActionRequest req, ActionResponse res)
38     throws Exception JavaDoc {
39
40         String JavaDoc cmd = req.getParameter(Constants.CMD);
41         String JavaDoc referer = req.getParameter("referer");
42
43         if ((referer!=null) && (referer.length()!=0)) {
44             referer = URLDecoder.decode(referer,"UTF-8");
45         }
46
47         //Retrive the field in the request
48
if ((cmd == null) || !cmd.equals("reorder")) {
49             _retrieveField(form,req,res);
50         }
51         DotHibernate.startTransaction();
52
53         /*
54          * saving the field
55          */

56         if ((cmd != null) && cmd.equals(Constants.ADD)) {
57             try
58             {
59                 Logger.debug(this, "Calling Add/Edit Method");
60                 if (Validator.validate(req, form, mapping)) {
61                     if (_saveField(form,req,res)) {
62                         _sendToReferral(req,res,referer);
63                         return;
64                     }
65                 }
66             }
67             catch (Exception JavaDoc ae)
68             {
69                 _handleException(ae, req);
70                 return;
71             }
72
73         }
74         /*
75          * If we are deleting the field,
76          * run the delete action and return to the list
77          *
78          */

79         else if ((cmd != null) && cmd.equals(Constants.DELETE))
80         {
81             try
82             {
83                 Logger.debug(this, "Calling Delete Method");
84                 _deleteField(form,req,res);
85             }
86             catch (Exception JavaDoc ae)
87             {
88                 _handleException(ae, req);
89                 return;
90             }
91             _sendToReferral(req,res,referer);
92         } else if ((cmd != null) && cmd.equals("reorder"))
93         {
94             try
95             {
96                 Logger.debug(this, "Calling reorder Method");
97                 _reorderFields(form,req,res);
98             }
99             catch (Exception JavaDoc ae)
100             {
101                 _handleException(ae, req);
102                 return;
103             }
104             _sendToReferral(req,res,referer);
105         }
106         DotHibernate.commitTransaction();
107         _loadForm(form,req,res);
108         setForward(req, "portlet.ext.structure.edit_field");
109     }
110
111     private void _retrieveField(ActionForm form,ActionRequest req, ActionResponse res)
112     {
113         Field field = new Field();
114         String JavaDoc inodeString = req.getParameter("inode");
115         if(UtilMethods.isSet(inodeString))
116         {
117             long inode = Long.parseLong(inodeString);
118             if (inode != 0)
119             {
120                 field = FieldFactory.getFieldByInode(inode);
121             }
122             else
123             {
124                 long structureInode = Long.parseLong(req.getParameter("structureInode"));
125                 field.setStructureInode(structureInode);
126             }
127         }
128         else
129         {
130             long structureInode = Long.parseLong(req.getParameter("structureInode"));
131             field.setStructureInode(structureInode);
132         }
133
134         req.setAttribute(WebKeys.Field.FIELD,field);
135     }
136
137     private boolean _saveField(ActionForm form,ActionRequest req, ActionResponse res)
138     {
139         try
140         {
141             FieldForm fieldForm = (FieldForm) form;
142             Field field = (Field) req.getAttribute(WebKeys.Field.FIELD);
143             Structure structure = StructureFactory.getStructureByInode(field.getStructureInode());
144             BeanUtils.copyProperties(field,fieldForm);
145             //gets the data type from the contentlet: bool, date, text, etc
146
String JavaDoc dataType = fieldForm.getDataType();
147
148             String JavaDoc prevDataType = (field.getFieldContentlet()!=null) ? field.getFieldContentlet().replaceAll("[0-9]*","") : "";
149
150             if (!UtilMethods.isSet(fieldForm.getDataType())) {
151                 //it's either an image, file or link so there is no datatype
152
field.setFieldContentlet("");
153             }
154             else if (!prevDataType.equals(fieldForm.getDataType())) {
155                 //check all the other fields that have the same data type to get the next one to use
156
List JavaDoc fields = FieldFactory.getFieldsByContentletField(dataType,field.getInode(),field.getStructureInode());
157                 if (fields.size()>0) {
158
159                     //check if there is at least one empty
160
if (fields.size()<25) {
161
162                         int lastDataTypeIdx = 0;
163                         for (int i=1;i<=25;i++) {
164                             boolean found = false;
165                             Iterator JavaDoc fieldsIter = fields.iterator();
166                             while (fieldsIter.hasNext() && !found) {
167                                 Field nextField = (Field) fieldsIter.next();
168                                 try {
169                                     lastDataTypeIdx =Integer.parseInt(nextField.getFieldContentlet().replace(dataType,""));
170                                     if (i == lastDataTypeIdx) {
171                                         //found this field, break and try to find the next one
172
found = true;
173                                     }
174                                 }
175                                 catch (NumberFormatException JavaDoc e){
176
177                                 }
178                             }
179                             if (!found) {
180                                 lastDataTypeIdx = i;
181                                 break;
182                             }
183                         }
184                         //found an empty field
185
//set the contentlet field to be the data type plus the last one used
186
field.setFieldContentlet(dataType + lastDataTypeIdx);
187                     }
188                     else {
189                         //didn't find any empty ones, so im throwing an error to the user to select a new one
190
String JavaDoc message = "message.structure.nodatatype";
191                         SessionMessages.add(req, "message",message);
192                         return false;
193                     }
194                 }
195                 else {
196                     //set the contentlet field to be the data type plus the last one used
197
field.setFieldContentlet(dataType + "1");
198                 }
199             }
200             //saves this field
201
FieldFactory.saveField(field);
202
203             
204             FieldsCache.removeFields(structure);
205             StructureCache.removeStructure(structure);
206             
207             //rebuild contentlets indexes
208
ContentletFactory.reIndexAllContentletsByStructure(structure);
209
210             String JavaDoc message = "message.structure.savefield";
211             SessionMessages.add(req, "message",message);
212             return true;
213         }
214         catch(Exception JavaDoc ex)
215         {
216             Logger.debug(EditFieldAction.class,ex.toString());
217         }
218         return false;
219     }
220
221     private void _loadForm(ActionForm form,ActionRequest req, ActionResponse res)
222     {
223         try
224         {
225             FieldForm fieldForm = (FieldForm) form;
226             Field field = (Field) req.getAttribute(WebKeys.Field.FIELD);
227
228
229             long structureInode = field.getStructureInode();
230             structureInode = (structureInode != 0 ? structureInode : Long.parseLong(req.getParameter("structureInode")));
231
232             field.setStructureInode(structureInode);
233             BeanUtils.copyProperties(fieldForm,field);
234
235             List JavaDoc<String JavaDoc> values = new ArrayList JavaDoc<String JavaDoc>();
236             List JavaDoc<String JavaDoc> names = new ArrayList JavaDoc<String JavaDoc>();
237             fieldForm.setDataType(field.getFieldContentlet().replaceAll("[0-9]*",""));
238             fieldForm.setFreeContentletFieldsValue(values);
239             fieldForm.setFreeContentletFieldsName(names);
240         }
241         catch(Exception JavaDoc ex)
242         {
243             Logger.debug(EditFieldAction.class,ex.toString());
244         }
245     }
246
247     private void _deleteField(ActionForm form,ActionRequest req, ActionResponse res)
248     {
249         Field field = (Field) req.getAttribute(WebKeys.Field.FIELD);
250         Structure structure = StructureFactory.getStructureByInode(field.getStructureInode());
251         //clean contentlet field in db
252
ContentletFactory.cleanContentletsField(structure,field);
253         FieldFactory.deleteField(field);
254         FieldsCache.removeFields(structure);
255         StructureCache.removeStructure(structure);
256         //rebuild contentlets indexes
257
ContentletFactory.reIndexAllContentletsByStructure(structure);
258
259         String JavaDoc message = "message.structure.deletefield";
260         SessionMessages.add(req, "message",message);
261         
262     }
263
264     private void _reorderFields(ActionForm form,ActionRequest req, ActionResponse res)
265     {
266         try
267         {
268             Enumeration JavaDoc enumeration = req.getParameterNames();
269             while(enumeration.hasMoreElements())
270             {
271                 String JavaDoc parameterName = (String JavaDoc) enumeration.nextElement();
272                 if (parameterName.indexOf("order_") != -1)
273                 {
274                     String JavaDoc parameterValue = req.getParameter(parameterName);
275                     String JavaDoc fieldInode = parameterName.substring(parameterName.indexOf("_") + 1);
276                     Field field = FieldFactory.getFieldByInode(Long.parseLong(fieldInode));
277                     field.setSortOrder(Integer.parseInt(parameterValue));
278                     FieldFactory.saveField(field);
279                     
280                 }
281             }
282              String JavaDoc message = "message.structure.reorderfield";
283              SessionMessages.add(req, "message",message);
284         }
285         catch(Exception JavaDoc ex)
286         {
287             Logger.error(EditFieldAction.class,ex.toString());
288         }
289     }
290
291 }
292
Popular Tags