Additional Blogs by SAP
cancel
Showing results for 
Search instead for 
Did you mean: 
Former Member

Recently, Daniel Wroblewski published a blog about uploading portal content and actions through XML files. See it SP15: XML Content and Actions. I have built a portal component that makes use of this capability through client side eventing to allow for creation of PCD folders with a predefined set of content.

Why do we need this? During some SAP training we can generate a set of PCD folders for multiple groups of students. Each student group gets subfolders for iViews, pages, roles etc, and we build a role structure for each student with a predefined entry point.

The component prompts for a top level folder name, how many groups to create and what prefix to use for folders and objects.

These values are obtained from the portal properties defined in portalapp.xml as below:

When it finishes, you end up with a PCD similar to:

The portal component is implemented with the following code:


package com.sap.anz;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.GregorianCalendar;
import java.util.TimeZone;

import com.sapportals.htmlb.Button;
import com.sapportals.htmlb.Form;
import com.sapportals.htmlb.GridLayout;
import com.sapportals.htmlb.Group;
import com.sapportals.htmlb.InputField;
import com.sapportals.htmlb.Label;
import com.sapportals.htmlb.MessageBar;
import com.sapportals.htmlb.enum.ButtonDesign;
import com.sapportals.htmlb.enum.DataType;

import com.sapportals.htmlb.enum.GroupDesign;
import com.sapportals.htmlb.enum.MessageType;
import com.sapportals.htmlb.event.Event;
import com.sapportals.htmlb.page.DynPage;
import com.sapportals.htmlb.page.PageException;
import com.sapportals.htmlb.page.PageProcessor;
import com.sapportals.portal.htmlb.page.PageProcessorComponent;
import com.sapportals.portal.prt.component.IPortalComponentProfile;
import com.sapportals.portal.prt.component.IPortalComponentRequest;
import com.sapportals.portal.prt.component.IPortalComponentResponse;
import com.sapportals.portal.prt.pom.IEvent;

