广告是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;
}
这里不支持这么长的代码,我把全部代码放在附件中,各位可以下载来看看。