/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.apache.ode.bpel.compiler.bom;

import java.util.List;

import org.w3c.dom.Element;

/**
 * Base interface for BPEL composite activities <code>&lt;flow&gt;</code> and
 * <code>&lt;sequence&gt;</code>. This interface provides methods for
 * manipulating an ordered list of child activities.
 */
public class CompositeActivity extends Activity {

    public CompositeActivity(Element el) {
        super(el);
    }

    /**
     * Get the (ordered) list of child activities.
     *
     * @return immutable list of child {@link Activity} objects
     */
    public List<Activity> getActivities() {
        return getChildren(Activity.class);
    }

}
