1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/*
2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project
3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License");
5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License.
6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at
7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *      http://www.apache.org/licenses/LICENSE-2.0
9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software
11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS,
12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and
14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License.
15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */
16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.data;
18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
19f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.util.ArrayList;
20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.util.HashMap;
21f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class PathMatcher {
23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final int NOT_FOUND = -1;
24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private ArrayList<String> mVariables = new ArrayList<String>();
26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private Node mRoot = new Node();
27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public PathMatcher() {
29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mRoot = new Node();
30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void add(String pattern, int kind) {
33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String[] segments = Path.split(pattern);
34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Node current = mRoot;
35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        for (int i = 0; i < segments.length; i++) {
36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            current = current.addChild(segments[i]);
37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        current.setKind(kind);
39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public int match(Path path) {
42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String[] segments = path.split();
43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mVariables.clear();
44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Node current = mRoot;
45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        for (int i = 0; i < segments.length; i++) {
46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Node next = current.getChild(segments[i]);
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (next == null) {
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                next = current.getChild("*");
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (next != null) {
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mVariables.add(segments[i]);
51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                } else {
52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    return NOT_FOUND;
53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            current = next;
56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return current.getKind();
58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public String getVar(int index) {
61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mVariables.get(index);
62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public int getIntVar(int index) {
65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return Integer.parseInt(mVariables.get(index));
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public long getLongVar(int index) {
69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return Long.parseLong(mVariables.get(index));
70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static class Node {
73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        private HashMap<String, Node> mMap;
74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        private int mKind = NOT_FOUND;
75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Node addChild(String segment) {
77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mMap == null) {
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                mMap = new HashMap<String, Node>();
79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            } else {
80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                Node node = mMap.get(segment);
81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                if (node != null) return node;
82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Node n = new Node();
85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mMap.put(segment, n);
86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return n;
87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Node getChild(String segment) {
90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mMap == null) return null;
91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mMap.get(segment);
92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        void setKind(int kind) {
95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mKind = kind;
96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int getKind() {
99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return mKind;
100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
103