/**
* 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.
*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*/
package org.thingml.xtext.helpers;
import org.thingml.xtext.thingML.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Created by ffl on 10.05.2016.
*/
public class RegionHelper {
//Derived properties
public static List<State> getSubstate(Region self) {
if (self instanceof CompositeState) {
return ((CompositeState)self).getSubstate();
}
else if (self instanceof Session) {
return ((Session)self).getSubstate();
}
else if (self instanceof ParallelRegion) {
return ((ParallelRegion)self).getSubstate();
}
throw new Error("ERROR: Incomplete implementation of RegionHelper.getSubstate");
}
public static List<State> allContainedStates(Region self) {
final List<State> result = new ArrayList<State>();
for(Region r : allContainedRegions(self)) {
if (r instanceof State) {
result.add((State)r);
}
for(State s : getSubstate(r)) {
if (! (s instanceof Region)) {
result.add(s);
}
}
}
return result;
}
public static List<Region> allContainedRegions(Region self) {
final List<Region> result = new ArrayList<Region>();
result.add(self);
if (self instanceof CompositeState) {
for(Region r : ((CompositeState)self).getRegion()) {
result.addAll(RegionHelper.allContainedRegions(r));
}
}
for (State s : getSubstate(self)) {
if (s instanceof Region) {
result.addAll(RegionHelper.allContainedRegions((Region)s));
}
}
return result;
}
public static List<Region> allContainedRegionsAndSessions(Region self) {
final List<Region> result = new ArrayList<Region>();
result.add(self);
if (self instanceof CompositeState) {
for(Region r : ((CompositeState)self).getRegion()) {
result.addAll(RegionHelper.allContainedRegionsAndSessions(r));
}
}
if (self instanceof Session) {
for(Region r : ((Session)self).getRegion()) {
result.addAll(RegionHelper.allContainedRegionsAndSessions(r));
}
}
for (State s : getSubstate(self)) {
if (s instanceof Region) {
result.addAll(RegionHelper.allContainedRegionsAndSessions((Region)s));
}
}
return result;
}
public static List<Session> allContainedSessions(Region self) {
final List<Session> result = new ArrayList<Session>();
if (self instanceof CompositeState) {
for(Region r : ((CompositeState)self).getRegion()) {
result.addAll(RegionHelper.allContainedSessions(r));
}
}
if (self instanceof Session) {
result.add((Session)self);
for(Region r : ((Session)self).getRegion()) {
result.addAll(RegionHelper.allContainedSessions(r));
}
}
for (State s : getSubstate(self)) {
if (s instanceof Session) {
result.addAll(RegionHelper.allContainedSessions((Session)s));
}
}
return result;
}
public static List<Session> allFirstLevelSessions(Region self) {
final List<Session> result = new ArrayList<Session>();
if (self instanceof Session) {
result.add((Session)self);
return result;
}
if (self instanceof CompositeState) {
for(Region r : ((CompositeState)self).getRegion()) {
result.addAll(RegionHelper.allFirstLevelSessions(r));
}
}
for (State s : getSubstate(self)) {
if (s instanceof Session) {
result.addAll(RegionHelper.allFirstLevelSessions((Session)s));
}
}
return result;
}
public static List<Property> allContainedProperties(Region self) {
final List<Property> result = new ArrayList<Property>();
for(State s : allContainedStates(self)) {
result.addAll(s.getProperties());
}
return result;
}
public static List<Region> directSubRegions(Region self) {
final List<Region> result = new ArrayList<Region>();
result.add(self);
if (self instanceof CompositeState) {
for (Region r : ((CompositeState)self).getRegion()){
result.addAll(RegionHelper.allContainedRegions(r));
}
}
return result;
}
public static List<CompositeState> allContainedCompositeStates(Region self) {
final List<CompositeState> result = new ArrayList<CompositeState>();
for(State s : allContainedStates(self)) {
if (s instanceof CompositeState) {
result.add((CompositeState)s);
}
}
return result;
}
public static List<State> allContainedSimpleStates(Region self) {
final List<State> result = allContainedStates(self);
result.removeAll(allContainedCompositeStates(self));
return result;
}
public static Set<Type> allUsedTypes(Region self) {
Set<Type> result = new HashSet<Type>();
for(Property p : allContainedProperties(self)) {
result.add(p.getTypeRef().getType());
}
return result;
}
}