Index: BH13SPARQLBuilder/src/hozo/sparql/CrossSparqlAccessor.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/CrossSparqlAccessor.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/CrossSparqlAccessor.java (revision 9)
@@ -0,0 +1,226 @@
+package jp.ac.osaka_u.sanken.sparql;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.hp.hpl.jena.rdf.model.RDFNode;
+
+public class CrossSparqlAccessor implements ThreadedSparqlAccessor {
+
+	private List<EndpointSettings> settings;
+
+	private Map<EndpointSettings, SparqlAccessor> accessorHash;
+
+	private Map<Integer, CrossOffset> crossOffsetMap;
+
+	public CrossSparqlAccessor(List<EndpointSettings> settings, SparqlQueryListener listener){
+		accessorHash = new LinkedHashMap<EndpointSettings, SparqlAccessor>();
+		for (EndpointSettings setting : settings){
+			accessorHash.put(setting, SparqlAccessorFactory.createSparqlAccessor(setting, listener));
+		}
+
+		this.settings = settings;
+
+		init();
+	}
+
+	public CrossSparqlAccessor(List<EndpointSettings> settings){
+		accessorHash = new LinkedHashMap<EndpointSettings, SparqlAccessor>();
+		for (EndpointSettings setting : settings){
+			accessorHash.put(setting, SparqlAccessorFactory.createSparqlAccessor(setting));
+		}
+		this.settings = settings;
+
+		init();
+	}
+
+	private void init(){
+		crossOffsetMap = new LinkedHashMap<Integer, CrossSparqlAccessor.CrossOffset>();
+	}
+
+	@Override
+	public List<Map<String, RDFNode>> executeQuery(String queryString)
+			throws Exception {
+
+		// TODO 譛ｪ蟇ｾ蠢懊〒濶ｯ縺�ｼ�
+		throw new UnsupportedOperationException("Can't Execute Query");
+	}
+
+	@Override
+	public SparqlResultSet findSubject(String word, boolean fullMatch,
+			Integer limit, Integer offset, int type, String[] propList) throws Exception {
+		SparqlResultSet ret = new SparqlResultSet(new ArrayList<Map<String, RDFNode>>());
+		Integer limit_ = limit;
+		Integer offset_ = offset;
+
+		CrossOffset cOffset = null;
+		if (offset != null){
+			crossOffsetMap.get(new Integer(offset));
+			if (cOffset == null){
+				cOffset = new CrossOffset(0, offset);
+			}
+		}
+
+		for (int i=0; i<settings.size(); i++){
+			if (cOffset != null){
+				i = cOffset.endpointIndex;
+			}
+			EndpointSettings setting = settings.get(i);
+			SparqlAccessor sa = accessorHash.get(setting);
+			SparqlResultSet set = sa.findSubject(word, fullMatch, limit_, (cOffset == null ? null : cOffset.offset), type, propList);
+			ret.addResult(setting.getEndpoint(), set.getDefaultResult());
+			if (cOffset != null){
+				if (ret.getDefaultResult().size() < limit){
+					limit_ = limit - set.getDefaultResult().size();
+					offset_ = 0;
+				} else {
+					cOffset = new CrossOffset(i, limit_ + offset_);
+					crossOffsetMap.put(new Integer(limit + offset), cOffset);
+					break;
+				}
+				if (i == settings.size() - 1 && set.isHasNext()){
+					ret.setHasNext(true);
+				}
+			}
+		}
+
+		return ret;
+	}
+
+	@Override
+	public List<Map<String, RDFNode>> findTripleFromSubject(String subject)
+			throws Exception {
+		List<Map<String, RDFNode>> ret = new ArrayList<Map<String,RDFNode>>();
+
+		for (EndpointSettings setting : settings){
+			boolean hit = false;
+			for (String ns : setting.getNamespaceList()){
+				if (subject.startsWith(ns)){
+					hit = true;
+				}
+			}
+			if (hit){
+				SparqlAccessor sa = accessorHash.get(setting);
+				List<Map<String, RDFNode>> set = sa.findTripleFromSubject(subject);
+				ret.addAll(set);
+			}
+
+		}
+
+		return ret;
+	}
+
+	private boolean isThereTargetEndpoint(String subject){
+		for (EndpointSettings setting : settings){
+			for (String ns : setting.getNamespaceList()){
+				if (subject.startsWith(ns)){
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	@Override
+	public boolean executeQuery(String queryString,
+			SparqlResultListener resultListener) {
+		// TODO 譛ｪ蟇ｾ蠢懊〒濶ｯ縺�ｼ�
+		throw new UnsupportedOperationException("Can't Execute Query");
+
+	}
+
+	@Override
+	public boolean findSubject(String word, boolean fullMatch, Integer limit,
+			Integer offset, int type, String[] propList, SparqlResultListener resultListener) {
+		Thread thread = new QueryThread(word, new Object[]{new Boolean(fullMatch), limit, offset, new Integer(type), propList}, resultListener){
+			public void run(){
+				try {
+					Boolean fullMatch = (Boolean)((Object[])getOption())[0];
+					Integer limit = (Integer)((Object[])getOption())[1];
+					Integer offset = (Integer)((Object[])getOption())[2];
+					Integer type = (Integer)((Object[])getOption())[3];
+					String[] propList = (String[])((Object[])getOption())[4];
+					getSparqlResultListener().resultReceived(findSubject(getQueryString(), fullMatch, limit, offset, type, propList));
+				} catch(Exception e){
+					throw new RuntimeException(e);
+				}
+			}
+		};
+		thread.setUncaughtExceptionHandler(resultListener);
+		thread.start();
+
+		return true;
+	}
+
+	@Override
+	public boolean findTripleFromSubject(String subject,
+			SparqlResultListener listener) {
+		if (!isThereTargetEndpoint(subject)){
+			// 蟇ｾ雎｡endpoint縺ｪ縺�
+			return false;
+		}
+
+		Thread thread = new QueryThread(subject, listener){
+			public void run(){
+				try {
+					getSparqlResultListener().resultReceived(new SparqlResultSet(findTripleFromSubject(getQueryString())));
+				} catch(Exception e){
+					throw new RuntimeException(e);
+				}
+			}
+		};
+		thread.setUncaughtExceptionHandler(listener);
+		thread.start();
+		return true;
+
+	}
+
+
+	@Override
+	public List<Map<String, RDFNode>> findPropertyList() throws Exception {
+		List<Map<String, RDFNode>> ret = new ArrayList<Map<String,RDFNode>>();
+		Map<String, RDFNode> result = new LinkedHashMap<String, RDFNode>();
+		ret.add(result);
+		for (EndpointSettings setting : settings){
+			SparqlAccessor sa = accessorHash.get(setting);
+			List<Map<String, RDFNode>> set = sa.findPropertyList();
+			for (Map<String, RDFNode> r : set){
+				for (String key : r.keySet()){
+					result.put(key, r.get(key));
+				}
+			}
+		}
+
+		return ret;
+	}
+
+	@Override
+	public boolean findPropertyList(SparqlResultListener listener) {
+		Thread thread = new QueryThread(null, listener){
+			public void run(){
+				try {
+					getSparqlResultListener().resultReceived(new SparqlResultSet(findPropertyList()));
+				} catch(Exception e){
+					throw new RuntimeException(e);
+				}
+			}
+		};
+		thread.setUncaughtExceptionHandler(listener);
+		thread.start();
+		return true;
+	}
+
+	private class CrossOffset {
+
+		public int endpointIndex;
+		public int offset;
+
+		public CrossOffset(int endpointIndex, int offset){
+			this.endpointIndex = endpointIndex;
+			this.offset = offset;
+		}
+	}
+
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/SparqlUtil.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/SparqlUtil.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/SparqlUtil.java (revision 9)
@@ -0,0 +1,66 @@
+package jp.ac.osaka_u.sanken.sparql;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.hp.hpl.jena.rdf.model.RDFNode;
+
+public class SparqlUtil {
+
+	/** TSV蠖｢蠑丞�蜉�*/
+	public static final int OUTPUT_TYPE_TSV = 0;
+	
+	public static final int OUTPUT_TYPE_CSV = 1;
+
+	public static final int OUTPUT_TYPE_XLS = 2;
+
+	
+	private static HashMap<Integer, String> separatorMap;
+
+	static {
+		separatorMap = new HashMap<Integer, String>();
+		separatorMap.put(SparqlUtil.OUTPUT_TYPE_TSV, "\t");
+		separatorMap.put(SparqlUtil.OUTPUT_TYPE_CSV, ",");
+
+	}
+	
+	/**
+	 * 謖�ｮ壹＠縺溘せ繝医Μ繝ｼ繝縺ｫ邨先棡繧呈枚蟄怜�縺ｨ縺励※蜃ｺ蜉帙☆繧�
+	 * @param results
+	 * @param type
+	 * @param stream
+	 * @return
+	 */
+	public static boolean saveResult(List<Map<String, RDFNode>> results, int type, OutputStream stream){
+		/**
+		 * type縺ｫ繧医▲縺ｦresult format繧貞､峨∴縺ｦ蜀恒OST縺吶ｋ縺薙→繧り�∴繧峨ｌ繧九′縲∵勸驕肴ｧ縺後↑縺��縺ｧ菫晉蕗縺ｨ縺励�
+		 * 螟画鋤縺ｯ閾ｪ蜑阪〒螳溯｣�☆繧九�
+		 */
+		if (type == SparqlUtil.OUTPUT_TYPE_TSV || type == SparqlUtil.OUTPUT_TYPE_CSV){
+			String separator = separatorMap.get(type);
+			if (separator == null){
+				return false;
+			}
+			SeparatedValuesExporter expo = new SeparatedValuesExporter(separator, results);
+			try {
+				expo.export(stream);
+				return true;
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+			return true;
+		}
+		
+		return false;
+	}
+
+	public static boolean saveResult(List<Map<String, RDFNode>> results,  int type, File file) throws FileNotFoundException{
+		return saveResult(results, type, new FileOutputStream(file));
+	}
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/EndpointSettings.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/EndpointSettings.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/EndpointSettings.java (revision 9)
@@ -0,0 +1,413 @@
+package jp.ac.osaka_u.sanken.sparql;
+
+import java.beans.XMLDecoder;
+import java.beans.XMLEncoder;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+public class EndpointSettings implements Serializable {
+
+	/**
+	 *
+	 */
+	private static final long serialVersionUID = -6928422841511501314L;
+
+	public static final int RESULT_TYPE_XML = 0;
+
+	public static final int RESULT_TYPE_JSON = 1;
+
+	public static final int RESULT_TYPE_SSE = 2;
+
+	public static final int RESULT_TYPE_TSV = 3;
+
+	public static final String RESULT_TYPE_XML_STR = "XML/RDF";
+
+	public static final String RESULT_TYPE_JSON_STR = "JSON";
+
+	public static final String RESULT_TYPE_SSE_STR = "SPARQL Syntax Expressions";
+
+	public static final String RESULT_TYPE_TSV_STR = "TSV";
+
+	private static HashMap<String, Integer> dataTypeMap;
+
+
+	private String endpoint;
+
+	private boolean useCustomParam = false;
+
+	private String queryKey = "q";
+
+	private String option = "type=json&LIMIT=100";
+
+	private String encoding = "UTF-8";
+
+	private String namespaces = "";
+
+	private int resultType = EndpointSettings.RESULT_TYPE_JSON;
+
+	private boolean editable = false;
+
+	private String repositoryURL;
+
+	private String repository;
+
+	private String user;
+
+	private String pass;
+	
+	private boolean isTarget = true;
+	
+	private volatile boolean isChanged = false;
+
+	static {
+		dataTypeMap = new LinkedHashMap<String, Integer>();
+		dataTypeMap.put(RESULT_TYPE_XML_STR, new Integer(RESULT_TYPE_XML));
+		dataTypeMap.put(RESULT_TYPE_JSON_STR, new Integer(RESULT_TYPE_JSON));
+		dataTypeMap.put(RESULT_TYPE_SSE_STR, new Integer(RESULT_TYPE_SSE));
+		dataTypeMap.put(RESULT_TYPE_TSV_STR, new Integer(RESULT_TYPE_TSV));
+
+	}
+
+	public EndpointSettings(){
+
+	}
+
+
+	public EndpointSettings(String endpoint){
+		this.endpoint = endpoint;
+
+		this.namespaces = makeDefaultNamespaces(endpoint);
+
+		makeDefaultRepository(endpoint);
+	}
+
+	private String makeDefaultNamespaces(String endpoint){
+		String ret = "";
+
+		if (endpoint == null){
+			return ret;
+		}
+
+		// endpoint譛蠕後�"/"繧貞炎髯､
+		if (endpoint.endsWith("/")){
+			endpoint = endpoint.substring(0, endpoint.length() - "/".length());
+		}
+		int index = endpoint.lastIndexOf("/");
+		if (index > 0){
+			endpoint = endpoint.substring(0, index);
+		}
+
+		ret = endpoint + "," + endpoint + "/class," + endpoint + "/instance," + endpoint + "/resource";
+
+
+		return ret;
+	}
+
+	private void makeDefaultRepository(String endpoint){
+		int index = endpoint.indexOf("/endpoint/");
+		if (index >= 0){
+			this.repositoryURL = endpoint.substring(0, index);
+			this.repository = endpoint.substring(index + "/endpoint/".length());
+		}
+
+	}
+
+	/**
+	 * @return endpoint
+	 */
+	public String getEndpoint() {
+		return endpoint;
+	}
+
+	/**
+	 * @param endpoint 繧ｻ繝�ヨ縺吶ｋ endpoint
+	 */
+	public void setEndpoint(String endpoint) {
+		if (this.endpoint != null && !this.endpoint.equals(endpoint)){
+			isChanged = true;
+		}
+		this.endpoint = endpoint;
+	}
+
+	/**
+	 * @return useCustomParam
+	 */
+	public boolean isUseCustomParam() {
+		return useCustomParam;
+	}
+
+	/**
+	 * @param useCustomParam 繧ｻ繝�ヨ縺吶ｋ useCustomParam
+	 */
+	public void setUseCustomParam(boolean useCustomParam) {
+		if (this.useCustomParam != useCustomParam){
+			isChanged = true;
+		}
+
+		this.useCustomParam = useCustomParam;
+	}
+
+	/**
+	 * @return queryKey
+	 */
+	public String getQueryKey() {
+		return queryKey;
+	}
+
+	/**
+	 * @param queryKey 繧ｻ繝�ヨ縺吶ｋ queryKey
+	 */
+	public void setQueryKey(String queryKey) {
+		if (this.queryKey != null && !this.queryKey.equals(queryKey)){
+			isChanged = true;
+		}
+		this.queryKey = queryKey;
+	}
+
+	/**
+	 * @param namespaces 繧ｻ繝�ヨ縺吶ｋ namespaces
+	 */
+	public void setNamespaces(String namespaces) {
+		if (this.namespaces != null && !this.namespaces.equals(namespaces)){
+			isChanged = true;
+		}
+
+		this.namespaces = namespaces;
+	}
+
+	/**
+	 * @return namespaces
+	 */
+	public String getNamespaces() {
+		return namespaces;
+	}
+
+	public String[] getNamespaceList(){
+		List<String> ret = new ArrayList<String>();
+		String[] tmp = namespaces.split(",");
+		for (String e : tmp){
+			ret.add(e.trim());
+		}
+		return ret.toArray(new String[0]);
+	}
+
+	/**
+	 * @return option
+	 */
+	public String getOption() {
+		return option;
+	}
+
+	/**
+	 * @param option 繧ｻ繝�ヨ縺吶ｋ option
+	 */
+	public void setOption(String option) {
+		if (this.option != null && !this.option.equals(option)){
+			isChanged = true;
+		}
+		this.option = option;
+	}
+
+	/**
+	 * @return encoding
+	 */
+	public String getEncoding() {
+		return encoding;
+	}
+
+	/**
+	 * @param encoding 繧ｻ繝�ヨ縺吶ｋ encoding
+	 */
+	public void setEncoding(String encoding) {
+		if (this.encoding != null && !this.encoding.equals(encoding)){
+			isChanged = true;
+		}
+		this.encoding = encoding;
+	}
+
+	/**
+	 * @param resultType 繧ｻ繝�ヨ縺吶ｋ resultType
+	 */
+	public void setResultType(int resultType) {
+		if (this.resultType != resultType){
+			isChanged = true;
+		}
+		this.resultType = resultType;
+	}
+
+	/**
+	 * @return resultType
+	 */
+	public int getResultType() {
+		return resultType;
+	}
+
+	/**
+	 * @return editable
+	 */
+	public boolean isEditable() {
+		return editable;
+	}
+
+
+	/**
+	 * @param editable 繧ｻ繝�ヨ縺吶ｋ editable
+	 */
+	public void setEditable(boolean editable) {
+		if (this.editable != editable){
+			isChanged = true;
+		}
+		this.editable = editable;
+	}
+
+
+	/**
+	 * @return repositoryURL
+	 */
+	public String getRepositoryURL() {
+		return repositoryURL;
+	}
+
+
+	/**
+	 * @param repositoryURL 繧ｻ繝�ヨ縺吶ｋ repositoryURL
+	 */
+	public void setRepositoryURL(String repositoryURL) {
+		if (this.repositoryURL != null && !this.repositoryURL.equals(repositoryURL)){
+			isChanged = true;
+		}
+		this.repositoryURL = repositoryURL;
+	}
+
+
+	/**
+	 * @return repository
+	 */
+	public String getRepository() {
+		return repository;
+	}
+
+
+	/**
+	 * @param repository 繧ｻ繝�ヨ縺吶ｋ repository
+	 */
+	public void setRepository(String repository) {
+		if (this.repository != null && !this.repository.equals(repository)){
+			isChanged = true;
+		}
+		this.repository = repository;
+	}
+
+
+	/**
+	 * @return user
+	 */
+	public String getUser() {
+		return user;
+	}
+
+
+	/**
+	 * @param user 繧ｻ繝�ヨ縺吶ｋ user
+	 */
+	public void setUser(String user) {
+		if (this.user != null && !this.user.equals(user)){
+			isChanged = true;
+		}
+		this.user = user;
+	}
+
+
+	/**
+	 * @return pass
+	 */
+	public String getPass() {
+		return pass;
+	}
+
+
+	/**
+	 * @param pass 繧ｻ繝�ヨ縺吶ｋ pass
+	 */
+	public void setPass(String pass) {
+		if (this.pass != null && !this.pass.equals(pass)){
+			isChanged = true;
+		}
+		this.pass = pass;
+	}
+
+
+	/**
+	 * @param isTarget 繧ｻ繝�ヨ縺吶ｋ isTarget
+	 */
+	public void setTarget(boolean isTarget) {
+		if (this.isTarget != isTarget){
+			isChanged = true;
+		}
+		this.isTarget = isTarget;
+	}
+
+
+	/**
+	 * @return isTarget
+	 */
+	public boolean isTarget() {
+		return isTarget;
+	}
+
+
+	/**
+	 * 螟画峩迥ｶ諷九ｒ繝ｪ繧ｻ繝�ヨ縺吶ｋ
+	 */
+	public void resetChanged() {
+		this.isChanged = false;
+	}
+
+	/**
+	 * 
+	 * @return
+	 */
+	public boolean isChanged(){
+		return this.isChanged;
+	}
+
+	/* 莉･荳九�util繧ｯ繝ｩ繧ｹ縺ｫ繧上￠繧九⊇縺�′縺�＞��*/
+
+	public static String[] getResultDataTypeList(){
+		return dataTypeMap.keySet().toArray(new String[]{});
+	}
+
+	public static Integer getResultDataType(String str){
+		return dataTypeMap.get(str);
+	}
+
+	public static String getResultDataType(Integer type){
+		for (String key : dataTypeMap.keySet()){
+			if (dataTypeMap.get(key).equals(type)){
+				return key;
+			}
+		}
+
+		return null;
+	}
+
+	public static void outputXML(OutputStream os, EndpointSettings[] settings){
+		XMLEncoder enc = new XMLEncoder(os);
+		enc.writeObject(settings);
+		enc.close();
+	}
+
+	public static EndpointSettings[] inputXML(InputStream is){
+		XMLDecoder dec = new XMLDecoder(is);
+		EndpointSettings[] ret = (EndpointSettings[])dec.readObject();
+
+		
+		
+		return ret;
+	}
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/gui/RepositoryKeywordSearchEditPanel.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/gui/RepositoryKeywordSearchEditPanel.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/gui/RepositoryKeywordSearchEditPanel.java (revision 9)
@@ -0,0 +1,1304 @@
+package hozo.sparql.gui;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Window;
+import java.awt.Dialog.ModalityType;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.BoxLayout;
+import javax.swing.ButtonGroup;
+import javax.swing.DefaultListModel;
+import javax.swing.JDialog;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JLabel;
+import javax.swing.JPopupMenu;
+import javax.swing.JRadioButton;
+import javax.swing.JSeparator;
+import javax.swing.JSplitPane;
+import javax.swing.JTable;
+import javax.swing.JTextField;
+import javax.swing.JList;
+import javax.swing.JScrollPane;
+import javax.swing.JButton;
+import javax.swing.SwingConstants;
+import javax.swing.SwingUtilities;
+import javax.swing.event.ListDataEvent;
+import javax.swing.event.ListDataListener;
+import javax.swing.table.DefaultTableModel;
+
+import com.hp.hpl.jena.rdf.model.RDFNode;
+
+import jp.ac.osaka_u.sanken.sparql.AllegroAccessor;
+import jp.ac.osaka_u.sanken.sparql.EndpointSettings;
+import jp.ac.osaka_u.sanken.sparql.EndpointSettingsManager;
+import jp.ac.osaka_u.sanken.sparql.SparqlAccessor;
+import jp.ac.osaka_u.sanken.sparql.SparqlAccessorFactory;
+import jp.ac.osaka_u.sanken.sparql.SparqlQueryListener;
+import jp.ac.osaka_u.sanken.sparql.SparqlResultListener;
+import jp.ac.osaka_u.sanken.sparql.SparqlResultSet;
+import jp.ac.osaka_u.sanken.sparql.ThreadedSparqlAccessor;
+import jp.ac.osaka_u.sanken.sparql.edit.AllegroEditor;
+import jp.ac.osaka_u.sanken.util.EditableList;
+import jp.ac.osaka_u.sanken.util.EditableListItem;
+import jp.ac.osaka_u.sanken.util.StringUtil;
+
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+
+public class RepositoryKeywordSearchEditPanel extends JPanel {
+
+	private static final long serialVersionUID = 1L;
+	private JPanel keywordPanel = null;
+	private JLabel keywordLabel = null;
+	private JTextField keywordTextField = null;
+	private JList subjectList = null;
+	private JScrollPane subjectScrollPane = null;
+	private JPanel centerPanel = null;
+	private JPanel footerPanel = null;
+	private JScrollPane resultListScrollPane = null;  //  @jve:decl-index=0:visual-constraint="153,224"
+	private JTable resultList = null;  //  @jve:decl-index=0:visual-constraint="369,21"
+	private JButton runQueryButton = null;  //  @jve:decl-index=0:visual-constraint="390,64"
+	private JSplitPane mainSplitPane = null;
+	private JPanel optionPanel = null;
+	private JPanel findTypePanel = null;
+	private JRadioButton fullMatchRadioButton = null;
+	private JRadioButton partMatchRadioButton = null;
+	private JSeparator findSeparator = null;
+	private boolean processing = false;
+	private JPanel headerPanel = null;
+	private JPanel limitPanel = null;
+	private JCheckBox limitEnableCheckBox = null;
+	private JLabel limitLabel = null;
+	private JComboBox limitComboBox = null;
+	private JRadioButton findSubjectRadioButton = null;
+	private JRadioButton findObjectRadioButton = null;
+	private JRadioButton findAllRadioButton = null;
+	private JRadioButton findLabelObjectRadioButton = null;
+	private Date fromDate;
+	private JPanel movePanel = null;
+	private JButton prevButton = null;
+	private JButton nextButton = null;
+	private JPanel limitMainPanel = null;
+	private JButton limitPrevButton = null;
+	private JButton limitNextButton = null;
+
+
+	private SparqlAccessorForm parent;
+
+	private DefaultListModel listModel;
+	private DefaultTableModel tableModel;
+
+	private AllegroEditor allegroEditor;
+
+	private Triple editing = null;
+
+	/* subject繧ｸ繝｣繝ｳ繝励ヲ繧ｹ繝医Μ */
+	private int historyIndex = 0;
+	private List<String> history;  //  @jve:decl-index=0:
+	private List<RDFNode> subjectHistoryList;
+
+	/* limit繝偵せ繝医Μ */
+	private Integer limit = null;  //  @jve:decl-index=0:
+	private int page = 0;
+	private String word;
+	private boolean fullMatch = false;
+	private int type;
+	private boolean hasLimitNext = false;
+
+	private static final String DEFAULT_PROPERTY_TYPE = "http://www.w3.org/2000/01/rdf-schema#label";
+
+
+	/**
+	 * This is the default constructor
+	 */
+	public RepositoryKeywordSearchEditPanel(SparqlAccessorForm parent) {
+		super();
+		initialize();
+		this.parent = parent;
+	}
+
+	/**
+	 * This method initializes this
+	 *
+	 * @return void
+	 */
+	private void initialize() {
+		this.setSize(300, 200);
+		this.setLayout(new BorderLayout());
+		this.add(getHeaderPanel(), BorderLayout.NORTH);
+		this.add(getMainSplitPane(), BorderLayout.CENTER);
+	}
+
+	private JSplitPane getMainSplitPane(){
+		if (mainSplitPane == null){
+			mainSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, getCenterPanel(), getFooterPanel());
+			mainSplitPane.setDividerLocation(200);
+		}
+
+		return mainSplitPane;
+	}
+
+	/**
+	 * This method initializes keywordPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getKeywordPanel() {
+		if (keywordPanel == null) {
+			keywordPanel = new JPanel();
+			keywordPanel.setLayout(new BorderLayout());
+			keywordLabel = new JLabel();
+			keywordLabel.setText("Enter Keyword");
+			keywordPanel.add(keywordLabel, BorderLayout.WEST);
+			keywordPanel.add(getKeywordTextField(), BorderLayout.CENTER);
+			keywordPanel.add(getRunQueryButton(), BorderLayout.EAST);
+		}
+		return keywordPanel;
+	}
+
+
+	/**
+	 * This method initializes optionPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getOptionPanel() {
+		if (optionPanel == null) {
+			optionPanel = new JPanel();
+			optionPanel.setLayout(new BorderLayout());
+			optionPanel.add(getFindTypePanel(), BorderLayout.CENTER);
+			optionPanel.add(getLimitPanel(), BorderLayout.EAST);
+		}
+		return optionPanel;
+	}
+
+	/**
+	 * This method initializes findTypePanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getFindTypePanel() {
+		if (findTypePanel == null) {
+			FlowLayout flowLayout = new FlowLayout();
+			flowLayout.setHgap(10);
+			flowLayout.setVgap(0);
+			findTypePanel = new JPanel();
+			findTypePanel.setLayout(flowLayout);
+			findTypePanel.add(getFullMatchRadioButton(), null);
+			findTypePanel.add(getPartMatchRadioButton(), null);
+			findTypePanel.add(getFindSeparator(), null);
+			findTypePanel.add(getFindAllRadioButton(), null);
+			findTypePanel.add(getFindSubjectRadioButton(), null);
+			findTypePanel.add(getFindObjectRadioButton(), null);
+			findTypePanel.add(getFindLabelObjectRadioButton(), null);
+			ButtonGroup bg = new ButtonGroup();
+			bg.add(getFullMatchRadioButton());
+			bg.add(getPartMatchRadioButton());
+			getFullMatchRadioButton().setSelected(true);
+			ButtonGroup bg2 = new ButtonGroup();
+			bg2.add(getFindAllRadioButton());
+			bg2.add(getFindSubjectRadioButton());
+			bg2.add(getFindObjectRadioButton());
+			bg2.add(getFindLabelObjectRadioButton());
+			getFindSubjectRadioButton().setSelected(true);
+		}
+		return findTypePanel;
+	}
+
+	private boolean isFullMatch(){
+		return getFullMatchRadioButton().isSelected();
+	}
+
+	private int getFindType(){
+		if (getFindSubjectRadioButton().isSelected()){
+			return SparqlAccessor.FIND_TARGET_SUBJECT;
+		}
+		if (getFindObjectRadioButton().isSelected()){
+			return SparqlAccessor.FIND_TARGET_OBJECT;
+		}
+		if (getFindLabelObjectRadioButton().isSelected()){
+			return SparqlAccessor.FIND_TARGET_SPECIFIC_OBJECT;
+		}
+		return SparqlAccessor.FIND_TARGET_ALL;
+	}
+
+	/**
+	 * This method initializes fulMatchRadioButton
+	 *
+	 * @return javax.swing.JRadioButton
+	 */
+	private JRadioButton getFullMatchRadioButton() {
+		if (fullMatchRadioButton == null) {
+			fullMatchRadioButton = new JRadioButton("Full Match");
+		}
+		return fullMatchRadioButton;
+	}
+
+	/**
+	 * This method initializes partMatchRadioButton
+	 *
+	 * @return javax.swing.JRadioButton
+	 */
+	private JRadioButton getPartMatchRadioButton() {
+		if (partMatchRadioButton == null) {
+			partMatchRadioButton = new JRadioButton("Part Match");
+		}
+		return partMatchRadioButton;
+	}
+
+	/**
+	 * This method initializes findSeparator
+	 *
+	 * @return JSeparator
+	 */
+	private JSeparator getFindSeparator() {
+		if (findSeparator == null) {
+			findSeparator = new JSeparator(SwingConstants.VERTICAL);
+			findSeparator.setPreferredSize(new Dimension(5, 20));
+		}
+		return findSeparator;
+	}
+
+
+	/**
+	 * This method initializes keywordTextField
+	 *
+	 * @return javax.swing.JTextField
+	 */
+	private JTextField getKeywordTextField() {
+		if (keywordTextField == null) {
+			keywordTextField = new JTextField();
+			keywordTextField.addKeyListener(new KeyAdapter() {
+				@Override
+				public void keyTyped(KeyEvent arg0) {
+					if (arg0.getKeyChar() == KeyEvent.VK_ENTER){
+						doSearch();
+					}
+				}
+			});
+		}
+		return keywordTextField;
+	}
+
+	/**
+	 * 讀懃ｴ｢繝ｯ繝ｼ繝峨ｒ蜿門ｾ励☆繧�
+	 * @return
+	 */
+	public String getFindWord(){
+		return getKeywordTextField().getText();
+	}
+
+
+	/**
+	 * This method initializes subjectList
+	 *
+	 * @return javax.swing.JList
+	 */
+	private JList getSubjectList() {
+		if (subjectList == null) {
+			subjectList = new JList();
+			subjectList.addMouseListener(new MouseAdapter() {
+
+				@Override
+				public void mouseClicked(MouseEvent e) {
+					if (e.getClickCount() >= 2){
+						RDFNode subject = (RDFNode)getSubjectList().getSelectedValue();
+
+						if (findSubjectTriple(subject.toString())){
+							addHistory(subject.toString());
+							editing = new Triple(subject, null, null);
+						}
+					}
+				}
+			});
+
+		}
+		return subjectList;
+	}
+
+	private SparqlResultListener createSparqlResultListener2(){
+		return new SparqlResultListener() {
+
+			@Override
+			public void resultReceived(SparqlResultSet result) {
+				// 邨先棡繧偵∪縺壹�list縺ｫ霑ｽ蜉
+				setProcessing(false);
+				setResults(result);
+			}
+
+			@Override
+			public void uncaughtException(Thread t, Throwable e) {
+				exception(e);
+
+			}
+		};
+	}
+
+	private void setSubjectList(String obj){
+		listModel = new DefaultListModel();
+		listModel.addElement(obj);
+		getSubjectList().setModel(listModel);
+	}
+
+	public void setSubjectList(List<RDFNode> list){
+		subjectHistoryList = list;
+		listModel = new DefaultListModel();
+		for (RDFNode item : list){
+			listModel.addElement(item);
+		}
+		getSubjectList().setModel(listModel);
+	}
+
+	/**
+	 * This method initializes subjectScrollPane
+	 *
+	 * @return javax.swing.JScrollPane
+	 */
+	private JScrollPane getSubjectScrollPane() {
+		if (subjectScrollPane == null) {
+			subjectScrollPane = new JScrollPane(getSubjectList());
+		}
+		return subjectScrollPane;
+	}
+
+	/**
+	 * This method initializes centerPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getCenterPanel() {
+		if (centerPanel == null) {
+			centerPanel = new JPanel();
+			centerPanel.setLayout(new BorderLayout());
+			centerPanel.add(getSubjectScrollPane(), BorderLayout.CENTER);
+		}
+		return centerPanel;
+	}
+
+	/**
+	 * This method initializes footerPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getFooterPanel() {
+		if (footerPanel == null) {
+			footerPanel = new JPanel();
+			footerPanel.setLayout(new BorderLayout());
+			footerPanel.add(getResultListScrollPane(), BorderLayout.CENTER);
+		}
+		return footerPanel;
+	}
+
+	/**
+	 * This method initializes resultListScrollPane
+	 *
+	 * @return javax.swing.JScrollPane
+	 */
+	private JScrollPane getResultListScrollPane() {
+		if (resultListScrollPane == null) {
+			resultListScrollPane = new JScrollPane(getResultList());
+		}
+		return resultListScrollPane;
+	}
+
+	/**
+	 * This method initializes resultList
+	 *
+	 * @return javax.swing.JList
+	 */
+	private JTable getResultList() {
+		if (resultList == null) {
+			resultList = new JTable();
+			resultList.setDefaultEditor(Object.class, null);
+			resultList.addMouseListener(new MouseAdapter() {
+				@Override
+				public void mouseClicked(MouseEvent e) {
+					if (e.getClickCount() >= 2){
+						int index = resultList.getSelectedRow();
+
+						String o = (resultList.getValueAt(index, 1)).toString();
+
+						setSubjectList(o);
+
+						if (findSubjectTriple(o)){
+							addHistory(o);
+						}
+						return;
+					}
+
+					// 繝繝悶Ν繧ｯ繝ｪ繝�け縺倥ｃ縺ｪ縺�ｴ蜷医�蜿ｳ繧ｯ繝ｪ繝�け縺九メ繧ｧ繝�け
+					if (editing == null){
+						return;
+					}
+
+					if (SwingUtilities.isRightMouseButton(e)){
+						int index = resultList.getSelectedRow();
+
+						RDFNode p = (RDFNode)resultList.getValueAt(index, 0);
+						RDFNode o = (RDFNode)resultList.getValueAt(index, 1);
+						editing.p = p;
+						editing.o = o;
+						editing.index = index;
+
+						showPopup(e.getComponent(), e.getX(), e.getY());
+					}
+
+
+					System.out.println("s:p:o" + editing.s + ":" +editing.p +":" +editing.o);
+					allegroEditor.close();
+				}
+			});
+		}
+		return resultList;
+	}
+
+	private void showPopup(Component c, int x, int y){
+		JPopupMenu menu = new JPopupMenu();
+		JMenuItem add = new JMenuItem("Add New Object to This Subject");
+		add.addActionListener(new ActionListener() {
+
+			@Override
+			public void actionPerformed(ActionEvent e) {
+				addNewTriple(editing.index);
+			}
+		});
+		JMenuItem edit = new JMenuItem("Edit This Triple");
+		edit.addActionListener(new ActionListener() {
+
+			@Override
+			public void actionPerformed(ActionEvent arg0) {
+				editCurrentTriple(editing.index);
+			}
+		});
+		JMenuItem delete = new JMenuItem("Delete This Triple");
+		delete.addActionListener(new ActionListener() {
+
+			@Override
+			public void actionPerformed(ActionEvent arg0) {
+				int result = JOptionPane.showConfirmDialog(null, "Delete this Triple", null, JOptionPane.OK_CANCEL_OPTION);
+				if (result == JOptionPane.OK_OPTION){
+//					ae.delete(editing.s, editing.p, editing.o);
+					if (deleteCurrentTriple(editing.index)){
+						// 蜑企勁謌仙粥
+						JOptionPane.showMessageDialog(null, "Delete Succeed.");
+					} else {
+						JOptionPane.showMessageDialog(null, "Delete Failed.");
+					}
+				}
+
+			}
+		});
+
+		menu.add(add);
+		menu.add(edit);
+		menu.add(delete);
+		menu.show(c, x, y);
+	}
+
+	private boolean addNewTriple(int index){
+		TripleEditDialog ted;
+		try {
+			ted = new TripleEditDialog(editing.s, editing.p, null, allegroEditor.getModel());
+			ted.setVisible(true);
+			if (ted.ok){
+				RDFNode s = ted.getSubject();
+				RDFNode p = ted.getProperty();
+				RDFNode o = ted.getObject();
+				if (s == null || p == null || o == null){
+					// error
+					JOptionPane.showMessageDialog(null, "Wrong Triple. s:["+s+"] p:["+p+"] o:["+o+"]");
+				} else {
+					if (allegroEditor.add(s, p, o)){
+						((DefaultTableModel)getResultList().getModel()).insertRow(index, new Object[]{p, o});
+						return true;
+					}
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return false;
+	}
+
+	private boolean editCurrentTriple(int index){
+		TripleEditDialog ted;
+		try {
+			ted = new TripleEditDialog(editing.s, editing.p, editing.o, allegroEditor.getModel());
+			ted.setVisible(true);
+			if (ted.ok){
+				RDFNode s = ted.getSubject();
+				RDFNode p = ted.getProperty();
+				RDFNode o = ted.getObject();
+				if (s == null || p == null || o == null){
+					// error
+					JOptionPane.showMessageDialog(null, "Wrong Triple. s:["+s+"] p:["+p+"] o:["+o+"]");
+				} else {
+					if (allegroEditor.edit(editing.s, editing.p, editing.o, s, p, o)){
+						((DefaultTableModel)getResultList().getModel()).removeRow(index);
+						((DefaultTableModel)getResultList().getModel()).insertRow(index, new Object[]{p, o});
+						return true;
+					}
+				}
+			}
+		} catch (Exception e){
+			exception(e);
+		}
+
+		return false;
+	}
+
+	private boolean deleteCurrentTriple(int index){
+		// 蜑企勁蜃ｦ逅�
+		try {
+			if (allegroEditor.delete(editing.s, editing.p, editing.o)){
+				((DefaultTableModel)getResultList().getModel()).removeRow(index);
+				return true;
+			}
+		} catch (Exception e){
+			exception(e);
+		}
+
+		return false;
+	}
+
+	public void setResults(SparqlResultSet result){ // TODO
+		if (result == null || result.getDefaultResult() == null || result.getDefaultResult().size() == 0){
+			tableModel = new DefaultTableModel();
+			getResultList().setModel(tableModel);
+			return;
+		}
+		List<Map<String, RDFNode>> list = result.getDefaultResult();
+
+		// header繧ｻ繝�ヨ
+		Map<String, RDFNode> columns = list.get(0);
+		List<String> clm = new ArrayList<String>();
+		for (String key : columns.keySet()){
+			clm.add(key);
+		}
+		tableModel = new DefaultTableModel(clm.toArray(new String[]{}), 0){
+			/**
+			 *
+			 */
+			private static final long serialVersionUID = -6279650186089279390L;
+
+			@Override
+			public boolean isCellEditable(int row, int col){
+				return false;
+			}
+		};
+
+
+		// 荳ｭ霄ｫ繧ｻ繝�ヨ
+		for (Map<String, RDFNode> r : list){
+			List<Object> row = new ArrayList<Object>();
+			for (String key : clm){
+				RDFNode node = r.get(key);
+				row.add(node);
+			}
+			tableModel.addRow(row.toArray(new Object[]{}));
+		}
+
+		getResultList().setModel(tableModel);
+
+		parent.setResults(result);
+
+	}
+
+	private void setProcessing(boolean processing){
+		this. processing = processing;
+		getSubjectList().setEnabled(!processing);
+		getRunQueryButton().setEnabled(!processing);
+		getResultList().setEnabled(!processing);
+		getKeywordTextField().setEnabled(!processing);
+		getFullMatchRadioButton().setEnabled(!processing);
+		getPartMatchRadioButton().setEnabled(!processing);
+//		getFindAllRadioButton().setEnabled(!processing);
+		getFindSubjectRadioButton().setEnabled(!processing);
+		getFindObjectRadioButton().setEnabled(!processing);
+		getFindLabelObjectRadioButton().setEnabled(!processing);
+
+		updateButtonStates();
+		updateLimitButtonStates();
+
+		parent.setProcessing(processing);
+	}
+
+	private boolean isProcessing(){
+		return this.processing;
+	}
+
+	/**
+	 * This method initializes runQueryButton
+	 *
+	 * @return javax.swing.JButton
+	 */
+	private JButton getRunQueryButton() {
+		if (runQueryButton == null) {
+			runQueryButton = new JButton("Find");
+			runQueryButton.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					doSearch();
+				}
+			});
+		}
+		return runQueryButton;
+	}
+
+	private void doSearch(){
+		if (isProcessing()){
+			return;
+		}
+		initHistory();
+		initLimit();
+
+		setResults(null);
+		setProcessing(true);
+		EndpointSettings setting = EndpointSettingsManager.instance.getSetting(parent.getCurrentEndPoint());
+		ThreadedSparqlAccessor sa = SparqlAccessorFactory.createSparqlAccessor(setting, new SparqlQueryListener() {
+			@Override
+			public void sparqlExecuted(String query) {
+				fromDate = new Date();
+				parent.addLogText("----------------");
+				parent.addLogText(query);
+			}
+		});
+
+		try {
+			// page蛻�崛逕ｨ縺ｫ繝舌ャ繧ｯ繧｢繝��
+			this.word = getFindWord();
+			this.fullMatch = isFullMatch();
+			this.limit = getLimit();
+			this.type = getFindType();
+
+			if (sa instanceof AllegroAccessor){
+				allegroEditor = new AllegroEditor((AllegroAccessor)sa, setting.getRepositoryURL(), setting.getRepository(), setting.getUser(), setting.getPass());
+				sa.findSubject(word, fullMatch, limit, (limit != null ? (limit * page) : null), type, null, createSparqlResultListener()); // TODO
+			} else {
+				// TODO 邱ｨ髮�ｸ榊庄
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			exception(e);
+		}
+
+	}
+
+	private SparqlResultListener createSparqlResultListener(){
+		return new SparqlResultListener() {
+
+			@Override
+			public void resultReceived(SparqlResultSet resultSet) {
+
+				hasLimitNext = resultSet.isHasNext();
+
+
+				List<Map<String, RDFNode>> result = resultSet.getDefaultResult();
+				Date now = new Date();
+				long time = now.getTime() - fromDate.getTime();
+				parent.addLogText("---------------- result:"+time+" ms");
+				// 邨先棡繧偵∪縺壹�list縺ｫ霑ｽ蜉
+				List<RDFNode> resultList = new ArrayList<RDFNode>();
+				for (Map<String, RDFNode> item : result){
+					RDFNode node = item.get("s");
+					resultList.add(node);
+				}
+
+				setSubjectList(resultList);
+				setProcessing(false);
+			}
+
+			@Override
+			public void uncaughtException(Thread t, Throwable e) {
+				exception(e);
+			}
+		};
+	}
+
+	private void exception(Throwable e){
+		JOptionPane.showMessageDialog(parent, "Execute error:"+e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
+		setProcessing(false);
+	}
+
+	/**
+	 * This method initializes headerPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getHeaderPanel() {
+		if (headerPanel == null) {
+			headerPanel = new JPanel();
+			headerPanel.setLayout(new BorderLayout());
+			headerPanel.add(getKeywordPanel(), BorderLayout.CENTER);
+			headerPanel.add(getOptionPanel(), BorderLayout.SOUTH);
+			headerPanel.add(getMovePanel(), BorderLayout.WEST);
+		}
+		return headerPanel;
+	}
+
+	/**
+	 * This method initializes limitPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getLimitPanel() {
+		if (limitPanel == null) {
+			limitLabel = new JLabel();
+			limitLabel.setText(" LIMIT  ");
+			limitLabel.setEnabled(false);
+			limitPanel = new JPanel();
+			limitPanel.setLayout(new BorderLayout());
+			limitPanel.add(getLimitEnableCheckBox(), BorderLayout.WEST);
+			limitPanel.add(limitLabel, BorderLayout.CENTER);
+			limitPanel.add(getLimitMainPanel(), BorderLayout.EAST);
+		}
+		return limitPanel;
+	}
+
+	private Integer getLimit(){
+		try {
+			if (getLimitComboBox().isEnabled()){
+				return Integer.parseInt((String)getLimitComboBox().getSelectedItem());
+			}
+		} catch(Exception e){}
+		return null;
+	}
+
+	/**
+	 * This method initializes limitEnableCheckBox
+	 *
+	 * @return javax.swing.JCheckBox
+	 */
+	private JCheckBox getLimitEnableCheckBox() {
+		if (limitEnableCheckBox == null) {
+			limitEnableCheckBox = new JCheckBox();
+			limitEnableCheckBox.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					boolean enabled = getLimitEnableCheckBox().isSelected();
+					getLimitComboBox().setEnabled(enabled);
+					limitLabel.setEnabled(enabled);
+					updateLimitButtonStates();
+				}
+			});
+		}
+		return limitEnableCheckBox;
+	}
+
+	/**
+	 * This method initializes limitComboBox
+	 *
+	 * @return javax.swing.JComboBox
+	 */
+	private JComboBox getLimitComboBox() {
+		if (limitComboBox == null) {
+			String[] limits = {"100","250","500","1000"};
+			limitComboBox = new JComboBox(limits);
+			limitComboBox.setEnabled(false);
+		}
+		return limitComboBox;
+	}
+
+	/**
+	 * This method initializes findSubjectRadioButton
+	 *
+	 * @return javax.swing.JRadioButton
+	 */
+	private JRadioButton getFindSubjectRadioButton() {
+		if (findSubjectRadioButton == null) {
+			findSubjectRadioButton = new JRadioButton("Find Subject");
+		}
+		return findSubjectRadioButton;
+	}
+
+	/**
+	 * This method initializes findObjectRadioButton
+	 *
+	 * @return javax.swing.JRadioButton
+	 */
+	private JRadioButton getFindObjectRadioButton() {
+		if (findObjectRadioButton == null) {
+			findObjectRadioButton = new JRadioButton("Find All Object");
+		}
+		return findObjectRadioButton;
+	}
+
+	/**
+	 * This method initializes findAllRadioButton
+	 *
+	 * @return javax.swing.JRadioButton
+	 */
+	private JRadioButton getFindAllRadioButton() {
+		if (findAllRadioButton == null) {
+			findAllRadioButton = new JRadioButton("Find All");
+			findAllRadioButton.setEnabled(false);
+		}
+		return findAllRadioButton;
+	}
+
+	/**
+	 * This method initializes movePanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getMovePanel() {
+		if (movePanel == null) {
+			movePanel = new JPanel();
+			movePanel.setLayout(new BoxLayout(movePanel, BoxLayout.X_AXIS));
+			movePanel.add(getPrevButton(), null);
+			movePanel.add(getNextButton(), null);
+		}
+		return movePanel;
+	}
+
+	/**
+	 * This method initializes prevButton
+	 *
+	 * @return javax.swing.JButton
+	 */
+	private JButton getPrevButton() {
+		if (prevButton == null) {
+			prevButton = new JButton("竊�);
+			prevButton.setMargin(new Insets(0, 10, 0, 10));
+			prevButton.setEnabled(false);
+			prevButton.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					String s = getPrev();
+					if (s != null){
+						if (historyIndex == 0){
+							// TODO 繝ｪ繧ｹ繝亥�菴�
+							setSubjectList(subjectHistoryList);
+						}else {
+							setSubjectList(s);
+						}
+						findSubjectTriple(s);
+					}
+				}
+			});
+		}
+		return prevButton;
+	}
+
+	/**
+	 * This method initializes nextButton
+	 *
+	 * @return javax.swing.JButton
+	 */
+	private JButton getNextButton() {
+		if (nextButton == null) {
+			nextButton = new JButton("竊�);
+			nextButton.setMargin(new Insets(0, 10, 0, 10));
+			nextButton.setEnabled(false);
+			nextButton.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					String s = getNext();
+					if (s != null){
+						setSubjectList(s);
+						findSubjectTriple(s);
+					}
+				}
+			});
+		}
+		return nextButton;
+	}
+
+	/**
+	 * This method initializes findLabelObjectRadioButton
+	 *
+	 * @return javax.swing.JRadioButton
+	 */
+	private JRadioButton getFindLabelObjectRadioButton() {
+		if (findLabelObjectRadioButton == null) {
+			findLabelObjectRadioButton = new JRadioButton("Find Specific Object");
+			findLabelObjectRadioButton.addMouseListener(new MouseAdapter() {
+				@Override
+				public void mouseClicked(MouseEvent e) {
+					awakePropertyListPopup(e.getLocationOnScreen());
+				}
+			});
+		}
+		return findLabelObjectRadioButton;
+	}
+
+
+	private boolean findSubjectTriple(String s){
+		if (isProcessing()){
+			return false;
+		}
+		setProcessing(true);
+		// table繧ｯ繝ｪ繧｢
+		setResults(null);
+		allegroEditor.getAccessor().findTripleFromSubject(s, createSparqlResultListener2());
+		return true;
+	}
+
+
+	private PropertyDialog propDialog;
+
+	private List<EditableListItem> targetObjectTypes;
+
+	/**
+	 * proeprty驕ｸ謚樒畑POPUP陦ｨ遉ｺ
+	 * @param p
+	 * @return
+	 */
+	private boolean awakePropertyListPopup(Point p){
+		DefaultListModel model = new DefaultListModel();
+		for (EditableListItem tp : getTargetPropertyListItem()){
+			model.addElement(tp);
+		}
+
+		EditableList properties = new EditableList(model);
+		propDialog = new PropertyDialog(this.parent, properties);
+		properties.getTextField().addKeyListener(new KeyAdapter() {
+
+			@Override
+			public void keyReleased(KeyEvent e) {
+				List<String> propList = getPropertyList(parent.getCurrentEndPoint());
+				String word = ((JTextField)e.getSource()).getText();
+
+				if (word.length() > 2){
+					List<String> candidates = StringUtil.getPartHitString(propList, word);
+
+					if (candidates.size() < 20){
+						awakeCandidateList(candidates, propDialog.getList().getTextField().getLocationOnScreen());
+					}
+				} else {
+					if (popup != null){
+						popup.setVisible(false);
+						popup = null;
+					}
+				}
+
+			}
+		});		properties.getModel().addListDataListener(new ListDataListener() {
+
+			@Override
+			public void intervalRemoved(ListDataEvent e) {
+				propDialog.pack();
+			}
+
+			@Override
+			public void intervalAdded(ListDataEvent e) {
+				propDialog.pack();
+			}
+
+			@Override
+			public void contentsChanged(ListDataEvent e) {
+			}
+		});
+		properties.getTextField().addActionListener(new ActionListener() {
+
+			@Override
+			public void actionPerformed(ActionEvent e) {
+				if (propDialog.getList().getTextField().getText().isEmpty()){
+					//
+					propDialog.setOK(true);
+					propDialog.setVisible(false);
+				}
+			}
+		});
+		propDialog.setLocation(p);
+		propDialog.pack();
+		propDialog.setModalityType(ModalityType.DOCUMENT_MODAL);
+		propDialog.setVisible(true);
+
+		if (popup != null){
+			popup.setVisible(false);
+		}
+
+		if (!propDialog.isOK()){
+			return false;
+		}
+		model = (DefaultListModel)properties.getModel();
+
+		getTargetPropertyListItem().clear();
+		for (int i=0; i<model.getSize(); i++){
+			Object item = model.getElementAt(i);
+			if (item instanceof EditableListItem){
+				getTargetPropertyListItem().add((EditableListItem)item);
+			}
+		}
+
+		return true;
+	}
+
+	private Map<String,List<String>> propertyList = new HashMap<String, List<String>>();
+
+	private List<String> getPropertyList(String endpoint){
+		List<String> ret = propertyList.get(endpoint);
+		if (ret == null){
+			try {
+				if (allegroEditor != null && allegroEditor.getAccessor() != null){
+					ret = new ArrayList<String>();
+
+					List<Map<String, RDFNode>> results = allegroEditor.getAccessor().findPropertyList();
+					for (Map<String, RDFNode> result : results){
+						for (String nodeStr : result.keySet()){
+							if (nodeStr != null && !ret.contains(nodeStr)){
+								ret.add(nodeStr);
+							}
+						}
+/*
+						RDFNode node = result.get("p");
+						if (node != null && !propertyList.contains(node.toString())){
+							propertyList.add(node.toString());
+						}*/
+					}
+					propertyList.put(endpoint, ret);
+				}
+			} catch (Exception e){
+				// 繧ｨ繝ｩ繝ｼ縺ｯ闖ｯ鮗励↓繧ｹ繝ｫ繝ｼ
+			}
+		}
+
+		return propertyList.get(endpoint);
+	}
+
+	private List<EditableListItem> getTargetPropertyListItem(){
+		if (targetObjectTypes == null){
+			targetObjectTypes = new ArrayList<EditableListItem>();
+			targetObjectTypes.add(new EditableListItem(DEFAULT_PROPERTY_TYPE, false));
+		}
+		return targetObjectTypes;
+	}
+
+	JPopupMenu popup;
+
+	private void awakeCandidateList(List<String> candidates, Point p){
+		if (popup != null){
+			popup.setVisible(false);
+		}
+		popup = new JPopupMenu();
+
+		for (String candidate : candidates){
+			JMenuItem item = new JMenuItem(candidate);
+			item.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					propDialog.getList().getTextField().setText(((JMenuItem)e.getSource()).getText());
+					popup.setVisible(false);
+					popup = null;
+				}
+			});
+			popup.add(item);
+		}
+		popup.setLocation(p.x + 400, p.y + 20);
+		popup.setVisible(true);
+	}
+
+	private void initHistory(){
+		this.history = new ArrayList<String>();
+		this.historyIndex = -1;
+		updateButtonStates();
+	}
+
+	private void addHistory(String item){
+
+		if (this.historyIndex >= 0 && this.historyIndex < (this.history.size() - 1)){
+			for (int i=this.history.size()-1; i > this.historyIndex; i--){
+				this.history.remove(i);
+			}
+		}
+		this.history.add(item);
+		this.historyIndex++;
+		updateButtonStates();
+		}
+
+	private String getPrev(){
+		if (hasPrev()){
+			--historyIndex;
+			updateButtonStates();
+			return this.history.get(historyIndex);
+		}
+		return null;
+	}
+
+	private String getNext(){
+		if (hasNext()){
+			++historyIndex;
+			updateButtonStates();
+			return this.history.get(historyIndex);
+		}
+		return null;
+	}
+
+	private void updateButtonStates(){
+		if (!this.processing){
+			this.getPrevButton().setEnabled(hasPrev());
+			this.getNextButton().setEnabled(hasNext());
+		} else {
+			this.getPrevButton().setEnabled(false);
+			this.getNextButton().setEnabled(false);
+		}
+	}
+
+	private boolean hasPrev(){
+		if (history.size() != 0 && historyIndex > 0){
+			return true;
+		}
+		return false;
+	}
+
+	private boolean hasNext(){
+		if ((historyIndex + 1) < history.size()){
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * This method initializes limitMainPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getLimitMainPanel() {
+		if (limitMainPanel == null) {
+			limitMainPanel = new JPanel();
+			limitMainPanel.setLayout(new BorderLayout());
+			limitMainPanel.add(getLimitComboBox(), BorderLayout.WEST);
+			limitMainPanel.add(getLimitPrevButton(), BorderLayout.CENTER);
+			limitMainPanel.add(getLimitNextButton(), BorderLayout.EAST);
+		}
+		return limitMainPanel;
+	}
+
+	/**
+	 * This method initializes limitPrevButton
+	 *
+	 * @return javax.swing.JButton
+	 */
+	private JButton getLimitPrevButton() {
+		if (limitPrevButton == null) {
+			limitPrevButton = new JButton("竊�);
+			limitPrevButton.setMargin(new Insets(0, 10, 0, 10));
+			limitPrevButton.setEnabled(false);
+			limitPrevButton.addActionListener(new ActionListener() {
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					setProcessing(true);
+					allegroEditor.getAccessor().findSubject(word, fullMatch, limit, (limit * (--page)), type, getTargetPropertyList(), createSparqlResultListener());
+				}
+			});
+		}
+		return limitPrevButton;
+	}
+
+	/**
+	 * This method initializes limitNextButton
+	 *
+	 * @return javax.swing.JButton
+	 */
+	private JButton getLimitNextButton() {
+		if (limitNextButton == null) {
+			limitNextButton = new JButton("竊�);
+			limitNextButton.setMargin(new Insets(0, 10, 0, 10));
+			limitNextButton.setEnabled(false);
+			limitNextButton.addActionListener(new ActionListener() {
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					setProcessing(true);
+
+					allegroEditor.getAccessor().findSubject(word, fullMatch, limit, (limit * (++page)), type, getTargetPropertyList(), createSparqlResultListener());
+				}
+			});
+		}
+		return limitNextButton;
+	}
+
+	private void initLimit(){
+		limit = this.getLimit();
+		page = 0;
+	}
+
+	private void updateLimitButtonStates(){
+		if (!this.processing && this.getLimitEnableCheckBox().isSelected()){
+			this.getLimitPrevButton().setEnabled(page != 0);
+			this.getLimitNextButton().setEnabled(hasLimitNext);
+		} else {
+			this.getLimitPrevButton().setEnabled(false);
+			this.getLimitNextButton().setEnabled(false);
+		}
+	}
+
+	private String[] getTargetPropertyList(){
+		List<String> ret = new ArrayList<String>();
+		if (targetObjectTypes != null && targetObjectTypes.size() > 0){
+			for (EditableListItem item : targetObjectTypes){
+				ret.add(item.text);
+			}
+		} else {
+			ret.add(DEFAULT_PROPERTY_TYPE);
+		}
+		return ret.toArray(new String[0]);
+	}
+
+	class PropertyDialog extends JDialog {
+		/**
+		 *
+		 */
+		private static final long serialVersionUID = -638100288439239858L;
+		private EditableList list;
+		private boolean isOK;
+
+		public PropertyDialog(Window parent, EditableList list){
+			super(parent);
+
+//			this.setUndecorated(true);
+			this.setLayout(new BorderLayout());
+			this.list = list;
+			this.add(list, BorderLayout.CENTER);
+		}
+
+		public EditableList getList(){
+			return this.list;
+		}
+
+		public void setOK(boolean value){
+			this.isOK = value;
+		}
+
+		public boolean isOK(){
+			return this.isOK;
+		}
+	}
+
+	class Triple {
+		public RDFNode s;
+		public RDFNode p;
+		public RDFNode o;
+		public int index;
+
+		public Triple(RDFNode s, RDFNode p, RDFNode o){
+			this.s = s;
+			this.p = p;
+			this.o = o;
+		}
+
+	}
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/gui/EndpointSelector.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/gui/EndpointSelector.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/gui/EndpointSelector.java (revision 9)
@@ -0,0 +1,160 @@
+package hozo.sparql.gui;
+
+import java.awt.BorderLayout;
+import java.awt.Frame;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import javax.swing.AbstractAction;
+import javax.swing.DefaultListModel;
+import javax.swing.InputMap;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.KeyStroke;
+
+import jp.ac.osaka_u.sanken.sparql.EndpointSettings;
+import jp.ac.osaka_u.sanken.util.CheckableList;
+import jp.ac.osaka_u.sanken.util.CheckableListItem;
+
+public class EndpointSelector extends JDialog {
+
+	/**
+	 *
+	 */
+	private static final long serialVersionUID = -5270916655051535400L;
+	private EndpointSettings[] settings;
+	private Map<String, EndpointSettings> settingNames;
+
+	private JPanel jContentPane;
+	private CheckableList endpointList;
+	private JScrollPane endpointListScrollPane;
+	private JPanel buttonPane;
+	private JButton okButton;
+	private boolean valid = false;
+
+	public EndpointSelector(Frame owner, EndpointSettings[] settings){
+		super(owner);
+
+		this.settings = settings;
+		this.settingNames = new LinkedHashMap<String, EndpointSettings>();
+		this.setTitle("Select the target endpoints");
+		for (EndpointSettings setting : settings){
+			settingNames.put(setting.getEndpoint(), setting);
+		}
+
+		initialize();
+	}
+
+	public boolean isValid(){
+		return valid;
+	}
+
+	public EndpointSettings[] getSettings(){
+		DefaultListModel model = (DefaultListModel)getEndpointList().getModel();
+		for (int i=0; i<model.getSize(); i++){
+			CheckableListItem item = (CheckableListItem)model.getElementAt(i);
+			EndpointSettings ep = settingNames.get(item.text);
+			if (ep != null){
+				ep.setTarget(item.selected);
+			}
+		}
+
+		return settings;
+	}
+
+
+	/**
+	 * This method initializes this
+	 *
+	 * @return void
+	 */
+	private void initialize() {
+		this.setSize(400, 400);
+		this.setContentPane(getJContentPane());
+		this.setResizable(false);
+		this.setModal(true);
+		InputMap imap = getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
+		imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "go");
+		getRootPane().getActionMap().put("go", new AbstractAction() {
+			/**
+			 * 
+			 */
+			private static final long serialVersionUID = -4361937227644962283L;
+
+			@Override
+			public void actionPerformed(ActionEvent e) {
+				valid = true;
+				close();
+			}
+		});
+	}
+
+	private JPanel getJContentPane() {
+		if (jContentPane == null){
+			jContentPane = new JPanel();
+			jContentPane.setLayout(new BorderLayout());
+//			jContentPane.add(new JLabel("Select the target endpoints"), BorderLayout.NORTH);
+			jContentPane.add(getEndpointListScrollPane(), BorderLayout.CENTER);
+			jContentPane.add(getButtonPane(), BorderLayout.SOUTH);
+		}
+
+		return jContentPane;
+
+	}
+
+	private CheckableList getEndpointList(){
+		if (endpointList == null){
+			DefaultListModel model = new DefaultListModel();
+			for (EndpointSettings setting : settings){
+				model.addElement(new CheckableListItem(setting.getEndpoint(), setting.isTarget()));
+			}
+
+			endpointList = new CheckableList(model);
+		}
+		return endpointList;
+	}
+
+	private JScrollPane getEndpointListScrollPane(){
+		if (endpointListScrollPane == null){
+			endpointListScrollPane = new JScrollPane(getEndpointList());
+		}
+		return endpointListScrollPane;
+	}
+
+	private JPanel getButtonPane(){
+		if (buttonPane == null){
+			buttonPane = new JPanel();
+			buttonPane.setLayout(new BorderLayout());
+			buttonPane.add(getOKButton(), BorderLayout.EAST);
+		}
+
+		return buttonPane;
+	}
+	private JButton getOKButton(){
+		if (okButton == null){
+			okButton = new JButton("OK");
+			okButton.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					valid = true;
+					close();
+				}
+			});
+		}
+		return okButton;
+	}
+
+
+
+	private void close(){
+		this.setVisible(false);
+	}
+
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/gui/CrossKeywordSearchPanel.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/gui/CrossKeywordSearchPanel.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/gui/CrossKeywordSearchPanel.java (revision 9)
@@ -0,0 +1,1336 @@
+package hozo.sparql.gui;
+
+import java.awt.BorderLayout;
+import java.awt.Desktop;
+import java.awt.Dialog.ModalityType;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.BoxLayout;
+import javax.swing.ButtonGroup;
+import javax.swing.DefaultListModel;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JRadioButton;
+import javax.swing.JScrollPane;
+import javax.swing.JSeparator;
+import javax.swing.JSplitPane;
+import javax.swing.JTable;
+import javax.swing.JTextField;
+import javax.swing.SwingConstants;
+import javax.swing.SwingUtilities;
+import javax.swing.event.ListDataEvent;
+import javax.swing.event.ListDataListener;
+import javax.swing.table.DefaultTableModel;
+
+import jp.ac.osaka_u.sanken.sparql.EndpointSettings;
+import jp.ac.osaka_u.sanken.sparql.EndpointSettingsManager;
+import jp.ac.osaka_u.sanken.sparql.SparqlAccessor;
+import jp.ac.osaka_u.sanken.sparql.SparqlAccessorFactory;
+import jp.ac.osaka_u.sanken.sparql.SparqlQueryListener;
+import jp.ac.osaka_u.sanken.sparql.SparqlResultListener;
+import jp.ac.osaka_u.sanken.sparql.SparqlResultSet;
+import jp.ac.osaka_u.sanken.sparql.ThreadedSparqlAccessor;
+import jp.ac.osaka_u.sanken.util.EditableListItem;
+import jp.ac.osaka_u.sanken.util.EditableList;
+import jp.ac.osaka_u.sanken.util.StringUtil;
+
+import com.hp.hpl.jena.rdf.model.RDFNode;
+
+public class CrossKeywordSearchPanel extends JPanel {
+
+	private static final long serialVersionUID = 1L;
+	private JPanel keywordPanel = null;
+	private JLabel keywordLabel = null;
+	private JTextField keywordTextField = null;
+	private JTable subjectList = null;
+	private JScrollPane subjectScrollPane = null;
+	private JPanel centerPanel = null;
+	private JPanel footerPanel = null;
+	private JScrollPane resultListScrollPane = null;  //  @jve:decl-index=0:visual-constraint="153,224"
+	private JTable resultList = null;  //  @jve:decl-index=0:visual-constraint="369,21"
+	private JButton runQueryButton = null;  //  @jve:decl-index=0:visual-constraint="390,64"
+	private JSplitPane mainSplitPane = null;
+	private JPanel optionPanel = null;
+	private JPanel findTypePanel = null;
+	private JRadioButton fullMatchRadioButton = null;
+	private JRadioButton partMatchRadioButton = null;
+	private JSeparator findSeparator = null;
+
+	private boolean processing = false;
+	private JPanel headerPanel = null;
+	private JPanel limitPanel = null;
+	private JCheckBox limitEnableCheckBox = null;
+	private JLabel limitLabel = null;
+	private JComboBox limitComboBox = null;
+	private JRadioButton findSubjectRadioButton = null;
+	private JRadioButton findObjectRadioButton = null;
+	private JRadioButton findAllRadioButton = null;
+	private JRadioButton findLabelObjectRadioButton = null;
+	private Date fromDate;
+	private JPanel movePanel = null;
+	private JButton prevButton = null;
+	private JButton nextButton = null;
+	private JPanel limitMainPanel = null;
+	private JButton limitPrevButton = null;
+	private JButton limitNextButton = null;
+
+
+
+	private SparqlAccessorForm parent;
+
+	private DefaultTableModel listModel;
+	private DefaultTableModel tableModel;
+
+	private ThreadedSparqlAccessor sa;  //  @jve:decl-index=0:
+
+	/* subject繧ｸ繝｣繝ｳ繝励ヲ繧ｹ繝医Μ */
+	private int historyIndex = 0;
+	private List<String> history;  //  @jve:decl-index=0:
+	private LinkedHashMap<String, List<String>> subjectHistoryList;
+
+	/* limit繝偵せ繝医Μ */
+	private Integer limit = null;  //  @jve:decl-index=0:
+	private int page = 0;
+	private String word;
+	private boolean fullMatch = false;
+	private int type;
+	private boolean hasLimitNext = false;
+
+	private static final String DEFAULT_PROPERTY_TYPE = "http://www.w3.org/2000/01/rdf-schema#label";
+
+
+	/**
+	 * This is the default constructor
+	 */
+	public CrossKeywordSearchPanel(SparqlAccessorForm parent) {
+		super();
+		initialize();
+		this.parent = parent;
+	}
+
+	/**
+	 * This method initializes this
+	 *
+	 * @return void
+	 */
+	private void initialize() {
+		this.setSize(300, 200);
+		this.setLayout(new BorderLayout());
+		this.add(getHeaderPanel(), BorderLayout.NORTH);
+		this.add(getMainSplitPane(), BorderLayout.CENTER);
+	}
+
+	private JSplitPane getMainSplitPane(){
+		if (mainSplitPane == null){
+			mainSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, getCenterPanel(), getFooterPanel());
+			mainSplitPane.setDividerLocation(200);
+		}
+
+		return mainSplitPane;
+	}
+
+	/**
+	 * This method initializes keywordPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getKeywordPanel() {
+		if (keywordPanel == null) {
+			keywordPanel = new JPanel();
+			keywordPanel.setLayout(new BorderLayout());
+			keywordLabel = new JLabel();
+			keywordLabel.setText("Enter Keyword");
+			keywordPanel.add(keywordLabel, BorderLayout.WEST);
+			keywordPanel.add(getKeywordTextField(), BorderLayout.CENTER);
+			keywordPanel.add(getRunQueryButton(), BorderLayout.EAST);
+		}
+		return keywordPanel;
+	}
+
+
+	/**
+	 * This method initializes optionPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getOptionPanel() {
+		if (optionPanel == null) {
+			optionPanel = new JPanel();
+			optionPanel.setLayout(new BorderLayout());
+			optionPanel.add(getFindTypePanel(), BorderLayout.CENTER);
+			optionPanel.add(getLimitPanel(), BorderLayout.EAST);
+		}
+		return optionPanel;
+	}
+
+	/**
+	 * This method initializes findTypePanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getFindTypePanel() {
+		if (findTypePanel == null) {
+			FlowLayout flowLayout = new FlowLayout();
+			flowLayout.setHgap(10);
+			flowLayout.setVgap(0);
+			findTypePanel = new JPanel();
+			findTypePanel.setLayout(flowLayout);
+			findTypePanel.add(getFullMatchRadioButton(), null);
+			findTypePanel.add(getPartMatchRadioButton(), null);
+			findTypePanel.add(getFindSeparator(), null);
+			findTypePanel.add(getFindAllRadioButton(), null);
+			findTypePanel.add(getFindSubjectRadioButton(), null);
+			findTypePanel.add(getFindObjectRadioButton(), null);
+			findTypePanel.add(getFindLabelObjectRadioButton(), null);
+			ButtonGroup bg = new ButtonGroup();
+			bg.add(getFullMatchRadioButton());
+			bg.add(getPartMatchRadioButton());
+			getFullMatchRadioButton().setSelected(true);
+			ButtonGroup bg2 = new ButtonGroup();
+			bg2.add(getFindAllRadioButton());
+			bg2.add(getFindSubjectRadioButton());
+			bg2.add(getFindObjectRadioButton());
+			bg2.add(getFindLabelObjectRadioButton());
+			getFindSubjectRadioButton().setSelected(true);
+		}
+		return findTypePanel;
+	}
+
+	private boolean isFullMatch(){
+		return getFullMatchRadioButton().isSelected();
+	}
+
+	private int getFindType(){
+		if (getFindSubjectRadioButton().isSelected()){
+			return SparqlAccessor.FIND_TARGET_SUBJECT;
+		}
+		if (getFindObjectRadioButton().isSelected()){
+			return SparqlAccessor.FIND_TARGET_OBJECT;
+		}
+		if (getFindLabelObjectRadioButton().isSelected()){
+			return SparqlAccessor.FIND_TARGET_SPECIFIC_OBJECT;
+		}
+		return SparqlAccessor.FIND_TARGET_ALL;
+	}
+
+	/**
+	 * This method initializes fulMatchRadioButton
+	 *
+	 * @return javax.swing.JRadioButton
+	 */
+	private JRadioButton getFullMatchRadioButton() {
+		if (fullMatchRadioButton == null) {
+			fullMatchRadioButton = new JRadioButton("Full Match");
+		}
+		return fullMatchRadioButton;
+	}
+
+	/**
+	 * This method initializes partMatchRadioButton
+	 *
+	 * @return javax.swing.JRadioButton
+	 */
+	private JRadioButton getPartMatchRadioButton() {
+		if (partMatchRadioButton == null) {
+			partMatchRadioButton = new JRadioButton("Part Match");
+		}
+		return partMatchRadioButton;
+	}
+
+	/**
+	 * This method initializes findSeparator
+	 *
+	 * @return JSeparator
+	 */
+	private JSeparator getFindSeparator() {
+		if (findSeparator == null) {
+			findSeparator = new JSeparator(SwingConstants.VERTICAL);
+			findSeparator.setPreferredSize(new Dimension(5, 20));
+		}
+		return findSeparator;
+	}
+
+
+	/**
+	 * This method initializes keywordTextField
+	 *
+	 * @return javax.swing.JTextField
+	 */
+	private JTextField getKeywordTextField() {
+		if (keywordTextField == null) {
+			keywordTextField = new JTextField();
+			keywordTextField.addKeyListener(new KeyAdapter() {
+				@Override
+				public void keyTyped(KeyEvent arg0) {
+					if (arg0.getKeyChar() == KeyEvent.VK_ENTER){
+						doSearch();
+					}
+				}
+			});
+		}
+		return keywordTextField;
+	}
+
+	/**
+	 * 讀懃ｴ｢繝ｯ繝ｼ繝峨ｒ蜿門ｾ励☆繧�
+	 * @return
+	 */
+	private String getFindWord(){
+		return getKeywordTextField().getText();
+	}
+
+
+	/**
+	 * This method initializes subjectList
+	 *
+	 * @return javax.swing.JList
+	 */
+	private JTable getSubjectList() {
+		if (subjectList == null) {
+			subjectList = new JTable(){
+				/**
+				 *
+				 */
+				private static final long serialVersionUID = -3850550815070973157L;
+
+				public String getToolTipText(MouseEvent e){
+		            // 繧､繝吶Φ繝医°繧峨�繧ｦ繧ｹ菴咲ｽｮ繧貞叙蠕励＠縲√ユ繝ｼ繝悶Ν蜀��繧ｻ繝ｫ繧貞牡繧雁�縺�
+					Object cell = getModel().getValueAt(rowAtPoint(e.getPoint()), columnAtPoint(e.getPoint()));
+		            return cell == null ? "" : StringUtil.makeHtmlString(StringUtil.splitString(cell.toString()));
+		        }
+			};
+			subjectList.setDefaultEditor(Object.class, null);
+			subjectList.addMouseListener(new MouseAdapter() {
+
+				@Override
+				public void mouseClicked(MouseEvent e) {
+					int index = subjectList.getSelectedRow();
+					Object val = (subjectList.getValueAt(index, 1));
+					String subject = val.toString();
+					if (e.getClickCount() >= 2){
+
+						if (findSubjectTriple(subject)){
+							addHistory(subject);
+						}
+					}
+
+					if (SwingUtilities.isRightMouseButton(e)){
+						awakePopupIfHtml(val, e.getLocationOnScreen());
+					}
+
+				}
+			});
+
+		}
+		return subjectList;
+	}
+
+	private SparqlResultListener createSparqlResultListener2(){
+		return new SparqlResultListener() {
+
+			@Override
+			public void resultReceived(SparqlResultSet result) {
+				// 邨先棡繧偵∪縺壹�list縺ｫ霑ｽ蜉
+				setProcessing(false);
+				setResults(result);
+			}
+
+			@Override
+			public void uncaughtException(Thread t, Throwable e) {
+				JOptionPane.showMessageDialog(parent, "Execute error:"+e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
+				setProcessing(false);
+
+			}
+		};
+	}
+
+	private void setSubjectList(String endpoint, String obj){
+		listModel.addRow(new String[]{endpoint, obj});
+	}
+
+	private DefaultTableModel clearSubjectList(){
+		listModel = new DefaultTableModel(new String[]{"endpoint", "result"}, 0);
+		getSubjectList().setModel(listModel);
+		return listModel;
+	}
+
+	private void clearHistory(){
+		subjectHistoryList = new LinkedHashMap<String, List<String>>();
+	}
+
+	private void setSubjectList(String endpoint, List<String> list){
+		subjectHistoryList.put(endpoint, list);
+		for (String item : list){
+			listModel.addRow(new String[]{endpoint, item});
+		}
+		getSubjectList().setModel(listModel);
+	}
+
+	/**
+	 * This method initializes subjectScrollPane
+	 *
+	 * @return javax.swing.JScrollPane
+	 */
+	private JScrollPane getSubjectScrollPane() {
+		if (subjectScrollPane == null) {
+			subjectScrollPane = new JScrollPane(getSubjectList());
+		}
+		return subjectScrollPane;
+	}
+
+	/**
+	 * This method initializes centerPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getCenterPanel() {
+		if (centerPanel == null) {
+			centerPanel = new JPanel();
+			centerPanel.setLayout(new BorderLayout());
+			centerPanel.add(getSubjectScrollPane(), BorderLayout.CENTER);
+		}
+		return centerPanel;
+	}
+
+	/**
+	 * This method initializes footerPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getFooterPanel() {
+		if (footerPanel == null) {
+			footerPanel = new JPanel();
+			footerPanel.setLayout(new BorderLayout());
+			footerPanel.add(getResultListScrollPane(), BorderLayout.CENTER);
+		}
+		return footerPanel;
+	}
+
+	/**
+	 * This method initializes resultListScrollPane
+	 *
+	 * @return javax.swing.JScrollPane
+	 */
+	private JScrollPane getResultListScrollPane() {
+		if (resultListScrollPane == null) {
+			resultListScrollPane = new JScrollPane(getResultList());
+		}
+		return resultListScrollPane;
+	}
+
+	/**
+	 * This method initializes resultList
+	 *
+	 * @return javax.swing.JList
+	 */
+	private JTable getResultList() {
+		if (resultList == null) {
+			resultList = new JTable(){
+				/**
+				 *
+				 */
+				private static final long serialVersionUID = 3332757068706348175L;
+
+				public String getToolTipText(MouseEvent e){
+		            // 繧､繝吶Φ繝医°繧峨�繧ｦ繧ｹ菴咲ｽｮ繧貞叙蠕励＠縲√ユ繝ｼ繝悶Ν蜀��繧ｻ繝ｫ繧貞牡繧雁�縺�
+					Object cell = getModel().getValueAt(rowAtPoint(e.getPoint()), columnAtPoint(e.getPoint()));
+		            return cell == null ? "" : StringUtil.makeHtmlString(StringUtil.splitString(cell.toString()));
+		        }
+			};
+			resultList.setDefaultEditor(Object.class, null);
+			resultList.addMouseListener(new MouseAdapter() {
+				@Override
+				public void mouseClicked(MouseEvent e) {
+					int index = resultList.getSelectedRow();
+
+					Object val = (resultList.getValueAt(index, 1));
+					String o = val.toString();
+
+					if (e.getClickCount() >= 2){
+
+						if (findSubjectTriple(o)){
+							clearSubjectList();
+
+							setSubjectList("", o); // TODO endpoint
+							addHistory(o);
+						}
+					}
+
+					if (SwingUtilities.isRightMouseButton(e)){
+						awakePopupIfHtml(val, e.getLocationOnScreen());
+					}
+
+				}
+			});
+
+		}
+		return resultList;
+	}
+
+	private void setResults(SparqlResultSet result){
+
+		if (result == null || result.getDefaultResult() == null || result.getDefaultResult().size() == 0){
+			tableModel = new DefaultTableModel();
+			getResultList().setModel(tableModel);
+			return;
+		}
+		List<Map<String, RDFNode>> list = result.getDefaultResult();
+
+		// header繧ｻ繝�ヨ
+		Map<String, RDFNode> columns = list.get(0);
+		List<String> clm = new ArrayList<String>();
+		for (String key : columns.keySet()){
+			clm.add(key);
+		}
+		tableModel = new DefaultTableModel(clm.toArray(new String[]{}), 0);
+
+
+		// 荳ｭ霄ｫ繧ｻ繝�ヨ
+		for (Map<String, RDFNode> r : list){
+			List<Object> row = new ArrayList<Object>();
+			for (String key : clm){
+				RDFNode node = r.get(key);
+				row.add(node);
+			}
+			tableModel.addRow(row.toArray(new Object[]{}));
+		}
+
+		getResultList().setModel(tableModel);
+
+		parent.setResults(result);
+
+	}
+
+	private void setProcessing(boolean processing){
+		this. processing = processing;
+		getSubjectList().setEnabled(!processing);
+		getRunQueryButton().setEnabled(!processing);
+		getResultList().setEnabled(!processing);
+		getKeywordTextField().setEnabled(!processing);
+		getFullMatchRadioButton().setEnabled(!processing);
+		getPartMatchRadioButton().setEnabled(!processing);
+//		getFindAllRadioButton().setEnabled(!processing);
+		getFindSubjectRadioButton().setEnabled(!processing);
+		getFindObjectRadioButton().setEnabled(!processing);
+		getFindLabelObjectRadioButton().setEnabled(!processing);
+
+		updateButtonStates();
+		updateLimitButtonStates();
+
+		parent.setProcessing(processing);
+	}
+
+	private boolean isProcessing(){
+		return this.processing;
+	}
+
+	/**
+	 * This method initializes runQueryButton
+	 *
+	 * @return javax.swing.JButton
+	 */
+	private JButton getRunQueryButton() {
+		if (runQueryButton == null) {
+			runQueryButton = new JButton("Find");
+			runQueryButton.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					doSearch();
+				}
+			});
+		}
+		return runQueryButton;
+	}
+
+	private void doSearch(){
+		if (isProcessing()){
+			return;
+		}
+
+		initHistory();
+		initLimit();
+
+		sa = createSparqlAccessor(true);
+		if (sa == null){
+			return;
+		}
+		setResults(null);
+		setProcessing(true);
+
+
+		// page蛻�崛逕ｨ縺ｫ繝舌ャ繧ｯ繧｢繝��
+		this.word = getFindWord();
+		this.fullMatch = isFullMatch();
+		this.limit = getLimit();
+		this.type = getFindType();
+
+		sa.findSubject(word, fullMatch, limit, (limit != null ? (limit * page) : null), type, getTargetPropertyList(), createSparqlResultListener());
+
+
+	}
+
+	private ThreadedSparqlAccessor createSparqlAccessor(boolean needEndpointDialog){
+		List<EndpointSettings> settings = getEndpointSettings(needEndpointDialog);
+		if (settings == null || settings.size() == 0){
+			return null;
+		}
+		ThreadedSparqlAccessor tsa = SparqlAccessorFactory.createSparqlAccessor(settings, new SparqlQueryListener() {
+			@Override
+			public void sparqlExecuted(String query) {
+				fromDate = new Date();
+				parent.addLogText("----------------");
+				parent.addLogText(query);
+			}
+		});
+
+		return tsa;
+	}
+
+	private List<EndpointSettings> getEndpointSettings(boolean withUi){
+		List<EndpointSettings> settings = new ArrayList<EndpointSettings>();
+
+		EndpointSelector es = new EndpointSelector(null, EndpointSettingsManager.instance.getSettings());
+		if (withUi){
+			es.setVisible(true);
+			if (!es.isValid()){
+				return null;
+			}
+		}
+		EndpointSettings[] result = es.getSettings();
+
+		for (EndpointSettings setting : result){
+			if (setting.isTarget()){
+				settings.add(setting);
+			}
+		}
+
+		return settings;
+	}
+
+	private SparqlResultListener createSparqlResultListener(){
+		return new SparqlResultListener() {
+
+			@Override
+			public void resultReceived(SparqlResultSet result) {
+
+				hasLimitNext = result.isHasNext();
+
+				Date now = new Date();
+				long time = now.getTime() - fromDate.getTime();
+				parent.addLogText("---------------- result:"+time+" ms");
+				clearHistory();
+				clearSubjectList();
+				// 邨先棡繧偵∪縺壹�list縺ｫ霑ｽ蜉
+				for (String endpoint : result.getResult().keySet()){
+					List<String> resultList = new ArrayList<String>();
+					List<Map<String, RDFNode>> results = result.getResult().get(endpoint);
+					for (Map<String, RDFNode> item : results){
+						RDFNode node = item.get("s");
+						resultList.add(node.toString());
+					}
+					setSubjectList(endpoint, resultList);
+				}
+
+				setProcessing(false);
+			}
+
+			@Override
+			public void uncaughtException(Thread t, Throwable e) {
+				JOptionPane.showMessageDialog(parent, "Execute error:"+e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
+				setProcessing(false);
+
+			}
+		};
+	}
+
+	/**
+	 * This method initializes headerPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getHeaderPanel() {
+		if (headerPanel == null) {
+			headerPanel = new JPanel();
+			headerPanel.setLayout(new BorderLayout());
+			headerPanel.add(getKeywordPanel(), BorderLayout.CENTER);
+			headerPanel.add(getOptionPanel(), BorderLayout.SOUTH);
+			headerPanel.add(getMovePanel(), BorderLayout.WEST);
+		}
+		return headerPanel;
+	}
+
+	/**
+	 * This method initializes limitPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getLimitPanel() {
+		if (limitPanel == null) {
+			limitLabel = new JLabel();
+			limitLabel.setText(" LIMIT  ");
+			limitLabel.setEnabled(false);
+			limitPanel = new JPanel();
+			limitPanel.setLayout(new BorderLayout());
+			limitPanel.add(getLimitEnableCheckBox(), BorderLayout.WEST);
+			limitPanel.add(limitLabel, BorderLayout.CENTER);
+			limitPanel.add(getLimitMainPanel(), BorderLayout.EAST);
+		}
+		return limitPanel;
+	}
+
+	private Integer getLimit(){
+		try {
+			if (getLimitComboBox().isEnabled()){
+				return Integer.parseInt((String)getLimitComboBox().getSelectedItem());
+			}
+		} catch(Exception e){}
+		return null;
+	}
+
+	/**
+	 * This method initializes limitEnableCheckBox
+	 *
+	 * @return javax.swing.JCheckBox
+	 */
+	private JCheckBox getLimitEnableCheckBox() {
+		if (limitEnableCheckBox == null) {
+			limitEnableCheckBox = new JCheckBox();
+			limitEnableCheckBox.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					boolean enabled = getLimitEnableCheckBox().isSelected();
+					getLimitComboBox().setEnabled(enabled);
+					limitLabel.setEnabled(enabled);
+					updateLimitButtonStates();
+				}
+			});
+		}
+		return limitEnableCheckBox;
+	}
+
+	/**
+	 * This method initializes limitComboBox
+	 *
+	 * @return javax.swing.JComboBox
+	 */
+	private JComboBox getLimitComboBox() {
+		if (limitComboBox == null) {
+			String[] limits = {"100","250","500","1000"};
+			limitComboBox = new JComboBox(limits);
+			limitComboBox.setEnabled(false);
+		}
+		return limitComboBox;
+	}
+
+	/**
+	 * This method initializes findSubjectRadioButton
+	 *
+	 * @return javax.swing.JRadioButton
+	 */
+	private JRadioButton getFindSubjectRadioButton() {
+		if (findSubjectRadioButton == null) {
+			findSubjectRadioButton = new JRadioButton("Find Subject");
+		}
+		return findSubjectRadioButton;
+	}
+
+	/**
+	 * This method initializes findObjectRadioButton
+	 *
+	 * @return javax.swing.JRadioButton
+	 */
+	private JRadioButton getFindObjectRadioButton() {
+		if (findObjectRadioButton == null) {
+			findObjectRadioButton = new JRadioButton("Find All Object");
+		}
+		return findObjectRadioButton;
+	}
+
+	/**
+	 * This method initializes findAllRadioButton
+	 *
+	 * @return javax.swing.JRadioButton
+	 */
+	private JRadioButton getFindAllRadioButton() {
+		if (findAllRadioButton == null) {
+			findAllRadioButton = new JRadioButton("Find All");
+			findAllRadioButton.setEnabled(false);
+		}
+		return findAllRadioButton;
+	}
+
+	/**
+	 * This method initializes findLabelObjectRadioButton
+	 *
+	 * @return javax.swing.JRadioButton
+	 */
+	private JRadioButton getFindLabelObjectRadioButton() {
+		if (findLabelObjectRadioButton == null) {
+			findLabelObjectRadioButton = new JRadioButton("Find Specific Object");
+			findLabelObjectRadioButton.addMouseListener(new MouseAdapter() {
+				@Override
+				public void mouseClicked(MouseEvent e) {
+					awakePropertyListPopup(e.getLocationOnScreen());
+				}
+			});
+		}
+		return findLabelObjectRadioButton;
+	}
+
+	/**
+	 * This method initializes movePanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getMovePanel() {
+		if (movePanel == null) {
+			movePanel = new JPanel();
+			movePanel.setLayout(new BoxLayout(movePanel, BoxLayout.X_AXIS));
+			movePanel.add(getPrevButton(), null);
+			movePanel.add(getNextButton(), null);
+		}
+		return movePanel;
+	}
+
+	/**
+	 * This method initializes prevButton
+	 *
+	 * @return javax.swing.JButton
+	 */
+	private JButton getPrevButton() {
+		if (prevButton == null) {
+			prevButton = new JButton("竊�);
+			prevButton.setMargin(new Insets(0, 10, 0, 10));
+			prevButton.setEnabled(false);
+			prevButton.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					String s = getPrev();
+					if (s != null){
+						clearSubjectList();
+						if (historyIndex == 0){
+							for (String key : subjectHistoryList.keySet()){
+								setSubjectList(key, subjectHistoryList.get(key)); // 蜈ｨ菴薙�繝偵せ繝医Μ繝ｪ繧ｹ繝�
+							}
+						} else {
+							setSubjectList("", s);
+						}
+						findSubjectTriple(s);
+					}
+				}
+			});
+		}
+		return prevButton;
+	}
+
+	/**
+	 * This method initializes nextButton
+	 *
+	 * @return javax.swing.JButton
+	 */
+	private JButton getNextButton() {
+		if (nextButton == null) {
+			nextButton = new JButton("竊�);
+			nextButton.setMargin(new Insets(0, 10, 0, 10));
+			nextButton.setEnabled(false);
+			nextButton.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					String s = getNext();
+					if (s != null){
+						clearSubjectList();
+						setSubjectList("", s); // TODO endpoint
+						findSubjectTriple(s);
+					}
+				}
+			});
+		}
+		return nextButton;
+	}
+
+	private boolean findSubjectTriple(String s){
+		if (isProcessing()){
+			return false;
+		}
+		setProcessing(true);
+		if (!sa.findTripleFromSubject(s, createSparqlResultListener2())){
+			//
+			setProcessing(false);
+//			awakeIfHtml(s);
+			return false;
+		}
+		// table繧ｯ繝ｪ繧｢
+		setResults(null);
+		return true;
+	}
+
+	private boolean awakePopupIfHtml(Object o, Point p){
+
+		if (o == null || o.toString().trim().isEmpty()){
+			return false;
+		}
+		String s = o.toString();
+
+		if (o instanceof RDFNode){
+			if (((RDFNode)o).isLiteral()){
+				s = ((RDFNode)o).asLiteral().getString();
+			}
+		}
+		JPopupMenu popup = new JPopupMenu(s);
+
+		if (s.startsWith("http://") || s.startsWith("https://")){
+			JMenuItem menu = new JMenuItem("Show on Web Browser");
+			menu.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					JMenuItem menu = (JMenuItem)e.getSource();
+					JPopupMenu parent = (JPopupMenu)menu.getParent();
+					try {
+						awakeHtml(parent.getLabel());
+					} catch (URISyntaxException ex) {
+						ex.printStackTrace();
+					} catch (IOException ex) {
+						ex.printStackTrace();
+					}
+				}
+			});
+			popup.add(menu);
+		} else {
+			JMenuItem menu1 = new JMenuItem("Search By Google");
+			menu1.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					JMenuItem menu = (JMenuItem)e.getSource();
+					JPopupMenu parent = (JPopupMenu)menu.getParent();
+					try {
+						awakeHtml("https://www.google.co.jp/search?q=" + URLEncoder.encode(parent.getLabel(), "UTF-8"));
+					} catch (URISyntaxException ex) {
+						ex.printStackTrace();
+					} catch (IOException ex) {
+						ex.printStackTrace();
+					}
+				}
+			});
+			popup.add(menu1);
+			JMenuItem menu2 = new JMenuItem("Search By GoogleMaps");
+			menu2.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					JMenuItem menu = (JMenuItem)e.getSource();
+					JPopupMenu parent = (JPopupMenu)menu.getParent();
+					try {
+						awakeHtml("https://maps.google.com/maps?q=" + URLEncoder.encode(parent.getLabel(), "UTF-8"));
+					} catch (URISyntaxException ex) {
+						ex.printStackTrace();
+					} catch (IOException ex) {
+						ex.printStackTrace();
+					}
+				}
+			});
+			popup.add(menu2);
+		}
+
+		popup.setLocation(p);
+
+		SwingUtilities.convertPointFromScreen(p, this.parent);
+
+		popup.show(this.parent, p.x, p.y);
+
+		return false;
+	}
+
+	private void awakeHtml(String url) throws IOException, URISyntaxException{
+		Desktop desktop = Desktop.getDesktop();
+		URI uri = new URI(url);
+		desktop.browse(uri);
+	}
+
+	// 縺薙％縺九ｉ縲｝roperty驕ｸ謚樒畑
+
+	private PropertyDialog propDialog;
+
+	private List<EditableListItem> targetObjectTypes;
+
+	/**
+	 * proeprty驕ｸ謚樒畑POPUP陦ｨ遉ｺ
+	 * @param p
+	 * @return
+	 */
+	private boolean awakePropertyListPopup(Point p){
+		DefaultListModel model = new DefaultListModel();
+		for (EditableListItem tp : getTargetPropertyListItem()){
+			model.addElement(tp);
+		}
+
+		EditableList properties = new EditableList(model);
+		propDialog = new PropertyDialog(this.parent,properties);
+		properties.getTextField().addKeyListener(new KeyAdapter() {
+
+			@Override
+			public void keyReleased(KeyEvent e) {
+				List<String> propList = getPropertyList();
+				String word = ((JTextField)e.getSource()).getText();
+
+				if (word.length() > 2){
+					List<String> candidates = StringUtil.getPartHitString(propList, word);
+
+					if (candidates.size() < 20){
+						awakeCandidateList(candidates, propDialog.getList().getTextField().getLocationOnScreen());
+					}
+				} else {
+					if (popup != null){
+						popup.setVisible(false);
+						popup = null;
+					}
+				}
+
+			}
+		});
+		properties.getModel().addListDataListener(new ListDataListener() {
+
+			@Override
+			public void intervalRemoved(ListDataEvent e) {
+				propDialog.pack();
+			}
+
+			@Override
+			public void intervalAdded(ListDataEvent e) {
+				propDialog.pack();
+			}
+
+			@Override
+			public void contentsChanged(ListDataEvent e) {
+			}
+		});
+		properties.getTextField().addActionListener(new ActionListener() {
+
+			@Override
+			public void actionPerformed(ActionEvent e) {
+				if (propDialog.getList().getTextField().getText().isEmpty()){
+					//
+					propDialog.setOK(true);
+					propDialog.setVisible(false);
+				}
+			}
+		});
+		propDialog.setLocation(p);
+		propDialog.pack();
+		propDialog.setModalityType(ModalityType.DOCUMENT_MODAL);
+		propDialog.setVisible(true);
+
+		if (popup != null){
+			popup.setVisible(false);
+		}
+
+		if (!propDialog.isOK()){
+			return false;
+		}
+
+		model = (DefaultListModel)properties.getModel();
+
+		getTargetPropertyListItem().clear();
+		for (int i=0; i<model.getSize(); i++){
+			Object item = model.getElementAt(i);
+			if (item instanceof EditableListItem){
+				getTargetPropertyListItem().add((EditableListItem)item);
+			}
+		}
+
+		return true;
+	}
+
+	private List<String> propertyList;
+	private boolean isProcessingProperty = false;
+
+	private List<String> getPropertyList(){
+		if (propertyList == null && !isProcessingProperty){
+			try {
+				ThreadedSparqlAccessor tsa = createSparqlAccessor(false);
+				if (tsa != null){
+					/*
+					List<Map<String, RDFNode>> results = tsa.findPropertyList();
+					for (Map<String, RDFNode> result : results){
+						for (String nodeStr : result.keySet()){
+							if (nodeStr != null && !propertyList.contains(nodeStr)){
+								propertyList.add(nodeStr);
+							}
+						}
+					}
+					*/
+					isProcessingProperty = true;
+					tsa.findPropertyList(new SparqlResultListener() {
+
+						@Override
+						public void uncaughtException(Thread t, Throwable e) {
+							JOptionPane.showMessageDialog(parent, "Execute error:"+e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
+							setProcessing(false);
+						}
+
+						@Override
+						public void resultReceived(SparqlResultSet resultSet) {
+							propertyList = new ArrayList<String>();
+							Map<String, List<Map<String, RDFNode>>> resultByEndpoint = resultSet.getResult();
+							for (List<Map<String, RDFNode>> results : resultByEndpoint.values()){
+								for (Map<String, RDFNode> result : results){
+									for (String nodeStr : result.keySet()){
+										if (nodeStr != null && !propertyList.contains(nodeStr)){
+											propertyList.add(nodeStr);
+										}
+									}
+								}
+							}
+							isProcessingProperty = false;
+						}
+					});
+				}
+			} catch (Exception e){
+				// 繧ｨ繝ｩ繝ｼ縺ｯ闖ｯ鮗励↓繧ｹ繝ｫ繝ｼ
+			}
+		}
+
+		return propertyList;
+	}
+
+	private List<EditableListItem> getTargetPropertyListItem(){
+		if (targetObjectTypes == null){
+			targetObjectTypes = new ArrayList<EditableListItem>();
+			targetObjectTypes.add(new EditableListItem(DEFAULT_PROPERTY_TYPE, false));
+		}
+		return targetObjectTypes;
+	}
+
+	JPopupMenu popup;
+
+	private void awakeCandidateList(List<String> candidates, Point p){
+		if (popup != null){
+			popup.setVisible(false);
+		}
+		popup = new JPopupMenu();
+
+		for (String candidate : candidates){
+			JMenuItem item = new JMenuItem(candidate);
+			item.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					propDialog.getList().getTextField().setText(((JMenuItem)e.getSource()).getText());
+					popup.setVisible(false);
+					popup = null;
+				}
+			});
+			popup.add(item);
+		}
+		popup.setLocation(p.x + 400, p.y + 20);
+		popup.setVisible(true);
+	}
+
+	private void initHistory(){
+		this.history = new ArrayList<String>();
+		this.historyIndex = -1;
+		updateButtonStates();
+	}
+
+	private void addHistory(String item){
+
+		if (this.historyIndex >= 0 && this.historyIndex < (this.history.size() - 1)){
+			for (int i=this.history.size()-1; i > this.historyIndex; i--){
+				this.history.remove(i);
+			}
+		}
+		this.history.add(item);
+		this.historyIndex++;
+		updateButtonStates();
+		}
+
+	private String getPrev(){
+		if (hasPrev()){
+			--historyIndex;
+			updateButtonStates();
+			return this.history.get(historyIndex);
+		}
+		return null;
+	}
+
+	private String getNext(){
+		if (hasNext()){
+			++historyIndex;
+			updateButtonStates();
+			return this.history.get(historyIndex);
+		}
+		return null;
+	}
+
+	private void updateButtonStates(){
+		if (!this.processing){
+			this.getPrevButton().setEnabled(hasPrev());
+			this.getNextButton().setEnabled(hasNext());
+		} else {
+			this.getPrevButton().setEnabled(false);
+			this.getNextButton().setEnabled(false);
+		}
+	}
+
+	private boolean hasPrev(){
+		if (history.size() != 0 && historyIndex > 0){
+			return true;
+		}
+		return false;
+	}
+
+	private boolean hasNext(){
+		if ((historyIndex + 1) < history.size()){
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * This method initializes limitMainPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getLimitMainPanel() {
+		if (limitMainPanel == null) {
+			limitMainPanel = new JPanel();
+			limitMainPanel.setLayout(new BorderLayout());
+			limitMainPanel.add(getLimitComboBox(), BorderLayout.WEST);
+			limitMainPanel.add(getLimitPrevButton(), BorderLayout.CENTER);
+			limitMainPanel.add(getLimitNextButton(), BorderLayout.EAST);
+		}
+		return limitMainPanel;
+	}
+
+	/**
+	 * This method initializes limitPrevButton
+	 *
+	 * @return javax.swing.JButton
+	 */
+	private JButton getLimitPrevButton() {
+		if (limitPrevButton == null) {
+			limitPrevButton = new JButton("竊�);
+			limitPrevButton.setMargin(new Insets(0, 10, 0, 10));
+			limitPrevButton.setEnabled(false);
+			limitPrevButton.addActionListener(new ActionListener() {
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					setProcessing(true);
+					sa.findSubject(word, fullMatch, limit, (limit * (--page)), type, getTargetPropertyList(), createSparqlResultListener());
+				}
+			});
+		}
+		return limitPrevButton;
+	}
+
+	/**
+	 * This method initializes limitNextButton
+	 *
+	 * @return javax.swing.JButton
+	 */
+	private JButton getLimitNextButton() {
+		if (limitNextButton == null) {
+			limitNextButton = new JButton("竊�);
+			limitNextButton.setMargin(new Insets(0, 10, 0, 10));
+			limitNextButton.setEnabled(false);
+			limitNextButton.addActionListener(new ActionListener() {
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					setProcessing(true);
+
+					sa.findSubject(word, fullMatch, limit, (limit * (++page)), type, getTargetPropertyList(), createSparqlResultListener());
+				}
+			});
+		}
+		return limitNextButton;
+	}
+
+	private void initLimit(){
+		limit = this.getLimit();
+		page = 0;
+	}
+
+	private String[] getTargetPropertyList(){
+		List<String> ret = new ArrayList<String>();
+		if (targetObjectTypes != null && targetObjectTypes.size() > 0){
+			for (EditableListItem item : targetObjectTypes){
+				ret.add(item.text);
+			}
+		} else {
+			ret.add(DEFAULT_PROPERTY_TYPE);
+		}
+		return ret.toArray(new String[0]);
+	}
+
+	private void updateLimitButtonStates(){
+		if (!this.processing && this.getLimitEnableCheckBox().isSelected()){
+			this.getLimitPrevButton().setEnabled(page != 0);
+			this.getLimitNextButton().setEnabled(hasLimitNext);
+		} else {
+			this.getLimitPrevButton().setEnabled(false);
+			this.getLimitNextButton().setEnabled(false);
+		}
+	}
+
+	class PropertyDialog extends JDialog {
+		/**
+		 *
+		 */
+		private static final long serialVersionUID = -638100288439239858L;
+		private EditableList list;
+		private boolean isOK;
+
+		public PropertyDialog(Window parent, EditableList list){
+			super(parent);
+
+//			this.setUndecorated(true);
+			this.setLayout(new BorderLayout());
+			this.list = list;
+			this.add(list, BorderLayout.CENTER);
+		}
+
+		public EditableList getList(){
+			return this.list;
+		}
+
+		public void setOK(boolean value){
+			this.isOK = value;
+		}
+
+		public boolean isOK(){
+			return this.isOK;
+		}
+	}
+
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/gui/TripleEditDialog.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/gui/TripleEditDialog.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/gui/TripleEditDialog.java (revision 9)
@@ -0,0 +1,268 @@
+package jp.ac.osaka_u.sanken.sparql.gui;
+
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.JDialog;
+
+import com.hp.hpl.jena.rdf.model.Model;
+import com.hp.hpl.jena.rdf.model.RDFNode;
+import com.hp.hpl.jena.rdf.model.impl.ResourceImpl;
+
+import javax.swing.JPanel;
+
+import java.awt.Component;
+import java.awt.GridBagLayout;
+import java.awt.Dimension;
+import javax.swing.JTextField;
+import java.awt.GridBagConstraints;
+import javax.swing.JLabel;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JButton;
+
+public class TripleEditDialog extends JDialog {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -8353265680791711240L;
+	private RDFNode s;
+	private RDFNode p;
+	private RDFNode o;
+	private Model model;
+	private JPanel mainPanel = null;
+	private JTextField subjectTextField = null;
+	private JTextField propertyTextField = null;
+	private JTextField objectTextField = null;
+	private JLabel subjectLabel = null;
+	private JLabel propertyLabel = null;
+	private JLabel objectLabel = null;
+	private JPanel buttonPanel = null;
+	private JButton okButton = null;
+	private JButton cancelButton = null;
+	
+	public boolean ok = false;
+	
+	public TripleEditDialog(RDFNode s, RDFNode p, RDFNode o, Model model){
+		this.s = s;
+		this.p = p;
+		this.o = o;
+		this.model = model;
+		initialize();
+
+		this.getSubjectTextField().setText(s.toString());
+		this.getPropertyTextField().setText(p.toString());
+		if (o != null){
+			this.getObjectTextField().setText(o.toString());
+		}
+		this.setModal(true);
+	}
+	
+	public RDFNode getSubject(){
+		if (s == null && this.getSubjectTextField().getText().isEmpty()){
+			return null;
+		}
+
+		if (s != null && s.toString().equals(this.getSubjectTextField().getText())){
+			return s;
+		}
+		
+		return getRDFNodeFromString(this.getSubjectTextField().getText());
+	}
+
+	public RDFNode getProperty(){
+		if (p == null && this.getPropertyTextField().getText().isEmpty()){
+			return null;
+		}
+
+		if (p != null && p.toString().equals(this.getPropertyTextField().getText())){
+			return p;
+		}
+		
+		return getRDFNodeFromString(this.getPropertyTextField().getText());
+	}
+
+	public RDFNode getObject(){
+		if (o == null && this.getObjectTextField().getText().isEmpty()){
+			return null;
+		}
+		
+		if (o != null && o.toString().equals(this.getObjectTextField().getText())){
+			return o;
+		}
+		
+		return getRDFNodeFromString(this.getObjectTextField().getText());
+	}
+
+	private RDFNode getRDFNodeFromString(String str){
+		if (str.startsWith("http://")){
+			ResourceImpl ri = new ResourceImpl(str);
+			return ri;
+		}
+		
+		return model.createLiteral(str);
+		
+	}
+
+	/**
+	 * This method initializes this
+	 * 
+	 */
+	private void initialize() {
+		this.setSize(new Dimension(999, 157));
+		this.setContentPane(getMainPanel());
+	}
+	/**
+	 * This method initializes mainPanel	
+	 * 	
+	 * @return javax.swing.JPanel	
+	 */
+	private JPanel getMainPanel() {
+		if (mainPanel == null) {
+			GridBagConstraints gridBagConstraints6 = new GridBagConstraints();
+			gridBagConstraints6.gridx = 2;
+			gridBagConstraints6.fill = GridBagConstraints.HORIZONTAL;
+			gridBagConstraints6.gridy = 2;
+			GridBagConstraints gridBagConstraints5 = new GridBagConstraints();
+			gridBagConstraints5.gridx = 2;
+			gridBagConstraints5.gridy = 0;
+			objectLabel = new JLabel();
+			objectLabel.setText("Object");
+			GridBagConstraints gridBagConstraints4 = new GridBagConstraints();
+			gridBagConstraints4.gridx = 1;
+			gridBagConstraints4.gridy = 0;
+			propertyLabel = new JLabel();
+			propertyLabel.setText("Property");
+			GridBagConstraints gridBagConstraints3 = new GridBagConstraints();
+			gridBagConstraints3.gridx = 0;
+			gridBagConstraints3.gridy = 0;
+			subjectLabel = new JLabel();
+			subjectLabel.setText("Subject");
+			GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
+			gridBagConstraints2.fill = GridBagConstraints.HORIZONTAL;
+			gridBagConstraints2.gridy = 1;
+			gridBagConstraints2.weightx = 1.0;
+			gridBagConstraints2.insets = new Insets(0, 10, 0, 10);
+			gridBagConstraints2.gridx = 2;
+			GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
+			gridBagConstraints1.fill = GridBagConstraints.HORIZONTAL;
+			gridBagConstraints1.gridy = 1;
+			gridBagConstraints1.weightx = 1.0;
+			gridBagConstraints1.insets = new Insets(0, 10, 0, 10);
+			gridBagConstraints1.gridx = 1;
+			GridBagConstraints gridBagConstraints = new GridBagConstraints();
+			gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
+			gridBagConstraints.gridy = 1;
+			gridBagConstraints.weightx = 1.0;
+			gridBagConstraints.insets = new Insets(0, 10, 0, 10);
+			gridBagConstraints.gridx = 0;
+			mainPanel = new JPanel();
+			mainPanel.setLayout(new GridBagLayout());
+			mainPanel.add(getSubjectTextField(), gridBagConstraints);
+			mainPanel.add(getPropertyTextField(), gridBagConstraints1);
+			mainPanel.add(getObjectTextField(), gridBagConstraints2);
+			mainPanel.add(subjectLabel, gridBagConstraints3);
+			mainPanel.add(propertyLabel, gridBagConstraints4);
+			mainPanel.add(objectLabel, gridBagConstraints5);
+			mainPanel.add(getButtonPanel(), gridBagConstraints6);
+		}
+		return mainPanel;
+	}
+
+	/**
+	 * This method initializes subjectTextField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getSubjectTextField() {
+		if (subjectTextField == null) {
+			subjectTextField = new JTextField();
+			subjectTextField.setEditable(false);
+		}
+		return subjectTextField;
+	}
+
+	/**
+	 * This method initializes propertyTextField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getPropertyTextField() {
+		if (propertyTextField == null) {
+			propertyTextField = new JTextField();
+		}
+		return propertyTextField;
+	}
+
+	/**
+	 * This method initializes objectTextField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getObjectTextField() {
+		if (objectTextField == null) {
+			objectTextField = new JTextField();
+		}
+		return objectTextField;
+	}
+
+	/**
+	 * This method initializes buttonPanel	
+	 * 	
+	 * @return javax.swing.JPanel	
+	 */
+	private JPanel getButtonPanel() {
+		if (buttonPanel == null) {
+			buttonPanel = new JPanel();
+			buttonPanel.setLayout(new BoxLayout(buttonPanel,  BoxLayout.LINE_AXIS));
+			buttonPanel.setAlignmentX(Component.RIGHT_ALIGNMENT);
+			buttonPanel.add(getOkButton());
+			buttonPanel.add(Box.createRigidArea(new Dimension(10, 10)));
+			buttonPanel.add(getCancelButton());
+		}
+		return buttonPanel;
+	}
+
+	/**
+	 * This method initializes okButton	
+	 * 	
+	 * @return javax.swing.JButton	
+	 */
+	private JButton getOkButton() {
+		if (okButton == null) {
+			okButton = new JButton("OK");
+			okButton.addActionListener(new ActionListener() {
+				
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					ok = true;
+					setVisible(false);
+				}
+			});
+		}
+		return okButton;
+	}
+
+	/**
+	 * This method initializes cancelButton	
+	 * 	
+	 * @return javax.swing.JButton	
+	 */
+	private JButton getCancelButton() {
+		if (cancelButton == null) {
+			cancelButton = new JButton("CANCEL");
+			cancelButton.addActionListener(new ActionListener() {
+				
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					ok = false;
+					setVisible(false);
+				}
+			});
+		}
+		return cancelButton;
+	}
+	
+}  //  @jve:decl-index=0:visual-constraint="86,101"
Index: BH13SPARQLBuilder/src/hozo/sparql/gui/VersionDialog.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/gui/VersionDialog.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/gui/VersionDialog.java (revision 9)
@@ -0,0 +1,202 @@
+package jp.ac.osaka_u.sanken.sparql.gui;
+
+import javax.swing.JPanel;
+import java.awt.Frame;
+import javax.swing.JDialog;
+import java.awt.GridBagLayout;
+import javax.swing.JLabel;
+import java.awt.GridBagConstraints;
+import javax.swing.JTextField;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JButton;
+
+import com.ibm.icu.text.SimpleDateFormat;
+
+import jp.ac.osaka_u.sanken.Version;
+import jp.ac.osaka_u.sanken.sparql.CoreVersion;
+
+public class VersionDialog extends JDialog {
+
+	private static final long serialVersionUID = 1L;
+	private JPanel jContentPane = null;
+	private JLabel coreVersionLabel = null;
+	private JLabel guiVersionLabel = null;
+	private JTextField coreVersionTextField = null;
+	private JTextField coreVersionDateTextField = null;
+	private JTextField guiVersionTextField = null;
+	private JTextField guiVersionDateTextField = null;
+	private JButton okButton = null;
+
+	/**
+	 * @param owner
+	 */
+	public VersionDialog(Frame owner) {
+		super(owner);
+		initialize();
+	}
+
+	/**
+	 * This method initializes this
+	 * 
+	 * @return void
+	 */
+	private void initialize() {
+		this.setSize(401, 151);
+		this.setContentPane(getJContentPane());
+		this.setResizable(false);
+		this.setModal(true);
+		this.setTitle("Version Info");
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
+		
+		Version cv = new CoreVersion();
+		
+		this.getCoreVersionTextField().setText(cv.getVersion());
+		this.getCoreVersionDateTextField().setText(sdf.format(cv.getDate()));
+
+		GUIVersion gv = new GUIVersion();
+		this.getGuiVersionTextField().setText(gv.getVersion());
+		this.getGuiVersionDateTextField().setText(sdf.format(gv.getDate()));
+
+		
+	}
+
+	/**
+	 * This method initializes jContentPane
+	 * 
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getJContentPane() {
+		if (jContentPane == null) {
+			GridBagConstraints gridBagConstraints6 = new GridBagConstraints();
+			gridBagConstraints6.gridx = 2;
+			gridBagConstraints6.insets = new Insets(20, 0, 0, 20);
+			gridBagConstraints6.anchor = GridBagConstraints.EAST;
+			gridBagConstraints6.gridy = 2;
+			GridBagConstraints gridBagConstraints5 = new GridBagConstraints();
+			gridBagConstraints5.fill = GridBagConstraints.BOTH;
+			gridBagConstraints5.gridy = 1;
+			gridBagConstraints5.weightx = 1.0;
+			gridBagConstraints5.insets = new Insets(10, 10, 0, 10);
+			gridBagConstraints5.gridx = 2;
+			GridBagConstraints gridBagConstraints4 = new GridBagConstraints();
+			gridBagConstraints4.fill = GridBagConstraints.BOTH;
+			gridBagConstraints4.gridy = 1;
+			gridBagConstraints4.weightx = 1.0;
+			gridBagConstraints4.insets = new Insets(10, 10, 0, 0);
+			gridBagConstraints4.gridx = 1;
+			GridBagConstraints gridBagConstraints3 = new GridBagConstraints();
+			gridBagConstraints3.fill = GridBagConstraints.BOTH;
+			gridBagConstraints3.gridy = 0;
+			gridBagConstraints3.weightx = 1.0;
+			gridBagConstraints3.insets = new Insets(0, 10, 0, 10);
+			gridBagConstraints3.gridx = 2;
+			GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
+			gridBagConstraints2.fill = GridBagConstraints.BOTH;
+			gridBagConstraints2.gridy = 0;
+			gridBagConstraints2.weightx = 1.0;
+			gridBagConstraints2.insets = new Insets(0, 10, 0, 0);
+			gridBagConstraints2.gridx = 1;
+			GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
+			gridBagConstraints1.gridx = 0;
+			gridBagConstraints1.insets = new Insets(10, 10, 0, 0);
+			gridBagConstraints1.gridy = 1;
+			guiVersionLabel = new JLabel();
+			guiVersionLabel.setText("GUI Version");
+			GridBagConstraints gridBagConstraints = new GridBagConstraints();
+			gridBagConstraints.gridx = 0;
+			gridBagConstraints.insets = new Insets(0, 10, 0, 0);
+			gridBagConstraints.gridy = 0;
+			coreVersionLabel = new JLabel();
+			coreVersionLabel.setText("Core Version");
+			jContentPane = new JPanel();
+			jContentPane.setLayout(new GridBagLayout());
+			jContentPane.add(coreVersionLabel, gridBagConstraints);
+			jContentPane.add(guiVersionLabel, gridBagConstraints1);
+			jContentPane.add(getCoreVersionTextField(), gridBagConstraints2);
+			jContentPane.add(getCoreVersionDateTextField(), gridBagConstraints3);
+			jContentPane.add(getGuiVersionTextField(), gridBagConstraints4);
+			jContentPane.add(getGuiVersionDateTextField(), gridBagConstraints5);
+			jContentPane.add(getOkButton(), gridBagConstraints6);
+		}
+		return jContentPane;
+	}
+
+	/**
+	 * This method initializes coreVersionTextField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getCoreVersionTextField() {
+		if (coreVersionTextField == null) {
+			coreVersionTextField = new JTextField();
+			coreVersionTextField.setEditable(false);
+		}
+		return coreVersionTextField;
+	}
+
+	/**
+	 * This method initializes coreVersionDateTextField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getCoreVersionDateTextField() {
+		if (coreVersionDateTextField == null) {
+			coreVersionDateTextField = new JTextField();
+			coreVersionDateTextField.setEditable(false);
+		}
+		return coreVersionDateTextField;
+	}
+
+	/**
+	 * This method initializes guiVersionTextField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getGuiVersionTextField() {
+		if (guiVersionTextField == null) {
+			guiVersionTextField = new JTextField();
+			guiVersionTextField.setEditable(false);
+		}
+		return guiVersionTextField;
+	}
+
+	/**
+	 * This method initializes guiVersionDateTextField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getGuiVersionDateTextField() {
+		if (guiVersionDateTextField == null) {
+			guiVersionDateTextField = new JTextField();
+			guiVersionDateTextField.setEditable(false);
+		}
+		return guiVersionDateTextField;
+	}
+
+	/**
+	 * This method initializes okButton	
+	 * 	
+	 * @return javax.swing.JButton	
+	 */
+	private JButton getOkButton() {
+		if (okButton == null) {
+			okButton = new JButton("OK");
+			okButton.addActionListener(new ActionListener() {
+				
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					close();
+				}
+			});
+		}
+		return okButton;
+	}
+	
+	private void close(){
+		this.setVisible(false);
+	}
+
+}  //  @jve:decl-index=0:visual-constraint="10,10"
Index: BH13SPARQLBuilder/src/hozo/sparql/gui/OptionDialog.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/gui/OptionDialog.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/gui/OptionDialog.java (revision 9)
@@ -0,0 +1,705 @@
+package hozo.sparql.gui;
+
+import javax.swing.JPanel;
+
+import java.awt.FlowLayout;
+import java.awt.Frame;
+import java.awt.BorderLayout;
+import javax.swing.JDialog;
+import java.awt.GridBagLayout;
+
+import javax.swing.ButtonGroup;
+import javax.swing.JButton;
+import javax.swing.JTextField;
+import java.awt.GridBagConstraints;
+import javax.swing.JLabel;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JComboBox;
+
+import jp.ac.osaka_u.sanken.sparql.EndpointSettings;
+import javax.swing.JRadioButton;
+import javax.swing.JPasswordField;
+
+public class OptionDialog extends JDialog {
+
+	private static final long serialVersionUID = 1L;
+	private JPanel jContentPane = null;
+	private JPanel footerPanel = null;
+	private JButton okButton = null;
+	private JButton cancelButton = null;
+	private JPanel mainPanel = null;
+	private JTextField queryKeyTextField = null;
+	private JTextField optionTextField = null;
+	private JLabel queryKeyLabel = null;
+	private JLabel optionLabel = null;
+	private JLabel encodingLabel = null;
+	private JTextField encodingTextField = null;
+	private JLabel resultTypeLabel = null;
+	private JComboBox dataFormatComboBox = null;
+	
+	private boolean isOk;
+	private JLabel endpointLabel = null;
+	private JTextField endpointTextField = null;
+	private JLabel queryTypeLabel = null;
+	private JPanel queryTypePanel = null;
+	private JRadioButton queryTypeDefaultRadioButton = null;
+	private JRadioButton queryTypeCustomRadioButton = null;
+	private JLabel namespacesLabel = null;
+	private JTextField namespacesTextField = null;
+	private JLabel repositoryTypeLabel = null;
+	private JPanel repositoryTypePanel = null;
+	private JRadioButton repositoryOnRadioButton = null;
+	private JRadioButton repositoryOffRadioButton = null;
+	private JLabel repositoryLabel = null;
+	private JTextField repositoryTextField = null;
+	private JLabel userLabel = null;
+	private JLabel passLabel = null;
+	private JTextField userTextField = null;
+	private JPasswordField passPasswordField = null;
+	private JLabel urlLabel = null;
+	private JTextField repositoryUrlTextField = null;
+	/**
+	 * @param owner
+	 */
+	public OptionDialog(Frame owner, String endpoint) {
+		super(owner);
+		initialize();
+		
+		this.getEndpointTextField().setText(endpoint);
+	}
+
+	public OptionDialog(Frame owner, EndpointSettings setting) {
+		super(owner);
+		initialize();
+		
+		setCurrentEndpoint(setting);
+	}
+	
+	private void setCurrentEndpoint(EndpointSettings setting){
+		this.getEndpointTextField().setText(setting.getEndpoint());
+		this.setUseCustom(setting.isUseCustomParam());
+		this.setEncoding(setting.getEncoding());
+		this.setQueryKey(setting.getQueryKey());
+		this.setOption(setting.getOption());
+		this.setNamespaces(setting.getNamespaces());
+		this.setResultType(setting.getResultType());
+		
+		this.setEditable(setting.isEditable());
+		this.setRepositoryURL(setting.getRepositoryURL());
+		this.setRepository(setting.getRepository());
+		this.setUser(setting.getUser());
+		this.setPassword(setting.getPass());
+	}
+
+	
+	/**
+	 * This method initializes this
+	 * 
+	 * @return void
+	 */
+	private void initialize() {
+		this.setSize(545, 631);
+		this.setContentPane(getJContentPane());
+	}
+	
+	public void setUseCustom(boolean custom){
+		this.getQueryTypeDefaultRadioButton().setSelected(!custom);
+		this.getQueryTypeCustomRadioButton().setSelected(custom);
+		this.setCustomEnabled(custom);
+	}
+	
+	public boolean isUseCustom(){
+		return this.getQueryTypeCustomRadioButton().isSelected();
+	}
+	
+	public void setQueryKey(String key){
+		this.getQueryKeyTextField().setText(key);
+	}
+	
+	public String getQueryKey(){
+		return this.getQueryKeyTextField().getText();
+	}
+	
+	public void setOption(String opt){
+		this.getOptionTextField().setText(opt);
+	}
+	
+	public String getOption(){
+		return this.getOptionTextField().getText();
+	}
+
+	public void setNamespaces(String namespaces){
+		this.getNamespacesTextField().setText(namespaces);
+	}
+	
+	public String getNamespaces(){
+		return this.getNamespacesTextField().getText();
+	}
+
+	public void setEncoding(String encode){
+		this.getEncodingTextField().setText(encode);
+	}
+	
+	public String getEndoding(){
+		return this.getEncodingTextField().getText();
+	}
+	
+	public void setResultType(Integer type){
+		this.getDataFormatComboBox().setSelectedItem(EndpointSettings.getResultDataType(type));
+	}
+
+	public Integer getResultType(){
+		return EndpointSettings.getResultDataType((String)this.getDataFormatComboBox().getSelectedItem());
+	}
+	
+	public boolean isEditable(){
+		return this.getRepositoryOnRadioButton().isSelected();
+	}
+	
+	public void setEditable(boolean isEditable){
+		this.getRepositoryOnRadioButton().setSelected(isEditable);
+		this.getRepositoryOffRadioButton().setSelected(!isEditable);
+		this.setEditEnabled(isEditable);
+	}
+
+	public String getRepositoryURL(){
+		return this.getRepositoryUrlTextField().getText();
+	}
+	
+	public void setRepositoryURL(String repo){
+		this.getRepositoryUrlTextField().setText(repo);
+	}
+
+	public String getRepository(){
+		return this.getRepositoryTextField().getText();
+	}
+	
+	public void setRepository(String repo){
+		this.getRepositoryTextField().setText(repo);
+	}
+	
+	public String getUser(){
+		return this.getUserTextField().getText();
+	}
+	
+	public void setUser(String user){
+		this.getUserTextField().setText(user);
+	}
+	
+	public String getPassword(){
+		return new String(this.getPassPasswordField().getPassword());
+	}
+	
+	public void setPassword(String pass){
+		this.getPassPasswordField().setText(pass);
+	}
+	
+	
+	public boolean isOk(){
+		return this.isOk;
+	}
+	
+	/**
+	 * This method initializes jContentPane
+	 * 
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getJContentPane() {
+		if (jContentPane == null) {
+			jContentPane = new JPanel();
+			jContentPane.setLayout(new BorderLayout());
+			jContentPane.add(getFooterPanel(), BorderLayout.SOUTH);
+			jContentPane.add(getMainPanel(), BorderLayout.CENTER);
+		}
+		return jContentPane;
+	}
+
+	/**
+	 * This method initializes footerPanel	
+	 * 	
+	 * @return javax.swing.JPanel	
+	 */
+	private JPanel getFooterPanel() {
+		if (footerPanel == null) {
+			footerPanel = new JPanel();
+			footerPanel.setLayout(new FlowLayout());
+			footerPanel.add(getOkButton());
+			footerPanel.add(getCancelButton(), null);
+		}
+		return footerPanel;
+	}
+
+	/**
+	 * This method initializes okButton	
+	 * 	
+	 * @return javax.swing.JButton	
+	 */
+	private JButton getOkButton() {
+		if (okButton == null) {
+			okButton = new JButton("OK");
+			okButton.addActionListener(new ActionListener() {
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					isOk = true;
+					setVisible(false);
+				}
+			});
+		}
+		return okButton;
+	}
+
+	/**
+	 * This method initializes cancelButton	
+	 * 	
+	 * @return javax.swing.JButton	
+	 */
+	private JButton getCancelButton() {
+		if (cancelButton == null) {
+			cancelButton = new JButton("CANCEL");
+			cancelButton.addActionListener(new ActionListener() {
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					isOk = false;
+					setVisible(false);
+				}
+			});
+		}
+		return cancelButton;
+	}
+
+	/**
+	 * This method initializes mainPanel	
+	 * 	
+	 * @return javax.swing.JPanel	
+	 */
+	private JPanel getMainPanel() {
+		if (mainPanel == null) {
+			GridBagConstraints gridBagConstraints10 = new GridBagConstraints();
+			gridBagConstraints10.fill = GridBagConstraints.BOTH;
+			gridBagConstraints10.gridy = 10;
+			gridBagConstraints10.weightx = 1.0;
+			gridBagConstraints10.insets = new Insets(10, 0, 10, 10);
+			gridBagConstraints10.gridx = 1;
+			GridBagConstraints gridBagConstraints9 = new GridBagConstraints();
+			gridBagConstraints9.gridx = 0;
+			gridBagConstraints9.gridy = 10;
+			urlLabel = new JLabel();
+			urlLabel.setText("Repository URL");
+			GridBagConstraints gridBagConstraints8 = new GridBagConstraints();
+			gridBagConstraints8.fill = GridBagConstraints.BOTH;
+			gridBagConstraints8.gridy = 13;
+			gridBagConstraints8.weightx = 1.0;
+			gridBagConstraints8.insets = new Insets(10, 0, 10, 10);
+			gridBagConstraints8.gridx = 1;
+			GridBagConstraints gridBagConstraints7 = new GridBagConstraints();
+			gridBagConstraints7.fill = GridBagConstraints.BOTH;
+			gridBagConstraints7.gridy = 12;
+			gridBagConstraints7.weightx = 1.0;
+			gridBagConstraints7.insets = new Insets(10, 0, 10, 10);
+			gridBagConstraints7.gridx = 1;
+			GridBagConstraints gridBagConstraints6 = new GridBagConstraints();
+			gridBagConstraints6.gridx = 0;
+			gridBagConstraints6.gridy = 13;
+			passLabel = new JLabel();
+			passLabel.setText("Password");
+			GridBagConstraints gridBagConstraints51 = new GridBagConstraints();
+			gridBagConstraints51.gridx = 0;
+			gridBagConstraints51.gridy = 12;
+			userLabel = new JLabel();
+			userLabel.setText("User");
+			GridBagConstraints gridBagConstraints41 = new GridBagConstraints();
+			gridBagConstraints41.fill = GridBagConstraints.BOTH;
+			gridBagConstraints41.gridy = 11;
+			gridBagConstraints41.weightx = 1.0;
+			gridBagConstraints41.insets = new Insets(10, 0, 10, 10);
+			gridBagConstraints41.gridx = 1;
+			GridBagConstraints gridBagConstraints32 = new GridBagConstraints();
+			gridBagConstraints32.gridx = 0;
+			gridBagConstraints32.insets = new Insets(0, 10, 0, 5);
+			gridBagConstraints32.gridy = 11;
+			repositoryLabel = new JLabel();
+			repositoryLabel.setText("Repository Name");
+			GridBagConstraints gridBagConstraints25 = new GridBagConstraints();
+			gridBagConstraints25.gridx = 1;
+			gridBagConstraints25.fill = GridBagConstraints.BOTH;
+			gridBagConstraints25.insets = new Insets(0, 0, 0, 0);
+			gridBagConstraints25.gridy = 9;
+			GridBagConstraints gridBagConstraints15 = new GridBagConstraints();
+			gridBagConstraints15.gridx = 0;
+			gridBagConstraints15.insets = new Insets(0, 10, 0, 10);
+			gridBagConstraints15.gridy = 9;
+			repositoryTypeLabel = new JLabel();
+			repositoryTypeLabel.setText("Editable AllegroGraph");
+			GridBagConstraints gridBagConstraints24 = new GridBagConstraints();
+			gridBagConstraints24.fill = GridBagConstraints.HORIZONTAL;
+			gridBagConstraints24.gridy = 2;
+			gridBagConstraints24.weightx = 1.0;
+			gridBagConstraints24.insets = new Insets(0, 0, 0, 10);
+			gridBagConstraints24.gridx = 1;
+			GridBagConstraints gridBagConstraints14 = new GridBagConstraints();
+			gridBagConstraints14.gridx = 0;
+			gridBagConstraints14.insets = new Insets(15, 10, 15, 10);
+			gridBagConstraints14.gridy = 2;
+			namespacesLabel = new JLabel("Namespaces");
+			GridBagConstraints gridBagConstraints5 = new GridBagConstraints();
+			gridBagConstraints5.gridx = 1;
+			gridBagConstraints5.fill = GridBagConstraints.BOTH;
+			gridBagConstraints5.gridy = 3;
+			GridBagConstraints gridBagConstraints31 = new GridBagConstraints();
+			gridBagConstraints31.gridx = 0;
+			gridBagConstraints31.gridy = 3;
+			queryTypeLabel = new JLabel("Query Type");
+			GridBagConstraints gridBagConstraints23 = new GridBagConstraints();
+			gridBagConstraints23.fill = GridBagConstraints.HORIZONTAL;
+			gridBagConstraints23.gridy = 1;
+			gridBagConstraints23.weightx = 1.0;
+			gridBagConstraints23.insets = new Insets(0, 0, 0, 10);
+			gridBagConstraints23.gridx = 1;
+			GridBagConstraints gridBagConstraints13 = new GridBagConstraints();
+			gridBagConstraints13.gridx = 0;
+			gridBagConstraints13.insets = new Insets(15, 10, 15, 10);
+			gridBagConstraints13.gridy = 1;
+			endpointLabel = new JLabel("Endpoint");
+			GridBagConstraints gridBagConstraints22 = new GridBagConstraints();
+			gridBagConstraints22.fill = GridBagConstraints.NONE;
+			gridBagConstraints22.gridy = 8;
+			gridBagConstraints22.weightx = 1.0;
+			gridBagConstraints22.ipadx = 0;
+			gridBagConstraints22.anchor = GridBagConstraints.WEST;
+			gridBagConstraints22.insets = new Insets(15, 0, 15, 0);
+			gridBagConstraints22.gridwidth = 0;
+			gridBagConstraints22.gridx = 1;
+			GridBagConstraints gridBagConstraints12 = new GridBagConstraints();
+			gridBagConstraints12.gridx = 0;
+			gridBagConstraints12.gridy = 8;
+			resultTypeLabel = new JLabel("Result Format");
+			GridBagConstraints gridBagConstraints3 = new GridBagConstraints();
+			gridBagConstraints3.fill = GridBagConstraints.HORIZONTAL;
+			gridBagConstraints3.gridy = 7;
+			gridBagConstraints3.weightx = 1.0;
+			gridBagConstraints3.insets = new Insets(10, 0, 10, 10);
+			gridBagConstraints3.gridx = 1;
+			GridBagConstraints gridBagConstraints21 = new GridBagConstraints();
+			gridBagConstraints21.gridx = 0;
+			gridBagConstraints21.gridy = 7;
+			encodingLabel = new JLabel("Encoding");
+			GridBagConstraints gridBagConstraints11 = new GridBagConstraints();
+			gridBagConstraints11.gridx = 0;
+			gridBagConstraints11.insets = new Insets(10, 0, 10, 0);
+			gridBagConstraints11.gridy = 5;
+			optionLabel = new JLabel("Option");
+			GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
+			gridBagConstraints2.gridx = 0;
+			gridBagConstraints2.insets = new Insets(0, 10, 0, 10);
+			gridBagConstraints2.gridy = 4;
+			queryKeyLabel = new JLabel("Query Key");
+			GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
+			gridBagConstraints1.fill = GridBagConstraints.HORIZONTAL;
+			gridBagConstraints1.gridy = 5;
+			gridBagConstraints1.weightx = 1.0;
+			gridBagConstraints1.anchor = GridBagConstraints.CENTER;
+			gridBagConstraints1.insets = new Insets(10, 0, 10, 10);
+			gridBagConstraints1.gridx = 1;
+			GridBagConstraints gridBagConstraints = new GridBagConstraints();
+			gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
+			gridBagConstraints.gridy = 4;
+			gridBagConstraints.weightx = 1.0;
+			gridBagConstraints.gridheight = 1;
+			gridBagConstraints.insets = new Insets(10, 0, 10, 10);
+			gridBagConstraints.gridx = 1;
+			mainPanel = new JPanel();
+			mainPanel.setLayout(new GridBagLayout());
+			mainPanel.add(getQueryKeyTextField(), gridBagConstraints);
+			mainPanel.add(getOptionTextField(), gridBagConstraints1);
+			mainPanel.add(queryKeyLabel, gridBagConstraints2);
+			mainPanel.add(optionLabel, gridBagConstraints11);
+			mainPanel.add(encodingLabel, gridBagConstraints21);
+			mainPanel.add(getEncodingTextField(), gridBagConstraints3);
+			mainPanel.add(resultTypeLabel, gridBagConstraints12);
+			mainPanel.add(getDataFormatComboBox(), gridBagConstraints22);
+			mainPanel.add(endpointLabel, gridBagConstraints13);
+			mainPanel.add(getEndpointTextField(), gridBagConstraints23);
+			mainPanel.add(queryTypeLabel, gridBagConstraints31);
+			mainPanel.add(getQueryTypePanel(), gridBagConstraints5);
+			mainPanel.add(namespacesLabel, gridBagConstraints14);
+			mainPanel.add(getNamespacesTextField(), gridBagConstraints24);
+			mainPanel.add(repositoryTypeLabel, gridBagConstraints15);
+			mainPanel.add(getRepositoryTypePanel(), gridBagConstraints25);
+			mainPanel.add(repositoryLabel, gridBagConstraints32);
+			mainPanel.add(getRepositoryTextField(), gridBagConstraints41);
+			mainPanel.add(userLabel, gridBagConstraints51);
+			mainPanel.add(passLabel, gridBagConstraints6);
+			mainPanel.add(getUserTextField(), gridBagConstraints7);
+			mainPanel.add(getPassPasswordField(), gridBagConstraints8);
+			mainPanel.add(urlLabel, gridBagConstraints9);
+			mainPanel.add(getRepositoryUrlTextField(), gridBagConstraints10);
+			
+		}
+		return mainPanel;
+	}
+
+	/**
+	 * This method initializes queryKeyTextField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getQueryKeyTextField() {
+		if (queryKeyTextField == null) {
+			queryKeyTextField = new JTextField();
+		}
+		return queryKeyTextField;
+	}
+
+	/**
+	 * This method initializes optionTextField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getOptionTextField() {
+		if (optionTextField == null) {
+			optionTextField = new JTextField();
+		}
+		return optionTextField;
+	}
+
+	/**
+	 * This method initializes encodingTextField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getEncodingTextField() {
+		if (encodingTextField == null) {
+			encodingTextField = new JTextField();
+		}
+		return encodingTextField;
+	}
+
+	/**
+	 * This method initializes dataFormatComboBox	
+	 * 	
+	 * @return javax.swing.JComboBox	
+	 */
+	private JComboBox getDataFormatComboBox() {
+		if (dataFormatComboBox == null) {
+			dataFormatComboBox = new JComboBox(EndpointSettings.getResultDataTypeList());
+		}
+		return dataFormatComboBox;
+	}
+
+	/**
+	 * This method initializes endpointTextField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getEndpointTextField() {
+		if (endpointTextField == null) {
+			endpointTextField = new JTextField();
+			endpointTextField.setEditable(false);
+		}
+		return endpointTextField;
+	}
+
+	/**
+	 * This method initializes queryTypePanel	
+	 * 	
+	 * @return javax.swing.JPanel	
+	 */
+	private JPanel getQueryTypePanel() {
+		if (queryTypePanel == null) {
+			queryTypePanel = new JPanel();
+			queryTypePanel.setLayout(new FlowLayout());
+			queryTypePanel.add(getQueryTypeDefaultRadioButton(), null);
+			queryTypePanel.add(getQueryTypeCustomRadioButton(), null);
+			ButtonGroup bg = new ButtonGroup();
+			bg.add(getQueryTypeDefaultRadioButton());
+			bg.add(getQueryTypeCustomRadioButton());
+		}
+		return queryTypePanel;
+	}
+
+	private void setCustomEnabled(boolean enabled){
+		this.getQueryKeyTextField().setEnabled(enabled);
+		this.getOptionTextField().setEnabled(enabled);
+		this.getEncodingTextField().setEnabled(enabled);
+		this.getDataFormatComboBox().setEnabled(enabled);
+		this.queryKeyLabel.setEnabled(enabled);
+		this.optionLabel.setEnabled(enabled);
+		this.encodingLabel.setEnabled(enabled);
+		this.resultTypeLabel.setEnabled(enabled);
+	}
+	
+	/**
+	 * This method initializes queryTypeDefaultRadioButton	
+	 * 	
+	 * @return javax.swing.JRadioButton	
+	 */
+	private JRadioButton getQueryTypeDefaultRadioButton() {
+		if (queryTypeDefaultRadioButton == null) {
+			queryTypeDefaultRadioButton = new JRadioButton("Default");
+			queryTypeDefaultRadioButton.addActionListener(new ActionListener() {
+				
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					setCustomEnabled(false);
+				}
+			});
+		}
+		return queryTypeDefaultRadioButton;
+	}
+
+	/**
+	 * This method initializes queryTypeCustomRadioButton	
+	 * 	
+	 * @return javax.swing.JRadioButton	
+	 */
+	private JRadioButton getQueryTypeCustomRadioButton() {
+		if (queryTypeCustomRadioButton == null) {
+			queryTypeCustomRadioButton = new JRadioButton("Custom");
+			queryTypeCustomRadioButton.addActionListener(new ActionListener() {
+				
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					setCustomEnabled(true);
+				}
+			});
+		}
+		return queryTypeCustomRadioButton;
+	}
+
+	/**
+	 * This method initializes namespacesTextField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getNamespacesTextField() {
+		if (namespacesTextField == null) {
+			namespacesTextField = new JTextField();
+		}
+		return namespacesTextField;
+	}
+
+	private void setEditEnabled(boolean enabled){
+		this.getRepositoryUrlTextField().setEnabled(enabled);
+		this.getRepositoryTextField().setEnabled(enabled);
+		this.getUserTextField().setEnabled(enabled);
+		this.getPassPasswordField().setEnabled(enabled);
+		this.urlLabel.setEnabled(enabled);
+		this.repositoryLabel.setEnabled(enabled);
+		this.userLabel.setEnabled(enabled);
+		this.passLabel.setEnabled(enabled);
+	}
+
+	/**
+	 * This method initializes repositoryTypePanel	
+	 * 	
+	 * @return javax.swing.JPanel	
+	 */
+	private JPanel getRepositoryTypePanel() {
+		if (repositoryTypePanel == null) {
+			GridBagConstraints gridBagConstraints4 = new GridBagConstraints();
+			gridBagConstraints4.gridx = -1;
+			gridBagConstraints4.gridy = -1;
+			repositoryTypePanel = new JPanel();
+			repositoryTypePanel.setLayout(new FlowLayout());
+			repositoryTypePanel.add(getRepositoryOnRadioButton(), gridBagConstraints4);
+			repositoryTypePanel.add(getRepositoryOffRadioButton(), new GridBagConstraints());
+			ButtonGroup bg = new ButtonGroup();
+			bg.add(getRepositoryOnRadioButton());
+			bg.add(getRepositoryOffRadioButton());
+
+		}
+		return repositoryTypePanel;
+	}
+
+	/**
+	 * This method initializes repositoryOnRadioButton	
+	 * 	
+	 * @return javax.swing.JRadioButton	
+	 */
+	private JRadioButton getRepositoryOnRadioButton() {
+		if (repositoryOnRadioButton == null) {
+			repositoryOnRadioButton = new JRadioButton();
+			repositoryOnRadioButton.setText("ON");
+			repositoryOnRadioButton.addActionListener(new ActionListener() {
+				
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					setEditEnabled(true);
+				}
+			});
+		}
+		return repositoryOnRadioButton;
+	}
+
+	/**
+	 * This method initializes repositoryOffRadioButton	
+	 * 	
+	 * @return javax.swing.JRadioButton	
+	 */
+	private JRadioButton getRepositoryOffRadioButton() {
+		if (repositoryOffRadioButton == null) {
+			repositoryOffRadioButton = new JRadioButton();
+			repositoryOffRadioButton.setText("OFF");
+			repositoryOffRadioButton.addActionListener(new ActionListener() {
+				
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					setEditEnabled(false);
+				}
+			});
+		}
+		return repositoryOffRadioButton;
+	}
+
+	/**
+	 * This method initializes repositoryTextField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getRepositoryTextField() {
+		if (repositoryTextField == null) {
+			repositoryTextField = new JTextField();
+		}
+		return repositoryTextField;
+	}
+
+	/**
+	 * This method initializes userTextField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getUserTextField() {
+		if (userTextField == null) {
+			userTextField = new JTextField();
+		}
+		return userTextField;
+	}
+
+	/**
+	 * This method initializes passPasswordField	
+	 * 	
+	 * @return javax.swing.JPasswordField	
+	 */
+	private JPasswordField getPassPasswordField() {
+		if (passPasswordField == null) {
+			passPasswordField = new JPasswordField();
+		}
+		return passPasswordField;
+	}
+
+	/**
+	 * This method initializes urlTextField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getRepositoryUrlTextField() {
+		if (repositoryUrlTextField == null) {
+			repositoryUrlTextField = new JTextField();
+		}
+		return repositoryUrlTextField;
+	}
+
+}  //  @jve:decl-index=0:visual-constraint="10,10"
Index: BH13SPARQLBuilder/src/hozo/sparql/gui/SparqlSearchPanel.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/gui/SparqlSearchPanel.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/gui/SparqlSearchPanel.java (revision 9)
@@ -0,0 +1,274 @@
+package jp.ac.osaka_u.sanken.sparql.gui;
+
+import java.awt.BorderLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JSplitPane;
+import javax.swing.JTable;
+import javax.swing.JTextArea;
+import javax.swing.JScrollPane;
+import javax.swing.JButton;
+import javax.swing.table.DefaultTableModel;
+
+import com.hp.hpl.jena.rdf.model.RDFNode;
+
+import jp.ac.osaka_u.sanken.sparql.EndpointSettingsManager;
+import jp.ac.osaka_u.sanken.sparql.SparqlAccessorFactory;
+import jp.ac.osaka_u.sanken.sparql.SparqlQueryListener;
+import jp.ac.osaka_u.sanken.sparql.SparqlResultListener;
+import jp.ac.osaka_u.sanken.sparql.SparqlResultSet;
+import jp.ac.osaka_u.sanken.sparql.ThreadedSparqlAccessor;
+
+public class SparqlSearchPanel extends JPanel {
+
+	private static final long serialVersionUID = 1L;
+	private JPanel executePanel = null;  //  @jve:decl-index=0:visual-constraint="428,142"
+	private JTextArea queryTextArea = null;
+	private JPanel footerPanel = null;
+	private JScrollPane resultListScrollPane = null;  //  @jve:decl-index=0:visual-constraint="153,224"
+	private JTable resultList = null;  //  @jve:decl-index=0:visual-constraint="369,21"
+	private JButton runQueryButton = null;  //  @jve:decl-index=0:visual-constraint="390,64"
+	private JSplitPane mainSplitPane = null;
+
+	private SparqlAccessorForm parent;
+	
+	private DefaultTableModel tableModel;
+
+	private ThreadedSparqlAccessor sa;
+
+	
+	/**
+	 * This is the default constructor
+	 */
+	public SparqlSearchPanel(SparqlAccessorForm parent) {
+		super();
+		initialize();
+		this.setParent(parent);
+	}
+
+	/**
+	 * This method initializes this
+	 * 
+	 * @return void
+	 */
+	private void initialize() {
+		this.setSize(300, 200);
+		this.setLayout(new BorderLayout());
+		this.add(getExecutePanel(), BorderLayout.NORTH);
+		this.add(getMainSplitPane(), BorderLayout.CENTER);
+	}
+
+	private JSplitPane getMainSplitPane(){
+		if (mainSplitPane == null){
+			mainSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, getQueryScrollPane(), getFooterPanel());
+			mainSplitPane.setDividerLocation(200);
+		}
+		
+		return mainSplitPane;
+	}
+	
+	/**
+	 * This method initializes keywordPanel	
+	 * 	
+	 * @return javax.swing.JPanel	
+	 */
+	private JPanel getExecutePanel() {
+		if (executePanel == null) {
+			executePanel = new JPanel();
+			executePanel.setLayout(new BorderLayout());
+			executePanel.add(getRunQueryButton(), BorderLayout.EAST);
+			
+			SparqlBuilderPanel bulider = new SparqlBuilderPanel(this);
+			executePanel.add(bulider,BorderLayout.CENTER);
+		}
+		return executePanel;
+	}
+	
+	public void setQueryText(String query){
+		this.getQueryTextField().setText(query);
+	}
+
+	/**
+	 * This method initializes keywordTextField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextArea getQueryTextField() {
+		if (queryTextArea == null) {
+			queryTextArea = new JTextArea();
+		}
+		return queryTextArea;
+	}
+	
+	/**
+	 * 讀懃ｴ｢繝ｯ繝ｼ繝峨ｒ蜿門ｾ励☆繧�
+	 * @return
+	 */
+	public String getFindWord(){
+		return getQueryTextField().getText();
+	}
+
+	private SparqlResultListener createSparqlResultListener2(){
+		return new SparqlResultListener() {
+			
+			@Override
+			public void resultReceived(SparqlResultSet result) {
+				// 邨先棡繧偵∪縺壹�list縺ｫ霑ｽ蜉
+				setProcessing(false);
+				setResults(result);
+			}
+
+			@Override
+			public void uncaughtException(Thread t, Throwable e) {
+				// TODO 閾ｪ蜍慕函謌舌＆繧後◆繝｡繧ｽ繝�ラ繝ｻ繧ｹ繧ｿ繝�
+				JOptionPane.showMessageDialog(getParent(), "Execute error:"+e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
+				setProcessing(false);
+			}
+		};
+	}
+
+	/**
+	 * This method initializes footerPanel	
+	 * 	
+	 * @return javax.swing.JPanel	
+	 */
+	private JPanel getFooterPanel() {
+		if (footerPanel == null) {
+			footerPanel = new JPanel();
+			footerPanel.setLayout(new BorderLayout());
+			footerPanel.add(getResultListScrollPane(), BorderLayout.CENTER);
+		}
+		return footerPanel;
+	}
+
+	/**
+	 * This method initializes resultListScrollPane	
+	 * 	
+	 * @return javax.swing.JScrollPane	
+	 */
+	private JScrollPane getResultListScrollPane() {
+		if (resultListScrollPane == null) {
+			resultListScrollPane = new JScrollPane(getResultList());
+		}
+		return resultListScrollPane;
+	}
+
+	/**
+	 * This method initializes resultList	
+	 * 	
+	 * @return javax.swing.JList	
+	 */
+	private JTable getResultList() {
+		if (resultList == null) {
+			resultList = new JTable();
+		}
+		return resultList;
+	}
+	
+	public void setResults(SparqlResultSet result){
+		List<Map<String, RDFNode>> list = result.getDefaultResult();
+		
+		if (list.size() == 0){
+			tableModel = new DefaultTableModel();
+			getResultList().setModel(tableModel);
+			return;
+		}
+		
+		// header繧ｻ繝�ヨ
+		Map<String, RDFNode> columns = list.get(0);
+		List<String> clm = new ArrayList<String>();
+		for (String key : columns.keySet()){
+			clm.add(key);
+		}
+		tableModel = new DefaultTableModel(clm.toArray(new String[]{}), 0);
+
+		
+		// 荳ｭ霄ｫ繧ｻ繝�ヨ
+		for (Map<String, RDFNode> r : list){
+			List<Object> row = new ArrayList<Object>();
+			for (String key : clm){
+				RDFNode node = r.get(key);
+				row.add(node);
+			}
+			tableModel.addRow(row.toArray(new Object[]{}));
+		}
+		
+		getResultList().setModel(tableModel);
+		
+		parent.setResults(result);
+	}
+
+	private boolean processing = false;
+	private JScrollPane queryScrollPane = null;
+	
+	private void setProcessing(boolean processing){
+		this. processing = processing;
+		getRunQueryButton().setEnabled(!processing);
+		getResultList().setEnabled(!processing);
+		
+		parent.setProcessing(processing);
+	}
+	
+	private boolean isProcessing(){
+		return this.processing;
+	}
+	
+	/**
+	 * This method initializes runQueryButton	
+	 * 	
+	 * @return javax.swing.JButton	
+	 */
+	private JButton getRunQueryButton() {
+		if (runQueryButton == null) {
+			runQueryButton = new JButton("Run Query");
+			runQueryButton.addActionListener(new ActionListener() {
+				
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					if (isProcessing()){
+						return;
+					}
+					setProcessing(true);
+					sa = SparqlAccessorFactory.createSparqlAccessor(EndpointSettingsManager.instance.getSetting(parent.getCurrentEndPoint()), new SparqlQueryListener() {
+						
+						@Override
+						public void sparqlExecuted(String query) {
+							parent.addLogText("----------------");
+							parent.addLogText(query);
+						}
+					});
+					sa.executeQuery(getFindWord(), createSparqlResultListener2());
+				}
+			});
+		}
+		return runQueryButton;
+	}
+
+	/**
+	 * This method initializes queryScrollPane	
+	 * 	
+	 * @return javax.swing.JScrollPane	
+	 */
+	private JScrollPane getQueryScrollPane() {
+		if (queryScrollPane == null) {
+			queryScrollPane = new JScrollPane(getQueryTextField());
+		}
+		return queryScrollPane;
+	}
+
+	public SparqlAccessorForm getSparqlAccessorForm() {
+		return parent;
+	}
+
+	public void setParent(SparqlAccessorForm parent) {
+		this.parent = parent;
+	}
+	
+	
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/gui/SparqlAccessorForm.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/gui/SparqlAccessorForm.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/gui/SparqlAccessorForm.java (revision 9)
@@ -0,0 +1,879 @@
+package hozo.sparql.gui;
+
+import javax.swing.JPanel;
+import java.awt.BorderLayout;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.EventQueue;
+
+import javax.swing.ButtonGroup;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JComboBox;
+import javax.swing.JFileChooser;
+import javax.swing.JFrame;
+import javax.swing.JMenuBar;
+import javax.swing.JOptionPane;
+import javax.swing.JSplitPane;
+import javax.swing.JTabbedPane;
+import javax.swing.JButton;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+
+import jp.ac.osaka_u.sanken.sparql.EndpointSettings;
+import jp.ac.osaka_u.sanken.sparql.EndpointSettingsManager;
+import jp.ac.osaka_u.sanken.sparql.SparqlResultSet;
+import jp.ac.osaka_u.sanken.sparql.SparqlUtil;
+import jp.ac.osaka_u.sanken.sparql.plugin.compare.ComparePanel;
+import jp.ac.osaka_u.sanken.sparql.plugin.compare.CompareSubjectPanel;
+
+import java.awt.FlowLayout;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.JRadioButton;
+
+import com.hp.hpl.jena.rdf.model.RDFNode;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+
+public class SparqlAccessorForm extends JFrame {
+
+	private static final long serialVersionUID = 1L;
+	private JPanel headerPanel = null;
+	private JPanel endpointPanel = null;  //  @jve:decl-index=0:visual-constraint="301,8"
+	private JComboBox endpointComboBox = null;
+	private JTabbedPane searchTypeTabbedPane = null;
+	private JPanel crossKeywordSearchPanel = null;
+	private JPanel keywordSearchPanel = null;
+	private JPanel sparqlSearchPanel = null;
+	private JPanel repositoryEditPanel = null;
+	private JButton addEndpointButton = null;
+	private JPanel footerPanel = null;  //  @jve:decl-index=0:visual-constraint="396,293"
+	private JButton saveButton = null;  //  @jve:decl-index=0:visual-constraint="630,305"
+
+	private JPanel radioPanel = null;
+	private JRadioButton tsvRadioButton = null;
+	private JRadioButton csvRadioButton = null;
+	private JRadioButton xlsxRadioButton = null;
+
+	private List<Map<String, RDFNode>> results;
+	private JMenuBar mainMenuBar = null;
+	private JMenu fileMenu = null;
+	private JMenu optionMenu = null;
+	private JMenuItem exitFileMenuItem = null;
+	private JMenuItem optionMenuItem = null;
+	private JMenuItem saveSettingFileMenuItem = null;
+	private JMenuItem compareMenuItem = null;
+	private JMenuItem compareSubjectMenuItem = null;
+
+	private String settingFile = "settings.xml";
+	private JSplitPane mainPanel = null;
+	private JPanel sparqlLogPanel = null;
+	private JScrollPane sparqlLogScrollPane = null;
+	private JTextArea sparqlLogTextArea = null;
+	private JMenu helpMenu = null;
+	private JMenuItem menuVersionItem = null;
+
+
+	/**
+	 * This is the default constructor
+	 */
+	public SparqlAccessorForm() {
+		super();
+		loadSetting();
+		initialize();
+	}
+
+	/**
+	 * This method initializes this
+	 *
+	 * @return void
+	 */
+	private void initialize() {
+//		this.setSize(370, 251);
+        this.setJMenuBar(getMainMenuBar());
+        this.addWindowListener(new WindowAdapter() {
+        	@Override
+        	public void windowClosing(WindowEvent e) {
+        		if (EndpointSettingsManager.instance.isChanged()){
+        			int option = JOptionPane.showConfirmDialog(getContentPane(), "繧ｨ繝ｳ繝峨�繧､繝ｳ繝郁ｨｭ螳壹′螟画峩縺輔ｌ縺ｦ縺�∪縺吶ゆｿ晏ｭ倥＠縺ｾ縺吶°��, "", JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE);
+        			if (option == JOptionPane.YES_OPTION){
+        				saveSetting(false);
+        			}
+        		}
+        	}
+        });
+        Container compo = this.getContentPane();
+		compo.setLayout(new BorderLayout());
+		compo.add(getHeaderPanel(), BorderLayout.NORTH);
+		compo.add(getFooterPanel(), BorderLayout.SOUTH);
+		compo.add(getMainPanel(), BorderLayout.CENTER);
+	}
+
+	/**
+	 * This method initializes headerPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getHeaderPanel() {
+		if (headerPanel == null) {
+			headerPanel = new JPanel();
+			headerPanel.setLayout(new BorderLayout());
+			headerPanel.add(getEndpointPanel(),  BorderLayout.NORTH);
+
+		}
+		return headerPanel;
+	}
+
+	/**
+	 * This method initializes endpointPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getEndpointPanel() {
+		if (endpointPanel == null) {
+			endpointPanel = new JPanel();
+			endpointPanel.setLayout(new BorderLayout());
+			endpointPanel.add(getEndpointComboBox(), BorderLayout.CENTER);
+			endpointPanel.add(getAddEndpointButton(), BorderLayout.EAST);
+		}
+		return endpointPanel;
+	}
+
+	/**
+	 * This method initializes endpointComboBox
+	 *
+	 * @return javax.swing.JComboBox
+	 */
+	private JComboBox getEndpointComboBox() {
+		if (endpointComboBox == null) {
+//			String[] endpoints = {"http://ja.dbpedia.org/sparql", "http://dbpedia.org/sparql", "http://www.wikipediaontology.org/query/", "http://hozoviewer.ei.sanken.osaka-u.ac.jp/endpoint/dbpedia", "http://lod.ac/species/sparql", "http://lod.ac/sparql"};
+			String[] endpoints = { "http://hozoviewer.ei.sanken.osaka-u.ac.jp/endpoint/dbpedia", "http://lod.ac/species/sparql", "http://lod.ac/sparql"};
+			for (String ep : endpoints){
+				EndpointSettingsManager.instance.getSetting(ep);
+			}
+			endpointComboBox = new JComboBox(endpoints);
+			endpointComboBox.setEditable(true);
+			endpointComboBox.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					setEditable();
+				}
+			});
+		}
+		return endpointComboBox;
+	}
+
+	public String getCurrentEndPoint(){
+		return (String)getEndpointComboBox().getSelectedItem();
+	}
+
+	/**
+	 * This method initializes searchTypeTabbedPane
+	 *
+	 * @return javax.swing.JTabbedPane
+	 */
+	private JTabbedPane getSearchTypeTabbedPane() {
+		if (searchTypeTabbedPane == null) {
+			searchTypeTabbedPane = new JTabbedPane();
+			searchTypeTabbedPane.addTab("Keyword Search", null, getKeywordSearchPanel(), null);
+			searchTypeTabbedPane.addTab("Cross Search", null, getCrossKeywordSearchPanel(), null);
+			searchTypeTabbedPane.addTab("SPARQL", null, getSparqlSearchPanel(), null);
+			//searchTypeTabbedPane.addTab("SPARQL Builder", null, getSparqlBuilderPanel(), null);
+			searchTypeTabbedPane.addTab("Edit", null, getRepositoryEditPanel(), null);
+		}
+		return searchTypeTabbedPane;
+	}
+
+	private void setEditable(){
+		EndpointSettings setting = EndpointSettingsManager.instance.getSetting(this.getCurrentEndPoint());
+
+		getSearchTypeTabbedPane().setEnabledAt(getSearchTypeTabbedPane().indexOfComponent(getRepositoryEditPanel()), setting.isEditable());
+	}
+
+	/**
+	 * This method initializes keywordSearchPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getKeywordSearchPanel() {
+		if (keywordSearchPanel == null) {
+			keywordSearchPanel = new KeywordSearchPanel(this);
+		}
+		return keywordSearchPanel;
+	}
+
+	/**
+	 * This method initializes crossKeywordSearchPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getCrossKeywordSearchPanel() {
+		if (crossKeywordSearchPanel == null) {
+			crossKeywordSearchPanel = new CrossKeywordSearchPanel(this);
+		}
+		return crossKeywordSearchPanel;
+	}
+
+	/**
+	 * This method initializes sparqlSearchPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getSparqlSearchPanel() {
+		if (sparqlSearchPanel == null) {
+			sparqlSearchPanel = new SparqlSearchPanel(this);
+		}
+		return sparqlSearchPanel;
+	}
+	
+//	private JPanel getSparqlBuilderPanel(){
+//		return new SparqlBuilderPanel(this);
+//	}
+	
+	private JPanel getRepositoryEditPanel(){
+		if (repositoryEditPanel == null){
+			repositoryEditPanel = new RepositoryKeywordSearchEditPanel(this);
+		}
+		return repositoryEditPanel;
+	}
+
+	/**
+	 * This method initializes addEndpointButton
+	 *
+	 * @return javax.swing.JButton
+	 */
+	private JButton getAddEndpointButton() {
+		if (addEndpointButton == null) {
+			addEndpointButton = new JButton("New");
+			addEndpointButton.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					boolean contains = false;
+					for (int i=0; i<getEndpointComboBox().getItemCount(); i++){
+						Object item = getEndpointComboBox().getItemAt(i);
+						if (item.equals(getCurrentEndPoint())){
+							contains = true;
+							break;
+						}
+					}
+					if (!contains){
+						EndpointSettingsManager.instance.getSetting(getCurrentEndPoint());
+						getEndpointComboBox().addItem(getCurrentEndPoint());
+					}
+				}
+			});
+		}
+		return addEndpointButton;
+	}
+
+	/**
+	 * This method initializes footerPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getFooterPanel() {
+		if (footerPanel == null) {
+			footerPanel = new JPanel();
+			footerPanel.setLayout(new BorderLayout());
+			footerPanel.add(getSaveButton(), BorderLayout.EAST);
+			footerPanel.add(getRadioPanel(), BorderLayout.CENTER);
+		}
+		return footerPanel;
+	}
+
+	/**
+	 * This method initializes saveButton
+	 *
+	 * @return javax.swing.JButton
+	 */
+	private JButton getSaveButton() {
+		if (saveButton == null) {
+			saveButton = new JButton("Save Result");
+			saveButton.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					save();
+				}
+			});
+			saveButton.setEnabled(false);
+		}
+		return saveButton;
+	}
+
+	private int saveSetting(boolean needConfirm){
+		// 蜃ｺ蜉帛�豎ｺ螳�
+
+		// 遒ｺ隱阪ム繧､繧｢繝ｭ繧ｰ
+		if (needConfirm){
+			int option = JOptionPane.showConfirmDialog(getContentPane(), "繧ｨ繝ｳ繝峨�繧､繝ｳ繝郁ｨｭ螳壹ｒ菫晏ｭ倥＠縺ｾ縺�, "", JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE);
+			if (option != JOptionPane.YES_OPTION){
+				return JFileChooser.ABORT;
+			}
+		}
+
+
+		File file = new File(settingFile);
+		try {
+			EndpointSettings.outputXML(new FileOutputStream(file), EndpointSettingsManager.instance.getSettings());
+			EndpointSettingsManager.instance.resetChanged();
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+			return JFileChooser.ERROR;
+		}
+		return 0;
+
+		/*
+		// 繝輔ぃ繧､繝ｫ驕ｸ謚槭ム繧､繧｢繝ｭ繧ｰ繧貞他縺ｳ蜃ｺ縺�
+		JFileChooser fileChooser = new JFileChooser();
+		fileChooser.setDialogType(JFileChooser.SAVE_DIALOG);
+
+		// 繝輔ぃ繧､繝ｫ驕ｸ謚樒ｵ先棡蜿門ｾ�
+		int result = fileChooser.showOpenDialog(this);
+		File file = fileChooser.getSelectedFile();
+		if (result == JFileChooser.CANCEL_OPTION || file == null) {
+			// 繧ｭ繝｣繝ｳ繧ｻ繝ｫ謚ｼ荳九√∪縺溘�縲√ヵ繧｡繧､繝ｫ驕ｸ謚槭↑縺励�縺溘ａ菴輔ｂ縺励↑縺�
+			return JFileChooser.ABORT;
+		}
+
+		try {
+			EndpointSettings.outputXML(new FileOutputStream(file), EndpointSettingsManager.instance.getSettings());
+			return 0;
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+			return JFileChooser.ERROR;
+		}
+		*/
+
+	}
+
+	private int loadSetting(){
+		File file = new File(settingFile);
+		try {
+			EndpointSettings[] settings = EndpointSettings.inputXML(new FileInputStream(file));
+			if (settings != null){
+				EndpointSettingsManager.instance.setSettings(settings);
+				EndpointSettingsManager.instance.resetChanged();
+
+				for (EndpointSettings setting : settings){
+					DefaultComboBoxModel model = (DefaultComboBoxModel)getEndpointComboBox().getModel();
+					boolean exists = false;
+					for (int i=0; i<model.getSize(); i++){
+						String ep = (String)model.getElementAt(i);
+						if (setting.getEndpoint().equals(ep)){
+							exists = true;
+							break;
+						}
+					}
+					if (!exists){
+						model.addElement(setting.getEndpoint());
+					}
+				}
+
+				return 0;
+			}
+		} catch (FileNotFoundException e) {
+			saveSetting(false);
+			e.printStackTrace();
+			return JFileChooser.ERROR;
+		} finally {
+			setEditable();
+		}
+		return JFileChooser.ERROR;
+
+		/*
+		// 繝輔ぃ繧､繝ｫ驕ｸ謚槭ム繧､繧｢繝ｭ繧ｰ繧貞他縺ｳ蜃ｺ縺�
+		JFileChooser fileChooser = new JFileChooser();
+		fileChooser.setDialogType(JFileChooser.OPEN_DIALOG);
+
+		// 繝輔ぃ繧､繝ｫ驕ｸ謚樒ｵ先棡蜿門ｾ�
+		int result = fileChooser.showOpenDialog(this);
+		File file = fileChooser.getSelectedFile();
+		if (result == JFileChooser.CANCEL_OPTION || file == null) {
+			// 繧ｭ繝｣繝ｳ繧ｻ繝ｫ謚ｼ荳九√∪縺溘�縲√ヵ繧｡繧､繝ｫ驕ｸ謚槭↑縺励�縺溘ａ菴輔ｂ縺励↑縺�
+			return JFileChooser.ABORT;
+		}
+
+		try {
+			EndpointSettings[] settings = EndpointSettings.inputXML(new FileInputStream(file));
+			if (settings != null){
+				EndpointSettingsManager.instance.setSettings(settings);
+				return 0;
+			}
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+			return JFileChooser.ERROR;
+		}
+		return JFileChooser.ERROR;
+		*/
+
+	}
+
+
+	private void save(){
+		// 蜃ｺ蜉帛�豎ｺ螳�
+		// 繝輔ぃ繧､繝ｫ驕ｸ謚槭ム繧､繧｢繝ｭ繧ｰ繧貞他縺ｳ蜃ｺ縺�
+		JFileChooser fileChooser = new JFileChooser();
+		fileChooser.setDialogType(JFileChooser.SAVE_DIALOG);
+
+		// 繝輔ぃ繧､繝ｫ驕ｸ謚樒ｵ先棡蜿門ｾ�
+		int result = fileChooser.showOpenDialog(this);
+		File file = fileChooser.getSelectedFile();
+		if (result == JFileChooser.CANCEL_OPTION || file == null) {
+			// 繧ｭ繝｣繝ｳ繧ｻ繝ｫ謚ｼ荳九√∪縺溘�縲√ヵ繧｡繧､繝ｫ驕ｸ謚槭↑縺励�縺溘ａ菴輔ｂ縺励↑縺�
+			return;
+		}
+
+		try {
+			SparqlUtil.saveResult(results, getSaveType(), file);
+		} catch(Exception e){
+			e.printStackTrace();
+		}
+	}
+
+	private int getSaveType(){
+		if (getTsvRadioButton().isSelected()){
+			return SparqlUtil.OUTPUT_TYPE_TSV;
+		}
+		if (getCsvRadioButton().isSelected()){
+			return SparqlUtil.OUTPUT_TYPE_CSV;
+		}
+		if (getXlsxRadioButton().isSelected()){
+			return SparqlUtil.OUTPUT_TYPE_XLS;
+		}
+
+		// 縺薙％縺ｫ縺上ｋ縺薙→縺ｯ縺ｪ縺�
+		return SparqlUtil.OUTPUT_TYPE_TSV;
+	}
+
+	void setProcessing(boolean isProcessing){
+		getEndpointComboBox().setEnabled(!isProcessing);
+		getAddEndpointButton().setEnabled(!isProcessing);
+		getSearchTypeTabbedPane().setEnabled(!isProcessing);
+		getSaveButton().setEnabled(false);
+	}
+
+	void setResults(SparqlResultSet set){
+		List<Map<String, RDFNode>> results = set.getDefaultResult();
+		boolean saveable = false;
+		if (results != null && results.size() > 0){
+			saveable = true;
+		}
+		getSaveButton().setEnabled(saveable);
+
+		this.results = results;
+
+	}
+
+	/**
+	 * This method initializes radioPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getRadioPanel() {
+		if (radioPanel == null) {
+			radioPanel = new JPanel();
+			radioPanel.setLayout(new FlowLayout());
+			radioPanel.add(getTsvRadioButton(), null);
+			radioPanel.add(getCsvRadioButton(), null);
+			radioPanel.add(getXlsxRadioButton(), null);
+			ButtonGroup bg = new ButtonGroup();
+			bg.add(getTsvRadioButton());
+			bg.add(getCsvRadioButton());
+			bg.add(getXlsxRadioButton());
+			getTsvRadioButton().setSelected(true);
+		}
+		return radioPanel;
+	}
+
+	/**
+	 * This method initializes tsvRadioButton
+	 *
+	 * @return javax.swing.JRadioButton
+	 */
+	private JRadioButton getTsvRadioButton() {
+		if (tsvRadioButton == null) {
+			tsvRadioButton = new JRadioButton("TSV");
+		}
+		return tsvRadioButton;
+	}
+
+	/**
+	 * This method initializes csvRadioButton
+	 *
+	 * @return javax.swing.JRadioButton
+	 */
+	private JRadioButton getCsvRadioButton() {
+		if (csvRadioButton == null) {
+			csvRadioButton = new JRadioButton("CSV");
+		}
+		return csvRadioButton;
+	}
+
+	/**
+	 * This method initializes xlsxRadioButton
+	 *
+	 * @return javax.swing.JRadioButton
+	 */
+	private JRadioButton getXlsxRadioButton() {
+		if (xlsxRadioButton == null) {
+			xlsxRadioButton = new JRadioButton("XLSX");
+			xlsxRadioButton.setEnabled(false);
+		}
+		return xlsxRadioButton;
+	}
+
+	/**
+	 * This method initializes mainMenuBar
+	 *
+	 * @return javax.swing.JMenuBar
+	 */
+	private JMenuBar getMainMenuBar() {
+		if (mainMenuBar == null) {
+			mainMenuBar = new JMenuBar();
+			mainMenuBar.add(getFileMenu());
+			mainMenuBar.add(getOptionMenu());
+			mainMenuBar.add(getHelpMenu());
+		}
+		return mainMenuBar;
+	}
+
+	/**
+	 * This method initializes fileMenu
+	 *
+	 * @return javax.swing.JMenu
+	 */
+	private JMenu getFileMenu() {
+		if (fileMenu == null) {
+			fileMenu = new JMenu("File");
+			fileMenu.add(getSaveSettingFileMenuItem());
+//			fileMenu.add(getLoadSettingMenuItem());
+			fileMenu.add(getExitFileMenuItem());
+		}
+		return fileMenu;
+	}
+
+	/**
+	 * This method initializes optionMenu
+	 *
+	 * @return javax.swing.JMenu
+	 */
+	private JMenu getOptionMenu() {
+		if (optionMenu == null) {
+			optionMenu = new JMenu("Option");
+			optionMenu.add(getOptionMenuItem());
+
+			// Java縺ｯplugin蛹悶☆繧九�縺碁擇蛟偵↑縺ｮ縺ｧ縺薙％縺ｫ繝吶ち縺ｧ譖ｸ縺�
+			optionMenu.add(getCompareMenuItem());
+			optionMenu.add(getCompareSubjectMenuItem());
+		}
+		return optionMenu;
+	}
+
+	/**
+	 * This method initializes exitFileMenuItem
+	 *
+	 * @return javax.swing.JMenuItem
+	 */
+	private JMenuItem getExitFileMenuItem() {
+		if (exitFileMenuItem == null) {
+			exitFileMenuItem = new JMenuItem("Exit");
+			exitFileMenuItem.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					int option = JOptionPane.showConfirmDialog(getContentPane(), "邨ゆｺ�＠縺ｾ縺吶°��, "", JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE);
+					if (option == JOptionPane.YES_OPTION){
+						System.exit(0);
+					}
+
+				}
+			});
+		}
+		return exitFileMenuItem;
+	}
+
+	private JMenuItem getCompareMenuItem() {
+		if (compareMenuItem == null) {
+			compareMenuItem = new JMenuItem("Compare");
+			compareMenuItem.addActionListener(new ActionListener() {
+				public void actionPerformed(ActionEvent arg0) {
+//					openSettingDialog();
+					JFrame frame = new JFrame();
+					frame.setContentPane(new ComparePanel(frame));
+					frame.setSize(750, 500);
+
+					frame.setVisible(true);
+				}
+			});
+		}
+		return compareMenuItem;
+	}
+
+	private JMenuItem getCompareSubjectMenuItem() {
+		if (compareSubjectMenuItem == null) {
+			compareSubjectMenuItem = new JMenuItem("Compare Subjects");
+			compareSubjectMenuItem.addActionListener(new ActionListener() {
+				public void actionPerformed(ActionEvent arg0) {
+//					openSettingDialog();
+					JFrame frame = new JFrame();
+					frame.setContentPane(new CompareSubjectPanel(frame));
+					frame.setSize(750, 500);
+
+					frame.setVisible(true);
+				}
+			});
+		}
+		return compareSubjectMenuItem;
+	}
+
+
+	/**
+	 * This method initializes optionMenuItem
+	 *
+	 * @return javax.swing.JMenuItem
+	 */
+	private JMenuItem getOptionMenuItem() {
+		if (optionMenuItem == null) {
+			optionMenuItem = new JMenuItem("Option Setting");
+			optionMenuItem.addActionListener(new ActionListener() {
+				public void actionPerformed(ActionEvent arg0) {
+					openSettingDialog();
+				}
+			});
+		}
+		return optionMenuItem;
+	}
+
+	private void openSettingDialog(){
+		EndpointSettings setting = EndpointSettingsManager.instance.getSetting(this.getCurrentEndPoint());
+		OptionDialog od = new OptionDialog(this, setting);
+
+		od.setModal(true);
+		od.setVisible(true);
+		if (od.isOk()){
+			setting.setUseCustomParam(od.isUseCustom());
+			setting.setQueryKey(od.getQueryKey());
+			setting.setOption(od.getOption());
+			setting.setNamespaces(od.getNamespaces());
+			setting.setEncoding(od.getEndoding());
+			setting.setResultType(od.getResultType());
+
+			setting.setEditable(od.isEditable());
+			setting.setRepositoryURL(od.getRepositoryURL());
+			setting.setRepository(od.getRepository());
+			setting.setUser(od.getUser());
+			setting.setPass(od.getPassword());
+
+			setEditable();
+		}
+	}
+
+	/**
+	 * This method initializes saveSettingFileMenuItem
+	 *
+	 * @return javax.swing.JMenuItem
+	 */
+	private JMenuItem getSaveSettingFileMenuItem() {
+		if (saveSettingFileMenuItem == null) {
+			saveSettingFileMenuItem = new JMenuItem("Save Settings");
+			saveSettingFileMenuItem.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					int ret = saveSetting(true);
+					if (ret == JFileChooser.ABORT){
+						// 荳ｭ譁ｭ
+					} else if (ret == JFileChooser.ERROR){
+						// 繧ｨ繝ｩ繝ｼ
+					} else {
+						// 謌仙粥
+					}
+				}
+			});
+		}
+		return saveSettingFileMenuItem;
+	}
+
+	/**
+	 * This method initializes loadSettingMenuItem
+	 *
+	 * @return javax.swing.JMenuItem
+	 *//*
+	private JMenuItem getLoadSettingMenuItem() {
+		if (loadSettingMenuItem == null) {
+			loadSettingMenuItem = new JMenuItem("Load Settings");
+			loadSettingMenuItem.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					int ret = loadSetting();
+					if (ret == JFileChooser.ABORT){
+						// 荳ｭ譁ｭ
+					} else if (ret == JFileChooser.ERROR){
+						// 繧ｨ繝ｩ繝ｼ
+					} else {
+						// 謌仙粥
+					}
+				}
+			});
+		}
+		return loadSettingMenuItem;
+	}*/
+
+	/**
+	 * This method initializes mainPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JSplitPane getMainPanel() {
+		if (mainPanel == null) {
+			mainPanel = new JSplitPane(JSplitPane.VERTICAL_SPLIT, getSearchTypeTabbedPane(), getSparqlLogPanel());
+			mainPanel.setDividerLocation(400);
+		}
+		return mainPanel;
+	}
+
+	/**
+	 * This method initializes sparqlLogPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getSparqlLogPanel() {
+		if (sparqlLogPanel == null) {
+			sparqlLogPanel = new JPanel();
+			sparqlLogPanel.setLayout(new BorderLayout());
+			sparqlLogPanel.add(getSparqlLogScrollPane(), BorderLayout.CENTER);
+		}
+		return sparqlLogPanel;
+	}
+
+	/**
+	 * This method initializes sparqlLogScrollPane
+	 *
+	 * @return javax.swing.JScrollPane
+	 */
+	private JScrollPane getSparqlLogScrollPane() {
+		if (sparqlLogScrollPane == null) {
+			sparqlLogScrollPane = new JScrollPane(getSparqlLogTextArea(), JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
+			sparqlLogScrollPane.setPreferredSize(new Dimension(200, 300));
+		}
+		return sparqlLogScrollPane;
+	}
+
+	/**
+	 * This method initializes sparqlLogTextArea
+	 *
+	 * @return javax.swing.JTextArea
+	 */
+	private JTextArea getSparqlLogTextArea() {
+		if (sparqlLogTextArea == null) {
+			sparqlLogTextArea = new JTextArea();
+			sparqlLogTextArea.setEditable(false);
+			sparqlLogTextArea.getDocument().addDocumentListener(new DocumentListener() {
+
+				@Override
+				public void removeUpdate(DocumentEvent arg0) {
+				}
+
+				@Override
+				public void changedUpdate(DocumentEvent arg0) {
+				}
+				@Override
+				public void insertUpdate(DocumentEvent e) {
+					final Document doc = sparqlLogTextArea.getDocument();
+					final Element root = doc.getDefaultRootElement();
+					if(root.getElementCount() <= 100){ // TODO 100縺ｯ繝吶ち譖ｸ縺�
+						return;
+					}
+					EventQueue.invokeLater(new Runnable() {
+						@Override
+						public void run() {
+							removeLines(doc, root);
+						}
+					});
+					sparqlLogTextArea.setCaretPosition(doc.getLength());
+				}
+				private void removeLines(Document doc, Element root) {
+					Element fl = root.getElement(0);
+					try{
+						doc.remove(0, fl.getEndOffset());
+					}catch(BadLocationException ble) {
+						System.out.println(ble);
+					}
+				}
+			});
+		}
+		return sparqlLogTextArea;
+	}
+
+	void addLogText(String log){
+		String[] logs = log.split("\n");
+		for (String l : logs){
+			sparqlLogTextArea.append((sparqlLogTextArea.getDocument().getLength() > 0) ? "\n" + l : l);
+		}
+		sparqlLogTextArea.setCaretPosition(sparqlLogTextArea.getDocument().getLength());
+	}
+
+	/**
+	 * This method initializes helpMenu
+	 *
+	 * @return javax.swing.JMenu
+	 */
+	private JMenu getHelpMenu() {
+		if (helpMenu == null) {
+			helpMenu = new JMenu("Help");
+			helpMenu.add(getMenuVersionItem());
+		}
+		return helpMenu;
+	}
+
+	/**
+	 * This method initializes menuVersionItem
+	 *
+	 * @return javax.swing.JMenuItem
+	 */
+	private JMenuItem getMenuVersionItem() {
+		if (menuVersionItem == null) {
+			menuVersionItem = new JMenuItem("Version");
+			menuVersionItem.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					awakeVersionDialog();
+				}
+			});
+		}
+		return menuVersionItem;
+	}
+
+	private void awakeVersionDialog(){
+		// TODO
+		VersionDialog vd = new VersionDialog(this);
+
+		vd.setVisible(true);
+	}
+
+	public static void main(String args[]){
+		JFrame frame = new SparqlAccessorForm();
+		frame.setSize(900, 800);
+		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+		frame.setVisible(true);
+	}
+}  //  @jve:decl-index=0:visual-constraint="10,10"
Index: BH13SPARQLBuilder/src/hozo/sparql/gui/SparqlBuilderPanel.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/gui/SparqlBuilderPanel.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/gui/SparqlBuilderPanel.java (revision 9)
@@ -0,0 +1,335 @@
+package jp.ac.osaka_u.sanken.sparql.gui;
+
+import hozo.maptool.MapFactory;
+
+import java.awt.BorderLayout;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.List;
+
+import javax.swing.*;
+
+import jp.ac.osaka_u.sanken.sparql.EndpointSettingsManager;
+import jp.ac.osaka_u.sanken.sparql.SparqlQueryListener;
+
+import org.biohackathon.SPARQLBuilder.OWL.ClassLink;
+import org.biohackathon.SPARQLBuilder.OWL.Direction;
+import org.biohackathon.SPARQLBuilder.OWL.Instance;
+import org.biohackathon.SPARQLBuilder.OWL.OWLQueryBuilder;
+import org.biohackathon.SPARQLBuilder.OWL.OWLQueryBuilderImpl;
+import org.biohackathon.SPARQLBuilder.OWL.Path;
+
+
+
+public class SparqlBuilderPanel extends JPanel{
+	
+	JTextField jtf_start_class;
+	JTextField jtf_end_class;
+	JTextArea jta_query;
+	MapFactory map;
+	SparqlSearchPanel search_panel;
+
+//	public SparqlBuilderPanel(SparqlAccessorForm parent) {
+//		super(parent);
+//		initialize();
+//		this.parent = parent;
+//	}
+	
+	
+/*	SparqlBuilderPanel(SparqlAccessorForm sparqlAccessorForm){
+		super();
+		
+		this.setLayout(new BorderLayout());
+		JPanel jp_top = new JPanel();
+		jtf_start_class = new JTextField("http://dbpedia.org/ontology/Artist");
+		jp_top.add(new JLabel("Start Class:"));
+		jp_top.add(jtf_start_class);
+		JButton jb_start =  new JButton("Select");
+		jp_top.add(jb_start);
+
+		jtf_end_class = new JTextField("http://dbpedia.org/ontology/Award");
+		jp_top.add(new JLabel("End Class:"));
+		jp_top.add(jtf_end_class);
+		JButton jb_end =  new JButton("Select");
+		jp_top.add(jb_end);
+
+		JButton  jb_get_path = new JButton("Get Path");
+		jp_top.add(jb_get_path);
+		
+		map = new MapFactory();
+		map.setSPARQLbuilder(this);
+
+		
+		jb_get_path.addActionListener(new ActionListener() {
+					
+			@Override
+			public void actionPerformed(ActionEvent e) {
+				System.out.println("getPaths:::>>>>"+jtf_start_class.getText()
+						+"<===>"+jtf_end_class.getText());
+			     //map.loadPathList(map.getDummyPathList());		
+				
+				try {
+					System.out.println("getPaths:::>>>>"+jtf_start_class.getText()
+							+"<===>"+jtf_end_class.getText());
+					OWLQueryBuilderImpl builder = makeOWLQueryBuilderImpl();
+					Path[] path = builder.getPaths(jtf_start_class.getText(), jtf_end_class.getText());
+					System.out.println("RESULT:::>>>>"+path.length);
+					
+					map.loadPathList(path);		
+					//jta_query.setText(createSPARQL(path[0]));
+					
+				} catch (Exception e1) {
+					// TODO Auto-generated catch block
+					e1.printStackTrace();
+				}
+				
+				
+				
+			}
+		});
+		
+		this.add(jp_top, BorderLayout.NORTH);
+		jta_query = new JTextArea();
+		this.add(new JScrollPane(jta_query), BorderLayout.CENTER);
+		JPanel jp_bottom = new JPanel();
+		jp_bottom.add(new JButton("make query"));
+		this.add(jp_bottom, BorderLayout.SOUTH);
+	}*/
+
+
+	SparqlBuilderPanel(SparqlSearchPanel panel){
+		super();
+		this.search_panel = panel;
+		
+		this.setLayout(new GridLayout(3,1));
+		JPanel jp1 = new JPanel();
+		
+		jtf_start_class = new JTextField(40);
+		//jtf_start_class.setText("http://dbpedia.org/ontology/Artist");
+		jtf_start_class = new JTextField("http://purl.jp/bio/10/lsd/ontology/201209#EnglishCode");
+		jp1.add(new JLabel("Start Class:"));
+		jp1.add(jtf_start_class);
+		JButton jb_start =  new JButton("Select");
+		jp1.add(jb_start);
+		jb_start.addActionListener(new ActionListener(){
+
+			@Override
+			public void actionPerformed(ActionEvent arg0) {
+				// TODO Auto-generated method stub
+				System.out.println("jb_start action");
+				
+			}
+			
+		});
+		
+		JPanel jp2 = new JPanel();
+		jtf_end_class = new JTextField(40);
+	    //jtf_end_class.setText("http://dbpedia.org/ontology/Award");
+		jtf_end_class = new JTextField("http://purl.jp/bio/10/lsd/ontology/201209#JapaneseEntry");
+		jp2.add(new JLabel("End Class:"));
+		jp2.add(jtf_end_class);
+		JButton jb_end =  new JButton("Select");
+		jp2.add(jb_end);
+
+		
+		
+		JPanel jp3 = new JPanel();		
+		JButton  jb_get_path = new JButton("Get Path");
+		jp3.add(jb_get_path);
+		
+		map = new MapFactory();
+		map.setSPARQLbuilder(this);
+
+		
+		jb_get_path.addActionListener(new ActionListener() {
+					
+			@Override
+			public void actionPerformed(ActionEvent e) {
+				System.out.println("get path action");
+				//map.loadPathList(map.getDummyPathList());		
+				
+				try {
+					OWLQueryBuilderImpl builder = makeOWLQueryBuilderImpl();
+					System.out.println("getPaths:::>>>>"+jtf_start_class.getText()
+							+"<===>"+jtf_end_class.getText());
+					Path[] path = builder.getPaths(jtf_start_class.getText(), jtf_end_class.getText());
+					System.out.println("RESULT:::>>>>"+path.length);
+					
+					map.loadPathList(path);		
+					//jta_query.setText(createSPARQL(path[0]));
+					
+				} catch (Exception e1) {
+					// TODO Auto-generated catch block
+					e1.printStackTrace();
+					System.out.println(e.toString());
+				}
+				
+				
+				
+			}
+		});
+		
+		this.add(jp1);
+		this.add(jp2);
+		this.add(jp3);
+		
+//		jta_query = new JTextArea();
+//		this.add(new JScrollPane(jta_query), BorderLayout.CENTER);
+//		JPanel jp_bottom = new JPanel();
+//		jp_bottom.add(new JButton("make query"));
+//		this.add(jp_bottom, BorderLayout.SOUTH);
+	}
+	
+
+	
+	public void setSPARQL(Path path,int num) throws Exception{
+		String text = createSPARQL(path,num);
+		//this.jta_query.setText(text);
+		this.search_panel.setQueryText(text);
+	}
+	
+	OWLQueryBuilderImpl makeOWLQueryBuilderImpl() {
+//		String sparqlEndpoint = "http://lsd.dbcls.jp/sparql";
+		String sparqlEndpoint = search_panel.getSparqlAccessorForm().getCurrentEndPoint();
+	
+		
+//		String sparqlEndpoint = "http://dbpedia.org/sparql";
+		
+		System.out.println("Create OWLQueryBuilder for "+sparqlEndpoint);
+			
+		OWLQueryBuilder builder = new OWLQueryBuilderImpl(sparqlEndpoint);
+		
+		
+		String keyword = "\"artiste\"@fr";
+		String[] graphURIs = new String[0];
+		try {
+			
+	//	OWLQueryBuilder builder = new OWLQueryBuilderImpl(sparqlEndpoint);
+		String[] clsURIs;
+			clsURIs = builder.getOWLClasses(graphURIs, keyword);
+		for(String cls: clsURIs){
+			System.out.println(cls);
+		}
+
+		System.out.println("CLS");
+		ClassLink[] cls = builder.getNextClass(null, clsURIs[0], 0);
+		if( cls != null ){
+			for( ClassLink cl: cls){
+				System.out.println(cl.toString());
+			}
+		}
+
+		System.out.println("CLS-INS");
+		cls = builder.getNextClassViaInstanceLink(null, clsURIs[0], 100);
+		if( cls != null ){
+			for( ClassLink cl: cls){
+				System.out.println(cl.toString());
+			}
+		}
+
+		System.out.println("Instances");
+		Instance[] ins = builder.getInstances(null, "\"A.C. Reed\"@en");
+		if( ins != null ){
+			for( Instance in: ins){
+				System.out.println(in.toString());
+			}
+		}
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			System.out.println(e.toString());
+			e.printStackTrace();
+		}
+		
+		return (OWLQueryBuilderImpl) builder;
+	}
+
+public String createSPARQL(Path path) throws Exception {
+	return createSPARQL(path, 0);
+}
+
+public String createSPARQL(Path path, int num) throws Exception {
+		
+		
+		String startClass = path.getStartClass();
+		List<ClassLink> classLinks = path.getClassLinks();
+		
+		StringBuffer queryStr = new StringBuffer();
+		StringBuffer selStr = new StringBuffer();
+		StringBuffer whereStr = new StringBuffer();
+		if(num==0){
+			num = classLinks.size();
+		}
+			
+		queryStr.append("PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n");
+		queryStr.append("PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n");
+				
+		selStr.append("SELECT ");
+		whereStr.append("WHERE { \n");
+
+		String properties = null;
+		String objectClasses = null;
+		String subjectClasses = null;
+		Direction direction = null;
+		int i = 0;
+		int k = 0;
+		for (ClassLink link :classLinks )
+		{
+			properties = link.getPropertyURI();
+			objectClasses = link.getLinkedClassURI();
+			direction = link.getDirection();
+			
+			if (i==0)
+		    subjectClasses = startClass;
+			
+			selStr.append("?c").append(i).append(" ");
+			
+			if(i == classLinks.size())
+				selStr.append("\n");
+			
+			
+			whereStr.append("?c").append(i).
+			append(" rdf:type ").
+			append("<").
+			append(subjectClasses).
+			append(">").
+			append(".\n");
+						
+			if(direction == Direction.forward)
+			{
+			whereStr.append("?c").append(i).append(" ");
+			whereStr.append("<").append(properties).append("> ");			
+			whereStr.append("?c").append(i+1).append(".\n");			
+			}
+			else
+			{
+				whereStr.append("?c").append(i+1).append(" ");
+				whereStr.append("<").append(properties).append("> ");
+				whereStr.append("?c").append(i).append(".\n");
+			}
+			
+			subjectClasses = objectClasses;
+			i++;
+			k++;
+			if(k>=num){
+				break;
+			}
+		}
+		
+		selStr.append("?c").append(i).append(" \n");
+		whereStr.append("?c").append(i).append(" rdf:type ").
+		    append("<").
+		    append(subjectClasses).
+		    append(">").
+			append(".\n");
+	
+					
+		queryStr.append(selStr).append(whereStr).append("} LIMIT 100\n");;
+		
+		//System.out.println(queryStr);
+		return queryStr.toString();
+	}
+
+
+	
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/gui/GUIVersion.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/gui/GUIVersion.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/gui/GUIVersion.java (revision 9)
@@ -0,0 +1,22 @@
+package hozo.sparql.gui;
+
+import jp.ac.osaka_u.sanken.Version;
+
+/**
+ * GUI Version
+ * 2013/08/22 1.0.0 new
+ * 2013/10/10 1.1.0 made "cross search" panel
+ * @author kato
+ *
+ */
+public class GUIVersion extends Version {
+	@Override
+	public String getVersion(){
+		return "1.1.0";
+	}
+	
+	@Override
+	protected String getDateString() {
+		return "20131010";
+	}
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/gui/KeywordSearchPanel.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/gui/KeywordSearchPanel.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/gui/KeywordSearchPanel.java (revision 9)
@@ -0,0 +1,1264 @@
+package hozo.sparql.gui;
+
+import java.awt.BorderLayout;
+import java.awt.Desktop;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Window;
+import java.awt.Dialog.ModalityType;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.BoxLayout;
+import javax.swing.ButtonGroup;
+import javax.swing.DefaultListModel;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JRadioButton;
+import javax.swing.JScrollPane;
+import javax.swing.JSeparator;
+import javax.swing.JSplitPane;
+import javax.swing.JTable;
+import javax.swing.JTextField;
+import javax.swing.SwingConstants;
+import javax.swing.SwingUtilities;
+import javax.swing.event.ListDataEvent;
+import javax.swing.event.ListDataListener;
+import javax.swing.table.DefaultTableModel;
+
+import jp.ac.osaka_u.sanken.sparql.EndpointSettingsManager;
+import jp.ac.osaka_u.sanken.sparql.SparqlAccessor;
+import jp.ac.osaka_u.sanken.sparql.SparqlAccessorFactory;
+import jp.ac.osaka_u.sanken.sparql.SparqlQueryListener;
+import jp.ac.osaka_u.sanken.sparql.SparqlResultListener;
+import jp.ac.osaka_u.sanken.sparql.SparqlResultSet;
+import jp.ac.osaka_u.sanken.sparql.ThreadedSparqlAccessor;
+import jp.ac.osaka_u.sanken.util.EditableList;
+import jp.ac.osaka_u.sanken.util.EditableListItem;
+import jp.ac.osaka_u.sanken.util.StringUtil;
+
+import com.hp.hpl.jena.rdf.model.RDFNode;
+
+public class KeywordSearchPanel extends JPanel {
+
+	private static final long serialVersionUID = 1L;
+	private JPanel keywordPanel = null;
+	private JLabel keywordLabel = null;
+	private JTextField keywordTextField = null;
+	private JList subjectList = null;
+	private JScrollPane subjectScrollPane = null;
+	private JPanel centerPanel = null;
+	private JPanel footerPanel = null;
+	private JScrollPane resultListScrollPane = null;  //  @jve:decl-index=0:visual-constraint="153,224"
+	private JTable resultList = null;  //  @jve:decl-index=0:visual-constraint="369,21"
+	private JButton runQueryButton = null;  //  @jve:decl-index=0:visual-constraint="390,64"
+	private JSplitPane mainSplitPane = null;
+	private JPanel optionPanel = null;
+	private JPanel findTypePanel = null;
+	private JRadioButton fullMatchRadioButton = null;
+	private JRadioButton partMatchRadioButton = null;
+	private JSeparator findSeparator = null;
+
+	private boolean processing = false;
+	private JPanel headerPanel = null;
+	private JPanel limitPanel = null;
+	private JCheckBox limitEnableCheckBox = null;
+	private JLabel limitLabel = null;
+	private JComboBox limitComboBox = null;
+	private JRadioButton findSubjectRadioButton = null;
+	private JRadioButton findObjectRadioButton = null;
+	private JRadioButton findAllRadioButton = null;
+	private JRadioButton findLabelObjectRadioButton = null;
+	private Date fromDate;
+	private JPanel movePanel = null;
+	private JButton prevButton = null;
+	private JButton nextButton = null;
+	private JPanel limitMainPanel = null;
+	private JButton limitPrevButton = null;
+	private JButton limitNextButton = null;
+
+
+
+	private SparqlAccessorForm parent;
+
+	private DefaultListModel listModel;
+	private DefaultTableModel tableModel;
+
+	private ThreadedSparqlAccessor sa;  //  @jve:decl-index=0:
+
+	/* subject繧ｸ繝｣繝ｳ繝励ヲ繧ｹ繝医Μ */
+	private int historyIndex = 0;
+	private List<String> history;  //  @jve:decl-index=0:
+	private List<String> subjectHistoryList;
+
+	/* limit繝偵せ繝医Μ */
+	private Integer limit = null;  //  @jve:decl-index=0:
+	private int page = 0;
+	private String word;
+	private boolean fullMatch = false;
+	private int type;
+	private boolean hasLimitNext = false;
+
+	private static final String DEFAULT_PROPERTY_TYPE = "http://www.w3.org/2000/01/rdf-schema#label";
+
+
+	/**
+	 * This is the default constructor
+	 */
+	public KeywordSearchPanel(SparqlAccessorForm parent) {
+		super();
+		initialize();
+		this.parent = parent;
+	}
+
+	/**
+	 * This method initializes this
+	 *
+	 * @return void
+	 */
+	private void initialize() {
+		this.setSize(300, 200);
+		this.setLayout(new BorderLayout());
+		this.add(getHeaderPanel(), BorderLayout.NORTH);
+		this.add(getMainSplitPane(), BorderLayout.CENTER);
+	}
+
+	private JSplitPane getMainSplitPane(){
+		if (mainSplitPane == null){
+			mainSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, getCenterPanel(), getFooterPanel());
+			mainSplitPane.setDividerLocation(200);
+		}
+
+		return mainSplitPane;
+	}
+
+	/**
+	 * This method initializes keywordPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getKeywordPanel() {
+		if (keywordPanel == null) {
+			keywordPanel = new JPanel();
+			keywordPanel.setLayout(new BorderLayout());
+			keywordLabel = new JLabel();
+			keywordLabel.setText("Enter Keyword");
+			keywordPanel.add(keywordLabel, BorderLayout.WEST);
+			keywordPanel.add(getKeywordTextField(), BorderLayout.CENTER);
+			keywordPanel.add(getRunQueryButton(), BorderLayout.EAST);
+		}
+		return keywordPanel;
+	}
+
+
+	/**
+	 * This method initializes optionPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getOptionPanel() {
+		if (optionPanel == null) {
+			optionPanel = new JPanel();
+			optionPanel.setLayout(new BorderLayout());
+			optionPanel.add(getFindTypePanel(), BorderLayout.CENTER);
+			optionPanel.add(getLimitPanel(), BorderLayout.EAST);
+		}
+		return optionPanel;
+	}
+
+	/**
+	 * This method initializes findTypePanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getFindTypePanel() {
+		if (findTypePanel == null) {
+			FlowLayout flowLayout = new FlowLayout();
+			flowLayout.setHgap(10);
+			flowLayout.setVgap(0);
+			findTypePanel = new JPanel();
+			findTypePanel.setLayout(flowLayout);
+			findTypePanel.add(getFullMatchRadioButton(), null);
+			findTypePanel.add(getPartMatchRadioButton(), null);
+			findTypePanel.add(getFindSeparator(), null);
+			findTypePanel.add(getFindAllRadioButton(), null);
+			findTypePanel.add(getFindSubjectRadioButton(), null);
+			findTypePanel.add(getFindObjectRadioButton(), null);
+			findTypePanel.add(getFindLabelObjectRadioButton(), null);
+			ButtonGroup bg = new ButtonGroup();
+			bg.add(getFullMatchRadioButton());
+			bg.add(getPartMatchRadioButton());
+			getFullMatchRadioButton().setSelected(true);
+			ButtonGroup bg2 = new ButtonGroup();
+			bg2.add(getFindAllRadioButton());
+			bg2.add(getFindSubjectRadioButton());
+			bg2.add(getFindObjectRadioButton());
+			bg2.add(getFindLabelObjectRadioButton());
+			getFindSubjectRadioButton().setSelected(true);
+		}
+		return findTypePanel;
+	}
+
+	private boolean isFullMatch(){
+		return getFullMatchRadioButton().isSelected();
+	}
+
+	private int getFindType(){
+		if (getFindSubjectRadioButton().isSelected()){
+			return SparqlAccessor.FIND_TARGET_SUBJECT;
+		}
+		if (getFindObjectRadioButton().isSelected()){
+			return SparqlAccessor.FIND_TARGET_OBJECT;
+		}
+		if (getFindLabelObjectRadioButton().isSelected()){
+			return SparqlAccessor.FIND_TARGET_SPECIFIC_OBJECT;
+		}
+		return SparqlAccessor.FIND_TARGET_ALL;
+	}
+
+	/**
+	 * This method initializes fulMatchRadioButton
+	 *
+	 * @return javax.swing.JRadioButton
+	 */
+	private JRadioButton getFullMatchRadioButton() {
+		if (fullMatchRadioButton == null) {
+			fullMatchRadioButton = new JRadioButton("Full Match");
+		}
+		return fullMatchRadioButton;
+	}
+
+	/**
+	 * This method initializes partMatchRadioButton
+	 *
+	 * @return javax.swing.JRadioButton
+	 */
+	private JRadioButton getPartMatchRadioButton() {
+		if (partMatchRadioButton == null) {
+			partMatchRadioButton = new JRadioButton("Part Match");
+		}
+		return partMatchRadioButton;
+	}
+
+	/**
+	 * This method initializes findSeparator
+	 *
+	 * @return JSeparator
+	 */
+	private JSeparator getFindSeparator() {
+		if (findSeparator == null) {
+			findSeparator = new JSeparator(SwingConstants.VERTICAL);
+			findSeparator.setPreferredSize(new Dimension(5, 20));
+		}
+		return findSeparator;
+	}
+
+
+	/**
+	 * This method initializes keywordTextField
+	 *
+	 * @return javax.swing.JTextField
+	 */
+	private JTextField getKeywordTextField() {
+		if (keywordTextField == null) {
+			keywordTextField = new JTextField();
+			keywordTextField.addKeyListener(new KeyAdapter() {
+				@Override
+				public void keyTyped(KeyEvent arg0) {
+					if (arg0.getKeyChar() == KeyEvent.VK_ENTER){
+						doSearch();
+					}
+				}
+			});
+		}
+		return keywordTextField;
+	}
+
+	/**
+	 * 讀懃ｴ｢繝ｯ繝ｼ繝峨ｒ蜿門ｾ励☆繧�
+	 * @return
+	 */
+	private String getFindWord(){
+		return getKeywordTextField().getText();
+	}
+
+
+	/**
+	 * This method initializes subjectList
+	 *
+	 * @return javax.swing.JList
+	 */
+	private JList getSubjectList() {
+		if (subjectList == null) {
+			subjectList = new JList();
+			subjectList.addMouseListener(new MouseAdapter() {
+
+				@Override
+				public void mouseClicked(MouseEvent e) {
+
+					Object var = getSubjectList().getSelectedValue();
+
+					String subject = var.toString();
+					if (e.getClickCount() >= 2){
+
+						if (findSubjectTriple(subject)){
+							addHistory(subject);
+						}
+					}
+					if (SwingUtilities.isRightMouseButton(e)){
+						awakePopupIfHtml(var, e.getLocationOnScreen());
+					}
+
+				}
+			});
+
+		}
+		return subjectList;
+	}
+
+	private SparqlResultListener createSparqlResultListener2(){
+		return new SparqlResultListener() {
+
+			@Override
+			public void resultReceived(SparqlResultSet result) {
+				// 邨先棡繧偵∪縺壹�list縺ｫ霑ｽ蜉
+				setProcessing(false);
+				setResults(result);
+			}
+
+			@Override
+			public void uncaughtException(Thread t, Throwable e) {
+				JOptionPane.showMessageDialog(parent, "Execute error:"+e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
+				setProcessing(false);
+
+			}
+		};
+	}
+
+	private void setSubjectList(String obj){
+		listModel = new DefaultListModel();
+		listModel.addElement(obj);
+		getSubjectList().setModel(listModel);
+	}
+
+	private void setSubjectList(List<String> list){
+		subjectHistoryList = list;
+		listModel = new DefaultListModel();
+		for (String item : list){
+			listModel.addElement(item);
+		}
+		getSubjectList().setModel(listModel);
+	}
+
+	/**
+	 * This method initializes subjectScrollPane
+	 *
+	 * @return javax.swing.JScrollPane
+	 */
+	private JScrollPane getSubjectScrollPane() {
+		if (subjectScrollPane == null) {
+			subjectScrollPane = new JScrollPane(getSubjectList());
+		}
+		return subjectScrollPane;
+	}
+
+	/**
+	 * This method initializes centerPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getCenterPanel() {
+		if (centerPanel == null) {
+			centerPanel = new JPanel();
+			centerPanel.setLayout(new BorderLayout());
+			centerPanel.add(getSubjectScrollPane(), BorderLayout.CENTER);
+		}
+		return centerPanel;
+	}
+
+	/**
+	 * This method initializes footerPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getFooterPanel() {
+		if (footerPanel == null) {
+			footerPanel = new JPanel();
+			footerPanel.setLayout(new BorderLayout());
+			footerPanel.add(getResultListScrollPane(), BorderLayout.CENTER);
+		}
+		return footerPanel;
+	}
+
+	/**
+	 * This method initializes resultListScrollPane
+	 *
+	 * @return javax.swing.JScrollPane
+	 */
+	private JScrollPane getResultListScrollPane() {
+		if (resultListScrollPane == null) {
+			resultListScrollPane = new JScrollPane(getResultList());
+		}
+		return resultListScrollPane;
+	}
+
+	/**
+	 * This method initializes resultList
+	 *
+	 * @return javax.swing.JList
+	 */
+	private JTable getResultList() {
+		if (resultList == null) {
+			resultList = new JTable(){
+				/**
+				 *
+				 */
+				private static final long serialVersionUID = 2013472265872397926L;
+
+				public String getToolTipText(MouseEvent e){
+		            // 繧､繝吶Φ繝医°繧峨�繧ｦ繧ｹ菴咲ｽｮ繧貞叙蠕励＠縲√ユ繝ｼ繝悶Ν蜀��繧ｻ繝ｫ繧貞牡繧雁�縺�
+					Object cell = getModel().getValueAt(rowAtPoint(e.getPoint()), columnAtPoint(e.getPoint()));
+		            return cell == null ? "" : StringUtil.makeHtmlString(StringUtil.splitString(cell.toString()));
+		        }
+			};
+			resultList.setDefaultEditor(Object.class, null);
+			resultList.addMouseListener(new MouseAdapter() {
+				@Override
+				public void mouseClicked(MouseEvent e) {
+					int index = resultList.getSelectedRow();
+
+					Object var = (resultList.getValueAt(index, 1));
+					String o = var.toString();
+
+					if (e.getClickCount() >= 2){
+
+						setSubjectList(o);
+
+						if (findSubjectTriple(o)){
+							addHistory(o);
+						}
+					}
+
+					if (SwingUtilities.isRightMouseButton(e)){
+						awakePopupIfHtml(var, e.getLocationOnScreen());
+					}
+				}
+			});
+
+		}
+		return resultList;
+	}
+
+	private void setResults(SparqlResultSet result){
+
+		if (result == null || result.getDefaultResult() == null || result.getDefaultResult().size() == 0){
+			tableModel = new DefaultTableModel();
+			getResultList().setModel(tableModel);
+			return;
+		}
+		List<Map<String, RDFNode>> list = result.getDefaultResult();
+
+		// header繧ｻ繝�ヨ
+		Map<String, RDFNode> columns = list.get(0);
+		List<String> clm = new ArrayList<String>();
+		for (String key : columns.keySet()){
+			clm.add(key);
+		}
+		tableModel = new DefaultTableModel(clm.toArray(new String[]{}), 0);
+
+
+		// 荳ｭ霄ｫ繧ｻ繝�ヨ
+		for (Map<String, RDFNode> r : list){
+			List<Object> row = new ArrayList<Object>();
+			for (String key : clm){
+				RDFNode node = r.get(key);
+				row.add(node);
+			}
+			tableModel.addRow(row.toArray(new Object[]{}));
+		}
+
+		getResultList().setModel(tableModel);
+
+		parent.setResults(result);
+
+	}
+
+	private void setProcessing(boolean processing){
+		this. processing = processing;
+		getSubjectList().setEnabled(!processing);
+		getRunQueryButton().setEnabled(!processing);
+		getResultList().setEnabled(!processing);
+		getKeywordTextField().setEnabled(!processing);
+		getFullMatchRadioButton().setEnabled(!processing);
+		getPartMatchRadioButton().setEnabled(!processing);
+//		getFindAllRadioButton().setEnabled(!processing);
+		getFindSubjectRadioButton().setEnabled(!processing);
+		getFindObjectRadioButton().setEnabled(!processing);
+		getFindLabelObjectRadioButton().setEnabled(!processing);
+
+		updateButtonStates();
+		updateLimitButtonStates();
+
+		parent.setProcessing(processing);
+	}
+
+	private boolean isProcessing(){
+		return this.processing;
+	}
+
+	/**
+	 * This method initializes runQueryButton
+	 *
+	 * @return javax.swing.JButton
+	 */
+	private JButton getRunQueryButton() {
+		if (runQueryButton == null) {
+			runQueryButton = new JButton("Find");
+			runQueryButton.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					doSearch();
+				}
+			});
+		}
+		return runQueryButton;
+	}
+
+	private void doSearch(){
+		if (isProcessing()){
+			return;
+		}
+
+		initHistory();
+		initLimit();
+
+		setResults(null);
+		setProcessing(true);
+
+		sa = createSparqlAccessor();
+
+		// page蛻�崛逕ｨ縺ｫ繝舌ャ繧ｯ繧｢繝��
+		this.word = getFindWord();
+		this.fullMatch = isFullMatch();
+		this.limit = getLimit();
+		this.type = getFindType();
+
+		sa.findSubject(word, fullMatch, limit, (limit != null ? (limit * page) : null), type, getTargetPropertyList(), createSparqlResultListener());
+	}
+
+	private ThreadedSparqlAccessor createSparqlAccessor(){
+		ThreadedSparqlAccessor sa = SparqlAccessorFactory.createSparqlAccessor(EndpointSettingsManager.instance.getSetting(parent.getCurrentEndPoint()), new SparqlQueryListener() {
+			@Override
+			public void sparqlExecuted(String query) {
+				fromDate = new Date();
+				parent.addLogText("----------------");
+				parent.addLogText(query);
+			}
+		});
+		return sa;
+	}
+
+	private SparqlResultListener createSparqlResultListener(){
+		return new SparqlResultListener() {
+
+			@Override
+			public void resultReceived(SparqlResultSet result) {
+
+				hasLimitNext = result.isHasNext();
+
+				Date now = new Date();
+				long time = now.getTime() - fromDate.getTime();
+				parent.addLogText("---------------- result:"+time+" ms");
+				// 邨先棡繧偵∪縺壹�list縺ｫ霑ｽ蜉
+				List<String> resultList = new ArrayList<String>();
+				for (Map<String, RDFNode> item : result.getDefaultResult()){
+					RDFNode node = item.get("s");
+					resultList.add(node.toString());
+				}
+
+				setSubjectList(resultList);
+				setProcessing(false);
+			}
+
+			@Override
+			public void uncaughtException(Thread t, Throwable e) {
+				JOptionPane.showMessageDialog(parent, "Execute error:"+e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
+				setProcessing(false);
+
+			}
+		};
+	}
+
+	/**
+	 * This method initializes headerPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getHeaderPanel() {
+		if (headerPanel == null) {
+			headerPanel = new JPanel();
+			headerPanel.setLayout(new BorderLayout());
+			headerPanel.add(getKeywordPanel(), BorderLayout.CENTER);
+			headerPanel.add(getOptionPanel(), BorderLayout.SOUTH);
+			headerPanel.add(getMovePanel(), BorderLayout.WEST);
+		}
+		return headerPanel;
+	}
+
+	/**
+	 * This method initializes limitPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getLimitPanel() {
+		if (limitPanel == null) {
+			limitLabel = new JLabel();
+			limitLabel.setText(" LIMIT  ");
+			limitLabel.setEnabled(false);
+			limitPanel = new JPanel();
+			limitPanel.setLayout(new BorderLayout());
+			limitPanel.add(getLimitEnableCheckBox(), BorderLayout.WEST);
+			limitPanel.add(limitLabel, BorderLayout.CENTER);
+			limitPanel.add(getLimitMainPanel(), BorderLayout.EAST);
+		}
+		return limitPanel;
+	}
+
+	private Integer getLimit(){
+		try {
+			if (getLimitComboBox().isEnabled()){
+				return Integer.parseInt((String)getLimitComboBox().getSelectedItem());
+			}
+		} catch(Exception e){}
+		return null;
+	}
+
+	/**
+	 * This method initializes limitEnableCheckBox
+	 *
+	 * @return javax.swing.JCheckBox
+	 */
+	private JCheckBox getLimitEnableCheckBox() {
+		if (limitEnableCheckBox == null) {
+			limitEnableCheckBox = new JCheckBox();
+			limitEnableCheckBox.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					boolean enabled = getLimitEnableCheckBox().isSelected();
+					getLimitComboBox().setEnabled(enabled);
+					limitLabel.setEnabled(enabled);
+					updateLimitButtonStates();
+				}
+			});
+		}
+		return limitEnableCheckBox;
+	}
+
+	/**
+	 * This method initializes limitComboBox
+	 *
+	 * @return javax.swing.JComboBox
+	 */
+	private JComboBox getLimitComboBox() {
+		if (limitComboBox == null) {
+			String[] limits = {"100","250","500","1000"};
+			limitComboBox = new JComboBox(limits);
+			limitComboBox.setEnabled(false);
+		}
+		return limitComboBox;
+	}
+
+	/**
+	 * This method initializes findSubjectRadioButton
+	 *
+	 * @return javax.swing.JRadioButton
+	 */
+	private JRadioButton getFindSubjectRadioButton() {
+		if (findSubjectRadioButton == null) {
+			findSubjectRadioButton = new JRadioButton("Find Subject");
+		}
+		return findSubjectRadioButton;
+	}
+
+	/**
+	 * This method initializes findObjectRadioButton
+	 *
+	 * @return javax.swing.JRadioButton
+	 */
+	private JRadioButton getFindObjectRadioButton() {
+		if (findObjectRadioButton == null) {
+			findObjectRadioButton = new JRadioButton("Find All Object");
+		}
+		return findObjectRadioButton;
+	}
+
+	/**
+	 * This method initializes findAllRadioButton
+	 *
+	 * @return javax.swing.JRadioButton
+	 */
+	private JRadioButton getFindAllRadioButton() {
+		if (findAllRadioButton == null) {
+			findAllRadioButton = new JRadioButton("Find All");
+			findAllRadioButton.setEnabled(false);
+		}
+		return findAllRadioButton;
+	}
+
+	/**
+	 * This method initializes findLabelObjectRadioButton
+	 *
+	 * @return javax.swing.JRadioButton
+	 */
+	private JRadioButton getFindLabelObjectRadioButton() {
+		if (findLabelObjectRadioButton == null) {
+			findLabelObjectRadioButton = new JRadioButton("Find Specific Object");
+			findLabelObjectRadioButton.addMouseListener(new MouseAdapter() {
+				@Override
+				public void mouseClicked(MouseEvent e) {
+					awakePropertyListPopup(e.getLocationOnScreen());
+				}
+			});
+		}
+		return findLabelObjectRadioButton;
+	}
+
+	/**
+	 * This method initializes movePanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getMovePanel() {
+		if (movePanel == null) {
+			movePanel = new JPanel();
+			movePanel.setLayout(new BoxLayout(movePanel, BoxLayout.X_AXIS));
+			movePanel.add(getPrevButton(), null);
+			movePanel.add(getNextButton(), null);
+		}
+		return movePanel;
+	}
+
+	/**
+	 * This method initializes prevButton
+	 *
+	 * @return javax.swing.JButton
+	 */
+	private JButton getPrevButton() {
+		if (prevButton == null) {
+			prevButton = new JButton("竊�);
+			prevButton.setMargin(new Insets(0, 10, 0, 10));
+			prevButton.setEnabled(false);
+			prevButton.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					String s = getPrev();
+					if (s != null){
+						if (historyIndex == 0){
+							setSubjectList(subjectHistoryList);
+						} else {
+							setSubjectList(s);
+						}
+						findSubjectTriple(s);
+					}
+				}
+			});
+		}
+		return prevButton;
+	}
+
+	/**
+	 * This method initializes nextButton
+	 *
+	 * @return javax.swing.JButton
+	 */
+	private JButton getNextButton() {
+		if (nextButton == null) {
+			nextButton = new JButton("竊�);
+			nextButton.setMargin(new Insets(0, 10, 0, 10));
+			nextButton.setEnabled(false);
+			nextButton.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					String s = getNext();
+					if (s != null){
+						setSubjectList(s);
+						findSubjectTriple(s);
+					}
+				}
+			});
+		}
+		return nextButton;
+	}
+
+	private boolean findSubjectTriple(String s){
+		if (isProcessing()){
+			return false;
+		}
+		setProcessing(true);
+		// table繧ｯ繝ｪ繧｢
+		setResults(null);
+		sa.findTripleFromSubject(s, createSparqlResultListener2());
+		return true;
+	}
+
+	private boolean awakePopupIfHtml(Object o, Point p){
+
+		if (o == null || o.toString().trim().isEmpty()){
+			return false;
+		}
+		String s = o.toString();
+
+		if (o instanceof RDFNode){
+			if (((RDFNode)o).isLiteral()){
+				s = ((RDFNode)o).asLiteral().getString();
+			}
+		}
+		JPopupMenu popup = new JPopupMenu(s);
+
+		if (s.startsWith("http://") || s.startsWith("https://")){
+			JMenuItem menu = new JMenuItem("Show on Web Browser");
+			menu.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					JMenuItem menu = (JMenuItem)e.getSource();
+					JPopupMenu parent = (JPopupMenu)menu.getParent();
+					try {
+						awakeHtml(parent.getLabel());
+					} catch (URISyntaxException ex) {
+						ex.printStackTrace();
+					} catch (IOException ex) {
+						ex.printStackTrace();
+					}
+				}
+			});
+			popup.add(menu);
+		} else {
+			JMenuItem menu1 = new JMenuItem("Search By Google");
+			menu1.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					JMenuItem menu = (JMenuItem)e.getSource();
+					JPopupMenu parent = (JPopupMenu)menu.getParent();
+					try {
+						awakeHtml("https://www.google.co.jp/search?q=" + URLEncoder.encode(parent.getLabel(), "UTF-8"));
+					} catch (URISyntaxException ex) {
+						ex.printStackTrace();
+					} catch (IOException ex) {
+						ex.printStackTrace();
+					}
+				}
+			});
+			popup.add(menu1);
+			JMenuItem menu2 = new JMenuItem("Search By GoogleMaps");
+			menu2.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					JMenuItem menu = (JMenuItem)e.getSource();
+					JPopupMenu parent = (JPopupMenu)menu.getParent();
+					try {
+						awakeHtml("https://maps.google.com/maps?q=" + URLEncoder.encode(parent.getLabel(), "UTF-8"));
+					} catch (URISyntaxException ex) {
+						ex.printStackTrace();
+					} catch (IOException ex) {
+						ex.printStackTrace();
+					}
+				}
+			});
+			popup.add(menu2);
+		}
+
+		popup.setLocation(p);
+
+		SwingUtilities.convertPointFromScreen(p, this.parent);
+
+		popup.show(this.parent, p.x, p.y);
+
+		return false;
+	}
+
+	private void awakeHtml(String url) throws IOException, URISyntaxException{
+		Desktop desktop = Desktop.getDesktop();
+		URI uri = new URI(url);
+		desktop.browse(uri);
+	}
+
+
+	private PropertyDialog propDialog;
+
+	private List<EditableListItem> targetObjectTypes;
+
+	/**
+	 * proeprty驕ｸ謚樒畑POPUP陦ｨ遉ｺ
+	 * @param p
+	 * @return
+	 */
+	private boolean awakePropertyListPopup(Point p){
+		DefaultListModel model = new DefaultListModel();
+		for (EditableListItem tp : getTargetPropertyListItem()){
+			model.addElement(tp);
+		}
+
+		EditableList properties = new EditableList(model);
+		propDialog = new PropertyDialog(this.parent, properties);
+		properties.getTextField().addKeyListener(new KeyAdapter() {
+
+			@Override
+			public void keyReleased(KeyEvent e) {
+				List<String> propList = getPropertyList(parent.getCurrentEndPoint());
+				String word = ((JTextField)e.getSource()).getText();
+
+				if (word.length() > 2){
+					List<String> candidates = StringUtil.getPartHitString(propList, word);
+
+					if (candidates.size() < 20){
+						awakeCandidateList(candidates, propDialog.getList().getTextField().getLocationOnScreen());
+					}
+				} else {
+					if (popup != null){
+						popup.setVisible(false);
+						popup = null;
+					}
+				}
+
+			}
+		});		properties.getModel().addListDataListener(new ListDataListener() {
+
+			@Override
+			public void intervalRemoved(ListDataEvent e) {
+				propDialog.pack();
+			}
+
+			@Override
+			public void intervalAdded(ListDataEvent e) {
+				propDialog.pack();
+			}
+
+			@Override
+			public void contentsChanged(ListDataEvent e) {
+			}
+		});
+		properties.getTextField().addActionListener(new ActionListener() {
+
+			@Override
+			public void actionPerformed(ActionEvent e) {
+				if (propDialog.getList().getTextField().getText().isEmpty()){
+					//
+					propDialog.setOK(true);
+					propDialog.setVisible(false);
+				}
+			}
+		});
+		propDialog.setLocation(p);
+		propDialog.pack();
+		propDialog.setModalityType(ModalityType.DOCUMENT_MODAL);
+		propDialog.setVisible(true);
+
+		if (popup != null){
+			popup.setVisible(false);
+		}
+
+		if (!propDialog.isOK()){
+			return false;
+		}
+		model = (DefaultListModel)properties.getModel();
+
+		getTargetPropertyListItem().clear();
+		for (int i=0; i<model.getSize(); i++){
+			Object item = model.getElementAt(i);
+			if (item instanceof EditableListItem){
+				getTargetPropertyListItem().add((EditableListItem)item);
+			}
+		}
+
+		return true;
+	}
+
+	private Map<String,List<String>> propertyList = new HashMap<String, List<String>>();
+	private List<String> processingPropertyList = new ArrayList<String>();  //  @jve:decl-index=0:
+
+	private List<String> getPropertyList(String endpoint){
+		List<String> ret = propertyList.get(endpoint);
+		if (ret == null && !processingPropertyList.contains(endpoint)){
+			try {
+				ThreadedSparqlAccessor tsa = createSparqlAccessor();
+				if (tsa != null){
+					processingPropertyList.add(endpoint);
+					tsa.findPropertyList(new SparqlResultListener() {
+
+						@Override
+						public void uncaughtException(Thread t, Throwable e) {
+							JOptionPane.showMessageDialog(parent, "Execute error:"+e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
+							setProcessing(false);
+						}
+
+						@Override
+						public void resultReceived(SparqlResultSet resultSet) {
+							String endpoint = parent.getCurrentEndPoint();
+							List<String> ret = propertyList.get(endpoint);
+							if (ret == null){
+								ret = new ArrayList<String>();
+								propertyList.put(endpoint, ret);
+							}
+							List<Map<String, RDFNode>> results = resultSet.getDefaultResult();
+							for (Map<String, RDFNode> result : results){
+								for (String nodeStr : result.keySet()){
+									if (nodeStr != null && !ret.contains(nodeStr)){
+										ret.add(nodeStr);
+									}
+								}
+							}
+							propertyList.put(endpoint, ret);
+							processingPropertyList.remove(endpoint);
+						}
+					});
+				}
+			} catch (Exception e){
+				// 繧ｨ繝ｩ繝ｼ縺ｯ闖ｯ鮗励↓繧ｹ繝ｫ繝ｼ
+			}
+		}
+
+		return propertyList.get(endpoint);
+	}
+
+	private List<EditableListItem> getTargetPropertyListItem(){
+		if (targetObjectTypes == null){
+			targetObjectTypes = new ArrayList<EditableListItem>();
+			targetObjectTypes.add(new EditableListItem(DEFAULT_PROPERTY_TYPE, false));
+		}
+		return targetObjectTypes;
+	}
+
+	JPopupMenu popup;
+
+	private void awakeCandidateList(List<String> candidates, Point p){
+		if (popup != null){
+			popup.setVisible(false);
+		}
+		popup = new JPopupMenu();
+
+		for (String candidate : candidates){
+			JMenuItem item = new JMenuItem(candidate);
+			item.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					propDialog.getList().getTextField().setText(((JMenuItem)e.getSource()).getText());
+					popup.setVisible(false);
+					popup = null;
+				}
+			});
+			popup.add(item);
+		}
+		popup.setLocation(p.x + 400, p.y + 20);
+		popup.setVisible(true);
+	}
+
+
+	private void initHistory(){
+		this.history = new ArrayList<String>();
+		this.historyIndex = -1;
+		updateButtonStates();
+	}
+
+	private void addHistory(String item){
+
+		if (this.historyIndex >= 0 && this.historyIndex < (this.history.size() - 1)){
+			for (int i=this.history.size()-1; i > this.historyIndex; i--){
+				this.history.remove(i);
+			}
+		}
+		this.history.add(item);
+		this.historyIndex++;
+		updateButtonStates();
+		}
+
+	private String getPrev(){
+		if (hasPrev()){
+			--historyIndex;
+			updateButtonStates();
+			return this.history.get(historyIndex);
+		}
+		return null;
+	}
+
+	private String getNext(){
+		if (hasNext()){
+			++historyIndex;
+			updateButtonStates();
+			return this.history.get(historyIndex);
+		}
+		return null;
+	}
+
+	private void updateButtonStates(){
+		if (!this.processing){
+			this.getPrevButton().setEnabled(hasPrev());
+			this.getNextButton().setEnabled(hasNext());
+		} else {
+			this.getPrevButton().setEnabled(false);
+			this.getNextButton().setEnabled(false);
+		}
+	}
+
+	private boolean hasPrev(){
+		if (history.size() != 0 && historyIndex > 0){
+			return true;
+		}
+		return false;
+	}
+
+	private boolean hasNext(){
+		if ((historyIndex + 1) < history.size()){
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * This method initializes limitMainPanel
+	 *
+	 * @return javax.swing.JPanel
+	 */
+	private JPanel getLimitMainPanel() {
+		if (limitMainPanel == null) {
+			limitMainPanel = new JPanel();
+			limitMainPanel.setLayout(new BorderLayout());
+			limitMainPanel.add(getLimitComboBox(), BorderLayout.WEST);
+			limitMainPanel.add(getLimitPrevButton(), BorderLayout.CENTER);
+			limitMainPanel.add(getLimitNextButton(), BorderLayout.EAST);
+		}
+		return limitMainPanel;
+	}
+
+	/**
+	 * This method initializes limitPrevButton
+	 *
+	 * @return javax.swing.JButton
+	 */
+	private JButton getLimitPrevButton() {
+		if (limitPrevButton == null) {
+			limitPrevButton = new JButton("竊�);
+			limitPrevButton.setMargin(new Insets(0, 10, 0, 10));
+			limitPrevButton.setEnabled(false);
+			limitPrevButton.addActionListener(new ActionListener() {
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					setProcessing(true);
+					sa.findSubject(word, fullMatch, limit, (limit * (--page)), type, getTargetPropertyList(), createSparqlResultListener());
+				}
+			});
+		}
+		return limitPrevButton;
+	}
+
+	/**
+	 * This method initializes limitNextButton
+	 *
+	 * @return javax.swing.JButton
+	 */
+	private JButton getLimitNextButton() {
+		if (limitNextButton == null) {
+			limitNextButton = new JButton("竊�);
+			limitNextButton.setMargin(new Insets(0, 10, 0, 10));
+			limitNextButton.setEnabled(false);
+			limitNextButton.addActionListener(new ActionListener() {
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					setProcessing(true);
+
+					sa.findSubject(word, fullMatch, limit, (limit * (++page)), type, getTargetPropertyList(), createSparqlResultListener());
+				}
+			});
+		}
+		return limitNextButton;
+	}
+
+	private void initLimit(){
+		limit = this.getLimit();
+		page = 0;
+	}
+
+	private void updateLimitButtonStates(){
+		if (!this.processing && this.getLimitEnableCheckBox().isSelected()){
+			this.getLimitPrevButton().setEnabled(page != 0);
+			this.getLimitNextButton().setEnabled(hasLimitNext);
+		} else {
+			this.getLimitPrevButton().setEnabled(false);
+			this.getLimitNextButton().setEnabled(false);
+		}
+	}
+
+	private String[] getTargetPropertyList(){
+		List<String> ret = new ArrayList<String>();
+		if (targetObjectTypes != null && targetObjectTypes.size() > 0){
+			for (EditableListItem item : targetObjectTypes){
+				ret.add(item.text);
+			}
+		} else {
+			ret.add(DEFAULT_PROPERTY_TYPE);
+		}
+		return ret.toArray(new String[0]);
+	}
+
+	class PropertyDialog extends JDialog {
+		/**
+		 *
+		 */
+		private static final long serialVersionUID = -638100288439239858L;
+		private EditableList list;
+		private boolean isOK;
+
+		public PropertyDialog(Window parent, EditableList list){
+			super(parent);
+
+//			this.setUndecorated(true);
+			this.setLayout(new BorderLayout());
+			this.list = list;
+			this.add(list, BorderLayout.CENTER);
+		}
+
+		public EditableList getList(){
+			return this.list;
+		}
+
+		public void setOK(boolean value){
+			this.isOK = value;
+		}
+
+		public boolean isOK(){
+			return this.isOK;
+		}
+	}
+
+
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/edit/AllegroEditor.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/edit/AllegroEditor.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/edit/AllegroEditor.java (revision 9)
@@ -0,0 +1,277 @@
+package jp.ac.osaka_u.sanken.sparql.edit;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.openrdf.repository.RepositoryConnection;
+
+import com.franz.agraph.jena.AGGraph;
+import com.franz.agraph.jena.AGGraphMaker;
+import com.franz.agraph.jena.AGModel;
+import com.franz.agraph.repository.AGCatalog;
+import com.franz.agraph.repository.AGRepository;
+import com.franz.agraph.repository.AGRepositoryConnection;
+import com.franz.agraph.repository.AGServer;
+import com.hp.hpl.jena.rdf.model.Model;
+import com.hp.hpl.jena.rdf.model.Property;
+import com.hp.hpl.jena.rdf.model.RDFNode;
+import com.hp.hpl.jena.rdf.model.Resource;
+import com.hp.hpl.jena.rdf.model.impl.PropertyImpl;
+
+import jp.ac.osaka_u.sanken.sparql.AllegroAccessor;
+
+/**
+ * SparqlEndpoint縺ｨ縺励※蜈ｬ髢九＆繧後※縺�ｋAllegroGraph縺ｮRepository縺ｫ蟇ｾ縺励※邱ｨ髮�ｒ陦後≧縺溘ａ縺ｮ繧ｯ繝ｩ繧ｹ
+ * @author kato
+ *
+ */
+public class AllegroEditor {
+	
+	private AllegroAccessor accessor;
+	
+	private String user;
+	
+	private String pass;
+	
+	private String url;
+	
+	private String repository;
+	
+	
+	public AllegroEditor(AllegroAccessor sa, String user, String pass) throws Exception{
+		this.accessor = sa;
+		
+		this.user = user;
+		this.pass = pass;
+		
+		
+		init();
+	}
+
+	public AllegroEditor(AllegroAccessor sa, String url, String repo, String user, String pass) throws Exception{
+		this.accessor = sa;
+
+		this.url = url;
+		this.repository = repo;
+
+		this.user = user;
+		this.pass = pass;
+
+		try {
+			getModel();
+		} catch(Exception e){
+			throw new Exception("AllegroGraph縺ｮrepository險ｭ螳壹′荳肴ｭ｣縺ｧ縺�, e);
+		}
+	}
+
+	
+	private void init() throws Exception {
+		String endpoint = this.accessor.getSetting().getEndpoint();
+		
+		int index = endpoint.indexOf("/endpoint/");
+		if (index >= 0){
+			this.url = endpoint.substring(0, index);
+			this.repository = endpoint.substring(index + "/endpoint/".length());
+			System.out.println("url:"+url);
+			System.out.println("repo:"+repository);
+		} else {
+			throw new Exception("AllegroGraph繧ｵ繝ｼ繝舌〒縺ｯ縺ゅｊ縺ｾ縺帙ｓ");
+		}
+	}
+	
+	public AllegroAccessor getAccessor(){
+		return this.accessor;
+	}
+	
+	/**
+	 * 遐ｴ譽�凾縺ｫclose縺吶ｋ
+	 */
+	public void close(){
+		closeAll();
+	}
+	
+	public boolean contains(RDFNode s, RDFNode p, RDFNode o) throws Exception{
+		Model model = getModel();
+		return contains(s, p, o, model);
+	}
+
+	
+	private boolean isTriple(RDFNode s, RDFNode p, RDFNode o){
+		if (!s.isResource()){
+			return false;
+		}
+		if (!p.isResource()){
+			return false;
+		}
+		return true;
+	}
+
+	private boolean contains(RDFNode s, RDFNode p, RDFNode o, Model model){
+		if (!isTriple(s, p, o)){
+			return false;
+		}
+		Resource ss = s.asResource();
+		Property pp = new PropertyImpl(p.asResource().getURI());
+		
+		return model.contains(ss, pp, o);
+	}
+
+	
+	
+	public boolean add(RDFNode s, RDFNode p, String o) throws Exception{
+		Model model = getModel();
+		RDFNode oo = model.createLiteral(o);
+		return add(s, p, oo, model);
+	}
+
+	public boolean add(RDFNode s, RDFNode p, RDFNode o) throws Exception{
+		Model model = getModel();
+		return add(s, p, o, model);
+	}
+
+	private boolean add(RDFNode s, RDFNode p, RDFNode o, Model model){
+		if (!isTriple(s, p, o)){
+			return false;
+		}
+
+		Resource ss = s.asResource();
+		Property pp = new PropertyImpl(p.asResource().getURI());
+
+		if (!model.contains(ss, pp, o)){
+			model.add(ss, pp, o);
+			return true;
+		}
+		return false;
+	}
+
+	public boolean delete(RDFNode s, RDFNode p, RDFNode o) throws Exception{
+		Model model = getModel();
+		return delete(s, p, o, model);
+	}
+
+	private boolean delete(RDFNode s, RDFNode p, RDFNode o, Model model){
+		if (!isTriple(s, p, o)){
+			return false;
+		}
+
+		Resource ss = s.asResource();
+		Property pp = new PropertyImpl(p.asResource().getURI());
+
+		if (model.contains(ss, pp, o)){
+			model.remove(ss, pp, o);
+			return true;
+		}
+		return false;
+	}
+
+	
+	public boolean edit(RDFNode s, RDFNode p, RDFNode o, RDFNode s2, RDFNode p2, RDFNode o2) throws Exception{
+		Model model = getModel();
+		return edit(s, p, o, s2, p2, o2, model);
+	}
+
+	private boolean edit(RDFNode s, RDFNode p, RDFNode o, RDFNode s2, RDFNode p2, RDFNode o2, Model model){
+		if (!isTriple(s, p, o) || !isTriple(s2, p2, o2)){
+			return false;
+		}
+
+		Resource ss = s.asResource();
+		Property pp = new PropertyImpl(p.asResource().getURI());
+		Resource ss2 = s2.asResource();
+		Property pp2 = new PropertyImpl(p2.asResource().getURI());
+		if (model.contains(ss, pp, o)){
+			model.remove(ss, pp, o);
+			model.add(ss2, pp2, o2);
+			return true;
+		}
+		return false;
+	}
+	
+	
+	
+	public Model getModel() throws Exception {
+		AGServer server = new AGServer(this.url, this.user, this.pass);
+		AGCatalog catalog = server.getCatalog("/");
+		AGRepository myRepository = catalog.openRepository(this.repository);
+
+		AGRepositoryConnection conn = myRepository.getConnection();
+		closeBeforeExit(conn);
+		AGGraphMaker maker = new AGGraphMaker(conn);
+        
+		AGGraph graph = maker.getGraph();
+		AGModel model = new AGModel(graph);
+		
+		closeBeforeExit(myRepository, model);
+
+		return model;
+
+	}
+	
+	private void closeBeforeExit(AGRepository rep, AGModel model) {
+		toCloseRep.add(rep);
+		toCloseModel.add(model);
+	}
+	
+	
+	protected void closeAll() {
+		while (toCloseRep.isEmpty() == false) {
+			AGRepository conn = toCloseRep.get(0);
+			close(conn);
+			while (toCloseRep.remove(conn)) {
+			}
+		}
+
+		while (toCloseModel.isEmpty() == false) {
+			AGModel conn = toCloseModel.get(0);
+			close(conn);
+			while (toCloseModel.remove(conn)) {
+			}
+		}
+
+		while (toClose.isEmpty() == false) {
+			RepositoryConnection conn = toClose.get(0);
+			close(conn);
+			while (toClose.remove(conn)) {
+			}
+		}
+
+	}
+
+	
+    static void close(RepositoryConnection conn) {
+        try {
+            conn.close();
+        } catch (Exception e) {
+            System.err.println("Error closing repository connection: " + e);
+            e.printStackTrace();
+        }
+    }
+    
+	void close(AGRepository conn) {
+		try {
+			conn.shutDown();
+		} catch (Exception e) {
+			System.err.println("Error closing repository repository: " + e);
+			e.printStackTrace();
+		}
+	}
+
+	void close(AGModel conn) {
+		try {
+			conn.close();
+		} catch (Exception e) {
+			System.err.println("Error closing repository model: " + e);
+			e.printStackTrace();
+		}
+	}
+
+	
+    private static List<RepositoryConnection> toClose = new ArrayList<RepositoryConnection>();
+	private static List<AGRepository> toCloseRep = new ArrayList<AGRepository>();
+	private static List<AGModel> toCloseModel = new ArrayList<AGModel>();
+
+    private static void closeBeforeExit(RepositoryConnection conn) {
+        toClose.add(conn);
+    }
+    
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/SparqlResultListener.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/SparqlResultListener.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/SparqlResultListener.java (revision 9)
@@ -0,0 +1,12 @@
+package jp.ac.osaka_u.sanken.sparql;
+
+import java.lang.Thread.UncaughtExceptionHandler;
+
+/**
+ * Sparql繧堤峡遶亀hread縺ｧ螳溯｡後☆繧矩圀縲∫ｵ先棡繧貞叙蠕励☆繧九◆繧√�Listener
+ * @author kato
+ *
+ */
+public interface SparqlResultListener extends UncaughtExceptionHandler{
+	public void resultReceived(SparqlResultSet result);
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/AllegroAccessor.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/AllegroAccessor.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/AllegroAccessor.java (revision 9)
@@ -0,0 +1,50 @@
+package jp.ac.osaka_u.sanken.sparql;
+
+
+import jp.ac.osaka_u.sanken.sparql.edit.AllegroEditor;
+
+import com.franz.agraph.jena.AGModel;
+import com.franz.agraph.jena.AGQuery;
+import com.franz.agraph.jena.AGQueryExecutionFactory;
+import com.franz.agraph.jena.AGQueryFactory;
+import com.hp.hpl.jena.query.QueryExecution;
+/**
+ * AllegroAccessor繧｢繧ｯ繧ｻ繝�し
+ * @author kato
+ *
+ */
+public class AllegroAccessor extends PlainSparqlAccessor {
+	public AllegroAccessor(EndpointSettings endpoint, SparqlQueryListener queryListener){
+		super(endpoint, queryListener);
+}
+
+	public AllegroAccessor(EndpointSettings endpoint){
+		this(endpoint, null);
+	}
+	
+	/**
+	 * query繧貞娼縺�※邨先棡繧定ｿ斐☆
+	 * @param query
+	 * @return
+	 */
+	protected QueryExecution makeQuery(String queryString){
+		QueryExecution qe = null;
+		if (this.getSetting().isEditable()){
+			System.out.println("query:["+queryString+"]");
+			// TODO 譛ｬ譚･縺ｪ繧影ndpoint縺ｮ螳溯｣�↓蠢懊§縺ｦfactory縺九ｉ蝗ｺ譛峨�Accessor繧貞叙蠕励☆繧句ｽ｢縺ｫ縺吶∋縺阪□縺後�
+			// 迴ｾ迥ｶ縺ｯ縲憩ditable=true縲阪�蝣ｴ蜷医�AllegroGraph縺ｫ豎ｺ繧∵遠縺｡縺励※縺�ｋ縲�
+			AllegroEditor ae;
+			try {
+				ae = new AllegroEditor(this, this.getSetting().getRepositoryURL(), getSetting().getRepository(), getSetting().getUser(), getSetting().getPass());
+				AGQuery sparql = AGQueryFactory.create(queryString);
+				qe = AGQueryExecutionFactory.create(sparql, (AGModel)ae.getModel());
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		} else {
+			qe = super.makeQuery(queryString);
+		}
+
+		return qe;
+	}
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/PlainSparqlAccessor.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/PlainSparqlAccessor.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/PlainSparqlAccessor.java (revision 9)
@@ -0,0 +1,494 @@
+package jp.ac.osaka_u.sanken.sparql;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.hp.hpl.jena.query.Query;
+import com.hp.hpl.jena.query.QueryExecution;
+import com.hp.hpl.jena.query.QueryExecutionFactory;
+import com.hp.hpl.jena.query.QueryFactory;
+import com.hp.hpl.jena.query.QuerySolution;
+import com.hp.hpl.jena.query.ResultSet;
+import com.hp.hpl.jena.query.ResultSetFactory;
+import com.hp.hpl.jena.rdf.model.RDFNode;
+import com.hp.hpl.jena.rdf.model.impl.ResourceImpl;
+/**
+ * Sparql縺ｨ縺ｮ繝��繧ｿ
+ * @author kato
+ *
+ */
+public class PlainSparqlAccessor implements ThreadedSparqlAccessor {
+
+	private EndpointSettings setting;
+
+	private SparqlQueryListener queryListener;
+
+	public PlainSparqlAccessor(EndpointSettings endpoint, SparqlQueryListener queryListener){
+		this.queryListener = queryListener;
+
+		this.setting = endpoint;
+	}
+
+	public PlainSparqlAccessor(EndpointSettings endpoint){
+		this(endpoint, null);
+	}
+
+
+	public EndpointSettings getSetting(){
+		return this.setting;
+	}
+	/**
+	 * query繧貞娼縺�※邨先棡繧定ｿ斐☆
+	 * @param query
+	 * @return
+	 */
+	protected QueryExecution makeQuery(String queryString){
+System.out.println("query:["+queryString+"]");
+		Query query = QueryFactory.create(queryString);
+		QueryExecution qe = QueryExecutionFactory.sparqlService(getSetting().getEndpoint(), query);
+
+		return qe;
+	}
+
+	/**
+	 * Thread繧定ｵｷ蜍輔＠縺ｦquery螳溯｡後ｒ陦後≧縲らｵ先棡縺ｯlistener縺ｫ霑斐ｋ縲�
+	 * @param queryString	query
+	 * @param resultListener		邨先棡繧貞女縺大叙繧詰istener
+	 */
+	public boolean executeQuery(String queryString, SparqlResultListener resultListener){
+
+		Thread thread = new QueryThread(queryString, resultListener){
+			public void run(){
+				try {
+					getSparqlResultListener().resultReceived(new SparqlResultSet(executeQuery(getQueryString())));
+				} catch (Exception e) {
+					throw new RuntimeException(e);
+				}
+			}
+		};
+		thread.setUncaughtExceptionHandler(resultListener);
+		thread.start();
+		return true;
+	}
+
+
+	/**
+	 * query螳溯｡後ｒ陦後≧縲らｵ先棡縺ｯ謌ｻ繧雁､縺ｨ縺励※霑斐ｋ縲�
+	 * @param queryString
+	 * @return
+	 * @throws Exception
+	 */
+	public List<Map<String, RDFNode>> executeQuery(String queryString) throws Exception{
+
+		List<Map<String, RDFNode>> ret = new ArrayList<Map<String, RDFNode>>();
+		QueryExecution qe = makeQuery(queryString);
+
+		if (qe == null){
+			throw new Exception("Can't connect to endpoint");
+		}
+
+		try {
+//			System.out.println("query:"+queryString);
+			if (this.queryListener != null){
+				queryListener.sparqlExecuted(queryString);
+			}
+			ResultSet results = null;
+			try {
+				if (!setting.isUseCustomParam()){
+					results = qe.execSelect();
+				} else {
+					results = customQuery(queryString);
+				}
+				List<String> keys = results.getResultVars();
+				while(results.hasNext()){
+					QuerySolution result = results.next();
+					HashMap<String, RDFNode> map = new HashMap<String, RDFNode>();
+					for (String key : keys){
+						RDFNode node = result.get(key);
+						map.put(key, node);
+					}
+					ret.add(map);
+				}
+			} catch(Exception e){
+				e.printStackTrace();
+//				results = customQuery(queryString);
+			}
+		} catch(Exception e){
+			e.printStackTrace();
+			throw e;
+		} finally {
+			qe.close();
+		}
+
+		return ret;
+	}
+
+	private ResultSet customQuery(String query) throws Exception {
+
+		URL url = new URL(this.setting.getEndpoint() + "?" +setting.getQueryKey() + "=" + URLEncoder.encode(query, setting.getEncoding()) + "&" + setting.getOption());//POST縺吶ｋ繝��繧ｿ
+		HttpURLConnection conn = (HttpURLConnection)url.openConnection();
+		conn.setRequestProperty("Accept-Language", "ja");// 繝倥ャ繝繧定ｨｭ螳�
+		conn.setRequestProperty("Referer", setting.getEndpoint());// 繝倥ャ繝繧定ｨｭ螳�
+
+		int resultType = setting.getResultType();
+		ResultSet ret = null;
+
+		if (resultType == EndpointSettings.RESULT_TYPE_JSON){
+			ret = ResultSetFactory.fromJSON(conn.getInputStream());
+		} else if (resultType == EndpointSettings.RESULT_TYPE_XML){
+			ret = ResultSetFactory.fromXML(conn.getInputStream());
+		} else if (resultType == EndpointSettings.RESULT_TYPE_SSE){
+			ret = ResultSetFactory.fromSSE(conn.getInputStream());
+		} else if (resultType == EndpointSettings.RESULT_TYPE_TSV){
+			ret = ResultSetFactory.fromTSV(conn.getInputStream());
+		}
+		conn.disconnect();
+
+		return ret;
+	}
+
+
+	/**
+	 * word譁�ｭ怜�繧貞性繧subject繧貞叙蠕励＠縺ｦ霑斐☆
+	 * @param word
+	 * @param fullMatch	螳悟�荳閾ｴ讀懃ｴ｢縺�
+	 * @param limit		讀懃ｴ｢譛螟ｧ謨ｰ
+	 * @param offset	讀懃ｴ｢繧ｪ繝輔そ繝�ヨ
+	 * @param type	讀懃ｴ｢蟇ｾ雎｡遞ｮ蛻･
+	 * @return
+	 * @throws Exception
+	 */
+	public SparqlResultSet findSubject(String word, boolean fullMatch, Integer limit, Integer offset, int type, String[] propList) throws Exception{
+		String query;
+		word = word.replace(" ", "%20");
+
+		if (!fullMatch){
+			if (type == PlainSparqlAccessor.FIND_TARGET_SUBJECT){
+				query =
+					"select distinct ?s where {\n" +
+					"?s <http://www.w3.org/2000/01/rdf-schema#label> ?o \n" +
+					"FILTER(regex(str(?s), \""+word+"\", \"m\"))\n" +
+					"}";
+			} else if (type == PlainSparqlAccessor.FIND_TARGET_OBJECT){
+				query =
+					"select distinct ?s where {\n" +
+					"?s ?p ?o \n" +
+					"FILTER(regex(str(?o), \""+word+"\", \"m\"))\n" +
+					"}";
+			} else if (type == PlainSparqlAccessor.FIND_TARGET_SPECIFIC_OBJECT){
+				query =
+					"select distinct ?s where {\n";
+				query += getPropertySparql(propList);
+				query += "FILTER(regex(str(?o), \""+word+"\", \"m\"))\n" +
+					"}";
+			} else {
+				// TODO
+				query =
+					"select distinct ?s where {\n";
+				query += getPropertySparql(propList);
+				query += "FILTER(regex(str(?o), \""+word+"\", \"m\"))\n" +
+					"}";
+			}
+		} else {
+			if (type == PlainSparqlAccessor.FIND_TARGET_OBJECT){
+				query =
+					"select distinct ?s where \n{" +
+					"{?s ?p \""+word+"\"} UNION \n" +
+					"{?s ?p \""+word+"\"@en} UNION \n" +
+					"{?s ?p \""+word+"\"@ja} ";
+				String[] namespaces = setting.getNamespaceList();
+				if (namespaces != null && namespaces.length > 0){
+					query += "UNION \n";
+				}
+				for (int i=0; i<namespaces.length; i++){
+					String ns = namespaces[i];
+					query += "{?s ?p <"+ns+"/"+word+">} ";
+					if (i != namespaces.length-1){
+						query += "UNION \n";
+					} else {
+						query += "\n";
+					}
+				}
+
+				query += "}";
+			} else if (type == PlainSparqlAccessor.FIND_TARGET_SPECIFIC_OBJECT){
+				query = // TODO
+					"select distinct ?s where \n{";
+				query += getPropertySparql(propList, word);
+				query += "}";
+			} else if (type == PlainSparqlAccessor.FIND_TARGET_SUBJECT){
+				String[] namespaces = setting.getNamespaceList();
+
+				List<Map<String, RDFNode>> ret = new ArrayList<Map<String,RDFNode>>();
+				for (int i=0; i<namespaces.length; i++){
+					String ns = namespaces[i];
+					query = "select ?o where {\n"+
+					"<"+ns+"/"+word+"> ?p ?o \n";
+					query += "}";
+					List<Map<String, RDFNode>> temp = executeQuery(query);
+					if (temp != null && temp.size() > 0){
+						HashMap<String, RDFNode> node = new HashMap<String, RDFNode>();
+						node.put("s", new ResourceImpl(ns+"/"+word));
+						ret.add(node);
+					}
+
+				}
+				// TODO 邨先棡縺ｮ譛螟ｧ謨ｰ縺ｯnamespaces.size縺ｪ縺ｮ縺ｧ蜴ｳ蟇�↓縺ｯLIMIT, OFFSET繧ょｮ夂ｾｩ縺ｧ縺阪ｋ繧医≧縺ｫ縺励※縺翫＞縺滓婿縺瑚憶縺�
+				return new SparqlResultSet(ret, false);
+			} else {
+				// TODO
+				query =
+					"select distinct ?s where {\n";
+				query += getPropertySparql(propList, word);
+				query += "}";
+			}
+		}
+		if (limit != null && limit > 0){
+			query +="\n LIMIT " + String.valueOf(limit+1);
+		}
+		if (offset != null && offset > 0){
+			query += "\n OFFSET " + String.valueOf(offset);
+		}
+
+		List<Map<String, RDFNode>> result = executeQuery(query);
+		SparqlResultSet ret = new SparqlResultSet(result);
+		if (limit != null){
+			if (result != null && result.size() > limit){
+				result = result.subList(0, limit);
+				ret.setDefaultResult(result);
+				ret.setHasNext(true);
+			}
+		}
+
+		return ret;
+	}
+
+	private String getPropertySparql(String[] propList){
+		StringBuilder sb = new StringBuilder();
+		if (propList == null){
+			// 蠢ｵ縺ｮ縺溘ａ
+			propList = new String[]{"http://www.w3.org/2000/01/rdf-schema#label"};
+		}
+
+		if (propList.length == 1){
+			sb.append("?s <");
+			sb.append(propList[0]);
+			sb.append("> ?o \n");
+		} else {
+			sb.append("{\n");
+			for (int i=0; i<propList.length; i++){
+				sb.append("{?s <");
+				sb.append(propList[i]);
+				sb.append("> ?o ");
+				if (i == propList.length-1){
+					sb.append("}\n");
+				} else {
+					sb.append("} UNION \n");
+				}
+			}
+
+			sb.append("}");
+		}
+		return sb.toString();
+	}
+
+	private String getPropertySparql(String[] propList, String word){
+		StringBuilder sb = new StringBuilder();
+		if (propList == null){
+			// 蠢ｵ縺ｮ縺溘ａ
+			propList = new String[]{"http://www.w3.org/2000/01/rdf-schema#label"};
+		}
+
+		sb.append("{\n");
+		for (int i=0; i<propList.length; i++){
+
+			sb.append("{?s <" +propList[i] + "> \""+word+"\"} UNION \n");
+			sb.append("{?s <" +propList[i] + "> \""+word+"\"@en} UNION \n");
+			sb.append("{?s <" +propList[i] + "> \""+word+"\"@ja");
+			if (i == propList.length-1){
+				sb.append("}\n");
+			} else {
+				sb.append("} UNION \n");
+			}
+		}
+
+		sb.append("}");
+		return sb.toString();
+
+	}
+
+
+	/**
+	 * Thread繧定ｵｷ蜍輔＠縺ｦword譁�ｭ怜�繧貞性繧subject繧貞叙蠕励＠縺ｦ霑斐☆縲らｵ先棡縺ｯlistener縺ｫ霑斐ｋ縲�
+	 * @param word			讀懃ｴ｢譁�ｭ怜�
+	 * @param resultListener		邨先棡繧貞女縺大叙繧詰istener
+	 */
+	public boolean findSubject(String word, boolean fullMatch, Integer limit, Integer offset, int type, String[] propList, SparqlResultListener resultListener){
+
+		Thread thread = new QueryThread(word, new Object[]{new Boolean(fullMatch), limit, offset, new Integer(type), propList}, resultListener){
+			public void run(){
+				try {
+					Boolean fullMatch = (Boolean)((Object[])getOption())[0];
+					Integer limit = (Integer)((Object[])getOption())[1];
+					Integer offset = (Integer)((Object[])getOption())[2];
+					Integer type = (Integer)((Object[])getOption())[3];
+					String[] propList = (String[])((Object[])getOption())[4];
+					getSparqlResultListener().resultReceived(findSubject(getQueryString(), fullMatch, limit, offset, type, propList));
+				} catch(Exception e){
+					throw new RuntimeException(e);
+				}
+			}
+		};
+		thread.setUncaughtExceptionHandler(resultListener);
+		thread.start();
+		return true;
+
+	}
+
+	/**
+	 * 謖�ｮ壹＆繧後◆subject繧呈戟縺､triple��ubject縺ｯ遒ｺ螳壹＠縺ｦ縺�ｋ縺ｮ縺ｧproperty縺ｨobject縺ｮ縺ｿ�峨ｒ霑斐☆
+	 * @param triple
+	 * @return
+	 * @throws Exception
+	 */
+	public List<Map<String, RDFNode>> findTripleFromSubject(String subject) throws Exception{
+		subject = subject.replace(" ", "%20");
+		String query =
+			"select ?p ?o where {\n" +
+			"<" + subject + "> ?p ?o\n"+
+			"}";
+
+		return executeQuery(query);
+	}
+
+	public boolean findTripleFromSubject(String subject, SparqlResultListener listener){
+
+		Thread thread = new QueryThread(subject, listener){
+			public void run(){
+				try {
+					getSparqlResultListener().resultReceived(new SparqlResultSet(findTripleFromSubject(getQueryString())));
+				} catch(Exception e){
+					throw new RuntimeException(e);
+				}
+			}
+		};
+		thread.setUncaughtExceptionHandler(listener);
+		thread.start();
+		return true;
+
+	}
+
+
+	@Override
+	public List<Map<String, RDFNode>> findPropertyList() throws Exception {
+		// TODO 譛ｬ譚･縺ｯdistinct縺ｫ縺励◆縺�′縺昴ｌ縺縺ｨ驥阪＞endpoint縺後≠繧�
+		List<Map<String, RDFNode>> ret = new ArrayList<Map<String,RDFNode>>();
+		Map<String, RDFNode> result = new HashMap<String, RDFNode>();
+		ret.add(result);
+		String query =
+			"select ?s {\n" +
+			"?s ?p ?o\n"+
+			"} LIMIT 10";
+		List<Map<String, RDFNode>> subjects = executeQuery(query);
+		for (Map<String, RDFNode> subjectMap : subjects){
+			RDFNode subject = subjectMap.get("s");
+			query =
+				"select distinct ?p where {\n" +
+				"<" + subject + "> ?p ?o\n"+
+				"}";
+			List<Map<String, RDFNode>> properties = executeQuery(query);
+			for (Map<String, RDFNode> propertyMap : properties){
+				RDFNode property = propertyMap.get("p");
+				// property縺ｮ蝣ｴ蜷医�縲∵綾繧翫�Map縺ｮ蠖｢蠑上ｒ螟峨∴繧�
+				// key:隕∫ｴ遞ｮ蛻･縲�value:隕∫ｴ縲縺ｧ縺ｯ縺ｪ縺上�
+				// key:隕∫ｴ縺ｮ譁�ｭ怜�陦ｨ迴ｾ縲�value:隕∫ｴ縲縺ｨ縺吶ｋ縲�
+				// �郁ｦ∫ｴ遞ｮ蛻･縺檎｢ｺ螳壹＠縺ｦ縺�ｋ縺ｮ縺ｨ縲∬ｦ∫ｴ縺ｮ驥崎､�ｒ蜑企勁縺吶ｋ縺溘ａ��
+				result.put(property.toString(), property);
+System.out.println("p["+property.toString()+"]");
+			}
+		}
+
+		return ret;
+	}
+
+	@Override
+	public boolean findPropertyList(SparqlResultListener listener) {
+		Thread thread = new QueryThread(null, listener){
+			public void run(){
+				try {
+					getSparqlResultListener().resultReceived(new SparqlResultSet(findPropertyList()));
+				} catch(Exception e){
+					throw new RuntimeException(e);
+				}
+			}
+		};
+		thread.setUncaughtExceptionHandler(listener);
+		thread.start();
+		return true;
+	}
+
+
+	public static void main(String[] args){
+
+		try {
+			URL url = new URL("http://www.wikipediaontology.org/query/?q=" + URLEncoder.encode("select * {?s ?p ?o}", "UTF-8") + "&type=xml&LIMIT=100");//POST縺吶ｋ繝��繧ｿ
+			HttpURLConnection conn = (HttpURLConnection)url.openConnection();
+			conn.setRequestProperty("User-Agent", "test");// 繝倥ャ繝繧定ｨｭ螳�
+			conn.setRequestProperty("Accept-Language", "ja");// 繝倥ャ繝繧定ｨｭ螳�
+			conn.setRequestProperty("Referer", "http://www.wikipediaontology.org/query/");// 繝倥ャ繝繧定ｨｭ螳�
+			InputStreamReader isr = new java.io.InputStreamReader(conn.getInputStream(), "UTF-8");
+			BufferedReader br = new java.io.BufferedReader(isr);
+
+			// 蜿嶺ｿ｡縺励◆繧ｹ繝医Μ繝ｼ繝繧定｡ｨ遉ｺ
+			String line = null;
+			while (null != (line = br.readLine())) {
+			    System.out.println(line);
+			}
+
+			// 繧ｹ繝医Μ繝ｼ繝縺ｪ繧峨�縺ｫ謗･邯壹ｒ繧ｯ繝ｭ繝ｼ繧ｺ
+			br.close();
+			conn.disconnect();
+		} catch(Exception e){
+			e.printStackTrace();
+		}
+
+	}
+}
+
+class QueryThread extends Thread {
+
+	private String queryString;
+	private Object option;
+	private SparqlResultListener listener;
+
+	public QueryThread(String queryString, Object option, SparqlResultListener listener){
+		this.queryString = queryString;
+		this.option = option;
+		this.listener = listener;
+	}
+
+	public QueryThread(String queryString, SparqlResultListener listener){
+		this(queryString, null, listener);
+	}
+
+	protected String getQueryString(){
+		return this.queryString;
+	}
+
+	protected Object getOption(){
+		return this.option;
+	}
+
+	protected SparqlResultListener getSparqlResultListener(){
+		return this.listener;
+	}
+
+}
+
Index: BH13SPARQLBuilder/src/hozo/sparql/SparqlResultSet.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/SparqlResultSet.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/SparqlResultSet.java (revision 9)
@@ -0,0 +1,69 @@
+package jp.ac.osaka_u.sanken.sparql;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.hp.hpl.jena.rdf.model.RDFNode;
+
+public class SparqlResultSet {
+
+	private final String DEFAULT_KEY = "_"; 
+	
+	private Map<String, List<Map<String, RDFNode>>> result;
+	private boolean hasNext;
+
+	public SparqlResultSet(List<Map<String, RDFNode>> result){
+		this(result, false);
+	}
+
+	public SparqlResultSet(List<Map<String, RDFNode>> result, boolean hasNext){
+		this.result = new LinkedHashMap<String, List<Map<String, RDFNode>>>();
+		this.result.put(DEFAULT_KEY, result);
+		this.hasNext = hasNext;
+	}
+
+	/**
+	 * @return result
+	 */
+	public List<Map<String, RDFNode>> getDefaultResult() {
+		return getResult(DEFAULT_KEY);
+	}
+
+	public List<Map<String, RDFNode>> getResult(String endpoint) {
+		return result.get(endpoint);
+	}
+	
+	public Map<String, List<Map<String, RDFNode>>> getResult(){
+		return result;
+	}
+
+	
+	/**
+	 * @param result 繧ｻ繝�ヨ縺吶ｋ result
+	 */
+	public void setDefaultResult(List<Map<String, RDFNode>> result) {
+		this.addResult(DEFAULT_KEY, result);
+	}
+
+	public void addResult(String endpoint, List<Map<String, RDFNode>> result) {
+		this.result.put(endpoint, result);
+	}
+
+	
+	/**
+	 * @return hasNext
+	 */
+	public boolean isHasNext() {
+		return hasNext;
+	}
+
+	/**
+	 * @param hasNext 繧ｻ繝�ヨ縺吶ｋ hasNext
+	 */
+	public void setHasNext(boolean hasNext) {
+		this.hasNext = hasNext;
+	}
+
+
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/SparqlAccessorFactory.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/SparqlAccessorFactory.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/SparqlAccessorFactory.java (revision 9)
@@ -0,0 +1,36 @@
+package jp.ac.osaka_u.sanken.sparql;
+
+import java.util.List;
+
+public class SparqlAccessorFactory {
+
+	public static SparqlAccessor createSparqlAccessor(EndpointSettings setting){
+		
+		if (setting.isEditable()){
+			// 迴ｾ迥ｶ縲∫ｷｨ髮�庄閭ｽ縺ｪ繧牙ｸｸ縺ｫAllegroGraph縺ｨ縺吶ｋ
+			return new AllegroAccessor(setting);
+		} else {
+			return new PlainSparqlAccessor(setting);
+		}
+	}
+
+	public static SparqlAccessor createSparqlAccessor(List<EndpointSettings> settings){
+		return new CrossSparqlAccessor(settings);
+	}
+
+	public static ThreadedSparqlAccessor createSparqlAccessor(EndpointSettings setting, SparqlQueryListener listener){
+		
+		if (setting.isEditable()){
+			// 迴ｾ迥ｶ縲∫ｷｨ髮�庄閭ｽ縺ｪ繧牙ｸｸ縺ｫAllegroGraph縺ｨ縺吶ｋ
+			return new AllegroAccessor(setting, listener);
+		} else {
+			return new PlainSparqlAccessor(setting, listener);
+		}
+	}
+
+	public static ThreadedSparqlAccessor createSparqlAccessor(List<EndpointSettings> settings, SparqlQueryListener listener){
+		return new CrossSparqlAccessor(settings, listener);
+	}
+
+	
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/plugin/compare/Compare.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/plugin/compare/Compare.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/plugin/compare/Compare.java (revision 9)
@@ -0,0 +1,265 @@
+package jp.ac.osaka_u.sanken.sparql.plugin.compare;
+
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.JFileChooser;
+
+import com.hp.hpl.jena.rdf.model.RDFNode;
+import com.ibm.icu.text.SimpleDateFormat;
+
+import jp.ac.osaka_u.sanken.sparql.EndpointSettings;
+import jp.ac.osaka_u.sanken.sparql.EndpointSettingsManager;
+import jp.ac.osaka_u.sanken.sparql.PlainSparqlAccessor;
+import jp.ac.osaka_u.sanken.sparql.SparqlQueryListener;
+import jp.ac.osaka_u.sanken.sparql.SparqlResultSet;
+
+public class Compare {
+
+	private HashMap<String, PlainSparqlAccessor> accessorMap;
+	private List<String> labels;
+	private SparqlQueryListener listener;
+
+	public Compare(File inputFile, File endpointFile){
+		this(inputFile, endpointFile, null);
+	}
+
+
+	public Compare(File inputFile, File endpointFile, SparqlQueryListener listener){
+		/*
+		 * 繝ｻEndpoint繧定､�焚謖�ｮ壹☆繧�
+		 * 繝ｻLabel縺御ｸ陦後↓荳縺､縺壹▽險倩ｿｰ縺輔ｌ縺鬱ext繧貞眠繧上○繧�
+		 * 繝ｻ險ｭ螳壹�AccessorForm縺ｮ繝��繧ｿ繧貞茜逕ｨ
+		 */
+		accessorMap = new HashMap<String, PlainSparqlAccessor>();
+
+		loadSetting("settings.xml");
+
+		List<String> endpoints = FileUtil.readFileText(endpointFile, "UTF-8");
+
+		setEndpoint(endpoints);
+
+		labels = FileUtil.readFileText(inputFile, "UTF-8");
+//		setLabel();
+
+		this.listener = listener;
+	}
+
+	public void addEndpoint(String endpoint){
+		EndpointSettings settings = EndpointSettingsManager.instance.getSetting(endpoint);
+
+		PlainSparqlAccessor sa = new PlainSparqlAccessor(settings);
+		accessorMap.put(endpoint, sa);
+//		sa.findTripleFromSubject("select ?s {?s <http://www.w3.org/2000/01/rdf-schema#label> "+"")
+	}
+
+	private void setEndpoint(List<String> endpoints){
+		for (String ep : endpoints){
+			addEndpoint(ep);
+		}
+	}
+
+
+	private Thread thread;
+	private boolean finalizeThread = false;
+
+	public void outputResult(int targetType, boolean fullMatch, File out, CompareResultListener listener) {
+		thread = new QueryThread(new Object[]{new Integer(targetType), new Boolean(fullMatch), out}, listener){
+			public void run(){
+				try {
+					Integer type = (Integer)((Object[])getOption())[0];
+					Boolean fullMatch = (Boolean)((Object[])getOption())[1];
+					File file = (File)((Object[])getOption())[2];
+					getCompareResultListener().resultReceived(outputResult(type, fullMatch, file));
+				} catch(Exception e){
+					throw new RuntimeException(e);
+				}
+			}
+		};
+		thread.setUncaughtExceptionHandler(listener);
+		thread.start();
+
+	}
+
+	public void stop(){
+		println(getCurrentTime()+"Stop Request");
+		finalizeThread = true;
+	}
+
+
+	public boolean outputResult(int targetType, boolean fullMatch, File out) throws IOException{
+		/*
+		// header
+		System.out.print("\"\",");
+		for (String endpoint : accessorMap.keySet()){
+			System.out.print("\""+endpoint + "\",");
+		}
+		System.out.println();
+
+		for (String label : labels){
+			System.out.print("\"" + label + "\",");
+			for (String endpoint : accessorMap.keySet()){
+				SparqlAccessor sa = accessorMap.get(endpoint);
+				try {
+					List<Map<String, RDFNode>> res  = sa.findSubject(label, true, 10, type);//executeQuery("select ?s {{?s <http://www.w3.org/2000/01/rdf-schema#label> \""+label+"\"@ja} UNION {?s <http://www.w3.org/2000/01/rdf-schema#label> \""+label+"\"@en} UNION {?s <http://www.w3.org/2000/01/rdf-schema#label> \""+label+"\"}}");
+					if (res != null && res.size() > 0){
+						Map<String, RDFNode> r = res.get(0);
+						RDFNode s = r.get("s");
+						System.out.print("\"" + s.toString() + "\",");
+					} else {
+						System.out.print(",");
+					}
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+			}
+			System.out.println();
+		}
+		*/
+		if (out.getParentFile() != null && !out.getParentFile().exists()){
+			out.getParentFile().mkdirs();
+		}
+		out.createNewFile();
+		if (!out.canWrite()){
+			return false;
+		}
+
+		return outputResult(targetType, fullMatch, new PrintWriter(new OutputStreamWriter(new FileOutputStream(out), "SJIS")));
+	}
+
+	private boolean outputResult(int targetType, boolean fullMatch, PrintWriter out){
+		String typeStr = "all";
+		if (targetType == PlainSparqlAccessor.FIND_TARGET_SUBJECT){
+			typeStr = "subject";
+		}
+		if (targetType == PlainSparqlAccessor.FIND_TARGET_SPECIFIC_OBJECT){
+			typeStr = "object (label only)";
+		}
+		if (targetType == PlainSparqlAccessor.FIND_TARGET_OBJECT){
+			typeStr = "object";
+		}
+		println("find type :["+typeStr+"]");
+		println("full match :["+fullMatch + "]");
+
+		println("target endpoints:");
+		for (String endpoint : accessorMap.keySet()){
+			print("["+endpoint + "]");
+		}
+		println();
+		println(getCurrentTime()+"query start.");
+
+		out.print("\"\",");
+		for (String endpoint : accessorMap.keySet()){
+			out.print("\""+endpoint + "\",");
+		}
+		out.println();
+
+		int index = 0;
+
+		for (String label : labels){
+			print(getCurrentTime()+ "No." + (++index)+":searching :["+label+"].");
+			out.print("\"" + label + "\",");
+			for (String endpoint : accessorMap.keySet()){
+				print("*");
+				PlainSparqlAccessor sa = accessorMap.get(endpoint);
+				try {
+					SparqlResultSet res  = sa.findSubject(label, fullMatch, 10, null, targetType, null);//executeQuery("select ?s {{?s <http://www.w3.org/2000/01/rdf-schema#label> \""+label+"\"@ja} UNION {?s <http://www.w3.org/2000/01/rdf-schema#label> \""+label+"\"@en} UNION {?s <http://www.w3.org/2000/01/rdf-schema#label> \""+label+"\"}}");
+					List<Map<String, RDFNode>> list = res.getDefaultResult();
+					if (list != null && list.size() > 0){
+						Map<String, RDFNode> r = list.get(0);
+						RDFNode s = r.get("s");
+						out.print("\"" + s.toString() + "\",");
+					} else {
+						out.print(",");
+					}
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+				if (finalizeThread){
+					break;
+				}
+			}
+			if (finalizeThread){
+				break;
+			}
+			println();
+			out.println();
+		}
+		out.flush();
+		out.close();
+
+		println(getCurrentTime()+"query end.");
+
+		return true;
+	}
+
+	private String getCurrentTime(){
+		Timestamp time = new Timestamp(new Date().getTime());
+
+		return new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(time) + ":";
+	}
+
+	private void println(){
+		println("");
+	}
+
+	private void println(String str){
+		print(str + "\n");
+	}
+
+	private void print(String str){
+		if (listener != null){
+			listener.sparqlExecuted(str);
+		}
+	}
+
+	private int loadSetting(String settingFile){
+		// 蜃ｺ蜉帛�豎ｺ螳�
+		File file = new File(settingFile);
+		try {
+			EndpointSettings[] settings = EndpointSettings.inputXML(new FileInputStream(file));
+			if (settings != null){
+				EndpointSettingsManager.instance.setSettings(settings);
+
+				return 0;
+			}
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+			return JFileChooser.ERROR;
+		} finally {
+		}
+		return JFileChooser.ERROR;
+	}
+
+	private class QueryThread extends Thread {
+
+		private Object option;
+		private CompareResultListener listener;
+
+
+		public QueryThread(Object option, CompareResultListener listener){
+			this.option = option;
+			this.listener = listener;
+		}
+
+		protected Object getOption(){
+			return this.option;
+		}
+
+		protected CompareResultListener getCompareResultListener(){
+			return this.listener;
+		}
+
+	}
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/plugin/compare/ComparePanel.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/plugin/compare/ComparePanel.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/plugin/compare/ComparePanel.java (revision 9)
@@ -0,0 +1,561 @@
+package jp.ac.osaka_u.sanken.sparql.plugin.compare;
+
+import java.awt.GridBagLayout;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import javax.swing.JButton;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.EventQueue;
+import java.awt.FlowLayout;
+import java.awt.GridBagConstraints;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.io.IOException;
+
+import javax.swing.ButtonGroup;
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+import javax.swing.JScrollPane;
+import javax.swing.JSeparator;
+import javax.swing.JTextArea;
+import javax.swing.JLabel;
+import javax.swing.JRadioButton;
+import javax.swing.SwingConstants;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+
+import jp.ac.osaka_u.sanken.sparql.SparqlAccessor;
+import jp.ac.osaka_u.sanken.sparql.SparqlQueryListener;
+
+public class ComparePanel extends JPanel {
+
+	private static final long serialVersionUID = 1L;
+	private JTextField endpointsTextField = null;  //  @jve:decl-index=0:visual-constraint="542,195"
+	private JButton endpointsButton = null;
+	private JTextField wordsTextField = null;
+	private JButton wordsButton = null;
+	private JScrollPane logScrollPane = null;
+	private JTextArea logTextArea = null;
+	private JLabel endpointsLabel = null;
+	private JLabel wordsLabel = null;
+	private JButton executeButton = null;
+	private JPanel optPanel = null;
+	private JPanel matchPanel = null;
+	private JRadioButton matchFullRadioButton = null;
+	private JRadioButton matchPartRadioButton = null;
+	private JRadioButton findSubjectRadioButton = null;
+	private JRadioButton findObjectRadioButton = null;
+	private JRadioButton findLabelObjectRadioButton = null;
+	private JSeparator separator = null;
+	private JLabel outputLabel = null;
+	private JTextField outputTextField = null;
+	private JButton outputRefButton = null;
+	private Component parent;
+
+	/**
+	 * This is the default constructor
+	 */
+	public ComparePanel(Component parent) {
+		super();
+		initialize();
+		this.parent= parent;
+	}
+
+	/**
+	 * This method initializes this
+	 * 
+	 * @return void
+	 */
+	private void initialize() {
+		GridBagConstraints gridBagConstraints111 = new GridBagConstraints();
+		gridBagConstraints111.gridx = 2;
+		gridBagConstraints111.insets = new Insets(0, 0, 0, 10);
+		gridBagConstraints111.gridy = 3;
+		GridBagConstraints gridBagConstraints10 = new GridBagConstraints();
+		gridBagConstraints10.fill = GridBagConstraints.HORIZONTAL;
+		gridBagConstraints10.gridy = 3;
+		gridBagConstraints10.weightx = 1.0;
+		gridBagConstraints10.insets = new Insets(5, 10, 5, 0);
+		gridBagConstraints10.gridx = 1;
+		GridBagConstraints gridBagConstraints9 = new GridBagConstraints();
+		gridBagConstraints9.gridx = 0;
+		gridBagConstraints9.gridy = 3;
+		outputLabel = new JLabel("Output File");
+		GridBagConstraints gridBagConstraints8 = new GridBagConstraints();
+		gridBagConstraints8.gridx = 0;
+		gridBagConstraints8.gridwidth = 3;
+		gridBagConstraints8.fill = GridBagConstraints.HORIZONTAL;
+		gridBagConstraints8.gridy = 4;
+		GridBagConstraints gridBagConstraints5 = new GridBagConstraints();
+		gridBagConstraints5.gridx = 0;
+		gridBagConstraints5.insets = new Insets(0, 10, 0, 0);
+		gridBagConstraints5.gridy = 2;
+		wordsLabel = new JLabel();
+		wordsLabel.setText("Word List File");
+		GridBagConstraints gridBagConstraints4 = new GridBagConstraints();
+		gridBagConstraints4.gridx = 0;
+		gridBagConstraints4.insets = new Insets(0, 10, 0, 0);
+		gridBagConstraints4.gridy = 0;
+		endpointsLabel = new JLabel();
+		endpointsLabel.setText("Endpoint List File");
+		GridBagConstraints gridBagConstraints3 = new GridBagConstraints();
+		gridBagConstraints3.fill = GridBagConstraints.BOTH;
+		gridBagConstraints3.gridy = 5;
+		gridBagConstraints3.weightx = 1.0;
+		gridBagConstraints3.weighty = 1.0;
+		gridBagConstraints3.insets = new Insets(10, 10, 10, 10);
+		gridBagConstraints3.gridwidth = 3;
+		gridBagConstraints3.gridx = 0;
+		GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
+		gridBagConstraints2.gridx = 2;
+		gridBagConstraints2.insets = new Insets(0, 0, 0, 10);
+		gridBagConstraints2.gridy = 2;
+		GridBagConstraints gridBagConstraints11 = new GridBagConstraints();
+		gridBagConstraints11.fill = GridBagConstraints.HORIZONTAL;
+		gridBagConstraints11.gridy = 2;
+		gridBagConstraints11.weightx = 1.0;
+		gridBagConstraints11.insets = new Insets(5, 10, 5, 0);
+		gridBagConstraints11.gridx = 1;
+		GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
+		gridBagConstraints1.fill = GridBagConstraints.NONE;
+		gridBagConstraints1.gridy = 0;
+		gridBagConstraints1.insets = new Insets(10, 0, 0, 10);
+		gridBagConstraints1.gridx = 2;
+		GridBagConstraints gridBagConstraints = new GridBagConstraints();
+		gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
+		gridBagConstraints.gridy = 0;
+		gridBagConstraints.insets = new Insets(14, 10, 5, 0);
+		gridBagConstraints.gridx = 1;
+		this.setLayout(new GridBagLayout());
+		this.add(getEndpointsTextField(), gridBagConstraints);
+		this.add(getEndpointsButton(), gridBagConstraints1);
+		this.add(getWordsTextField(), gridBagConstraints11);
+		this.add(getWordsButton(), gridBagConstraints2);
+		this.add(getLogScrollPane(), gridBagConstraints3);
+		this.add(endpointsLabel, gridBagConstraints4);
+		this.add(wordsLabel, gridBagConstraints5);
+		this.add(getOptPanel(), gridBagConstraints8);
+		this.add(outputLabel, gridBagConstraints9);
+		this.add(getOutputTextField(), gridBagConstraints10);
+		this.add(getOutputRefButton(), gridBagConstraints111);
+	}
+
+	/**
+	 * This method initializes endpointsTextField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getEndpointsTextField() {
+		if (endpointsTextField == null) {
+			endpointsTextField = new JTextField();
+			endpointsTextField.setEditable(false);
+		}
+		return endpointsTextField;
+	}
+
+	/**
+	 * This method initializes endpointsButton	
+	 * 	
+	 * @return javax.swing.JButton	
+	 */
+	private JButton getEndpointsButton() {
+		if (endpointsButton == null) {
+			endpointsButton = new JButton("Ref");
+			endpointsButton.addActionListener(new ActionListener() {
+				
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					selectFile(getEndpointsTextField(), JFileChooser.OPEN_DIALOG);
+					validateExecute();
+				}
+			});
+		}
+		return endpointsButton;
+	}
+
+	/**
+	 * This method initializes wordsTextField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getWordsTextField() {
+		if (wordsTextField == null) {
+			wordsTextField = new JTextField();
+			wordsTextField.setEditable(false);
+		}
+		return wordsTextField;
+	}
+
+	/**
+	 * This method initializes wordsButton	
+	 * 	
+	 * @return javax.swing.JButton	
+	 */
+	private JButton getWordsButton() {
+		if (wordsButton == null) {
+			wordsButton = new JButton("Ref");
+			wordsButton.addActionListener(new ActionListener() {
+				
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					selectFile(getWordsTextField(), JFileChooser.OPEN_DIALOG);
+					validateExecute();
+				}
+			});
+		}
+		return wordsButton;
+	}
+
+	/**
+	 * This method initializes logScrollPane	
+	 * 	
+	 * @return javax.swing.JScrollPane	
+	 */
+	private JScrollPane getLogScrollPane() {
+		if (logScrollPane == null) {
+			logScrollPane = new JScrollPane();
+			logScrollPane.setViewportView(getLogTextArea());
+		}
+		return logScrollPane;
+	}
+
+	/**
+	 * This method initializes logTextArea	
+	 * 	
+	 * @return javax.swing.JTextArea	
+	 */
+	private JTextArea getLogTextArea() {
+		if (logTextArea == null) {
+			logTextArea = new JTextArea();
+			logTextArea.getDocument().addDocumentListener(new DocumentListener() {
+				
+				@Override
+				public void removeUpdate(DocumentEvent arg0) {
+				}
+				
+				@Override
+				public void changedUpdate(DocumentEvent arg0) {
+				}
+				@Override
+				public void insertUpdate(DocumentEvent e) {
+					final Document doc = logTextArea.getDocument();
+					final Element root = doc.getDefaultRootElement();
+					if(root.getElementCount() <= 100){ // TODO 100縺ｯ繝吶ち譖ｸ縺�
+						return;
+					}
+					EventQueue.invokeLater(new Runnable() {
+						@Override
+						public void run() {
+							removeLines(doc, root);
+						}
+					});
+					logTextArea.setCaretPosition(doc.getLength());
+				}
+				private void removeLines(Document doc, Element root) {
+					Element fl = root.getElement(0);
+					try{
+						doc.remove(0, fl.getEndOffset());
+					}catch(BadLocationException ble) {
+						System.out.println(ble);
+					}
+				}
+			});
+		}
+		return logTextArea;
+	}
+	
+	void addLogText(String log){
+		String[] logs = log.split("\n");
+		for (String l : logs){
+//			getLogTextArea().append((getLogTextArea().getDocument().getLength() > 0) ? "\n" + l : l);
+			getLogTextArea().append(l);
+		}
+		if (log.endsWith("\n")){
+			getLogTextArea().append("\n");
+		}
+		
+		getLogTextArea().setCaretPosition(getLogTextArea().getDocument().getLength());
+	}
+
+
+	/**
+	 * This method initializes executeButton	
+	 * 	
+	 * @return javax.swing.JButton	
+	 */
+	private JButton getExecuteButton() {
+		if (executeButton == null) {
+			executeButton = new JButton("Execute");
+			executeButton.setEnabled(false);
+			executeButton.addActionListener(new ActionListener() {
+				
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					if (getExecuteButton().getText().equals("Execute")){
+						setProcessing(true);
+						doCompare();
+					} else {
+						executeButton.setEnabled(false);
+						doStop();
+					}
+				}
+			});
+		}
+		return executeButton;
+	}
+
+	/**
+	 * This method initializes optPanel	
+	 * 	
+	 * @return javax.swing.JPanel	
+	 */
+	private JPanel getOptPanel() {
+		if (optPanel == null) {
+			optPanel = new JPanel();
+			optPanel.setLayout(new BorderLayout());
+			optPanel.add(getExecuteButton(), BorderLayout.EAST);
+			optPanel.add(getMatchPanel(), BorderLayout.CENTER);
+		}
+		return optPanel;
+	}
+
+	/**
+	 * This method initializes matchPanel	
+	 * 	
+	 * @return javax.swing.JPanel	
+	 */
+	private JPanel getMatchPanel() {
+		if (matchPanel == null) {
+			FlowLayout flowLayout = new FlowLayout();
+			flowLayout.setVgap(0);
+			matchPanel = new JPanel();
+			matchPanel.setLayout(flowLayout);
+			matchPanel.add(getMatchFullRadioButton(), null);
+			matchPanel.add(getMatchPartRadioButton(), null);
+			matchPanel.add(getSeparator(), null);
+			matchPanel.add(getFindSubjectRadioButton(), null);
+			matchPanel.add(getFindObjectRadioButton(), null);
+			matchPanel.add(getFindLabelObjectRadioButton(), null);
+			ButtonGroup gp1 = new ButtonGroup();
+			gp1.add(getMatchFullRadioButton());
+			gp1.add(getMatchPartRadioButton());
+			getMatchFullRadioButton().setSelected(true);
+			ButtonGroup gp2 = new ButtonGroup();
+			gp2.add(getFindSubjectRadioButton());
+			gp2.add(getFindObjectRadioButton());
+			gp2.add(getFindLabelObjectRadioButton());
+			getFindSubjectRadioButton().setSelected(true);
+		}
+		return matchPanel;
+	}
+	
+	private int getFindType(){
+		if (getFindSubjectRadioButton().isSelected()){
+			return SparqlAccessor.FIND_TARGET_SUBJECT;
+		}
+		if (getFindObjectRadioButton().isSelected()){
+			return SparqlAccessor.FIND_TARGET_OBJECT;
+		}
+		if (getFindLabelObjectRadioButton().isSelected()){
+			return SparqlAccessor.FIND_TARGET_SPECIFIC_OBJECT;
+		}
+		return SparqlAccessor.FIND_TARGET_ALL;
+	}
+	
+	private boolean isFullMatch(){
+		return getMatchFullRadioButton().isSelected();
+	}
+
+	private void selectFile(JTextField tf, int dialogType){
+		JFileChooser fileChooser = new JFileChooser("./");
+		fileChooser.setDialogType(dialogType);
+		// 繝輔ぃ繧､繝ｫ驕ｸ謚樒ｵ先棡蜿門ｾ�
+		int result = fileChooser.showOpenDialog(this);
+		File file = fileChooser.getSelectedFile();
+		if (result == JFileChooser.CANCEL_OPTION || file == null) {
+			// 繧ｭ繝｣繝ｳ繧ｻ繝ｫ謚ｼ荳九√∪縺溘�縲√ヵ繧｡繧､繝ｫ驕ｸ謚槭↑縺励�縺溘ａ菴輔ｂ縺励↑縺�
+			return;
+		}
+		
+		try {
+			tf.setText(file.getCanonicalPath());
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	private void validateExecute(){
+		boolean enable = true;
+		if (getEndpointsTextField().getText().isEmpty() ||
+				getWordsTextField().getText().isEmpty() || 
+				getOutputTextField().getText().isEmpty()){
+			enable = false;
+		}
+		getExecuteButton().setEnabled(enable);
+	}
+
+	Compare compare = null;
+	
+	private void doCompare(){
+		compare = new Compare(new File(getWordsTextField().getText()), new File(getEndpointsTextField().getText()), new SparqlQueryListener() {
+			
+			@Override
+			public void sparqlExecuted(String query) {
+				addLogText(query);
+			}
+		});
+
+		compare.outputResult(getFindType(), isFullMatch(), new File(getOutputTextField().getText()), new CompareResultListener() {
+
+			@Override
+			public void uncaughtException(Thread thread, Throwable e) {
+				JOptionPane.showMessageDialog(parent, "Execute error:"+e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
+				setProcessing(false);
+			}
+
+			@Override
+			public void resultReceived(boolean result) {
+				setProcessing(false);
+			}
+		});
+	}
+	
+	private void doStop(){
+		if (compare != null){
+			compare.stop();
+		}
+	}
+	
+
+	private void setProcessing(boolean isProcess){
+		this.getEndpointsButton().setEnabled(!isProcess);
+		this.getWordsButton().setEnabled(!isProcess);
+		this.getOutputRefButton().setEnabled(!isProcess);
+		this.getMatchFullRadioButton().setEnabled(!isProcess);
+		this.getMatchPartRadioButton().setEnabled(!isProcess);
+		this.getFindSubjectRadioButton().setEnabled(!isProcess);
+		this.getFindObjectRadioButton().setEnabled(!isProcess);
+		this.getFindLabelObjectRadioButton().setEnabled(!isProcess);
+		if (isProcess){
+			this.getExecuteButton().setText("Stop");
+		} else {
+			this.getExecuteButton().setText("Execute");
+		}
+		this.getExecuteButton().setEnabled(true);
+	}
+	
+	/**
+	 * This method initializes matchFullRadioButton	
+	 * 	
+	 * @return javax.swing.JRadioButton	
+	 */
+	private JRadioButton getMatchFullRadioButton() {
+		if (matchFullRadioButton == null) {
+			matchFullRadioButton = new JRadioButton("Full Match");
+		}
+		return matchFullRadioButton;
+	}
+
+	/**
+	 * This method initializes matchPartRadioButton	
+	 * 	
+	 * @return javax.swing.JRadioButton	
+	 */
+	private JRadioButton getMatchPartRadioButton() {
+		if (matchPartRadioButton == null) {
+			matchPartRadioButton = new JRadioButton("Part Match");
+		}
+		return matchPartRadioButton;
+	}
+
+	/**
+	 * This method initializes findSubjectRadioButton	
+	 * 	
+	 * @return javax.swing.JRadioButton	
+	 */
+	private JRadioButton getFindSubjectRadioButton() {
+		if (findSubjectRadioButton == null) {
+			findSubjectRadioButton = new JRadioButton("Find Subject");
+		}
+		return findSubjectRadioButton;
+	}
+
+	/**
+	 * This method initializes findObjectRadioButton	
+	 * 	
+	 * @return javax.swing.JRadioButton	
+	 */
+	private JRadioButton getFindObjectRadioButton() {
+		if (findObjectRadioButton == null) {
+			findObjectRadioButton = new JRadioButton("Find All Object");
+		}
+		return findObjectRadioButton;
+	}
+
+	/**
+	 * This method initializes findLabelObjectRadioButton	
+	 * 	
+	 * @return javax.swing.JRadioButton	
+	 */
+	private JRadioButton getFindLabelObjectRadioButton() {
+		if (findLabelObjectRadioButton == null) {
+			findLabelObjectRadioButton = new JRadioButton("Find Label Object");
+		}
+		return findLabelObjectRadioButton;
+	}
+
+	/**
+	 * This method initializes separator	
+	 * 	
+	 * @return JSeparator	
+	 */
+	private JSeparator getSeparator() {
+		if (separator == null) {
+			separator = new JSeparator(SwingConstants.VERTICAL);
+			separator.setPreferredSize(new Dimension(5, 20));
+		}
+		return separator;
+	}
+
+	/**
+	 * This method initializes outputTextField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getOutputTextField() {
+		if (outputTextField == null) {
+			outputTextField = new JTextField();
+			outputTextField.setEditable(false);
+		}
+		return outputTextField;
+	}
+
+	/**
+	 * This method initializes RefButton	
+	 * 	
+	 * @return javax.swing.JButton	
+	 */
+	private JButton getOutputRefButton() {
+		if (outputRefButton == null) {
+			outputRefButton = new JButton("Ref");
+			outputRefButton.addActionListener(new ActionListener() {
+				
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					selectFile(getOutputTextField(), JFileChooser.SAVE_DIALOG);
+					validateExecute();
+				}
+			});
+		}
+		return outputRefButton;
+	}
+	
+}  //  @jve:decl-index=0:visual-constraint="10,10"
Index: BH13SPARQLBuilder/src/hozo/sparql/plugin/compare/CompareSubject.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/plugin/compare/CompareSubject.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/plugin/compare/CompareSubject.java (revision 9)
@@ -0,0 +1,412 @@
+package jp.ac.osaka_u.sanken.sparql.plugin.compare;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.hp.hpl.jena.rdf.model.RDFNode;
+import com.ibm.icu.text.SimpleDateFormat;
+
+import jp.ac.osaka_u.sanken.sparql.EndpointSettings;
+import jp.ac.osaka_u.sanken.sparql.EndpointSettingsManager;
+import jp.ac.osaka_u.sanken.sparql.PlainSparqlAccessor;
+import jp.ac.osaka_u.sanken.sparql.SparqlQueryListener;
+
+public class CompareSubject {
+	
+	private File csvFile;
+	
+	private File propertyFile;
+	private HashMap<String, PlainSparqlAccessor> accessorMap;
+	
+	private static final String SEPARATOR = ",";
+	
+	private Thread thread;
+	private boolean finalizeThread = false;
+	private SparqlQueryListener listener;
+
+	public CompareSubject(File csvFile, File endpointFile){
+		this(csvFile, endpointFile, null);
+	}
+		
+	public CompareSubject(File csvFile, File endpointFile, SparqlQueryListener listener){
+		this.csvFile = csvFile;
+		this.propertyFile = endpointFile;
+		this.listener = listener;
+		
+		this.accessorMap = new HashMap<String, PlainSparqlAccessor>();
+	}
+	
+	
+	public void outputResult(File out, CompareResultListener listener){
+		thread = new QueryThread(new Object[]{out}, listener){
+			public void run(){
+				try {
+					File file = (File)((Object[])getOption())[0];
+					getCompareResultListener().resultReceived(outputResult(file));
+				} catch(Exception e){
+					throw new RuntimeException(e);
+				}
+			}
+		};
+		thread.setUncaughtExceptionHandler(listener);
+		thread.start();
+	}
+
+	
+	private boolean outputResult(File out) throws IOException {
+		if (out.getParentFile() != null && !out.getParentFile().exists()){
+			out.getParentFile().mkdirs();
+		}
+		out.createNewFile();
+		if (!out.canWrite()){
+			return false;
+		}
+		
+		return outputResult(new PrintWriter(new OutputStreamWriter(new FileOutputStream(out), "SJIS")));
+	}
+	
+	public void stop(){
+		println(getCurrentTime()+"Stop Request");
+		finalizeThread = true;
+	}
+
+	
+	private boolean outputResult(PrintWriter out){
+		HashMap<String, List<String>> propertyHash = readPropertyFile();
+		
+		getResources(propertyHash, out);
+		
+		out.flush();
+		out.close();
+		
+		println(getCurrentTime()+"query end.");
+
+		return true; // TODO
+	}
+
+	private HashMap<String, List<String>> readPropertyFile(){
+		HashMap<String, List<String>> propertyHash = new HashMap<String, List<String>>();
+		List<String> contents = FileUtil.readFileText(propertyFile, "UTF-8");
+		
+		for (String line : contents){
+			List<String> property = FileUtil.splitLine(line, SEPARATOR);
+			if (property != null && property.size() > 1){
+				// 荳繧ｫ繝ｩ繝逶ｮ縺ｯendpoint
+				List<String> properties = new ArrayList<String>();
+				propertyHash.put(property.get(0), properties);
+				for (int i=1; i<property.size(); i++){
+					properties.add(property.get(i));
+				}
+			}
+		}
+		
+		return propertyHash;
+	}
+	
+
+	private void println(){
+		println("");
+	}
+
+	private void println(String str){
+		print(str + "\n");
+	}
+
+	private void print(String str){
+		if (listener != null){
+			listener.sparqlExecuted(str);
+		}
+	}
+
+	
+	private void getResources(HashMap<String, List<String>> propertyHash, PrintWriter out){
+		List<String> endpoints = null;
+		List<String> files = FileUtil.readFileText(csvFile, "SJIS");
+		
+		println();
+		println(getCurrentTime()+"query start.");
+		
+		if (files != null && files.size() > 0){
+			// 荳陦檎岼縺ｯ繝倥ャ繝
+			endpoints = getEndpoints(files.get(0));
+			
+			setEndpoint(endpoints);
+		}
+		
+		// header蜃ｺ蜉�
+		StringBuilder line = new StringBuilder();
+		line.append("");
+		line.append(SEPARATOR);
+		for (String endpoint : endpoints){
+			line.append(endpoint);
+			line.append(SEPARATOR);
+			line.append("");
+			line.append(SEPARATOR);
+			line.append("");
+			line.append(SEPARATOR);
+		}
+		out.append(line.toString());
+		out.append("\n");
+
+		for (int i=1; i<files.size(); i++){
+			if (!finalizeThread){
+				getResource(endpoints, FileUtil.splitLine(files.get(i), SEPARATOR), propertyHash, out);
+			} else {
+				break;
+			}
+		}
+		
+	}
+	
+	/**
+	 * 荳陦後＃縺ｨ縺ｫ
+	 * @param endpoints
+	 * @param contents
+	 * @param propertyHash
+	 * @param out
+	 */
+	private void getResource(List<String> endpoints, List<String> contents, HashMap<String, List<String>> propertyHash, PrintWriter out){
+		int index=1;
+		int max = 0;
+		
+		String label = contents.get(0);
+		List<HashMap<String, String>> ret = new ArrayList<HashMap<String,String>>();
+
+		print(getCurrentTime()+"searching ["+label+"]");
+
+		for (String endpoint : endpoints){
+			print("*");
+			HashMap<String, String> properToResultHash = new HashMap<String, String>();
+			ret.add(properToResultHash);
+			// 繧ｨ繝ｳ繝峨�繧､繝ｳ繝医＃縺ｨ縺ｮ繝ｪ繧ｽ繝ｼ繧ｹ蜿門ｾ�
+			List<String> properties = propertyHash.get(endpoint);
+			if (properties != null){
+				HashMap<String, List<String>> results = getResource(endpoint, contents.get(index), properties);
+				if (max < results.size()){
+					max = results.size();
+				}
+				for (String property : results.keySet()){
+					// property縺斐→縺ｮ邨先棡
+					String result = getResult(results.get(property));
+					properToResultHash.put(property, result);
+				}
+			}
+			index++;
+		}
+		println();
+		
+		// TODO properToResultHash縺ｮ譛螟ｧ蛟､繧貞叙蠕励☆繧�
+		// 縺昴�謨ｰ縺縺題｡後ｒ霑ｽ蜉縺吶ｋ縲�
+		
+		/*      1,   endpoint1,          ,   endpoint2,           ,.....
+		 * label1, property1-1, object1-1, property2-1, object2-1 ,....o縲縲竊�
+		 * label1, property1-2, object1-2, property2-2, object2-2 ,....o 縺薙�遽�峇繧貞昇繧�
+		 * label1, property1-3, object1-3,            ,           ,....o縲縲竊�
+		 * label2, property1-4, object1-1, property2-3, object2-3 ,.....
+		 * label2, property1-5, object1-2, property2-4, object2-4 ,.....
+		 * label2,            ,          , property2-5, object2-5 ,.....
+		 */
+		
+		
+		for (int i=0; i<max; i++){
+			StringBuilder line = new StringBuilder();
+			line.append(label);
+			line.append(SEPARATOR);
+			int lp = 1;
+			for (HashMap<String, String> values : ret){
+				String[] hoge = values.keySet().toArray(new String[]{});
+				if (hoge.length > i && !contents.get(lp).trim().isEmpty()){
+					String resultProperty = hoge[i];
+					String resultObject = values.get(resultProperty);
+					line.append(contents.get(lp));
+					line.append(SEPARATOR);
+					line.append(resultProperty);
+					line.append(SEPARATOR);
+					line.append(resultObject);
+					line.append(SEPARATOR);
+				} else {
+					line.append(SEPARATOR);
+					line.append(SEPARATOR);
+					line.append(SEPARATOR);
+				}
+				lp++;
+			}
+			out.append(line.toString());
+			out.append("\n");
+		}
+		
+	}
+	
+	private String getResult(List<String> result){
+		if (result.size() == 0){
+			return "";
+		}
+		if (result.size() == 1){
+			return result.get(0);
+		}
+
+		StringBuilder sb = new StringBuilder();
+		for (int i=0; i<result.size()-1; i++){
+			sb.append(result.get(i));
+			sb.append("<>"); // TODO 繧ｻ繝代Ξ繝ｼ繧ｿ
+		}
+		sb.append(result.get(result.size()-1));
+		
+		return sb.toString();
+	}
+	
+	/**
+	 * 
+	 * @param endpoint
+	 * @param content
+	 * @param properties
+	 * @return property縺ｨ縺昴�result縺ｮmap
+	 */
+	private HashMap<String, List<String>> getResource(String endpoint, String content, List<String> properties){
+		HashMap<String, List<String>> ret = new HashMap<String, List<String>>();
+		PlainSparqlAccessor sa = accessorMap.get(endpoint);
+		for (String property : properties){
+			List<String> res = new ArrayList<String>();
+			ret.put(property, res);
+
+			if (!content.trim().isEmpty()){
+				String query = makeQuery(content, property);
+				try {
+					List<Map<String, RDFNode>> results = sa.executeQuery(query);
+					if (results != null){
+						for (Map<String, RDFNode> result : results){
+							RDFNode s = result.get("o");
+							res.add(s.toString());
+						}
+					}
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		
+		return ret;
+	}
+	
+	private String makeQuery(String s, String p){
+		return "select distinct ?o where {\n" +
+				"<" + s.trim() + "> <" + p.trim() + "> ?o \n" +
+				"}";
+
+	}
+	
+	public void addEndpoint(String endpoint){
+		EndpointSettings settings = EndpointSettingsManager.instance.getSetting(endpoint);
+		
+		PlainSparqlAccessor sa = new PlainSparqlAccessor(settings);
+		accessorMap.put(endpoint, sa);
+	}
+
+	private void setEndpoint(List<String> endpoints){
+		for (String ep : endpoints){
+			addEndpoint(ep);
+		}
+	}
+	
+	private List<String> getEndpoints(String line){
+		List<String> headers = FileUtil.splitLine(line, SEPARATOR);
+		
+		if (headers.size() > 0){
+			headers.remove(0);
+		}
+		
+		return headers;
+	}
+
+	private String getCurrentTime(){
+		Timestamp time = new Timestamp(new Date().getTime());
+		
+		return new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(time) + ":";
+	}
+
+	
+	private class QueryThread extends Thread {
+		
+		private Object option;
+		private CompareResultListener listener;
+		
+
+		public QueryThread(Object option, CompareResultListener listener){
+			this.option = option;
+			this.listener = listener;
+		}
+
+		protected Object getOption(){
+			return this.option;
+		}
+		
+		protected CompareResultListener getCompareResultListener(){
+			return this.listener;
+		}
+
+	}
+	
+	public static void main(String[] args){
+		String epFile = "C:\\Users\\kato\\Desktop\\out\\endp_prop.txt";
+		String inFile = "C:\\works\\daily\\20130926\\input\\蜍戊ｩ樒ｴ｢蠑�csv";
+		String outFile = "C:\\works\\daily\\20130926\\input\\蜍戊ｩ樒ｴ｢蠑廟out.csv";
+		
+		try {
+			/*
+			for (int i=0; i<args.length; i++){
+				if (args[i].startsWith("-") && i < (args.length-1)){
+					
+					if (args[i].equals("-o")){
+						outFile = args[i+1];
+					}
+					if (args[i].equals("-i")){
+						inFile = args[i+1];
+					}
+					if (args[i].equals("-e")){
+						epFile = args[i+1];
+					}
+					i++;
+				}
+				
+			}
+			*/
+			
+			EndpointSettings[] settings = EndpointSettings.inputXML(new FileInputStream("settings.xml"));
+			if (settings != null){
+				EndpointSettingsManager.instance.setSettings(settings);
+				
+			}
+
+			
+			if (epFile == null || inFile == null || outFile == null){
+				System.out.println("usage:java -jar SparqlTestTool.jar Compare -e endpointFile -i inputFile -o outputFile -t type(s:subject/l:label object/o:all object)");
+			} else {
+				CompareSubject ct = new CompareSubject(new File(inFile), new File(epFile));
+				ct.outputResult(new File(outFile));
+			}
+		} catch (UnsupportedEncodingException e) {
+			// TODO 閾ｪ蜍慕函謌舌＆繧後◆ catch 繝悶Ο繝�け
+			e.printStackTrace();
+		} catch (FileNotFoundException e) {
+			// TODO 閾ｪ蜍慕函謌舌＆繧後◆ catch 繝悶Ο繝�け
+			e.printStackTrace();
+		} catch (IOException e) {
+			// TODO 閾ｪ蜍慕函謌舌＆繧後◆ catch 繝悶Ο繝�け
+			e.printStackTrace();
+		}
+		
+	}
+
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/plugin/compare/CompareSubjectPanel.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/plugin/compare/CompareSubjectPanel.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/plugin/compare/CompareSubjectPanel.java (revision 9)
@@ -0,0 +1,421 @@
+package jp.ac.osaka_u.sanken.sparql.plugin.compare;
+
+import java.awt.GridBagLayout;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import javax.swing.JButton;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.EventQueue;
+import java.awt.GridBagConstraints;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.io.IOException;
+
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.JLabel;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+
+import jp.ac.osaka_u.sanken.sparql.SparqlQueryListener;
+
+public class CompareSubjectPanel extends JPanel {
+
+	private static final long serialVersionUID = 1L;
+	private JTextField epPropsTextField = null;  //  @jve:decl-index=0:visual-constraint="542,195"
+	private JButton endpointsButton = null;
+	private JTextField resourceCsvField = null;
+	private JButton wordsButton = null;
+	private JScrollPane logScrollPane = null;
+	private JTextArea logTextArea = null;
+	private JLabel epPropLabel = null;
+	private JLabel resourceCsvLabel = null;
+	private JButton executeButton = null;
+	private JPanel optPanel = null;
+	private JLabel outputLabel = null;
+	private JTextField outputTextField = null;
+	private JButton outputRefButton = null;
+	private Component parent;
+
+	/**
+	 * This is the default constructor
+	 */
+	public CompareSubjectPanel(Component parent) {
+		super();
+		initialize();
+		this.parent= parent;
+	}
+
+	/**
+	 * This method initializes this
+	 * 
+	 * @return void
+	 */
+	private void initialize() {
+		GridBagConstraints gridBagConstraints111 = new GridBagConstraints();
+		gridBagConstraints111.gridx = 2;
+		gridBagConstraints111.insets = new Insets(0, 0, 0, 10);
+		gridBagConstraints111.gridy = 3;
+		GridBagConstraints gridBagConstraints10 = new GridBagConstraints();
+		gridBagConstraints10.fill = GridBagConstraints.HORIZONTAL;
+		gridBagConstraints10.gridy = 3;
+		gridBagConstraints10.weightx = 1.0;
+		gridBagConstraints10.insets = new Insets(5, 10, 5, 0);
+		gridBagConstraints10.gridx = 1;
+		GridBagConstraints gridBagConstraints9 = new GridBagConstraints();
+		gridBagConstraints9.gridx = 0;
+		gridBagConstraints9.gridy = 3;
+		outputLabel = new JLabel("Output File");
+		GridBagConstraints gridBagConstraints8 = new GridBagConstraints();
+		gridBagConstraints8.gridx = 0;
+		gridBagConstraints8.gridwidth = 3;
+		gridBagConstraints8.fill = GridBagConstraints.HORIZONTAL;
+		gridBagConstraints8.gridy = 4;
+		GridBagConstraints gridBagConstraints5 = new GridBagConstraints();
+		gridBagConstraints5.gridx = 0;
+		gridBagConstraints5.insets = new Insets(0, 10, 0, 0);
+		gridBagConstraints5.gridy = 2;
+		resourceCsvLabel = new JLabel();
+		resourceCsvLabel.setText("resource csv File");
+		GridBagConstraints gridBagConstraints4 = new GridBagConstraints();
+		gridBagConstraints4.gridx = 0;
+		gridBagConstraints4.insets = new Insets(0, 10, 0, 0);
+		gridBagConstraints4.gridy = 0;
+		epPropLabel = new JLabel();
+		epPropLabel.setText("Endpoint-property List File");
+		GridBagConstraints gridBagConstraints3 = new GridBagConstraints();
+		gridBagConstraints3.fill = GridBagConstraints.BOTH;
+		gridBagConstraints3.gridy = 5;
+		gridBagConstraints3.weightx = 1.0;
+		gridBagConstraints3.weighty = 1.0;
+		gridBagConstraints3.insets = new Insets(10, 10, 10, 10);
+		gridBagConstraints3.gridwidth = 3;
+		gridBagConstraints3.gridx = 0;
+		GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
+		gridBagConstraints2.gridx = 2;
+		gridBagConstraints2.insets = new Insets(0, 0, 0, 10);
+		gridBagConstraints2.gridy = 2;
+		GridBagConstraints gridBagConstraints11 = new GridBagConstraints();
+		gridBagConstraints11.fill = GridBagConstraints.HORIZONTAL;
+		gridBagConstraints11.gridy = 2;
+		gridBagConstraints11.weightx = 1.0;
+		gridBagConstraints11.insets = new Insets(5, 10, 5, 0);
+		gridBagConstraints11.gridx = 1;
+		GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
+		gridBagConstraints1.fill = GridBagConstraints.NONE;
+		gridBagConstraints1.gridy = 0;
+		gridBagConstraints1.insets = new Insets(10, 0, 0, 10);
+		gridBagConstraints1.gridx = 2;
+		GridBagConstraints gridBagConstraints = new GridBagConstraints();
+		gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
+		gridBagConstraints.gridy = 0;
+		gridBagConstraints.insets = new Insets(14, 10, 5, 0);
+		gridBagConstraints.gridx = 1;
+		this.setLayout(new GridBagLayout());
+		this.add(getEpPropsTextField(), gridBagConstraints);
+		this.add(getEndpointsButton(), gridBagConstraints1);
+		this.add(getResourceCsvField(), gridBagConstraints11);
+		this.add(getWordsButton(), gridBagConstraints2);
+		this.add(getLogScrollPane(), gridBagConstraints3);
+		this.add(epPropLabel, gridBagConstraints4);
+		this.add(resourceCsvLabel, gridBagConstraints5);
+		this.add(getOptPanel(), gridBagConstraints8);
+		this.add(outputLabel, gridBagConstraints9);
+		this.add(getOutputTextField(), gridBagConstraints10);
+		this.add(getOutputRefButton(), gridBagConstraints111);
+	}
+
+	/**
+	 * This method initializes epPropsTextField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getEpPropsTextField() {
+		if (epPropsTextField == null) {
+			epPropsTextField = new JTextField();
+			epPropsTextField.setEditable(false);
+		}
+		return epPropsTextField;
+	}
+
+	/**
+	 * This method initializes endpointsButton	
+	 * 	
+	 * @return javax.swing.JButton	
+	 */
+	private JButton getEndpointsButton() {
+		if (endpointsButton == null) {
+			endpointsButton = new JButton("Ref");
+			endpointsButton.addActionListener(new ActionListener() {
+				
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					selectFile(getEpPropsTextField(), JFileChooser.OPEN_DIALOG);
+					validateExecute();
+				}
+			});
+		}
+		return endpointsButton;
+	}
+
+	/**
+	 * This method initializes resourceCsvField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getResourceCsvField() {
+		if (resourceCsvField == null) {
+			resourceCsvField = new JTextField();
+			resourceCsvField.setEditable(false);
+		}
+		return resourceCsvField;
+	}
+
+	/**
+	 * This method initializes wordsButton	
+	 * 	
+	 * @return javax.swing.JButton	
+	 */
+	private JButton getWordsButton() {
+		if (wordsButton == null) {
+			wordsButton = new JButton("Ref");
+			wordsButton.addActionListener(new ActionListener() {
+				
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					selectFile(getResourceCsvField(), JFileChooser.OPEN_DIALOG);
+					validateExecute();
+				}
+			});
+		}
+		return wordsButton;
+	}
+
+	/**
+	 * This method initializes logScrollPane	
+	 * 	
+	 * @return javax.swing.JScrollPane	
+	 */
+	private JScrollPane getLogScrollPane() {
+		if (logScrollPane == null) {
+			logScrollPane = new JScrollPane();
+			logScrollPane.setViewportView(getLogTextArea());
+		}
+		return logScrollPane;
+	}
+
+	/**
+	 * This method initializes logTextArea	
+	 * 	
+	 * @return javax.swing.JTextArea	
+	 */
+	private JTextArea getLogTextArea() {
+		if (logTextArea == null) {
+			logTextArea = new JTextArea();
+			logTextArea.getDocument().addDocumentListener(new DocumentListener() {
+				
+				@Override
+				public void removeUpdate(DocumentEvent arg0) {
+				}
+				
+				@Override
+				public void changedUpdate(DocumentEvent arg0) {
+				}
+				@Override
+				public void insertUpdate(DocumentEvent e) {
+					final Document doc = logTextArea.getDocument();
+					final Element root = doc.getDefaultRootElement();
+					if(root.getElementCount() <= 100){ // TODO 100縺ｯ繝吶ち譖ｸ縺�
+						return;
+					}
+					EventQueue.invokeLater(new Runnable() {
+						@Override
+						public void run() {
+							removeLines(doc, root);
+						}
+					});
+					logTextArea.setCaretPosition(doc.getLength());
+				}
+				private void removeLines(Document doc, Element root) {
+					Element fl = root.getElement(0);
+					try{
+						doc.remove(0, fl.getEndOffset());
+					}catch(BadLocationException ble) {
+						System.out.println(ble);
+					}
+				}
+			});
+		}
+		return logTextArea;
+	}
+	
+	void addLogText(String log){
+		String[] logs = log.split("\n");
+		for (String l : logs){
+//			getLogTextArea().append((getLogTextArea().getDocument().getLength() > 0) ? "\n" + l : l);
+			getLogTextArea().append(l);
+		}
+		if (log.endsWith("\n")){
+			getLogTextArea().append("\n");
+		}
+		
+		getLogTextArea().setCaretPosition(getLogTextArea().getDocument().getLength());
+	}
+
+
+	/**
+	 * This method initializes executeButton	
+	 * 	
+	 * @return javax.swing.JButton	
+	 */
+	private JButton getExecuteButton() {
+		if (executeButton == null) {
+			executeButton = new JButton("Execute");
+			executeButton.setEnabled(false);
+			executeButton.addActionListener(new ActionListener() {
+				
+				@Override
+				public void actionPerformed(ActionEvent arg0) {
+					if (getExecuteButton().getText().equals("Execute")){
+						setProcessing(true);
+						doCompare();
+					} else {
+						executeButton.setEnabled(false);
+						doStop();
+					}
+				}
+			});
+		}
+		return executeButton;
+	}
+
+	/**
+	 * This method initializes optPanel	
+	 * 	
+	 * @return javax.swing.JPanel	
+	 */
+	private JPanel getOptPanel() {
+		if (optPanel == null) {
+			optPanel = new JPanel();
+			optPanel.setLayout(new BorderLayout());
+			optPanel.add(getExecuteButton(), BorderLayout.EAST);
+		}
+		return optPanel;
+	}
+
+	private void selectFile(JTextField tf, int dialogType){
+		JFileChooser fileChooser = new JFileChooser("./");
+		fileChooser.setDialogType(dialogType);
+		// 繝輔ぃ繧､繝ｫ驕ｸ謚樒ｵ先棡蜿門ｾ�
+		int result = fileChooser.showOpenDialog(this);
+		File file = fileChooser.getSelectedFile();
+		if (result == JFileChooser.CANCEL_OPTION || file == null) {
+			// 繧ｭ繝｣繝ｳ繧ｻ繝ｫ謚ｼ荳九√∪縺溘�縲√ヵ繧｡繧､繝ｫ驕ｸ謚槭↑縺励�縺溘ａ菴輔ｂ縺励↑縺�
+			return;
+		}
+		
+		try {
+			tf.setText(file.getCanonicalPath());
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	private void validateExecute(){
+		boolean enable = true;
+		if (getEpPropsTextField().getText().isEmpty() ||
+				getResourceCsvField().getText().isEmpty() || 
+				getOutputTextField().getText().isEmpty()){
+			enable = false;
+		}
+		getExecuteButton().setEnabled(enable);
+	}
+
+	CompareSubject compare = null;
+	
+	private void doCompare(){
+		compare = new CompareSubject(new File(getResourceCsvField().getText()), new File(getEpPropsTextField().getText()), new SparqlQueryListener() {
+			
+			@Override
+			public void sparqlExecuted(String query) {
+				addLogText(query);
+			}
+		});
+
+		compare.outputResult(new File(getOutputTextField().getText()), new CompareResultListener() {
+
+			@Override
+			public void uncaughtException(Thread thread, Throwable e) {
+				JOptionPane.showMessageDialog(parent, "Execute error:"+e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
+				setProcessing(false);
+			}
+
+			@Override
+			public void resultReceived(boolean result) {
+				setProcessing(false);
+			}
+		});
+	}
+	
+	private void doStop(){
+		if (compare != null){
+			compare.stop();
+		}
+	}
+	
+
+	private void setProcessing(boolean isProcess){
+		this.getEndpointsButton().setEnabled(!isProcess);
+		this.getWordsButton().setEnabled(!isProcess);
+		this.getOutputRefButton().setEnabled(!isProcess);
+		if (isProcess){
+			this.getExecuteButton().setText("Stop");
+		} else {
+			this.getExecuteButton().setText("Execute");
+		}
+		this.getExecuteButton().setEnabled(true);
+	}
+	
+	/**
+	 * This method initializes outputTextField	
+	 * 	
+	 * @return javax.swing.JTextField	
+	 */
+	private JTextField getOutputTextField() {
+		if (outputTextField == null) {
+			outputTextField = new JTextField();
+			outputTextField.setEditable(false);
+		}
+		return outputTextField;
+	}
+
+	/**
+	 * This method initializes RefButton	
+	 * 	
+	 * @return javax.swing.JButton	
+	 */
+	private JButton getOutputRefButton() {
+		if (outputRefButton == null) {
+			outputRefButton = new JButton("Ref");
+			outputRefButton.addActionListener(new ActionListener() {
+				
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					selectFile(getOutputTextField(), JFileChooser.SAVE_DIALOG);
+					validateExecute();
+				}
+			});
+		}
+		return outputRefButton;
+	}
+	
+}  //  @jve:decl-index=0:visual-constraint="10,10"
Index: BH13SPARQLBuilder/src/hozo/sparql/plugin/compare/CompareResultListener.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/plugin/compare/CompareResultListener.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/plugin/compare/CompareResultListener.java (revision 9)
@@ -0,0 +1,12 @@
+package jp.ac.osaka_u.sanken.sparql.plugin.compare;
+
+import java.lang.Thread.UncaughtExceptionHandler;
+
+/**
+ * Sparql繧堤峡遶亀hread縺ｧ螳溯｡後☆繧矩圀縲∫ｵ先棡繧貞叙蠕励☆繧九◆繧√�Listener
+ * @author kato
+ *
+ */
+public interface CompareResultListener extends UncaughtExceptionHandler{
+	public void resultReceived(boolean result);
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/plugin/compare/FileUtil.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/plugin/compare/FileUtil.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/plugin/compare/FileUtil.java (revision 9)
@@ -0,0 +1,62 @@
+package jp.ac.osaka_u.sanken.sparql.plugin.compare;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+
+public class FileUtil {
+
+	
+	public static List<String> readFileText(File file, String encode){
+		List<String> ret = new ArrayList<String>();
+		try {
+			BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), encode));
+			
+			String line;
+			line = br.readLine();
+			while (line != null){
+				ret.add(line);
+				line = br.readLine();
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		
+		return ret;
+	}
+	
+	public static List<String> splitLine(String line, String separator){
+		// 繝ｻ""縺ｧ蝗ｲ縺ｾ繧後※縺�ｌ縺ｰ菴輔′縺ゅｍ縺�′繝ｯ繝ｳ繧ｻ繝�ヨ
+		// 繝ｻ繧ｻ繝代Ξ繝ｼ繧ｿ繝ｼ縺ｧ蛹ｺ蛻�ｉ繧後◆縺ｨ縺薙ｍ縺ｧ蛻�牡
+		// 繝ｻ""縺ｯ蜑企勁縺吶ｋ
+		List<String> ret = new ArrayList<String>();
+		StringBuilder sb = new StringBuilder();
+		boolean literal = false;
+		boolean sep = false;
+		
+		for (int i=0; i<line.length(); i++){
+			String chr = line.substring(i, i+1);
+			
+			if (chr.equals("\"")){
+				sep = false;
+				literal = !literal;
+			} else if (chr.equals(separator) && !literal){
+				sep = true;
+				ret.add(sb.toString());
+				sb = new StringBuilder();
+			} else {
+				sep = false;
+				sb.append(chr);
+			}
+		}
+		if (sb.length() > 0 || sep){
+			ret.add(sb.toString());
+		}
+		
+		return ret;
+	}
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/SeparatedValuesExporter.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/SeparatedValuesExporter.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/SeparatedValuesExporter.java (revision 9)
@@ -0,0 +1,92 @@
+package jp.ac.osaka_u.sanken.sparql;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.util.List;
+import java.util.Map;
+
+import com.hp.hpl.jena.rdf.model.RDFNode;
+
+/**
+ * 繧ｻ繝代Ξ繝ｼ繧ｿ縺ｫ繧医▲縺ｦ蛹ｺ蛻�ｉ繧後◆蠖｢縺ｧ繝��繧ｿ繧偵お繧ｯ繧ｹ繝昴�繝医☆繧九◆繧√�繧ｯ繝ｩ繧ｹ
+ * @author kato
+ *
+ */
+public class SeparatedValuesExporter {
+	
+	private String separator;
+	private List<Map<String, RDFNode>> data;
+	
+	public SeparatedValuesExporter(String separator, List<Map<String, RDFNode>> data){
+		this.separator = separator;
+		this.data = data;
+	}
+
+	public boolean export(File file) throws IOException{
+		return export(new FileOutputStream(file));
+	}
+
+	public boolean export(OutputStream stream) throws IOException{
+		
+		PrintWriter pw = new PrintWriter(new OutputStreamWriter(stream));
+
+		if (!outputHeader(pw, data.get(0))){
+			pw.flush();
+			pw.close();
+			return false;
+		}
+		
+		for (Map<String, RDFNode> datum : data){
+			outputContent(pw, datum);
+		}
+		pw.flush();
+		pw.close();
+		
+		return false;
+	}
+	
+	private boolean outputHeader(PrintWriter stream, Map<String, RDFNode> columns){
+		StringBuilder sb = new StringBuilder();
+		
+		int i = 0;
+		for (String key : columns.keySet()){
+			sb.append(key);
+			if (++i != columns.keySet().size()){
+				sb.append(getSeparator());
+			}
+		}
+		
+		outputLine(stream, sb.toString());
+		
+		return true;
+	}
+
+	private boolean outputContent(PrintWriter stream, Map<String, RDFNode> row){
+		StringBuilder sb = new StringBuilder();
+		
+		int i = 0;
+		for (String key : row.keySet()){
+			sb.append(row.get(key));
+			if (++i != row.keySet().size()){
+				sb.append(getSeparator());
+			}
+		}
+		
+		outputLine(stream, sb.toString());
+		
+		return true;
+	}
+
+	private String getSeparator(){
+		return this.separator;
+	}
+	
+	private void outputLine(PrintWriter stream, String line){
+		stream.println(line);
+	}
+	
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/SparqlAccessor.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/SparqlAccessor.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/SparqlAccessor.java (revision 9)
@@ -0,0 +1,54 @@
+package jp.ac.osaka_u.sanken.sparql;
+
+import java.util.List;
+import java.util.Map;
+
+import com.hp.hpl.jena.rdf.model.RDFNode;
+
+public interface SparqlAccessor {
+
+	/** 繧ｭ繝ｼ繝ｯ繝ｼ繝画､懃ｴ｢縺ｧ縲��岼縺吶∋縺ｦ繧呈､懃ｴ｢蟇ｾ雎｡縺ｨ縺吶ｋ�域悴螳溯｣�ｼ�*/
+	public static final int FIND_TARGET_ALL = 0;
+	/** 繧ｭ繝ｼ繝ｯ繝ｼ繝画､懃ｴ｢縺ｧ縲《ubject繧呈､懃ｴ｢蟇ｾ雎｡縺ｨ縺吶ｋ */
+	public static final int FIND_TARGET_SUBJECT = 1;
+	/** 繧ｭ繝ｼ繝ｯ繝ｼ繝画､懃ｴ｢縺ｧ縲｛bject繧呈､懃ｴ｢蟇ｾ雎｡縺ｨ縺吶ｋ */
+	public static final int FIND_TARGET_OBJECT = 2;
+	/** 繧ｭ繝ｼ繝ｯ繝ｼ繝画､懃ｴ｢縺ｧ縲√Λ繝吶Νobject繧呈､懃ｴ｢蟇ｾ雎｡縺ｨ縺吶ｋ */
+	public static final int FIND_TARGET_SPECIFIC_OBJECT = 3;
+
+	/**
+	 * Sparql Query繧堤峩謗･謖�ｮ壹＠縺ｦ螳溯｡後＠縲∫ｵ先棡繧定ｿ斐☆
+	 * @param queryString
+	 * @return
+	 * @throws Exception
+	 */
+	public List<Map<String, RDFNode>> executeQuery(String queryString) throws Exception;
+
+	/**
+	 * 譁�ｭ怜�縺ｫ隧ｲ蠖薙☆繧鬼ubject繧呈､懃ｴ｢縺励※邨先棡繧定ｿ斐☆
+	 * @param word
+	 * @param fullMatch
+	 * @param limit
+	 * @param offset
+	 * @param type
+	 * @return
+	 * @throws Exception
+	 */
+	public SparqlResultSet findSubject(String word, boolean fullMatch, Integer limit, Integer offset, int type, String[] propList) throws Exception;
+
+	/**
+	 * Subject縺ｫ繝偵ャ繝医☆繧亀riple繧呈､懃ｴ｢縺励※邨先棡繧定ｿ斐☆
+	 * @param subject
+	 * @return
+	 * @throws Exception
+	 */
+	public List<Map<String, RDFNode>> findTripleFromSubject(String subject) throws Exception;
+
+	/**
+	 * property縺ｮ荳隕ｧ繧貞叙蠕励☆繧�
+	 * @return
+	 * @throws Exception
+	 */
+	public List<Map<String, RDFNode>> findPropertyList() throws Exception;
+
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/ThreadedSparqlAccessor.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/ThreadedSparqlAccessor.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/ThreadedSparqlAccessor.java (revision 9)
@@ -0,0 +1,44 @@
+package jp.ac.osaka_u.sanken.sparql;
+
+
+
+public interface ThreadedSparqlAccessor extends SparqlAccessor {
+
+	/**
+	 * Sparql Query繧堤峩謗･謖�ｮ壹＠縺ｦ螳溯｡後＠縲∫ｵ先棡繧定ｿ斐☆
+	 * @param queryString
+	 * @param resultListener
+	 * @return Thread髢句ｧ九＠縺溘°
+	 */
+	public boolean executeQuery(String queryString, SparqlResultListener resultListener);
+
+	/**
+	 * 譁�ｭ怜�縺ｫ隧ｲ蠖薙☆繧鬼ubject繧呈､懃ｴ｢縺励※邨先棡繧定ｿ斐☆
+	 * @param word
+	 * @param fullMatch
+	 * @param limit
+	 * @param offset
+	 * @param type
+	 * @param propList
+	 * @param resultListener
+	 * @return Thread髢句ｧ九＠縺溘°
+	 */
+	public boolean findSubject(String word, boolean fullMatch, Integer limit, Integer offset, int type, String[] propList, SparqlResultListener resultListener);
+
+	/**
+	 * Subject縺ｫ繝偵ャ繝医☆繧亀riple繧呈､懃ｴ｢縺励※邨先棡繧定ｿ斐☆
+	 * @param subject
+	 * @param listener
+	 * @return Thread髢句ｧ九＠縺溘°
+	 */
+	public boolean findTripleFromSubject(String subject, SparqlResultListener listener);
+
+
+	/**
+	 * property縺ｮ荳隕ｧ繧貞叙蠕励☆繧�
+	 * @param listener
+	 * @return Thread髢句ｧ九＠縺溘°
+	 */
+	public boolean  findPropertyList(SparqlResultListener listener);
+
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/EndpointSettingsManager.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/EndpointSettingsManager.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/EndpointSettingsManager.java (revision 9)
@@ -0,0 +1,78 @@
+package jp.ac.osaka_u.sanken.sparql;
+
+import java.util.HashMap;
+
+public class EndpointSettingsManager {
+
+	
+	
+	private HashMap<String, EndpointSettings> settingMap;
+	
+	private boolean isChanged = false;
+	
+	public static final EndpointSettingsManager instance = new EndpointSettingsManager();
+	
+	private EndpointSettingsManager(){
+		
+		settingMap = new HashMap<String, EndpointSettings>();
+	}
+
+	public EndpointSettings getSetting(String endpoint){
+		EndpointSettings setting = settingMap.get(endpoint);
+		if (setting == null){
+			isChanged = true;
+			setting = new EndpointSettings(endpoint);
+			settingMap.put(endpoint, setting);
+		}
+		return setting;
+		
+	}
+	
+	public EndpointSettings[] getSettings(){
+		return settingMap.values().toArray(new EndpointSettings[]{});
+	}
+
+	public void setSettings(EndpointSettings[] settings){
+		settingMap = new HashMap<String, EndpointSettings>();
+		
+		for (EndpointSettings setting : settings){
+			settingMap.put(setting.getEndpoint(), setting);
+		}
+	}
+
+	public boolean removeSetting(String endpoint){
+		EndpointSettings removed = settingMap.remove(endpoint);
+		
+		if (removed != null){
+			isChanged = true;
+		}
+		
+		return (removed != null);
+	}
+	
+	public boolean isChanged(){
+		if (isChanged){
+			return true;
+		}
+
+		for (EndpointSettings setting : getSettings()){
+			if (setting.isChanged()){
+				isChanged = true;
+				break;
+			}
+		}
+		
+		return isChanged;
+	}
+	
+	public void resetChanged(){
+		this.isChanged = false;
+
+		for (EndpointSettings setting : getSettings()){
+			setting.resetChanged();
+		}
+
+	}
+
+
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/util/EditableListItem.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/util/EditableListItem.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/util/EditableListItem.java (revision 9)
@@ -0,0 +1,26 @@
+package jp.ac.osaka_u.sanken.util;
+
+/**
+ * EditableList縺ｮ鬆�岼<br/>
+ * 迴ｾ螳溯｣�〒縺ｯString髯仙ｮ�
+ * @author mouse
+ *
+ */
+public class EditableListItem {
+	public final String text;
+	public final boolean deleteable;
+
+	/**
+	 *
+	 * @param text
+	 * @param deleteable
+	 */
+	public EditableListItem(String text, boolean deleteable) {
+		this.text = text;
+		this.deleteable = deleteable;
+	}
+	@Override
+	public String toString() {
+		return text;
+	}
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/util/StringUtil.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/util/StringUtil.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/util/StringUtil.java (revision 9)
@@ -0,0 +1,88 @@
+package jp.ac.osaka_u.sanken.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class StringUtil {
+
+	/**
+	 * 譁�ｭ怜�繧定ｪｭ轤ｹ縺ｧ蛹ｺ蛻�▲縺ｦhtml譁�ｭ怜�縺ｫ螟画鋤縺吶ｋ
+	 * @param str
+	 * @return
+	 */
+	public static String makeHtmlString(String str){
+		return makeHtmlString(splitString(str));
+	}
+
+	/**
+	 * 譁�ｭ怜�繧檀tml譁�ｭ怜�縺ｫ螟画鋤縺吶ｋ
+	 * @param strs
+	 * @return
+	 */
+	public static String makeHtmlString(String[] strs){
+		StringBuilder sb = new StringBuilder();
+		sb.append("<html>");
+		for (int i=0; i<strs.length; i++){
+			String str = strs[i];
+			sb.append(str);
+			if (i != strs.length-1){
+				sb.append("<br>");
+			}
+		}
+		sb.append("</html>");
+		return sb.toString();
+	}
+
+	/**
+	 * 譁�ｭ怜�繧定ｪｭ轤ｹ縺ｧ蛻�牡縺吶ｋ
+	 * @param str
+	 * @return
+	 */
+	public static String[] splitString(String str){
+		String[] ret;
+		ret = splitString(str, "縲�);
+		ret = splitString(ret, "\\. ");
+		return ret;
+	}
+
+	private static String[] splitString(String str, String sep){
+		return splitString(new String[]{str}, sep);
+	}
+
+	private static String[] splitString(String[] strs, String sep){
+		List<String> ret = new ArrayList<String>();
+		String sepTmp = sep.replace("\\", "");
+		for (String str : strs){
+			boolean endSep = str.endsWith(sepTmp);
+			String[] tmps = str.split(sep);
+			for (int i=0; i<tmps.length; i++){
+				String tmp = tmps[i];
+				if (i != tmps.length-1 || endSep){
+					ret.add(tmp + sepTmp);
+				} else {
+					ret.add(tmp);
+				}
+			}
+		}
+		return ret.toArray(new String[0]);
+	}
+
+	/**
+	 * 謖�ｮ壹＠縺滓枚蟄怜�荳隕ｧ縺ｮ荳ｭ縺九ｉ縲∵欠螳壹＠縺滓枚蟄励ｒ蜷ｫ繧繧ゅ�縺縺代ｒ霑斐☆
+	 * @param list
+	 * @param word
+	 * @return
+	 */
+	public static List<String> getPartHitString(List<String> list, String word){
+		List<String> ret = new ArrayList<String>();
+		if (list == null){
+			return ret;
+		}
+		for (String item : list){
+			if (item.contains(word)){
+				ret.add(item);
+			}
+		}
+		return ret;
+	}
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/util/EditableList.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/util/EditableList.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/util/EditableList.java (revision 9)
@@ -0,0 +1,277 @@
+package jp.ac.osaka_u.sanken.util;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+
+import javax.swing.DefaultListModel;
+import javax.swing.ImageIcon;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JTextField;
+import javax.swing.ListCellRenderer;
+import javax.swing.ListModel;
+import javax.swing.event.ListSelectionListener;
+
+/**
+ * 鬆�岼縺ｮ霑ｽ蜉繝ｻ蜑企勁蜿ｯ閭ｽ縺ｪ繝ｪ繧ｹ繝�
+ * @author mouse
+ *
+ */
+public class EditableList extends JPanel {
+	/**
+	 *
+	 */
+	private static final long serialVersionUID = 8390493649442688888L;
+
+	private EditableListList list;
+
+	private JTextField textField;
+
+	public EditableList(){
+		this(new DefaultListModel());
+	}
+
+	/**
+	 * 繝｢繝�Ν繧呈欠螳壹＠縺ｦ繝ｪ繧ｹ繝育函謌�
+	 * @param model
+	 */
+	public EditableList(ListModel model){
+		this.list = new EditableListList(model);
+		this.list.setFixedCellHeight(26);
+		initialize();
+	}
+
+	/**
+	 * 繝ｪ繧ｹ繝医う繝吶Φ繝郁ｿｽ蜉蟋碑ｭｲ
+	 * @param l
+	 */
+	public void addListSelectionListener(ListSelectionListener l){
+		this.list.addListSelectionListener(l);
+	}
+
+	/**
+	 * 繝ｪ繧ｹ繝医う繝吶Φ繝亥炎髯､蟋碑ｭｲ
+	 * @param l
+	 */
+	public void removeListSelectionListener(ListSelectionListener l){
+		this.list.removeListSelectionListener(l);
+	}
+
+	/**
+	 * 繝｢繝�Ν蜿門ｾ怜ｧ碑ｭｲ
+	 * @return
+	 */
+	public ListModel getModel(){
+		return list.getModel();
+	}
+
+	/**
+	 * 鬆�岼霑ｽ蜉逕ｨ繝�く繧ｹ繝医ヵ繧｣繝ｼ繝ｫ繝牙叙蠕�
+	 * @return
+	 */
+	public JTextField getTextField(){
+		if (textField == null){
+			textField = new JTextField();
+			textField.addActionListener(new ActionListener() {
+
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					addCurrentItem();
+				}
+			});
+		}
+		return textField;
+	}
+
+
+	private void initialize(){
+		this.setLayout(new BorderLayout());
+		this.add(list, BorderLayout.CENTER);
+		this.add(getTextField(), BorderLayout.SOUTH);
+	}
+
+	/**
+	 * 驕ｩ蛻�↑繧ｵ繧､繧ｺ繧定ｿ斐☆��ODO 迴ｾ螳溯｣�〒縺ｯ讓ｪ蟷�00蝗ｺ螳夲ｼ�
+	 */
+	public Dimension getPreferredSize(){
+		return new Dimension(400, (list.getModel().getSize()) * list.getFixedCellHeight() + getTextField().getPreferredSize().height);
+	}
+
+	private void addCurrentItem(){
+		String word = getTextField().getText();
+
+		if (word.trim().isEmpty()){
+			return;
+		}
+		boolean exists = false;
+		for (int i=0; i<list.getModel().getSize(); i++){
+			Object obj = list.getModel().getElementAt(i);
+			if (obj.toString().equals(word)){
+				exists = true;
+				break;
+			}
+		}
+		if (!exists){
+			((DefaultListModel)list.getModel()).addElement(new EditableListItem(word, true));
+			getTextField().setText("");
+		}
+	}
+
+	class EditableListList extends JList {
+		/**
+		 *
+		 */
+		private static final long serialVersionUID = -8207275088256642406L;
+		private EditableCellRenderer renderer;
+
+		public EditableListList() {
+			super();
+
+			this.putClientProperty("List.isFileList", Boolean.TRUE);
+		}
+
+		public EditableListList(ListModel model) {
+			super(model);
+			this.putClientProperty("List.isFileList", Boolean.TRUE);
+		}
+
+
+		public void updateUI() {
+			setForeground(null);
+			setBackground(null);
+			setSelectionForeground(null);
+			setSelectionBackground(null);
+			if(renderer != null) {
+				removeMouseListener(renderer);
+				removeMouseMotionListener(renderer);
+			}
+			super.updateUI();
+			renderer = new EditableCellRenderer();
+			setCellRenderer(renderer);
+			addMouseListener(renderer);
+			addMouseMotionListener(renderer);
+		}
+
+		private boolean pointOutsidePrefSize(Point p) {
+			int index = locationToIndex(p);
+			DefaultListModel m = (DefaultListModel)getModel();
+			if (index < 0){
+				return false;
+			}
+			Object n = m.get(index);
+			Component c = getCellRenderer().getListCellRendererComponent(
+					this, n, index, false, false);
+			c.doLayout();
+			Dimension d = c.getPreferredSize();
+			Rectangle rect = getCellBounds(index, index);
+			rect.width = d.width;
+			return index < 0 || !rect.contains(p);
+		}
+		@Override
+		protected void processMouseEvent(MouseEvent e) {
+			if(!pointOutsidePrefSize(e.getPoint())) {
+				super.processMouseEvent(e);
+			}
+		}
+		@Override
+		protected void processMouseMotionEvent(MouseEvent e) {
+			if(!pointOutsidePrefSize(e.getPoint())) {
+				super.processMouseMotionEvent(e);
+			}else{
+				e = new MouseEvent(
+						(Component)e.getSource(), MouseEvent.MOUSE_EXITED, e.getWhen(),
+						e.getModifiers(), e.getX(), e.getY(),
+						e.getXOnScreen(), e.getYOnScreen(),
+						e.getClickCount(), e.isPopupTrigger(), MouseEvent.NOBUTTON);
+				super.processMouseEvent(e);
+			}
+		}
+	}
+
+	class EditableCellRenderer extends JPanel implements ListCellRenderer, MouseListener, MouseMotionListener {
+		/**
+		 *
+		 */
+		private static final long serialVersionUID = 5134902478737266926L;
+
+		private final JRadioButton button;
+
+		public EditableCellRenderer(){
+			button = new JRadioButton(new ImageIcon(getClass().getResource("x.png")));
+			button.setSelectedIcon(new ImageIcon(getClass().getResource("blank.png")));
+		}
+
+		@Override
+		public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
+			Component ret;
+
+			if(value instanceof EditableListItem) {
+				button.setSelected(!((EditableListItem)value).deleteable);
+			} else {
+				button.setSelected(false);
+			}
+
+			button.setBackground(list.getBackground());
+			button.setForeground(list.getForeground());
+			button.setText(value.toString());
+			ret = button;
+
+			return ret;
+		}
+
+
+		@Override
+		public void mouseExited(MouseEvent e) {
+		}
+
+		@Override
+		public void mouseClicked(MouseEvent e) {
+			if(e.getButton()==MouseEvent.BUTTON1) {
+				JList l = (JList)e.getComponent();
+				DefaultListModel m = (DefaultListModel)l.getModel();
+				Point p = e.getPoint();
+				int index  = l.locationToIndex(p);
+				if(index>=0) {
+					Object value = m.get(index);
+					if(value instanceof EditableListItem) {
+						if (!((EditableListItem)value).deleteable){
+							return;
+						}
+					}
+					((DefaultListModel)l.getModel()).remove(index);
+					Rectangle rect = l.getCellBounds(index, index);
+					if (rect != null){
+						l.repaint(rect);
+					}
+				}
+			}
+		}
+
+		@Override
+		public void mouseMoved(MouseEvent e) {
+		}
+
+
+
+		@Override
+		public void mouseEntered(MouseEvent e) {}
+
+		@Override
+		public void mousePressed(MouseEvent e) {}
+
+		@Override
+		public void mouseReleased(MouseEvent e) {}
+
+		@Override
+		public void mouseDragged(MouseEvent e) {}
+	}
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/util/Version.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/util/Version.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/util/Version.java (revision 9)
@@ -0,0 +1,22 @@
+package jp.ac.osaka_u.sanken;
+
+import java.text.ParseException;
+import java.util.Date;
+
+import com.ibm.icu.text.SimpleDateFormat;
+
+public abstract class Version {
+	public abstract String getVersion();
+	
+	public final Date getDate(){
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+		try {
+			return sdf.parse(getDateString());
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	
+	protected abstract String getDateString();
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/util/CheckableListItem.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/util/CheckableListItem.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/util/CheckableListItem.java (revision 9)
@@ -0,0 +1,24 @@
+package jp.ac.osaka_u.sanken.util;
+
+/**
+	 * 繝√ぉ繝�け蜿ｯ閭ｽ繝ｪ繧ｹ繝医�鬆�岼<br/>
+	 * 迴ｾ螳溯｣�〒縺ｯString髯仙ｮ�
+ * @author mouse
+ *
+ */
+public class CheckableListItem {
+	public final String text;
+	public final boolean selected;
+	/**
+	 * @param text
+	 * @param selected
+	 */
+	public CheckableListItem(String text, boolean selected) {
+		this.text = text;
+		this.selected = selected;
+	}
+	@Override
+	public String toString() {
+		return text;
+	}
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/util/CheckableList.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/util/CheckableList.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/util/CheckableList.java (revision 9)
@@ -0,0 +1,119 @@
+package jp.ac.osaka_u.sanken.util;
+
+import java.awt.Component;
+import java.awt.Point;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+
+import javax.swing.DefaultListModel;
+import javax.swing.JCheckBox;
+import javax.swing.JList;
+import javax.swing.ListCellRenderer;
+import javax.swing.ListModel;
+
+public class CheckableList extends JList {
+	/**
+	 *
+	 */
+	private static final long serialVersionUID = -8207275088256642406L;
+	private CheckBoxCellRenderer renderer;
+
+	public CheckableList() {
+		this(new DefaultListModel());
+	}
+
+	public CheckableList(ListModel model) {
+		super(model);
+	}
+
+
+	public void updateUI() {
+		setForeground(null);
+		setBackground(null);
+		setSelectionForeground(null);
+		setSelectionBackground(null);
+		if(renderer!=null) {
+			removeMouseListener(renderer);
+			removeMouseMotionListener(renderer);
+		}
+		super.updateUI();
+		renderer = new CheckBoxCellRenderer();
+		setCellRenderer(renderer);
+		addMouseListener(renderer);
+		addMouseMotionListener(renderer);
+	}
+}
+
+class CheckBoxCellRenderer extends JCheckBox implements ListCellRenderer, MouseListener, MouseMotionListener {
+	/**
+	 *
+	 */
+	private static final long serialVersionUID = 5134902478737266926L;
+	private int rollOverRowIndex = -1;
+
+	@Override
+	public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
+		this.setOpaque(true);
+		if(isSelected) {
+			this.setBackground(list.getSelectionBackground());
+			this.setForeground(list.getSelectionForeground());
+		}else{
+			this.setBackground(list.getBackground());
+			this.setForeground(list.getForeground());
+		}
+		if(value instanceof CheckableListItem) {
+			this.setSelected(((CheckableListItem)value).selected);
+			this.getModel().setRollover(index==rollOverRowIndex);
+		}
+		this.setText(value.toString());
+		return this;
+	}
+
+	@Override
+	public void mouseExited(MouseEvent e) {
+		JList l = (JList)e.getSource();
+		if(rollOverRowIndex>=0) {
+			l.repaint(l.getCellBounds(rollOverRowIndex, rollOverRowIndex));
+			rollOverRowIndex = -1;
+		}
+	}
+
+	@Override
+	public void mouseClicked(MouseEvent e) {
+		if(e.getButton()==MouseEvent.BUTTON1) {
+			JList l = (JList)e.getComponent();
+			DefaultListModel m = (DefaultListModel)l.getModel();
+			Point p = e.getPoint();
+			int index  = l.locationToIndex(p);
+			if(index>=0) {
+				CheckableListItem n = (CheckableListItem)m.get(index);
+				m.set(index, new CheckableListItem(n.text, !n.selected));
+				l.repaint(l.getCellBounds(index, index));
+			}
+		}
+	}
+
+	@Override
+	public void mouseMoved(MouseEvent e) {
+		JList l = (JList)e.getSource();
+		int index = l.locationToIndex(e.getPoint());
+		if(index != rollOverRowIndex) {
+			rollOverRowIndex = index;
+			l.repaint();
+		}
+	}
+
+	@Override
+	public void mouseEntered(MouseEvent e) {}
+
+	@Override
+	public void mousePressed(MouseEvent e) {}
+
+	@Override
+	public void mouseReleased(MouseEvent e) {}
+
+	@Override
+	public void mouseDragged(MouseEvent e) {}
+}
+
Index: BH13SPARQLBuilder/src/hozo/sparql/SparqlQueryListener.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/SparqlQueryListener.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/SparqlQueryListener.java (revision 9)
@@ -0,0 +1,11 @@
+package jp.ac.osaka_u.sanken.sparql;
+
+/**
+ * 螳溯｡後☆繧客uery繧貞叙蠕励☆繧九◆繧√�Listener
+ * @author kato
+ *
+ */
+public interface SparqlQueryListener {
+	public void sparqlExecuted(String query);
+
+}
Index: BH13SPARQLBuilder/src/hozo/sparql/CoreVersion.java
===================================================================
--- BH13SPARQLBuilder/src/hozo/sparql/CoreVersion.java (revision 9)
+++ BH13SPARQLBuilder/src/hozo/sparql/CoreVersion.java (revision 9)
@@ -0,0 +1,24 @@
+package jp.ac.osaka_u.sanken.sparql;
+
+import jp.ac.osaka_u.sanken.Version;
+
+/**
+ * Version
+ * 
+ * 1.0.0 2013/08/22 new 
+ * 1.0.1 2013/09/20 bug fix
+ * 1.1.0 2013/10/10 made a factory for making accessor
+ * @author kato
+ *
+ */
+public class CoreVersion extends Version {
+	@Override
+	public String getVersion(){
+		return "1.1.0";
+	}
+	
+	@Override
+	protected String getDateString() {
+		return "20131010";
+	}
+}
