001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package org.apache.geronimo.deployment.tools.loader;
019
020 import java.io.BufferedInputStream;
021 import java.io.FileNotFoundException;
022 import java.io.IOException;
023 import java.io.InputStream;
024 import java.net.MalformedURLException;
025 import java.net.URL;
026 import java.net.URLClassLoader;
027 import java.util.ArrayList;
028 import java.util.Collections;
029 import java.util.Enumeration;
030 import java.util.List;
031 import java.util.zip.ZipEntry;
032 import java.util.zip.ZipInputStream;
033 import javax.enterprise.deploy.model.DDBean;
034 import javax.enterprise.deploy.model.DDBeanRoot;
035 import javax.enterprise.deploy.model.DeployableObject;
036 import javax.enterprise.deploy.model.exceptions.DDBeanCreateException;
037 import javax.enterprise.deploy.shared.ModuleType;
038
039 import org.apache.geronimo.deployment.tools.DDBeanRootImpl;
040 import org.apache.geronimo.kernel.classloader.UrlResourceFinder;
041 import org.apache.geronimo.kernel.config.MultiParentClassLoader;
042
043 /**
044 *
045 *
046 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
047 */
048 public abstract class AbstractDeployable implements DeployableObject {
049 private final URL moduleURL;
050 private final ModuleType type;
051 private final DDBeanRoot root;
052 private final ClassLoader rootCL;
053 private final List entries;
054
055 protected AbstractDeployable(ModuleType type, URL moduleURL, String rootDD) throws DDBeanCreateException {
056 this.type = type;
057 this.moduleURL = moduleURL;
058 rootCL = new URLClassLoader(new URL[] {moduleURL}, Thread.currentThread().getContextClassLoader());
059 UrlResourceFinder resourceFinder = new UrlResourceFinder(new URL[] {moduleURL});
060 root = new DDBeanRootImpl(this, resourceFinder.findResource(rootDD));
061
062 // @todo make this work with unpacked
063 entries = new ArrayList();
064 InputStream is = null;
065 try {
066 is = moduleURL.openStream();
067 ZipInputStream zis = new ZipInputStream(new BufferedInputStream(is));
068 ZipEntry entry;
069 while ((entry = zis.getNextEntry()) != null) {
070 entries.add(entry.getName());
071 }
072 } catch (IOException e) {
073 throw (DDBeanCreateException) new DDBeanCreateException("Unable to create list of entries").initCause(e);
074 } finally {
075 if (is != null) {
076 try {
077 is.close();
078 } catch (IOException e1) {
079 // ignore
080 }
081 }
082 }
083 }
084
085 public ModuleType getType() {
086 return type;
087 }
088
089 public DDBeanRoot getDDBeanRoot() {
090 return root;
091 }
092
093 public DDBeanRoot getDDBeanRoot(String filename) throws FileNotFoundException, DDBeanCreateException {
094 try {
095 return new DDBeanRootImpl(null, new URL(moduleURL, filename));
096 } catch (MalformedURLException e) {
097 throw (DDBeanCreateException) new DDBeanCreateException("Unable to construct URL for "+filename).initCause(e);
098 }
099 }
100
101 public DDBean[] getChildBean(String xpath) {
102 return root.getChildBean(xpath);
103 }
104
105 public String[] getText(String xpath) {
106 return root.getText(xpath);
107 }
108
109 public Enumeration entries() {
110 return Collections.enumeration(entries);
111 }
112
113 public InputStream getEntry(String name) {
114 return rootCL.getResourceAsStream(name);
115 }
116
117 protected ClassLoader getModuleLoader() {
118 return rootCL;
119 }
120
121 public Class getClassFromScope(String className) {
122 try {
123 return getModuleLoader().loadClass(className);
124 } catch (ClassNotFoundException e) {
125 // spec does not allow an Exception
126 return null;
127 }
128 }
129
130 public String getModuleDTDVersion() {
131 throw new UnsupportedOperationException();
132 }
133 }