Author: asanso
Date: Tue Nov  6 13:45:36 2012
New Revision: 1406137

URL: http://svn.apache.org/viewvc?rev=1406137&view=rev
Log:
SLING-2646 - [Tooling] adding support for .content.xml files on save

Added:
    
sling/whiteboard/asanso/plugins/eclipse/slingclipse-api/src/org/apache/sling/slingclipse/api/ProtectedNodes.java
Modified:
    
sling/whiteboard/asanso/plugins/eclipse/slingclipse-api/src/org/apache/sling/slingclipse/api/Repository.java
    
sling/whiteboard/asanso/plugins/eclipse/slingclipse-http/src/org/apache/sling/slingclipse/http/impl/RepositoryImpl.java
    
sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/src/org/apache/sling/slingclipse/SlingclipseListener.java
    
sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/src/org/apache/sling/slingclipse/helper/SlingclipseHelper.java
    
sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/src/org/apache/sling/slingclipse/ui/wizards/ImportWizard.java

Added: 
sling/whiteboard/asanso/plugins/eclipse/slingclipse-api/src/org/apache/sling/slingclipse/api/ProtectedNodes.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/asanso/plugins/eclipse/slingclipse-api/src/org/apache/sling/slingclipse/api/ProtectedNodes.java?rev=1406137&view=auto
==============================================================================
--- 
sling/whiteboard/asanso/plugins/eclipse/slingclipse-api/src/org/apache/sling/slingclipse/api/ProtectedNodes.java
 (added)
+++ 
sling/whiteboard/asanso/plugins/eclipse/slingclipse-api/src/org/apache/sling/slingclipse/api/ProtectedNodes.java
 Tue Nov  6 13:45:36 2012
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.slingclipse.api;
+
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+
+public enum ProtectedNodes {
+       
+       
JCR_CREATED(Repository.JCR_CREATED),JCR_CREATED_BY(Repository.JCR_CREATED_BY),JCR_PRIMARY_TYPE(Repository.JCR_PRIMARY_TYPE);
+
+       private static final Map<String, ProtectedNodes> nameToValueMap =
+                       new HashMap<String, ProtectedNodes>();
+
+       static {
+               for (ProtectedNodes value : 
EnumSet.allOf(ProtectedNodes.class)) {                       
+                       nameToValueMap.put(value.getKey(), value);
+               }
+       }
+
+       public static boolean exists(String key) {
+               return nameToValueMap.containsKey(key);
+       }
+       
+       
+       
+       private final String key;
+
+       private ProtectedNodes(String key) {
+               this.key = key;
+       }
+
+       public String getKey() {
+               return this.key;
+       }
+       
+}

Modified: 
sling/whiteboard/asanso/plugins/eclipse/slingclipse-api/src/org/apache/sling/slingclipse/api/Repository.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/asanso/plugins/eclipse/slingclipse-api/src/org/apache/sling/slingclipse/api/Repository.java?rev=1406137&r1=1406136&r2=1406137&view=diff
==============================================================================
--- 
sling/whiteboard/asanso/plugins/eclipse/slingclipse-api/src/org/apache/sling/slingclipse/api/Repository.java
 (original)
+++ 
sling/whiteboard/asanso/plugins/eclipse/slingclipse-api/src/org/apache/sling/slingclipse/api/Repository.java
 Tue Nov  6 13:45:36 2012
@@ -16,6 +16,8 @@
  */
 package org.apache.sling.slingclipse.api;
 
