packagelucne.test;importjava.io.File;importjava.io.FileNotFoundException;importjava.io.IOException;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importorg.apache.lucene.analysis.standard.StandardAnalyzer;importorg.apache.lucene.document.Document;importorg.apache.lucene.document.StringField;importorg.apache.lucene.document.Field.Store;importorg.apache.lucene.index.DirectoryReader;importorg.apache.lucene.index.IndexReader;importorg.apache.lucene.index.IndexWriter;importorg.apache.lucene.index.IndexWriterConfig;importorg.apache.lucene.index.Term;importorg.apache.lucene.index.IndexWriterConfig.OpenMode;importorg.apache.lucene.queryparser.classic.ParseException;importorg.apache.lucene.queryparser.classic.QueryParser;importorg.apache.lucene.search.IndexSearcher;importorg.apache.lucene.search.Query;importorg.apache.lucene.search.ScoreDoc;importorg.apache.lucene.search.TermQuery;importorg.apache.lucene.search.TopDocs;importorg.apache.lucene.store.Directory;importorg.apache.lucene.store.FSDirectory;importorg.apache.lucene.util.Version;importorg.dom4j.DocumentException;importorg.dom4j.Element;importorg.dom4j.io.SAXReader;importorg.junit.Test;public classMavenPomUtil {//待索引文件路径
private staticString indexFilePath;//索引存储路径
public staticString dirpath;private static List files = new ArrayList();static{try{
indexFilePath="F:\\Repositorys\\MavenLib";
dirpath=new File("").getCanonicalPath()+"\\Index\\Directory";
}catch(IOException e) {
e.printStackTrace();
};
}
@Testpublic void search() throwsIOException{
Map errorMap=parserJarPomResult("F:\\workce\\eclispe\\newplaterom\\pom.xml");
System.out.println(errorMap);
}
@Testpublic voidinitCreateIndex(){
checkFile(newFile(indexFilePath));
createMavenLibIndex(files);
}/*** 返回结果
**/
public MapparserJarPomResult(String pompath){returnparserJarPomError(parserXmlFile(pompath));
}/*** 解析pom文件后,将结果集验证是否有误差
**/
private Map parserJarPomError(Listjars){
Map errorMap = new HashMap();if(jars!=null&&!jars.isEmpty()){for(String jarname:jars){boolean bo =searchMavenLibPathBoolean(jarname);if(!bo){
errorMap.put(jarname, bo);
}
}
}returnerrorMap;
}/*** 解析pom文件
**/@SuppressWarnings("unchecked")private ListparserXmlFile(String pomFilePath){
File pom= newFile(pomFilePath);
List jarList = new ArrayList();try{
SAXReader xmlreader= newSAXReader();
org.dom4j.Document doc=xmlreader.read(pom);
Element el=doc.getRootElement();
Element dependencies= el.element("dependencies");
Map propertiesMap = null;
Element properties= el.element("properties");if(properties!=null){
propertiesMap= new HashMap();
Iterator propertiesIt =properties.elementIterator();while(propertiesIt.hasNext()){
Element propertieChildren=propertiesIt.next();
String name=propertieChildren.getName();
String text=propertieChildren.getText();
propertiesMap.put("\\$\\{"+name+"\\}", text);
}
}
Iterator dependenciesIt =dependencies.elementIterator();while(dependenciesIt.hasNext()){
Element dependency=dependenciesIt.next();
Element artifactId=dependency.element("artifactId");
Element version=dependency.element("version");
Element scope=dependency.element("scope");
Element classifier=dependency.element("classifier");
String artifactIdValue=artifactId.getText();
String versionValue=version.getText();
String jarFileName="";if(scope==null||!scope.getText().equals("system")){
jarFileName=artifactIdValue.concat("-").concat(versionValue);if(classifier!=null){
String classifiervalue=classifier.getText();
jarFileName=jarFileName.concat("-").concat(classifiervalue);
}
jarFileName=jarFileName.concat(".jar");
}else if(scope.getText().equals("system")){
Element systemPath=dependency.element("systemPath");
String systemPathValue=systemPath.getText();int lastindex=systemPathValue.lastIndexOf("/");
jarFileName=systemPathValue.substring(lastindex+1, systemPathValue.length());
}if(propertiesMap!=null){for(String key:propertiesMap.keySet()){
jarFileName=jarFileName.replaceAll(key, propertiesMap.get(key));
}
}
jarList.add(jarFileName);
}
}catch(DocumentException e) {
e.printStackTrace();
}returnjarList;
}/*** 查询索引是否存在
*@returnboolean
**/
public static booleansearchMavenLibPathBoolean(String jarFilenName){boolean flag=false;try{
Directory dir= FSDirectory.open(newFile(MavenPomUtil.dirpath));
IndexReader reader=DirectoryReader.open(dir);
IndexSearcher searcher= newIndexSearcher(reader);/*QueryParser parser = new QueryParser(Version.LUCENE_40, "filename", new StandardAnalyzer(Version.LUCENE_40));
Query query = parser.parse(jarFilenName);*/Term term= new Term("filename",jarFilenName);
TermQuery query= newTermQuery(term);
TopDocs docs= searcher.search(query, 2);if(docs.totalHits>0){
flag=true;
}
reader.close();
}catch(IOException e) {
e.printStackTrace();
}returnflag;
}/*** 查询jar存在路径
*@returnMap
**/
public static Map>searchMavenLibPath(String jarFilenName){
Map> map = new HashMap>();
List pathlist = new ArrayList();try{
Directory dir= FSDirectory.open(newFile(MavenPomUtil.dirpath));
IndexReader reader=DirectoryReader.open(dir);
IndexSearcher searcher= newIndexSearcher(reader);
QueryParser parser= new QueryParser(Version.LUCENE_40, "filename", newStandardAnalyzer(Version.LUCENE_40));
Query query=parser.parse(jarFilenName);
TopDocs docs= searcher.search(query, 2);for(ScoreDoc scoredoc:docs.scoreDocs){
Document doc=searcher.doc(scoredoc.doc);
String filepath= doc.get("filepath");
pathlist.add(filepath);
}
reader.close();
}catch(IOException e) {
e.printStackTrace();
}catch(ParseException e) {
e.printStackTrace();
}
map.put(jarFilenName, pathlist);returnmap;
}/*** 创建索引
**/
private void createMavenLibIndex(Listfiles){try{
Directory dir= FSDirectory.open(newFile(dirpath));
IndexWriterConfig config= new IndexWriterConfig(Version.LUCENE_40, newStandardAnalyzer(Version.LUCENE_40));
config.setOpenMode(OpenMode.CREATE);
IndexWriter writer= newIndexWriter(dir, config);for(File file:files){if(file.isFile()){
Document doc= newDocument();
doc.add(new StringField("filename", file.getName(), Store.YES));
doc.add(new StringField("filepath",file.getPath(),Store.YES));
writer.addDocument(doc);
}
}
writer.forceMerge(1);//优化压缩段,大规模添加数据的时候建议,少使用本方法,会影响性能
writer.commit();//提交数据
writer.close();
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
}/*** 查询待索引文件
**/
private void checkFile(File checkFile){//查看目录下的所有文件
if(checkFile.exists()) {if(checkFile.isDirectory()) {
File[] f= checkFile.listFiles();//查看目录的文件
for (int i = 0; i < f.length; i++) {
checkFile(f[i]);
}
}else{
String fileName=checkFile.getName();if(fileName.endsWith(".jar")){
files.add(checkFile);
}
}
}
}
}