/* * Copyright 2013 The Sculptor Project Team, including the original * author or authors. * * 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.sculptor.dsl; import java.util.ArrayList; import java.util.List; import org.sculptor.dsl.sculptordsl.DslApplication; import org.sculptor.dsl.sculptordsl.DslCommandEvent; import org.sculptor.dsl.sculptordsl.DslDataTransferObject; import org.sculptor.dsl.sculptordsl.DslDomainEvent; import org.sculptor.dsl.sculptordsl.DslDomainObject; import org.sculptor.dsl.sculptordsl.DslEntity; import org.sculptor.dsl.sculptordsl.DslModule; import org.sculptor.dsl.sculptordsl.DslSimpleDomainObject; import org.sculptor.dsl.sculptordsl.DslValueObject; /** * Java utilities for extension functions * */ public class DslHelper { public static void debugTrace(String msg) { System.out.println(msg); } /** * Throws a RuntimeException to stop the generation with an error message. * * @param msg * message to log */ public static void error(String msg) { System.err.println(msg); throw new RuntimeException(msg); } public static List<? extends DslSimpleDomainObject> getSubclasses(DslSimpleDomainObject domainObject) { if (domainObject instanceof DslDomainObject) { return getSubclasses((DslDomainObject) domainObject); } else if (domainObject instanceof DslDataTransferObject) { return getSubclasses((DslDataTransferObject) domainObject); } else { throw new IllegalArgumentException(String.valueOf(domainObject)); } } public static List<DslDomainObject> getSubclasses(DslDomainObject domainObject) { List<DslDomainObject> subclasses = new ArrayList<DslDomainObject>(); DslApplication application = (DslApplication) domainObject.eContainer().eContainer(); List<DslModule> modules = application.getModules(); for (DslModule module : modules) { List<DslSimpleDomainObject> domainObjects = module.getDomainObjects(); for (DslSimpleDomainObject simpleDomainObj : domainObjects) { if (simpleDomainObj instanceof DslDomainObject) { DslDomainObject domainObj = (DslDomainObject) simpleDomainObj; if (domainObj.getExtendsName() != null && domainObj.getExtendsName().equals(domainObject.getName())) { subclasses.add(domainObj); } else if (getExtends(domainObj) != null && getExtends(domainObj).equals(domainObject)) { subclasses.add(domainObj); } } } } return subclasses; } public static DslSimpleDomainObject getExtends(DslSimpleDomainObject domainObject) { DslSimpleDomainObject result = null; String extendsName = null; if (domainObject instanceof DslEntity) { result = ((DslEntity) domainObject).getExtends(); extendsName = ((DslEntity) domainObject).getExtendsName(); } else if (domainObject instanceof DslValueObject) { result = ((DslValueObject) domainObject).getExtends(); extendsName = ((DslValueObject) domainObject).getExtendsName(); } else if (domainObject instanceof DslCommandEvent) { result = ((DslCommandEvent) domainObject).getExtends(); extendsName = ((DslCommandEvent) domainObject).getExtendsName(); } else if (domainObject instanceof DslDomainEvent) { result = ((DslDomainEvent) domainObject).getExtends(); extendsName = ((DslDomainEvent) domainObject).getExtendsName(); } else if (domainObject instanceof DslDataTransferObject) { result = ((DslDataTransferObject) domainObject).getExtends(); extendsName = ((DslDataTransferObject) domainObject).getExtendsName(); } if (result == null && extendsName != null) { DslApplication application = (DslApplication) domainObject.eContainer().eContainer(); result = findDomainObjectByName(extendsName, application); } return result; } public static List<? extends DslSimpleDomainObject> getAllSubclasses(DslSimpleDomainObject domainObject) { if (domainObject instanceof DslDomainObject) { return getAllSubclasses((DslDomainObject) domainObject); } else if (domainObject instanceof DslDataTransferObject) { return getAllSubclasses((DslDataTransferObject) domainObject); } else { throw new IllegalArgumentException(String.valueOf(domainObject)); } } public static List<DslDataTransferObject> getAllSubclasses(DslDataTransferObject domainObject) { List<DslDataTransferObject> subclasses = getSubclasses(domainObject); for (DslDataTransferObject subclass : new ArrayList<DslDataTransferObject>(subclasses)) { subclasses.addAll(getAllSubclasses(subclass)); } return subclasses; } public static List<DslDataTransferObject> getSubclasses(DslDataTransferObject domainObject) { List<DslDataTransferObject> subclasses = new ArrayList<DslDataTransferObject>(); DslApplication application = (DslApplication) domainObject.eContainer().eContainer(); List<DslModule> modules = application.getModules(); for (DslModule module : modules) { List<DslSimpleDomainObject> domainObjects = module.getDomainObjects(); for (DslSimpleDomainObject simpleDomainObj : domainObjects) { if (simpleDomainObj instanceof DslDataTransferObject) { DslDataTransferObject domainObj = (DslDataTransferObject) simpleDomainObj; if (domainObj.getExtendsName() != null && domainObj.getExtendsName().equals(domainObject.getName())) { subclasses.add(domainObj); } else if (domainObj.getExtends() != null && domainObj.getExtends().equals(domainObject)) { subclasses.add(domainObj); } } } } return subclasses; } public static List<DslDomainObject> getAllSubclasses(DslDomainObject domainObject) { List<DslDomainObject> subclasses = getSubclasses(domainObject); for (DslDomainObject subclass : new ArrayList<DslDomainObject>(subclasses)) { subclasses.addAll(getAllSubclasses(subclass)); } return subclasses; } public static DslSimpleDomainObject findDomainObjectByName(String name, DslApplication application) { List<DslModule> modules = application.getModules(); for (DslModule module : modules) { for (DslSimpleDomainObject domainObj : module.getDomainObjects()) { if (domainObj.getName().equals(name)) { return domainObj; } } } return null; } }