/*
* Copyright 2004-2012 the Seasar Foundation and the Others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
package org.seasar.mayaa.impl.engine.specification.serialize;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.seasar.mayaa.engine.specification.NodeTreeWalker;
import org.seasar.mayaa.engine.specification.Specification;
import org.seasar.mayaa.engine.specification.SpecificationNode;
import org.seasar.mayaa.engine.specification.serialize.NodeReferenceResolver;
import org.seasar.mayaa.engine.specification.serialize.NodeResolveListener;
/**
* @author Taro Kato (Gluegent, Inc.)
*/
public class NodeSerializeController implements NodeReferenceResolver {
private List _nodeListeners;
private Map _nodes;
public void init() {
_nodeListeners = new ArrayList(20);
_nodes = new HashMap(100);
}
public void release() {
doNotify();
for (Iterator it = _nodeListeners.iterator(); it.hasNext(); ) {
NodeListener listener = (NodeListener)it.next();
listener.release();
}
_nodeListeners.clear();
_nodes.clear();
}
public NodeTreeWalker getNode(String uniqueID) {
return (NodeTreeWalker) _nodes.get(uniqueID);
}
public void doNotify() {
for (Iterator it = _nodeListeners.iterator(); it.hasNext(); ) {
NodeListener listener = (NodeListener) it.next();
NodeTreeWalker node = getNode(listener._id);
listener._listener.notify(listener._id, node);
if (node != null) {
it.remove();
}
}
}
/**
* 存在しない場合は登録する。
* @param node 登録するノード
* @return 既に登録済みの場合はfalse。
*/
public boolean collectNode(NodeTreeWalker node) {
String uniqueID = null;
if (node instanceof SpecificationNode) {
uniqueID = makeKey((SpecificationNode)node);
} else if (node instanceof Specification){
uniqueID = makeKey((Specification)node);
} else {
throw new IllegalArgumentException();
}
if (_nodes.containsKey(uniqueID)) {
return false;
}
_nodes.put(uniqueID, node);
return true;
}
public void registResolveNodeListener(String uniqueID, NodeResolveListener listener) {
_nodeListeners.add(new NodeListener(uniqueID, listener));
}
public void nodeLoaded(SpecificationNode item) {
_nodes.put(makeKey(item), item);
}
public void specLoaded(Specification item) {
_nodes.put(makeKey(item), item);
}
public static String makeKey(SpecificationNode item) {
return item.getSystemID() + "\n"
+ item.getSequenceID() + "\n"
+ item.getQName();
}
public static String makeKey(Specification item) {
return item.getSystemID();
}
public static class NodeListener {
String _id;
NodeResolveListener _listener;
public NodeListener(String id, NodeResolveListener listener) {
_id = id;
_listener = listener;
}
public void release() {
_listener.release();
_listener = null;
}
}
}