+import java.util.Map;
+
 public interface Repository {
        
        public static String JCR_PRIMARY_TYPE= "jcr:primaryType";
@@ -23,13 +25,67 @@ public interface Repository {
        public static String NT_FOLDER= "nt:folder";
        public static String JCR_ROOT= "jcr:root";
        public static String NT_RESOURCE= "nt:resource";
-       
-       
+       public static String JCR_CREATED= "jcr:created";
+       public static String JCR_CREATED_BY= "jcr:createdBy";
+       public static String JCR_ETAG= "jcr:etag";
+       public static String JCR_LIFECYCLE_POLICY= "jcr:lifecyclePolicy";
+       public static String JCR_CURRENT_LIFECYCLE_STATE= 
"jcr:currentLifecycleState";
+       public static String JCR_LOCK_OWNER= "jcr:lockOwner";
+       public static String JCR_LOCK_IS_DEEP= "jcr:lockIsDeep";
+       public static String JCR_UUID= "jcr:uuid";
+       public static String JCR_IS_CHECKED_OUT= "jcr:isCheckedOut";
+       public static String JCR_VERSION_HISTORY= "jcr:versionHistory";
+       public static String JCR_BASE_VERSION= "jcr:baseVersion";
+       public static String JCR_PREDECESSORS= "jcr:predecessors";
+       public static String JCR_MERGE_FAILED= "jcr:mergeFailed";
+       public static String JCR_ACTIVITY= "jcr:activity";
+       public static String JCR_CONFIGURATION= "jcr:configuration";
+       public static String JCR_ACTIVITY_TITLE= "jcr:activityTitle";
+       //public static String JCR_PRIMARY_TYPE= "jcr:primaryType";
+       public static String JCR_MIXIN_TYPES= "jcr:mixinTypes";
+       public static String JCR_NAME= "jcr:name";
+       public static String JCR_AUTO_CREATED= "jcr:autoCreated";
+       public static String JCR_MANDATORY= "jcr:mandatory";
+       public static String JCR_ON_PARENT_VERSION= "jcr:onParentVersion";
+       public static String JCR_PROTECTED= "jcr:protected";    
+       public static String JCR_REQUIRED_PRIMARY_TYPES= 
"jcr:requiredPrimaryTypes";
+       public static String JCR_DEFAULT_PRIMARY_TYPE= "jcr:defaultPrimaryType";
+       public static String JCR_SAME_NAME_SIBLINGS= "jcr:sameNameSiblings";
+       //root
+       public static String JCR_FROZEN_PRIMARY_TYPE= "jcr:frozenPrimaryType";
+       public static String JCR_FROZEN_MIXIN_TYPES= "jcr:frozenMixinTypes";
+       public static String JCR_FROZEN_UUID= "jcr:frozenUuid";
+       public static String JCR_NODE_TYPE_NAME= "jcr:nodeTypeName";
+       public static String JCR_SUPER_TYPES= "jcr:supertypes";
+       public static String JCR_IS_ABSTRACT= "jcr:isAbstract";
+       public static String JCR_IS_QUERYABLE= "jcr:isQueryable";
+       public static String JCR_IS_MIXIN= "jcr:isMixin";
+       public static String JCR_HAS_ORDERABLE_CHILD_NODES= 
"jcr:hasOrderableChildNodes";
+       public static String JCR_PRIMARY_ITEM_NAME= "jcr:primaryItemName";
+       public static String JCR_PROPERTY_DEFINITION= "jcr:propertyDefinition";
+       public static String JCR_CHILD_NODE_DEFINITION= 
"jcr:childNodeDefinition";
+       public static String JCR_REQUIRED_TYPE= "jcr:requiredType";
+       public static String JCR_VALUE_CONSTRAINTS= "jcr:valueConstraints";
+       public static String JCR_DEFAULT_VALUES= "jcr:defaultValues";
+       public static String JCR_MULTIPLE= "jcr:multiple";
+       public static String JCR_AVAILABLE_QUERY_OPERATORS= 
"jcr:availableQueryOperators";
+       public static String JCR_IS_FULL_TEXT_SEARCHABLE= 
"jcr:isFullTextSearchable";
+       public static String JCR_IS_QUERY_ORDERABLE= "jcr:isQueryOrderable";
+       public static String JCR_SUCCESSORS= "jcr:successors";
+       public static String JCR_FROZENNODE= "jcr:frozenNode";
+       public static String JCR_VERSIONABLE_UUID= "jcr:versionableUuid";
+       public static String JCR_COPIED_FROM= "jcr:copiedFrom";
+       public static String JCR_ROOT_VERSION= "jcr:rootVersion";
+       public static String JCR_VERSION_LABELS= "jcr:versionLabels";
+       public static String JCR_CHILD_VERSION_HISTORY= 
"jcr:childVersionHistory";
+       
        //TODO change with properties
        public void setRepositoryInfo(RepositoryInfo repositoryInfo);
 
        public void addNode(FileInfo fileInfo);
        
+       public void updateContentNode(FileInfo fileInfo,Map<String,String> 
properties);
+       
        public void deleteNode(FileInfo fileInfo);
  
        public String listChildrenNode(String path,ResponseType responseType);

Modified: 
sling/whiteboard/asanso/plugins/eclipse/slingclipse-http/src/org/apache/sling/slingclipse/http/impl/RepositoryImpl.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/asanso/plugins/eclipse/slingclipse-http/src/org/apache/sling/slingclipse/http/impl/RepositoryImpl.java?rev=1406137&r1=1406136&r2=1406137&view=diff
==============================================================================
--- 
sling/whiteboard/asanso/plugins/eclipse/slingclipse-http/src/org/apache/sling/slingclipse/http/impl/RepositoryImpl.java
 (original)
+++ 
sling/whiteboard/asanso/plugins/eclipse/slingclipse-http/src/org/apache/sling/slingclipse/http/impl/RepositoryImpl.java
 Tue Nov  6 13:45:36 2012
@@ -17,7 +17,7 @@
 package org.apache.sling.slingclipse.http.impl;
 
 import java.io.File;
-
+import java.util.Map;
 import org.apache.commons.httpclient.Credentials;
 import org.apache.commons.httpclient.HttpClient;
 import org.apache.commons.httpclient.UsernamePasswordCredentials;
@@ -30,6 +30,7 @@ import org.apache.commons.httpclient.met
 import org.apache.commons.httpclient.methods.multipart.StringPart;
 import org.apache.sling.slingclipse.api.FileInfo;
 import org.apache.sling.slingclipse.api.ResponseType;
+ 
 
 public class RepositoryImpl extends AbstractRepository{
        
@@ -133,4 +134,27 @@ public class RepositoryImpl extends Abst
                        get.releaseConnection();
                }
        }
+       
+       @Override
+       public void updateContentNode(FileInfo fileInfo,Map<String, String> 
properties) {
+               PostMethod post = new 
PostMethod(repositoryInfo.getUrl()+fileInfo.getRelativeLocation());
+               try{
+                       Part[] parts = new Part[properties.size()];
+                       int counter=0;
+                       for (Map.Entry <String,String> 
proerty:properties.entrySet()) {
+                               parts[counter]=new StringPart(proerty.getKey(), 
proerty.getValue());
+                               counter++;
+                       }
+                       post.setRequestEntity(new 
MultipartRequestEntity(parts,post.getParams()));
+                       httpClient.getState().setCredentials(AuthScope.ANY, new 
UsernamePasswordCredentials(repositoryInfo.getUsername(),repositoryInfo.getPassword()));
+                       
httpClient.getParams().setAuthenticationPreemptive(true);
+                       int responseStatus=httpClient.executeMethod(post);
+                       //TODO handle the response status       
+               } catch(Exception e){
+                       //TODO handle the error
+               }finally{
+                       post.releaseConnection();
+               }
+       }
+ 
 }

