/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.search.impl;
import java.util.*;
import org.jboss.tools.common.model.*;
import org.jboss.tools.common.model.search.*;
import org.jboss.tools.common.model.impl.*;
import org.jboss.tools.common.model.util.*;
public class SearchCommandImpl extends SearchConstraintImpl implements SearchCommand {
private static final long serialVersionUID = 1L;
protected SearchConstraint matching;
protected SearchConstraint insight;
public SearchCommandImpl() {}
public void prepare() {
super.prepare();
matching = (SearchConstraint)getChildren("SearchMatch")[0]; //$NON-NLS-1$
insight = (SearchConstraint)getChildren("SearchRecursion")[0]; //$NON-NLS-1$
}
public XModelObject[] execute() {
prepare();
ArrayList<XModelObject> list = new ArrayList<XModelObject>();
String[] roots = XModelObjectUtil.asStringArray(getAttributeValue("root")); //$NON-NLS-1$
ArrayList<XModelObject> os = new ArrayList<XModelObject>();
if(roots.length == 0) {
os.add(getModel().getRoot());
} else {
for (int i = 0; i < roots.length; i++) {
XModelObject root = getModel().getByPath(roots[i]);
if(root != null) os.add(root);
}
}
for (int i = 0; i < os.size(); i++) {
XModelObject root = os.get(i);
execute(root, list);
}
return list.toArray(new XModelObject[list.size()]);
}
public void validate() {
String rootpath = getAttributeValue("root"); //$NON-NLS-1$
if(rootpath.length() == 0) throw new IllegalStateException("Attribute 'root' of search command must be set."); //$NON-NLS-1$
XModelObject root = getModel().getByPath(rootpath);
if(root == null) throw new IllegalStateException("Root of search command is not found in model."); //$NON-NLS-1$
}
protected void execute(XModelObject o, ArrayList<XModelObject> list) {
if(matching.accepts(o)) list.add(o);
if(insight.accepts(o)) {
XModelObject[] os = ((XModelObjectImpl)o).getChildrenForSave();
for (int i = 0; i < os.length; i++) execute(os[i], list);
}
}
}