public class Creation extends PageProcessorComponent
{
public class CreationDynPage extends DynPage
{

public void doInitialization()
throws PageException
{
executeEnabled = true;
latestMessage = "";
latestStatus = MessageType.NONE;
}

public void doProcessAfterInput()
throws PageException
{
}

public void doProcessBeforeOutput()
throws PageException
{
m_response = (IPortalComponentResponse)getResponse();
m_request = (IPortalComponentRequest)getRequest();
if(m_response == null)
{
try
{
uploadContent();
}
catch(Exception e)
{
}
return;
} else
{
String parentFolder = "";
String defaultPrefix = "";
String defaultFolderPrefix = "";
try {
IPortalComponentProfile profile = m_request.getComponentContext().getProfile();
parentFolder = profile.getProperty("ParentFolder");
defaultPrefix = profile.getProperty("Prefix");
defaultFolderPrefix = profile.getProperty("FolderPrefix");
}
catch
(Exception e) {
latestMessage = e.getLocalizedMessage();
latestStatus = MessageType.ERROR;
}
getUserName(parentFolder, defaultPrefix, defaultFolderPrefix);
return;
}
}

public void doExecute(Event evt)
{
executeEnabled = false;
}

private void getUserName(String defaultParentFolder, String defaultPrefix, String defaultFolderPrefix)
{
Form frm = getForm();
int col = 1;
int row = 1;

GridLayout descGrid = new GridLayout();
int row_grid1 = 1;
int col_grid1 = 1;
Group myGroup = new Group();
myGroup.setWidth("350");
myGroup.setTitle("PCD folder creation");
myGroup.setDesign(GroupDesign.SAPCOLOR);
frm.addComponent(myGroup);

GridLayout gl = new GridLayout();
gl.setCellPadding(5);
myGroup.addComponent(gl);

InputField userName = new InputField("Username");
Label label = new Label("Groups");
userName.setLabel(label);
userName.setTooltip("Number of user groups to create folders for");
userName.setString("10");
userName.setWidth("20");
userName.setType(DataType.INTEGER);
gl.addComponent(row_grid1, col_grid1, label);
gl.addComponent(row_grid1, col_grid1+1, userName);

row_grid1++;
InputField topFolder = new InputField("TopFolder");
topFolder.setString(defaultParentFolder);
topFolder.setTooltip("Folder in PCD under portal_content where folders will be generated");
label = new Label("Under PCD folder");
topFolder.setLabel(label);
gl.addComponent(row_grid1, col_grid1, label);
gl.addComponent(row_grid1, col_grid1+1, topFolder);

row_grid1++;
InputField prefix = new InputField("Prefix");
prefix.setString(defaultPrefix);
label = new Label("Prefix for objects");
prefix.setLabel(label);
gl.addComponent(row_grid1, col_grid1, label);
gl.addComponent(row_grid1, col_grid1+1, prefix);

row_grid1++;
InputField folderPrefix = new InputField("folderPrefix");
folderPrefix.setString(defaultFolderPrefix);
label = new Label("Prefix for folders");
folderPrefix.setLabel(label);
gl.addComponent(row_grid1, col_grid1, label);
gl.addComponent(row_grid1, col_grid1+1, folderPrefix);

row_grid1++;

MessageBar usefulBar = new MessageBar("usefulBar");
usefulBar.setMessageType(latestStatus);
usefulBar.setMessageText(latestMessage);
row_grid1++;
gl.addComponent(row_grid1, col_grid1, usefulBar);

row_grid1++;
Button btnExecute = new Button("btnExecute");
btnExecute.setText("Start");
btnExecute.setOnClientClick("showLoad()");
btnExecute.setOnClick("doExecute");
btnExecute.setOKButton(true);
btnExecute.setDesign(ButtonDesign.EMPHASIZED);
gl.addComponent(row_grid1, col_grid1, btnExecute);

MessageBar exeBar = new MessageBar("exeBar");
exeBar.setMessage(MessageType.LOADING, "loading...");
frm.addRawText("

");
frm.addRawText("

");

               frm.setDefaultButton(btnExecute);

          }

          private void uploadContent()

          {

               IPortalComponentProfile profile = m_request.getComponentContext().getProfile();

               String userName = ((InputField)getComponentByName("Username")).getValue().toString();

               String topFolder = ((InputField)getComponentByName("TopFolder")).getValue().toString();

               String prefix = ((InputField)getComponentByName("Prefix")).getValue().toString();

               String folderPrefix = ((InputField)getComponentByName("folderPrefix")).getValue().toString();

               String generatedFile = profile.getProperty("GeneratedFile");

               String origFileName = generatedFile;

               m_request.putValue("originFile", origFileName);

               if (topFolder.equals("") || userName.equals("")) {

                    latestMessage = "Please enter a number of groups and a top level PCD folder";

                    latestStatus = MessageType.WARNING;

               return;

          }

               try

               {

                    Object user = m_request.getUser();

                    File genFile = new File(generatedFile);

                    BufferedWriter o1 = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(genFile), "UTF8"));

                    o1.write(GenericCreatorTag());

                    Integer Count = new Integer(userName);

                    int count = Count.intValue();

                    for (int i = 0; i <= count; i++) {

                         userName = (new Integer(i) ).toString();

                         if (i < 10) userName = "0"+userName;

                         if (i == 0) {

                              o1.write(ContextTag(topFolder, "", "portal_content", ""));

                         };

                         o1.write(ContextTag(userName, "Group", "portal_content/"+topFolder, folderPrefix));

                         o1.write(ContextTag("iViews", "Group "userName, "portal_content/"topFolder"/"folderPrefix+userName, folderPrefix));

                         o1.write(ContextTag("Pages", "Group "userName, "portal_content/"topFolder"/"folderPrefix+userName, folderPrefix));

                         o1.write(ContextTag("Roles", "Group "userName, "portal_content/"topFolder"/"folderPrefix+userName, folderPrefix));

                         o1.write(ContextTag("Worksets", "Group "userName, "portal_content/"topFolder"/"folderPrefix+userName, folderPrefix));

                         o1.write(ContextTag("Systems", "Group "userName, "portal_content/"topFolder"/"folderPrefix+userName, folderPrefix));

                         o1.write(ContextTag("TransportPackages", "Group "userName, "portal_content/"topFolder"/"folderPrefix+userName, folderPrefix));

                         o1.write(makeRole(prefix"group_"userName"_role","Group "userName+" role",

                              "Group_"userName"_entry_point",

                              "Group "+userName,

                              "portal_content/"topFolder"/"folderPrefixuserName"/"folderPrefix+"Roles"));

//                         o1.write(CreateFile(userName, topFolder));

                    }

                    o1.write(EndTagsClosingXMLFile());

                    o1.close();

                    File srcFile = new File(origFileName);

                    srcFile = preProcessFile(srcFile);

                    latestMessage = "Finished";

                    latestStatus = MessageType.INFO;

                    m_request.putValue("file", srcFile.toString());

               }

               catch(Exception ex)

               {

                    latestMessage = ex.getLocalizedMessage();

                    latestStatus = MessageType.ERROR;

//                    if(GCLogger.logger().beTraced(TracingConsts.DEBUG))

//                         GCLogger.logger().traceThrowableT(TracingConsts.DEBUG, "Failed to get source file", ex);

               }

          }

          File preProcessFile(File inFile)