Modified: 
sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/src/org/apache/sling/slingclipse/SlingclipseListener.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/src/org/apache/sling/slingclipse/SlingclipseListener.java?rev=1406137&r1=1406136&r2=1406137&view=diff
==============================================================================
--- 
sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/src/org/apache/sling/slingclipse/SlingclipseListener.java
 (original)
+++ 
sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/src/org/apache/sling/slingclipse/SlingclipseListener.java
 Tue Nov  6 13:45:36 2012
@@ -16,12 +16,21 @@
  */
 package org.apache.sling.slingclipse;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.nio.MappedByteBuffer;
+import java.nio.channels.FileChannel;
+import java.nio.charset.Charset;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import org.apache.sling.slingclipse.api.ProtectedNodes;
 import org.apache.sling.slingclipse.api.Repository;
 import org.apache.sling.slingclipse.api.FileInfo;
 import org.apache.sling.slingclipse.api.RepositoryInfo;
 import org.apache.sling.slingclipse.helper.SlingclipseHelper;
 import org.apache.sling.slingclipse.preferences.PreferencesMessages;
-import org.eclipse.core.internal.resources.Resource;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IResourceChangeEvent;
 import org.eclipse.core.resources.IResourceChangeListener;
@@ -31,6 +40,9 @@ import org.eclipse.core.runtime.CoreExce
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.preference.IPreferenceStore;
+import org.json.JSONException;
+import org.json.JSONML;
+import org.json.JSONObject;
 
 /**
  * @author asanso
@@ -56,12 +68,12 @@ public class SlingclipseListener impleme
                                
                                try {
                                        return visitInternal(delta);
-                               } catch ( RuntimeException e) {
+                               } catch ( Exception e) {
                                        throw new CoreException(new 
Status(Status.ERROR, SlingclipsePlugin.PLUGIN_ID, "Failed visiting resource 
based on delta " + delta, e));
                                }
                        }
 
-                       private boolean visitInternal(IResourceDelta delta) {
+                       private boolean visitInternal(IResourceDelta delta) 
throws IOException, JSONException {
                                IPreferenceStore store = 
SlingclipsePlugin.getDefault().getPreferenceStore();
                                
                                // since the listener is disabled, instruct it 
not to recurse for changes
@@ -115,11 +127,42 @@ public class SlingclipseListener impleme
                return result;
        }
        
-       private void addNode(Repository repository,FileInfo fileInfo){
-               if (SlingclipseHelper.CONTENT_XML.equals(fileInfo.getName())){
+       private void addNode(Repository repository,FileInfo fileInfo) throws 
IOException, JSONException{
+               if (SlingclipseHelper.CONTENT_XML.equals(fileInfo.getName())){ 
+                       String fileContent = readFile(fileInfo.getLocation());
+                       Map <String ,String>properties= 
getModifiedProperties(fileContent);
+                       repository.updateContentNode(fileInfo, properties);
+                        
                        //DO NOTHING FOR NOW
                }else{  
                        repository.addNode(fileInfo);
                }
        }
+       
+       private static String readFile(String path) throws IOException {
+               FileInputStream stream = new FileInputStream(new File(path));
+               try {
+                       FileChannel fc = stream.getChannel();
+                       MappedByteBuffer bb = 
fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
+                       /* Instead of using default, pass in a decoder. */
+                       return Charset.defaultCharset().decode(bb).toString();
+               }
+               finally {
+                       stream.close();
+               }
+       }
+       
+       private Map <String ,String>getModifiedProperties(String fileContent) 
throws JSONException{
+               Map<String ,String> properties= new HashMap<String ,String>();
+               JSONObject json=JSONML.toJSONObject(fileContent);
+               System.out.println(json);
+               json.remove(SlingclipseHelper.TAG_NAME);
+               for (Iterator<String> keys = json.keys(); keys.hasNext();) {
+                       String key=keys.next();                                 
 
+                       if (!ProtectedNodes.exists(key) && 
!key.contains("xmlns")){
+                               properties.put(key, json.optString(key));       
                
+                       }
+               }
+               return properties;
+       }
 }

