📄 automaticconfigurator.java
字号:
/*
* Copyright (c) 2001-2005 Sun Microsystems, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Sun Microsystems, Inc. for Project JXTA."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA"
* must not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact Project JXTA at http://www.jxta.org.
*
* 5. Products derived from this software may not be called "JXTA",
* nor may "JXTA" appear in their name, without prior written
* permission of Sun.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL SUN MICROSYSTEMS OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of Project JXTA. For more
* information on Project JXTA, please see
* <http://www.jxta.org/>.
*
* This license is based on the BSD license adopted by the Apache Foundation.
*
* $Id: AutomaticConfigurator.java,v 1.2 2006/06/03 01:10:24 bondolo Exp $
*/
package net.jxta.impl.peergroup;
import java.net.InetAddress;
import java.net.URI;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.NoSuchElementException;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import net.jxta.document.Advertisement;
import net.jxta.document.AdvertisementFactory;
import net.jxta.document.MimeMediaType;
import net.jxta.document.StructuredDocument;
import net.jxta.document.StructuredDocumentFactory;
import net.jxta.document.StructuredDocumentUtils;
import net.jxta.document.StructuredTextDocument;
import net.jxta.document.XMLDocument;
import net.jxta.document.XMLElement;
import net.jxta.peergroup.PeerGroup;
import net.jxta.protocol.TransportAdvertisement;
import net.jxta.exception.ConfiguratorException;
import net.jxta.exception.JxtaError;
import net.jxta.impl.endpoint.IPUtils;
import net.jxta.impl.protocol.HTTPAdv;
import net.jxta.impl.protocol.PlatformConfig;
import net.jxta.impl.protocol.PSEConfigAdv;
import net.jxta.impl.protocol.RdvConfigAdv;
import net.jxta.impl.protocol.RelayConfigAdv;
import net.jxta.impl.protocol.TCPAdv;
/**
* A simple platform configurator. This implementation provides reasonable
* automatic configuration for edge peers on the JXTA public network.
*
* <p/>This implementation will read default values from several Java system
* properties as appropriate:
*
* jxta.peer.name -- The peer name to use.
* jxta.http.port -- The http port to use.
* jxta.tcp.port -- The tcp port to use.
*
* @see net.jxta.ext.config.Configurator
**/
public class AutomaticConfigurator extends NullConfigurator {
/**
* Log4J logger
**/
private final static transient Logger LOG = Logger.getLogger(AutomaticConfigurator.class.getName());
/**
* Configures the platform using the specified directory.
**/
public AutomaticConfigurator(URI jxtaHome) throws ConfiguratorException {
super(jxtaHome);
}
/**
* {@inheritDoc}
**/
public PlatformConfig getPlatformConfig() throws ConfiguratorException {
super.getPlatformConfig();
boolean reconf;
try {
reconf = buildPlatformConfig();
} catch(RuntimeException serious) {
if (LOG.isEnabledFor(Level.ERROR)) {
LOG.error("Trouble while fixing PlatformConfig. Hope for the best.", serious);
}
reconf = true;
}
// See if we need a reconf
if ( reconf ) {
throw new IncompleteConfigurationException("Damaged platform configuration.");
}
// Save the updated config.
save();
return advertisement;
}
/**
* Makes sure a PlatformConfig is present and if not, creates one.
*
* <p/>Performs some checking of PlatformConfig values and will fix some
* minor configuration problems automatically.
*
* @return If <tt>true</tt> then manual reconfiguration (of some form) is required.
**/
private boolean buildPlatformConfig() {
boolean reconf = false;
if (advertisement == null) {
if( LOG.isEnabledFor(Level.INFO) ) {
LOG.info( "New PlatformConfig Advertisement" );
}
advertisement = (PlatformConfig) AdvertisementFactory.newAdvertisement( PlatformConfig.getAdvertisementType() );
advertisement.setDescription("Platform Config Advertisement created by : " + AutomaticConfigurator.class.getName() );
}
// Set the peer name
String peerName = advertisement.getName();
if ((null == peerName) || (0 == peerName.trim().length())) {
String jpn = System.getProperty("jxta.peer.name", "" );
if(0 != jpn.trim().length()) {
advertisement.setName(jpn);
}
}
// Check the HTTP Message Transport parameters.
XMLDocument http = (XMLDocument) advertisement.getServiceParam(PeerGroup.httpProtoClassID);
HTTPAdv httpAdv = null;
boolean httpDisabled = false;
if (http != null) {
try {
httpDisabled = http.getChildren("isOff").hasMoreElements();
XMLElement param = null;
Enumeration httpChilds = http.getChildren( TransportAdvertisement.getAdvertisementType());
// get the HTTPAdv from TransportAdv
if( httpChilds.hasMoreElements() ) {
param = (XMLElement) httpChilds.nextElement();
}
if (null != param) {
httpAdv = (HTTPAdv) AdvertisementFactory.newAdvertisement( param );
if( !httpDisabled ) {
// check if the interface address is still valid.
String intf = httpAdv.getInterfaceAddress();
if( (null != intf) && !isValidInetAddress(intf) ) {
reconf = true;
if (LOG.isEnabledFor(Level.INFO)) {
LOG.info("Reconfig requested - invalid interface address");
}
}
}
}
} catch (RuntimeException advTrouble) {
if( LOG.isEnabledFor(Level.WARN) ) {
LOG.warn( "HTTP advertisement corrupted", advTrouble );
}
httpAdv = null;
}
}
if (httpAdv == null) {
if( LOG.isEnabledFor(Level.INFO) ) {
LOG.info( "HTTP advertisement missing, making a new one." );
}
int port = 0;
// get the port from a property
String httpPort = System.getProperty("jxta.http.port");
if (httpPort != null) {
try {
int propertyPort = Integer.parseInt( httpPort );
if( (propertyPort < 65536) && ( propertyPort >= 0 ) )
port = propertyPort;
else {
if( LOG.isEnabledFor(Level.WARN) ) {
LOG.warn( "Property 'jxta.http.port' is not a valid port number : " + propertyPort );
}
}
} catch ( NumberFormatException ignored ) {
if( LOG.isEnabledFor(Level.WARN) ) {
LOG.warn( "Property 'jxta.http.port' was not an integer : " + http );
}
}
}
httpAdv = (HTTPAdv) AdvertisementFactory.newAdvertisement( HTTPAdv.getAdvertisementType() );
httpAdv.setProtocol( "http" );
httpAdv.setPort(port);
httpAdv.setServerEnabled(false);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -