1/*******************************************************************************
2 * Copyright (c) 2011 Google, Inc.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 *    Google, Inc. - initial API and implementation
10 *******************************************************************************/
11package org.eclipse.wb.internal.core.model.property.category;
12
13import org.eclipse.wb.internal.core.model.property.Property;
14import org.eclipse.wb.internal.core.model.property.PropertyManager;
15
16/**
17 * Factory for {@link PropertyCategoryProvider} instances.
18 *
19 * @author scheglov_ke
20 * @coverage core.model.property
21 */
22public final class PropertyCategoryProviders {
23  ////////////////////////////////////////////////////////////////////////////
24  //
25  // Simple providers
26  //
27  ////////////////////////////////////////////////////////////////////////////
28  private static final PropertyCategoryProvider FROM_PROPERTY = new PropertyCategoryProvider() {
29    public PropertyCategory getCategory(Property property) {
30      return property.getCategory();
31    }
32  };
33
34  /**
35   * Returns result of {@link Property#getCategory()}, never <code>null</code>.
36   */
37  public static PropertyCategoryProvider fromProperty() {
38    return FROM_PROPERTY;
39  }
40
41  private static final PropertyCategoryProvider FORCED_BY_USER = new PropertyCategoryProvider() {
42    public PropertyCategory getCategory(Property property) {
43      return PropertyManager.getCategoryForced(property);
44    }
45  };
46
47  /**
48   * Returns category forced by user, may be <code>null</code>.
49   */
50  public static PropertyCategoryProvider forcedByUser() {
51    return FORCED_BY_USER;
52  }
53
54  ////////////////////////////////////////////////////////////////////////////
55  //
56  // Compound
57  //
58  ////////////////////////////////////////////////////////////////////////////
59  /**
60   * Returns first not <code>null</code> category returned by provider.
61   */
62  public static PropertyCategoryProvider combine(final PropertyCategoryProvider... providers) {
63    return new PropertyCategoryProvider() {
64      public PropertyCategory getCategory(Property property) {
65        for (PropertyCategoryProvider provider : providers) {
66          PropertyCategory category = provider.getCategory(property);
67          if (category != null) {
68            return category;
69          }
70        }
71        throw new IllegalStateException("Can not provide category for " + property.getTitle());
72      }
73    };
74  }
75
76  private static final PropertyCategoryProvider DEF = combine(forcedByUser(), fromProperty());
77
78  /**
79   * Returns the default combination of {@link PropertyCategoryProvider}s - first
80   * {@link #forcedByUser()}, then {@link #fromProperty()}.
81   */
82  public static PropertyCategoryProvider def() {
83    return DEF;
84  }
85}
86