blob: 97cda1a38f558600aefd1f2bf68a62490fe6ef66 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.j2ee.internal.codegen;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.jst.j2ee.internal.xml.GeneralXmlDocumentReader;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* An instance of this class contains and resolves the mapping of generator logical names to
* generator instances.
*/
class GeneratorDictionary {
private Map fDictionary = null;
private ClassLoader classLoader;
private static final String PATH_SEPARATOR = "/";//$NON-NLS-1$
private static final String CODEGEN_DICT_NODE_NAME = "CodegenDictionary";//$NON-NLS-1$
private static final String INCLUDE_NODE_NAME = "include";//$NON-NLS-1$
private static final String HREF_NODE_NAME = "href";//$NON-NLS-1$
private static final String GENERATOR_NODE_NAME = "generator";//$NON-NLS-1$
private static final String GENERATOR_NAME_ITEM_NAME = "name";//$NON-NLS-1$
private static final String GENERATOR_CODE_ITEM_NAME = "code";//$NON-NLS-1$
private static final String TEXT_NODE_NAME = "#text";//$NON-NLS-1$
private static final String COMMENT_NODE_NAME = "#comment";//$NON-NLS-1$
/**
* The constructor uses the specified class to find the corrent class loader for this generation
* run (the plugin class loader for the plugin where the generation is initiated). The
* dictionary name is the name of a plugin resource file in the plugin for the obtained loader.
* The file must be a xml file that contains logical name to class name mappings of the form:
* <code>
* <br>&nbsp;&nbsp;&nbsp;&lt;?xml version="1.0"?&gt;
* <br>&nbsp;&nbsp;&nbsp;&lt;ejbcreationDictionary&gt;
* <br>&nbsp;&nbsp;&nbsp;&lt;generator name= "SessionGenerator" code="org.eclipse.jst.j2ee.internal.internal.ejb.codegen.SessionGenerator"/&gt;
* <br>&nbsp;&nbsp;&nbsp;&lt;generator name= "EntityGenerator" code="org.eclipse.jst.j2ee.internal.internal.ejb.codegen.EntityGenerator"/&gt;
* <br>&nbsp;&nbsp;&nbsp;&lt;generator name= "CMPEntityGenerator" code="org.eclipse.jst.j2ee.internal.internal.ejb.codegen.CMPEntityGenerator"/&gt;
* <br>&nbsp;&nbsp;&nbsp;&lt;/ejbcreationDictionary&gt;
* </code>
*/
public GeneratorDictionary(String dictionaryName, ClassLoader loader) throws java.io.FileNotFoundException {
super();
fDictionary = new HashMap();
this.classLoader = loader;
parseFile(dictionaryName);
}
/**
* Returns the an instance of the generator class referred to by the logical generator name.
*
* @return Generator
*/
public Generator get(String logicalName) throws GeneratorNotFoundException {
Generator result = null;
try {
// Get the class or class name
Class genClass = ((GeneratorDictionaryEntry) fDictionary.get(logicalName)).getGenClass(classLoader);
// Create a new instance to return
result = (Generator) genClass.newInstance();
} catch (Exception x) {
throw new GeneratorNotFoundException(logicalName);
}
return result;
}
private void parseFile(String filename) throws FileNotFoundException {
InputStream is = classLoader.getResourceAsStream(filename);
if (is == null)
is = classLoader.getResourceAsStream(PATH_SEPARATOR + filename);
if (is == null)
is = new FileInputStream(filename);
try {
GeneralXmlDocumentReader reader = new GeneralXmlDocumentReader();
reader.setInputSource(new org.xml.sax.InputSource(is));
Element root = reader.getDocument().getDocumentElement();
// get elements under the document root (ie import and class)
NodeList elements = root.getChildNodes();
for (int i = 0; i < elements.getLength(); i++) {
Node node = elements.item(i);
if (node.getNodeName().equalsIgnoreCase(CODEGEN_DICT_NODE_NAME)) {
processDictionary(node.getChildNodes());
} else if (node.getNodeName().equalsIgnoreCase(INCLUDE_NODE_NAME)) {
NamedNodeMap map = node.getAttributes();
Node filenode = map.getNamedItem(HREF_NODE_NAME);
String nestedFile = filenode.getNodeValue();
parseFile(nestedFile);
} else if (node.getNodeName().equalsIgnoreCase(GENERATOR_NODE_NAME)) {
NamedNodeMap map = node.getAttributes();
String generatorName = map.getNamedItem(GENERATOR_NAME_ITEM_NAME).getNodeValue();
String generatorCode = map.getNamedItem(GENERATOR_CODE_ITEM_NAME).getNodeValue();
fDictionary.put(generatorName, new GeneratorDictionaryEntry(generatorCode));
} else if (node.getNodeName().equals(TEXT_NODE_NAME))
; // do nothing
else if (node.getNodeName().equals(COMMENT_NODE_NAME))
; // do nothing
else
; // do nothing
// System.out.println("Ignoring unrecognized element: "+node.getNodeName());
}
} catch (Exception x) {
x.printStackTrace();
throw new FileNotFoundException(filename);
}
}
private void processDictionary(NodeList elements) {
}
}