[opencms-dev] How do I update shared properties?

Paul-Inge Flakstad flakstad at npolar.no
Wed Oct 5 14:36:00 CEST 2011


Hi again Thomas,

Well, if you've already updated the relevant property settings in opencms-modules.xml, I don't see any need to add this to an action class. Like you said, only existing resources need modification. So isn't it just a matter of processing all your existing resources, using the provided script (or another tool of your choice)?

Cheers,
Paul

From: opencms-dev-bounces at opencms.org [mailto:opencms-dev-bounces at opencms.org] On Behalf Of Thomas Göttlich
Sent: 5. oktober 2011 14:28
To: The OpenCms mailing list
Subject: Re: [opencms-dev] How do I update shared properties?

HI Paul,

thanks for the info and the script.

I'll look into it.
If possible I'll try and add that to my module action, however.
That way it should be executed when the module is deployed/updated.
I'll keep you posted on my progress.

Thanks again.

Cheers,

Thomas
2011/10/5 Paul-Inge Flakstad <flakstad at npolar.no<mailto:flakstad at npolar.no>>
Hi Thomas,

If you can't do this using the Admin panel (apparently it has no switch to specify shared/individual property, so I see the problem) I think the easiest solution would be to write a simple JSP script that does the job.

I've included a script that I wrote some time ago. HTH.

Cheers,
Paul

<%--
    Document   : script-change-property
    Created on : 16.mar.2011, 14:19:29
    Author     : Paul-Inge Flakstad <flakstad at npolar.no<http://npolar.no>>
--%><%@ page import="org.opencms.jsp.CmsJspActionElement,
                 java.util.List,
                 java.util.Iterator,
                 java.util.Locale,
                 org.opencms.file.CmsObject,
                 org.opencms.file.CmsResource,
                 org.opencms.file.CmsResourceFilter,
                 org.opencms.file.CmsProperty,
                 org.opencms.main.OpenCms" session="true" %><%!

/**
* Gets an exception's stack strace as a string.
*/
public String getStackTrace(Exception e) {
    String trace = "<div style=\"border:1px solid #900; color:#900; font-family:Courier, Monospace; font-size:80%; padding:1em; margin:2em;\">";
    trace+= "<p style=\"font-weight:bold;\">" + e.getMessage() + "</p>";
    StackTraceElement[] ste = e.getStackTrace();
    for (int i = 0; i < ste.length; i++) {
        StackTraceElement stElem = ste[i];
        trace += stElem.toString() + "<br />";
    }
    trace += "</div>";
    return trace;
}
%><%
// Action element and CmsObject
CmsJspActionElement cms = new CmsJspActionElement(pageContext, request, response);
CmsObject cmso = cms.getCmsObject();
// Locale
Locale locale = cms.getRequestContext().getLocale();
String loc = locale.toString();
// Constants used in the script
final String FOLDER = "/your/content/folder/"; // Folders to collect files from
final String RESOURCE_TYPE_NAME = "your_resource_type_name"; // The type name of resources to collect
final String PROPERTY_NAME = "your_property_name"; // The name of the property to change
final String OLD_VALUE = "your_old_value"; // The old property value
final String NEW_VALUE = "your_new_value"; // The new property value
final boolean READ_TREE = true; // Collect files in sub-tree?
// Filter for the resource type
final CmsResourceFilter FILTER = CmsResourceFilter.ALL.addRequireType(OpenCms.getResourceManager().getResourceType(RESOURCE_TYPE_NAME).getTypeId());

// Get files
List filesInFolder = cmso.readResources(FOLDER, FILTER, READ_TREE);
Iterator iFilesInFolder = filesInFolder.iterator();

// Process collected files
while (iFilesInFolder.hasNext()) {
    CmsResource resource = (CmsResource)iFilesInFolder.next(); // Get the next collected resource
    String resourceName = resource.getName(); // The collected resource's name
    String resourcePath = cmso.getSitePath(resource); // The collected resource's path, relative to the current site

    // Get a list of all siblings (includes the resource itself)
    List siblings = cmso.readSiblings(resourcePath, FILTER);

    // Print some info
    out.println("<h4>Collected file: <code>" + resourcePath + " (" + resourceName + ")</code> plus " + (siblings.size()-1) + " siblings</h4>");
    out.println("Using locale: <code>" + loc + "</code><br />");

    try {
        // Get the property object, which will be used to modify property value
        CmsProperty property = cmso.readPropertyObject(resource, PROPERTY_NAME, false);

        //
        // Here you could add check for whether or not the property needs to be written
        //

        // Handle case: null-property
        if (property.isNullProperty()) {
            property = new CmsProperty(PROPERTY_NAME, null, null, true);
        }

        // Set and write the property value
        out.println("Writing (" + PROPERTY_NAME + "='" + NEW_VALUE + "' on resource " + resourcePath + ") ...<br />");

        //cmso.lockResource(resourcePath); // Commented out ==> Require (parent folder) lock to be present before running this script
        property.setValue(NEW_VALUE, CmsProperty.TYPE_SHARED); // Write the value as shared
        property.setValue("", CmsProperty.TYPE_INDIVIDUAL); // Remove any individual value

        //
        // IMPORTANT: Comment out the next line to run a test of the script without writing anything
        //
        //cmso.writePropertyObject(resourcePath, property); // Write property on the resource

        //cmso.unlockResource(resourcePath); // Commented out ==> Require (parent folder) lock to be present before running this script


        // Handle siblings
        Iterator iSiblings = siblings.iterator();
        while (iSiblings.hasNext()) {
            CmsResource sibling = (CmsResource)iSiblings.next();
            String siblingPath = cmso.getSitePath(sibling);
            if (!siblingPath.equals(resourcePath)) {
                out.println("Processing sibling: <code>" + siblingPath + "</code><br />");
                // Do something with the sibling
            }
        }

        out.println("Done!<br />");
        out.println("<hr />");
    } catch (Exception e) {
        out.println(getStackTrace(e));
    }
}
%>

From: opencms-dev-bounces at opencms.org<mailto:opencms-dev-bounces at opencms.org> [mailto:opencms-dev-bounces at opencms.org<mailto:opencms-dev-bounces at opencms.org>] On Behalf Of Thomas Göttlich
Sent: 5. oktober 2011 11:01
To: The OpenCms mailing list
Subject: [opencms-dev] How do I update shared properties?

Hi all,

I'm currently restructuring our site and modules.
During this process, some templates are moved from one module to another.
However, there are a couple of existing pages that have the shared property "template-elements" already set and I don't know how to update them.

Of course I can update the indivudal file properties in administration but that would result in quite inconsistent properties.

Example:

old template path:  /system/modules/my.module.old/templates/sometemplate.jsp
new template path: /system/modules/my.module.new/templates/sometemplate.jsp

When I update the individual properties for the files that use that template, I get this:


somefile:
- template-elements (indiv.): /system/modules/my.module.new/templates/sometemplate.jsp    <-- this is ok
- template-elements (shared): /system/modules/my.module.old/templates/sometemplate.jsp   <-- still the old value

I changed the resourcetype definition to use the new path as shared "template-elements" property, but that didn't update the existing files.

How would I do that?

Regards,

Thomas


_______________________________________________
This mail is sent to you from the opencms-dev mailing list
To change your list options, or to unsubscribe from the list, please visit
http://lists.opencms.org/mailman/listinfo/opencms-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://webmail.opencms.org/pipermail/opencms-dev/attachments/20111005/4718aa51/attachment.htm>


More information about the opencms-dev mailing list