001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019 package org.apache.felix.framework.searchpolicy; 020 021 import java.net.URL; 022 import java.util.Enumeration; 023 024 import org.apache.felix.framework.util.Util; 025 import org.apache.felix.framework.util.manifestparser.Capability; 026 import org.apache.felix.moduleloader.*; 027 028 public class R4Wire implements IWire 029 { 030 private final IModule m_importer; 031 private final IRequirement m_requirement; 032 private final IModule m_exporter; 033 private final ICapability m_capability; 034 035 public R4Wire(IModule importer, IRequirement requirement, 036 IModule exporter, ICapability capability) 037 { 038 m_importer = importer; 039 m_requirement = requirement; 040 m_exporter = exporter; 041 m_capability = capability; 042 } 043 044 /* (non-Javadoc) 045 * @see org.apache.felix.framework.searchpolicy.IWire#getImporter() 046 */ 047 public IModule getImporter() 048 { 049 return m_importer; 050 } 051 052 /* (non-Javadoc) 053 * @see org.apache.felix.framework.searchpolicy.IWire#getRequirement() 054 */ 055 public IRequirement getRequirement() 056 { 057 return m_requirement; 058 } 059 060 /* (non-Javadoc) 061 * @see org.apache.felix.framework.searchpolicy.IWire#getExporter() 062 */ 063 public IModule getExporter() 064 { 065 return m_exporter; 066 } 067 068 /* (non-Javadoc) 069 * @see org.apache.felix.framework.searchpolicy.IWire#getCapability() 070 */ 071 public ICapability getCapability() 072 { 073 return m_capability; 074 } 075 076 /* (non-Javadoc) 077 * @see org.apache.felix.framework.searchpolicy.IWire#getClass(java.lang.String) 078 */ 079 public boolean hasPackage(String pkgName) 080 { 081 return (m_capability.getNamespace().equals(ICapability.PACKAGE_NAMESPACE) && 082 m_capability.getProperties().get(ICapability.PACKAGE_PROPERTY).equals(pkgName)); 083 } 084 085 /* (non-Javadoc) 086 * @see org.apache.felix.framework.searchpolicy.IWire#getClass(java.lang.String) 087 */ 088 public Class getClass(String name) throws ClassNotFoundException 089 { 090 Class clazz = null; 091 092 // Get the package of the target class. 093 String pkgName = Util.getClassPackage(name); 094 095 // Only check when the package of the target class is 096 // the same as the package for the wire. 097 if (m_capability.getNamespace().equals(ICapability.PACKAGE_NAMESPACE) && 098 m_capability.getProperties().get(ICapability.PACKAGE_PROPERTY).equals(pkgName)) 099 { 100 // Check the include/exclude filters from the target package 101 // to make sure that the class is actually visible. We delegate 102 // to the exporting module, rather than its content, so it can 103 // it can follow any internal wires it may have (e.g., if the 104 // package has multiple sources). 105 if (m_capability.getNamespace().equals(ICapability.PACKAGE_NAMESPACE) 106 && ((Capability) m_capability).isIncluded(name)) 107 { 108 clazz = m_exporter.getClassByDelegation(name); 109 } 110 111 // If no class was found, then we must throw an exception 112 // since the exporter for this package did not contain the 113 // requested class. 114 if (clazz == null) 115 { 116 throw new ClassNotFoundException(name); 117 } 118 } 119 120 return clazz; 121 } 122 123 /* (non-Javadoc) 124 * @see org.apache.felix.framework.searchpolicy.IWire#getResource(java.lang.String) 125 */ 126 public URL getResource(String name) throws ResourceNotFoundException 127 { 128 URL url = null; 129 130 // Get the package of the target class. 131 String pkgName = Util.getResourcePackage(name); 132 133 // Only check when the package of the target resource is 134 // the same as the package for the wire. 135 if (m_capability.getNamespace().equals(ICapability.PACKAGE_NAMESPACE) && 136 m_capability.getProperties().get(ICapability.PACKAGE_PROPERTY).equals(pkgName)) 137 { 138 // Delegate to the exporting module, rather than its 139 // content, so that it can follow any internal wires it may have 140 // (e.g., if the package has multiple sources). 141 url = m_exporter.getResourceByDelegation(name); 142 143 // If no resource was found, then we must throw an exception 144 // since the exporter for this package did not contain the 145 // requested class. 146 if (url == null) 147 { 148 throw new ResourceNotFoundException(name); 149 } 150 } 151 152 return url; 153 } 154 155 /* (non-Javadoc) 156 * @see org.apache.felix.framework.searchpolicy.IWire#getResources(java.lang.String) 157 */ 158 public Enumeration getResources(String name) throws ResourceNotFoundException 159 { 160 Enumeration urls = null; 161 162 // Get the package of the target class. 163 String pkgName = Util.getResourcePackage(name); 164 165 // Only check when the package of the target resource is 166 // the same as the package for the wire. 167 if (m_capability.getNamespace().equals(ICapability.PACKAGE_NAMESPACE) && 168 m_capability.getProperties().get(ICapability.PACKAGE_PROPERTY).equals(pkgName)) 169 { 170 urls = m_exporter.getResourcesByDelegation(name); 171 172 // If no resource was found, then we must throw an exception 173 // since the exporter for this package did not contain the 174 // requested class. 175 if (urls == null) 176 { 177 throw new ResourceNotFoundException(name); 178 } 179 } 180 181 return urls; 182 } 183 184 public String toString() 185 { 186 if (m_capability.getNamespace().equals(ICapability.PACKAGE_NAMESPACE)) 187 { 188 return m_importer + " -> " 189 + m_capability.getProperties().get(ICapability.PACKAGE_PROPERTY) 190 + " -> " + m_exporter; 191 } 192 return m_importer + " -> " + m_capability + " -> " + m_exporter; 193 } 194 }