| /******************************************************************************* |
| * Copyright (c) 2009, 2018 SAP AG and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v2.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v20.html |
| * |
| * Contributors: |
| * SAP AG - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.ocl.examples.impactanalyzer.testutils; |
| |
| import java.lang.reflect.Field; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Set; |
| |
| import org.eclipse.emf.ecore.EAttribute; |
| import org.eclipse.emf.ecore.EClass; |
| import org.eclipse.emf.ecore.EPackage; |
| import org.eclipse.emf.ecore.EReference; |
| import org.eclipse.emf.ecore.resource.ResourceSet; |
| import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; |
| import org.eclipse.emf.ecore.util.ECrossReferenceAdapter; |
| import org.eclipse.ocl.OCLInput; |
| import org.eclipse.ocl.ParserException; |
| import org.eclipse.ocl.ecore.Constraint; |
| import org.eclipse.ocl.ecore.ExpressionInOCL; |
| import org.eclipse.ocl.ecore.OCL; |
| import org.eclipse.ocl.examples.impactanalyzer.benchmark.preparation.ocl.EnvironmentFactory; |
| import org.eclipse.ocl.examples.testutils.BaseDepartmentTest; |
| import org.junit.After; |
| import org.junit.Before; |
| import org.junit.Ignore; |
| |
| import company.CompanyFactory; |
| import company.CompanyPackage; |
| import company.Employee; |
| import company.Freelance; |
| import company.impl.CompanyImpl; |
| import company.impl.DepartmentImpl; |
| import company.impl.DivisionImpl; |
| import company.impl.EmployeeImpl; |
| import company.impl.FreelanceImpl; |
| |
| |
| /** |
| * This is the super class for all tests based on the Department model. |
| */ |
| @Ignore |
| public class BaseDepartmentTestWithOCL extends BaseDepartmentTest { |
| |
| protected ResourceSet rs = null; |
| /** |
| * |
| */ |
| protected EPackage companyPackage = null; |
| |
| /** |
| * the package containing the Company/Department meta model |
| */ |
| protected CompanyPackage comp = null; |
| |
| /** |
| * the set for all instances of {@link DepartmentImpl} |
| */ |
| protected Set<DepartmentImpl> allDepartments = new HashSet<DepartmentImpl>(); |
| |
| /** |
| * the set of all instances of {@link FreelanceImpl} |
| */ |
| protected Set<FreelanceImpl> allFreelances = new HashSet<FreelanceImpl>(); |
| |
| /** |
| * the set of all instances of {@link EmployeeImpl} |
| */ |
| protected Set<EmployeeImpl> allEmployees = new HashSet<EmployeeImpl>(); |
| |
| /** |
| * a ID used to create unique names for employees and freelances |
| */ |
| protected int curImployeeID = 0; |
| |
| /** |
| * a ID used to create unique names for departments |
| */ |
| protected int curDepartmentID = 0; |
| |
| /** |
| * a instances of {@link EmployeeImpl} |
| */ |
| protected EmployeeImpl aEmployee = null; |
| |
| /** |
| * a instance of {@link DepartmentImpl} |
| */ |
| protected DepartmentImpl aDepartment = null; |
| |
| /** |
| * an instance of {@link DivisionImpl} |
| */ |
| protected DivisionImpl aDivision = null; |
| |
| /** |
| * a instance of {@link FreelanceImpl} |
| */ |
| protected FreelanceImpl aFreelance = null; |
| |
| /** |
| * a instance of {@link CompanyImpl} |
| */ |
| protected CompanyImpl aCompany = null; |
| |
| // constaints |
| /** |
| * A boss is not allowed to be a freelance |
| */ |
| public final String notBossFreelance = "context Department \n" + " inv NotBossFreelance: \n" |
| + " not self.boss.oclIsTypeOf(Freelance)"; |
| |
| /** |
| * there must be at least one employee older than 45 in each department |
| */ |
| public final String oldEmployee = "context Department \n" + " inv OldEmployee: \n" |
| + " self.employee->exists(e | e.age > 45)"; |
| |
| /** |
| * different employees must have different names |
| */ |
| public final String uniqueNames = "context Employee \n" + "inv UniqueNames: \n" + " Employee.allInstances()->forAll(e | \n" |
| + " e <> self implies e.name <> self.name)"; |
| |
| /** |
| * the assignment of a freelance must be between 5 and 30 |
| */ |
| public final String validAssignment = "context Freelance \n" + " inv ValidAssignment: \n" |
| + " self.assignment >= 5 and self.assignment <= 30"; |
| |
| /** |
| * there are at most maxJuniors allowed per department |
| */ |
| public final String maxJuniors = "context Department inv MaxJuniors: \n" |
| + "self.employee->select(e|e.age < 25)->size() < self.maxJuniors\n"; |
| |
| /** |
| * the boss must be older than his employees |
| */ |
| public final String bossIsOldest = "context Employee inv BossIsOldest: \n" + "self.age <= self.employer.boss.age\n"; |
| |
| /** |
| * the boss always gets the most money |
| */ |
| public final String bossHighestSalary = "context Department inv BossHighestSalary: \n" + "self.employee->select(\n" |
| + " e|e.salary >= self.boss.salary)->size() <= 1\n"; |
| |
| /** |
| * this is a nasty constraint with 2 navigation path introduced by collect() stating that the salaries of the employees and |
| * the bosses must not exceed the division's budget. |
| */ |
| public final String nastyConstraint = "context Division \n" + "inv nasty: \n" + "self.department->collect(d| \n" |
| + "d.employee->including(d.boss)).salary->sum() < budget"; |
| |
| /** |
| * A division is allowed a maximum number of employees of the month equal to its number of departments. If a department has no |
| * employee of the month, another one can have two. |
| */ |
| public final String limitEmployeesOfTheMonth = "context Division \n" + "inv limitEmployeesOfTheMonth: \n" |
| + "self.employeesOfTheMonth->size() <= self.department->size()"; |
| |
| /** |
| * This constraint is semantically identical to limitEmployeesOfTheMonth but uses a nested derivation ( |
| * numberEmployeesOfTheMonth is a derived attribute that uses a derived reference in its derivation expression ). |
| */ |
| public final String nestedDerivation = "context Division \n" + "inv nestedDerivation: \n" |
| + "self.numberEmployeesOfTheMonth <= self.department->size()"; |
| |
| /** |
| * A department must have less than 5 freelancers and less than 5 students. |
| * Department.biggestNumberOfStudentsOrFreelancers holds the size of the bigger group (it contains an if-expression, thats why we call it nonlinear). |
| */ |
| public final String nonLinearDerivation = "context Department \n" + "inv nonLinearDerivation: \n" |
| + "self.biggestNumberOfStudentsOrFreelancers < 5"; |
| |
| /** |
| * Each department of a company must have less than 5 freelancers and less than 5 students. |
| * This constraint is semantically identical to nonLinearDerivation, but the context of the |
| * constraint and the context of the derivation expression differ this time. |
| */ |
| public final String longNavigationWithDerivation = "context Company \n" + "inv longNavigationWithDerivation: \n" |
| + "self.division.department->sortedBy(biggestNumberOfStudentsOrFreelancers)->last().biggestNumberOfStudentsOrFreelancers < 5"; |
| |
| /** |
| * The delta of the number of employees of the month of all divisions of a company must not be greater than 5 (semantically |
| * questionable, but uses the same derived property twice, which is what we need to test if the collecting of them works). |
| */ |
| public final String eotmDeltaMax = "context Company \n" + "inv eotmDeltaMax: \n" + "self.eotmDelta <= 5"; |
| |
| /** |
| * Only directors are allowed to have a secretary |
| */ |
| public final String divisionBossSecretary = "context Employee \n" + "inv divBossSecretary: \n" |
| + "if self.directed->isEmpty() then \n" + " self.secretary.oclIsUndefined() \n" + "else \n" |
| + " not self.secretary.oclIsUndefined() \n" + "endif"; |
| |
| /** |
| * for security reasons, secretaries must be older than their bosses ;-) the secretary is modeled as an attribute |
| */ |
| public final String secretaryOlderThanBoss = "context Employee \n" + "inv secretaryOlderThanBoss: \n" |
| + "if self.directed->notEmpty() and \n" + " not self.secretary.oclIsUndefined() then \n" |
| + " self.age < self.secretary.age \n" + "else true \n" + "endif"; |
| |
| /** |
| * A boss must be at least 10 years older than the youngest employee in the managed department. |
| */ |
| public final String boss10YearsOlderThanJunior = "context Department \n" + "inv boss10YearsOlderThanJunior: \n" |
| + "let t:Tuple(boss:Employee,junior:Employee)=" |
| + "Tuple{boss=self.boss, junior=self.employee->sortedBy(age)->first()} in \n" + "t.boss.age > t.junior.age + 10"; |
| |
| /** |
| * the expenses per department must not exceed its budget |
| */ |
| public final String expensesRestriction = "context Department inv BudgetRestriction: \n" |
| + "self.calcExpenses() <= self.budget"; |
| |
| /** |
| * A simple allInstances() expression to test instance creation/deletion filters |
| */ |
| public final String simpleAllInstances = "context Employee inv InstanceCount: \n" + "Employee.allInstances()->size() = 17"; |
| |
| // /** |
| // * defines how to calculate expenses: The sum of the employee's salary plus |
| // * the boss' salary |
| // */ |
| // public final String expensesCalculation = "context Department \n" + "def: calcExpenses():Integer = \n" + |
| // "self.employee->iterate(e: sum=0 | sum + self.salary) + self.boss.salary"; |
| |
| /** |
| * each department must be in a division |
| */ |
| public final String departmentMustHaveDivision = "context Department inv departmentMustHaveDivision: \n" |
| + "self.department2division->notEmpty()"; |
| |
| public final String compareBossSalaryToJuniorSalary = "context Department \n" |
| + "inv compareBossSalaryToJuniorSalary: \n" |
| + "let bt:Tuple(bp:Employee,bs:Integer)=Tuple{bp=self.boss, bs=self.boss.salary} in " |
| + "let jt:Tuple(jp:Employee, js:Integer)=Tuple{jp=self.employee->sortedBy(age)->first(), js=self.employee->sortedBy(age)->first().salary} in " |
| + "let t:Tuple(b:Tuple(p1:Employee, s1:Integer), j:Tuple(p2:Employee, s2:Integer))=" + "Tuple{b=bt, j=jt} in \n" |
| + "t.b.p1 <> t.j.p2 implies t.b.s1 > t.j.s2 + 100"; |
| |
| public final String employeeInSameDepartmentAsIntern = "context Employee \n" + "inv employeeInSameDepartmentAsIntern: \n" |
| + "self.employer = self.intern.employer"; |
| |
| public final String checkForBob = "context Employee inv checkForBob: Employee.allInstances()->select(e:Employee | e.name = 'Bob')->asOrderedSet()->first().oclAsType(Employee).name = 'Bob'"; |
| |
| public final String sumBudgetLimit = "context company::Department inv: self.sumBudget() < 10000"; |
| |
| /* |
| * OCLExpression representing the constrains above |
| */ |
| public ExpressionInOCL notBossFreelanceAST = null; |
| |
| public ExpressionInOCL oldEmployeeAST = null; |
| |
| public ExpressionInOCL uniqueNamesAST = null; |
| |
| public ExpressionInOCL validAssignmentAST = null; |
| |
| public ExpressionInOCL maxJuniorsAST = null; |
| |
| public ExpressionInOCL bossIsOldestAST = null; |
| |
| public ExpressionInOCL bossHighestSalaryAST = null; |
| |
| public ExpressionInOCL expensesRestrictionAST = null; |
| |
| public ExpressionInOCL nastyConstraintAST = null; |
| |
| public ExpressionInOCL limitEmployeesOfTheMonthAST = null; |
| |
| public ExpressionInOCL nestedDerivationAST = null; |
| |
| public ExpressionInOCL nonLinearDerivationAST = null; |
| |
| public ExpressionInOCL longNavigationWithDerivationAST = null; |
| |
| public ExpressionInOCL eotmDeltaMaxAST = null; |
| |
| public ExpressionInOCL divisionBossSecretaryAST = null; |
| |
| public ExpressionInOCL secretaryOlderThanBossAST = null; |
| |
| public ExpressionInOCL boss10YearsOlderThanJuniorAST = null; |
| |
| public ExpressionInOCL departmentMustHaveDivisionAST = null; |
| |
| public ExpressionInOCL compareBossSalaryToJuniorSalaryAST = null; |
| |
| public ExpressionInOCL employeeInSameDepartmentAsInternAST = null; |
| |
| public ExpressionInOCL checkForBobAST = null; |
| |
| public ExpressionInOCL simpleAllInstancesAST = null; |
| |
| public ExpressionInOCL sumBudgetLimitAST = null; |
| |
| /* |
| * for easy access to the model |
| */ |
| protected EClass companyClass = null; |
| |
| protected EClass division = null; |
| |
| protected EAttribute divisionBudget = null; |
| |
| protected EClass department = null; |
| |
| protected EAttribute departmentName = null; |
| |
| protected EAttribute departmentMaxJuniors = null; |
| |
| protected EAttribute departmentBudget = null; |
| |
| protected EClass employee = null; |
| |
| protected EAttribute employeeName = null; |
| |
| protected EAttribute employeeAge = null; |
| |
| protected EAttribute employeeSalary = null; |
| |
| protected EReference employeeSecretary = null; |
| |
| protected EAttribute employeeIsSecretary = null; |
| |
| protected EClass freelance = null; |
| |
| protected EClass student = null; |
| |
| protected EAttribute freelanceAssignment = null; |
| |
| protected EReference departmentRef = null; |
| |
| protected EReference departmentEmployeeOfTheMonth = null; |
| |
| protected EReference divisionEmployeesOfTheMonth = null; |
| |
| protected EAttribute numberEmployeesOfTheMonth = null; |
| |
| protected EAttribute biggestNumberOfStudentsOrFreelancers = null; |
| |
| protected EAttribute eotmDelta = null; |
| |
| protected EReference bossRef = null; |
| |
| protected EReference managedRef = null; |
| |
| protected EReference employerRef = null; |
| |
| protected EReference employeeRef = null; |
| |
| protected EReference directedRef = null; |
| |
| protected EReference internRef = null; |
| |
| protected EReference divisionDirector = null; |
| |
| /** |
| * Declare a public String field |
| * |
| * @param stringFieldName |
| * @return |
| */ |
| protected ExpressionInOCL getAST(String stringFieldName) { |
| try { |
| Field stringField = getClass().getField(stringFieldName); |
| Field astField = getClass().getField(stringFieldName + "AST"); |
| ExpressionInOCL result = (ExpressionInOCL) astField.get(this); |
| if (result == null) { |
| result = (ExpressionInOCL) parse((String) stringField.get(this), this.comp).iterator().next().getSpecification(); |
| astField.set(this, result); |
| } |
| return result; |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| protected ExpressionInOCL getNotBossFreelanceAST() { |
| return getAST("notBossFreelance"); |
| } |
| |
| protected ExpressionInOCL getOldEmployeeAST() { |
| return getAST("oldEmployee"); |
| } |
| |
| protected ExpressionInOCL getUniqueNamesAST() { |
| return getAST("uniqueNames"); |
| } |
| |
| protected ExpressionInOCL getValidAssignmentAST() { |
| return getAST("validAssignment"); |
| } |
| |
| protected ExpressionInOCL getMaxJuniorsAST() { |
| return getAST("maxJuniors"); |
| } |
| |
| protected ExpressionInOCL getBossIsOldestAST() { |
| return getAST("bossIsOldest"); |
| } |
| |
| protected ExpressionInOCL getSumBudgetLimitAST() { |
| return getAST("sumBudgetLimit"); |
| } |
| |
| protected ExpressionInOCL getBossHighestSalaryAST() { |
| return getAST("bossHighestSalary"); |
| } |
| |
| protected ExpressionInOCL getExpensesRestrictionAST() { |
| return getAST("expensesRestriction"); |
| } |
| |
| protected ExpressionInOCL getNastyConstraintAST() { |
| return getAST("nastyConstraint"); |
| } |
| |
| protected ExpressionInOCL getLimitEmployeesOfTheMonthAST() { |
| return getAST("limitEmployeesOfTheMonth"); |
| } |
| |
| protected ExpressionInOCL getNestedDerivationAST() { |
| return getAST("nestedDerivation"); |
| } |
| |
| protected ExpressionInOCL getNonLinearDerivationAST() { |
| return getAST("nonLinearDerivation"); |
| } |
| |
| protected ExpressionInOCL getlongNavigationWithDerivationAST() { |
| return getAST("longNavigationWithDerivation"); |
| } |
| |
| protected ExpressionInOCL getEotmDeltaMaxAST() { |
| return getAST("eotmDeltaMax"); |
| } |
| |
| protected ExpressionInOCL getDivisionBossSecretaryAST() { |
| return getAST("divisionBossSecretary"); |
| } |
| |
| protected ExpressionInOCL getSecretaryOlderThanBossAST() { |
| return getAST("secretaryOlderThanBoss"); |
| } |
| |
| protected ExpressionInOCL getBoss10YearsOlderThanJuniorAST() { |
| return getAST("boss10YearsOlderThanJunior"); |
| } |
| |
| protected ExpressionInOCL getDepartmentMustHaveDivisionAST() { |
| return getAST("departmentMutsHaveDivision"); |
| } |
| |
| protected ExpressionInOCL getCompareBossSalaryToJuniorSalaryAST() { |
| return getAST("compareBossSalaryToJuniorSalary"); |
| } |
| |
| protected ExpressionInOCL getEmployeeInSameDepartmentAsInternAST() { |
| return getAST("employeeInSameDepartmentAsIntern"); |
| } |
| |
| protected ExpressionInOCL getCheckForBobAST() { |
| return getAST("checkForBob"); |
| } |
| |
| protected ExpressionInOCL getSimpleAllInstancesAST() { |
| return getAST("simpleAllInstances"); |
| } |
| |
| @Override |
| @Before |
| public void setUp() { |
| beforeTestMethod(); |
| } |
| |
| @Override |
| @After |
| public void tearDown() { |
| this.resetInstances(); |
| } |
| |
| protected void beforeTestMethod() { |
| // build up the test model |
| buildModel(); |
| } |
| |
| /** |
| * creates a whole bunch of instances |
| * |
| * @param numDepartments |
| * the number of departments |
| * @param numEmployees |
| * the number of employees (not freelance) per department |
| * @param numFreelance |
| * the number of freelance per department |
| */ |
| protected void createInstances(double numDepartments, int numEmployees, int numFreelance) { |
| |
| int maxNumJuniors = 3; |
| int budget = 50000; |
| |
| this.aDivision = (DivisionImpl) CompanyFactory.eINSTANCE.createDivision(); |
| this.aDivision.setName("The super Division"); |
| this.aDivision.setBudget(2000000); |
| this.aCompany = (CompanyImpl)CompanyFactory.eINSTANCE.createCompany(); |
| this.aCompany.setDivision(this.aDivision); |
| if (this.comp.eResource() != null) { |
| // none of them is contained somewhere else, therefore we need them in the resource |
| this.comp.eResource().getContents().add(this.aDivision); |
| this.comp.eResource().getContents().add(this.aCompany); |
| } |
| |
| for (double i = 0; i < numDepartments; i++) { |
| createDepartment(numEmployees, numFreelance, maxNumJuniors, budget); |
| } |
| // pick some instances to which the events will be related |
| this.aDepartment = this.allDepartments.iterator().next(); |
| this.aDivision.getDepartment().add(this.aDepartment); |
| this.aEmployee = this.allEmployees.iterator().next(); |
| this.aFreelance = this.allFreelances.iterator().next(); |
| |
| |
| } |
| |
| /** |
| * This method fetches some meta object form the model which are used to create ModelChangeEvents later on |
| */ |
| private void buildModel() { |
| this.comp = company.CompanyPackage.eINSTANCE; |
| this.companyClass = this.comp.getCompany(); |
| this.division = this.comp.getDivision(); |
| this.divisionBudget = (EAttribute) this.division.getEStructuralFeature("budget"); |
| this.department = this.comp.getDepartment(); |
| this.departmentName = (EAttribute) this.department.getEStructuralFeature("name"); |
| this.departmentMaxJuniors = (EAttribute) this.department.getEStructuralFeature("maxJuniors"); |
| this.departmentBudget = (EAttribute) this.department.getEStructuralFeature("budget"); |
| this.bossRef = (EReference) this.department.getEStructuralFeature("boss"); |
| this.employeeRef = (EReference) this.department.getEStructuralFeature("employee"); |
| this.departmentRef = (EReference) this.division.getEStructuralFeature("department"); |
| this.departmentEmployeeOfTheMonth = (EReference) this.department.getEStructuralFeature("employeeOfTheMonth"); |
| this.divisionEmployeesOfTheMonth = (EReference) this.division.getEStructuralFeature("employeesOfTheMonth"); |
| this.numberEmployeesOfTheMonth = (EAttribute) this.division.getEStructuralFeature("numberEmployeesOfTheMonth"); |
| this.biggestNumberOfStudentsOrFreelancers = (EAttribute) this.department.getEStructuralFeature("biggestNumberOfStudentsOrFreelancers"); |
| this.eotmDelta = (EAttribute) this.companyClass.getEStructuralFeature("eotmDelta"); |
| this.employee = this.comp.getEmployee(); |
| this.employeeName = (EAttribute) this.employee.getEStructuralFeature("name"); |
| this.employeeAge = (EAttribute) this.employee.getEStructuralFeature("age"); |
| this.employeeSalary = (EAttribute) this.employee.getEStructuralFeature("salary"); |
| this.employerRef = (EReference) this.employee.getEStructuralFeature("employer"); |
| this.employeeSecretary = (EReference) this.employee.getEStructuralFeature("secretary"); |
| this.directedRef = (EReference) this.employee.getEStructuralFeature("directed"); |
| this.managedRef = (EReference) this.employee.getEStructuralFeature("managed"); |
| this.internRef = (EReference) this.employee.getEStructuralFeature("intern"); |
| this.divisionDirector = (EReference) this.companyClass.getEStructuralFeature("divisionDirector"); |
| this.freelance = this.comp.getFreelance(); |
| this.student = this.comp.getStudent(); |
| this.freelanceAssignment = (EAttribute) this.freelance.getEStructuralFeature("assignment"); |
| this.rs = new ResourceSetImpl(); |
| this.rs.eAdapters().add(new ECrossReferenceAdapter()); |
| this.rs.getResources().add(this.comp.eResource()); |
| } |
| |
| /** |
| * Creates a Department instance |
| * |
| * @param employees |
| * number of employees which are not freelances in the department |
| * @param freelances |
| * the number of freelances in the department |
| * @param maxJuniors |
| * the value for the maxJunior attribute |
| * @param budget |
| * the value for the budget attribute |
| */ |
| protected DepartmentImpl createDepartment(int employees, int freelances, int maxNumJuniors, int budget) { |
| |
| DepartmentImpl dep = (DepartmentImpl) CompanyFactory.eINSTANCE.createDepartment(); |
| dep.setName("Dep" + this.curDepartmentID); |
| dep.setMaxJuniors(maxNumJuniors); |
| dep.setBudget(budget); |
| this.curDepartmentID++; |
| EmployeeImpl e = null; |
| FreelanceImpl f = null; |
| for (int i = 0; i < employees; i++) { |
| e = createEmployee(); |
| dep.getEmployee().add(e); |
| e.setEmployer(dep); |
| } |
| for (int i = 0; i < freelances; i++) { |
| f = createFreelance(); |
| dep.getEmployee().add(f); |
| f.setEmployer(dep); |
| } |
| this.allDepartments.add(dep); |
| if (this.comp.eResource() != null) { |
| this.comp.eResource().getContents().add(dep); |
| } |
| return dep; |
| } |
| |
| /** |
| * @return an instance of {@link Employee} |
| */ |
| protected EmployeeImpl createEmployee() { |
| |
| EmployeeImpl e = (EmployeeImpl) CompanyFactory.eINSTANCE.createEmployee(); |
| e.setName("empl" + this.curImployeeID); |
| e.setAge(42); |
| e.setSalary(2345); |
| this.curImployeeID++; |
| this.allEmployees.add(e); |
| if (this.comp.eResource() != null) { |
| this.comp.eResource().getContents().add(e); |
| } |
| return e; |
| } |
| |
| /** |
| * @return a instances of {@link Freelance} |
| */ |
| protected FreelanceImpl createFreelance() { |
| |
| FreelanceImpl f = (FreelanceImpl) CompanyFactory.eINSTANCE.createFreelance(); |
| f.setName("empl" + this.curImployeeID); |
| f.setAge(42); |
| f.setAssignment(7); |
| f.setSalary(2345); |
| this.curImployeeID++; |
| this.allFreelances.add(f); |
| if (this.comp.eResource() != null) { |
| this.comp.eResource().getContents().add(f); |
| } |
| return f; |
| } |
| |
| /** |
| * @param expression |
| * to parse |
| * @return a list of {@link Constraint}s parsed from given expression |
| */ |
| public static List<Constraint> parse(String expression, EPackage basePackage) { |
| OCLInput exp = new OCLInput(expression); |
| String nsPrefix = basePackage.getNsPrefix(); |
| EPackage.Registry.INSTANCE.put(nsPrefix, basePackage); |
| OCL ocl = org.eclipse.ocl.examples.impactanalyzer.util.OCL.newInstance(); |
| ocl = OCL.newInstance(new EnvironmentFactory().createPackageContext(ocl.getEnvironment(), basePackage)); |
| List<Constraint> result = null; |
| try { |
| result = ocl.parse(exp); |
| } catch (ParserException e) { |
| System.err.println("Error while parsing Expression:" + exp); |
| e.printStackTrace(); |
| } |
| return result; |
| } |
| |
| private void resetInstances() { |
| |
| this.rs = null; |
| this.companyPackage = null; |
| this.comp = null; |
| this.allDepartments = null; |
| this.allFreelances = null; |
| this.allEmployees = null; |
| this.aEmployee = null; |
| this.aDepartment = null; |
| this.aDivision = null; |
| this.aFreelance = null; |
| this.companyClass = null; |
| this.division = null; |
| this.divisionBudget = null; |
| this.department = null; |
| this.departmentName = null; |
| this.departmentMaxJuniors = null; |
| this.departmentBudget = null; |
| this.employee = null; |
| this.employeeName = null; |
| this.employeeAge = null; |
| this.employeeSalary = null; |
| this.employeeSecretary = null; |
| this.freelance = null; |
| this.student = null; |
| this.freelanceAssignment = null; |
| this.departmentRef = null; |
| this.departmentEmployeeOfTheMonth = null; |
| this.divisionEmployeesOfTheMonth = null; |
| this.numberEmployeesOfTheMonth = null; |
| this.biggestNumberOfStudentsOrFreelancers = null; |
| this.eotmDelta = null; |
| this.bossRef = null; |
| this.managedRef = null; |
| this.employerRef = null; |
| this.employeeRef = null; |
| this.directedRef = null; |
| } |
| } |