package com.javaxyq.tools; import javax.swing.*; import com.javaxyq.util.HashUtil; import java.awt.*; import java.awt.event.*; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Formatter; import java.util.List; import java.util.Map; import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ResourcePathMatchTool extends JFrame { private JPanel contentPane; private JButton buttonStart; private JButton buttonClose; private JTextArea pathRuleTextArea; private JTextField filenameTextField; private JButton browserButton; private JTextArea resultTextArea; private JButton buttonStop; private String lastDirectoryPath; private WdfFile wdfFile; private JFileChooser chooser; public ResourcePathMatchTool() { setContentPane(contentPane); getRootPane().setDefaultButton(buttonStart); buttonStart.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onStart(); } }); buttonClose.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onClose(); } }); // call onClose() when cross is clicked setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { onClose(); } }); // call onClose() on ESCAPE contentPane.registerKeyboardAction(new ActionListener() { public void actionPerformed(ActionEvent e) { // onClose(); } }, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); browserButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onBrowserFile(); } }); buttonStop.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { onStop(); } }); } private void onBrowserFile() { if (chooser == null) { chooser = new JFileChooser(lastDirectoryPath); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); } int rtv = chooser.showOpenDialog(top()); if (rtv == JFileChooser.APPROVE_OPTION) { File file = chooser.getSelectedFile(); filenameTextField.setText(file.getPath()); } } private ResourcePathMatchTool top() { return ResourcePathMatchTool.this; } private void onStart() { //����·������ String pathRule = pathRuleTextArea.getText().trim(); if (pathRule.isEmpty()) { JOptionPane.showMessageDialog(top(), "��������ȷ��·������"); return; } System.out.println("path rule: " + pathRule); List<String> templateFragments = new ArrayList<String>(); List<RuleUnit> ruleUnits = new ArrayList<RuleUnit>(); String ruleEx = "\\{[^\\{\\}]*\\}"; Pattern pattern = Pattern.compile(ruleEx); Matcher matcher = pattern.matcher(pathRule); int lastPos = 0; while (matcher.find()) { int start = matcher.start(); int end = matcher.end(); templateFragments.add(pathRule.substring(lastPos, start)); lastPos = end; String express = matcher.group(); RuleUnit ruleUnit = parseUnit(express); if (ruleUnit != null) { ruleUnits.add(ruleUnit); System.out.println("parse: " + express + " => " + ruleUnit); } else { System.err.println("�������ʽʧ�ܣ�" + express); break; } } templateFragments.add(pathRule.substring(lastPos)); //��wdf�ļ� String filename = filenameTextField.getText().trim(); if (filename.isEmpty()) { JOptionPane.showMessageDialog(top(), "��ѡ����Դ�ļ���"); return; } File file = new File(filename); if (!file.exists()) { JOptionPane.showMessageDialog(top(), "��Դ�ļ������ڣ�"); return; } System.out.println("wdf: "+filename); try { wdfFile = new WdfFile(filename, false); } catch (Exception e) { e.printStackTrace(); JOptionPane.showMessageDialog(top(), e.getMessage()); return; } //չ��·������ƥ�� Map<String, Long> nodeMap = new TreeMap<String, Long>(); int[] ruleExpands = new int[ruleUnits.size()]; do { StringBuilder sb = new StringBuilder(); for (int i = 0; i < templateFragments.size(); i++) { sb.append(templateFragments.get(i)); if (i < ruleUnits.size()) { sb.append(ruleUnits.get(i).values().get(ruleExpands[i])); } } String path = sb.toString(); long nodeId = HashUtil.stringToId(path); WdfFileNode node = wdfFile.findNode(nodeId); if (node != null) { nodeMap.put(path, node.getId()); System.out.println(Long.toHexString(nodeId)+"=" + path); } else { //System.out.println("not found: " + path); } } while (expandNext(ruleUnits, ruleExpands)); System.out.println("match finished, total found: "+nodeMap.size()); try { wdfFile.close(); } catch (Exception e) { e.printStackTrace(); } } private boolean expandNext(List<RuleUnit> ruleUnits, int[] ruleExpands) { for (int i = ruleUnits.size() - 1; i >= 0; i--) { if (ruleExpands[i] == ruleUnits.get(i).size() - 1) { ruleExpands[i] = 0; } else { ruleExpands[i]++; //System.out.println("expand: " + Arrays.toString(ruleExpands)); return true; } } //System.out.println("finish expand: " + Arrays.toString(ruleExpands)); return false; } private RuleUnit parseUnit(String express) { RuleUnit ruleUnit = null; ruleUnit = NumberRuleUnit.parse(express); if (ruleUnit == null) { ruleUnit = EnumRuleUnit.parse(express); } return ruleUnit; } private void onStop() { } private void onClose() { // add your code here if necessary dispose(); System.exit(0); } public static void main(String[] args) { ResourcePathMatchTool dialog = new ResourcePathMatchTool(); dialog.setPreferredSize(new Dimension(800, 600)); dialog.pack(); dialog.setTitle("��Դ·��ƥ�乤��"); dialog.setLocationRelativeTo(null); dialog.setVisible(true); } { // GUI initializer generated by IntelliJ IDEA GUI Designer // >>> IMPORTANT!! <<< // DO NOT EDIT OR ADD ANY CODE HERE! $$$setupUI$$$(); } /** * Method generated by IntelliJ IDEA GUI Designer * >>> IMPORTANT!! <<< * DO NOT edit this method OR call it in your code! * * @noinspection ALL */ private void $$$setupUI$$$() { contentPane = new JPanel(); contentPane.setLayout(new com.intellij.uiDesigner.core.GridLayoutManager(2, 1, new Insets(10, 10, 10, 10), -1, -1)); final JPanel panel1 = new JPanel(); panel1.setLayout(new com.intellij.uiDesigner.core.GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1)); contentPane.add(panel1, new com.intellij.uiDesigner.core.GridConstraints(1, 0, 1, 1, com.intellij.uiDesigner.core.GridConstraints.ANCHOR_CENTER, com.intellij.uiDesigner.core.GridConstraints.FILL_BOTH, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_SHRINK | com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_GROW, 1, null, null, null, 0, false)); final com.intellij.uiDesigner.core.Spacer spacer1 = new com.intellij.uiDesigner.core.Spacer(); panel1.add(spacer1, new com.intellij.uiDesigner.core.GridConstraints(0, 0, 1, 1, com.intellij.uiDesigner.core.GridConstraints.ANCHOR_CENTER, com.intellij.uiDesigner.core.GridConstraints.FILL_HORIZONTAL, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false)); final JPanel panel2 = new JPanel(); panel2.setLayout(new com.intellij.uiDesigner.core.GridLayoutManager(1, 4, new Insets(0, 0, 0, 0), -1, -1)); panel1.add(panel2, new com.intellij.uiDesigner.core.GridConstraints(0, 1, 1, 1, com.intellij.uiDesigner.core.GridConstraints.ANCHOR_CENTER, com.intellij.uiDesigner.core.GridConstraints.FILL_BOTH, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_SHRINK | com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_GROW, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_SHRINK | com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); buttonStart = new JButton(); buttonStart.setText("��ʼ"); panel2.add(buttonStart, new com.intellij.uiDesigner.core.GridConstraints(0, 0, 1, 1, com.intellij.uiDesigner.core.GridConstraints.ANCHOR_CENTER, com.intellij.uiDesigner.core.GridConstraints.FILL_HORIZONTAL, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_SHRINK | com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_GROW, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); buttonClose = new JButton(); buttonClose.setText("�ر�"); panel2.add(buttonClose, new com.intellij.uiDesigner.core.GridConstraints(0, 3, 1, 1, com.intellij.uiDesigner.core.GridConstraints.ANCHOR_CENTER, com.intellij.uiDesigner.core.GridConstraints.FILL_HORIZONTAL, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_SHRINK | com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_GROW, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); buttonStop = new JButton(); buttonStop.setText("ֹͣ"); panel2.add(buttonStop, new com.intellij.uiDesigner.core.GridConstraints(0, 1, 1, 1, com.intellij.uiDesigner.core.GridConstraints.ANCHOR_CENTER, com.intellij.uiDesigner.core.GridConstraints.FILL_HORIZONTAL, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_SHRINK | com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_GROW, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); final com.intellij.uiDesigner.core.Spacer spacer2 = new com.intellij.uiDesigner.core.Spacer(); panel2.add(spacer2, new com.intellij.uiDesigner.core.GridConstraints(0, 2, 1, 1, com.intellij.uiDesigner.core.GridConstraints.ANCHOR_CENTER, com.intellij.uiDesigner.core.GridConstraints.FILL_HORIZONTAL, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, new Dimension(20, -1), null, 0, false)); final JPanel panel3 = new JPanel(); panel3.setLayout(new com.intellij.uiDesigner.core.GridLayoutManager(4, 3, new Insets(0, 0, 0, 0), -1, -1)); contentPane.add(panel3, new com.intellij.uiDesigner.core.GridConstraints(0, 0, 1, 1, com.intellij.uiDesigner.core.GridConstraints.ANCHOR_CENTER, com.intellij.uiDesigner.core.GridConstraints.FILL_BOTH, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_SHRINK | com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_GROW, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_SHRINK | com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); final JLabel label1 = new JLabel(); label1.setText("·������"); panel3.add(label1, new com.intellij.uiDesigner.core.GridConstraints(1, 0, 1, 1, com.intellij.uiDesigner.core.GridConstraints.ANCHOR_WEST, com.intellij.uiDesigner.core.GridConstraints.FILL_NONE, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_FIXED, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); pathRuleTextArea = new JTextArea(); pathRuleTextArea.setText("char\\0010\\{56-60}\\{stand,walk,attack,defend,die,guard,hit,magic,rusha,rushb}.tcp"); panel3.add(pathRuleTextArea, new com.intellij.uiDesigner.core.GridConstraints(1, 1, 1, 2, com.intellij.uiDesigner.core.GridConstraints.ANCHOR_CENTER, com.intellij.uiDesigner.core.GridConstraints.FILL_BOTH, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_WANT_GROW, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_GROW, null, new Dimension(150, 50), null, 0, false)); final JLabel label2 = new JLabel(); label2.setText("��Դ�ļ���"); panel3.add(label2, new com.intellij.uiDesigner.core.GridConstraints(0, 0, 1, 1, com.intellij.uiDesigner.core.GridConstraints.ANCHOR_WEST, com.intellij.uiDesigner.core.GridConstraints.FILL_NONE, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_FIXED, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); filenameTextField = new JTextField(); filenameTextField.setText("G:\\Games\\�λ�����2012\\shape.wd3"); panel3.add(filenameTextField, new com.intellij.uiDesigner.core.GridConstraints(0, 1, 1, 1, com.intellij.uiDesigner.core.GridConstraints.ANCHOR_WEST, com.intellij.uiDesigner.core.GridConstraints.FILL_HORIZONTAL, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_WANT_GROW, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); browserButton = new JButton(); browserButton.setText("���"); panel3.add(browserButton, new com.intellij.uiDesigner.core.GridConstraints(0, 2, 1, 1, com.intellij.uiDesigner.core.GridConstraints.ANCHOR_CENTER, com.intellij.uiDesigner.core.GridConstraints.FILL_HORIZONTAL, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_SHRINK | com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_CAN_GROW, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); final JLabel label3 = new JLabel(); label3.setText("ƥ������"); panel3.add(label3, new com.intellij.uiDesigner.core.GridConstraints(2, 0, 2, 1, com.intellij.uiDesigner.core.GridConstraints.ANCHOR_WEST, com.intellij.uiDesigner.core.GridConstraints.FILL_NONE, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_FIXED, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); resultTextArea = new JTextArea(); resultTextArea.setText(""); panel3.add(resultTextArea, new com.intellij.uiDesigner.core.GridConstraints(2, 1, 2, 2, com.intellij.uiDesigner.core.GridConstraints.ANCHOR_CENTER, com.intellij.uiDesigner.core.GridConstraints.FILL_BOTH, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_WANT_GROW, com.intellij.uiDesigner.core.GridConstraints.SIZEPOLICY_WANT_GROW, null, new Dimension(150, 50), null, 0, false)); } /** * @noinspection ALL */ public JComponent $$$getRootComponent$$$() { return contentPane; } } interface RuleUnit { void compile(); int size(); List<String> values(); } /** * ���ֱ��ʽ��{00-80} * @param exp */ class NumberRuleUnit implements RuleUnit { private int min; private int max; private int width; private List<String> values; private static Pattern pattern = Pattern.compile("\\{(\\d+)\\-(\\d+)\\}"); public NumberRuleUnit(int min, int max, int width) { super(); this.min = min; this.max = max; this.width = width; values = new ArrayList<String>(); } /** * ���ֱ��ʽ��{00-80} * @param exp */ public static NumberRuleUnit parse(String exp) { Matcher matcher = pattern.matcher(exp); if(matcher.matches()) { String smin = matcher.group(1); String smax = matcher.group(2); int width = smin.length(); int min = Integer.parseInt(smin); int max = Integer.parseInt(smax); NumberRuleUnit ruleUnit = new NumberRuleUnit(min, max, width); ruleUnit.compile(); return ruleUnit; } return null; } @Override public void compile() { String fmt = "%0"+width+"d"; for(int i=min;i<=max;i++) { values.add(String.format(fmt, i)); } } @Override public int size() { return values.size(); } @Override public List<String> values() { return values; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("NumberRuleUnit [min="); builder.append(min); builder.append(", max="); builder.append(max); builder.append(", width="); builder.append(width); builder.append("]"); return builder.toString(); } } class EnumRuleUnit implements RuleUnit { private List<String> values; private static Pattern pattern = Pattern.compile("\\{(.+\\,.+)\\}"); public EnumRuleUnit(List<String> values) { this.values = values; } public static EnumRuleUnit parse(String rule) { Matcher matcher = pattern.matcher(rule); if(matcher.matches()) { String all = matcher.group(1); String[] strs = all.split(","); // List<String> values = new ArrayList<String>(strs.length); // for (int i = 0; i < strs.length; i++) { // values.add(strs[i]); // } List<String> values = Arrays.asList(strs); return new EnumRuleUnit(values); } return null; } @Override public void compile() { //nothing to do } @Override public int size() { return values.size(); } @Override public List<String> values() { return values; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("EnumRuleUnit [values="); builder.append(values); builder.append("]"); return builder.toString(); } }