opencms整合到java项目里_java-将标签云添加到OpenCMS网站

好的,最后我自己部分解决了这个问题.我还使用了Richard Friedman tag cloud的一些代码.

我的操作方式如下:在指定的时间间隔内,OpenCMS运行一个计划的作业,该作业读取Lucene索引,从“关键字”字段中提取所有术语(可以为VFS中的每个文件填写),生成标签云,并将结果存储在OpenCMS模板的一部分中.有两个Java文件:Cloud.java和BuildTagCloud.java. “云”读取索引并返回最常用术语的列表. “ BuildTagCloud”实现I_CmsScheduledJob接口,并注册为计划作业.

BuildTagCloud.java:

package mypackage;

import org.opencms.file.*;

import org.opencms.main.*;

import org.opencms.scheduler.I_CmsScheduledJob;

import java.text.SimpleDateFormat;

import java.util.*;

public class BuildTagCloud implements I_CmsScheduledJob {

private final String indexaddress = "address/of/your/index/folder"; // something like ../webapps/opencms/WEB-INF/index/nameOfIndex

private final String tagsFile = "address"; // part of my template; it's where I store the tag cloud

private final int numTerms = 10; // number of terms in the tag cloud

public String launch(CmsObject object, java.util.Map parameters) throws java.lang.Exception {

Cloud cloud = new Cloud(indexaddress, numTerms);

Calendar cal = Calendar.getInstance();

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String data;

data = "

Tag cloud
";

data += sdf.format(cal.getTime()) + "
";

try {

List list = cloud.getCloud();

for(int i = 0; i

data += "
" + i + ". " + list.get(i).term.text() + " ... " + list.get(i).docFreq; // list.get(i).docFreq

}

} catch (Exception e) {

data += e.getMessage();

data += "
";

} finally {

data+="

";

}

writeAndPublishResource(object, tagsFile, data);

return "OK";

}

private void writeAndPublishResource(CmsObject object, String resouce, String data) throws java.lang.Exception {

object.loginUser("administrator's user name", "and his password");

CmsRequestContext cmsContext = object.getRequestContext();

CmsProject curProject = cmsContext.currentProject();

if(curProject.isOnlineProject()){

CmsProject offlineProject = object.readProject("Name of the project");

cmsContext.setCurrentProject(offlineProject);

}

CmsResource res = object.readResource(resouce);

object.lockResource(resouce);

CmsFile file = object.readFile(res);

file.setContents(data.getBytes());

object.writeFile(file);

OpenCms.getPublishManager().publishResource(object, resouce);

object.unlockResource(resouce);

}

}

Cloud.java:

package mypackage;

import java.io.*;

import java.util.*;

import org.apache.lucene.index.*;

public class Cloud {

private String indexaddress;

private int numTerms;

private int max;

private int sum;

public Cloud(String indexaddress, int numTerms) {

this.indexaddress = indexaddress;

this.numTerms = numTerms;

max = 0;

sum = 0;

}

public List getCloud() throws Exception {

TermInfoQueue termQ = new TermInfoQueue(numTerms);

IndexReader reader = IndexReader.open(new File(indexaddress));

TermEnum terms = reader.terms();

int minFreq = 0;

while (terms.next()) {

if (!terms.term().field().equals("keywords")) continue;

if ( terms.docFreq() > minFreq) {

if (termQ.size() >= numTerms) // if tiq overfull

{

termQ.pop(); // remove lowest in tiq

termQ.put(new TermInfo(terms.term(), terms.docFreq()));

minFreq = ((TermInfo)termQ.top()).docFreq; // reset minFreq

} else {

termQ.put(new TermInfo(terms.term(), terms.docFreq()));

}

}

}

terms.close();

reader.close();

ArrayList res = new ArrayList( termQ.size() );

while ( termQ.size() > 0 ) {

TermInfo ti = (TermInfo)termQ.pop();

max = Math.max( max, ti.docFreq );

sum += ti.docFreq;

res.add( ti );

}

// Shuffles the results up, since a sorted cloud would be predictiable.

//Collections.shuffle( res );

return res;

}

public int getMaxFrequency() {

return max;

}

}

class TermInfo {

TermInfo(Term t, int df) {

term = t;

docFreq = df;

}

public int docFreq;

public Term term;

}

class TermInfoQueue extends org.apache.lucene.util.PriorityQueue {

TermInfoQueue(int size) {

initialize(size);

}

protected final boolean lessThan(Object a, Object b) {

TermInfo termInfoA = (TermInfo)a;

TermInfo termInfoB = (TermInfo)b;

return termInfoA.docFreq < termInfoB.docFreq;

}

}

希望这对我有所帮助,因为我花了很多时间来解决这个问题!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值