View Javadoc

1   /**
2    * This file Copyright (c) 2003-2010 Magnolia International
3    * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
4    *
5    *
6    * This file is dual-licensed under both the Magnolia
7    * Network Agreement and the GNU General Public License.
8    * You may elect to use one or the other of these licenses.
9    *
10   * This file is distributed in the hope that it will be
11   * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
12   * implied warranty of MERCHANTABILITY or FITNESS FOR A
13   * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
14   * Redistribution, except as permitted by whichever of the GPL
15   * or MNA you select, is prohibited.
16   *
17   * 1. For the GPL license (GPL), you can redistribute and/or
18   * modify this file under the terms of the GNU General
19   * Public License, Version 3, as published by the Free Software
20   * Foundation.  You should have received a copy of the GNU
21   * General Public License, Version 3 along with this program;
22   * if not, write to the Free Software Foundation, Inc., 51
23   * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
24   *
25   * 2. For the Magnolia Network Agreement (MNA), this file
26   * and the accompanying materials are made available under the
27   * terms of the MNA which accompanies this distribution, and
28   * is available at http://www.magnolia-cms.com/mna.html
29   *
30   * Any modifications to this file must keep this entire header
31   * intact.
32   *
33   */
34  package info.magnolia.module.delta;
35  
36  import info.magnolia.cms.core.Content;
37  import info.magnolia.cms.filters.MgnlMainFilter;
38  import info.magnolia.module.InstallContext;
39  
40  import javax.jcr.RepositoryException;
41  import java.util.ArrayList;
42  import java.util.Arrays;
43  import java.util.Collection;
44  import java.util.Iterator;
45  import java.util.List;
46  
47  /**
48   * Orders a filter after a given set of other filters.
49   *
50   * @author gjoseph
51   * @version $Revision: $ ($Author: $)
52   */
53  public class FilterOrderingTask extends AbstractRepositoryTask {
54      private final String filterToBeOrderedName;
55      private final List<String> requiredFilters;
56  
57      /**
58       * 
59       * @param requiredFiltersBefore an array of filter names that must appear <strong>before</strong> the filter specified as filterName.
60       */
61      public FilterOrderingTask(String filterName, String[] requiredFiltersBefore) {
62          this(filterName, "Sets the new " + filterName + " in the proper place.", requiredFiltersBefore);
63      }
64  
65      public FilterOrderingTask(String filterName, String description, String[] requiredFiltersBefore) {
66          super("Setup " + filterName + " filter", description);
67          this.filterToBeOrderedName = filterName;
68          this.requiredFilters = new ArrayList<String>(Arrays.asList(requiredFiltersBefore));
69      }
70  
71      protected void doExecute(InstallContext ctx) throws RepositoryException, TaskExecutionException {
72          final Content filtersParent = ctx.getConfigHierarchyManager().getContent(MgnlMainFilter.SERVER_FILTERS);
73  
74          // assert filter exists // TODO : this does not take nested filters into account
75          if (!filtersParent.hasContent(filterToBeOrderedName)) {
76              throw new TaskExecutionException("Filter with name " + filterToBeOrderedName + " can't be found.");
77          }
78  
79          // TODO : this does not take nested filters into account
80          final Collection<Content> filters = filtersParent.getChildren();
81          final Iterator<Content> it = filters.iterator();
82          while (it.hasNext()) {
83              final Content filter = (Content) it.next();
84              final String filterName = filter.getName();
85  
86              // have we seen all filters yet ?
87              if (requiredFilters.size() == 0) {
88                  filtersParent.orderBefore(filterToBeOrderedName, filterName);
89                  return;
90              }
91  
92              // remove the filter we're iterating over: it's been seen
93              requiredFilters.remove(filterName);
94          }
95          ctx.warn("Could not sort filter "+filterToBeOrderedName+". It should be positioned after " + requiredFilters);
96      }
97  }