001: /*
002: * ====================================================================
003: * JAFFA - Java Application Framework For All
004: *
005: * Copyright (C) 2002 JAFFA Development Group
006: *
007: * This library is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU Lesser General Public
009: * License as published by the Free Software Foundation; either
010: * version 2.1 of the License, or (at your option) any later version.
011: *
012: * This library is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this library; if not, write to the Free Software
019: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020: *
021: * Redistribution and use of this software and associated documentation ("Software"),
022: * with or without modification, are permitted provided that the following conditions are met:
023: * 1. Redistributions of source code must retain copyright statements and notices.
024: * Redistributions must also contain a copy of this document.
025: * 2. Redistributions in binary form must reproduce the above copyright notice,
026: * this list of conditions and the following disclaimer in the documentation
027: * and/or other materials provided with the distribution.
028: * 3. The name "JAFFA" must not be used to endorse or promote products derived from
029: * this Software without prior written permission. For written permission,
030: * please contact mail to: jaffagroup@yahoo.com.
031: * 4. Products derived from this Software may not be called "JAFFA" nor may "JAFFA"
032: * appear in their names without prior written permission.
033: * 5. Due credit should be given to the JAFFA Project (http://jaffa.sourceforge.net).
034: *
035: * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
036: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
037: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
038: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
039: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
040: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
041: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
042: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
043: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
044: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
045: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
046: * SUCH DAMAGE.
047: * ====================================================================
048: */
049:
050: /*
051: * Loader.java
052: *
053: * Created on April 17, 2002, 11:53 AM
054: */
055:
056: package org.jaffa.presentation.portlet.component.componentdomain;
057:
058: import java.io.IOException;
059: import java.net.MalformedURLException;
060: import java.net.URL;
061: import java.util.HashMap;
062: import java.util.Iterator;
063: import java.util.List;
064: import javax.xml.bind.JAXBContext;
065: import javax.xml.bind.JAXBException;
066: import javax.xml.bind.Unmarshaller;
067: import org.apache.log4j.*;
068: import org.jaffa.config.Config;
069: import org.jaffa.presentation.portlet.component.ComponentDefinition;
070: import org.jaffa.util.URLHelper;
071: import org.jaffa.util.XmlHelper;
072:
073: /** This class is used to load the domain information from the Domain Objects based
074: * on the XML data, into definiion objects that can be used by the rest of the architecture
075: *
076: * @author paule
077: * @version 1.0
078: */
079: public class Loader {
080:
081: private static Logger log = Logger.getLogger(Loader.class);
082:
083: // If no property is specified in the framework.properties file, this is where the system
084: // will look for the components.xml file.
085: private static final String DEFAULT_COMPONENTS_LOCATION = "classpath:///resources/components.xml";
086:
087: /** Read in the xml component definitions. Used by the component manager to aquire
088: * all the component definitions. This abstracts the component manager from dealing with
089: * the specifics of where the definitions are held and in what format.
090: *
091: * @return Returns a HashMap where the key is the component name, and the value is a ComponentDefinition object
092: */
093: public synchronized static HashMap buildComponentPool() {
094: Components compList = null;
095: HashMap pool = new HashMap();
096:
097: String name = (String) Config.getProperty(
098: Config.PROP_COMPONENTS_FILE,
099: DEFAULT_COMPONENTS_LOCATION);
100:
101: if (log.isDebugEnabled())
102: log.debug("Loading in the Components Definition File - "
103: + name);
104: URL xmlFile = null;
105:
106: try {
107: xmlFile = URLHelper.newExtendedURL(name);
108: } catch (MalformedURLException e) {
109: log.fatal(
110: "Can't Find Components Definition File. Bad URL - "
111: + name, e);
112: return null;
113: }
114:
115: try {
116: // create a JAXBContext capable of handling classes generated into the package
117: JAXBContext jc = JAXBContext
118: .newInstance("org.jaffa.presentation.portlet.component.componentdomain");
119:
120: // create an Unmarshaller
121: Unmarshaller u = jc.createUnmarshaller();
122:
123: // enable validation
124: u.setValidating(true);
125:
126: // unmarshal a document into a tree of Java content objects composed of classes from the package.
127: compList = (Components) u.unmarshal(XmlHelper
128: .stripDoctypeDeclaration(xmlFile));
129: } catch (JAXBException e) {
130: log
131: .fatal(
132: "XML Formatting Error Reading Components Definition File",
133: e);
134: return null;
135: } catch (IOException e) {
136: log.fatal("Error in Reading Components Definition File", e);
137: return null;
138: }
139:
140: if (log.isDebugEnabled())
141: log.debug("Parsing the Components Definition File");
142:
143: // Now go through the component list and build a Map of Component Definitions
144: for (Iterator it = compList.getComponent().iterator(); it
145: .hasNext();) {
146: Component c = (Component) it.next();
147: ComponentDefinition cd = new ComponentDefinition();
148: cd.setComponentClass(c.getClassName());
149: cd.setComponentName(c.getId());
150: cd.setComponentType(c.getType());
151:
152: // Add it to the pool.
153: pool.put(cd.getComponentName(), cd);
154:
155: // Get the List of Mandatory Functions
156: List mf = c.getMandatoryFunction();
157: if (mf != null && mf.size() != 0) {
158: String[] a = new String[mf.size()];
159: int loop = 0;
160: for (Iterator it2 = mf.iterator(); it2.hasNext();) {
161: MandatoryFunction f = (MandatoryFunction) it2
162: .next();
163: a[loop++] = f.getName();
164: }
165: cd.setMandatoryFunctions(a);
166: }
167:
168: // Get the List of Optional Functions
169: List of = c.getOptionalFunction();
170: if (of != null && of.size() != 0) {
171: String[] a = new String[of.size()];
172: int loop = 0;
173: for (Iterator it2 = of.iterator(); it2.hasNext();) {
174: OptionalFunction f = (OptionalFunction) it2.next();
175: a[loop++] = f.getName();
176: }
177: cd.setOptionalFunctions(a);
178: }
179:
180: if (log.isDebugEnabled())
181: log.debug("Load Component : " + cd.getComponentName());
182:
183: }
184: // return the constructed list
185: return pool;
186: }
187:
188: }
|