`

JXTA如何创建自定义的广告

阅读更多

广告是JXTA核心对象,它是用来公布对等机,对等机,服务,管道或者其它JXTA资源的。广告是在JXTA核心资源上提供的一个独立的平台,以供不同平台实现能够互相交流。每个广告都持有一个文件来表示。广告最典型的是XML来表示。Advertisement.getDocument(MimeMediaType)方法是用来生产广告内容的。不同陈述可以通过MIMETYPE来选择。典型的MIMETYPE"text/xml"或者"text/plain"产生正方内容为广告。广告实例是通过AdvertisementFactory工厂产生的。所有公共广告都是在net.jxta.protocol包下定义成抽象类的。对于每个抽象的公共广告在这里也有一个私有的实现用来处理文档创建和分析。这些私有实现注册在AdvertisementFactory。新创建广告类型一定要注册到AdvertisementFactory的下面,且扩展Advertisement或者ExtendableAdvertisement。下面给出的例子也是陈述如何创建一个新的广告类型,并且把新广告注册到广告工厂中。

下面我们要创建的自定义广告类是一个个人身份广告,PersonAdvertisement.java,只要我们要需要使用该广告之前把它注册到AdvertisementFactory即可。

注册代码:

AdvertisementFactory.registerAdvertisementInstance(PersonAdvertisement.getAdvertisementType(),new PersonAdvertisement.Instantiator());

下面直接贴出PersonAdvertisement.java代码:
/**
 * 创建一个个人身份广告
 * @author 牙哥
 *
 */
public class PersonAdvertisement extends Advertisement implements
  Cloneable{

 private ID id = ID.nullID;
 private String name;
 private String  sex;
 private String tel;
 private final static String NameTag = "Name";
 private final static String IDTag = "ID";
 private final static String SexTag = "Sex";
 private final static String TelTag = "Tel";
 
 //可加索引的字段,广告必须要定义可索引,为了可以在本地和network找回这些广告
 //在这里我们把ID,却相当我们身份证号码是唯一,而姓名也提供可以搜索,可是姓名不是唯一,只是为也提供也可以通过姓名搜索而已
 private final static String[] fields ={IDTag,NameTag};
 
 //默认的构造函数
 public PersonAdvertisement(){
 }
 /**
  * 通过结构文档来构造文档,即通过读一个文档而到PersonAdvertisement文档
  * @param root
  */
 public PersonAdvertisement(Element root){
        TextElement doc = (TextElement) root;
        if (!getAdvertisementType().equals(doc.getName())) {
            throw new IllegalArgumentException(
                    "Could not construct : " + getClass().getName() + "from doc containing a " + doc.getName());
        }
        initialize(doc);
 }
    /**
     * 初始化个人身份广告元素
     * @param root document root
     */
    protected void initialize(Element root) {
        if (!TextElement.class.isInstance(root)) {//只支持TextElement类型的文档
            throw new IllegalArgumentException(getClass().getName() + " only supports TextElement");//
        }
        TextElement doc = (TextElement) root;

        if (!doc.getName().equals(getAdvertisementType())) {//如果广告类型不一致,则返回异常
            throw new IllegalArgumentException(
                    "Could not construct : " + getClass().getName() + "from doc containing a " + doc.getName());
        }
        Enumeration elements = doc.getChildren();
        while (elements.hasMoreElements()) {
            TextElement element = (TextElement) elements.nextElement();
            if (!handleElement(element)) {//如果元素认证不通过,则返回异常
                throw new IllegalArgumentException("Unhandleded element \'" + element.getName() + "\' in " + doc.getName());
            }
        }
    }
    /**
     * 认证子元素是否正确过程
     */
    protected boolean handleElement(TextElement element) {
        if (element.getName().equals(IDTag)) {
            try {
                URI id = new URI(element.getTextValue());
                setID(IDFactory.fromURI(id));
            } catch (URISyntaxException badID) {
                throw new IllegalArgumentException("unknown ID format in advertisement: " + element.getTextValue());
            } catch (ClassCastException badID) {
                throw new IllegalArgumentException("Id is not a known id type: " + element.getTextValue());
            }
            return true;
        }
        if (element.getName().equals(NameTag)) {
            setName(element.getTextValue());
            return true;
        }
        if (element.getName().equals(SexTag)) {
            setSex(element.getTextValue());
            return true;
        }
        if (element.getName().equals(TelTag)) {
            setTel(element.getTextValue());
            return true;
        }
        return false;
    }
    /**
     * 返回asMimeType类型的文档
     */
    @Override
    public Document getDocument(MimeMediaType asMimeType) {
        StructuredDocument adv = StructuredDocumentFactory.newStructuredDocument(asMimeType, getAdvertisementType());
        if (adv instanceof Attributable) {
            ((Attributable) adv).addAttribute("xmlns:jxta", "http://jxta.org");//如果是继承抽象类ExtendableAdvertisement,则是减少了这部分的处理
        }
        Element e;
        e = adv.createElement(IDTag, getID().toString());
        adv.appendChild(e);
        e = adv.createElement(NameTag, getName().trim());
        adv.appendChild(e);
        e = adv.createElement(SexTag, getSex().trim());
        adv.appendChild(e);
        e = adv.createElement(TelTag, getTel().trim());
        adv.appendChild(e);
        return adv;
    }
   
    /**
     * 所有信息有一个类型标识,而该方法则标识该广告是一个PeerAdvertisement
     *
     * @return String "jxta:PersonAdvertisement"
     */
    public static String getAdvertisementType() {
        return "jxta:PersonAdvertisement";
    }
    /**
     * 每个广告必须有一个唯一的ID
     */
 @Override
 public ID getID() {
  return (id == null ? null : id);
 }

 @Override
 public String[] getIndexFields() {
  return fields;
 }
    /**
     * 实例化生产器,为了注册到AdvertisementFactory而提供
     */
    public static class Instantiator implements AdvertisementFactory.Instantiator {


        public String getAdvertisementType() {
            return PersonAdvertisement.getAdvertisementType();
        }

        public Advertisement newInstance() {
            return new PersonAdvertisement();
        }

        public Advertisement newInstance(Element root) {
            return new PersonAdvertisement(root);
        }
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof PersonAdvertisement) {
         PersonAdvertisement adv = (PersonAdvertisement) obj;

            return getID().equals(adv.getID());
        }

        return false;
    }

 

这里不支持这么长的代码,我把全部代码放在附件中,各位可以下载来看看。

3
5
分享到:
评论
6 楼 yang_jnu 2010-04-13  
恩,下载回来测试下先。。。
5 楼 lyndon.lin 2010-04-13  
下面我把全部的代码放在附件里,你可以下载全部看看。
4 楼 lyndon.lin 2010-04-13  
类型是广告类型就行了,即DiscoveryService.ADV。如果你是远程的,必须有自己的发现监听器才这样写。要不就监听器=null,就可以啦。
3 楼 lyndon.lin 2010-04-13  
原来真的不全啊,代码太长,这里支持不了。每个字段都有一个Set和Get方法的。
2 楼 yang_jnu 2010-04-13  
里面获取和设置元素的方法好像不全,例如PipeAdv.setSex("男"); 是否还要在你定义的广告类中再添加个setSex方法。。
1 楼 yang_jnu 2010-04-13  
牙哥真及时,但不知如何创建和发布出去呢?是否像下面哪样(例如张三,男,138000):
PipeAdv = (PersonAdvertisement) AdvertisementFactory.newAdvertisement(PersonAdvertisement.getAdvertisementType());
ID id = (ID) IDFactory.newID(groupID);
PipeAdv.setID(id);
PipeAdv.setName("张三");
PipeAdv.setSex("男");
PipeAdv.setTel("138000");
discoSvc.remotePublish(PipeAdv);
不知这样写对不对(感觉ID哪里怪怪的)。。

接着B点通过:
getRemoteAdvertisements(String peerid, int type, String attribute, String value, int threshold, DiscoveryListener listener)
里面的type类型是否写2?如下:
dis.getRemoteAdvertisements(null,2,"name","张三",1,this);

希望牙哥指点下。。

相关推荐

    JXTA JXTA.jar

    jxta.jar p2p jxta.jar p2p jxta.jar p2p

    精通JXTA 。JXTAShell

    本书是一本介绍JXTA的书籍。主要内容包括:JXTA简介、JXTAShell使用说明、开发JXTA应用程序实例、JXTA管道及安全等。

    JXTA经典JXTA经典

    JXTA目前的版本已经是2.5了,同以前的2.0、2.1之类的差别非常大,因此网络上2002年以前的文章,除了是阐述JXTA技术的概念类的文章可以学习外,具体开发类的就没有多大价值。 现将2.0版本和2.5版本同时上传,供大家...

    jxta运行的所有jar包

    jxta运行环境所需要的所有jar包 /files/JXTA_Demo/lib/jxta.jar /files/JXTA_Demo/lib/beepcore.jar /files/JXTA_Demo/lib/cryptix-asn1.jar /files/JXTA_Demo/lib/cryptix32.jar /files/JXTA_Demo/lib/jxtaptls.jar...

    JXTA\jxta-lib-2.4.1.zip

    JXTA\jxta-lib-2.4.1.zip 用来开发p2p应用程序的。

    精通JXTA --本书是一本介绍JXTA的书籍

    精通JXTA 本书是一本介绍JXTA的书籍。主要内容包括:JXTA简介、JXTAShell使用说明、开发JXTA应用程序实例、JXTA管道及安全等。

    jxta例程

    jxta的一些经典程序

    jxta2.2 开发文档

    jxta2.2 开发文档

    jxta2.7.zip

    JXTA 2.7,P2P分布式计算框架JXTA。version 2.7。shell 2.5.

    JXTA-JavaP2P网络编程技术

    资源名称:JXTA-Java P2P网络编程技术内容简介:JXTA是美国Sun公司在Java领域里推出的新技术,目的是为P2P(Peer-to-Peer)的网络应用开发提供一个统一的平台。而且为了鼓励和支持该技术的发展,JXTA项目采用了开放...

    JXTA开发包7

    这是用JXTA开发P2P程序必须用到的组件。是从jxta.org上面下载来的,已经杀毒

    JXTA 2.5 - Programming Guide

    Jxta,java的P2P开发教程,了解Jxta技术的核心部分

    jxta2.0协议_CN

    了解jxta的六层核心协议

    JXTA开发包1

    这是用JXTA开发P2P程序必须用到的组件。是从jxta.org上面下载来的,已经杀毒

    jxta-shell-2.4.zip

    jxta shell 是体验jxta 的最好利器

    最新的JXTA2.5 API帮助文档

    chm格式的最新的JXTA2.5 API帮助文档

    jxta远程教学p2p技术

    远程教学 P2P jxta java 远程教学 源代码 jxta远程教学p2p技术,一个很好的P2P例子

    JXTA--P2pSocket.rar

    本资源用JAVA编写了JXTA的PIPE通信过程

Global site tag (gtag.js) - Google Analytics