2

I am trying to add the unpublished components entry in my custom storage extension. We know that we don't have any base class in Tridion for ComponentUndeploy as we have for deploy "ComponentDeploy", so I am trying to use ComponentPresentationUndeploy class to track the components which are getting and below is sample code how I am trying to track.

package com.tridion.custom.extensions;

import com.tridion.broker.StorageException;

import com.tridion.configuration.Configuration;
import com.tridion.configuration.ConfigurationException;

import com.tridion.deployer.DeploymentHandler;
import com.tridion.deployer.ProcessingException;
import com.tridion.deployer.Processor;
import com.tridion.deployer.modules.ComponentPresentationUndeploy;

import com.tridion.storage.ComponentMeta;
import com.tridion.storage.StorageManagerFactory;
import com.tridion.storage.StorageTypeMapping;
import com.tridion.storage.dao.ItemDAO;
import com.tridion.storage.dao.ItemTypeSelector;
import com.tridion.storage.dao.PublishAction;
import com.tridion.storage.dao.PublishActionDAO;
import com.tridion.storage.mapper.MapperFactory;
import com.tridion.transport.transportpackage.ComponentPresentationKey;
import com.tridion.transport.transportpackage.ProcessorInstructions;
import com.tridion.transport.transportpackage.TransportPackage;
import com.tridion.util.TCDURI;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;
import java.util.Iterator;

public class SearchComponentUndeployer extends ComponentPresentationUndeploy {
    private static Logger log = LoggerFactory
            .getLogger(SearchComponentUndeployer.class);

    public SearchComponentUndeployer(Configuration paramConfiguration,
            Processor paramProcessor) throws ConfigurationException {
        super(paramConfiguration, paramProcessor);
    }

    @SuppressWarnings("rawtypes")
    public void process(TransportPackage paramTransportPackage) throws ProcessingException 
    {
        ProcessorInstructions localProcessorInstructions = paramTransportPackage.getProcessorInstructions();
        try
        {
            Iterator localIterator = localProcessorInstructions.getArguments();
            while (localIterator.hasNext()) 
            {
                Object localObject = localIterator.next();
                if (localObject instanceof ComponentPresentationKey) 
                {

                        ComponentPresentationKey localComponentPresentationKey = (ComponentPresentationKey) localObject;

                        long[] arrayOfLong = new long[2];
                        arrayOfLong[0] = localComponentPresentationKey.getComponentKey().getId().getItemId();
                        arrayOfLong[1] = localComponentPresentationKey.getTemplateKey().getId().getItemId();

                        int PubID = localComponentPresentationKey.getComponentKey().getId().getPublicationId();
                        String tcmID = Integer.toString(localComponentPresentationKey.getComponentKey().getId().getItemId());
                        log.info("SearchComponentUndeployer -PubID" + PubID);
                        log.info("SearchComponentUndeployer -tcmID" + tcmID);
                        ItemDAO itemDAO = ((ItemDAO) StorageManagerFactory.getDAO(PubID, StorageTypeMapping.COMPONENT_META));
                        log.info("SearchComponentUndeployer -itemDAO"+ itemDAO.getStorageId());
                        ComponentMeta compObject = (ComponentMeta) MapperFactory.mapItemMetaInstance(itemDAO.findByPrimaryKey(PubID, localComponentPresentationKey.getComponentKey().getId().getItemId(),ItemTypeSelector.COMPONENT));
                        log.info("SearchComponentUndeployer -compObject"+ compObject.getTitle());
                        String formatTCMID = String.format("tcm:%d-%s-64", PubID,tcmID);
                        log.info("SearchComponentUndeployer - formatTCMID -"+ formatTCMID);
                        String strIgnorePubIds = "232,481";
                        String strPubId = Integer.toString(PubID);
                        Date lastPublishedDate = compObject.getLastPublishDate();

                        String schemaID = Integer.toString(compObject.getSchemaId());
                        if (!strIgnorePubIds.contains(strPubId)) 
                        {
                            PublishAction publishAction = new PublishAction();
                            publishAction.setAction("DEL");
                            publishAction.setTcmUri(formatTCMID);
                            publishAction.setItemType(16);
                            publishAction.setPublicationID(PubID);
                            publishAction.setLastPublishedDate(lastPublishedDate);
                            publishAction.setSchemaID(schemaID);
                            PublishActionDAO publishActionDAO = (PublishActionDAO) StorageManagerFactory.getDefaultDAO("PublishAction");    
                            log.debug("SearchComponentUndeployer Going to Store bean -" + publishAction.toString());
                            publishAction = publishActionDAO.store(publishAction);
                            log.debug("SearchComponentUndeployer Stored bean -" + publishAction);   
                        }   
                        DeploymentHandler.undeploy(new TCDURI(PubID, 73014444080L, arrayOfLong));   
                }
            }           
        }
        catch (StorageException e) 
        {
          log.error("Could not undeploy component presentation", e);
        }

    }
}

