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
041 /**
042 *
043 *
044 * @version $Rev: 476049 $ $Date: 2006-11-16 23:35:17 -0500 (Thu, 16 Nov 2006) $
045 */
046 public abstract class AbstractDeployable implements DeployableObject {
047 private final URL moduleURL;
048 private final ModuleType type;
049 private final DDBeanRoot root;
050 private final ClassLoader rootCL;
051 private final List entries;
052
053 protected AbstractDeployable(ModuleType type, URL moduleURL, String rootDD) throws DDBeanCreateException {
054 this.type = type;
055 this.moduleURL = moduleURL;
056 rootCL = new URLClassLoader(new URL[] {moduleURL}, Thread.currentThread().getContextClassLoader());
057 root = new DDBeanRootImpl(this, rootCL.getResource(rootDD));
058
059 // @todo make this work with unpacked
060 entries = new ArrayList();
061 InputStream is = null;
062 try {
063 is = moduleURL.openStream();
064 ZipInputStream zis = new ZipInputStream(new BufferedInputStream(is));
065 ZipEntry entry;
066 while ((entry = zis.getNextEntry()) != null) {
067 entries.add(entry.getName());
068 }
069 } catch (IOException e) {
070 throw (DDBeanCreateException) new DDBeanCreateException("Unable to create list of entries").initCause(e);
071 } finally {
072 if (is != null) {
073 try {
074 is.close();
075 } catch (IOException e1) {
076 // ignore
077 }
078 }
079 }
080 }
081
082 public ModuleType getType() {
083 return type;
084 }
085
086 public DDBeanRoot getDDBeanRoot() {
087 return root;
088 }
089
090 public DDBeanRoot getDDBeanRoot(String filename) throws FileNotFoundException, DDBeanCreateException {
091 try {
092 return new DDBeanRootImpl(null, new URL(moduleURL, filename));
093 } catch (MalformedURLException e) {
094 throw (DDBeanCreateException) new DDBeanCreateException("Unable to construct URL for "+filename).initCause(e);
095 }
096 }
097
098 public DDBean[] getChildBean(String xpath) {
099 return root.getChildBean(xpath);
100 }
101
102 public String[] getText(String xpath) {
103 return root.getText(xpath);
104 }
105
106 public Enumeration entries() {
107 return Collections.enumeration(entries);
108 }
109
110 public InputStream getEntry(String name) {
111 return rootCL.getResourceAsStream(name);
112 }
113
114 protected ClassLoader getModuleLoader() {
115 return rootCL;
116 }
117
118 public Class getClassFromScope(String className) {
119 try {
120 return getModuleLoader().loadClass(className);
121 } catch (ClassNotFoundException e) {
122 // spec does not allow an Exception
123 return null;
124 }
125 }
126
127 public String getModuleDTDVersion() {
128 throw new UnsupportedOperationException();
129 }
130 }