--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.mapping.pattern;\r
+\r
+\r
+public class MappingRule {\r
+ /*\r
+ static final THashSet<Resource> EMPTY_SET = new THashSet<Resource>();\r
+ \r
+ THashMap<Resource, Resource> resourcesByDomains = new THashMap<Resource, Resource>();\r
+ Collection<IConstraint> constraints = new ArrayList<IConstraint>();\r
+ Collection<ConstraintGroup> constraintGroups = new ArrayList<ConstraintGroup>();\r
+ \r
+ static class ConstraintGroup {\r
+ Collection<IConstraint> constraints;\r
+ Collection<Resource> targets;\r
+ Collection<Resource> dependencies;\r
+ }\r
+ \r
+ class DirectedRuleBuilder {\r
+ THashSet<Resource> sourceResources = new THashSet<Resource>();\r
+ THashSet<Resource> targetResources = new THashSet<Resource>();\r
+ THashSet<IConstraint> sourceConstraints = new THashSet<IConstraint>();\r
+ THashSet<IConstraint> targetConstraints = new THashSet<IConstraint>();\r
+ TObjectIntHashMap<Resource> boundResources;\r
+ int id;\r
+ \r
+ Instruction root = new DummyInstruction();\r
+ Instruction cur = root;\r
+ \r
+ public DirectedRuleBuilder(final THashSet<Resource> sourceDomains,\r
+ TObjectIntHashMap<Resource> boundResources, int id) {\r
+ this.boundResources = boundResources;\r
+ this.id = id;\r
+ \r
+ // Classify resources\r
+ \r
+ resourcesByDomains.forEachEntry(new TObjectObjectProcedure<Resource, Resource>() {\r
+\r
+ @Override\r
+ public boolean execute(Resource domain, Resource resource) {\r
+ if(sourceDomains.contains(domain))\r
+ sourceResources.add(resource);\r
+ else\r
+ targetResources.add(resource);\r
+ return true;\r
+ }\r
+ \r
+ });\r
+ \r
+ // Classify constraints \r
+ \r
+ for(IConstraint constraint : constraints) {\r
+ if(sourceResources.containsAll(constraint.binds()))\r
+ sourceConstraints.add(constraint);\r
+ else\r
+ targetConstraints.add(constraint);\r
+ }\r
+ } \r
+ \r
+ int bestValue;\r
+ IConstraint bestConstraint;\r
+ \r
+ private void findBestConstraint(THashSet<IConstraint> constraints) {\r
+ bestValue = 0;\r
+ bestConstraint = null;\r
+ sourceConstraints.forEach(new TObjectProcedure<IConstraint>() {\r
+ \r
+ @Override\r
+ public boolean execute(IConstraint constraint) {\r
+ int temp = constraint.isApplicable(boundResources);\r
+ if(temp>bestValue) {\r
+ bestValue = temp;\r
+ bestConstraint = constraint;\r
+ }\r
+ return true;\r
+ }\r
+ \r
+ });\r
+ }\r
+ \r
+ private void applyConstraint(THashSet<Resource> resources, IConstraint constraint) {\r
+ THashSet<Resource> unbounded = new THashSet<Resource>();\r
+ for(Resource r : constraint.binds())\r
+ if(resources.remove(r)) {\r
+ unbounded.add(r);\r
+ boundResources.put(r, id++);\r
+ } \r
+ Instruction temp = constraint.createQueryInstruction(boundResources, unbounded);\r
+ cur.next = temp;\r
+ cur = temp; \r
+ }\r
+ \r
+ private void applyConstraints(THashSet<Resource> resources, THashSet<IConstraint> constraints) {\r
+ while(!constraints.isEmpty()) {\r
+ findBestConstraint(constraints); \r
+ if(bestConstraint != null) {\r
+ applyConstraint(resources, bestConstraint);\r
+ constraints.remove(bestConstraint);\r
+ }\r
+ else\r
+ throw new RuntimeException("Cannot form a directed mapping.");\r
+ }\r
+ }\r
+ \r
+ public void orderSourceConstraints() {\r
+ applyConstraints(sourceResources, sourceConstraints);\r
+ if(!sourceResources.isEmpty())\r
+ throw new RuntimeException("Couldn't bind all source resources");\r
+ }\r
+ \r
+ public void orderTargetConstraints() {\r
+ THashSet<ConstraintGroup> groups = new THashSet<ConstraintGroup>(constraintGroups);\r
+ while(!groups.isEmpty()) {\r
+ \r
+ // Find a suitable group\r
+ \r
+ final Ref<ConstraintGroup> possibleGroup = new Ref<ConstraintGroup>();\r
+ final Collection<ConstraintGroup> removableGroups = new ArrayList<ConstraintGroup>();\r
+ groups.forEach(new TObjectProcedure<ConstraintGroup>() {\r
+\r
+ @Override\r
+ public boolean execute(ConstraintGroup group) {\r
+ for(Resource target : group.targets)\r
+ if(boundResources.containsKey(target)) {\r
+ removableGroups.add(group);\r
+ return true;\r
+ }\r
+ for(Resource dep : group.dependencies)\r
+ if(!boundResources.containsKey(dep))\r
+ return true;\r
+ possibleGroup.value = group;\r
+ return false;\r
+ }\r
+ \r
+ });\r
+ groups.removeAll(removableGroups);\r
+ if(possibleGroup.value == null) {\r
+ if(!groups.isEmpty())\r
+ throw new RuntimeException("Couldn't find a suitable group.");\r
+ break;\r
+ }\r
+ groups.remove(possibleGroup.value);\r
+ ConstraintGroup group = possibleGroup.value;\r
+ \r
+ // Order group constraints\r
+ \r
+ THashSet<IConstraint> groupConstraints = new THashSet<IConstraint>();\r
+ for(IConstraint constraint : group.constraints)\r
+ if(targetConstraints.remove(constraint))\r
+ groupConstraints.add(constraint);\r
+ \r
+ applyConstraints(targetResources, groupConstraints);\r
+ \r
+ // Apply other constraints\r
+ \r
+ final Collection<IConstraint> removableConstraints = new ArrayList<IConstraint>();\r
+ targetConstraints.forEach(new TObjectProcedure<IConstraint>() {\r
+\r
+ @Override\r
+ public boolean execute(IConstraint constraint) {\r
+ for(Resource r : constraint.binds())\r
+ if(!boundResources.containsKey(r))\r
+ return true;\r
+ \r
+ Instruction temp = constraint.createQueryInstruction(boundResources, EMPTY_SET);\r
+ cur.next = temp;\r
+ cur = temp;\r
+ \r
+ removableConstraints.add(constraint);\r
+ return true;\r
+ }\r
+ \r
+ });\r
+ targetConstraints.removeAll(removableConstraints);\r
+ }\r
+ if(!targetResources.isEmpty())\r
+ throw new RuntimeException("Couldn't bind all target resources");\r
+ }\r
+ \r
+ }\r
+ */\r
+}\r