Any idea why I am not getting any entry for components in my database

Edit: Added sample code from PageUndeploy implementation done by me:

   Object argument = iterator.next();
    if (argument instanceof PageKey) 
    {
        PageKey pageKey = (PageKey) argument;
        TCDURI pageMetaURI = new TCDURI(pageKey.getId() .getPublicationId(), 1168231104576L, pageKey.getId().getItemId());
        PageMeta pageMeta = this.pageMetaHome.findByPrimaryKey(pageMetaURI.getPublicationId(),(int) pageMetaURI.getItemId());
        if (pageMeta == null) 
        {
            DeploymentHandler.undeploy(pageMetaURI);
        } 
        else 
        {

            //Here I need to loop for componentpresentation and get component object

        }
    }
Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
Manoj Singh
  • 7,569
  • 34
  • 119
  • 198
  • 3
    ComponentPresentationUndeploy is called only when you unpublish dynamic component presentations. For component presentations embedded in a page you need to use PageUndeploy and "look inside" to find which Components are in it. – Nuno Linhares Jan 16 '13 at 14:02
  • Hi Nuno...thanks for reply I have added sample code PageUndeployer class, Is that correct approach if yes then please share the code to get the component objects – Manoj Singh Jan 16 '13 at 14:34

1 Answers1

5

You can try this as I just taken class name from your input

List<ComponentPresentationMeta> lstCompObjects= pageMeta.getComponentPresentationMetas();
if(lstCompObjects != null && !lstCompObjects.isEmpty())
{
    for(ComponentPresentationMeta compMeta : lstCompObjects)
    {
        String compID = Integer.toString(compMeta.getComponentId());
        ItemDAO itemDAO = ((ItemDAO) StorageManagerFactory.getDAO(compMeta.getPublicationId(), StorageTypeMapping.COMPONENT_META));

        ComponentMeta compObject = (ComponentMeta) MapperFactory.mapItemMetaInstance(itemDAO.findByPrimaryKey(compMeta.getPublicationId(), compMeta.getComponentId(),ItemTypeSelector.COMPONENT));

        PublishAction compPublishAction = new PublishAction();
        compPublishAction.setAction("DEL");
        compPublishAction.setTcmUri(compID);                                    
        compPublishAction.setItemType(16);
        compPublishAction.setPublicationID(compMeta.getPublicationId());
        compPublishAction.setLastPublishedDate(compObject.getLastPublicationDate());
        compPublishAction.setSchemaID(Integer.toString(compObject.getSchemaId()));          
        compPublishAction = publishActionDAO.store(compPublishAction);          
    }                           
}
  • Clear answer, could we interest you in committing to the [Area 51 Tridion specific proposal](http://area51.stackexchange.com/proposals/38335/tridion?referrer=gPujQMxthNCNn9xqeeO2NA2). Sign up with the same SO account if you have a moment. – Bart Koopman Jan 17 '13 at 09:31