package GeDBIT.web;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
public class VectorAction extends ActionSupport
{
private String xyz; // 用户提交的坐标和半径
private double x = 0;
private double y = 0;
private double z = 0;
private double r = 0;
private double time = 0.0001; // 搜索时间
private int allcount = 10000; // 搜索数据库的大小
public void setR(double r)
{
this.r = r;
}
public double getR()
{
return r;
}
public void setTime(double time)
{
this.time = time;
}
public double getTime()
{
return time;
}
public void setAllcount(int allcount)
{
this.allcount = allcount;
}
public int getAllcount()
{
return allcount;
}
public void setX(double x)
{
this.x = x;
}
public double getX()
{
return x;
}
public void setY(double y)
{
this.y = y;
}
public double getY()
{
return y;
}
public void setZ(double z)
{
this.z = z;
}
public double getZ()
{
return z;
}
private Map<String, String> rescoord = new LinkedHashMap<String, String>(); // 用于在JSP显示
private int resnum = 0; // 结果数量
public void setRescoord(Map<String, String> rescoord)
{
this.rescoord = rescoord;
}
public Map<String, String> getRescoord()
{
return rescoord;
}
public void setResnum(int resnum)
{
this.resnum = resnum;
}
public int getResnum()
{
return resnum;
}
public void setXyz(String xyz)
{
this.xyz = xyz;
}
public String getXyz()
{
return xyz;
}
class JavaXML // 输出XML 用于和FLASH 传递
{
public void BuildXMLDoc() throws IOException, JDOMException
{
// 创建根节点 list;
Element root = new Element("list");
// 根节点添加到文档中;
Document Doc = new Document(root);
// 此处 for 循环可替换成 遍历 数据库表的结果集操作;
for (int i = 0; i < resnum; i++)
{
// 创建节点 user;
Element elements = new Element("coord");
// 给 user 节点添加属性 id;
elements.setAttribute("id", "" + i);
// 给 user 节点添加子节点并赋值;
// new Element("name")中的 "name" 替换成表中相应字段,setText("xuehui")中
// "xuehui
// 替换成表中记录值;
// System.out.println(rescoord.get(String.valueOf(i)));
String[] tp = rescoord.get(String.valueOf(i)).split(", ");
elements.addContent(new Element("x").setText(tp[0]));
elements.addContent(new Element("y").setText(tp[1]));
elements.addContent(new Element("z").setText(tp[2]));
// 给父节点list添加user子节点;
root.addContent(elements);
}
XMLOutputter XMLOut = new XMLOutputter();
String file = this.getClass().getClassLoader().getResource("")
.getPath();
// 将%20换成空格(如果文件夹的名称带有空格的话,会在取得的字符串上变成%20)
file = file.replaceAll("%20", " ");
file = file.substring(1, file.indexOf("WEB-INF")) + "file.xml"; // 文件路径
// System.out.println(file);
// 输出 user.xml 文件;
// XMLOut.setFormat(Format.getRawFormat());
XMLOut.setFormat(Format.getPrettyFormat());
ByteArrayOutputStream bos = new ByteArrayOutputStream();
// JavaXML x=new JavaXML();
FileOutputStream fos = new FileOutputStream(file);
XMLOut.output(Doc, fos);
// XMLOut.setFormat(Format.getRawFormat());
// System.out.println(bos.toString());
bos.close();
fos.close();
}
}
@SuppressWarnings("unused")
public void setSour()
{
int count = 0;
String res;
Pattern patt = Pattern.compile("data:.+"); // 这里生成txt文件
String fileR = "d:/data/vector/uniformvector-20dim-1m_out.txt"; // 文件路径
String fileS = "d:/data/vector/uniformvector-20dim-1m.txt"; // 文件路径
// 下面用于修改插入搜索串
try
// 这里读取txt文件
{
count = 0;
File file = new File(fileS);
if (file.isFile() && file.exists())
{
InputStreamReader read = new InputStreamReader(
new FileInputStream(file), "GBK");
BufferedReader buffreader = new BufferedReader(read);
String lineTxt = null;
lineTxt = buffreader.readLine();
String[] tp = lineTxt.split(" ");
// String st=tp[1];
int Acount = Integer.parseInt(tp[1]) + 1;
FileWriter fileW = new FileWriter(fileR);
fileW.write(tp[0] + " " + Acount + "\n");
fileW.write(x + " " + y + " " + z + " " + "\n");
try
{
while ((lineTxt = buffreader.readLine()) != null)
{
fileW.write(lineTxt + "\n");
}
} catch (IOException e1)
{
// TODO Auto-generated catch block
System.out.println("Writer Error");
e1.printStackTrace();
}
buffreader.close();
fileW.flush();
fileW.close();
read.close();
} else
System.out.println("Open Error");
} catch (Exception e)
{
System.out.println("Error");
}
}
public void setRes()
{
int count = 0;
String res;
Pattern patt = Pattern.compile("data:.+"); // 这里生成txt文件
String fileS = "d:/data/vector/vresult.txt"; // 文件路径
try
// 这里读取txt文件
{
File file = new File(fileS);
if (file.isFile() && file.exists())
{
InputStreamReader read = new InputStreamReader(
new FileInputStream(file), "GBK");
BufferedReader buffreader = new BufferedReader(read);
String lineTxt = null;
buffreader.readLine();
while ((lineTxt = buffreader.readLine()) != null)
{
Matcher matcher = patt.matcher(lineTxt);
while (matcher.find())
{
res = matcher.group().toString()
.replaceFirst("data:", "");
res = res.replaceFirst("]", "");
rescoord.put(String.valueOf(count), res);
// System.out.println(res);
++count;
}
}
resnum = rescoord.size();
buffreader.close();
read.close();
} else
System.out.println("Open Error");
} catch (Exception e)
{
System.out.println("Error");
}
}
public String execute() throws Exception
{
String[] tp = xyz.split(",");
x = Double.valueOf(tp[0]);// 获取用户输入x
y = Double.valueOf(tp[1]);// 获取用户输入y
z = Double.valueOf(tp[2]);// 获取用户输入z
r = Double.valueOf(tp[3]);
setSour();
new VectorQuery().runQuery(r);
setRes();
allcount = 1000;
time = 0.1;
try
{
// 这里的点是返回的,到时候可以返回一串字符串然后解析成坐标。更改这里的点,在JSP和flash 中都会改变
JavaXML jx = new JavaXML();
// System.out.println("生成 mxl 文件...");
jx.BuildXMLDoc();
} catch (Exception e)
{
e.printStackTrace();
}
return SUCCESS;
}
}