          {

               BufferedReader is;

               File outFile;

               BufferedWriter os;

               try

               {

                    is = new BufferedReader(new InputStreamReader(new FileInputStream(inFile), "UTF8"));

                    outFile = File.createTempFile("tmp_masscontent", ".xml");

                    os = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF8"));

               }

               catch(FileNotFoundException e)

               {

//                    if(GCLogger.logger().beTraced(TracingConsts.DEBUG))

//                         GCLogger.logger().traceThrowableT(TracingConsts.DEBUG, "File not found", e);

                    return inFile;

               }

               catch(IOException e)

               {

//                    if(GCLogger.logger().beTraced(TracingConsts.DEBUG))

//                         GCLogger.logger().traceThrowableT(TracingConsts.DEBUG, "Failed while processing the file", e);

                    return inFile;

               }

               try

               {

                    int len = 80;

                    char buf[] = new char[len];

                    int i;

                    while((i = is.read(buf, 0, len)) != -1)

                         os.write(buf, 0, i);

               }

               catch(IOException e1)

               {

//                    if(GCLogger.logger().beTraced(TracingConsts.DEBUG))

//                         GCLogger.logger().traceThrowableT(TracingConsts.DEBUG, "Failed writting to the file", e1);

               }

               try

               {

                    os.close();

                    is.close();

               }

               catch(IOException e2)

               {

//                    if(GCLogger.logger().beTraced(TracingConsts.DEBUG))

//                         GCLogger.logger().traceThrowableT(TracingConsts.DEBUG, "Failed closing the file", e2);

               }

               return outFile;

          }

          public void doOutput(PageProcessor page)

               throws PageException

          {

               String status = (String)m_request.getValue("status");

               if(status != null && status.equals("0"))

                    m_request.putValue("status", "1");

               else

                    super.doOutput(page);

          }

          private static final int PADDING = 5;

          private static final int SPACING = 3;

          private static final String EXECUTE = "doExecute";

          private static final String STOP = "doStop";

          private IPortalComponentResponse m_response;

          private IPortalComponentRequest m_request;

          private int state;

          private String result;

          private boolean executeEnabled;

          public CreationDynPage()

          {

               result = "";

               executeEnabled = true;

          }

     }

     public Creation()

     {

          m_pMode = "cleanAndCreate";

          m_pIgnore = "false";

          m_pLogLevel = "real";

     }

     public DynPage getPage()

     {

          return new CreationDynPage();

     }

     protected void doOnNodeReady(IPortalComponentRequest request, IEvent event)

     {

          super.doOnNodeReady(request, event);

          request.putValue("status", "0");

          DynPage myDynPage = getPage(request, null);

          try

          {

               PageProcessor m_processor = new PageProcessor(request, null, myDynPage);

               m_processor.handleRequest();

          }

          catch(PageException e)

          {

//               if(GCLogger.logger().beTraced(TracingConsts.DEBUG))

//                    GCLogger.logger().traceThrowableT(TracingConsts.DEBUG, "Failed processing a page", e);

          }

     }

     public static String subst(String oldStr, String newStr, String inString)

     {

          int start = inString.indexOf(oldStr);

          if(start == -1)

          {

               return inString;

          } else

          {

               StringBuffer sb = new StringBuffer();

               sb.append(inString.substring(0, start));

               sb.append(newStr);

               sb.append(inString.substring(start + oldStr.length()));

               return sb.toString();

          }

     }

      private static String GetTimeAndDate()

      {

           GregorianCalendar cal = new GregorianCalendar();

           cal.setTimeZone(TimeZone.getTimeZone("ECT"));

           cal.setTime(cal.getTime());

           return """ + String.valueOf(cal.get(1)) + "/" + String.valueOf(cal.get(2)) + "/" + String.valueOf(cal.get(5)) + " " + String.valueOf(cal.get(11)) + ":" + String.valueOf(cal.get(12)) + ":" + String.valueOf(cal.get(13)) + """;

      }

      public static String GenericCreatorTag()

      {

           return "";

      }

      private String makeRole(String name, String description, String entryPoint, String entryDesc, String folder) {

          String Tag = "<Property name="parent1" value=""folder""/>";

          Tag = Tag " <Context name=""name"" objectClass="com.sapportals.portal.role" create_as="0" parent=""folder+"">";

          Tag = Tag + "";

          Tag = Tag + "<AttributeValue value=""description"" locale=""/>";

          Tag = Tag + "<AttributeValue value=""description"" locale="en"/></Attribute></Attributes>";

          Tag = Tag + "<Context name=""entryPoint"" objectClass="com.sapportals.portal.rolefolder" create_as="0">";

          Tag = Tag + "<AttributeValue value=""entryDesc"" locale=""/>";

          Tag = Tag + "<AttributeValue value=""entryDesc"" locale="en"/>

This scripting raises an event that is handled by the XML import tool. For this to work in practice, we need to add the iView with the above component toa page that also contains the iView com.sap.portal.generic_creator_component.

The image below shows an example of the page. The top iView is the component that builds the XML, the second iView is the generic creator.

12 Comments