Modified: 
sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/src/org/apache/sling/slingclipse/helper/SlingclipseHelper.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/src/org/apache/sling/slingclipse/helper/SlingclipseHelper.java?rev=1406137&r1=1406136&r2=1406137&view=diff
==============================================================================
--- 
sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/src/org/apache/sling/slingclipse/helper/SlingclipseHelper.java
 (original)
+++ 
sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/src/org/apache/sling/slingclipse/helper/SlingclipseHelper.java
 Tue Nov  6 13:45:36 2012
@@ -18,6 +18,7 @@ package org.apache.sling.slingclipse.hel
 
 public class SlingclipseHelper {
        
+       public static final String TAG_NAME= "tagName";
        public static final String JCR_ROOT= "jcr_root";
        public static final String CONTENT_XML= ".content.xml";
        

Modified: 
sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/src/org/apache/sling/slingclipse/ui/wizards/ImportWizard.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/src/org/apache/sling/slingclipse/ui/wizards/ImportWizard.java?rev=1406137&r1=1406136&r2=1406137&view=diff
==============================================================================
--- 
sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/src/org/apache/sling/slingclipse/ui/wizards/ImportWizard.java
 (original)
+++ 
sling/whiteboard/asanso/plugins/eclipse/slingclipse-plugin/src/org/apache/sling/slingclipse/ui/wizards/ImportWizard.java
 Tue Nov  6 13:45:36 2012
@@ -164,7 +164,7 @@ public class ImportWizard extends Wizard
                        createFolder(path, destinationPath);
                        String content=repository.getNodeContent(path, 
ResponseType.JSON);
                        JSONObject jsonContent = new JSONObject(content);
-                       jsonContent.append("tagName", Repository.JCR_ROOT);
+                       jsonContent.put(SlingclipseHelper.TAG_NAME, 
Repository.JCR_ROOT);
                        String contentXml = JSONML.toString(jsonContent);       
        
                        createFile(path+"/"+SlingclipseHelper.CONTENT_XML, 
contentXml, destinationPath);
                }


Reply via email to