View Javadoc
1   /*
2    * Copyright (C) 2003-2007 eXo Platform SAS.
3    *
4    * This program is free software; you can redistribute it and/or
5    * modify it under the terms of the GNU Affero General Public License
6    * as published by the Free Software Foundation; either version 3
7    * of the License, or (at your option) any later version.
8    *
9    * This program is distributed in the hope that it will be useful,
10   * but WITHOUT ANY WARRANTY; without even the implied warranty of
11   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   * GNU General Public License for more details.
13   *
14   * You should have received a copy of the GNU General Public License
15   * along with this program; if not, see<http://www.gnu.org/licenses/>.
16   */
17  package org.exoplatform.ecm.webui.component.explorer.upload;
18  
19  import java.util.ArrayList;
20  import java.util.List;
21  
22  import javax.jcr.Node;
23  import javax.jcr.Value;
24  import javax.jcr.nodetype.NodeTypeManager;
25  import javax.jcr.nodetype.PropertyDefinition;
26  
27  import org.exoplatform.services.log.Log;
28  import org.exoplatform.ecm.webui.component.explorer.UIJCRExplorer;
29  import org.exoplatform.ecm.webui.form.UIDialogForm;
30  import org.exoplatform.resolver.ResourceResolver;
31  import org.exoplatform.services.cms.metadata.MetadataService;
32  import org.exoplatform.services.log.ExoLogger;
33  import org.exoplatform.webui.application.WebuiRequestContext;
34  import org.exoplatform.webui.config.annotation.ComponentConfig;
35  import org.exoplatform.webui.config.annotation.ComponentConfigs;
36  import org.exoplatform.webui.config.annotation.EventConfig;
37  import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
38  import org.exoplatform.webui.event.Event;
39  import org.exoplatform.webui.event.EventListener;
40  import org.exoplatform.webui.event.Event.Phase;
41  import org.exoplatform.webui.form.UIFormDateTimeInput;
42  import org.exoplatform.webui.form.UIFormInput;
43  import org.exoplatform.webui.form.UIFormMultiValueInputSet;
44  import org.exoplatform.webui.form.UIFormSelectBox;
45  import org.exoplatform.webui.form.UIFormStringInput;
46  import org.exoplatform.webui.form.input.UICheckBoxInput;
47  
48  /**
49   * Created by The eXo Platform SARL
50   * Author : Dang Van Minh
51   *          minh.dang@exoplatform.com
52   * May 25, 2007 8:58:25 AM
53   */
54  @ComponentConfigs( {
55      @ComponentConfig(type = UIFormMultiValueInputSet.class, id = "WYSIWYGRichTextMultipleInputset",
56                       events = {
57          @EventConfig(listeners = UIDialogForm.AddActionListener.class, phase = Phase.DECODE),
58          @EventConfig(listeners = UIFormMultiValueInputSet.RemoveActionListener.class, phase = Phase.DECODE) }),
59      @ComponentConfig(lifecycle = UIFormLifecycle.class, events = {
60          @EventConfig(listeners = UIAddMetadataForm.SaveActionListener.class),
61          @EventConfig(listeners = UIAddMetadataForm.CancelActionListener.class, phase = Phase.DECODE),
62          @EventConfig(listeners = UIAddMetadataForm.AddActionListener.class, phase = Phase.DECODE),
63          @EventConfig(listeners = UIAddMetadataForm.RemoveActionListener.class, phase = Phase.DECODE) }) })
64  public class UIAddMetadataForm extends UIDialogForm {
65    private static final Log LOG  = ExoLogger.getLogger(UIAddMetadataForm.class.getName());
66    private String nodeType_ ;
67    public UIAddMetadataForm() throws Exception {
68      setActions(ACTIONS) ;
69    }
70  
71    public void setNodeType(String nodeType) { nodeType_ = nodeType ; }
72    public String getNodeType() { return nodeType_ ; }
73  
74    public String getDialogTemplatePath() {
75      repositoryName = getAncestorOfType(UIJCRExplorer.class).getRepositoryName() ;
76      MetadataService metadataService = getApplicationComponent(MetadataService.class) ;
77      try {
78        return metadataService.getMetadataPath(nodeType_, true) ;
79      } catch (Exception e) {
80        if (LOG.isErrorEnabled()) {
81          LOG.error("Unexpected error", e);
82        }
83      }
84      return null ;
85    }
86  
87    public String getTemplate() { return getDialogTemplatePath() ; }
88  
89    @SuppressWarnings("unused")
90    public ResourceResolver getTemplateResourceResolver(WebuiRequestContext context, String template) {
91      return getAncestorOfType(UIJCRExplorer.class).getJCRTemplateResourceResolver() ;
92    }
93  
94    @SuppressWarnings("unchecked")
95    static public class SaveActionListener extends EventListener<UIAddMetadataForm> {
96      public void execute(Event<UIAddMetadataForm> event) throws Exception {
97        UIAddMetadataForm uiForm = event.getSource();
98        UIJCRExplorer uiJCRExplorer = uiForm.getAncestorOfType(UIJCRExplorer.class) ;
99        UIUploadContainer uiUploadContainer = uiForm.getAncestorOfType(UIUploadContainer.class) ;
100       Node node = uiUploadContainer.getEditNode(uiForm.nodeType_) ;
101       NodeTypeManager ntManager = uiJCRExplorer.getSession().getWorkspace().getNodeTypeManager();
102       PropertyDefinition[] props = ntManager.getNodeType(uiForm.getNodeType()).getPropertyDefinitions();
103       List<Value> valueList = new ArrayList<Value>();
104       try {
105       for (PropertyDefinition prop : props) {
106         String name = prop.getName();
107         String inputName = uiForm.fieldNames.get(name) ;
108         if (!prop.isProtected()) {
109           int requiredType = prop.getRequiredType();
110           if (prop.isMultiple()) {
111             if (requiredType == 5) { // date
112               UIFormDateTimeInput uiFormDateTime = (UIFormDateTimeInput) uiForm.getUIInput(inputName);
113               valueList.add(uiJCRExplorer.getSession().getValueFactory().createValue(uiFormDateTime.getCalendar())) ;
114               node.setProperty(name, valueList.toArray(new Value[] {}));
115             } else {
116               if (((UIFormInput)uiForm.getUIInput(inputName)) instanceof UIFormSelectBox){
117                 node.setProperty(name, ((UIFormSelectBox)uiForm.getUIInput(inputName)).getSelectedValues());
118               }else {
119                 List<String> values=(List<String>) ((UIFormMultiValueInputSet)uiForm.getUIInput(inputName)).getValue() ;
120                 node.setProperty(name, values.toArray(new String[values.size()]));
121               }
122             }
123           } else {
124             if (requiredType == 6) { // boolean
125               UIFormInput uiInput = uiForm.getUIInput(inputName) ;
126               boolean value = false;
127               //2 cases to return true, UIFormSelectBox with value true or UICheckBoxInput checked
128               if(uiInput instanceof UIFormSelectBox){
129             	  value =  Boolean.parseBoolean(((UIFormSelectBox)uiInput).getValue());
130               }else if( uiInput instanceof UICheckBoxInput){
131             	  value = ((UICheckBoxInput)uiInput).isChecked();
132               }
133               node.setProperty(name, value);
134             } else if (requiredType == 5) { // date
135               UIFormDateTimeInput cal = (UIFormDateTimeInput) uiForm.getUIInput(inputName);
136               node.setProperty(name, cal.getCalendar());
137             } else if(requiredType == 1) {
138               String value = ((UIFormStringInput)uiForm.getUIInput(inputName)).getValue() ;
139               if(value == null) value = "" ;
140               node.setProperty(name, value);
141             }
142           }
143         }
144       }
145       } catch (Exception e) {
146         UIUploadManager uiUploadManager = uiUploadContainer.getParent();
147         uiUploadManager.initMetadataPopup();
148         event.getRequestContext().addUIComponentToUpdateByAjax(uiUploadManager);
149       }
150       node.save();
151       node.getSession().save();
152       uiUploadContainer.setRenderedChild(UIUploadContent.class) ;
153       uiUploadContainer.removeChild(UIAddMetadataForm.class) ;
154       event.getRequestContext().addUIComponentToUpdateByAjax(uiUploadContainer) ;
155     }
156   }
157 
158   static public class CancelActionListener extends EventListener<UIAddMetadataForm> {
159     public void execute(Event<UIAddMetadataForm> event) throws Exception {
160       UIUploadContainer uiUploadContainer = event.getSource().getParent() ;
161       uiUploadContainer.removeChild(UIAddMetadataForm.class) ;
162       uiUploadContainer.setRenderedChild(UIUploadContent.class) ;
163       event.getRequestContext().addUIComponentToUpdateByAjax(uiUploadContainer) ;
164     }
165   }
166 
167   static public class AddActionListener extends EventListener<UIAddMetadataForm> {
168     public void execute(Event<UIAddMetadataForm> event) throws Exception {
169       event.getRequestContext().addUIComponentToUpdateByAjax(event.getSource().getParent()) ;
170     }
171   }
172 
173   static public class RemoveActionListener extends EventListener<UIAddMetadataForm> {
174     public void execute(Event<UIAddMetadataForm> event) throws Exception {
175       event.getRequestContext().addUIComponentToUpdateByAjax(event.getSource().getParent()) ;
176     }
177   }
178 }