|
What this is
Other links
The source code
/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2001 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.j2ee.deployment.config;
import javax.enterprise.deploy.model.*;
import javax.enterprise.deploy.spi.exceptions.ConfigurationException;
import org.netbeans.modules.j2ee.deployment.plugins.api.*;
import org.netbeans.modules.j2ee.deployment.impl.Server;
import org.netbeans.modules.schema2beans.*;
import org.openide.ErrorManager;
import org.openide.nodes.Sheet;
import java.io.Writer;
import java.io.StringWriter;
import java.util.*;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
abstract public class DDCommon implements DDBean {
StandardDDImpl container;
DDCommon parent = null;
final BaseBean bean;
final String xpath;
final String dtdname;
final ModuleDeploymentSupport support;
final Set configBeans = new HashSet();
final Set childBeans = new HashSet();
// must know about its STandardDDImpl to pass to ConfigBeanStorage
DDCommon(DDCommon copy) {
this(copy.parent,copy.bean,copy.support,copy.xpath);
configBeans.addAll(copy.configBeans);
}
DDCommon(DDCommon parent, BaseBean bean, ModuleDeploymentSupport support, String dtdname) {
this.parent = parent;
this.bean = bean;
this.dtdname = dtdname;
this.xpath = ((parent == null) ? "" : parent.xpath) + "/" + dtdname; // NOI18N
this.support = support;
if(parent != null) parent.addChild(this);
}
void addChild(DDCommon bean) {
childBeans.add(bean);
}
void removeChild(DDCommon bean) {
childBeans.remove(bean);
}
// find the DDBean which is a child of this DDBean that has the
// given corresponding BaseBean. If there is no such DDBean, return
// null
DDCommon findChild(BaseBean bean) {
for(Iterator i = childBeans.iterator();i.hasNext(); ) {
DDCommon child = (DDCommon) i.next();
if(child.bean == bean) return child;
}
return null;
}
final public String getXpath() {
return xpath;
}
final public DDBeanRoot getRoot() {
DDCommon root = this;
while(root.parent != null) root = root.parent;
return (DDRoot) support.getBean(root.bean);
}
final public DDBean[] getChildBean(String xpath) {
return getChildrenImpl(xpath);
}
public String getText() {
Writer w = new StringWriter();
try {
bean.writeNode(w);
} catch (Exception e) {
}
return w.toString();
}
final public String[] getText(String xpath) {
StandardDDImpl[] dds = getChildrenImpl(xpath);
if(dds == null) return null;
String[] ret = new String[dds.length];
for(int i = 0; i < dds.length; i++)
ret[i] = dds[i].proxy.getText();
return ret;
}
final private StandardDDImpl[] getChildrenImpl(String xpath) {
// System.out.println("Starting search with " + xpath);
xpath = ModuleDeploymentSupport.normalizePath(xpath);
// System.out.println("Now " + xpath);
DDCommon searchRoot = this;
if(xpath == null || xpath.equals("") || xpath.equals(".")) // NOI18N
return new StandardDDImpl[] { container };
if(xpath.startsWith("/")) { // NOI18N
searchRoot = ((DDRoot)getRoot()).proxy;
xpath = xpath.substring(xpath.indexOf("/") + 1); // NOI18N
}
else if (xpath.equals("..")) {
if(parent == null) return null;
else return new StandardDDImpl[] { parent.container };
}
else while (xpath.startsWith("../") && searchRoot != null) {
searchRoot = searchRoot.parent;
xpath = xpath.substring(3);
}
Collection ret = searchRoot.search(xpath,true);
StandardDDImpl[] arr = new StandardDDImpl[ret.size()];
ret.toArray(arr);
return arr;
}
Collection search(String xpath,boolean addCurrent) {
Collection ret = new LinkedList();
int index = xpath.indexOf("/"); // NOI18N
String fragment = index < 0 ? xpath : xpath.substring(0,index);
if(isProxy()) {
// find all children manually
BeanProp prop = bean.beanProp(fragment);
if(prop != null) {
String remainder = index < 0 ? "" : xpath.substring(index); // NOI18N
if(prop.isIndexed()) {
Object[] values = prop.getValues();
for(int i = 0; i < values.length; i++) {
DDCommon ddc = prop.isBean() ? support.getBean((BaseBean) values[i]).proxy
: support.getBean(prop,i).proxy;
ret.addAll(ddc.search(remainder,true));
}
} else {
DDCommon ddc = prop.isBean() ? support.getBean(prop.getBean()).proxy
: support.getBean(prop,-1).proxy;
ret.addAll(ddc.search(remainder,true));
}
}
} else if(addCurrent) {
DDParser parser = new DDParser(bean,xpath);
while(parser.hasNext()) {
Object current = parser.next();
DDParser.DDLocation location = parser.getLocation();
if(location.isNode()) {
BaseBean currentBean = (BaseBean) current;
ret.add(support.getBean(currentBean));
}
else {
ret.add(support.getBean(
location.getRoot().getProperty(location.getName()),
location.getIndex()));
}
}
}
if(index < 0) return ret;
// PENDING optimization - keep a semaphore recording whether
// or not there are any children proxies, if not you can
// skip this loop
for(Iterator i = childBeans.iterator(); i.hasNext() ; ) {
DDCommon ddc = (DDCommon) i.next();
if(ddc.dtdname.equals(fragment))
ret.addAll(ddc.search(xpath.substring(index),false));
}
return ret;
}
boolean isProxy() {
return false;
}
public void addXpathListener(String xpath,XpathListener listener) {
support.addXpathListener(this,xpath,listener);
}
public void removeXpathListener(String xpath,XpathListener listener) {
support.addXpathListener(this,xpath,listener);
}
public int hashCode() {
return bean.hashCode();
}
/* Must be overridden in subclasses, and super.equals(o) must be
part of the computation. */
public boolean equals(Object o) {
if(o instanceof DDCommon)
return ((DDCommon)o).bean == bean;
return false;
}
void fireEvent(XpathEvent xe) {
// System.out.println("Got event " + xe + " at " + this);
if(xe.isChangeEvent()) notifyChange(xe);
else {
// xpath is a prefix of eventXpath
// System.out.println("Xpath is " + xpath);
String eventXpath = xe.getBean().getXpath();
// System.out.println("eventXpath is " + eventXpath);
// take away xpath
String relPath = eventXpath.substring(xpath.length());
if (relPath.startsWith("/")) relPath = relPath.substring(1); // NOI18N
for(Iterator i = configBeans.iterator();i.hasNext();) {
ConfigBeanStorage cbs = (ConfigBeanStorage) i.next();
try {
cbs.fireEvent(relPath,xe);
} catch (ConfigurationException e) {
// PENDING need to do something better here with the CE?
ErrorManager.getDefault().log(ErrorManager.WARNING, e.getMessage());
}
}
}
if(parent != null) parent.fireEvent(xe);
}
void notifyChange(XpathEvent event) {
for(Iterator i = configBeans.iterator();i.hasNext();) {
ConfigBeanStorage cbs = (ConfigBeanStorage) i.next();
cbs.bean.notifyDDChange(event);
}
}
// PENDING move the fireCustomizerListeners to this class as well.
public void addConfigBean(ConfigBeanStorage cbs) {
configBeans.add(cbs);
}
public void removeConfigBean(ConfigBeanStorage cbs) {
configBeans.remove(cbs);
}
public ConfigBeanStorage[] getConfigBeans() {
ConfigBeanStorage[] ret = new ConfigBeanStorage[configBeans.size()];
configBeans.toArray(ret);
return ret;
}
public String[] getAttributeNames() {
return null;
}
public String getAttributeValue(String str) {
return null;
}
public String getId() {
return null;
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.