2016-05-09 13 views
1

sling:resourceTypeの値をQueryおよびSciptを使用して一括で置き換える方法。クエリまたはスクリプトを使用してsling:resourceType値を一括して置換する方法

たとえば、sling:resourceTypeの値 をapp/component/linkButtonからapp/component/content/linkbutton1に変更したいとします。

コンポーネントは20ページで使用されており、各ページで手動ではなくクエリを使用して変更する必要があります。

答えて

1

AEM Fiddleを含むACS AEM Toolsオープンソースプロジェクトを使用することができます。 AEM Fiddleでは、ビルドすることなくスクリプトをAEMインスタンス上で直接実行できます。

AEM Fiddleを使用する場合は、http://localhost:4502/miscadmin#/etc/acs-tools/aem-fiddleに移動し、右上のプラス記号をクリックして.javaを選択します。このコードを挿入して実行します。クエリのパスを更新してください。

import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.Iterator; 

import javax.jcr.query.Query; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.sling.api.SlingHttpServletRequest; 
import org.apache.sling.api.SlingHttpServletResponse; 
import org.apache.sling.api.resource.ModifiableValueMap; 
import org.apache.sling.api.resource.Resource; 
import org.apache.sling.api.resource.ResourceResolver; 
import org.apache.sling.api.servlets.SlingAllMethodsServlet; 

public class fiddle extends SlingAllMethodsServlet { 

    @Override 
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException { 
     response.setStatus(HttpServletResponse.SC_OK); 
     PrintWriter out = response.getWriter(); 
     ResourceResolver resolver = null; 

     out.println("starting..."); 

     try { 
      resolver = request.getResourceResolver(); 

      if (resolver != null) { 
       Iterator<Resource> resources = resolver.findResources("/jcr:root/content/mysite//*[@sling:resourceType='app/component/linkButton']", Query.XPATH); 

       while (resources.hasNext()) { 
        Resource resource = resources.next(); 
        ModifiableValueMap properties = resource.adaptTo(ModifiableValueMap.class); 
        properties.put("sling:resourceType", "app/component/linkButton1"); 
        resolver.commit(); 
        out.println(resource.getPath()); 
       } 
      } 
     } catch(Exception e) { 
      response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 
      e.printStackTrace(out); 
     } finally { 
      if (resolver != null && resolver.isLive()) { 
       resolver.close(); 
       resolver = null; 
      } 
     } 

     out.println("...finished"); 
    } 
} 

あなたが述べてきたように、あなたがむしろJSPを使用したい場合は、コードが同じである:目的のため

<%@include file="/libs/foundation/global.jsp"%><% 
%><%@page session="false" contentType="text/html; charset=utf-8" 
pageEncoding="UTF-8" 
import="org.apache.sling.api.resource.*, 
java.util.*, 
javax.jcr.*, 
com.day.cq.search.*, 
com.day.cq.wcm.api.*, 
com.day.cq.dam.api.*, 
javax.jcr.query.Query, 
org.apache.sling.api.resource.ModifiableValueMap"%><% 

    Iterator<Resource> resources = resourceResolver.findResources("/jcr:root/content/mysite//*[@sling:resourceType='app/component/linkButton']", Query.XPATH); 

    while (resources.hasNext()) { 
     Resource current = resources.next(); 
     ModifiableValueMap props = current.adaptTo(ModifiableValueMap.class); 
     props.put("sling:resourceType", "app/component/linkButton1"); 
     resourceResolver.commit(); 
%> 
    <%=current.getPath()%> 
<% 
    } 
%> 
+0

を置き換えるために見つけるかのsedコマンドを使用している場合、私はフィドルのコードを実行し、あなたの迅速な対応をありがとうございました。しかし、私はこのエラーが発生しています。 /apps/acs-tools/components/aemfiddle/fiddle/fiddle.javaのコンパイルエラー:行1、列0:宣言されたパッケージ ""が予想されるパッケージ "apps.acs_002dtools.components.aemfiddle.fiddle"と一致しません このサーバーの/etc/acs-tools/aem-fiddle/_jcr_content.run.htmlへのリクエストを処理できません。 ApacheSling/2.4(jetty/9.2.9.v20150224、Java HotSpot(TM)64ビットサーバーVM 1.8.0_66 、Mac OS X 10.11.4 x86_64) –

+0

JSPで同様のコードを実行できますか?私はこれを初めてやっています。 –

+0

AEM Fiddleが書き込む最初の行を終了してください。これは次のようになります: 'package apps.acs_002dtools.components.aemfiddle.fiddle;' – nateyolles

3

最良の選択はgroovy consoleです。

仕事をベロースクリプト:

import javax.jcr.Node 

getNode('/content/').recurse { resourceNode -> 
    if (resourceNode.hasProperty('sling:resourceType')) { 
     final def resourceType = resourceNode.getProperty('sling:resourceType').string 
     if (resourceType.equals('OLD_RESOURCE_TYPE')) { 
      println "changing " + resourceNode.path 
      resourceNode.setProperty('sling:resourceType', 'NEW_RESOURCE_TYPE') 
      resourceNode.save(); 
     } 
    } 
} 
0

別の汚い方法が、私のために働きました。 :)

  1. パスをパッケージし、zipファイルをダウンロードします。
  2. フォルダに展開します。お使いのオペレーティングシステムに基づいて
    • のWindowsを使用している場合は、検索パターンとディレクトリの下のすべてのファイルに置き換える検索し、メモ帳++を使用します。
    • Linuxは、ディレクターの内部に出現するすべて
+1

受け入れられた回答とグルーヴィーコンソールの回答は、はるかにクリーンでハッキングされていません。私はXMLファイルが非常に壊れやすく、簡単に壊れる可能性があるので、あなたのアプローチを推奨しません。このような壊れたパッケージのインポート中にデバッグするのは非常に複雑です。 –

+0

あなたは絶対に正しいです。私が時間とともに押された場合にのみ、これに従います。また、mixintypeのような保護されたプロパティを一括して削除する必要がある場合は、これを行います。 – Dileepa

関連する問題