buildframework/helium/sf/java/sysdef/src/com/nokia/helium/sysdef/ant/taskdefs/FilterTask.java
author wbernard
Fri, 13 Aug 2010 14:59:05 +0300
changeset 628 7c4a911dc066
parent 588 c7c26511138f
permissions -rw-r--r--
helium_11.0.0-e00f171ca185
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
588
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
     1
/*
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
     2
* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
     3
* All rights reserved.
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
     4
* This component and the accompanying materials are made available
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
     5
* under the terms of the License "Eclipse Public License v1.0"
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
     6
* which accompanies this distribution, and is available
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
     8
*
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
     9
* Initial Contributors:
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    11
*
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    12
* Contributors:
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    13
*
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    14
* Description:  
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    15
*
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    16
*/
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    17
package com.nokia.helium.sysdef.ant.taskdefs;
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    18
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    19
import java.io.File;
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    20
import java.io.IOException;
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    21
import java.util.ArrayList;
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    22
import java.util.List;
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    23
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    24
import org.apache.tools.ant.BuildException;
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    25
import org.apache.tools.ant.util.FileUtils;
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    26
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    27
import com.nokia.helium.sysdef.ant.types.Filter;
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    28
import com.nokia.helium.sysdef.ant.types.FilterSet;
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    29
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    30
/**
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    31
 * <p>This task allows to do the filtering operation on system definition file v3.0.</p>
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    32
 * 
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    33
 * <p>The following example shows how you can join the X:\layer.sysdef.xml under
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    34
 * X:\filtered_layer.sysdef.xml.</p>
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    35
 * 
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    36
 * E.g:
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    37
 * <pre>
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    38
 *   &lt;hlm:filterSysdef epocroot=&quot;X:\&quot; srcfile=&quot;X:\layer.sysdef.xml&quot; 
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    39
 *                      destfile=&quot;X:\filtered_layer.sysdef.xml&quot;&gt;
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    40
 *       &lt;filterset&gt; 
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    41
 *           &lt;filter filter=&quot;test&quot; type=&quot;has&quot; /&gt; 
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    42
 *       &lt;/filterset&gt; 
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    43
 *   &lt;/hlm:filterSysdef&gt;
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    44
 * </pre>
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    45
 *
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    46
 * For more information about system definition file v3.0 please check 
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    47
 * <a href="http://developer.symbian.org/wiki/index.php/System_Definition">http://developer.symbian.org/wiki/index.php/System_Definition</a>.
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    48
 *
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
    49
 * <br>
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
    50
 * This task relies on externals tools. Their location can be configured the following ways:
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
    51
 *  <li>by configuring the sysdef.tools.home property, fails if the location is incorrect.
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
    52
 *  <li>The parent folder of the joinsysdef tool from the PATH, fallback on SDK location.
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
    53
 *  <li>Default SDK location.
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
    54
 *
588
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    55
 * @ant.task name="filterSysdef" category="Sysdef"
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    56
 */
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    57
public class FilterTask extends AbstractSydefTask {
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
    58
    private static final String XSLT = "filtering.xsl";
588
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    59
    private List<FilterSet> filterSets = new ArrayList<FilterSet>();
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    60
    
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    61
    /**
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    62
     * Create a FilterSet object to store filters.
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    63
     * @return a new FilterSet object
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    64
     */
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    65
    public FilterSet createFilterSet() {
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    66
        FilterSet filterset = new FilterSet();
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    67
        filterSets.add(filterset);
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    68
        return filterset;
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    69
    }
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    70
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    71
    /**
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    72
     * Add a FilterSet object.
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    73
     */
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    74
    public void add(FilterSet filterset) {
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    75
        filterSets.add(filterset);
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    76
    }
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    77
    
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    78
    /**
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    79
     * {@inheritDoc}
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    80
     */
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    81
    public void execute() {
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    82
        check();
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    83
        if (filterSets.isEmpty()) {
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    84
            throw new BuildException("You must define at least one nested filterset element.");
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    85
        }
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    86
        log("Filtering " + this.getSrcFile());
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    87
        for (FilterSet filterSet : filterSets) {
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    88
            if (filterSet.isReference()) {
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
    89
                try {
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
    90
                    filterSet = (FilterSet)filterSet.getRefid().getReferencedObject();
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
    91
                } catch (ClassCastException ex) {
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
    92
                    throw new BuildException("Object referenced by '" + filterSet.getRefid().getRefId() + "' is not a sysdefFilterSet.", ex);
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
    93
                }
588
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    94
            }
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    95
            List<File> toDelete = new ArrayList<File>();
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    96
            try {
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    97
                File src = this.getSrcFile();
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    98
                File dst = null;
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
    99
                for (Filter filter : filterSet.getFilters()) {
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
   100
                    
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
   101
                    // validating parameter first.
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
   102
                    filter.validate();
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
   103
                    
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
   104
                    // Then filter the file
588
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   105
                    dst = File.createTempFile("sysdef", ".xml", this.getEpocroot());
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   106
                    toDelete.add(dst);
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
   107
                    filter.filter(this, src, dst);
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
   108
                    
588
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   109
                    // Dest is the input for next loop.
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   110
                    src = dst;
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   111
                }
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   112
                if (dst != null) {
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   113
                    log("Creating " + this.getDestFile());
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   114
                    FileUtils.getFileUtils().copyFile(dst, getDestFile());
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   115
                } else {
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   116
                    // If nothing to do it is just identity, 
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   117
                    // so copying the source file
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   118
                    log("Creating " + this.getDestFile());
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   119
                    FileUtils.getFileUtils().copyFile(getSrcFile(), getDestFile());
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   120
                }
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   121
            } catch (IOException e) {
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   122
                throw new BuildException(e.getMessage(), e);
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   123
            } finally {
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   124
                for (File file : toDelete) {
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   125
                    file.delete();
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   126
                }
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   127
            }
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   128
        }
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   129
    }
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   130
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   131
    /**
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   132
     * {@inheritDoc}
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   133
     */
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   134
    @Override
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
   135
    protected File getXsl() {
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 588
diff changeset
   136
        return new File(SysdefUtils.getSysdefHome(getProject(), this.getEpocroot()), XSLT);
588
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   137
    }
c7c26511138f helium-10.0.0-bc45d50958fe
wbernard
parents:
diff changeset
   138
}