Felix Meschberger | 85a69e2 | 2010-02-18 11:01:46 +0000 | [diff] [blame] | 1 | /* |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 2 | * Licensed to the Apache Software Foundation (ASF) under one |
| 3 | * or more contributor license agreements. See the NOTICE file |
| 4 | * distributed with this work for additional information |
| 5 | * regarding copyright ownership. The ASF licenses this file |
| 6 | * to you under the Apache License, Version 2.0 (the |
| 7 | * "License"); you may not use this file except in compliance |
| 8 | * with the License. You may obtain a copy of the License at |
| 9 | * |
| 10 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 11 | * |
| 12 | * Unless required by applicable law or agreed to in writing, |
| 13 | * software distributed under the License is distributed on an |
| 14 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| 15 | * KIND, either express or implied. See the License for the |
| 16 | * specific language governing permissions and limitations |
| 17 | * under the License. |
| 18 | */ |
| 19 | package org.apache.felix.metatype; |
| 20 | |
| 21 | |
| 22 | import java.net.URL; |
Jan Willem Janssen | 32244a4 | 2015-02-18 12:39:54 +0000 | [diff] [blame] | 23 | import java.util.ArrayList; |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 24 | import java.util.Collections; |
| 25 | import java.util.Enumeration; |
| 26 | import java.util.HashMap; |
Jan Willem Janssen | 32244a4 | 2015-02-18 12:39:54 +0000 | [diff] [blame] | 27 | import java.util.List; |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 28 | import java.util.Map; |
Felix Meschberger | 18000d9 | 2010-02-18 11:08:38 +0000 | [diff] [blame] | 29 | import java.util.TreeSet; |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 30 | |
| 31 | import org.apache.felix.metatype.internal.LocalizedObjectClassDefinition; |
| 32 | import org.apache.felix.metatype.internal.l10n.BundleResources; |
| 33 | import org.apache.felix.metatype.internal.l10n.Resources; |
| 34 | import org.osgi.framework.Bundle; |
| 35 | import org.osgi.framework.Constants; |
| 36 | import org.osgi.service.metatype.MetaTypeProvider; |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 37 | import org.osgi.service.metatype.ObjectClassDefinition; |
| 38 | |
| 39 | |
| 40 | /** |
| 41 | * The <code>DefaultMetaTypeProvider</code> class is an implementation of the |
Jan Willem Janssen | 998f269 | 2016-02-04 16:10:34 +0000 | [diff] [blame^] | 42 | * <code>MetaTypeProvider</code> interface which is configured for a given |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 43 | * bundle using a {@link MetaData} object. |
| 44 | * <p> |
| 45 | * This class may be used by clients, e.g. <code>ManagedService</code> or |
| 46 | * <code>ManagedServiceFactory</code> implementations to easily also implement |
Felix Meschberger | 85a69e2 | 2010-02-18 11:01:46 +0000 | [diff] [blame] | 47 | * the <code>MetaTypeProvider</code> interface. |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 48 | * |
Richard S. Hall | 3bc8afd | 2009-08-12 19:03:19 +0000 | [diff] [blame] | 49 | * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a> |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 50 | */ |
| 51 | public class DefaultMetaTypeProvider implements MetaTypeProvider |
| 52 | { |
| 53 | |
| 54 | private final Bundle bundle; |
Felix Meschberger | ef2b998 | 2008-06-16 11:43:01 +0000 | [diff] [blame] | 55 | private final String localePrefix; |
Felix Meschberger | 85a69e2 | 2010-02-18 11:01:46 +0000 | [diff] [blame] | 56 | |
Jan Willem Janssen | 32244a4 | 2015-02-18 12:39:54 +0000 | [diff] [blame] | 57 | private Map /* <String, OCD> */ objectClassDefinitions; |
| 58 | private List /* <Designate> */ designates; |
Felix Meschberger | 18000d9 | 2010-02-18 11:08:38 +0000 | [diff] [blame] | 59 | private String[] locales; |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 60 | |
| 61 | |
| 62 | public DefaultMetaTypeProvider( Bundle bundle, MetaData metadata ) |
| 63 | { |
| 64 | this.bundle = bundle; |
| 65 | |
| 66 | // copy from holder |
| 67 | if ( metadata.getObjectClassDefinitions() == null ) |
| 68 | { |
| 69 | objectClassDefinitions = Collections.EMPTY_MAP; |
| 70 | } |
| 71 | else |
| 72 | { |
| 73 | Map copy = new HashMap( metadata.getObjectClassDefinitions() ); |
| 74 | objectClassDefinitions = Collections.unmodifiableMap( copy ); |
| 75 | } |
| 76 | if ( metadata.getDesignates() == null ) |
| 77 | { |
Jan Willem Janssen | 32244a4 | 2015-02-18 12:39:54 +0000 | [diff] [blame] | 78 | designates = Collections.EMPTY_LIST; |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 79 | } |
| 80 | else |
| 81 | { |
Jan Willem Janssen | 32244a4 | 2015-02-18 12:39:54 +0000 | [diff] [blame] | 82 | List copy = new ArrayList( metadata.getDesignates() ); |
| 83 | designates = Collections.unmodifiableList( copy ); |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 84 | } |
| 85 | |
Felix Meschberger | ef2b998 | 2008-06-16 11:43:01 +0000 | [diff] [blame] | 86 | String metaDataLocalePrefix = metadata.getLocalePrefix(); |
| 87 | if ( metaDataLocalePrefix == null ) |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 88 | { |
Felix Meschberger | ef2b998 | 2008-06-16 11:43:01 +0000 | [diff] [blame] | 89 | metaDataLocalePrefix = ( String ) bundle.getHeaders().get( Constants.BUNDLE_LOCALIZATION ); |
| 90 | if ( metaDataLocalePrefix == null ) |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 91 | { |
Felix Meschberger | ef2b998 | 2008-06-16 11:43:01 +0000 | [diff] [blame] | 92 | metaDataLocalePrefix = Constants.BUNDLE_LOCALIZATION_DEFAULT_BASENAME; |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 93 | } |
| 94 | } |
Felix Meschberger | ef2b998 | 2008-06-16 11:43:01 +0000 | [diff] [blame] | 95 | this.localePrefix = metaDataLocalePrefix; |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 96 | } |
| 97 | |
| 98 | |
| 99 | /** |
| 100 | * Returns the <code>Bundle</code> to which this instance belongs. |
| 101 | */ |
| 102 | public Bundle getBundle() |
| 103 | { |
| 104 | return bundle; |
| 105 | } |
| 106 | |
| 107 | |
| 108 | /* (non-Javadoc) |
| 109 | * @see org.osgi.service.metatype.MetaTypeProvider#getLocales() |
| 110 | */ |
| 111 | public String[] getLocales() |
| 112 | { |
| 113 | if ( locales == null ) |
| 114 | { |
| 115 | String path; |
| 116 | String pattern; |
| 117 | int lastSlash = localePrefix.lastIndexOf( '/' ); |
| 118 | if ( lastSlash < 0 ) |
| 119 | { |
| 120 | path = "/"; |
| 121 | pattern = localePrefix; |
| 122 | } |
| 123 | else |
| 124 | { |
| 125 | path = localePrefix.substring( 0, lastSlash ); |
| 126 | pattern = localePrefix.substring( lastSlash + 1 ); |
| 127 | } |
| 128 | |
Felix Meschberger | 18000d9 | 2010-02-18 11:08:38 +0000 | [diff] [blame] | 129 | TreeSet localeSet = new TreeSet(); |
Felix Meschberger | 3c219fa | 2011-02-24 09:39:03 +0000 | [diff] [blame] | 130 | |
| 131 | Enumeration entries = getBundle().findEntries( path, pattern + "*.properties", false ); |
| 132 | if ( entries != null ) |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 133 | { |
Felix Meschberger | 3c219fa | 2011-02-24 09:39:03 +0000 | [diff] [blame] | 134 | while ( entries.hasMoreElements() ) |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 135 | { |
Felix Meschberger | 3c219fa | 2011-02-24 09:39:03 +0000 | [diff] [blame] | 136 | URL url = ( URL ) entries.nextElement(); |
| 137 | String name = url.getPath(); |
| 138 | name = name.substring( name.lastIndexOf( '/' ) + 1 + pattern.length(), name.length() |
| 139 | - ".properties".length() ); |
| 140 | if ( name.startsWith( "_" ) ) |
| 141 | { |
| 142 | name = name.substring( 1 ); |
| 143 | } |
| 144 | if ( name.length() > 0 ) |
| 145 | { |
| 146 | localeSet.add( name ); |
| 147 | } |
Felix Meschberger | 85a69e2 | 2010-02-18 11:01:46 +0000 | [diff] [blame] | 148 | } |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 149 | } |
Felix Meschberger | 18000d9 | 2010-02-18 11:08:38 +0000 | [diff] [blame] | 150 | |
| 151 | locales = ( String[] ) localeSet.toArray( new String[localeSet.size()] ); |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 152 | } |
| 153 | |
Felix Meschberger | 18000d9 | 2010-02-18 11:08:38 +0000 | [diff] [blame] | 154 | return ( locales.length == 0 ) ? null : locales; |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 155 | } |
| 156 | |
| 157 | |
| 158 | /* (non-Javadoc) |
| 159 | * @see org.osgi.service.metatype.MetaTypeProvider#getObjectClassDefinition(java.lang.String, java.lang.String) |
| 160 | */ |
| 161 | public ObjectClassDefinition getObjectClassDefinition( String id, String locale ) |
| 162 | { |
| 163 | Designate designate = getDesignate( id ); |
| 164 | if ( designate == null || designate.getObject() == null ) |
| 165 | { |
| 166 | return null; |
| 167 | } |
| 168 | |
| 169 | String ocdRef = designate.getObject().getOcdRef(); |
| 170 | OCD ocd = ( OCD ) objectClassDefinitions.get( ocdRef ); |
| 171 | if ( ocd == null ) |
| 172 | { |
| 173 | return null; |
| 174 | } |
| 175 | |
| 176 | Resources resources = BundleResources.getResources( bundle, localePrefix, locale ); |
| 177 | return new LocalizedObjectClassDefinition( bundle, ocd, resources ); |
| 178 | } |
| 179 | |
Jan Willem Janssen | 32244a4 | 2015-02-18 12:39:54 +0000 | [diff] [blame] | 180 | public Designate getDesignate(String pid) |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 181 | { |
Jan Willem Janssen | 32244a4 | 2015-02-18 12:39:54 +0000 | [diff] [blame] | 182 | int size = this.designates.size(); |
| 183 | for (int i = 0; i < size; i++) |
| 184 | { |
| 185 | Designate designate = (Designate) this.designates.get(i); |
| 186 | String factoryPid = designate.getFactoryPid(); |
| 187 | if (factoryPid != null && pid.equals(factoryPid)) |
| 188 | { |
| 189 | return designate; |
| 190 | } |
| 191 | else if (factoryPid == null && pid.equals(designate.getPid())) |
| 192 | { |
| 193 | return designate; |
| 194 | } |
| 195 | } |
| 196 | return null; |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 197 | } |
Felix Meschberger | 85a69e2 | 2010-02-18 11:01:46 +0000 | [diff] [blame] | 198 | |
Jan Willem Janssen | 32244a4 | 2015-02-18 12:39:54 +0000 | [diff] [blame] | 199 | protected Map /* <String, OCD> */ getObjectClassDefinitions() |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 200 | { |
| 201 | return objectClassDefinitions; |
| 202 | } |
| 203 | |
Jan Willem Janssen | 32244a4 | 2015-02-18 12:39:54 +0000 | [diff] [blame] | 204 | protected List /* <Designate> */ getDesignates() |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 205 | { |
| 206 | return designates; |
| 207 | } |
Felix Meschberger | cb7c1e7 | 2007-04-11 18:27:12 +0000 | [diff] [blame] | 208 | } |