From f6814d80ffb8d0a66990e6549ec03abbbbccb1a8 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Sat, 1 Nov 2014 01:20:02 +0100 Subject: [PATCH 001/105] Started working on next release, new baseline --- cnf/ext/repositories.bnd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnf/ext/repositories.bnd b/cnf/ext/repositories.bnd index afabf13..110f6d8 100644 --- a/cnf/ext/repositories.bnd +++ b/cnf/ext/repositories.bnd @@ -7,7 +7,7 @@ plugindir: ${workspace}/cnf.shared/bnd -plugin:\ aQute.bnd.deployer.repository.LocalIndexedRepo; name=Release; local=${workspace}/cnf/release;pretty=true,\ aQute.bnd.deployer.repository.FixedIndexedRepo; name=FPAI Bundle Hub; locations=https://raw.githubusercontent.com/flexiblepower/bundle-hub/master/index.xml.gz; cache=${workspace}/cnf/cache,\ - aQute.bnd.deployer.repository.FixedIndexedRepo; name=fpai-core-prev; locations=https://github.com/flexiblepower/fpai-core/releases/download/v13.10/index.xml; cache=${workspace}/cnf/cache + aQute.bnd.deployer.repository.FixedIndexedRepo; name=fpai-core-prev; locations=https://github.com/flexiblepower/fpai-core/releases/download/v14.10/index.xml; cache=${workspace}/cnf/cache #aQute.bnd.deployer.repository.LocalIndexedRepo; name=Local Bundle Hub; local=${workspace}/../bundle-hub; pretty=false,\ -releaserepo: Release From c34a22cd347d8513d8ef3c853446d7dc2d1c883d Mon Sep 17 00:00:00 2001 From: Jan Pieter Wijbenga Date: Mon, 3 Nov 2014 10:13:29 +0100 Subject: [PATCH 002/105] Helper classes: added unconstrained testing Fixed JavaDoc to show when it may throw exceptions Added Helper method --- .../api/efi/bufferhelper/Buffer.java | 16 +- .../api/efi/bufferhelper/BufferActuator.java | 10 +- .../api/efi/commonhelper/TimerModel.java | 3 +- .../unconstrainedhelper/Unconstrained.java | 18 ++ .../api/efi/bufferhelper/BufferTest.java | 7 + .../UnconstrainedTest.java | 183 ++++++++++++++++++ 6 files changed, 232 insertions(+), 5 deletions(-) create mode 100644 flexiblepower.api.efi.utils/test/flexiblepower/api/efi/unconstrainedhelper/UnconstrainedTest.java diff --git a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/Buffer.java b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/Buffer.java index 1d6bd1d..b899b3a 100644 --- a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/Buffer.java +++ b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/Buffer.java @@ -84,6 +84,9 @@ private Buffer(String resourceId, * * @param bsd * The buffer system description message. + * + * @throws IllegalArgumentException + * When the ActuatorId in the BufferSystemDescription is not known */ public void processSystemDescription(BufferSystemDescription bsd) { setLeakageFunction(bsd.getBufferLeakage()); @@ -104,6 +107,9 @@ public void processSystemDescription(BufferSystemDescription bsd) { * * @param bsu * The BufferStateUpdate message. + * + * @throws IllegalArgumentException + * Throws when the ActuatorId, RunningModeId or timerId is not known. */ public void processStateUpdate(BufferStateUpdate bsu) { @@ -115,7 +121,6 @@ public void processStateUpdate(BufferStateUpdate bsu) for (ActuatorUpdate actUpdate : bsu.getCurrentRunningMode()) { if (actuators.containsKey(actUpdate.getActuatorId())) { BufferActuator theActuator = actuators.get(actUpdate.getActuatorId()); - if (!theActuator.hasRunningMode(actUpdate.getCurrentRunningModeId())) { throw new IllegalArgumentException("The RunningModeId in this message is not known."); @@ -173,6 +178,8 @@ public Map getElectricalActuatorMap() { * level unit that is defined in the registration message. * * @return The fill fraction computed where 0 is minimum and 1 is the maximum fill level. + * @throws IllegalArgumentException + * When minimum fill level is greater than or equal to the maximum fill level, this throws. */ public double getCurrentFillFraction() { double minimumFillLevel = getMinimumFillLevel(); @@ -220,9 +227,12 @@ public boolean hasReceivedStateUpdate() { } /** - * * @return The minimum of all actuators, not only the electrical. - */ + * + * @throws IllegalStateException + * When no system description has been received, this throws. + * + **/ public double getMinimumFillLevel() { double lowestBound = Double.MAX_VALUE; if (!hasReceivedSystemDescription) { diff --git a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/BufferActuator.java b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/BufferActuator.java index 610b174..03a345e 100644 --- a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/BufferActuator.java +++ b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/BufferActuator.java @@ -23,7 +23,7 @@ import org.flexiblepower.rai.values.CommoditySet; /** - * The BufferActuator that handles updated EFI messages and provides additional methods. * + * The BufferActuator that integrates updated EFI messages and provides additional methods. */ public class BufferActuator { private final int actuatorId; @@ -111,6 +111,9 @@ public boolean hasRunningMode(int rmId) { * @param now * The current time. * @return The reachable running modes including the current one. + * + * @throws IllegalArgumentException + * When an unknown runningmode id is returned from the reachable running modes. */ public Collection>> getReachableRunningModes(Date now) { Set>> rmSet = new HashSet>>(); @@ -293,6 +296,9 @@ public List> getPossibleDemands(Date moment, double fillLevel) * Gets the minimum fill level of the buffer expressed in the agreed upon unit. * * @return The minimum fill level of the buffer. + * + * @throws IllegalStateException + * Thrown when no running mode is known yet and a minimum fill level is requested. */ public double getMinimumFillLevel() { double lowestBound = Double.MAX_VALUE; @@ -309,6 +315,8 @@ public double getMinimumFillLevel() { * Gets the maximum fill level of the buffer expressed in the agreed upon unit. * * @return The maximum fill level of the buffer. + * @throws IllegalStateException + * Thrown when no running mode is known yet and a maximum fill level is requested. */ public double getMaximumFillLevel() { double upperBound = Double.MIN_VALUE; diff --git a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/commonhelper/TimerModel.java b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/commonhelper/TimerModel.java index e76d73c..1062321 100644 --- a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/commonhelper/TimerModel.java +++ b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/commonhelper/TimerModel.java @@ -14,6 +14,7 @@ public class TimerModel extends org.flexiblepower.efi.util.Timer { * Constructs a new timer. * * @param base + * The object that holds the information from the EFI message about the Timer. */ public TimerModel(org.flexiblepower.efi.util.Timer base) { super(base.getId(), base.getLabel(), base.getDuration()); @@ -38,7 +39,7 @@ public Date getFinishedAt() { } /** - * Returns whether the timer is blocking at this moment. + * Returns whether the timer is blocking at this moment. No finishedAt time implies that this timer is not blocking. * * @param moment * @return A boolean indicating whether the timer is blocking or not at the given moment. diff --git a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/Unconstrained.java b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/Unconstrained.java index ec86ac4..45549ae 100644 --- a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/Unconstrained.java +++ b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/Unconstrained.java @@ -270,4 +270,22 @@ public boolean hasReceivedStateUpdate() { public boolean hasReceivedSystemDescription() { return hasReceivedSystemDescription; } + + /** + * The current running mode. + * + * @return The Id (integer) of the current running mode. + */ + public int getCurrentRunningModeId() { + return currentRunningModeId; + } + + /** + * The ResourceId of this Unconstrained device + * + * @return The ResourceId of this Unconstrained device. + */ + public String getResourceId() { + return resourceId; + } } diff --git a/flexiblepower.api.efi.utils/test/flexiblepower/api/efi/bufferhelper/BufferTest.java b/flexiblepower.api.efi.utils/test/flexiblepower/api/efi/bufferhelper/BufferTest.java index 0b0fb8c..69dc946 100644 --- a/flexiblepower.api.efi.utils/test/flexiblepower/api/efi/bufferhelper/BufferTest.java +++ b/flexiblepower.api.efi.utils/test/flexiblepower/api/efi/bufferhelper/BufferTest.java @@ -1,5 +1,6 @@ package flexiblepower.api.efi.bufferhelper; +import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; @@ -241,10 +242,16 @@ public void testGetPossibleDemands() { List> demandList = a1.getPossibleDemands(new Date(), .2); // First actuator is in must off state. Assert.assertTrue(demandList.size() == 1); + Assert.assertEquals(demandList.get(0).doubleValue(SI.WATT), 0d); BufferActuator a2 = fullBuffer.getActuatorById(2); List> demandList2 = a2.getPossibleDemands(new Date(), .2); // Second actuator should have two possible states. Assert.assertTrue(demandList2.size() == 2); + List demands = new ArrayList(); + demands.add(demandList2.get(0).doubleValue(SI.WATT)); + demands.add(demandList2.get(1).doubleValue(SI.WATT)); + Assert.assertTrue(demands.contains(0d)); + Assert.assertTrue(demands.contains(1000d)); } public void testReceivedMessages() { diff --git a/flexiblepower.api.efi.utils/test/flexiblepower/api/efi/unconstrainedhelper/UnconstrainedTest.java b/flexiblepower.api.efi.utils/test/flexiblepower/api/efi/unconstrainedhelper/UnconstrainedTest.java new file mode 100644 index 0000000..1fc3ef6 --- /dev/null +++ b/flexiblepower.api.efi.utils/test/flexiblepower/api/efi/unconstrainedhelper/UnconstrainedTest.java @@ -0,0 +1,183 @@ +package flexiblepower.api.efi.unconstrainedhelper; + +import java.util.Calendar; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.measure.Measurable; +import javax.measure.Measure; +import javax.measure.quantity.Power; +import javax.measure.unit.NonSI; +import javax.measure.unit.SI; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.flexiblepower.api.efi.unconstrainedhelper.Unconstrained; +import org.flexiblepower.efi.unconstrained.RunningModeBehaviour; +import org.flexiblepower.efi.unconstrained.UnconstrainedRegistration; +import org.flexiblepower.efi.unconstrained.UnconstrainedStateUpdate; +import org.flexiblepower.efi.unconstrained.UnconstrainedSystemDescription; +import org.flexiblepower.efi.util.RunningMode; +import org.flexiblepower.efi.util.Timer; +import org.flexiblepower.efi.util.TimerUpdate; +import org.flexiblepower.efi.util.Transition; +import org.flexiblepower.rai.values.CommodityMeasurables; +import org.flexiblepower.rai.values.CommoditySet; + +public class UnconstrainedTest extends TestCase { + private Unconstrained fullUnconstrained; + private Unconstrained incompleteUnconstrained; + private UnconstrainedRegistration ur; + private UnconstrainedStateUpdate usu; + private UnconstrainedSystemDescription usd; + + @Override + public void setUp() { + incompleteUnconstrained = new Unconstrained(UnconstrainedTest.constructTestUnconstrainedRegistration()); + ur = UnconstrainedTest.constructTestElectricalUnconstrainedRegistration(); + fullUnconstrained = new Unconstrained(ur); + usd = UnconstrainedTest.constructUSD(ur); + usu = UnconstrainedTest.constructUSU(ur, 45); + } + + private static UnconstrainedStateUpdate constructUSU(UnconstrainedRegistration ur, double fillLevel) { + Set timerUpdates = new HashSet(); + + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.MINUTE, 5); + // Set the minimum off timer (timer 2) to be finished 5 minutes from now. + timerUpdates.add(new TimerUpdate(2, cal.getTime())); + + // Unconstrained device is on and in minimum run mode. + return new UnconstrainedStateUpdate(ur.getResourceId(), + new Date(), + new Date(), + 1, + timerUpdates); + } + + private static UnconstrainedSystemDescription constructUSD(UnconstrainedRegistration br) { + // Make an UnconstrainedStateUpdate. + // This fictional device uses both gas and electricity. + CommodityMeasurables commodityConsumptionOn = CommodityMeasurables.create() + .electricity(Measure.valueOf(1000, + SI.WATT)) + .gas(Measure.valueOf(.00025, + NonSI.CUBIC_METRE_PER_SECOND)) + .build(); + CommodityMeasurables commodityConsumptionOff = CommodityMeasurables.create() + .electricity(Measure.valueOf(0, + SI.WATT)) + .gas(Measure.valueOf(0, + NonSI.CUBIC_METRE_PER_SECOND)) + .build(); + + RunningModeBehaviour flf_On = new RunningModeBehaviour(commodityConsumptionOn, + Measure.valueOf(0.24, NonSI.EUR_PER_HOUR)); + RunningModeBehaviour flf_Off = new RunningModeBehaviour(commodityConsumptionOff, + Measure.valueOf(0.24, NonSI.EUR_PER_HOUR)); + + Timer minOnTimer = new Timer(1, "Minimum Run Timer", Measure.valueOf(2, SI.SECOND)); + Set onTimerSet = new HashSet(); + onTimerSet.add(minOnTimer); + + Timer minOffTimer = new Timer(2, "Minimum Off Timer", Measure.valueOf(2, SI.SECOND)); + Set offTimerSet = new HashSet(); + offTimerSet.add(minOffTimer); + + Set transitionsFromOn = new HashSet(); + transitionsFromOn.add(new Transition(2, + onTimerSet, + offTimerSet, + Measure.valueOf(0, NonSI.EUR), + Measure.valueOf(0, SI.SECOND))); + + Set transitionsFromOff = new HashSet(); + transitionsFromOff.add(new Transition(1, + offTimerSet, + onTimerSet, + Measure.valueOf(0, NonSI.EUR), + Measure.valueOf(0, SI.SECOND))); + + Set> runningModeSet = new HashSet>(); + runningModeSet.add(new RunningMode(2, + "rmOn", + flf_On, + transitionsFromOff)); + runningModeSet.add(new RunningMode(1, + "rmOff", + flf_Off, + transitionsFromOn)); + + return new UnconstrainedSystemDescription(br.getResourceId(), + new Date(), + new Date(), + runningModeSet); + } + + private static UnconstrainedRegistration constructTestElectricalUnconstrainedRegistration() { + return new UnconstrainedRegistration("BR1", + new Date(), + Measure.zero(SI.SECOND), + CommoditySet.onlyElectricity); + } + + private static UnconstrainedRegistration constructTestUnconstrainedRegistration() { + return new UnconstrainedRegistration("BR2", + new Date(), + Measure.zero(SI.SECOND), + CommoditySet.onlyGas); + } + + public void testGetReachableRunningModes() { + Assert.assertTrue(incompleteUnconstrained.getReachableRunningModes(new Date()).isEmpty()); + + fullUnconstrained.processSystemDescription(usd); + // Unconstrained device is off (rm 1) and in minimum off time for 5 minutes. + fullUnconstrained.processStateUpdate(usu); + + Set reachableRunningModes = fullUnconstrained.getReachableRunningModeIds(new Date()); + // Minimum Off timer restricts unconstrained from going to rm 2 (on). + Assert.assertTrue(reachableRunningModes.contains(fullUnconstrained.getCurrentRunningModeId())); + Assert.assertEquals(fullUnconstrained.getCurrentRunningModeId(), 1); + Assert.assertFalse(reachableRunningModes.contains(2)); + + // Also in 4 minutes from now, the running mode with id 2 should not be reachable. + Calendar cal2 = Calendar.getInstance(); + cal2.add(Calendar.MINUTE, 4); + Assert.assertFalse(fullUnconstrained.getReachableRunningModeIds(cal2.getTime()).contains(2)); + + // In 6 minutes from now, the running mode with id 2 should be reachable. + Calendar cal3 = Calendar.getInstance(); + cal3.add(Calendar.MINUTE, 6); + + Assert.assertTrue(fullUnconstrained.getReachableRunningModeIds(cal3.getTime()).contains(2)); + } + + public void testGetPossibleDemands() { + fullUnconstrained.processSystemDescription(usd); + fullUnconstrained.processStateUpdate(usu); + List> demandList = fullUnconstrained.getPossibleDemands(new Date(), .2); + // Unconstrained device is in must off state. + Assert.assertTrue(demandList.size() == 1); + Assert.assertEquals(demandList.get(0).doubleValue(SI.WATT), 0d); + } + + public void testReceivedMessages() { + Assert.assertFalse(fullUnconstrained.hasReceivedSystemDescription()); + Assert.assertFalse(fullUnconstrained.hasReceivedStateUpdate()); + + // Ignore state update if system description is not in yet. + fullUnconstrained.processStateUpdate(usu); + Assert.assertFalse(fullUnconstrained.hasReceivedSystemDescription()); + Assert.assertFalse(fullUnconstrained.hasReceivedStateUpdate()); + + fullUnconstrained.processSystemDescription(usd); + Assert.assertTrue(fullUnconstrained.hasReceivedSystemDescription()); + fullUnconstrained.processStateUpdate(usu); + Assert.assertTrue(fullUnconstrained.hasReceivedStateUpdate()); + } +} From 900aa40e1a6d948ca0cad6a8f7514c7c9a9301dc Mon Sep 17 00:00:00 2001 From: Jan Kazemier Date: Tue, 4 Nov 2014 13:52:44 +0100 Subject: [PATCH 003/105] Created a duplicate (!) of the ConnectionManager from Felix into the FPAI UI Note that this is a duplicate, with code duplication, maybe this could be done in a nicer way? --- cnf/demo.bndrun | 4 +- .../messaging/EndpointConfig.java | 24 -- flexiblepower.ui.connectionspage/.checkstyle | 10 + flexiblepower.ui.connectionspage/.classpath | 7 + flexiblepower.ui.connectionspage/.project | 29 ++ .../.settings/bndtools.core.prefs | 3 + .../org.eclipse.core.resources.prefs | 2 + .../.settings/org.eclipse.jdt.core.prefs | 288 ++++++++++++++++++ .../.settings/org.eclipse.jdt.ui.prefs | 62 ++++ flexiblepower.ui.connectionspage/bnd.bnd | 9 + flexiblepower.ui.connectionspage/build.xml | 7 + .../res/OSGI-INF/permissions.perm | 1 + .../res/img/appliance.png | Bin 0 -> 1764 bytes .../ConnectionsPage/connectionManager.js | 223 ++++++++++++++ .../widgets/ConnectionsPage/cytoscape.min.js | 24 ++ .../res/widgets/ConnectionsPage/index.html | 66 ++++ .../res/widgets/ConnectionsPage/menu.png | Bin 0 -> 1795 bytes .../res/widgets/ConnectionsPage/script.js | 3 + .../ConnectionsImageServlet.java | 94 ++++++ .../ui/connectionspage/ConnectionsPage.java | 15 + 20 files changed, 846 insertions(+), 25 deletions(-) delete mode 100644 flexiblepower.api/src/org/flexiblepower/messaging/EndpointConfig.java create mode 100644 flexiblepower.ui.connectionspage/.checkstyle create mode 100644 flexiblepower.ui.connectionspage/.classpath create mode 100644 flexiblepower.ui.connectionspage/.project create mode 100644 flexiblepower.ui.connectionspage/.settings/bndtools.core.prefs create mode 100644 flexiblepower.ui.connectionspage/.settings/org.eclipse.core.resources.prefs create mode 100644 flexiblepower.ui.connectionspage/.settings/org.eclipse.jdt.core.prefs create mode 100644 flexiblepower.ui.connectionspage/.settings/org.eclipse.jdt.ui.prefs create mode 100644 flexiblepower.ui.connectionspage/bnd.bnd create mode 100644 flexiblepower.ui.connectionspage/build.xml create mode 100644 flexiblepower.ui.connectionspage/res/OSGI-INF/permissions.perm create mode 100644 flexiblepower.ui.connectionspage/res/img/appliance.png create mode 100644 flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/connectionManager.js create mode 100644 flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/cytoscape.min.js create mode 100644 flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/index.html create mode 100644 flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/menu.png create mode 100644 flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/script.js create mode 100644 flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionsImageServlet.java create mode 100644 flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionsPage.java diff --git a/cnf/demo.bndrun b/cnf/demo.bndrun index 4a26293..fcce99c 100644 --- a/cnf/demo.bndrun +++ b/cnf/demo.bndrun @@ -19,7 +19,8 @@ osgi.identity;filter:='(osgi.identity=flexiblepower.runtime)',\ osgi.identity;filter:='(osgi.identity=flexiblepower.runtime.simulation)',\ osgi.identity;filter:='(osgi.identity=flexiblepower.api)',\ - osgi.identity;filter:='(osgi.identity=flexiblepower.felix.webconsole.plugins)' + osgi.identity;filter:='(osgi.identity=flexiblepower.felix.webconsole.plugins)',\ + osgi.identity;filter:='(osgi.identity=flexiblepower.ui.connectionspage)' -runbundles: \ biz.aQute.bnd.annotation;version='[2.4.0,2.4.1)',\ ch.qos.logback.classic;version='[1.1.2,1.1.3)',\ @@ -32,6 +33,7 @@ flexiblepower.runtime.simulation;version=latest,\ flexiblepower.runtime.test;version=latest,\ flexiblepower.ui;version=latest,\ + flexiblepower.ui.connectionspage;version=latest,\ flexiblepower.ui.resourceinfo;version=latest,\ junit.osgi;version='[3.8.2,3.8.3)',\ org.apache.commons.io;version='[2.4.0,2.4.1)',\ diff --git a/flexiblepower.api/src/org/flexiblepower/messaging/EndpointConfig.java b/flexiblepower.api/src/org/flexiblepower/messaging/EndpointConfig.java deleted file mode 100644 index 4384777..0000000 --- a/flexiblepower.api/src/org/flexiblepower/messaging/EndpointConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.flexiblepower.messaging; - -import aQute.bnd.annotation.metatype.Meta; - -/** - * An interface that can be used for the generating a default configuration for an endpoint in metatype. - */ -@Meta.OCD(name = "Endpoint configuration", factory = false) -public interface EndpointConfig { - @Meta.AD(description = "The name(s) of the topic(s) on which the connection should be set-up.", - name = "Message Topic", - required = true) - String[] messaging_topic(); - - @Meta.AD(description = "A target Filter to look for a specific Endpoint(s) to connect with.", - name = "Message Filter", - required = false) - String messaging_filter(); - - @Meta.AD(description = "The class names which are valid messages that this class will send across the connection.", - name = "Message Type", - required = false) - String[] messaging_type(); -} diff --git a/flexiblepower.ui.connectionspage/.checkstyle b/flexiblepower.ui.connectionspage/.checkstyle new file mode 100644 index 0000000..aadbdc2 --- /dev/null +++ b/flexiblepower.ui.connectionspage/.checkstyle @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/flexiblepower.ui.connectionspage/.classpath b/flexiblepower.ui.connectionspage/.classpath new file mode 100644 index 0000000..1b35e9d --- /dev/null +++ b/flexiblepower.ui.connectionspage/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/flexiblepower.ui.connectionspage/.project b/flexiblepower.ui.connectionspage/.project new file mode 100644 index 0000000..7a9beec --- /dev/null +++ b/flexiblepower.ui.connectionspage/.project @@ -0,0 +1,29 @@ + + + flexiblepower.ui.connectionspage + + + + + + org.eclipse.jdt.core.javabuilder + + + + + bndtools.core.bndbuilder + + + + + net.sf.eclipsecs.core.CheckstyleBuilder + + + + + + org.eclipse.jdt.core.javanature + bndtools.core.bndnature + net.sf.eclipsecs.core.CheckstyleNature + + diff --git a/flexiblepower.ui.connectionspage/.settings/bndtools.core.prefs b/flexiblepower.ui.connectionspage/.settings/bndtools.core.prefs new file mode 100644 index 0000000..cfd70fe --- /dev/null +++ b/flexiblepower.ui.connectionspage/.settings/bndtools.core.prefs @@ -0,0 +1,3 @@ +compileErrorAction=skip +eclipse.preferences.version=1 +eclipseClasspath=expose diff --git a/flexiblepower.ui.connectionspage/.settings/org.eclipse.core.resources.prefs b/flexiblepower.ui.connectionspage/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ b/flexiblepower.ui.connectionspage/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/flexiblepower.ui.connectionspage/.settings/org.eclipse.jdt.core.prefs b/flexiblepower.ui.connectionspage/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..2db129a --- /dev/null +++ b/flexiblepower.ui.connectionspage/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,288 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=82 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=82 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=82 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=82 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=82 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=82 +org.eclipse.jdt.core.formatter.alignment_for_assignment=82 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=82 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=82 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=82 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=82 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=82 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=82 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=82 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=82 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=82 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=82 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=82 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=82 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=82 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=82 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=82 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=82 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true +org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert +org.eclipse.jdt.core.formatter.comment.line_length=120 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.lineSplit=120 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=space +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/flexiblepower.ui.connectionspage/.settings/org.eclipse.jdt.ui.prefs b/flexiblepower.ui.connectionspage/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 0000000..fdf3387 --- /dev/null +++ b/flexiblepower.ui.connectionspage/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,62 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_FlexiblePowerSuite +formatter_settings_version=12 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=true +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=false +sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=false +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=true +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.on_save_use_additional_actions=true +sp_cleanup.organize_imports=true +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=true +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_type_arguments=false +sp_cleanup.remove_trailing_whitespaces=true +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=true +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=true +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=false +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=true +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=true +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true +sp_cleanup.use_type_arguments=false diff --git a/flexiblepower.ui.connectionspage/bnd.bnd b/flexiblepower.ui.connectionspage/bnd.bnd new file mode 100644 index 0000000..8727819 --- /dev/null +++ b/flexiblepower.ui.connectionspage/bnd.bnd @@ -0,0 +1,9 @@ +-buildpath: ${default-buildpath},\ + org.apache.felix.http.servlet-api,\ + flexiblepower.runtime;version=latest + +Bundle-Version: 1.1.0.${qualifier} +Private-Package: org.flexiblepower.runtime.ui.connectionspage +Service-Component: org.flexiblepower.runtime.ui.connectionspage.* +Import-Package: \ + * \ No newline at end of file diff --git a/flexiblepower.ui.connectionspage/build.xml b/flexiblepower.ui.connectionspage/build.xml new file mode 100644 index 0000000..d808368 --- /dev/null +++ b/flexiblepower.ui.connectionspage/build.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/flexiblepower.ui.connectionspage/res/OSGI-INF/permissions.perm b/flexiblepower.ui.connectionspage/res/OSGI-INF/permissions.perm new file mode 100644 index 0000000..6ef0af6 --- /dev/null +++ b/flexiblepower.ui.connectionspage/res/OSGI-INF/permissions.perm @@ -0,0 +1 @@ +(java.security.AllPermission "" "") diff --git a/flexiblepower.ui.connectionspage/res/img/appliance.png b/flexiblepower.ui.connectionspage/res/img/appliance.png new file mode 100644 index 0000000000000000000000000000000000000000..396289b2beb7277d78e59474e1e9f1c001299b30 GIT binary patch literal 1764 zcmV00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000J4Nkl0ydqV(=S)#R zc+Tjstl|5z-;_gyWsTUE{nj4^b1y#(s;JMVTNwnH0uxMj&s!5ojEL~@S~H3^Wjw<@$u=R1>reN6!b=M^W zc;nAfA12v%fHm(laIHLqWZ$8p{-$JLXU1T7JC;A2WZxk}6)qWwEB*rBU>*!6C6)LH zxG^*MQGkG>5|#J@8L9)AwzLx;$(w~2@efvFvCJvd#%@UN1_^IYeL*t7nsp&*z0kw4 z{14QPxmZtzz&gKB5{Rin+}9=2X|%F2e^=%ZN5P@oi5E&%!;wQiarxo;qj~Q?e%imO ziH6L{0Kf`bII=p5$BraRz=*NvMs&;FBz|F&FJTTgxFuVrMnR~ z`i9=<1Gk;HdrOP7=O|Y@tqnNf#YWCz;4KZF3JybTtv_KvGL%_M+BD!Rv}?f3H=8;8 zt9xN;qz1h}YXjE0QgiNJK5ix#GsYM_#27VLdUZ1*2N{o!VFI%W5Cvl+@ratQ`kKX>LG5;_Y}nS=vp&W|F=B^Y+!bI^*A+1by;O+r0;@FnOP z?%gE01Q_UHABG4LIt#eb8KZ|m*Ko5Y$tB2ukiDIR&O(}jL%pRLxVDNUmtc(1L#1Je zn?XWnA*wT=UkEoRpTSLl4SU+!P(fO!V7jyf4Y+ytV?<3RHpInFC(Zka6{*;%`!g@? z#IT!SbEc%#sCpH#CXYSX3wsnRb4Ya+`&o$Bv%mGh7U3W*YO=7*@K8j6jIlFAksDnX~ELg8!^Dqg^=WVstdy}FIl00Qd=#*91RCq0XKA$|625h3J z-x;JB(_87+>%XCyGn!3|rK)m*3|J~vngvrF>8j_A)dnxC-Tq^B;HMQ+hdT7y(C@Ln ze2@&-Oq^==C`_?($t*7IN>fu476aDChWeO8%E<%C!;W=SAP*!1+Ms2aoPKMY18gq4 zub$_J)wuM3NRnlk_=#UA%T#S!mpQEK|djChq~|( zbj#mLC#kDp;PVOz)hz#zgm$r1YtR5VA*rij6chSELWZc_By@yk{@YL=?oo8z)iAiM z8_pgfp(CnSd?FbLl8pi7#QxF@MD8M?BXGOWuK$v*yBhioz_^moE~2hdF}@Gf*Y6G{ zsjFdhn^!_Yim@-lDTuVTfnyR>hA?F&lhoBProtS|sl!RIRH>DdUWJ;lZIdJeq@B1X zFaSNYvoK)s;Qa@}m~x3!86X)D4f=}rhGTM7U;CTxwD?xS%JXc(pQ;%nv4U=kTi*nF z96F7fRb`Iz90WWDz@ZI7yK(vBx^}}?SYJMn0YEh9V0&`p+A1ohz1DDAj=!sO8bIJ| zR~NpeYS|ps%s1c&t@a;Rvu07lsR&qRR6}O8HsE74H~$OeYyY9?1_vwv0000. + */ +var cytoscape;!function(e){"use strict";var t=cytoscape=function(){return cytoscape.init.apply(cytoscape,arguments)};t.version="2.3.1",t.init=function(e){return void 0===e&&(e={}),t.is.plainObject(e)?new t.Core(e):t.is.string(e)?t.extension.apply(t.extension,arguments):void 0},t.fn={},"undefined"!=typeof module&&module.exports&&(module.exports=cytoscape),"undefined"!=typeof define&&define.amd&&define("cytoscape",function(){return cytoscape}),e&&(e.cytoscape=cytoscape)}("undefined"==typeof window?null:window),function(e,t){"use strict";e.is={defined:function(e){return null!=e},string:function(e){return null!=e&&"string"==typeof e},fn:function(e){return null!=e&&"function"==typeof e},array:function(e){return Array.isArray?Array.isArray(e):null!=e&&e instanceof Array},plainObject:function(t){return null!=t&&typeof t==typeof{}&&!e.is.array(t)&&t.constructor===Object},number:function(e){return null!=e&&"number"==typeof e&&!isNaN(e)},integer:function(t){return e.is.number(t)&&Math.floor(t)===t},color:function(e){return null!=e&&"string"==typeof e&&""!==$.Color(e).toString()},bool:function(e){return null!=e&&typeof e==typeof!0},elementOrCollection:function(t){return e.is.element(t)||e.is.collection(t)},element:function(t){return t instanceof e.Element&&t._private.single},collection:function(t){return t instanceof e.Collection&&!t._private.single},core:function(t){return t instanceof e.Core},style:function(t){return t instanceof e.Style},stylesheet:function(t){return t instanceof e.Stylesheet},event:function(t){return t instanceof e.Event},emptyString:function(t){return t?e.is.string(t)&&(""===t||t.match(/^\s+$/))?!0:!1:!0},nonemptyString:function(t){return t&&e.is.string(t)&&""!==t&&!t.match(/^\s+$/)?!0:!1},domElement:function(e){return"undefined"==typeof HTMLElement?!1:e instanceof HTMLElement},touch:function(){return t&&("ontouchstart"in t||t.DocumentTouch&&document instanceof DocumentTouch)},boundingBox:function(t){return e.is.plainObject(t)&&e.is.number(t.x1)&&e.is.number(t.x2)&&e.is.number(t.y1)&&e.is.number(t.y2)}}}(cytoscape,"undefined"==typeof window?null:window),function(e,t){"use strict";e.util={extend:function(){var t,i,r,n,a,o,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||e.is.fn(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(t=arguments[l]))for(i in t)r=s[i],n=t[i],s!==n&&(c&&n&&(e.is.plainObject(n)||(a=e.is.array(n)))?(a?(a=!1,o=r&&e.is.array(r)?r:[]):o=r&&e.is.plainObject(r)?r:{},s[i]=e.util.extend(c,o,n)):void 0!==n&&(s[i]=n));return s},require:function(i,r,n){var a;n=e.util.extend({msgIfNotFound:!0},n);var o=!1,s=function(e){o=!0,r(e)},l=function(e){t&&(a=t[i]),void 0!==a&&s(a),e&&e()},u=function(){o||c(d)},c=function(e){"undefined"!=typeof module&&module.exports&&require&&(a=require(i)),void 0!==a&&s(a),e&&e()},d=function(){o||p(h)},p=function(e){"undefined"!=typeof define&&define.amd&&require&&require([i],function(t){a=t,void 0!==a&&s(a),e&&e()})},h=function(){!o&&n.msgIfNotFound&&e.util.error("Cytoscape.js tried to pull in dependency `"+i+"` but no module (i.e. CommonJS, AMD, or window) was found")};l(u)},requires:function(t,i){for(var r=[],n=[],a=function(){for(var e=0;e=r){a&&clearTimeout(a);var p=c;a=u=c=void 0,p&&(d=e.util.now(),o=t.apply(l,n),u||a||(n=l=null))}else u=setTimeout(f,r)},g=function(){u&&clearTimeout(u),a=u=c=void 0,(h||p!==i)&&(d=e.util.now(),o=t.apply(l,n),u||a||(n=l=null))};return function(){if(n=arguments,s=e.util.now(),l=this,c=h&&(u||!v),p===!1)var r=v&&!u;else{a||v||(d=s);var y=p-(s-d),m=0>=y;m?(a&&(a=clearTimeout(a)),d=s,o=t.apply(l,n)):a||(a=setTimeout(g,y))}return m&&u?u=clearTimeout(u):u||i===p||(u=setTimeout(f,i)),r&&(m=!0,o=t.apply(l,n)),!m||u||a||(n=l=null),o}}},error:function(e){if(!console)throw e;if(console.error)console.error.apply(console,arguments);else{if(!console.log)throw e;console.log.apply(console,arguments)}},clone:function(e){var t={};for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t},copy:function(t){return null==t?t:e.is.array(t)?t.slice():e.is.plainObject(t)?e.util.clone(t):t},makeBoundingBox:function(e){if(null!=e.x1&&null!=e.y1){if(null!=e.x2&&null!=e.y2&&e.x2>=e.x1&&e.y2>=e.y1)return{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,w:e.x2-e.x1,h:e.y2-e.y1};if(null!=e.w&&null!=e.h&&e.w>=0&&e.h>=0)return{x1:e.x1,y1:e.y1,x2:e.x1+e.w,y2:e.y1+e.h,w:e.w,h:e.h}}},mapEmpty:function(e){var t=!0;if(null!=e)for(var i in e){t=!1;break}return t},pushMap:function(t){var i=e.util.getMap(t);null==i?e.util.setMap($.extend({},t,{value:[t.value]})):i.push(t.value)},setMap:function(t){for(var i,r=t.map,n=t.keys,a=n.length,o=0;a>o;o++){var i=n[o];e.is.plainObject(i)&&e.util.error("Tried to set map with object key"),oa;a++){var o=r[a];if(e.is.plainObject(o)&&e.util.error("Tried to get map with object key"),i=i[o],null==i)return i}return i},deleteMap:function(t){for(var i=t.map,r=t.keys,n=r.length,a=t.keepChildren,o=0;n>o;o++){var s=r[o];e.is.plainObject(s)&&e.util.error("Tried to delete map with object key");var l=o===t.keys.length-1;if(l)if(a)for(var u in i)a[u]||(i[u]=void 0);else i[s]=void 0;else i=i[s]}},capitalize:function(t){return e.is.emptyString(t)?t:t.charAt(0).toUpperCase()+t.substring(1)},camel2dash:function(e){for(var t=[],i=0;it&&" "===e[i];i--);return e.substring(t,i+1)},hex2tuple:function(e){if((4===e.length||7===e.length)&&"#"===e[0]){var t,i,r,n=4===e.length,a=16;return n?(t=parseInt(e[1]+e[1],a),i=parseInt(e[2]+e[2],a),r=parseInt(e[3]+e[3],a)):(t=parseInt(e[1]+e[2],a),i=parseInt(e[3]+e[4],a),r=parseInt(e[5]+e[6],a)),[t,i,r]}},hsl2tuple:function(t){function i(e,t,i){return 0>i&&(i+=1),i>1&&(i-=1),1/6>i?e+6*(t-e)*i:.5>i?t:2/3>i?e+(t-e)*(2/3-i)*6:e}var r,n,a,o,s,l,u,c,d=new RegExp("^"+e.util.regex.hsla+"$").exec(t);if(d){if(n=parseInt(d[1]),0>n?n=(360- -1*n%360)%360:n>360&&(n%=360),n/=360,a=parseFloat(d[2]),0>a||a>100)return;if(a/=100,o=parseFloat(d[3]),0>o||o>100)return;if(o/=100,s=d[4],void 0!==s&&(s=parseFloat(s),0>s||s>1))return;if(0===a)l=u=c=Math.round(255*o);else{var p=.5>o?o*(1+a):o+a-o*a,h=2*o-p;l=Math.round(255*i(h,p,n+1/3)),u=Math.round(255*i(h,p,n)),c=Math.round(255*i(h,p,n-1/3))}r=[l,u,c,s]}return r},rgb2tuple:function(t){var i,r=new RegExp("^"+e.util.regex.rgba+"$").exec(t);if(r){i=[];for(var n=[],a=1;3>=a;a++){var o=r[a];if("%"===o[o.length-1]&&(n[a]=!0),o=parseFloat(o),n[a]&&(o=o/100*255),0>o||o>255)return;i.push(Math.floor(o))}var s=n[1]||n[2]||n[3],l=n[1]&&n[2]&&n[3];if(s&&!l)return;var u=r[4];if(void 0!==u){if(u=parseFloat(u),0>u||u>1)return;i.push(u)}}return i},colorname2tuple:function(t){return e.util.colors[t.toLowerCase()]},color2tuple:function(t){return(e.is.array(t)?t:null)||e.util.colorname2tuple(t)||e.util.hex2tuple(t)||e.util.rgb2tuple(t)||e.util.hsl2tuple(t)},tuple2hex:function(e){function t(e){var t=e.toString(16);return 1===t.length&&(t="0"+t),t}var i=e[0],r=e[1],n=e[2];return"#"+t(i)+t(r)+t(n)},colors:{transparent:[0,0,0,0],aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},e.util.regex={},e.util.regex.number="(?:[-]?\\d*\\.\\d+|[-]?\\d+|[-]?\\d*\\.\\d+[eE]\\d+)",e.util.regex.rgba="rgb[a]?\\(("+e.util.regex.number+"[%]?)\\s*,\\s*("+e.util.regex.number+"[%]?)\\s*,\\s*("+e.util.regex.number+"[%]?)(?:\\s*,\\s*("+e.util.regex.number+"))?\\)",e.util.regex.rgbaNoBackRefs="rgb[a]?\\((?:"+e.util.regex.number+"[%]?)\\s*,\\s*(?:"+e.util.regex.number+"[%]?)\\s*,\\s*(?:"+e.util.regex.number+"[%]?)(?:\\s*,\\s*(?:"+e.util.regex.number+"))?\\)",e.util.regex.hsla="hsl[a]?\\(("+e.util.regex.number+")\\s*,\\s*("+e.util.regex.number+"[%])\\s*,\\s*("+e.util.regex.number+"[%])(?:\\s*,\\s*("+e.util.regex.number+"))?\\)",e.util.regex.hslaNoBackRefs="hsl[a]?\\((?:"+e.util.regex.number+")\\s*,\\s*(?:"+e.util.regex.number+"[%])\\s*,\\s*(?:"+e.util.regex.number+"[%])(?:\\s*,\\s*(?:"+e.util.regex.number+"))?\\)",e.util.regex.hex3="\\#[0-9a-fA-F]{3}",e.util.regex.hex6="\\#[0-9a-fA-F]{6}";var i=t?t.requestAnimationFrame||t.mozRequestAnimationFrame||t.webkitRequestAnimationFrame||t.msRequestAnimationFrame:null;i=i||function(e){e&&setTimeout(e,1e3/60)},e.util.requestAnimationFrame=function(e){i(e)}}(cytoscape,"undefined"==typeof window?null:window),function(e){"use strict";e.math={},e.math.signum=function(e){return e>0?1:0>e?-1:0},e.math.distance=function(e,t){var i=t.x-e.x,r=t.y-e.y;return Math.sqrt(i*i+r*r)},e.math.qbezierAt=function(e,t,i,r){return(1-r)*(1-r)*e+2*(1-r)*r*t+r*r*i},e.math.qbezierPtAt=function(t,i,r,n){return{x:e.math.qbezierAt(t.x,i.x,r.x,n),y:e.math.qbezierAt(t.y,i.y,r.y,n)}},e.math.boundingBoxesIntersect=function(e,t){return e.x1>t.x2?!1:t.x1>e.x2?!1:e.x2t.y2?!1:t.y1>e.y2?!1:!0},e.math.inBoundingBox=function(e,t,i){return e.x1<=t&&t<=e.x2&&e.y1<=i&&i<=e.y2},e.math.pointInBoundingBox=function(e,t){return this.inBoundingBox(e,t.x,t.y)},e.math.roundRectangleIntersectLine=function(e,t,i,r,n,a,o){var s,l=this.getRoundRectangleRadius(n,a),u=n/2,c=a/2,d=i-u+l-o,p=r-c-o,h=i+u-l+o,v=p;if(s=this.finiteLinesIntersect(e,t,i,r,d,p,h,v,!1),s.length>0)return s;var f=i+u+o,g=r-c+l-o,y=f,m=r+c-l+o;if(s=this.finiteLinesIntersect(e,t,i,r,f,g,y,m,!1),s.length>0)return s;var x=i-u+l-o,b=r+c+o,w=i+u-l+o,_=b;if(s=this.finiteLinesIntersect(e,t,i,r,x,b,w,_,!1),s.length>0)return s;var E=i-u-o,S=r-c+l-o,P=E,k=r+c-l+o;if(s=this.finiteLinesIntersect(e,t,i,r,E,S,P,k,!1),s.length>0)return s;var C,D=i-u+l,N=r-c+l;if(C=this.intersectLineCircle(e,t,i,r,D,N,l+o),C.length>0&&C[0]<=D&&C[1]<=N)return[C[0],C[1]];var T=i+u-l,M=r-c+l;if(C=this.intersectLineCircle(e,t,i,r,T,M,l+o),C.length>0&&C[0]>=T&&C[1]<=M)return[C[0],C[1]];var B=i+u-l,I=r+c-l;if(C=this.intersectLineCircle(e,t,i,r,B,I,l+o),C.length>0&&C[0]>=B&&C[1]>=I)return[C[0],C[1]];var z=i-u+l,L=r+c-l;return C=this.intersectLineCircle(e,t,i,r,z,L,l+o),C.length>0&&C[0]<=z&&C[1]>=L?[C[0],C[1]]:[]},e.math.roundRectangleIntersectBox=function(e,t,i,r,n,a,o,s,l){var u=this.getRoundRectangleRadius(n,a),c=o-n/2-l,d=s-a/2+u-l,p=o+n/2+l,h=s+a/2-u+l,v=o-n/2+u-l,f=s-a/2-l,g=o+n/2-u+l,y=s+a/2+l,m=Math.min(e,i),x=Math.max(e,i),b=Math.min(t,r),w=Math.max(t,r);return c>x?!1:m>p?!1:f>w?!1:b>y?!1:c>=m&&x>=c&&d>=b&&w>=d?!0:p>=m&&x>=p&&d>=b&&w>=d?!0:p>=m&&x>=p&&h>=b&&w>=h?!0:c>=m&&x>=c&&h>=b&&w>=h?!0:m>=c&&p>=m&&b>=d&&h>=b?!0:x>=c&&p>=x&&b>=d&&h>=b?!0:x>=c&&p>=x&&w>=d&&h>=w?!0:m>=c&&p>=m&&w>=d&&h>=w?!0:v>=m&&x>=v&&f>=b&&w>=f?!0:g>=m&&x>=g&&f>=b&&w>=f?!0:g>=m&&x>=g&&y>=b&&w>=y?!0:v>=m&&x>=v&&y>=b&&w>=y?!0:m>=v&&g>=m&&b>=f&&y>=b?!0:x>=v&&g>=x&&b>=f&&y>=b?!0:x>=v&&g>=x&&w>=f&&y>=w?!0:m>=v&&g>=m&&w>=f&&y>=w?!0:this.boxIntersectEllipse(m,b,x,w,l,2*u,2*u,v+l,d+l)?!0:this.boxIntersectEllipse(m,b,x,w,l,2*u,2*u,g-l,d+l)?!0:this.boxIntersectEllipse(m,b,x,w,l,2*u,2*u,g-l,h-l)?!0:this.boxIntersectEllipse(m,b,x,w,l,2*u,2*u,v+l,h-l)?!0:!1},e.math.checkInBoundingCircle=function(e,t,i,r,n,a,o,s){return e=(e-o)/(n+r),t=(t-s)/(a+r),i>=e*e+t*t},e.math.boxInBezierVicinity=function(e,t,i,r,n,a,o,s,l,u,c){var d=.25*n+.5*o+.25*l,p=.25*a+.5*s+.25*u,h=Math.min(e,i)-c,v=Math.min(t,r)-c,f=Math.max(e,i)+c,g=Math.max(t,r)+c;if(n>=h&&f>=n&&a>=v&&g>=a)return 1;if(l>=h&&f>=l&&u>=v&&g>=u)return 1;if(d>=h&&f>=d&&p>=v&&g>=p)return 1;if(o>=h&&f>=o&&s>=v&&g>=s)return 1;var y=Math.min(n,d,l),m=Math.min(a,p,u),x=Math.max(n,d,l),b=Math.max(a,p,u);return y>f||h>x||m>g||v>b?0:1},e.math.checkBezierInBox=function(t,i,r,n,a,o,s,l,u,c){function d(d){var p=e.math.qbezierAt(a,s,u,d),h=e.math.qbezierAt(o,l,c,d);return p>=t&&r>=p&&h>=i&&n>=h}for(var p=0;1>=p;p+=.25)if(!d(p))return!1;return!0},e.math.checkStraightEdgeInBox=function(e,t,i,r,n,a,o,s){return n>=e&&i>=n&&o>=e&&i>=o&&a>=t&&r>=a&&s>=t&&r>=s},e.math.checkStraightEdgeCrossesBox=function(e,t,i,r,n,a,o,s,l){var u,c,d=Math.min(e,i)-l,p=Math.min(t,r)-l,h=Math.max(e,i)+l,v=Math.max(t,r)+l,f=o-n,g=n,y=s-a,m=a;if(Math.abs(f)<1e-4)return n>=d&&h>=n&&Math.min(a,s)<=p&&Math.max(a,s)>=v;var x=(d-g)/f;if(x>0&&1>=x&&(u=y*x+m,u>=p&&v>=u))return!0;var b=(h-g)/f;if(b>0&&1>=b&&(u=y*b+m,u>=p&&v>=u))return!0;var w=(p-m)/y;if(w>0&&1>=w&&(c=f*w+g,c>=d&&h>=c))return!0;var _=(v-m)/y;return _>0&&1>=_&&(c=f*_+g,c>=d&&h>=c)?!0:!1},e.math.checkBezierCrossesBox=function(e,t,i,r,n,a,o,s,l,u,c){var d=Math.min(e,i)-c,p=Math.min(t,r)-c,h=Math.max(e,i)+c,v=Math.max(t,r)+c;if(n>=d&&h>=n&&a>=p&&v>=a)return!0;if(l>=d&&h>=l&&u>=p&&v>=u)return!0;var f=n-2*o+l,g=-2*n+2*o,y=n,m=[];if(Math.abs(f)<1e-4){var x=(d-n)/g,b=(h-n)/g;m.push(x,b)}else{var w,_,E=g*g-4*f*(y-d);if(E>0){var S=Math.sqrt(E);w=(-g+S)/(2*f),_=(-g-S)/(2*f),m.push(w,_)}var P,k,C=g*g-4*f*(y-h);if(C>0){var S=Math.sqrt(C);P=(-g+S)/(2*f),k=(-g-S)/(2*f),m.push(P,k)}}m.sort(function(e,t){return e-t});var D=a-2*s+u,N=-2*a+2*s,T=a,M=[];if(Math.abs(D)<1e-4){var B=(p-a)/N,I=(v-a)/N;M.push(B,I)}else{var z,L,O=N*N-4*D*(T-p);if(O>0){var S=Math.sqrt(O);z=(-N+S)/(2*D),L=(-N-S)/(2*D),M.push(z,L)}var R,X,V=N*N-4*D*(T-v);if(V>0){var S=Math.sqrt(V);R=(-N+S)/(2*D),X=(-N-S)/(2*D),M.push(R,X)}}M.sort(function(e,t){return e-t});for(var Y=0;Y=0&&m[Y]<=1&&m[Y+1]>M[A-1]&&M[A-1]<=1&&m[Y+1]>=0)return!0;return!1},e.math.inLineVicinity=function(e,t,i,r,n,a,o){var s=o,l=Math.min(i,n),u=Math.max(i,n),c=Math.min(r,a),d=Math.max(r,a);return e>=l-s&&u+s>=e&&t>=c-s&&d+s>=t},e.math.inBezierVicinity=function(e,t,i,r,n,a,o,s){var l={x1:Math.min(i,o,n),x2:Math.max(i,o,n),y1:Math.min(r,s,a),y2:Math.max(r,s,a)};return el.x2||tl.y2?!1:!0},e.math.solveCubic=function(e,t,i,r,n){t/=e,i/=e,r/=e;var a,o,s,l,u,c,d,p;return o=(3*i-t*t)/9,s=-(27*r)+t*(9*i-2*t*t),s/=54,a=o*o*o+s*s,n[1]=0,d=t/3,a>0?(u=s+Math.sqrt(a),u=0>u?-Math.pow(-u,1/3):Math.pow(u,1/3),c=s-Math.sqrt(a),c=0>c?-Math.pow(-c,1/3):Math.pow(c,1/3),n[0]=-d+u+c,d+=(u+c)/2,n[4]=n[2]=-d,d=Math.sqrt(3)*(-c+u)/2,n[3]=d,void(n[5]=-d)):(n[5]=n[3]=0,0===a?(p=0>s?-Math.pow(-s,1/3):Math.pow(s,1/3),n[0]=-d+2*p,void(n[4]=n[2]=-(p+d))):(o=-o,l=o*o*o,l=Math.acos(s/Math.sqrt(l)),p=2*Math.sqrt(o),n[0]=-d+p*Math.cos(l/3),n[2]=-d+p*Math.cos((l+2*Math.PI)/3),void(n[4]=-d+p*Math.cos((l+4*Math.PI)/3))))},e.math.sqDistanceToQuadraticBezier=function(e,t,i,r,n,a,o,s){var l=1*i*i-4*i*n+2*i*o+4*n*n-4*n*o+o*o+r*r-4*r*a+2*r*s+4*a*a-4*a*s+s*s,u=9*i*n-3*i*i-3*i*o-6*n*n+3*n*o+9*r*a-3*r*r-3*r*s-6*a*a+3*a*s,c=3*i*i-6*i*n+i*o-i*e+2*n*n+2*n*e-o*e+3*r*r-6*r*a+r*s-r*t+2*a*a+2*a*t-s*t,d=1*i*n-i*i+i*e-n*e+r*a-r*r+r*t-a*t,p=[];this.solveCubic(l,u,c,d,p);for(var h=1e-7,v=[],f=0;6>f;f+=2)Math.abs(p[f+1])=0&&p[f]<=1&&v.push(p[f]);v.push(1),v.push(0);for(var g,y,m,x,b=-1,w=0;w=0?b>x&&(b=x,g=v[w]):(b=x,g=v[w]);return b},e.math.sqDistanceToFiniteLine=function(e,t,i,r,n,a){var o=[e-i,t-r],s=[n-i,a-r],l=s[0]*s[0]+s[1]*s[1],u=o[0]*o[0]+o[1]*o[1],c=o[0]*s[0]+o[1]*s[1],d=c*c/l;return 0>c?u:d>l?(e-n)*(e-n)+(t-a)*(t-a):u-d},e.math.pointInsidePolygon=function(e,t,i,r,n,a,o,s,l){var u=new Array(i.length),c=Math.asin(s[1]/Math.sqrt(s[0]*s[0]+s[1]*s[1]));s[0]<0?c+=Math.PI/2:c=-c-Math.PI/2;for(var d=Math.cos(-c),p=Math.sin(-c),h=0;h0){var f=this.expandPolygon(u,-l);v=this.joinLines(f)}else v=u;for(var g,y,m,x,b,w=0,_=0,h=0;h=e&&e>=m||e>=g&&m>=e))continue;b=(e-g)/(m-g)*(x-y)+y,b>t&&w++,t>b&&_++}return w%2===0?!1:!0},e.math.joinLines=function(e){for(var t,i,r,n,a,o,s,l,u=new Array(e.length/2),c=0;cu)return[];var c=u/l;return[(i-e)*c+e,(r-t)*c+t]},e.math.dotProduct=function(e,t){if(2!=e.length||2!=t.length)throw"dot product: arguments are not vectors";return e[0]*t[0]+e[1]*t[1]},e.math.intersectLineCircle=function(e,t,i,r,n,a,o){var s=[i-e,r-t],l=[n,a],u=[e-n,t-a],c=s[0]*s[0]+s[1]*s[1],d=2*(u[0]*s[0]+u[1]*s[1]),l=u[0]*u[0]+u[1]*u[1]-o*o,p=d*d-4*c*l;if(0>p)return[];var h=(-d+Math.sqrt(p))/(2*c),v=(-d-Math.sqrt(p))/(2*c),f=Math.min(h,v),g=Math.max(h,v),y=[];if(f>=0&&1>=f&&y.push(f),g>=0&&1>=g&&y.push(g),0===y.length)return[];var m=y[0]*s[0]+e,x=y[0]*s[1]+t;if(y.length>1){if(y[0]==y[1])return[m,x];var b=y[1]*s[0]+e,w=y[1]*s[1]+t;return[m,x,b,w]}return[m,x]},e.math.findCircleNearPoint=function(e,t,i,r,n){var a=r-e,o=n-t,s=Math.sqrt(a*a+o*o),l=a/s,u=o/s;return[e+l*i,t+u*i]},e.math.findMaxSqDistanceToOrigin=function(e){for(var t,i=1e-6,r=0;ri&&(i=t);return i},e.math.finiteLinesIntersect=function(e,t,i,r,n,a,o,s,l){var u=(o-n)*(t-a)-(s-a)*(e-n),c=(i-e)*(t-a)-(r-t)*(e-n),d=(s-a)*(i-e)-(o-n)*(r-t);if(0!==d){var p=u/d,h=c/d;return p>=0&&1>=p&&h>=0&&1>=h?[e+p*(i-e),t+p*(r-t)]:l?[e+p*(i-e),t+p*(r-t)]:[]}return 0===u||0===c?[e,i,o].sort()[1]===o?[o,s]:[e,i,n].sort()[1]===n?[n,a]:[n,o,i].sort()[1]===i?[i,r]:[]:[]},e.math.boxIntersectEllipse=function(e,t,i,r,n,a,o,s,l){if(e>i){var u=e;e=i,i=u}if(t>r){var c=t;t=r,r=c}var d=[s-a/2-n,l],p=[s+a/2+n,l],h=[s,l-o/2-n],v=[s,l+o/2+n];return ip[0]?!1:t>v[1]?!1:r=e*e+t*t?!0:1>=i*i+t*t?!0:1>=i*i+r*r?!0:1>=e*e+r*r?!0:!1)},e.math.boxIntersectPolygon=function(t,i,r,n,a,o,s,l,u,c,d){if(t>r){var p=t;t=r,r=p}if(i>n){var h=i;i=n,n=h}var v=new Array(a.length),f=Math.asin(c[1]/Math.sqrt(c[0]*c[0]+c[1]*c[1]));c[0]<0?f+=Math.PI/2:f=-f-Math.PI/2;for(var g=Math.cos(-f),y=Math.sin(-f),m=0;mb&&(b=v[2*m]),v[2*m]_&&(_=v[2*m+1]),v[2*m+1]r)return!1;if(t>b+d)return!1;if(w-d>n)return!1;if(i>_+d)return!1;var E;if(d>0){var S=e.math.expandPolygon(v,-d);E=e.math.joinLines(S)}else E=v;for(var m=0;m0)return!0;if(e.math.finiteLinesIntersect(C,D,P,k,t,n,r,n,!1).length>0)return!0;if(e.math.finiteLinesIntersect(C,D,P,k,t,i,t,n,!1).length>0)return!0;if(e.math.finiteLinesIntersect(C,D,P,k,r,i,r,n,!1).length>0)return!0}return!1},e.math.polygonIntersectLine=function(t,i,r,n,a,o,s,l){for(var u,c=[],d=new Array(r.length),p=0;p0){var v=e.math.expandPolygon(d,-l);h=e.math.joinLines(v)}else h=d;for(var f,g,y,m,p=0;pa&&(a=1e-5),[t[0]+a*r[0],t[1]+a*r[1]]},e.math.generateUnitNgonPointsFitToSquare=function(t,i){var r=e.math.generateUnitNgonPoints(t,i);return r=e.math.fitPolygonToSquare(r)},e.math.fitPolygonToSquare=function(e){for(var t,i,r=e.length/2,n=1/0,a=1/0,o=-1/0,s=-1/0,l=0;r>l;l++)t=e[2*l],i=e[2*l+1],n=Math.min(n,t),o=Math.max(o,t),a=Math.min(a,i),s=Math.max(s,i);for(var u=2/(o-n),c=2/(s-a),l=0;r>l;l++)t=e[2*l]=e[2*l]*u,i=e[2*l+1]=e[2*l+1]*c,n=Math.min(n,t),o=Math.max(o,t),a=Math.min(a,i),s=Math.max(s,i);if(-1>a)for(var l=0;r>l;l++)i=e[2*l+1]=e[2*l+1]+(-1-a);return e},e.math.generateUnitNgonPoints=function(e,t){var i=1/e*2*Math.PI,r=e%2===0?Math.PI/2+i/2:Math.PI/2;r+=t;for(var n,a,o,s=new Array(2*e),l=0;e>l;l++)n=l*i+r,a=s[2*l]=Math.cos(n),o=s[2*l+1]=Math.sin(-n);return s},e.math.getRoundRectangleRadius=function(e,t){return Math.min(e/4,t/4,8)}}(cytoscape),function(e){"use strict";function t(t,i,r){var n={};switch(n[i]=r,t){case"core":case"collection":e.fn[t](n)}if("layout"===t){for(var o=r.prototype,s=["stop"],l=0;ld;d++)n.canSet(s[d])&&(s[d]._private[n.field][i]=r);n.updateStyle&&a.updateStyle(),n.onSet(a),n.settingTriggersEvent&&a[n.triggerFnName](n.settingEvent)}}}else if(n.allowSetting&&e.is.plainObject(i)){var h,v,f=i;for(h in f){v=f[h];var c=!n.immutableKeys[h];if(c)for(var d=0,p=s.length;p>d;d++)n.canSet(s[d])&&(s[d]._private[n.field][h]=v)}n.updateStyle&&a.updateStyle(),n.onSet(a),n.settingTriggersEvent&&a[n.triggerFnName](n.settingEvent)}else if(n.allowBinding&&e.is.fn(i)){var g=i;a.bind(n.bindingEvent,g)}else if(n.allowGetting&&void 0===i){var u;return l&&(u=l._private[n.field]),u}return a}},removeData:function(t){var i={field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!1,immutableKeys:{}};return t=e.util.extend({},i,t),function(i){var r=t,n=this,a=void 0!==n.length,o=a?n:[n];if(e.is.string(i)){for(var s=i.split(/\s+/),l=s.length,u=0;l>u;u++){var c=s[u];if(!e.is.emptyString(c)){var d=!r.immutableKeys[c];if(d)for(var p=0,h=o.length;h>p;p++)o[p]._private[r.field][c]=void 0}}r.triggerEvent&&n[r.triggerFnName](r.event)}else if(void 0===i){for(var p=0,h=o.length;h>p;p++){var v=o[p]._private[r.field];for(var c in v){var f=!r.immutableKeys[c];f&&(v[c]=void 0)}}r.triggerEvent&&n[r.triggerFnName](r.event)}return n}},event:{regex:/(\w+)(\.\w+)?/,optionalTypeRegex:/(\w+)?(\.\w+)?/,falseCallback:function(){return!1}},on:function(t){var i={unbindSelfOnTrigger:!1,unbindAllBindersOnTrigger:!1};return t=e.util.extend({},i,t),function(i,r,n,a){var o=this,s=void 0!==o.length,l=s?o:[o],u=e.is.string(i),c=t;if(e.is.plainObject(r)?(a=n,n=r,r=void 0):(e.is.fn(r)||r===!1)&&(a=r,n=void 0,r=void 0),(e.is.fn(n)||n===!1)&&(a=n,n=void 0),!e.is.fn(a)&&a!==!1&&u)return o;if(u){var d={};d[i]=a,i=d}for(var p in i)if(a=i[p],a===!1&&(a=e.define.event.falseCallback),e.is.fn(a)){p=p.split(/\s+/);for(var h=0;h0:void 0}},clearQueue:function(t){var i={};return t=e.util.extend({},i,t),function(){var e=this,t=void 0!==e.length,i=t?e:[e],r=this._private.cy||this;if(!r.styleEnabled())return this;for(var n=0;n\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:'"(?:\\\\"|[^"])+"|'+"'(?:\\\\'|[^'])+'",number:e.util.regex.number,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$"};s.variable="(?:[\\w-]|(?:\\\\"+s.metaChar+"))+",s.value=s.string+"|"+s.number,s.className=s.variable,s.id=s.variable;for(var l=function(e){return e.replace(new RegExp("\\\\("+s.metaChar+")","g"),function(e,t){return t})},u=s.comparatorOp.split("|"),c=0;c=0||"="!==d&&(s.comparatorOp+="|\\!"+d)}var p={group:{query:!0,regex:"(node|edge|\\*)",populate:function(e){this.group="*"==e?e:e+"s"}},state:{query:!0,regex:"(:selected|:unselected|:locked|:unlocked|:visible|:hidden|:transparent|:grabbed|:free|:removed|:inside|:grabbable|:ungrabbable|:animated|:unanimated|:selectable|:unselectable|:orphan|:nonorphan|:parent|:child|:loop|:simple|:active|:inactive|:touch)",populate:function(e){this.colonSelectors.push(e)}},id:{query:!0,regex:"\\#("+s.id+")",populate:function(e){this.ids.push(l(e))}},className:{query:!0,regex:"\\.("+s.className+")",populate:function(e){this.classes.push(l(e))}},dataExists:{query:!0,regex:"\\[\\s*("+s.variable+")\\s*\\]",populate:function(e){this.data.push({field:l(e)})}},dataCompare:{query:!0,regex:"\\[\\s*("+s.variable+")\\s*("+s.comparatorOp+")\\s*("+s.value+")\\s*\\]",populate:function(e,t,i){var r=null!=new RegExp("^"+s.string+"$").exec(i);i=r?i.substring(1,i.length-1):parseFloat(i),this.data.push({field:l(e),operator:t,value:i})}},dataBool:{query:!0,regex:"\\[\\s*("+s.boolOp+")\\s*("+s.variable+")\\s*\\]",populate:function(e,t){this.data.push({field:l(t),operator:e})}},metaCompare:{query:!0,regex:"\\[\\[\\s*("+s.meta+")\\s*("+s.comparatorOp+")\\s*("+s.number+")\\s*\\]\\]",populate:function(e,t,i){this.meta.push({field:l(e),operator:t,value:parseFloat(i)})}},nextQuery:{separator:!0,regex:s.separator,populate:function(){r[++c]=o(),a=null}},child:{separator:!0,regex:s.child,populate:function(){var e=o();e.parent=this,e.subject=a,r[c]=e}},descendant:{separator:!0,regex:s.descendant,populate:function(){var e=o();e.ancestor=this,e.subject=a,r[c]=e}},subject:{modifier:!0,regex:s.subject,populate:function(){return null!=a&&this.subject!=this?(e.util.error("Redefinition of subject in selector `"+i+"`"),!1):(a=this,void(this.subject=this))}}},h=0;for(var v in p)p[h]=p[v],p[h].name=v,h++;p.length=h,r._private.selectorText=i;var f=i,c=0,g=function(t){for(var i,r,n,a=0;a=0&&(d=d.toLowerCase(),p=p.toLowerCase(),s=s.replace("@",""),h=!0);var v=!1,f=!1;switch(s.indexOf("!")>=0&&(s=s.replace("!",""),v=!0),h&&(l=p.toLowerCase(),c=d.toLowerCase()),s){case"*=":a=d.search(p)>=0;break;case"$=":a=null!=new RegExp(p+"$").exec(d);break;case"^=":a=null!=new RegExp("^"+p).exec(d);break;case"=":a=c===l;break;case"!=":a=c!==l;break;case">":a=v?l>=c:c>l,f=!0;break;case">=":a=v?l>c:c>=l,f=!0;break;case"<":a=v?c>=l:l>c,f=!0;break;case"<=":a=v?c>l:l>=c,f=!0;break;default:a=!1}}else if(null!=s)switch(s){case"?":a=t.fieldTruthy(u);break;case"!":a=!t.fieldTruthy(u);break;case"^":a=t.fieldUndefined(u)}else a=!t.fieldUndefined(u);if(v&&!f&&(a=!a,f=!0),!a){r=!1;break}}return r},v=h({name:"data",fieldValue:function(e){return r._private.data[e]},fieldRef:function(e){return"element._private.data."+e},fieldUndefined:function(e){return void 0===r._private.data[e]},fieldTruthy:function(e){return r._private.data[e]?!0:!1}});if(!v)return!1;var f=h({name:"meta",fieldValue:function(e){return r[e]()},fieldRef:function(e){return"element."+e+"()"},fieldUndefined:function(e){return null==r[e]()},fieldTruthy:function(e){return r[e]()?!0:!1}});if(!f)return!1;if(null!=i.collection){var g=null!=i.collection._private.ids[r.id()];if(!g)return!1}if(null!=i.filter&&0===r.collection().filter(i.filter).size())return!1;var y=function(e,i){if(null!=e){var r=!1;if(!n.hasCompoundNodes())return!1;i=i();for(var a=0;a "+t),null!=e.ancestor&&(t=r(e.ancestor)+" "+t),null!=e.child&&(t+=" > "+r(e.child)),null!=e.descendant&&(t+=" "+r(e.descendant)),t},n=0;n1&&n node").css({width:"auto",height:"auto",shape:"rectangle","background-opacity":.5,"padding-top":10,"padding-right":10,"padding-left":10,"padding-bottom":10}).selector("edge").css({width:1}).selector(":active").css({"overlay-color":"black","overlay-padding":10,"overlay-opacity":.25}).selector("core").css({"selection-box-color":"#ddd","selection-box-opacity":.65,"selection-box-border-color":"#aaa","selection-box-border-width":1,"active-bg-color":"black","active-bg-opacity":.15,"active-bg-size":e.is.touch()?40:15,"outside-texture-bg-color":"#000","outside-texture-bg-opacity":.125})},e.styfn.clear=function(){for(var e=0;el.max)return null;var P={name:t,value:i,strValue:""+i+(x?x:""),units:x,bypass:r,hasPie:t.match(/pie-(\d+)-background-size/)&&null!=i&&0!==i&&""!==i};return l.unitless||"px"!==x&&"em"!==x||(P.pxValue="px"!==x&&x?this.getEmSizeInPixels()*i:i),("ms"===x||"s"===x)&&(P.msValue="ms"===x?i:1e3*i),P}if(l.propList){var k=[],C=""+i;if("none"===C);else{for(var D=C.split(","),E=0;E0){a=!0;break}}i.hasPie=a;var l=n["text-transform"].strValue,u=n.content.strValue,c=n["font-style"].strValue,s=n["font-size"].pxValue+"px",d=n["font-family"].strValue,p=n["font-weight"].strValue,h=n["text-valign"].strValue,v=n["text-valign"].strValue,f=n["text-outline-width"].pxValue;i.labelKey=c+"$"+s+"$"+d+"$"+p+"$"+u+"$"+l+"$"+h+"$"+v+"$"+f,i.fontKey=c+"$"+p+"$"+s+"$"+d;var g=n.width.pxValue,y=n.height.pxValue,m=n["border-width"].pxValue;if(i.boundingBoxKey=g+"$"+y+"$"+m,"edges"===t._private.group){var x=n["control-point-step-size"].pxValue,b=n["control-point-distance"]?n["control-point-distance"].pxValue:void 0,w=n["control-point-weight"].value,_=n["curve-style"].strValue;i.boundingBoxKey+="$"+x+"$"+b+"$"+w+"$"+_}i.styleKey=Date.now()},e.styfn.applyParsedProperty=function(t,i){var r,n,a=i,o=t._private.style,s=e.style.properties[a.name].type,l=a.bypass,u=o[a.name],c=u&&u.bypass;if(("height"===i.name||"width"===i.name)&&"auto"===i.value&&t.isNode()&&!t.isParent())return!1;if(l&&a.deleteBypass){var d=o[a.name];return d?d.bypass&&d.bypassed?(o[a.name]=d.bypassed,!0):!1:!0}switch(a.mapped){case e.style.types.mapData:case e.style.types.mapLayoutData:for(var p=a.mapped===e.style.types.mapLayoutData,h=a.field.split("."),r=p?t._private.layoutData:t._private.data,v=0;vg?g=0:g>1&&(g=1),s.color){var y=a.valueMin[0],m=a.valueMax[0],x=a.valueMin[1],b=a.valueMax[1],w=a.valueMin[2],_=a.valueMax[2],E=null==a.valueMin[3]?1:a.valueMin[3],S=null==a.valueMax[3]?1:a.valueMax[3],P=[Math.round(y+(m-y)*g),Math.round(x+(b-x)*g),Math.round(w+(_-w)*g),Math.round(E+(S-E)*g)];n={bypass:a.bypass,name:a.name,value:P,strValue:"rgb("+P[0]+", "+P[1]+", "+P[2]+")"}}else{if(!s.number)return!1;var k=a.valueMin+(a.valueMax-a.valueMin)*g;n=this.parse(a.name,k,a.bypass,!0)}n||(n=this.parse(a.name,u.strValue,a.bypass,!0)),n.mapping=a,a=n;break;case e.style.types.data:case e.style.types.layoutData:for(var p=a.mapped===e.style.types.layoutData,h=a.field.split("."),r=p?t._private.layoutData:t._private.data,v=0;v0&&s>0){for(var c=!1,d=0;d0&&t.delay(l),t.animate({css:u},{duration:s,queue:!1,complete:function(){r||n.removeBypasses(t,o),t._private.transitioning=!1}})}else t._private.transitioning&&(t.stop(),this.removeBypasses(t,o),t._private.transitioning=!1)}}(cytoscape),function(e){"use strict";e.styfn.applyBypass=function(t,i,r,n){var a=[],o=!0;if("*"===i||"**"===i){if(void 0!==r)for(var s=0;sa.length?l.substr(a.length):""}function n(){o=o.length>s.length?o.substr(s.length):""}var a,o,s,l=""+i;for(l=l.replace(/[/][*](\s|.)+?[*][/]/g,"");;){var u=l.match(/^\s*$/);if(u)break;var c=l.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!c){e.util.error("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+l);break}a=c[0];var d=c[1],p=new e.Selector(d);if(p._private.invalid)e.util.error("Skipping parsing of block: Invalid selector found in string stylesheet: "+d),r();else{var h=c[2],v=!1;o=h;for(var f=[];;){var u=o.match(/^\s*$/);if(u)break;var g=o.match(/^\s*(.+?)\s*:\s*(.+?)\s*;/);if(!g){e.util.error("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+h),v=!0;break}s=g[0];var y=g[1],m=g[2],x=e.style.properties[y];if(x){var b=t.parse(y,m);b?(f.push({name:y,val:m}),n()):(e.util.error("Skipping property: Invalid property definition in: "+s),n())}else e.util.error("Skipping property: Invalid property name in: "+s),n()}if(v){r();break}t.selector(d);for(var w=0;w0?c.wheelSensitivity:1,motionBlur:c.motionBlur,pixelRatio:e.is.number(c.pixelRatio)&&c.pixelRatio>0?c.pixelRatio:void 0},c.renderer)),c.initrender&&(a.on("initrender",c.initrender),a.on("initrender",function(){a._private.initrender=!0})),a.load(c.elements,function(){a.startAnimationLoop(),a._private.ready=!0,e.is.fn(c.ready)&&a.on("ready",c.ready);for(var t=0;t0;)r.shift()();i.deferredTimeout=null},0))}})}(cytoscape,"undefined"==typeof window?null:window),function(e,t){"use strict";function i(e){var t=!document||"interactive"!==document.readyState&&"complete"!==document.readyState?i:e;setTimeout(t,9,e)}e.fn.core({add:function(t){var i,r=this;if(e.is.elementOrCollection(t)){var n=t;if(n._private.cy===r)i=n.restore();else{for(var a=[],o=0;oo;o++){var d=u[o],p=l[d];if(e.is.array(p))for(var h=0,v=p.length;v>h;h++){var f=p[h];f.group=d,a.push(f)}}i=new e.Collection(r,a)}else{var f=t;i=new e.Element(r,f).collection()}return i},remove:function(t){if(e.is.elementOrCollection(t))t=t;else if(e.is.string(t)){var i=t;t=this.$(i)}return t.remove()},load:function(r,n,a){function o(){s.one("layoutready",function(e){s.notifications(!0),s.trigger(e),s.notify({type:"load",collection:s.elements()}),s.one("load",n),s.trigger("load")}).one("layoutstop",function(){s.one("done",a),s.trigger("done")});var t=e.util.extend({},s._private.options.layout);t.eles=s.$(),s.layout(t)}var s=this,l=s.elements();return l.length>0&&l.remove(),s.notifications(!1),null!=r&&(e.is.plainObject(r)||e.is.array(r))&&s.add(r),t?i(o):o(),this}})}(cytoscape,"undefined"==typeof window?null:window),function(e,t){"use strict";e.fn.core({animated:e.define.animated(),clearQueue:e.define.clearQueue(),delay:e.define.delay(),animate:e.define.animate(),stop:e.define.stop(),addToAnimationPool:function(e){var t=this;t.styleEnabled()&&t._private.aniEles.merge(e)},startAnimationLoop:function(){function i(){e.util.requestAnimationFrame(function(e){r(e),i()})}function r(t){function i(i,r){var s=i._private.animation.current,l=i._private.animation.queue,u=!1;if(0===s.length){var c=l.length>0?l.shift():null;c&&(c.callTime=t,s.push(c))}for(var d=[],p=s.length-1;p>=0;p--){var h=s[p];h.started||n(i,h),a(i,h,t,r),h.done&&(d.push(h),s.splice(p,1)),u=!0}for(var p=0;p0||c){var d;if(r.length>0){var p=r.updateCompoundBounds();d=p.length>0?r.add(p):r}l.notify({type:"draw",collection:d})}r.unmerge(o)}function n(t,i){var r=e.is.core(t),n=!r,a=t,o=l._private.style;if(n)var s=a._private.position,u={x:s.x,y:s.y},c=o.getValueStyle(a);if(r)var d=l._private.pan,p={x:d.x,y:d.y},h=l._private.zoom;i.started=!0,i.startTime=Date.now(),i.startPosition=u,i.startStyle=c,i.startPan=p,i.startZoom=h}function a(t,i,r,n){var a,u=l._private.style,c=i.properties,d=i.params,p=i.startTime,h=!n;if(a=0===i.duration?1:Math.min(1,(r-p)/i.duration),0>a?a=0:a>1&&(a=1),null==c.delay){var v=i.startPosition,f=c.position,g=t._private.position;f&&h&&(o(v.x,f.x)&&(g.x=s(v.x,f.x,a)),o(v.y,f.y)&&(g.y=s(v.y,f.y,a)));var y=i.startPan,m=c.pan,x=t._private.pan,b=null!=m&&n;b&&(o(y.x,m.x)&&(x.x=s(y.x,m.x,a)),o(y.y,m.y)&&(x.y=s(y.y,m.y,a)),t.trigger("pan"));var w=i.startZoom,_=c.zoom,E=null!=_&&n;if(E&&(o(w,_)&&(t._private.zoom=s(w,_,a)),t.trigger("zoom")),(b||E)&&t.trigger("viewport"),c.css&&h)for(var S=c.css,P=0;P=1&&(i.done=!0),a}function o(t,i){return null==t||null==i?!1:e.is.number(t)&&e.is.number(i)?!0:t&&i?!0:!1}function s(t,i,r){0>r?r=0:r>1&&(r=1);var n,a;if(n=null!=t.pxValue||null!=t.value?null!=t.pxValue?t.pxValue:t.value:t,a=null!=i.pxValue||null!=i.value?null!=i.pxValue?i.pxValue:i.value:i,e.is.number(n)&&e.is.number(a))return n+(a-n)*r;if(e.is.number(n[0])&&e.is.number(a[0])){var o=n,s=a,l=function(e,t){var i=t-e,n=e;return Math.round(r*i+n)},u=l(o[0],s[0]),c=l(o[1],s[1]),d=l(o[2],s[2]);return[u,c,d]}return void 0}var l=this;l.styleEnabled()&&t&&i()}})}(cytoscape,"undefined"==typeof window?null:window),function(e){"use strict";e.fn.core({data:e.define.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0}),removeData:e.define.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0}),scratch:e.define.data({field:"scratch",allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!0}),removeScratch:e.define.removeData({field:"scratch",triggerEvent:!1})})}(cytoscape),function(e){"use strict";e.fn.core({on:e.define.on(),one:e.define.on({unbindSelfOnTrigger:!0}),once:e.define.on({unbindAllBindersOnTrigger:!0}),off:e.define.off(),trigger:e.define.trigger()}),e.corefn.bind=e.corefn.on,e.corefn.unbind=e.corefn.off}(cytoscape),function(e){"use strict";e.fn.core({png:function(e){var t=this._private.renderer;return e=e||{},t.png(e)}})}(cytoscape),function(e){"use strict";e.fn.core({layout:function(e){var t=this._private.prevLayout=null==e?this._private.prevLayout:this.initLayout(e);return t.run(),this},makeLayout:function(e){return this.initLayout(e)},initLayout:function(t){if(null==t)return void e.util.error("Layout options must be specified to make a layout");if(null==t.name)return void e.util.error("A `name` must be specified to make a layout");var i=t.name,r=e.extension("layout",i);if(null==r)return void e.util.error("Can not apply layout: No such layout `"+i+"` found; did you include its JS file?");t.eles=null!=t.eles?t.eles:this.$(),e.is.string(t.eles)&&(t.eles=this.$(t.eles));var n=new r(e.util.extend({},t,{cy:this}));return e.is.plainObject(n._private)||(n._private={}),n._private.cy=this,n._private.listeners=[],n}})}(cytoscape),function(e){"use strict";e.fn.core({notify:function(e){if(this._private.batchingNotify){var t=this._private.batchNotifyEles,i=this._private.batchNotifyTypes;if(e.collection)for(var r=0;r0&&l>0&&!isNaN(r.w)&&!isNaN(r.h)&&r.w>0&&r.h>0){o=Math.min((s-2*i)/r.w,(l-2*i)/r.h),o=o>this._private.maxZoom?this._private.maxZoom:o,o=othis._private.maxZoom?this._private.maxZoom:r,r=ri.maxZoom||!i.zoomingEnabled?o=!0:(i.zoom=l,a.push("zoom"))}if(n&&(!o||!t.cancelOnFailedZoom)&&i.panningEnabled){var u=t.pan;e.is.number(u.x)&&(i.pan.x=u.x,s=!1),e.is.number(u.y)&&(i.pan.y=u.y,s=!1),s||a.push("pan")}return a.length>0&&(a.push("viewport"),this.trigger(a.join(" ")),this.notify({type:"viewport"})),this},center:function(e){var t=this.getCenterPan(e);return t&&(this._private.pan=t,this.trigger("pan viewport"),this.notify({type:"viewport"})),this},getCenterPan:function(t){if(this._private.panningEnabled){if(e.is.string(t)){var i=t;t=this.elements(i)}else e.is.elementOrCollection(t)||(t=this.elements());var r=t.boundingBox(),n=this.width(),a=this.height(),o=this._private.zoom,s={x:(n-o*(r.x1+r.x2))/2,y:(a-o*(r.y1+r.y2))/2};return s}},reset:function(){return this._private.panningEnabled&&this._private.zoomingEnabled?(this.viewport({pan:{x:0,y:0},zoom:1}),this):this},width:function(){var e=this._private.container;return e?e.clientWidth:1},height:function(){var e=this._private.container;return e?e.clientHeight:1},extent:function(){var e=this._private.pan,t=this._private.zoom,i=this.renderedExtent(),r={x1:(i.x1-e.x)/t,x2:(i.x2-e.x)/t,y1:(i.y1-e.y)/t,y2:(i.y2-e.y)/t};return r.w=r.x2-r.x1,r.h=r.y2-r.y1,r},renderedExtent:function(){var e=this.width(),t=this.height();return{x1:0,y1:0,x2:e,y2:t,w:e,h:t}}}),e.corefn.centre=e.corefn.center,e.corefn.autolockNodes=e.corefn.autolock,e.corefn.autoungrabifyNodes=e.corefn.autoungrabifyNodes}(cytoscape),function(e){"use strict";e.fn.collection=e.fn.eles=function(t){for(var i in t){var r=t[i];e.Collection.prototype[i]=r}};var t={prefix:{nodes:"n",edges:"e"},id:{nodes:0,edges:0},generate:function(t,i,r){var n=e.is.element(i)?i._private:i,a=n.group,o=null!=r?r:this.prefix[a]+this.id[a];if(t.getElementById(o).empty())this.id[a]++;else for(;!t.getElementById(o).empty();)o=this.prefix[a]+ ++this.id[a];return o}};e.Element=function(t,i,r){if(!(this instanceof e.Element))return new e.Element(t,i,r);var n=this;if(r=void 0===r||r?!0:!1,void 0===t||void 0===i||!e.is.core(t))return void e.util.error("An element must have a core reference and parameters set");if("nodes"!==i.group&&"edges"!==i.group)return void e.util.error("An element must be of type `nodes` or `edges`; you specified `"+i.group+"`");if(this.length=1,this[0]=this,this._private={cy:t,single:!0,data:i.data||{},layoutData:{},position:i.position||{},autoWidth:void 0,autoHeight:void 0,listeners:[],group:i.group,style:{},rstyle:{},styleCxts:[],removed:!0,selected:i.selected?!0:!1,selectable:void 0===i.selectable?!0:i.selectable?!0:!1,locked:i.locked?!0:!1,grabbed:!1,grabbable:void 0===i.grabbable?!0:i.grabbable?!0:!1,active:!1,classes:{},animation:{current:[],queue:[]},rscratch:{},scratch:{},edges:[],children:[]},i.renderedPosition){var a=i.renderedPosition,o=t.pan(),s=t.zoom();this._private.position={x:(a.x-o.x)/s,y:(a.y-o.y)/s}}if(e.is.string(i.classes))for(var l=i.classes.split(/\s+/),u=0,c=l.length;c>u;u++){var d=l[u];d&&""!==d&&(n._private.classes[d]=!0)}i.css&&t.style().applyBypass(this,i.css),(void 0===r||r)&&this.restore()},e.Collection=function(i,r,n){if(!(this instanceof e.Collection))return new e.Collection(i,r);if(void 0===i||!e.is.core(i))return void e.util.error("A collection must have a reference to the core");var a={},o={},s=!1;if(r){if(r.length>0&&e.is.plainObject(r[0])&&!e.is.element(r[0])){s=!0;for(var l=[],u={},c=0,d=r.length;d>c;c++){var p=r[c];null==p.data&&(p.data={});var h=p.data;if(null==h.id)h.id=t.generate(i,p);else if(0!==i.getElementById(h.id).length||u[h.id])continue;var v=new e.Element(i,p,!1);l.push(v),u[h.id]=!0}r=l}}else r=[];this.length=0;for(var c=0,d=r.length;d>c;c++){var f=r[c];if(f){var g=f._private.data.id;(!n||n.unique&&!a[g])&&(a[g]=f,o[g]=this.length,this[this.length]=f,this.length++)}}this._private={cy:i,ids:a,indexes:o},s&&this.restore()},e.elefn=e.elesfn=e.Element.prototype=e.Collection.prototype,e.elesfn.cy=function(){return this._private.cy},e.elesfn.element=function(){return this[0]},e.elesfn.collection=function(){return e.is.collection(this)?this:new e.Collection(this._private.cy,[this])},e.elesfn.unique=function(){return new e.Collection(this._private.cy,this,{unique:!0})},e.elesfn.getElementById=function(t){var i=this._private.cy,r=this._private.ids[t];return r?r:e.Collection(i)},e.elesfn.json=function(){var t=this.element();if(null==t)return void 0;var i=t._private,r=e.util.copy({data:i.data,position:i.position,group:i.group,bypass:i.bypass,removed:i.removed,selected:i.selected,selectable:i.selectable,locked:i.locked,grabbed:i.grabbed,grabbable:i.grabbable,classes:""}),n=[];for(var a in i.classes)n.push(a);for(var o=0;od;d++){var h=r[d];h.isNode()?(s.push(h),u++):(l.push(h),c++)}o=s.concat(l);for(var d=0,p=o.length;p>d;d++){var h=o[d];if(h.removed()){var v=h._private,f=v.data;if(void 0===f.id)f.id=t.generate(a,h);else{if(e.is.emptyString(f.id)||!e.is.string(f.id)){e.util.error("Can not create element with invalid string ID `"+f.id+"`");continue}if(0!==a.getElementById(f.id).length){e.util.error("Can not create second element with ID `"+f.id+"`");continue}}var g=f.id;if(h.isEdge()){for(var y=h,m=["source","target"],x=m.length,b=!1,w=0;x>w;w++){var _=m[w],E=f[_];null==E||""===E?(e.util.error("Can not create edge `"+g+"` with unspecified "+_),b=!0):a.getElementById(E).empty()&&(e.util.error("Can not create edge `"+g+"` with nonexistant "+_+" `"+E+"`"),b=!0)}if(b)continue;var S=a.getElementById(f.source),P=a.getElementById(f.target);S._private.edges.push(y),P._private.edges.push(y),y._private.source=S,y._private.target=P}v.ids={},v.ids[g]=h,v.removed=!1,a.addToPool(h),n.push(h)}}for(var d=0;u>d;d++){var k=o[d],f=k._private.data,C=k._private.data.parent,D=null!=C;if(D){var N=a.getElementById(C);if(N.empty())f.parent=void 0;else{for(var T=!1,M=N;!M.empty();){if(k.same(M)){T=!0,f.parent=void 0;break}M=M.parent()}T||(N[0]._private.children.push(k),k._private.parent=N[0],a._private.hasCompoundNodes=!0)}}}if(n=new e.Collection(a,n),n.length>0){var B=n.add(n.connectedNodes()).add(n.parent());B.updateStyle(i),i?n.rtrigger("add"):n.trigger("add")}return r},e.elesfn.removed=function(){var e=this[0];return e&&e._private.removed},e.elesfn.inside=function(){var e=this[0];return e&&!e._private.removed},e.elesfn.remove=function(t){function i(e){for(var t=e._private.edges,i=0;ip;p++){var v=s[p];n(v)}for(var p=0;p0&&(t&&this.cy().notify({type:"remove",collection:x}),x.trigger("remove"));for(var b={},p=0;p0,a=t.getElementById(r).length>0;if(n||a){var o=this.jsons();this.remove();for(var s=0;s0;if(c){var o=this.jsons();this.remove();for(var s=0;su||!n)&&(o=u,n=l)}return{edge:n,dist:o}};f.size()>0;){var y=f.pop(),m=y.value,x=y.id,b=a.getElementById(x);if(u[x]=m,m===Math.Infinite)break;for(var w=b.neighborhood().intersect(d),h=0;h0)for(r.unshift(i);l[n.id()];){var o=l[n.id()];r.unshift(o.edge),r.unshift(o.node),n=o.node}return new e.Collection(a,r)}}}}),e.elesfn.bfs=e.elesfn.breadthFirstSearch,e.elesfn.dfs=e.elesfn.depthFirstSearch,e.elesfn.stdBfs=e.elesfn.stdBreadthFirstSearch,e.elesfn.stdDfs=e.elesfn.stdDepthFirstSearch}(cytoscape),function(e){"use strict";e.fn.eles({aStar:function(t){t=t||{};var i=function(){a&&console.log.apply(console,arguments)},r=function(e,t,i,n){if(e==t)return n.push(o.getElementById(t)),n;if(t in i){var a=i[t],s=f[t];return n.push(o.getElementById(t)),n.push(o.getElementById(s)),r(e,a,i,n)}return void 0},n=function(e,t){if(0===e.length)return void 0;for(var i=0,r=t[e[0]],n=1;na&&(r=a,i=n)}return i};if(null!=t.debug)var a=t.debug;else var a=!1;i("Starting aStar...");var o=this._private.cy;if(null==t||null==t.root)return void 0;var s=e.is.string(t.root)?this.filter(t.root)[0]:t.root[0];if(i("Source node: %s",s.id()),null==t.goal)return void 0;var l=e.is.string(t.goal)?this.filter(t.goal)[0]:t.goal[0];if(i("Target node: %s",l.id()),null!=t.heuristic&&e.is.fn(t.heuristic))var u=t.heuristic;else var u=function(){return 0};if(null!=t.weight&&e.is.fn(t.weight))var c=t.weight;else var c=function(){return 1};if(null!=t.directed)var d=t.directed;else var d=!1;var p=[],h=[s.id()],v={},f={},g={},y={};g[s.id()]=0,y[s.id()]=u(s);for(var m=this.edges().not(":loop"),x=this.nodes(),b=0;h.length>0;){var w=n(h,y),_=this.filter("#"+h[w])[0];if(b++,i("\nStep: %s",b),i("Processing node: %s, fScore = %s",_.id(),y[_.id()]),_.id()==l.id()){i("Found goal node!");var E=r(s.id(),l.id(),v,[]);return E.reverse(),i("Path: %s",E),{found:!0,distance:g[_.id()],path:new e.Collection(o,E),steps:b}}p.push(_.id()),h.splice(w,1),i("Added node to closedSet, removed from openSet."),i("Processing neighbors...");for(var S=_.connectedEdges(d?'[source = "'+_.id()+'"]':void 0).intersect(m),P=0;Pd;d++)c[l[d].id()]=d;for(var p=[],d=0;u>d;d++){for(var h=new Array(u),v=0;u>v;v++)h[v]=d==v?0:1/0;p.push(h)}var f=[],g=[],y=function(e){for(var t=0;u>t;t++){for(var i=new Array(u),r=0;u>r;r++)i[r]=void 0;e.push(i)}};y(f),y(g);for(var d=0;db&&(p[m][x]=b,f[m][x]=x,g[m][x]=s[d])}if(!o)for(var d=0;db&&(p[m][x]=b,f[m][x]=x,g[m][x]=s[d])}for(var w=0;u>w;w++)for(var d=0;u>d;d++)for(var v=0;u>v;v++)p[d][w]+p[w][v]d;d++)_.push(l[d].id());var E={distance:function(t,i){if(e.is.string(t))var r=n.filter(t)[0].id();else var r=t.id();if(e.is.string(i))var a=n.filter(i)[0].id();else var a=i.id();return p[c[r]][c[a]]},path:function(t,i){var r=function(e,t,i,r,a){if(e===t)return n.getElementById(r[e]);if(void 0===i[e][t])return void 0;for(var o=[n.getElementById(r[e])],s=e;e!==t;){s=e,e=i[e][t];var l=a[s][e];o.push(l),o.push(n.getElementById(r[e]))}return o};if(e.is.string(t))var a=n.filter(t)[0].id();else var a=t.id();if(e.is.string(i))var o=n.filter(i)[0].id();else var o=i.id();var s=r(c[a],c[o],f,_,g);return new e.Collection(n,s)}};return E},bellmanFord:function(t){t=t||{};var i=function(){r&&console.log.apply(console,arguments)};if(null!=t.debug)var r=t.debug;else var r=!1;if(i("Starting bellmanFord..."),null!=t.weight&&e.is.fn(t.weight))var n=t.weight;else var n=function(){return 1};if(null!=t.directed)var a=t.directed;else var a=!1;if(null==t.root)return void e.util.error("options.root required");if(e.is.string(t.root))var o=this.filter(t.root)[0];else var o=t.root[0];i("Source node: %s",o.id());for(var s=this._private.cy,l=this.edges().not(":loop"),u=this.nodes(),c=u.length,d={},p=0;c>p;p++)d[u[p].id()]=p;for(var h=[],v=[],f=[],p=0;c>p;p++)h[p]=u[p].id()===o.id()?0:1/0,v[p]=void 0;for(var g=!1,p=1;c>p;p++){g=!1;for(var y=0;yp;p++)_.push(u[p].id());var E={distanceTo:function(t){if(e.is.string(t))var i=s.filter(t)[0].id();else var i=t.id();return h[d[i]]},pathTo:function(t){var i=function(e,t,i,r,n,a){for(;;){if(n.push(s.getElementById(r[i])),n.push(a[i]),t===i)return n;var o=e[i];if("undefined"==typeof o)return void 0;i=o}};if(e.is.string(t))var r=s.filter(t)[0].id();else var r=t.id();var n=[],a=i(v,d[o.id()],d[r],_,n,f);return null!=a&&a.reverse(),new e.Collection(s,a)},hasNegativeWeightCycle:!1};return E},kargerStein:function(t){t=t||{};var i=function(){a&&console.log.apply(console,arguments)},r=function(e,t,i){for(var r=i[e],n=r[1],a=r[2],o=t[n],s=t[a],l=i.filter(function(e){return t[e[1]]===o&&t[e[2]]===s?!1:t[e[1]]===s&&t[e[2]]===o?!1:!0}),u=0;u=i)return t;var o=Math.floor(Math.random()*t.length),s=r(o,e,t);return n(e,s,i-1,a)};if(null!=t&&null!=t.debug)var a=t.debug;else var a=!1;i("Starting kargerStein...");var o=this._private.cy,s=this.edges().not(":loop"),l=this.nodes(),u=l.length,c=s.length,d=Math.ceil(Math.pow(Math.log(u)/Math.LN2,2)),p=Math.floor(u/Math.sqrt(2));if(2>u)return void e.util.error("At least 2 nodes are required for KargerSteing algorithm!");for(var h={},v=0;u>v;v++)h[l[v].id()]=v;for(var f=[],v=0;c>v;v++){var g=s[v];f.push([v,h[g.source().id()],h[g.target().id()]])}for(var y,m=1/0,x=[],v=0;u>v;v++)x.push(v);for(var b=0;d>=b;b++){var w=x.slice(0),_=n(w,f,u,p),E=w.slice(0),S=n(w,_,p,2),P=n(E,_,p,2);S.length<=P.length&&S.lengthr;r++)i+=e[r];for(var r=0;t>r;r++)e[r]=e[r]/i},r=function(){n&&console.log.apply(console,arguments)};if(null!=t&&null!=t.debug)var n=t.debug;else var n=!1;if(r("Starting pageRank..."),null!=t&&null!=t.dampingfactor)var a=t.dampingFactor;else var a=.8;if(null!=t&&null!=t.precision)var o=t.precision;else var o=1e-6;if(null!=t&&null!=t.iterations)var s=t.iterations;else var s=200;if(null!=t&&null!=t.weight&&e.is.fn(t.weight))var l=t.weight;else var l=function(){return 1};for(var u=this._private.cy,c=this.edges().not(":loop"),d=this.nodes(),p=d.length,h=c.length,v={},f=0;p>f;f++)v[d[f].id()]=f;for(var g=[],y=[],m=(1-a)/p,f=0;p>f;f++){for(var x=[],b=0;p>b;b++)x.push(0);g.push(x),y.push(0)}for(var f=0;h>f;f++){var w=c[f],_=v[w.source().id()],E=v[w.target().id()],S=l.apply(w,[w]);g[E][_]+=S,y[_]+=S}for(var P=1/p+m,b=0;p>b;b++)if(0===y[b])for(var f=0;p>f;f++)g[f][b]=P;else for(var f=0;p>f;f++)g[f][b]=g[f][b]/y[b]+m;for(var k,C=[],D=[],f=0;p>f;f++)C.push(1),D.push(0);for(var N=0;s>N;N++){for(var T=D.slice(0),f=0;p>f;f++)for(var b=0;p>b;b++)T[f]+=g[f][b]*C[b];i(T),k=C,C=T;for(var M=0,f=0;p>f;f++)M+=Math.pow(k[f]-C[f],2);if(o>M){r("Stoped at iteration %s",N);break}}r("Result:\n"+C);var B={rank:function(t){if(e.is.string(t))var i=u.filter(t)[0].id();else var i=t.id();return C[v[i]]}};return B}})}(cytoscape),function(e){"use strict";e.fn.eles({animated:e.define.animated(),clearQueue:e.define.clearQueue(),delay:e.define.delay(),animate:e.define.animate(),stop:e.define.stop()})}(cytoscape),function(e){"use strict";e.fn.eles({classes:function(t){var i,r=this,n=[];if(e.is.fn(t))i=t;else if(!e.is.plainObject(t))return this;for(var a=0;a0&&new e.Collection(this.cy(),n).updateStyle().trigger("class"),this},addClass:function(t){t=t.split(/\s+/);for(var i=this,r=[],n=0;n0&&new e.Collection(this._private.cy,r).updateStyle().trigger("class"),i},hasClass:function(e){var t=this[0];return null!=t&&t._private.classes[e]?!0:!1},toggleClass:function(t,i){for(var r=t.split(/\s+/),n=this,a=[],o=0,s=n.length;s>o;o++)for(var l=n[o],u=0;u0&&new e.Collection(this._private.cy,a).updateStyle().trigger("class"),n},removeClass:function(t){t=t.split(/\s+/);for(var i=this,r=[],n=0;n0&&new e.Collection(i._private.cy,r).updateStyle(),i.trigger("class"),i},flashClass:function(e,t){var i=this;if(null==t)t=250;else if(0===t)return i;return i.addClass(e),setTimeout(function(){i.removeClass(e)},t),i}})}(cytoscape),function(e){"use strict";e.fn.eles({allAre:function(e){return this.filter(e).length===this.length},is:function(e){return this.filter(e).length>0},some:function(e,t){for(var i=0;i0},allAreNeighbors:function(e){return e=this.cy().collection(e),this.neighborhood().intersect(e).length===e.length}})}(cytoscape),function(e){"use strict";e.fn.eles({parent:function(t){for(var i=[],r=this._private.cy,n=0;n0&&i.push(o)}return new e.Collection(r,i,{unique:!0}).filter(t)},parents:function(t){for(var i=[],r=this.parent();r.nonempty();){for(var n=0;n0?this.add(s):this;i?l.trigger("position"):l.rtrigger("position")}return this},silentPositions:function(e){return this.positions(e,!0)},updateCompoundBounds:function(){function t(e){var t=e.children(),i=e._private.style,n=t.boundingBox({includeLabels:!1,includeEdges:!1}),a={top:i["padding-top"].pxValue,bottom:i["padding-bottom"].pxValue,left:i["padding-left"].pxValue,right:i["padding-right"].pxValue},o=e._private.position,s=!1;"auto"===i.width.value&&(e._private.autoWidth=n.w+a.left+a.right,o.x=(n.x1+n.x2-a.left+a.right)/2,s=!0),"auto"===i.height.value&&(e._private.autoHeight=n.h+a.top+a.bottom,o.y=(n.y1+n.y2-a.top+a.bottom)/2,s=!0),s&&r.push(e)}var i=this.cy();if(!i.styleEnabled()||!i.hasCompoundNodes())return i.collection();for(var r=[],n=this.parent();n.nonempty();){for(var a=0;a0,d=c;c&&(u=u[0]);var p=d?u._private.position:{x:0,y:0};return a={x:l.x-p.x,y:l.y-p.y},void 0===t?a:a[t]}for(var h=0;h0,d=c;c&&(u=u[0]);var p=d?u._private.position:{x:0,y:0};void 0!==i?r._private.position[t]=i+p[t]:void 0!==a&&(r._private.position={x:a.x+p.x,y:a.y+p.y})}this.rtrigger("position")}else if(!o)return void 0;return this},width:function(){var e=this[0],t=e._private.cy,i=t._private.styleEnabled;if(e){if(i){var r=e._private.style.width;return"auto"===r.strValue?e._private.autoWidth:r.pxValue}return 1}},outerWidth:function(){var e=this[0],r=e._private.cy,n=r._private.styleEnabled;if(e){if(n){var a=e._private.style,o="auto"===a.width.strValue?e._private.autoWidth:a.width.pxValue,s=a["border-width"]?a["border-width"].pxValue*t+i:0;return o+s}return 1}},renderedWidth:function(){var e=this[0];if(e){var t=e.width();return t*this.cy().zoom()}},renderedOuterWidth:function(){var e=this[0];if(e){var t=e.outerWidth();return t*this.cy().zoom()}},height:function(){var e=this[0],t=e._private.cy,i=t._private.styleEnabled;if(e&&"nodes"===e._private.group){if(i){var r=e._private.style.height;return"auto"===r.strValue?e._private.autoHeight:r.pxValue}return 1}},outerHeight:function(){var e=this[0],r=e._private.cy,n=r._private.styleEnabled;if(e&&"nodes"===e._private.group){if(!n)return 1;var a=e._private.style,o="auto"===a.height.strValue?e._private.autoHeight:a.height.pxValue,s=a["border-width"]?a["border-width"].pxValue*t+i:0;return o+s}},renderedHeight:function(){var e=this[0];if(e&&"nodes"===e._private.group){var t=e.height();return t*this.cy().zoom()}},renderedOuterHeight:function(){var e=this[0];if(e&&"nodes"===e._private.group){var t=e.outerHeight();return t*this.cy().zoom()}},renderedBoundingBox:function(e){var t=this.boundingBox(e),i=this.cy(),r=i.zoom(),n=i.pan(),a=t.x1*r+n.x,o=t.x2*r+n.x,s=t.y1*r+n.y,l=t.y2*r+n.y;return{x1:a,x2:o,y1:s,y2:l,w:o-a,h:l-s}},boundingBox:function(e){var t=this,i=t._private.cy,r=i._private,n=r.styleEnabled;e=e||{};var a=void 0===e.includeNodes?!0:e.includeNodes,o=void 0===e.includeEdges?!0:e.includeEdges,s=void 0===e.includeLabels?!0:e.includeLabels;n&&r.renderer.recalculateRenderedStyle(this);for(var l=1/0,u=-1/0,c=1/0,d=-1/0,p=0;ph?h:l,u=v>u?v:u,c=c>f?f:c,d=g>d?g:d}else if(x.isEdge()&&o){E=!0;var N=x._private.source._private.position,T=x._private.target._private.position,M=x._private.rstyle||{};if(h=N.x,v=T.x,f=N.y,g=T.y,h>v){var B=h;h=v,v=B}if(f>g){var B=f;f=g,g=B}if(l=l>h?h:l,u=v>u?v:u,c=c>f?f:c,d=g>d?g:d,n)for(var I=M.bezierPts||[],P=x._private.style.width.pxValue,z=P/2,L=0;Lh?h:l,u=v>u?v:u,c=c>f?f:c,d=g>d?g:d}}if(n){var R=x._private.style,M=x._private.rstyle,X=R.content.strValue,V=R["font-size"],Y=R["text-halign"],A=R["text-valign"],q=M.labelWidth,F=M.labelHeight,j=M.labelX,W=M.labelY;if(E&&s&&X&&V&&null!=F&&null!=q&&null!=j&&null!=W&&Y&&A){var H,$,Z,U,G=F,K=q;if(x.isEdge())H=j-K/2,$=j+K/2,Z=W-G/2,U=W+G/2;else{switch(Y.value){case"left":H=j-K,$=j;break;case"center":H=j-K/2,$=j+K/2;break;case"right":H=j,$=j+K}switch(A.value){case"top":Z=W-G,U=W;break;case"center":Z=W-G/2,U=W+G/2;break;case"bottom":Z=W,U=W+G}}l=l>H?H:l,u=$>u?$:u,c=c>Z?Z:c,d=U>d?U:d}}}}return{x1:l,x2:u,y1:c,y2:d,w:u-l,h:d-c}}}),e.elesfn.modelPosition=e.elesfn.position,e.elesfn.modelPositions=e.elesfn.positions}(cytoscape),function(e){"use strict";function t(e){return function(t){var i=this;if(void 0===t&&(t=!0),0!==i.length&&i.isNode()&&!i.removed()){for(var r=0,n=i[0],a=n._private.edges,o=0;oe}),maxDegree:i("degree",function(e,t){return e>t}),minIndegree:i("indegree",function(e,t){return t>e}),maxIndegree:i("indegree",function(e,t){return e>t}),minOutdegree:i("outdegree",function(e,t){return t>e}),maxOutdegree:i("outdegree",function(e,t){return e>t})}),e.fn.eles({totalDegree:function(e){for(var t=0,i=this.nodes(),r=0;r1&&!n){var a=this.length-1,o=this[a];this[a]=void 0,this[r]=o,t.indexes[o.id()]=r}return this.length--,this},unmerge:function(t){var i=this._private.cy;if(!t)return this;if(e.is.string(t)){var r=t;t=i.elements(r)}for(var n=0;nr&&(r=s,i=o)}return{value:r,ele:i}},min:function(e,t){for(var i,r=1/0,n=this,a=0;as&&(r=s,i=o)}return{value:r,ele:i}}})}(cytoscape),function(e){"use strict";e.fn.eles({isNode:function(){return"nodes"===this.group()},isEdge:function(){return"edges"===this.group()},isLoop:function(){return this.isEdge()&&this.source().id()===this.target().id()},isSimple:function(){return this.isEdge()&&this.source().id()!==this.target().id()},group:function(){var e=this[0];return e?e._private.group:void 0}})}(cytoscape),function(e){"use strict";e.fn.eles({each:function(t){if(e.is.fn(t))for(var i=0;it&&(t=n+t),0>i&&(i=n+i);for(var a=t;a>=0&&i>a&&n>a;a++)r.push(this[a]);return new e.Collection(this.cy(),r)},size:function(){return this.length},eq:function(t){return this[t]||new e.Collection(this.cy())},first:function(){return this[0]||new e.Collection(this.cy())},last:function(){return this[this.length-1]||new e.Collection(this.cy())},empty:function(){return 0===this.length},nonempty:function(){return!this.empty()},sort:function(t){if(!e.is.fn(t))return this;var i=this.cy(),r=this.toArray().sort(t);return new e.Collection(i,r)},sortByZIndex:function(){return this.sort(e.Collection.zIndexSort)},zDepth:function(){var e=this[0];if(!e)return void 0;var t=e._private,i=t.group;if("nodes"===i)return t.data.parent?e.parents().size():0;var r=t.source,n=t.target,a=r._private.data.parent?r.parents().size():0,o=n._private.data.parent?n.parents().size():0;return Math.max(a-1,o-1,0)+.5}}),e.Collection.zIndexSort=function(e,t){var i=e.cy(),r=e._private,n=t._private,a=r.style["z-index"].value-n.style["z-index"].value,o=0,s=0,l=i.hasCompoundNodes(),u="nodes"===r.group,c="edges"===r.group,d="nodes"===n.group,p="edges"===n.group;l&&(o=e.zDepth(),s=t.zDepth());var h=o-s,v=0===h;return v?u&&p?1:c&&d?-1:0===a?r.index-n.index:a:h}}(cytoscape),function(e){"use strict";e.fn.eles({layoutPositions:function(t,i,r){var n=this.nodes(),a=this.cy();if(t.trigger({type:"layoutstart",layout:t}),i.animate)for(var o=0;o0?this.add(o):this;return e?s.rtrigger("style"):s.trigger("style"),this},updateMappers:function(e){var t=this._private.cy,i=t.style();if(e=e||void 0===e?!0:!1,!t.styleEnabled())return this;i.updateMappers(this);var r=this.updateCompoundBounds(),n=r.length>0?this.add(r):this;return e?n.rtrigger("style"):n.trigger("style"),this},renderedCss:function(e){var t=this.cy();if(!t.styleEnabled())return this;var i=this[0];if(i){var r=i.cy().style().getRenderedStyle(i);return void 0===e?r:r[e]}},css:function(t,i){var r=this.cy();if(!r.styleEnabled())return this;var n=!1,a=r.style();if(e.is.plainObject(t)){var o=t;a.applyBypass(this,o,n); +var s=this.updateCompoundBounds(),l=s.length>0?this.add(s):this;l.rtrigger("style")}else if(e.is.string(t)){if(void 0===i){var u=this[0];return u?u._private.style[t].strValue:void 0}a.applyBypass(this,t,i,n);var s=this.updateCompoundBounds(),l=s.length>0?this.add(s):this;l.rtrigger("style")}else if(void 0===t){var u=this[0];return u?a.getRawStyle(u):void 0}return this},removeCss:function(e){var t=this.cy();if(!t.styleEnabled())return this;var i=!1,r=t.style(),n=this;if(void 0===e)for(var a=0;a0?this.add(s):this;return l.rtrigger("style"),this},show:function(){return this.css("display","element"),this},hide:function(){return this.css("display","none"),this},visible:function(){var e=this.cy();if(!e.styleEnabled())return!0;var t=this[0],i=e.hasCompoundNodes();if(t){var r=t._private.style;if("visible"!==r.visibility.value||"element"!==r.display.value)return!1;if("nodes"===t._private.group){if(!i)return!0;var n=t._private.data.parent?t.parents():null;if(n)for(var a=0;a0;o||r.push(a)}}return new e.Collection(this._private.cy,r,{unique:!0}).filter(t)},leaves:function(t){for(var i=this,r=[],n=0;n0;o||r.push(a)}}return new e.Collection(this._private.cy,r,{unique:!0}).filter(t)},outgoers:function(t){for(var i=this,r=[],n=0;n0&&i.push(c[0]),i.push(u[0])}return new e.Collection(r,i,{unique:!0}).filter(t)},closedNeighborhood:function(e){return this.neighborhood().add(this).filter(e)},openNeighborhood:function(e){return this.neighborhood(e)}}),e.fn.eles({source:function(e){var t,i=this[0];return i&&(t=i._private.source),t&&e?t.filter(e):t},target:function(e){var t,i=this[0];return i&&(t=i._private.target),t&&e?t.filter(e):t},sources:t({attr:"source"}),targets:t({attr:"target"})}),e.fn.eles({edgesWith:i(),edgesTo:i({thisIs:"source"})}),e.fn.eles({connectedEdges:function(t){for(var i=[],r=this._private.cy,n=this,a=0;ad;d+=1){if(l.push(n.call(t,i[d],d,i)),a=i[d].id(),u.hasOwnProperty(a))throw"ERROR: Multiple items with the same id found: "+a;u[a]=d,c.push(a)}for(this._private={cy:t,heap:l,pointers:u,elements:c,comparator:r,extractor:n,length:s},d=Math.floor(s/2);d>=0;d-=1)o=this.heapify(d);return o}},e.Heap.idFn=function(e){return e.id()},e.Heap.minHeapComparator=function(e,t){return e>=t},e.Heap.maxHeapComparator=function(e,t){return t>=e},e.fn.heap=function(t){for(var i in t){var r=t[i];e.Heap.prototype[i]=r}},e.heapfn=e.Heap.prototype,e.heapfn.size=function(){return this._private.length},e.heapfn.getArgumentAsCollection=function(t,i){var r;if("undefined"==typeof i&&(i=this._private.cy),e.is.elementOrCollection(t))r=t;else{for(var n=[],a=[].concat.apply([],[t]),o=0;o0&&n.push(l)}r=new e.Collection(i,n)}return r},e.heapfn.isHeap=function(){var e,t,i,r,n,a=this._private.heap,o=a.length,s=this._private.comparator;for(e=0;o>e;e+=1)if(t=2*e+1,i=t+1,r=o>t?s(a[t],a[e]):!0,n=o>i?s(a[i],a[e]):!0,!r||!n)return!1;return!0},e.heapfn.heapSwap=function(e,t){var i=this._private.heap,r=this._private.pointers,n=this._private.elements,a=i[e],o=n[e],s=n[e],l=n[t];i[e]=i[t],n[e]=n[t],r[s]=t,r[l]=e,i[t]=a,n[t]=o},e.heapfn.heapify=function(e,t){var i,r,n,a,o,s,l,u=0,c=!1;for("undefined"==typeof t&&(t=!0),i=this._private.heap,u=i.length,s=this._private.comparator,r=e;!c;)t?(n=2*r+1,a=n+1,o=r,u>n&&!s(i[n],i[o])&&(o=n),u>a&&!s(i[a],i[o])&&(o=a),c=o===r,c||(this.heapSwap(o,r),r=o)):(l=Math.floor((r-1)/2),o=r,c=0>l||s(i[o],i[l]),c||(this.heapSwap(o,l),r=l))},e.heapfn.insert=function(e){var t,i,r,n,a,o=this.getArgumentAsCollection(e),s=o.length;for(a=0;s>a;a+=1){if(t=o[a],i=this._private.heap.length,r=this._private.extractor(t),n=t.id(),this._private.pointers.hasOwnProperty(n))throw"ERROR: Multiple items with the same id found: "+n;this._private.heap.push(r),this._private.elements.push(n),this._private.pointers[n]=i,this.heapify(i,!1)}this._private.length=this._private.heap.length},e.heapfn.getValueById=function(e){if(this._private.pointers.hasOwnProperty(e)){var t=this._private.pointers[e];return this._private.heap[t]}},e.heapfn.contains=function(e){for(var t=this.getArgumentAsCollection(e),i=0;i0?{value:this._private.heap[0],id:this._private.elements[0]}:void 0},e.heapfn.pop=function(){if(this._private.length>0){var e,t,i,r=this.top(),n=this._private.length-1;return this.heapSwap(0,n),e=this._private.elements[n],t=this._private.heap[n],i=e,this._private.heap.pop(),this._private.elements.pop(),this._private.length=this._private.heap.length,this._private.pointers[i]=void 0,this.heapify(0),r}},e.heapfn.findDirectionHeapify=function(e){var t=Math.floor((e-1)/2),i=this._private.heap,r=0>t||this._private.comparator(i[e],i[t]);this.heapify(e,r)},e.heapfn.edit=function(t,i){for(var r=this.getArgumentAsCollection(t),n=0;n=o&&s>=e&&t>=l&&u>=t},a=function(e,t,i,r,n){r=-r;var a=e*Math.cos(r)-t*Math.sin(r),o=e*Math.sin(r)+t*Math.cos(r),s=a*i,l=o*i,u=s+n.x,c=l+n.y;return{x:u,y:c}};r.arrow={_points:[-.15,-.3,0,0,.15,-.3],collide:function(t,i,n,a,o,s,l,u){var c=r.arrow._points;return e.math.pointInsidePolygon(t,i,c,n,a,o,s,l,u)},roughCollide:n,draw:function(e,t,i,n){for(var o=r.arrow._points,s=0;se.math.sqDistanceToQuadraticBezier(i,r,c.startX,c.startY,c.cp2ax,c.cp2ay,c.selfEdgeMidX,c.selfEdgeMidY)||(x=e.math.inBezierVicinity(i,r,c.selfEdgeMidX,c.selfEdgeMidY,c.cp2cx,c.cp2cy,c.endX,c.endY,f))&&b()&&f+h>e.math.sqDistanceToQuadraticBezier(i,r,c.selfEdgeMidX,c.selfEdgeMidY,c.cp2cx,c.cp2cy,c.endX,c.endY))&&u.push(o);else if("haystack"===c.edgeType){var w=d["haystack-radius"].value,_=w/2,E=m._private.position,S=m.width(),P=m.height(),k=y._private.position,C=y.width(),D=y.height(),N=k.x+c.source.x*C*_,T=k.y+c.source.y*D*_,M=E.x+c.target.x*S*_,B=E.y+c.target.y*P*_;(x=e.math.inLineVicinity(i,r,N,T,M,B,g))&&b()&&f+h>e.math.sqDistanceToFiniteLine(i,r,N,T,M,B)&&u.push(o)}else"straight"===c.edgeType?(x=e.math.inLineVicinity(i,r,c.startX,c.startY,c.endX,c.endY,g))&&b()&&f+h>e.math.sqDistanceToFiniteLine(i,r,c.startX,c.startY,c.endX,c.endY)&&u.push(o):"bezier"===c.edgeType&&(x=e.math.inBezierVicinity(i,r,c.startX,c.startY,c.cp2x,c.cp2y,c.endX,c.endY,f))&&b()&&f+h>e.math.sqDistanceToQuadraticBezier(i,r,c.startX,c.startY,c.cp2x,c.cp2y,c.endX,c.endY)&&u.push(o);if(x&&b()&&0===u.length||u[u.length-1]!==o){var I=t.arrowShapes[d["source-arrow-shape"].value],z=t.arrowShapes[d["target-arrow-shape"].value],y=y||o._private.source,m=m||o._private.target,E=m._private.position,k=y._private.position,L=s.getArrowWidth(d.width.pxValue),O=s.getArrowHeight(d.width.pxValue),R=L,X=O;(I.roughCollide(i,r,c.arrowStartX,c.arrowStartY,L,O,[c.arrowStartX-k.x,c.arrowStartY-k.y],0)&&I.collide(i,r,c.arrowStartX,c.arrowStartY,L,O,[c.arrowStartX-k.x,c.arrowStartY-k.y],0)||z.roughCollide(i,r,c.arrowEndX,c.arrowEndY,R,X,[c.arrowEndX-E.x,c.arrowEndY-E.y],0)&&z.collide(i,r,c.arrowEndX,c.arrowEndY,R,X,[c.arrowEndX-E.x,c.arrowEndY-E.y],0))&&u.push(o)}p&&u.length>0&&u[u.length-1]===o&&(a(y),a(m))}for(var s=this,l=this.getCachedZSortedEles(),u=[],c=t.isTouch,d=this.data.cy.zoom(),p=this.data.cy.hasCompoundNodes(),h=(c?256:32)/d,v=(c?16:0)/d,f=l.length-1;f>=0;f--){var g=l[f];if(u.length>0)break;"nodes"===g._private.group?a(l[f]):o(l[f])}return u.length>0?u[u.length-1]:null},t.prototype.getAllInBox=function(i,r,n,a){var o=this.getCachedNodes(),s=this.getCachedEdges(),l=[],u=Math.min(i,n),c=Math.max(i,n),d=Math.min(r,a),p=Math.max(r,a);i=u,n=c,r=d,a=p;for(var h,v=0;v=i&&n>=k&&C>=r&&a>=C,M=D>=i&&n>=D&&N>=r&&a>=N;T&&M&&l.push(s[v])}}return l},t.prototype.getNodeWidth=function(e){return e.width()},t.prototype.getNodeHeight=function(e){return e.height()},t.prototype.getNodeShape=function(e){var t=e._private.style.shape.value;return e.isParent()?"rectangle"===t||"roundrectangle"===t?t:"rectangle":t},t.prototype.getNodePadding=function(e){var t=e._private.style["padding-left"].pxValue,i=e._private.style["padding-right"].pxValue,r=e._private.style["padding-top"].pxValue,n=e._private.style["padding-bottom"].pxValue;return isNaN(t)&&(t=0),isNaN(i)&&(i=0),isNaN(r)&&(r=0),isNaN(n)&&(n=0),{left:t,right:i,top:r,bottom:n}},t.prototype.zOrderSort=e.Collection.zIndexSort,t.prototype.updateCachedZSortedEles=function(){this.getCachedZSortedEles(!0)},t.prototype.getCachedZSortedEles=function(e){var t=this.lastZOrderCachedNodes,i=this.lastZOrderCachedEdges,r=this.getCachedNodes(),n=this.getCachedEdges(),a=[];if(!e&&t&&i&&t===r&&i===n)a=this.cachedZSortedEles;else{for(var o=0;op?p+"-"+d:d+"-"+p,c&&(r="unbundled"+l._private.data.id),null==n[r]&&(n[r]=[],a.push(r)),n[r].push(l),c&&(n[r].hasUnbundled=!0)}else o.push(l)}for(var h,v,f,g,y,m,x,b,w,_,E,S,P,k,C=0;Cv._private.data.id){var N=h;h=v,v=N}if(f=h._private.position,g=v._private.position,y=this.getNodeWidth(h),m=this.getNodeHeight(h),x=this.getNodeWidth(v),b=this.getNodeHeight(v),w=t.nodeShapes[this.getNodeShape(h)],_=t.nodeShapes[this.getNodeShape(v)],E=h._private.style["border-width"].pxValue,S=v._private.style["border-width"].pxValue,k=!1,D.length>1&&h!==v||D.hasUnbundled){var T=w.intersectLine(f.x,f.y,y,m,g.x,g.y,E/2),M=_.intersectLine(g.x,g.y,x,b,f.x,f.y,S/2),B={x1:T[0],x2:M[0],y1:T[1],y2:M[1]},I=M[1]-T[1],z=M[0]-T[0],L=Math.sqrt(z*z+I*I),O={x:z,y:I},R={x:O.x/L,y:O.y/L}; +P={x:-R.y,y:R.x},(_.checkPoint(T[0],T[1],S/2,x,b,g.x,g.y)||w.checkPoint(M[0],M[1],E/2,y,m,f.x,f.y))&&(P={},k=!0)}for(var l,X,s=0;skt,Dt=e.math.distance({x:X.cp2x,y:X.cp2y},{x:X.endX,y:X.endY}),Nt=Pt>Dt;if("bezier"===X.edgeType){var Tt=!1;if(xt||bt||Ct){Tt=!0;var Mt={x:X.cp2x-f.x,y:X.cp2y-f.y},Bt=Math.sqrt(Mt.x*Mt.x+Mt.y*Mt.y),It={x:Mt.x/Bt,y:Mt.y/Bt},zt=Math.max(y,m),Lt={x:X.cp2x+2*It.x*zt,y:X.cp2y+2*It.y*zt},Ot=w.intersectLine(f.x,f.y,y,m,Lt.x,Lt.y,E/2);Ct?(X.cp2x=X.cp2x+It.x*(Pt-kt),X.cp2y=X.cp2y+It.y*(Pt-kt)):(X.cp2x=Ot[0]+It.x*Pt,X.cp2y=Ot[1]+It.y*Pt)}if(wt||_t||Nt){Tt=!0;var Mt={x:X.cp2x-g.x,y:X.cp2y-g.y},Bt=Math.sqrt(Mt.x*Mt.x+Mt.y*Mt.y),It={x:Mt.x/Bt,y:Mt.y/Bt},zt=Math.max(y,m),Lt={x:X.cp2x+2*It.x*zt,y:X.cp2y+2*It.y*zt},Rt=_.intersectLine(g.x,g.y,x,b,Lt.x,Lt.y,S/2);Nt?(X.cp2x=X.cp2x+It.x*(Pt-Dt),X.cp2y=X.cp2y+It.y*(Pt-Dt)):(X.cp2x=Rt[0]+It.x*Pt,X.cp2y=Rt[1]+It.y*Pt)}Tt&&this.findEndpoints(l)}else"straight"===X.edgeType&&(X.midX=(Z+it)/2,X.midY=(G+nt)/2);this.projectBezier(l)}}}for(var s=0;sC*N+D*T)n.straightEdgeTooShort=!0;else{var P=n;this.drawStyledEdge(i,e,[P.startX,P.startY,P.endX,P.endY],_,w),n.straightEdgeTooShort=!1}}else{var P=n;this.drawStyledEdge(i,e,[P.startX,P.startY,P.cp2x,P.cp2y,P.endX,P.endY],_,w)}"haystack"===n.edgeType?this.drawArrowheads(e,i,r):n.noArrowPlacement!==!0&&void 0!==n.startX&&this.drawArrowheads(e,i,r)}}},t.prototype.drawStyledEdge=function(e,i,r,n){var a,o=e._private.rscratch,s=i,l=!1,u=t.usePaths();if(u){for(var c=r,d=o.pathCacheKey&&c.length===o.pathCacheKey.length,p=d,h=0;p&&hu?y+=Math.PI/2:y=-(Math.PI/2+y);var m=this.getArrowWidth(a),x=t.arrowShapes[o];if(p){var b=m+"$"+o+"$"+y+"$"+s+"$"+l;h.arrowPathCacheKey=h.arrowPathCacheKey||{},h.arrowPathCache=h.arrowPathCache||{};var w=h.arrowPathCacheKey[i]===b;w?(d=r=h.arrowPathCache[i],v=!0):(d=r=new Path2D,h.arrowPathCacheKey[i]=b,h.arrowPathCache[i]=d)}r.beginPath&&r.beginPath(),v||x.draw(r,m,y,g),!x.leavePathOpen&&r.closePath&&r.closePath(),r=f,("filled"===n||"both"===n)&&(p?r.fill(d):r.fill()),("hollow"===n||"both"===n)&&(r.lineWidth=x.matchEdgeWidth?a:1,r.lineJoin="miter",p?r.stroke(d):r.stroke())}}(cytoscape),function(e){"use strict";var t=e("renderer","canvas");t.prototype.getCachedImage=function(e,t){var i=this,r=i.imageCache=i.imageCache||{};if(r[e]&&r[e].image)return r[e].image;var n=r[e]=r[e]||{},a=n.image=new Image;return a.addEventListener("load",t),a.src=e,a},t.prototype.drawInscribedImage=function(e,i,r){var n=this,a=r._private.position.x,o=r._private.position.y,s=r._private.style,l=s["background-fit"].value,u=s["background-position-x"],c=s["background-position-y"],d=s["background-repeat"].value,p=r.width(),h=r.height(),v=r._private.rscratch,f=s["background-clip"].value,g="node"===f,y=s["background-image-opacity"].value,m=i.width,x=i.height;if("contain"===l){var b=Math.min(p/m,h/x);m*=b,x*=b}else if("cover"===l){var b=Math.max(p/m,h/x);m*=b,x*=b}var w=a-p/2;w+="%"===u.units?(p-m)*u.value/100:u.pxValue;var _=o-h/2;_+="%"===c.units?(h-x)*c.value/100:c.pxValue,v.pathCache&&(w-=a,_-=o,a=0,o=0);var E=e.globalAlpha;if(e.globalAlpha=y,"no-repeat"===d)g&&(e.save(),v.pathCache?e.clip(v.pathCache):(t.nodeShapes[n.getNodeShape(r)].drawPath(e,a,o,p,h),e.clip())),e.drawImage(i,0,0,i.width,i.height,w,_,m,x),g&&e.restore();else{var S=e.createPattern(i,d);e.fillStyle=S,t.nodeShapes[n.getNodeShape(r)].drawPath(e,a,o,p,h),e.translate(w,_),e.fill(),e.translate(-w,-_)}e.globalAlpha=E}}(cytoscape),function(e){"use strict";var t=e("renderer","canvas");t.prototype.drawEdgeText=function(e,t){var i=t._private.style.content.strValue;if(!(!i||i.match(/^\s+$/)||this.hideEdgesOnViewport&&(this.dragData.didDrag||this.pinching||this.hoverData.dragging||this.data.wheel||this.swipePanning))){var r=t._private.style["font-size"].pxValue*t.cy().zoom(),n=t._private.style["min-zoomed-font-size"].pxValue;if(!(n>r)){e.textAlign="center",e.textBaseline="middle";var a=t._private.rscratch;this.drawText(e,t,a.labelX,a.labelY)}}},t.prototype.drawNodeText=function(e,t){var i=t._private.style.content.strValue;if(i&&!i.match(/^\s+$/)){var r=t._private.style["font-size"].pxValue*t.cy().zoom(),n=t._private.style["min-zoomed-font-size"].pxValue;if(!(n>r)){var a=t._private.style["text-halign"].strValue,o=t._private.style["text-valign"].strValue,s=t._private.rscratch;switch(a){case"left":e.textAlign="right";break;case"right":e.textAlign="left";break;default:e.textAlign="center"}switch(o){case"top":e.textBaseline="bottom";break;case"bottom":e.textBaseline="top";break;default:e.textBaseline="middle"}this.drawText(e,t,s.labelX,s.labelY)}}},t.prototype.getFontCache=function(e){var t;this.fontCaches=this.fontCaches||[];for(var i=0;i0&&(e.lineWidth=s,e.strokeText(o,i,r)),e.fillText(o,i,r)}}}}(cytoscape),function(e){"use strict";var t=e("renderer","canvas");t.prototype.drawNode=function(e,i,r){var n,a,o,s=this,l=i._private.style,u=i._private.rscratch,c=t.usePaths(),d=e,p=!1,h=l["overlay-padding"].pxValue,v=l["overlay-opacity"].value,f=l["overlay-color"].value;if(!r||0!==v){var g=i.effectiveOpacity();if(0!==g)if(n=this.getNodeWidth(i),a=this.getNodeHeight(i),e.lineWidth=l["border-width"].pxValue,void 0!==r&&r)v>0&&(this.fillStyle(e,f[0],f[1],f[2],v),t.nodeShapes.roundrectangle.drawPath(e,i._private.position.x,i._private.position.y,n+2*h,a+2*h),e.fill());else{var y=l["background-color"].value,m=l["border-color"].value,x=l["border-style"].value;switch(this.fillStyle(e,y[0],y[1],y[2],l["background-opacity"].value*l.opacity.value*g),this.strokeStyle(e,m[0],m[1],m[2],l["border-opacity"].value*l.opacity.value*g),e.lineJoin="miter",x){case"dotted":e.setLineDash([1,1]);break;case"dashed":e.setLineDash([4,2]);break;case"solid":case"double":e.setLineDash([])}var b=l["background-image"].value[2]||l["background-image"].value[1],w=l.shape.strValue,_=i._private.position;if(c){var E=w+"$"+n+"$"+a;e.translate(_.x,_.y),u.pathCacheKey===E?(o=e=u.pathCache,p=!0):(o=e=new Path2D,u.pathCacheKey=E,u.pathCache=o)}if(!p){var S=_;c&&(S={x:0,y:0}),t.nodeShapes[this.getNodeShape(i)].drawPath(e,S.x,S.y,n,a)}if(e=d,c?e.fill(o):e.fill(),void 0!==b){var P=this.getCachedImage(b,function(){s.data.canvasNeedsRedraw[t.NODE]=!0,s.data.canvasNeedsRedraw[t.DRAG]=!0,s.redraw()});P.complete&&this.drawInscribedImage(e,P,i)}var k=l["background-blacken"].value,C=l["border-width"].pxValue;if(this.hasPie(i)&&(this.drawPie(e,i),(0!==k||0!==C)&&(c||t.nodeShapes[this.getNodeShape(i)].drawPath(e,_.x,_.y,n,a))),k>0?(this.fillStyle(e,0,0,0,k),c?e.fill(o):e.fill()):0>k&&(this.fillStyle(e,255,255,255,-k),c?e.fill(o):e.fill()),C>0&&(c?e.stroke(o):e.stroke(),"double"===x)){e.lineWidth=l["border-width"].pxValue/3;var D=e.globalCompositeOperation;e.globalCompositeOperation="destination-out",c?e.stroke(o):e.stroke(),e.globalCompositeOperation=D}c&&e.translate(-_.x,-_.y),e.setLineDash([])}}},t.prototype.hasPie=function(e){return e=e[0],e._private.hasPie},t.prototype.drawPie=function(i,r){r=r[0];var n=r._private.style["pie-size"],a=this.getNodeWidth(r),o=this.getNodeHeight(r),s=r._private.position.x,l=r._private.position.y,u=Math.min(a,o)/2,c=0,d=t.usePaths();d&&(s=0,l=0),"%"===n.units?u=u*n.value/100:void 0!==n.pxValue&&(u=n.pxValue/2);for(var p=1;p<=e.style.pieBackgroundN;p++){var h=r._private.style["pie-"+p+"-background-size"].value,v=r._private.style["pie-"+p+"-background-color"].value,f=r._private.style["pie-"+p+"-background-opacity"].value,g=h/100,y=1.5*Math.PI+2*Math.PI*c,m=2*Math.PI*g,x=y+m;0===h||c>=1||c+g>1||(i.beginPath(),i.moveTo(s,l),i.arc(s,l,u,y,x),i.closePath(),this.fillStyle(i,v[0],v[1],v[2],f),i.fill(),c+=g)}}}(cytoscape),function(e){"use strict";var t=e("renderer","canvas");t.prototype.getPixelRatio=function(){var e=this.data.contexts[0];if(null!=this.forcedPixelRatio)return this.forcedPixelRatio;var t=e.backingStorePixelRatio||e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1;return(window.devicePixelRatio||1)/t},t.prototype.paintCache=function(e){for(var t,i=this.paintCaches=this.paintCaches||[],r=!0,n=0;n=o&&(i=r.bufferCanvases[t.TEXTURE_BUFFER],this.textureMult=2,i.width=s*this.textureMult,i.height=l*this.textureMult),this.canvasWidth=s,this.canvasHeight=l}},t.prototype.renderTo=function(e,t,i,r){this.redraw({forcedContext:e,forcedZoom:t,forcedPan:i,drawAllLayers:!0,forcedPxRatio:r})},t.prototype.timeToRender=function(){return this.redrawTotalTime/this.redrawCount},t.minRedrawLimit=1e3/60,t.maxRedrawLimit=1e3,t.motionBlurDelay=100,t.prototype.redraw=function(i){function r(){function i(e,t){if(e.setTransform(1,0,0,1,0,0),"motionBlur"===t){var i=e.globalCompositeOperation;e.globalCompositeOperation="destination-out",u.fillStyle(e,255,255,255,.666),e.fillRect(0,0,u.canvasWidth,u.canvasHeight),e.globalCompositeOperation=i}else n||void 0!==t&&!t||e.clearRect(0,0,u.canvasWidth,u.canvasHeight);a||(e.translate(b.x,b.y),e.scale(m,m)),l&&e.translate(l.x,l.y),s&&e.scale(s,s)}function r(e,t){for(var i=e.eles,r=0;r0&&(C.strokeStyle="rgba("+g["selection-box-border-color"].value[0]+","+g["selection-box-border-color"].value[1]+","+g["selection-box-border-color"].value[2]+","+g["selection-box-opacity"].value+")",C.strokeRect(p.select[0],p.select[1],p.select[2]-p.select[0],p.select[3]-p.select[1]))}if(p.bgActivePosistion){var y=p.cy.zoom(),q=p.bgActivePosistion;C.fillStyle="rgba("+g["active-bg-color"].value[0]+","+g["active-bg-color"].value[1]+","+g["active-bg-color"].value[2]+","+g["active-bg-opacity"].value+")",C.beginPath(),C.arc(q.x,q.y,g["active-bg-size"].pxValue/y,0,2*Math.PI),C.fill()}var F=u.averageRedrawTime;if(u.showFps&&F){F=Math.round(F);var j=Math.round(1e3/F);C.setTransform(1,0,0,1,0,0),C.fillStyle="rgba(255, 0, 0, 0.75)",C.strokeStyle="rgba(255, 0, 0, 0.75)",C.lineWidth=1,C.fillText("1 frame = "+F+" ms = "+j+" fps",0,20);var W=60;C.strokeRect(0,30,250,20),C.fillRect(0,30,250*Math.min(j/W,1),20)}a||(h[t.SELECT_BOX]=!1)}var H=+new Date;void 0===u.averageRedrawTime&&(u.averageRedrawTime=H-w),void 0===u.redrawCount&&(u.redrawCount=0),u.redrawCount++,void 0===u.redrawTotalTime&&(u.redrawTotalTime=0),u.redrawTotalTime+=H-w,u.lastRedrawTime=H-w,u.averageRedrawTime=u.averageRedrawTime/2+(H-w)/2,u.currentlyDrawing=!1,u.clearingMotionBlur&&(u.clearingMotionBlur=!1,u.motionBlurCleared=!0,u.motionBlur=!0),v&&(u.motionBlurTimeout=setTimeout(function(){u.motionBlurTimeout=null,u.clearedNodeLayerForMotionBlur=!1,u.motionBlur=!1,u.clearingMotionBlur=!0,h[t.NODE]=!0,h[t.DRAG]=!0,u.redraw()},t.motionBlurDelay))}i=i||{};var n=i.forcedContext,a=i.drawAllLayers,o=i.drawOnlyNodeLayer,s=i.forcedZoom,l=i.forcedPan,u=this,c=void 0===i.forcedPxRatio?this.getPixelRatio():i.forcedPxRatio,d=u.data.cy,p=u.data,h=p.canvasNeedsRedraw,v=void 0!==i.motionBlur?i.motionBlur:u.motionBlur;v=v&&!n&&u.motionBlurEnabled,u.motionBlurTimeout&&clearTimeout(u.motionBlurTimeout),this.redrawTimeout&&clearTimeout(this.redrawTimeout),this.redrawTimeout=null,void 0===this.averageRedrawTime&&(this.averageRedrawTime=0);var f=t.minRedrawLimit,g=t.maxRedrawLimit,y=this.averageRedrawTime;y=f>y?f:y,y=g>y?y:g,void 0===this.lastDrawTime&&(this.lastDrawTime=0);var m=+new Date,x=m-this.lastDrawTime,b=x>=y;if(!n){if(!b||this.currentlyDrawing)return void(this.redrawTimeout=setTimeout(function(){u.redraw()},y));this.lastDrawTime=m,this.currentlyDrawing=!0}var w=+new Date;n?r():e.util.requestAnimationFrame(r),n||u.initrender||(u.initrender=!0,d.trigger("initrender"))}}(cytoscape),function(e){"use strict";var t=e("renderer","canvas");t.prototype.drawPolygonPath=function(e,t,i,r,n,a){var o=r/2,s=n/2;e.beginPath&&e.beginPath(),e.moveTo(t+o*a[0],i+s*a[1]);for(var l=1;l0&&a>0)if(l.clearRect(0,0,n,a),e.bg&&(l.fillStyle=e.bg,l.rect(0,0,n,a),l.fill()),l.globalCompositeOperation="source-over",e.full)this.redraw({forcedContext:l,drawAllLayers:!0,forcedZoom:o,forcedPan:{x:-r.x1*o,y:-r.y1*o},forcedPxRatio:1});else{var u=i.pan(),c={x:u.x*o,y:u.y*o},d=i.zoom()*o;this.redraw({forcedContext:l,drawAllLayers:!0,forcedZoom:d,forcedPan:c,forcedPxRatio:1})}return s},t.prototype.png=function(e){return this.bufferCanvasImage(e).toDataURL("image/png")}}(cytoscape),function(e){"use strict";var t=e("renderer","canvas");t.prototype.registerBinding=function(e,t,i,r){this.bindings.push({target:e,event:t,handler:i,useCapture:r}),e.addEventListener(t,i,r)},t.prototype.nodeIsDraggable=function(e){return 0!==e._private.style.opacity.value&&"visible"==e._private.style.visibility.value&&"element"==e._private.style.display.value&&!e.locked()&&e.grabbable()?!0:!1},t.prototype.load=function(){var i=this,r=function(e){var t;if(e.addToList&&i.data.cy.hasCompoundNodes()){if(!e.addToList.hasId){e.addToList.hasId={};for(var r=0;rs[0]&&r.clientXs[1]&&r.clientY=t.panOrBoxSelectDelay)&&Math.abs(v[3]-v[1])+Math.abs(v[2]-v[0])<4&&p.panningEnabled()&&p.userPanningEnabled())i.hoverData.dragging=!0,v[4]=0;else{if(p.boxSelectionEnabled()&&Math.pow(v[2]-v[0],2)+Math.pow(v[3]-v[1],2)>7&&v[4]&&(clearTimeout(i.bgActiveTimeout),i.data.bgActivePosistion=void 0,i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0,i.redraw()),y&&y.isEdge()&&y.active()&&y.unactivate(),f!=g&&(g&&(g.trigger(new e.Event(r,{type:"mouseout",cyPosition:{x:h[0],y:h[1]}})),g.trigger(new e.Event(r,{type:"tapdragout",cyPosition:{x:h[0],y:h[1]}}))),f&&(f.trigger(new e.Event(r,{type:"mouseover",cyPosition:{x:h[0],y:h[1]}})),f.trigger(new e.Event(r,{type:"tapdragover",cyPosition:{x:h[0],y:h[1]}}))),i.hoverData.last=f),y&&y.isNode()&&i.nodeIsDraggable(y)){i.dragData.didDrag||(i.data.canvasNeedsRedraw[t.NODE]=!0),i.dragData.didDrag=!0;for(var _=[],E=0;E7&&l[4]||i.hoverData.dragging||(a.$(function(){return this.selected()}).unselect(),c.length>0&&(i.data.canvasNeedsRedraw[t.NODE]=!0),i.dragData.possibleDragElements=c=[]),null!=u?u.trigger(new e.Event(r,{type:"mouseup",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"tapend",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"vmouseup",cyPosition:{x:s[0],y:s[1]}})):null==u&&a.trigger(new e.Event(r,{type:"mouseup",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"tapend",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"vmouseup",cyPosition:{x:s[0],y:s[1]}})),Math.pow(l[2]-l[0],2)+Math.pow(l[3]-l[1],2)===0&&(null!=u?u.trigger(new e.Event(r,{type:"click",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"tap",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"vclick",cyPosition:{x:s[0],y:s[1]}})):null==u&&a.trigger(new e.Event(r,{type:"click",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"tap",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"vclick",cyPosition:{x:s[0],y:s[1]}}))),u!=d||i.dragData.didDrag||null!=u&&u._private.selectable&&("additive"===a.selectionType()||p?u.selected()?u.unselect():u.select():p||(a.$(":selected").not(u).unselect(),u.select()),i.data.canvasNeedsRedraw[t.NODE]=!0),a.boxSelectionEnabled()&&Math.pow(l[2]-l[0],2)+Math.pow(l[3]-l[1],2)>7&&l[4]){var f=[],g=i.getAllInBox(l[0],l[1],l[2],l[3]);i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0,g.length>0&&(i.data.canvasNeedsRedraw[t.NODE]=!0);for(var y=0;y=0&&b>=d&&h>=0&&b>=h&&p>=0&&w>=p&&v>=0&&w>=v;var k=n.pan(),C=n.zoom();if(f=E(d,p,h,v),g=[(d+h)/2,(p+v)/2],y=[(g[0]-k.x)/C,(g[1]-k.y)/C],200>f&&!r.touches[2]){var D=i.findNearestElement(l[0],l[1],!0),N=i.findNearestElement(l[2],l[3],!0);return D&&D.isNode()?(D.activate().trigger(new e.Event(r,{type:"cxttapstart",cyPosition:{x:l[0],y:l[1]}})),i.touchData.start=D):N&&N.isNode()?(N.activate().trigger(new e.Event(r,{type:"cxttapstart",cyPosition:{x:l[0],y:l[1]}})),i.touchData.start=N):(n.trigger(new e.Event(r,{type:"cxttapstart",cyPosition:{x:l[0],y:l[1]}})),i.touchData.start=null),i.touchData.start&&(i.touchData.start._private.grabbed=!1),i.touchData.cxt=!0,i.touchData.cxtDragged=!1,i.data.bgActivePosistion=void 0,void i.redraw()}}if(r.touches[2]);else if(r.touches[1]);else if(r.touches[0]){var T=i.findNearestElement(l[0],l[1],!0);if(null!=T){if(T.activate(),i.touchData.start=T,T.isNode()&&i.nodeIsDraggable(T)){var M=i.dragData.touchDragEles=[];if(i.data.canvasNeedsRedraw[t.NODE]=!0,i.data.canvasNeedsRedraw[t.DRAG]=!0,T.selected())for(var B=n.$(function(){return this.isNode()&&this.selected()}),I=0;I250&&(i.touchData.start?i.touchData.start.trigger(new e.Event(r,{type:"taphold",cyPosition:{x:l[0],y:l[1]}})):(i.data.cy.trigger(new e.Event(r,{type:"taphold",cyPosition:{x:l[0],y:l[1]}})),n.$(":selected").unselect()))},1e3)}},!1),i.registerBinding(window,"touchmove",e.util.throttle(function(r){var n=i.data.select,o=i.touchData.capture;o&&r.preventDefault();var s=i.data.cy,l=i.touchData.now,u=i.touchData.earlier;if(r.touches[0]){var c=i.projectIntoViewport(r.touches[0].clientX,r.touches[0].clientY);l[0]=c[0],l[1]=c[1]}if(r.touches[1]){var c=i.projectIntoViewport(r.touches[1].clientX,r.touches[1].clientY);l[2]=c[0],l[3]=c[1]}if(r.touches[2]){var c=i.projectIntoViewport(r.touches[2].clientX,r.touches[2].clientY);l[4]=c[0],l[5]=c[1]}for(var g=[],b=0;b=1.5||C>=150){i.touchData.cxt=!1,i.touchData.start&&(i.touchData.start.unactivate(),i.touchData.start=null),i.data.bgActivePosistion=void 0,i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0;var N=new e.Event(r,{type:"cxttapend",cyPosition:{x:l[0],y:l[1]}});i.touchData.start?i.touchData.start.trigger(N):s.trigger(N)}}if(o&&i.touchData.cxt){var N=new e.Event(r,{type:"cxtdrag",cyPosition:{x:l[0],y:l[1]}});i.data.bgActivePosistion=void 0,i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0,i.touchData.start?i.touchData.start.trigger(N):s.trigger(N),i.touchData.start&&(i.touchData.start._private.grabbed=!1),i.touchData.cxtDragged=!0;var T=i.findNearestElement(l[0],l[1],!0);i.touchData.cxtOver&&T===i.touchData.cxtOver||(i.touchData.cxtOver&&i.touchData.cxtOver.trigger(new e.Event(r,{type:"cxtdragout",cyPosition:{x:l[0],y:l[1]}})),i.touchData.cxtOver=T,T&&T.trigger(new e.Event(r,{type:"cxtdragover",cyPosition:{x:l[0],y:l[1]}})))}else if(o&&r.touches[2]&&s.boxSelectionEnabled())i.data.bgActivePosistion=void 0,clearTimeout(this.threeFingerSelectTimeout),this.lastThreeTouch=+new Date,i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0,n&&0!==n.length&&void 0!==n[0]?(n[2]=(l[0]+l[2]+l[4])/3,n[3]=(l[1]+l[3]+l[5])/3):(n[0]=(l[0]+l[2]+l[4])/3,n[1]=(l[1]+l[3]+l[5])/3,n[2]=(l[0]+l[2]+l[4])/3+1,n[3]=(l[1]+l[3]+l[5])/3+1),n[4]=1,i.redraw();else if(o&&r.touches[1]&&s.zoomingEnabled()&&s.panningEnabled()&&s.userZoomingEnabled()&&s.userPanningEnabled()){i.data.bgActivePosistion=void 0,i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0;var M=i.dragData.touchDragEles;if(M){i.data.canvasNeedsRedraw[t.DRAG]=!0;for(var B=0;B4&&(i.touchData.singleTouchMoved=!0);if(o&&(null==W||W.isEdge())&&s.panningEnabled()&&s.userPanningEnabled()){W&&(W.unactivate(),i.data.bgActivePosistion||(i.data.bgActivePosistion={x:l[0],y:l[1]}),i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0,i.touchData.start=null),s.panBy({x:g[0]*s.zoom(),y:g[1]*s.zoom()}),i.swipePanning=!0;var c=i.projectIntoViewport(r.touches[0].clientX,r.touches[0].clientY);l[0]=c[0],l[1]=c[1]}}for(var b=0;b0?i.data.canvasNeedsRedraw[t.NODE]=!0:i.redraw()}r.touches.length<2&&(i.pinching=!1,i.data.canvasNeedsRedraw[t.NODE]=!0,i.redraw());var m=!1;if(null!=n&&(n._private.active=!1,m=!0,n.unactivate()),r.touches[2])i.data.bgActivePosistion=void 0,i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0;else if(r.touches[1]);else if(r.touches[0]);else if(!r.touches[0]){if(i.data.bgActivePosistion=void 0,i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0,null!=n){n._private.grabbed&&(n._private.grabbed=!1,n.trigger("free"),n._private.rscratch.inDragLayer=!1);for(var x=n._private.edges,b=0;bc;c++)d[4*c]=p[2*c],d[4*c+1]=p[2*c+1],d[4*c+2]=h[2*c],d[4*c+3]=h[2*c+1];d=e.math.fitPolygonToSquare(d),n.star5=n.star={points:d,draw:function(e,t,r,a,o){i.drawPolygon(e,t,r,a,o,n.star5.points)},drawPath:function(e,t,r,a,o){i.drawPolygonPath(e,t,r,a,o,n.star5.points)},intersectLine:function(e,t,r,a,o,s,l){return i.polygonIntersectLine(o,s,n.star5.points,e,t,r/2,a/2,l)},intersectBox:function(e,t,r,a,o,s,l,u,c){var d=n.star5.points;return i.boxIntersectPolygon(e,t,r,a,d,o,s,l,u,[0,-1],c)},checkPoint:function(t,i,r,a,o,s,l){return e.math.pointInsidePolygon(t,i,n.star5.points,s,l,a,o,[0,-1],r)}}}(cytoscape),function(e){"use strict";function t(t){this._private={},this._private.options=e.util.extend({},i,t)}var i={animate:!0,maxSimulationTime:4e3,fit:!0,padding:30,boundingBox:void 0,ungrabifyWhileSimulating:!1,ready:void 0,stop:void 0,repulsion:void 0,stiffness:void 0,friction:void 0,gravity:!0,fps:void 0,precision:void 0,nodeMass:void 0,edgeLength:void 0,stepSize:.1,stableEnergy:function(e){var t=e;return t.max<=.5||t.mean<=.3},infinite:!1};t.prototype.run=function(){var t=this,i=this._private.options;return e.util.require("arbor",function(r){function n(e,t){return null==t?void 0:"function"==typeof t?t.apply(e,[e._private.data,{nodes:u.length,edges:c.length,element:e}]):t}function a(e){if(!e.isFullAutoParent()){var t=e._private.data.id,r=n(e,i.nodeMass),a=e._private.locked,o=e.position(),s=h.fromScreen({x:o.x,y:o.y});e.scratch().arbor=h.addNode(t,{element:e,mass:r,fixed:a,x:a?s.x:void 0,y:a?s.y:void 0})}}function o(e){var t=e.source().id(),r=e.target().id(),a=n(e,i.edgeLength);e.scratch().arbor=h.addEdge(t,r,{length:a})}var s=i.cy,l=i.eles,u=l.nodes().not(":parent"),c=l.edges(),d=e.util.makeBoundingBox(i.boundingBox?i.boundingBox:{x1:0,y1:0,w:s.width(),h:s.height()}),p=!1;if(t.trigger({type:"layoutstart",layout:t}),void 0!==i.liveUpdate&&(i.animate=i.liveUpdate),s.nodes().size()<=1)return i.fit&&s.reset(),s.nodes().position({x:Math.round((d.x1+d.x2)/2),y:Math.round((d.y1+d.y2)/2)}),t.one("layoutready",i.ready),t.trigger({type:"layoutready",layout:t}),t.one("layoutstop",i.stop),void t.trigger({type:"layoutstop",layout:t});var h=t._private.system=r.ParticleSystem();h.parameters({repulsion:i.repulsion,stiffness:i.stiffness,friction:i.friction,gravity:i.gravity,fps:i.fps,dt:i.dt,precision:i.precision}),i.animate&&i.fit&&s.fit(d,i.padding);var v,f=250,g=!1,y=+new Date,m={init:function(){},redraw:function(){var e=h.energy();if(!i.infinite&&null!=i.stableEnergy&&null!=e&&e.n>0&&i.stableEnergy(e))return void t.stop();i.infinite||1/0==f||(clearTimeout(v),v=setTimeout(P,f));var r=s.collection();h.eachNode(function(e,t){var i=e.data,n=i.element;null!=n&&(n.locked()||n.grabbed()||(n.silentPosition({x:d.x1+t.x,y:d.y1+t.y}),r.merge(n)))}),i.animate&&r.length>0&&(p=!0,r.rtrigger("position"),i.fit&&s.fit(i.padding),y=+new Date,p=!1),g||(g=!0,t.one("layoutready",i.ready),t.trigger({type:"layoutready",layout:t}))}};h.renderer=m,h.screenSize(d.w,d.h),h.screenPadding(i.padding,i.padding,i.padding,i.padding),h.screenStep(i.stepSize);var x;u.on("grab free position",x=function(e){if(!p){var t=this.position(),n=h.fromScreen(t);if(n){var a=r.Point(n.x,n.y),o=i.padding;switch(d.x1+o<=t.x&&t.x<=d.x2-o&&d.y1+o<=t.y&&t.y<=d.y2-o&&(this.scratch().arbor.p=a),e.type){case"grab":this.scratch().arbor.fixed=!0;break;case"free":this.scratch().arbor.fixed=!1}}}});var b;u.on("lock unlock",b=function(){node.scratch().arbor.fixed=node.locked()});var w;l.on("remove",w=function(){});var _;s.on("add","*",_=function(){});var E;s.on("resize",E=function(){if(null==i.boundingBox&&null!=t._private.system){var e=s.width(),r=s.height();h.screenSize(e,r)}}),u.each(function(e,t){a(t)}),c.each(function(e,t){o(t)});var S=u.filter(":grabbable");i.ungrabifyWhileSimulating&&S.ungrabify();var P=t._private.doneHandler=function(){t._private.doneHandler=null,i.animate||(i.fit&&s.reset(),u.rtrigger("position")),u.off("grab free position",x),u.off("lock unlock",b),l.off("remove",w),s.off("add","*",_),s.off("resize",E),i.ungrabifyWhileSimulating&&S.grabify(),t.one("layoutstop",i.stop),t.trigger({type:"layoutstop",layout:t})};h.start(),!i.infinite&&null!=i.maxSimulationTime&&i.maxSimulationTime>0&&1/0!==i.maxSimulationTime&&setTimeout(function(){t.stop()},i.maxSimulationTime)}),this},t.prototype.stop=function(){return null!=this._private.system&&this._private.system.stop(),this._private.doneHandler&&this._private.doneHandler(),this},e("layout","arbor",t)}(cytoscape),function(e){"use strict";function t(t){this.options=e.util.extend({},i,t)}var i={fit:!0,directed:!1,padding:30,circle:!1,boundingBox:void 0,avoidOverlap:!0,roots:void 0,maximalAdjustments:0,animate:!1,animationDuration:500,ready:void 0,stop:void 0};t.prototype.run=function(){var t,i=this.options,r=i,n=i.cy,a=r.eles,o=a.nodes().not(":parent"),s=a,l=e.util.makeBoundingBox(r.boundingBox?r.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()});if(e.is.elementOrCollection(r.roots))t=r.roots;else if(e.is.array(r.roots)){for(var u=[],c=0;c0;){var f=n.collection();a.bfs({roots:v[0],visit:function(e,t,i){f=f.add(i)},directed:!1}),v=v.not(f),h.push(f)}t=n.collection();for(var c=0;cC;){for(var D=P.shift(),N=D.neighborhood().nodes(),T=!1,c=0;cc;c++)for(var M=x[c],R=M.length,X=0;R>X;X++){var p=M[X],V=p._private.scratch.breadthfirst,Y=I(p);Y&&(V.intEle=Y,O.push(p))}for(var c=0;cx.length-1;)x.push([]);x[q].push(p),V.depth=q,V.index=x[q].length-1}B()}var F=0;if(r.avoidOverlap){for(var c=0;cl||0===t)&&(r+=s/u,n++)}return n=Math.max(1,n),r/=n,0===n&&(r=void 0),H[e.id()]=r,r},Z=function(e,t){var i=$(e),r=$(t);return i-r},U=0;3>U;U++){for(var c=0;c0&&x[0].length<=3?c/2:0),g=2*Math.PI/x[n].length*a;return 0===n&&1===x[0].length&&(f=1),{x:K.x+f*Math.cos(g),y:K.y+f*Math.sin(g)}}return{x:K.x+(a+1-(o+1)/2)*s,y:(n+1)*u}},Q={},c=x.length-1;c>=0;c--)for(var M=x[c],X=0;X1&&r.avoidOverlap){d*=1.75;var c=2*Math.PI/o.length,f=Math.cos(c)-Math.cos(0),g=Math.sin(c)-Math.sin(0),y=Math.sqrt(d*d/(f*f+g*g));t=Math.max(y,t)}var m=function(){var e=t*Math.cos(u),i=t*Math.sin(u),n={x:l.x+e,y:l.y+i};return u=r.counterclockwise?u-c:u+c,n};return o.layoutPositions(this,r,m),this},e("layout","circle",t)}(cytoscape),function(e){"use strict";function t(t){this.options=e.util.extend(!0,{},i,t)}var i={animate:!0,refresh:1,maxSimulationTime:4e3,ungrabifyWhileSimulating:!1,fit:!0,padding:30,boundingBox:void 0,ready:function(){},stop:function(){},randomize:!1,avoidOverlap:!0,handleDisconnected:!0,nodeSpacing:function(){return 10},flow:void 0,alignment:void 0,edgeLength:void 0,edgeSymDiffLength:void 0,edgeJaccardLength:void 0,unconstrIter:void 0,userConstIter:void 0,allConstIter:void 0,infinite:!1};t.prototype.run=function(){var t=this,i=this.options;return e.util.require("cola",function(r){var n=i.cy,a=i.eles,o=a.nodes(),s=a.edges(),l=!1,u=e.util.makeBoundingBox(i.boundingBox?i.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()}),c=function(t,i){if(e.is.fn(t)){var r=t;return r.apply(i,[i])}return t},d=function(){for(var e={min:1/0,max:-1/0},t={min:1/0,max:-1/0},r=0;ri&&!e;i++)e=e||n();return e};if(i.animate){var o=function(){a()||e.util.requestAnimationFrame(o)};e.util.requestAnimationFrame(o)}else for(;!n(););},on:function(){},drag:function(){}});t.adaptor=g;var y=o.filter(":grabbable");i.ungrabifyWhileSimulating&&y.ungrabify();var m;o.on("grab free position",m=function(t){var i=this,r=i._private.scratch.cola,n=i._private.position;switch(i.grabbed()?(r.x=n.x-u.x1,r.y=n.y-u.y1,g.dragstart(r)):e.is.number(r.x)&&e.is.number(r.y)&&(n.x=r.x+u.x1,n.y=r.y+u.y1),t.type){case"grab":g.dragstart(r),g.resume();break;case"free":g.dragend(r)}});var x;o.on("lock unlock",x=function(){var e=this,t=e._private.scratch.cola;e.locked()?g.dragstart(t):g.dragend(t)});var b=o.stdFilter(function(e){return!e.isParent()});if(g.nodes(b.map(function(e,t){var r=c(i.nodeSpacing,e),n=e.position(),a=e._private.scratch.cola={x:i.randomize?Math.round(Math.random()*u.w):n.x,y:i.randomize?Math.round(Math.random()*u.h):n.y,width:e.outerWidth()+2*r,height:e.outerHeight()+2*r,index:t};return a})),i.alignment){var w=[],_=[];b.forEach(function(e){var t=c(i.alignment,e),r=e._private.scratch.cola,n=r.index;t&&(null!=t.x&&w.push({node:n,offset:t.x}),null!=t.y&&_.push({node:n,offset:t.y}))});var E=[];w.length>0&&E.push({type:"alignment",axis:"x",offsets:w}),_.length>0&&E.push({type:"alignment",axis:"y",offsets:_}),g.constraints(E)}g.groups(o.stdFilter(function(e){return e.isParent()}).map(function(e,t){return e._private.scratch.cola={index:t,leaves:e.children().stdFilter(function(e){return!e.isParent()}).map(function(e){return e[0]._private.scratch.cola.index})},e}).map(function(e){return e._private.scratch.cola.groups=e.children().stdFilter(function(e){return e.isParent()}).map(function(e){return e._private.scratch.cola.index}),e._private.scratch.cola}));var S,P;null!=i.edgeLength?(S=i.edgeLength,P="linkDistance"):null!=i.edgeSymDiffLength?(S=i.edgeSymDiffLength,P="symmetricDiffLinkLengths"):null!=i.edgeJaccardLength?(S=i.edgeJaccardLength,P="jaccardLinkLengths"):(S=100,P="linkDistance");var k=function(e){return e.calcLength};if(g.links(s.stdFilter(function(e){return!e.source().isParent()&&!e.target().isParent()}).map(function(e){var t=e._private.scratch.cola={source:e.source()[0]._private.scratch.cola.index,target:e.target()[0]._private.scratch.cola.index};return null!=S&&(t.calcLength=c(S,e)),t})),g.size([u.w,u.h]),null!=S&&g[P](k),i.flow){var C,D="y",N=50;e.is.string(i.flow)?C={axis:i.flow,minSeparation:N}:e.is.number(i.flow)?C={axis:D,minSeparation:i.flow}:e.is.plainObject(i.flow)?(C=i.flow,C.axis=C.axis||D,C.minSeparation=null!=C.minSeparation?C.minSeparation:N):C={axis:D,minSeparation:N},g.flowLayout(C.axis,C.minSeparation)}g.avoidOverlaps(i.avoidOverlap).handleDisconnected(i.handleDisconnected).start(i.unconstrIter,i.userConstIter,i.allConstIter),t.trigger({type:"layoutstart",layout:t}),i.infinite||setTimeout(function(){g.stop()},i.maxSimulationTime)}),this},t.prototype.stop=function(){return this.adaptor&&(this.manuallyStopped=!0,this.adaptor.stop()),this},e("layout","cola",t)}(cytoscape),function(e){"use strict";function t(t){this.options=e.util.extend({},i,t)}var i={fit:!0,padding:30,startAngle:1.5*Math.PI,counterclockwise:!1,minNodeSpacing:10,boundingBox:void 0,avoidOverlap:!0,height:void 0,width:void 0,concentric:function(){return this.degree()},levelWidth:function(e){return e.maxDegree()/4},animate:!1,animationDuration:500,ready:void 0,stop:void 0};t.prototype.run=function(){for(var t=this.options,i=t,r=t.cy,n=i.eles,a=n.nodes().not(":parent"),o=e.util.makeBoundingBox(i.boundingBox?i.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()}),s={x:o.x1+o.w/2,y:o.y1+o.h/2},l=[],u=i.startAngle,c=0,d=0;d0){var m=Math.abs(g[0].value-y.value);m>=v&&(g=[],f.push(g))}g.push(y)}var x={},b=0,w=c+i.minNodeSpacing;if(!i.avoidOverlap){var _=f.length>0&&f[0].length>1,E=Math.min(o.w,o.h)/2-w,S=E/(f.length+_?1:0);w=Math.min(w,S)}for(var d=0;d1&&i.avoidOverlap){var C=Math.cos(k)-Math.cos(0),D=Math.sin(k)-Math.sin(0),N=Math.sqrt(w*w/(C*C+D*D));b=Math.max(N,b)}for(var T=0;T=d;){var g=c[d++],y=s.idToIndex[g],m=s.layoutNodes[y],x=m.children;if(x.length>0){s.graphSet.push(x);for(var l=0;lr.count?0:r.graph},o=function(e,t,i,r){var n=r.graphSet[i];if(-1<$.inArray(e,n)&&-1<$.inArray(t,n))return{count:2,graph:i};for(var a=0,s=0;ss;s++)for(var l=e.layoutNodes[e.idToIndex[a[s]]],u=s+1;o>u;u++){var c=e.layoutNodes[e.idToIndex[a[u]]];p(l,c,e,t,i)}}},p=function(e,t,i,r,n){var a="Node repulsion. Node1: "+e.id+" Node2: "+t.id,o=t.positionX-e.positionX,s=t.positionY-e.positionY;if(a+="\ndirectionX: "+o+", directionY: "+s,0===o&&0===s)return void(a+="\nNodes have the same position.");var l=v(e,t,o,s);if(l>0){a+="\nNodes DO overlap.",a+="\nOverlap: "+l;var u=n.nodeOverlap*l,c=Math.sqrt(o*o+s*s);a+="\nDistance: "+c;var d=u*o/c,p=u*s/c}else{a+="\nNodes do NOT overlap.";var f=h(e,o,s),g=h(t,-1*o,-1*s),y=g.x-f.x,m=g.y-f.y,x=y*y+m*m,c=Math.sqrt(x);a+="\nDistance: "+c;var u=n.nodeRepulsion/x,d=u*y/c,p=u*m/c}e.offsetX-=d,e.offsetY-=p,t.offsetX+=d,t.offsetY+=p,a+="\nForceX: "+d+" ForceY: "+p,w(a)},h=function(e,t,i){var r=e.positionX,n=e.positionY,a=e.height,o=e.width,s=i/t,l=a/o,u="Computing clipping point of node "+e.id+" . Height: "+a+", Width: "+o+"\nDirection "+t+", "+i,c={};do{if(0===t&&i>0){c.x=r,u+="\nUp direction",c.y=n+a/2;break}if(0===t&&0>i){c.x=r,c.y=n+a/2,u+="\nDown direction";break}if(t>0&&s>=-1*l&&l>=s){c.x=r+o/2,c.y=n+o*i/2/t,u+="\nRightborder";break}if(0>t&&s>=-1*l&&l>=s){c.x=r-o/2,c.y=n-o*i/2/t,u+="\nLeftborder";break}if(i>0&&(-1*l>=s||s>=l)){c.x=r+a*t/2/i,c.y=n+a/2,u+="\nTop border";break}if(0>i&&(-1*l>=s||s>=l)){c.x=r-a*t/2/i,c.y=n-a/2,u+="\nBottom border";break}}while(!1);return u+="\nClipping point found at "+c.x+", "+c.y,w(u),c},v=function(e,t,i,r){if(i>0)var n=e.maxX-t.minX;else var n=t.maxX-e.minX;if(r>0)var a=e.maxY-t.minY;else var a=t.maxY-e.minY;return n>=0&&a>=0?Math.sqrt(n*n+a*a):0},f=function(e,t,i){for(var r=0;rd;d++){var p=e.layoutNodes[e.idToIndex[a[d]]];r="Node: "+p.id;var h=s-p.positionX,v=l-p.positionY,f=Math.sqrt(h*h+v*v);if(f>1){var g=i.gravity*h/f,y=i.gravity*v/f;p.offsetX+=g,p.offsetY+=y,r+=": Applied force: "+g+", "+y}else r+=": skypped since it's too close to center";w(r)}}},y=function(e){var t=[],i=0,r=-1;for(w("propagateForces"),t.push.apply(t,e.graphSet[0]),r+=e.graphSet[0].length;r>=i;){var n=t[i++],a=e.idToIndex[n],o=e.layoutNodes[a],s=o.children;if(0i)var a={x:i*e/n,y:i*t/n};else var a={x:e,y:t};return r+=".\nResult: ("+a.x+", "+a.y+")",w(r),a},b=function(e,t){var i="Propagating new position/size of node "+e.id,r=e.parentId;if(null==r)return i+=". No parent node.",void w(i);var n=t.layoutNodes[t.idToIndex[r]],a=!1;return(null==n.maxX||e.maxX+n.padRight>n.maxX)&&(n.maxX=e.maxX+n.padRight,a=!0,i+="\nNew maxX for parent node "+n.id+": "+n.maxX),(null==n.minX||e.minX-n.padLeftn.maxY)&&(n.maxY=e.maxY+n.padBottom,a=!0,i+="\nNew maxY for parent node "+n.id+": "+n.maxY),(null==n.minY||e.minY-n.padTops){var h=d(),v=p();(h-1)*v>=s?d(h-1):(v-1)*h>=s&&p(v-1)}else for(;s>c*u;){var h=d(),v=p();(v+1)*h>=s?p(v+1):d(h+1)}var f=o.w/c,g=o.h/u;if(i.avoidOverlap)for(var y=0;y=c&&(P=0,S++)},C={},y=0;y0&&r.animate&&(s=!0,m.rtrigger("position"),r.fit&&l.fit(r.padding),m=l.collection(),s=!1)},function(){},function(e,i){var n=g(i),a=e.data.element;a.locked()||a.grabbed()||(a._private.position={x:n.x,y:n.y},m.merge(a)),b==x&&(t.one("layoutready",r.ready),t.trigger({type:"layoutready",layout:t})),b++});c.each(function(e,t){r.random||a(t)});var _;c.on("position",_=function(){s||a(this)});var E=c.filter(":grabbable");i.stopSystem=function(){h.filterNodes(function(){return!1}),r.ungrabifyWhileSimulating&&E.grabify(),r.fit&&l.fit(r.padding),c.off("drag position",_),t.one("layoutstop",r.stop),t.trigger({type:"layoutstop",layout:t}),i.stopSystem=null},o(),r.infinite||setTimeout(function(){i.stop()},r.maxSimulationTime)}),this},t.prototype.stop=function(){return null!=this.stopSystem&&this.stopSystem(),this},e("layout","springy",t)}(cytoscape),function(e){"use strict";function t(e){this.options=e}t.prototype.recalculateRenderedStyle=function(){},t.prototype.notify=function(){},e("renderer","null",t)}(cytoscape); \ No newline at end of file diff --git a/flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/index.html b/flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/index.html new file mode 100644 index 0000000..a79d759 --- /dev/null +++ b/flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/index.html @@ -0,0 +1,66 @@ + + +
+
+
+ Status:   +
+ +
+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
Nothing selected
+
+
+
+ + + + + + diff --git a/flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/menu.png b/flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/menu.png new file mode 100644 index 0000000000000000000000000000000000000000..9195b5eb80683e057a202e0748e4507f23999bea GIT binary patch literal 1795 zcmV+e2mJVnP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000JZNklvPIB5Hz9?rjR;z7BdlPt#TE+|DOXk@phY?(BBW7cA;d?KGRPLeO1CjK%iS1>qnt0#fe?J)5%3d8(qK$`LD>rA zZd~a~kmj1z856#mjW0g}AAEqVBBZ;hYz1;RX$c=2NUmysMK_@1^1jz4z z1zh*L7Knk(5t*%SQtDU3^PZLx~;kdTM&ZW2?1MJxI<39q_7EaG7O5xp(|`` zY+Qxoe}H=dJiooTxcIi$XK;8Xm$%T{8hYw2g-wB@vm6%?%nh`HLLiO@p&)R55xUu| zEs)A87cqSyg>8Vtf7&4GK#+eaIXD`!$$O-*DG26)2&6Hvvomy)_efzA;P`DHNDEF7 z{NS@ng%rlZ!A=Ad;D*II;EIjQ)31O^H^KOERoNc{DU1cqmouzq$;pj3UbRnWc^%|*;ncCprw#B;&MFNDA#Fi9 z7C8L3FwDSIz#a~aIbB--2q4>Y0NX}xH$|l!*B_ZQr6An`b+dq)0wZeT!$S!ltl}Nu zb#DdR9Sh(KlctK~h%XDMDd@953!@z2xhbiFwqyqv0rcBXgYAc+061z3qvSeJK?e%` zpLqLi;Q*)Xdr(l_x&VQZf4yNYhTz2axPBbiz_ zL5;kp?2dsHwgJuV8x>qEsGSd#-Jy}fwxn-{e|&Hj)Ha_N(x3qD;@Kb@pH)a<6X5s) z`c>folJ9i{#_=Hm!QBYYI0!+e))Fj;QNKTs!dN)a!0E6nyz9>ks^DORV9WLhZlaK0 zR(gFSg|Q$29$f{evt8jPK(Fj9;6Cjuoj#GmSWt^R7uZf6ZtW~|s}4XvS2}$mg-u~W zw5fdyy99zQD}?Q?_REmMI_L}?R?oVEV83(0C!mEKvY?et7o@NbHg~`y>T5$31Xh}y z!4)=Kkl$U<>+Z1>R^dkePJO=$zA9l`b_vKo4ry@D(+3n@o zj!_j-SO%Qna&l^)%OU?m8zk;u!!KJ1c@%J0I(r`Ds}vGWYmotWR+5bcT;DXtYrn!C z0_2+wzIao-f!`3kC7WKu=h}6J6uN;<@uAWil603R1%4TE< zc4apft^lgG-?I;;L9_o05GZkR5)70w clazz) { + Bundle bundle = FrameworkUtil.getBundle(clazz); + Enumeration entries = bundle.findEntries("img", "appliance.png", true); + if (entries.hasMoreElements()) { + return entries.nextElement(); + } else { + return null; + } + } + + private final URL defaultImage; + + public ConnectionsImageServlet() { + defaultImage = findImage(getClass()); + } + + private BundleContext context; + + @Activate + public void activate(BundleContext context) { + this.context = context; + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + if (req.getPathInfo() != null && req.getPathInfo().endsWith(".png")) { + try { + Collection> references; + String id = req.getPathInfo().substring(0, req.getPathInfo().length() - 4); + references = context.getServiceReferences(ResourceDriver.class, "(applianceid=" + id + ")"); + if (!references.isEmpty()) { + ResourceDriver resourceDriver = context.getService(references.iterator().next()); + + URL image = findImage(resourceDriver.getClass()); + if (image == null) { + image = defaultImage; + } + + writeImage(image, resp); + return; + } + } catch (InvalidSyntaxException e) { + } + } + + resp.sendError(404); + } + + private void writeImage(URL image, HttpServletResponse resp) throws IOException { + resp.setContentType("image/png"); + InputStream is = image.openStream(); + OutputStream os = resp.getOutputStream(); + + try { + byte[] buffer = new byte[16 * 1024]; + int read = 0; + while ((read = is.read(buffer)) >= 0) { + os.write(buffer, 0, read); + } + } finally { + os.close(); + is.close(); + } + } +} diff --git a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionsPage.java b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionsPage.java new file mode 100644 index 0000000..badd4b9 --- /dev/null +++ b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionsPage.java @@ -0,0 +1,15 @@ +package org.flexiblepower.runtime.ui.connectionspage; + +import java.util.Locale; + +import org.flexiblepower.ui.Widget; + +import aQute.bnd.annotation.component.Component; + +@Component(properties = { "widget.type=full", "widget.name=connectionspage" }) +public class ConnectionsPage implements Widget { + @Override + public String getTitle(Locale locale) { + return "Connections"; + } +} From 597ffdb5ad97439195d9ccbf37d8924f5e067d37 Mon Sep 17 00:00:00 2001 From: Johan van der Geest Date: Tue, 4 Nov 2014 13:56:29 +0100 Subject: [PATCH 004/105] Updated version number to 1.0.2 --- flexiblepower.ui/bnd.bnd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flexiblepower.ui/bnd.bnd b/flexiblepower.ui/bnd.bnd index cca2898..7560eb6 100644 --- a/flexiblepower.ui/bnd.bnd +++ b/flexiblepower.ui/bnd.bnd @@ -2,7 +2,7 @@ com.google.gson,\ org.apache.felix.http.servlet-api -Bundle-Version: 1.0.1.${qualifier} +Bundle-Version: 1.0.2.${qualifier} Private-Package: org.flexiblepower.runtime.ui.server,\ org.flexiblepower.runtime.ui.server.pages,\ org.flexiblepower.runtime.ui.server.widgets,\ From d5fb985f68e308787cef6f25b397ae96a5bb08c0 Mon Sep 17 00:00:00 2001 From: Johan van der Geest Date: Tue, 4 Nov 2014 14:07:06 +0100 Subject: [PATCH 005/105] Updated run requirements and bundles for flexiblepower.ui --- flexiblepower.ui/run.bndrun | 46 ++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/flexiblepower.ui/run.bndrun b/flexiblepower.ui/run.bndrun index 594597f..b89eb3d 100644 --- a/flexiblepower.ui/run.bndrun +++ b/flexiblepower.ui/run.bndrun @@ -1,6 +1,6 @@ --runfw: org.eclipse.osgi +-runfw: org.apache.felix.framework;version='[4.4.0,4.4.0]' -runee: JavaSE-1.6 --runrequires: osgi.identity;filter:='(osgi.identity=flexiblepower.appstore.client)',\ +-runrequires: \ osgi.identity;filter:='(osgi.identity=flexiblepower.runtime)',\ osgi.identity;filter:='(osgi.identity=flexiblepower.ui)',\ osgi.identity;filter:='(osgi.identity=org.apache.felix.http.whiteboard)',\ @@ -10,29 +10,29 @@ osgi.identity;filter:='(osgi.identity=org.apache.felix.webconsole.plugins.ds)',\ osgi.identity;filter:='(osgi.identity=org.apache.felix.useradmin)',\ osgi.identity;filter:='(osgi.identity=org.apache.felix.useradmin.filestore)',\ - osgi.identity;filter:='(osgi.identity=osgi-over-slf4j)' --runbundles: biz.aQute.bnd.annotation;version='[1.52.3,1.52.4)',\ - ch.qos.logback.classic;version='[1.0.7,1.0.8)',\ - ch.qos.logback.core;version='[1.0.7,1.0.8)',\ - com.google.gson;version='[1.7.0,1.7.1)',\ - com.google.gwt.servlet;version='[2.5.0,2.5.1)',\ - flexiblepower.api;version=latest,\ - flexiblepower.appstore.client;version=latest,\ - flexiblepower.appstore.common;version=latest,\ - flexiblepower.runtime;version=latest,\ + osgi.identity;filter:='(osgi.identity=slf4j.api)',\ + osgi.identity;filter:='(osgi.identity=org.apache.felix.http.jetty)' +-runbundles: \ + biz.aQute.bnd.annotation;version='[2.4.0,2.4.1)',\ + ch.qos.logback.classic;version='[1.1.2,1.1.3)',\ + ch.qos.logback.core;version='[1.1.2,1.1.3)',\ + com.google.gson;version='[2.2.4,2.2.5)',\ + flexiblepower.api;version='[2.0.0,2.0.1)',\ + flexiblepower.runtime;version='[2.0.0,2.0.1)',\ flexiblepower.ui;version=latest,\ - org.apache.commons.fileupload;version='[1.2.2,1.2.3)',\ - org.apache.commons.io;version='[2.4.0,2.4.1)',\ - org.apache.felix.configadmin;version='[1.4.0,1.4.1)',\ - org.apache.felix.http.jetty;version='[2.2.0,2.2.1)',\ - org.apache.felix.http.whiteboard;version='[2.2.0,2.2.1)',\ - org.apache.felix.metatype;version='[1.0.6,1.0.7)',\ - org.apache.felix.scr;version='[1.6.0,1.6.1)',\ + org.apache.felix.configadmin;version='[1.8.0,1.8.1)',\ + org.apache.felix.eventadmin;version='[1.3.2,1.3.3)',\ + org.apache.felix.http.api;version='[2.3.0,2.3.1)',\ + org.apache.felix.http.jetty;version='[2.3.0,2.3.1)',\ + org.apache.felix.http.servlet-api;version='[1.0.0,1.0.1)',\ + org.apache.felix.http.whiteboard;version='[2.3.0,2.3.1)',\ + org.apache.felix.metatype;version='[1.0.10,1.0.11)',\ + org.apache.felix.scr;version='[1.8.2,1.8.3)',\ org.apache.felix.useradmin;version='[1.0.3,1.0.4)',\ org.apache.felix.useradmin.filestore;version='[1.0.2,1.0.3)',\ - org.apache.felix.webconsole;version='[4.0.0,4.0.1)',\ + org.apache.felix.webconsole;version='[4.2.2,4.2.3)',\ org.apache.felix.webconsole.plugins.ds;version='[1.0.0,1.0.1)',\ - osgi-over-slf4j;version='[1.0.0,1.0.1)',\ - osgi.cmpn;version='[4.3.0,4.3.1)',\ - slf4j.api;version='[1.7.2,1.7.3)' + org.slf4j.osgi-over-slf4j;version='[1.7.7,1.7.8)',\ + osgi.cmpn;version='[4.3.1,4.3.2)',\ + slf4j.api;version='[1.7.7,1.7.8)' -resolve: auto \ No newline at end of file From 70ffcc75ad8cbd6c598b33ca912dca0fd7784145 Mon Sep 17 00:00:00 2001 From: Jan Kazemier Date: Tue, 4 Nov 2014 14:11:36 +0100 Subject: [PATCH 006/105] added warning to connectionManager.js about z-index --- .../res/widgets/ConnectionsPage/connectionManager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/connectionManager.js b/flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/connectionManager.js index da031cc..6d61a7b 100644 --- a/flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/connectionManager.js +++ b/flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/connectionManager.js @@ -93,7 +93,7 @@ cy = cytoscape({ 'line-style' : 'dotted' } } ], - + // NOTE: in felix there is a hack here which changes the z-index. It should NOT do that here (or the whole plugin is hidden) }); function refresh() { $.get("/system/console/fpai-connection-manager/getGraph.json", From beebcee512b878c39c23eea06761ad3247ffc2ff Mon Sep 17 00:00:00 2001 From: Jan Kazemier Date: Tue, 4 Nov 2014 14:12:23 +0100 Subject: [PATCH 007/105] Removed some old Javadoc --- .../org/flexiblepower/messaging/Endpoint.java | 42 ------------------- 1 file changed, 42 deletions(-) diff --git a/flexiblepower.api/src/org/flexiblepower/messaging/Endpoint.java b/flexiblepower.api/src/org/flexiblepower/messaging/Endpoint.java index 1523475..59f57cb 100644 --- a/flexiblepower.api/src/org/flexiblepower/messaging/Endpoint.java +++ b/flexiblepower.api/src/org/flexiblepower/messaging/Endpoint.java @@ -1,49 +1,7 @@ package org.flexiblepower.messaging; -import org.osgi.framework.Filter; -/** - *

- * An {@link Endpoint} is either end of a {@link Connection} that will be used for messaging. Any implementation of this - * should register itself as an {@link Endpoint} in the service registry of OSGi and add the following properties: - *

- * - *
    - * - *
  • messaging.topic (required)
    - * The name(s) of the topic(s) on which the connection should be set-up. When two endpoints with the same topic are - * registered, they will be connected. When more than two endpoints are available, every pair will get their own - * connection (e.g. 4 endpoints will result in 6 active connections). This should be either a String or a - * String[] when there are multiple topics.
  • - * - *
  • messaging.target (optional)
    - * A target {@link Filter} to look for a specific Endpoint(s) to connect with. This will limit the number of connections - * that will be made based on the topic name.
  • - * - *
  • messaging.type (optional) The class names which are valid messages that this class will send - * across the connection.
  • - * - *
- * - *

- * Also see the {@link EndpointConfig} for description of the configuration in the form of annotations. - *

- * - *

- * The service that will bind the endpoints together must make sure that messages are sent asynchronously. Typically - * this will be achieved by using a thread pool that will send each message. This will make sure that sending a message - * is virtually instantaneous. - *

- * - *

- * This interface should be implemented by users - *

- */ public interface Endpoint { - String TOPIC = "messaging.topic"; - String FILTER = "messaging.filter"; - String TYPE = "messaging.type"; - /** * Called when a new connection has been established. * From ddb296f69bd215845c3553f84b1bda6707264f35 Mon Sep 17 00:00:00 2001 From: Jan Kazemier Date: Tue, 4 Nov 2014 16:15:06 +0100 Subject: [PATCH 008/105] Updated Bundle-version in bnd files, and package-info.java (why???) --- flexiblepower.api.efi.utils/bnd.bnd | 2 +- .../api/efi/bufferhelper/package-info.java | 2 +- .../api/efi/commonhelper/package-info.java | 2 +- .../efi/unconstrainedhelper/package-info.java | 2 +- flexiblepower.api.efi/bnd.bnd | 18 ++++++++---------- .../org/flexiblepower/efi/package-info.java | 2 +- flexiblepower.api.ext/bnd.bnd | 2 +- flexiblepower.api/bnd.bnd | 2 +- flexiblepower.felix.webconsole.plugins/bnd.bnd | 2 +- flexiblepower.runtime.test/bnd.bnd | 2 +- .../flexiblepower.runtime.bnd | 2 +- .../flexiblepower.runtime.simulation.bnd | 2 +- 12 files changed, 19 insertions(+), 21 deletions(-) diff --git a/flexiblepower.api.efi.utils/bnd.bnd b/flexiblepower.api.efi.utils/bnd.bnd index 419a843..32326d0 100644 --- a/flexiblepower.api.efi.utils/bnd.bnd +++ b/flexiblepower.api.efi.utils/bnd.bnd @@ -4,7 +4,7 @@ flexiblepower.api.efi;version=latest,\ junit.osgi -Bundle-Version: 1.0.0.${qualifier} +Bundle-Version: 1.1.0.${qualifier} Export-Package: \ org.flexiblepower.api.efi.bufferhelper,\ org.flexiblepower.api.efi.unconstrainedhelper,\ diff --git a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/package-info.java b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/package-info.java index ad5fd69..7dc43b8 100644 --- a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/package-info.java +++ b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/package-info.java @@ -1,4 +1,4 @@ -@Version("1.0.0.${qualifier}") +@Version("1.1.0.${qualifier}") package org.flexiblepower.api.efi.bufferhelper; import aQute.bnd.annotation.Version; diff --git a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/commonhelper/package-info.java b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/commonhelper/package-info.java index c20f699..fb6b1fe 100644 --- a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/commonhelper/package-info.java +++ b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/commonhelper/package-info.java @@ -1,4 +1,4 @@ -@Version("1.0.0.${qualifier}") +@Version("1.1.0.${qualifier}") package org.flexiblepower.api.efi.commonhelper; import aQute.bnd.annotation.Version; diff --git a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/package-info.java b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/package-info.java index 807d7ec..6011db8 100644 --- a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/package-info.java +++ b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/package-info.java @@ -1,4 +1,4 @@ -@Version("1.0.0.${qualifier}") +@Version("1.1.0.${qualifier}") package org.flexiblepower.api.efi.unconstrainedhelper; import aQute.bnd.annotation.Version; diff --git a/flexiblepower.api.efi/bnd.bnd b/flexiblepower.api.efi/bnd.bnd index 55629d5..20b9cd7 100644 --- a/flexiblepower.api.efi/bnd.bnd +++ b/flexiblepower.api.efi/bnd.bnd @@ -4,9 +4,14 @@ junit.osgi;version='[3.8,4)',\ biz.aQute.bnd.annotation,\ flexiblepower.api;version=latest - -Bundle-Version: 1.0.0.${qualifier} - +Bundle-Version: 2.0.1.${qualifier} +Export-Package: \ + org.flexiblepower.efi.buffer,\ + org.flexiblepower.efi.unconstrained,\ + org.flexiblepower.efi.util,\ + org.flexiblepower.efi.timeshifter,\ + org.flexiblepower.efi.uncontrolled,\ + org.flexiblepower.efi Test-Cases: ${classes;CONCRETE;EXTENDS;junit.framework.TestCase} Tester-Plugin: biz.aQute.junit @@ -16,10 +21,3 @@ Tester-Plugin: biz.aQute.junit tester.trace=true, \ tester.continuous=true, \ tester.dir=testdir -Export-Package: \ - org.flexiblepower.efi.buffer,\ - org.flexiblepower.efi.unconstrained,\ - org.flexiblepower.efi.util,\ - org.flexiblepower.efi.timeshifter,\ - org.flexiblepower.efi.uncontrolled,\ - org.flexiblepower.efi \ No newline at end of file diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/package-info.java b/flexiblepower.api.efi/src/org/flexiblepower/efi/package-info.java index 4e5ebd9..1fe69b3 100644 --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/package-info.java +++ b/flexiblepower.api.efi/src/org/flexiblepower/efi/package-info.java @@ -1,4 +1,4 @@ -@Version("1.0.0.${qualifier}") +@Version("1.0.1.${qualifier}") package org.flexiblepower.efi; import aQute.bnd.annotation.Version; diff --git a/flexiblepower.api.ext/bnd.bnd b/flexiblepower.api.ext/bnd.bnd index 8f05ffd..9f0f7af 100644 --- a/flexiblepower.api.ext/bnd.bnd +++ b/flexiblepower.api.ext/bnd.bnd @@ -7,7 +7,7 @@ flexiblepower.api.efi;version=latest,\ org.mockito.mockito-all;verion='[1.9,2)' -Bundle-Version: 2.0.0.${qualifier} +Bundle-Version: 2.0.1.${qualifier} Export-Package: \ org.flexiblepower.observation.ext,\ org.flexiblepower.ral.ext,\ diff --git a/flexiblepower.api/bnd.bnd b/flexiblepower.api/bnd.bnd index 48ff256..784c17c 100644 --- a/flexiblepower.api/bnd.bnd +++ b/flexiblepower.api/bnd.bnd @@ -4,7 +4,7 @@ junit.osgi;version='[3.8,4)',\ biz.aQute.bnd.annotation -Bundle-Version: 2.0.0.${qualifier} +Bundle-Version: 2.0.1.${qualifier} Export-Package: \ javax.measure,\ javax.measure.converter,\ diff --git a/flexiblepower.felix.webconsole.plugins/bnd.bnd b/flexiblepower.felix.webconsole.plugins/bnd.bnd index bcc2910..073185b 100644 --- a/flexiblepower.felix.webconsole.plugins/bnd.bnd +++ b/flexiblepower.felix.webconsole.plugins/bnd.bnd @@ -6,6 +6,6 @@ junit.osgi;version='[3.8,4)',\ com.google.gson -Bundle-Version: 1.0.0.${qualifier} +Bundle-Version: 1.0.1.${qualifier} Private-Package: org.flexiblepower.felix.webconsole.plugins Service-Component: org.flexiblepower.felix.webconsole.plugins.* diff --git a/flexiblepower.runtime.test/bnd.bnd b/flexiblepower.runtime.test/bnd.bnd index 0b070b7..1bdfd1f 100644 --- a/flexiblepower.runtime.test/bnd.bnd +++ b/flexiblepower.runtime.test/bnd.bnd @@ -5,6 +5,6 @@ flexiblepower.api.efi;version=latest org.apache.felix.scr -Bundle-Version: 1.0.0.${qualifier} +Bundle-Version: 1.0.1.${qualifier} Private-Package: org.flexiblepower.runtime.*test Test-Cases: ${classes;CONCRETE;EXTENDS;junit.framework.TestCase},${classes;ANNOTATION;org.junit.Test} \ No newline at end of file diff --git a/flexiblepower.runtime/flexiblepower.runtime.bnd b/flexiblepower.runtime/flexiblepower.runtime.bnd index 9de67ef..6c92ebe 100644 --- a/flexiblepower.runtime/flexiblepower.runtime.bnd +++ b/flexiblepower.runtime/flexiblepower.runtime.bnd @@ -1,4 +1,4 @@ -Bundle-Version: 2.0.0.${qualifier} +Bundle-Version: 2.0.1.${qualifier} Bundle-SymbolicName: flexiblepower.runtime Private-Package: \ org.flexiblepower.runtime.messaging,\ diff --git a/flexiblepower.runtime/flexiblepower.runtime.simulation.bnd b/flexiblepower.runtime/flexiblepower.runtime.simulation.bnd index 43126c1..2b4cbf6 100644 --- a/flexiblepower.runtime/flexiblepower.runtime.simulation.bnd +++ b/flexiblepower.runtime/flexiblepower.runtime.simulation.bnd @@ -1,4 +1,4 @@ -Bundle-Version: 2.0.0.${qualifier} +Bundle-Version: 2.0.1.${qualifier} Bundle-SymbolicName: flexiblepower.runtime.simulation Private-Package: \ org.flexiblepower.runtime.messaging, \ From a90b768d12e13caf05e1e908af2f1f89051477b6 Mon Sep 17 00:00:00 2001 From: Jan Kazemier Date: Tue, 18 Nov 2014 17:12:05 +0100 Subject: [PATCH 009/105] Removed resourceinfo from bndrun --- cnf/demo.bndrun | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cnf/demo.bndrun b/cnf/demo.bndrun index fcce99c..e1e84c9 100644 --- a/cnf/demo.bndrun +++ b/cnf/demo.bndrun @@ -14,7 +14,6 @@ osgi.identity;filter:='(osgi.identity=flexiblepower.api.ext)',\ osgi.identity;filter:='(osgi.identity=flexiblepower.runtime)',\ osgi.identity;filter:='(osgi.identity=flexiblepower.ui)',\ - osgi.identity;filter:='(osgi.identity=flexiblepower.ui.resourceinfo)',\ osgi.identity;filter:='(osgi.identity=flexiblepower.runtime.test)',\ osgi.identity;filter:='(osgi.identity=flexiblepower.runtime)',\ osgi.identity;filter:='(osgi.identity=flexiblepower.runtime.simulation)',\ @@ -27,6 +26,7 @@ ch.qos.logback.core;version='[1.1.2,1.1.3)',\ com.google.gson;version='[2.2.4,2.2.5)',\ flexiblepower.api;version=latest,\ + flexiblepower.api.ext;version='[2.0.0,2.0.1)',\ flexiblepower.api.ext;version=latest,\ flexiblepower.felix.webconsole.plugins;version=latest,\ flexiblepower.runtime;version=latest,\ @@ -34,9 +34,7 @@ flexiblepower.runtime.test;version=latest,\ flexiblepower.ui;version=latest,\ flexiblepower.ui.connectionspage;version=latest,\ - flexiblepower.ui.resourceinfo;version=latest,\ junit.osgi;version='[3.8.2,3.8.3)',\ - org.apache.commons.io;version='[2.4.0,2.4.1)',\ org.apache.felix.configadmin;version='[1.8.0,1.8.1)',\ org.apache.felix.eventadmin;version='[1.3.2,1.3.3)',\ org.apache.felix.http.api;version='[2.3.0,2.3.1)',\ From b1fd0731efee7bcb9f56aa72a741a6ef10b11811 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 2 Dec 2014 13:19:37 +0100 Subject: [PATCH 010/105] Added the MessageListener API and implementation in the runtime --- flexiblepower.api/bnd.bnd | 4 +- .../org/flexiblepower/messaging/Filter.java | 12 ++ .../messaging/MessageListener.java | 7 ++ .../runtime/wiring/test/EndpointTester.java | 80 +++++++++++- .../messaging/ConnectionManagerImpl.java | 21 ++++ .../messaging/MessageListenerContainer.java | 119 ++++++++++++++++++ .../messaging/PotentialConnectionImpl.java | 17 ++- 7 files changed, 251 insertions(+), 9 deletions(-) create mode 100755 flexiblepower.api/src/org/flexiblepower/messaging/Filter.java create mode 100755 flexiblepower.api/src/org/flexiblepower/messaging/MessageListener.java create mode 100755 flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/MessageListenerContainer.java diff --git a/flexiblepower.api/bnd.bnd b/flexiblepower.api/bnd.bnd index 784c17c..429a52a 100644 --- a/flexiblepower.api/bnd.bnd +++ b/flexiblepower.api/bnd.bnd @@ -4,7 +4,7 @@ junit.osgi;version='[3.8,4)',\ biz.aQute.bnd.annotation -Bundle-Version: 2.0.1.${qualifier} +Bundle-Version: 2.1.0.${qualifier} Export-Package: \ javax.measure,\ javax.measure.converter,\ @@ -28,4 +28,4 @@ Tester-Plugin: biz.aQute.junit -runproperties: \ tester.trace=true, \ tester.continuous=true, \ - tester.dir=testdir \ No newline at end of file + tester.dir=testdir diff --git a/flexiblepower.api/src/org/flexiblepower/messaging/Filter.java b/flexiblepower.api/src/org/flexiblepower/messaging/Filter.java new file mode 100755 index 0000000..d83d5d9 --- /dev/null +++ b/flexiblepower.api/src/org/flexiblepower/messaging/Filter.java @@ -0,0 +1,12 @@ +package org.flexiblepower.messaging; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface Filter { + Class[] value() default {}; +} diff --git a/flexiblepower.api/src/org/flexiblepower/messaging/MessageListener.java b/flexiblepower.api/src/org/flexiblepower/messaging/MessageListener.java new file mode 100755 index 0000000..6e4c9b6 --- /dev/null +++ b/flexiblepower.api/src/org/flexiblepower/messaging/MessageListener.java @@ -0,0 +1,7 @@ +package org.flexiblepower.messaging; + +import org.flexiblepower.messaging.ConnectionManager.EndpointPort; + +public interface MessageListener { + void handleMessage(EndpointPort from, EndpointPort to, Object message); +} diff --git a/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java b/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java index dd5cbd0..a603bb0 100644 --- a/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java +++ b/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java @@ -16,7 +16,9 @@ import org.flexiblepower.messaging.ConnectionManager.ManagedEndpoint; import org.flexiblepower.messaging.ConnectionManager.PotentialConnection; import org.flexiblepower.messaging.Endpoint; +import org.flexiblepower.messaging.Filter; import org.flexiblepower.messaging.MessageHandler; +import org.flexiblepower.messaging.MessageListener; import org.flexiblepower.messaging.Port; import org.flexiblepower.messaging.Ports; import org.osgi.framework.BundleContext; @@ -28,7 +30,7 @@ public class EndpointTester extends TestCase { private static final int SLEEP_TIME = 500; - private final List> registrations = new ArrayList>(); + private final List> registrations = new ArrayList>(); private ServiceTracker connectionManagerTracker; private ConnectionManager connectionManager; @@ -141,9 +143,16 @@ protected ConnectionManager setupEndpoints(Endpoint... endpoints) throws Excepti return connectionManager; } + protected void setupListeners(MessageListener... listeners) throws Exception { + context = FrameworkUtil.getBundle(getClass()).getBundleContext(); + for (MessageListener listener : listeners) { + registrations.add(context.registerService(MessageListener.class, listener, null)); + } + } + @Override protected void tearDown() throws Exception { - for (ServiceRegistration reg : registrations) { + for (ServiceRegistration reg : registrations) { reg.unregister(); } registrations.clear(); @@ -616,4 +625,71 @@ public void testMissingImplementation() throws Exception { ManagedEndpoint meImplementing = endpoints.get(endpoints.firstKey()); assertNotNull(meImplementing.getPort("shouldBeImplemented")); } + + @Filter + public static final class AllMessageListener implements MessageListener { + private final int expectedCount; + private int count; + + public AllMessageListener(int expectedCount) { + this.expectedCount = expectedCount; + } + + public void check() { + assertEquals(expectedCount, count); + } + + @Override + public void handleMessage(EndpointPort from, EndpointPort to, Object message) { + count++; + } + } + + public void testMessageListeners() throws Exception { + EchoEndpoint echo = new EchoEndpoint(10); + CodecEndpoint echoCodec = new CodecEndpoint(); + CodecEndpoint dataCodec = new CodecEndpoint(); + SendDataEndpoint data = new SendDataEndpoint(); + + ConnectionManager connectionManager = setupEndpoints(echo, echoCodec, dataCodec, data); + AllMessageListener allMessageListener = new AllMessageListener(100); + setupListeners(allMessageListener); + + SortedMap endpoints = connectionManager.getEndpoints(); + Iterator iterator = endpoints.values().iterator(); + ManagedEndpoint meCodec1 = iterator.next(); + ManagedEndpoint meCodec2 = iterator.next(); + ManagedEndpoint meEcho = iterator.next(); + ManagedEndpoint meData = iterator.next(); + + EndpointPort portEcho = checkNotNull("\"any\" port of the EchoEndpoint", meEcho.getPort("any")); + EndpointPort portPrivate1 = checkNotNull("\"private\" port of the CodecEndpoint 1", meCodec1.getPort("private")); + EndpointPort portPrivate2 = checkNotNull("\"private\" port of the CodecEndpoint 2", meCodec2.getPort("private")); + EndpointPort portPublic1 = checkNotNull("\"public\" port of the CodecEndpoint 1", meCodec1.getPort("public")); + EndpointPort portPublic2 = checkNotNull("\"public\" port of the CodecEndpoint 2", meCodec2.getPort("public")); + EndpointPort portData = checkNotNull("\"something\" port of SendDataEndpoint", meData.getPort("something")); + + PotentialConnection connEcho = portEcho.getPotentialConnection(portPrivate1); + PotentialConnection connPublic = portPublic1.getPotentialConnection(portPublic2); + PotentialConnection connData = portData.getPotentialConnection(portPrivate2); + + echo.reset(); + + connPublic.connect(); + connEcho.connect(); + connData.connect(); + + synchronized (this) { + wait(SLEEP_TIME); + } + + data.checkIfFinishedAndReset(); + + connData.disconnect(); + connEcho.disconnect(); + connPublic.disconnect(); + + allMessageListener.check(); + } + } diff --git a/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/ConnectionManagerImpl.java b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/ConnectionManagerImpl.java index bc9a4c7..5d6d518 100644 --- a/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/ConnectionManagerImpl.java +++ b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/ConnectionManagerImpl.java @@ -17,6 +17,7 @@ import org.flexiblepower.messaging.Cardinality; import org.flexiblepower.messaging.ConnectionManager; import org.flexiblepower.messaging.Endpoint; +import org.flexiblepower.messaging.MessageListener; import org.osgi.framework.Constants; import org.osgi.service.cm.Configuration; import org.osgi.service.cm.ConfigurationAdmin; @@ -52,12 +53,14 @@ public static interface Config { private final Map otherProperties; private final SortedMap endpointWrappers; + private final MessageListenerContainer messageListenerContainer; private final Set activeConnections; public ConnectionManagerImpl() { endpointWrappers = new TreeMap(); otherProperties = new HashMap(); + messageListenerContainer = new MessageListenerContainer(); activeConnections = new TreeSet(); } @@ -125,6 +128,7 @@ public void modified() { @Deactivate public synchronized void deactivate() { configuration = null; + messageListenerContainer.close(); } /** @@ -259,6 +263,19 @@ private static boolean isSubset(Class[] sends, Class[] accepts) { return correct; } + @Reference(dynamic = true, + multiple = true, + optional = true, + service = MessageListener.class, + name = "messageListener") + public synchronized void addMessageListener(MessageListener messageListener) { + messageListenerContainer.addMessageListener(messageListener); + } + + public synchronized void removeMessageListener(MessageListener messageListener) { + messageListenerContainer.removeMessageListener(messageListener); + } + @Override public ManagedEndpoint getEndpoint(String pid) { EndpointWrapper wrapper = endpointWrappers.get(pid); @@ -317,4 +334,8 @@ public synchronized void autoConnect() { waitWithStoring = false; storeConnections(); } + + public MessageListenerContainer getMessageListenerContainer() { + return messageListenerContainer; + } } diff --git a/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/MessageListenerContainer.java b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/MessageListenerContainer.java new file mode 100755 index 0000000..fc4c448 --- /dev/null +++ b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/MessageListenerContainer.java @@ -0,0 +1,119 @@ +package org.flexiblepower.runtime.messaging; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.LinkedBlockingQueue; + +import org.flexiblepower.messaging.ConnectionManager.EndpointPort; +import org.flexiblepower.messaging.Filter; +import org.flexiblepower.messaging.MessageListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MessageListenerContainer implements Runnable { + private static final Logger logger = LoggerFactory.getLogger(MessageListenerContainer.class); + + private final Map>> messageListeners; + private final BlockingQueue data; + private final Thread thread; + private volatile boolean running; + + public MessageListenerContainer() { + messageListeners = new ConcurrentHashMap>>(); + data = new LinkedBlockingQueue(); + running = true; + + thread = new Thread(this, "MessageListeners Thread"); + thread.start(); + } + + public synchronized void addMessageListener(MessageListener messageListener) { + List> filter = new ArrayList>(); + Filter annotation = messageListener.getClass().getAnnotation(Filter.class); + if (annotation != null) { + for (Class clazz : annotation.value()) { + filter.add(clazz); + } + } + + messageListeners.put(messageListener, filter); + } + + public synchronized void removeMessageListener(MessageListener messageListener) { + messageListeners.remove(messageListener); + } + + public void publishMessage(EndpointPort from, EndpointPort to, Object message) { + data.add(new Data(from, to, message)); + } + + private boolean matches(List> filter, Class clazz) { + if (filter == null || filter.isEmpty()) { + // No effective filter, so it matches + return true; + } + for (Class filterClass : filter) { + if (filterClass.isAssignableFrom(clazz)) { + return true; + } + } + return false; + } + + public void close() { + try { + running = false; + thread.interrupt(); + thread.join(); + } catch (InterruptedException ex) { + // Ignore + } + } + + @Override + public void run() { + while (running) { + try { + Data data = this.data.take(); + for (Entry>> entry : messageListeners.entrySet()) { + MessageListener messageListener = entry.getKey(); + List> filter = entry.getValue(); + if (matches(filter, data.getMessage().getClass())) { + messageListener.handleMessage(data.getFrom(), data.getTo(), data.getMessage()); + } + } + } catch (InterruptedException ex) { + // Ignore + } catch (Exception ex) { + logger.warn("Error while publishing message to a listener: " + ex.getMessage(), ex); + } + } + } + + public static final class Data { + private final EndpointPort from, to; + private final Object message; + + public Data(EndpointPort from, EndpointPort to, Object message) { + this.from = from; + this.to = to; + this.message = message; + } + + public EndpointPort getFrom() { + return from; + } + + public EndpointPort getTo() { + return to; + } + + public Object getMessage() { + return message; + } + } +} diff --git a/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/PotentialConnectionImpl.java b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/PotentialConnectionImpl.java index c5c97a5..578dc44 100644 --- a/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/PotentialConnectionImpl.java +++ b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/PotentialConnectionImpl.java @@ -26,13 +26,18 @@ public void disconnected() { }; private static final class HalfConnection implements Connection { + private final MessageListenerContainer listeners; + private final EndpointPortImpl fromPort, toPort; private final Port port; private final EndpointWrapper receivingEndpoint; volatile MessageHandler messageHandler; - public HalfConnection(Port port, EndpointWrapper receivingEndpoint) { - this.port = port; - this.receivingEndpoint = receivingEndpoint; + public HalfConnection(EndpointPortImpl fromPort, EndpointPortImpl toPort) { + listeners = fromPort.getEndpoint().getConnectionManager().getMessageListenerContainer(); + this.fromPort = fromPort; + this.toPort = toPort; + port = fromPort.getPort(); + receivingEndpoint = toPort.getEndpoint(); messageHandler = null; } @@ -51,6 +56,8 @@ public void sendMessage(Object message) { return; } + listeners.publishMessage(fromPort, toPort, message); + MessageHandler messageHandler = this.messageHandler; if (messageHandler == null) { messageHandler = new MessageHandler() { @@ -137,8 +144,8 @@ public synchronized void connect() { log.debug("Connecting port [{}] to port [{}]", left, right); - HalfConnection leftHalfConnection = new HalfConnection(left.getPort(), right.getEndpoint()); - HalfConnection rightHalfConnection = new HalfConnection(right.getPort(), left.getEndpoint()); + HalfConnection leftHalfConnection = new HalfConnection(left, right); + HalfConnection rightHalfConnection = new HalfConnection(right, left); leftMessageHandler = left.getEndpoint().getEndpoint().onConnect(leftHalfConnection); rightMessageHandler = right.getEndpoint().getEndpoint().onConnect(rightHalfConnection); From ddaf7cb5df2d8da4abbb625feb2eb2f5bce5eccb Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 2 Dec 2014 13:41:55 +0100 Subject: [PATCH 011/105] Extended the test for MessageListeners --- .../flexiblepower/messaging/package-info.java | 2 +- .../runtime/wiring/test/EndpointTester.java | 29 +++++++++++++++---- flexiblepower.runtime.test/test.bndrun | 1 - 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/flexiblepower.api/src/org/flexiblepower/messaging/package-info.java b/flexiblepower.api/src/org/flexiblepower/messaging/package-info.java index 901d50d..577e625 100644 --- a/flexiblepower.api/src/org/flexiblepower/messaging/package-info.java +++ b/flexiblepower.api/src/org/flexiblepower/messaging/package-info.java @@ -1,7 +1,7 @@ /** * The wiring package provides the interfaces for 2-way messaging between components. */ -@Version("1.0.0.${qualifier}") +@Version("1.1.0.${qualifier}") package org.flexiblepower.messaging; import aQute.bnd.annotation.Version; diff --git a/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java b/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java index a603bb0..3b47575 100644 --- a/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java +++ b/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java @@ -626,12 +626,11 @@ public void testMissingImplementation() throws Exception { assertNotNull(meImplementing.getPort("shouldBeImplemented")); } - @Filter - public static final class AllMessageListener implements MessageListener { + public static class CountingMessageListener implements MessageListener { private final int expectedCount; private int count; - public AllMessageListener(int expectedCount) { + public CountingMessageListener(int expectedCount) { this.expectedCount = expectedCount; } @@ -641,10 +640,25 @@ public void check() { @Override public void handleMessage(EndpointPort from, EndpointPort to, Object message) { + System.out.println(from.toString() + " -> " + to.toString() + " : " + message.toString()); count++; } } + @Filter(EncodedStringMessage.class) + public static class EncodedMessageListener extends CountingMessageListener { + public EncodedMessageListener(int expectedCount) { + super(expectedCount); + } + } + + @Filter(DecodedStringMessage.class) + public static class DecodedMessageListener extends CountingMessageListener { + public DecodedMessageListener(int expectedCount) { + super(expectedCount); + } + } + public void testMessageListeners() throws Exception { EchoEndpoint echo = new EchoEndpoint(10); CodecEndpoint echoCodec = new CodecEndpoint(); @@ -652,8 +666,10 @@ public void testMessageListeners() throws Exception { SendDataEndpoint data = new SendDataEndpoint(); ConnectionManager connectionManager = setupEndpoints(echo, echoCodec, dataCodec, data); - AllMessageListener allMessageListener = new AllMessageListener(100); - setupListeners(allMessageListener); + CountingMessageListener allMessageListener = new CountingMessageListener(60); + EncodedMessageListener encodedMessageListener = new EncodedMessageListener(20); + DecodedMessageListener decodedMessageListener = new DecodedMessageListener(40); + setupListeners(allMessageListener, encodedMessageListener, decodedMessageListener); SortedMap endpoints = connectionManager.getEndpoints(); Iterator iterator = endpoints.values().iterator(); @@ -690,6 +706,7 @@ public void testMessageListeners() throws Exception { connPublic.disconnect(); allMessageListener.check(); + encodedMessageListener.check(); + decodedMessageListener.check(); } - } diff --git a/flexiblepower.runtime.test/test.bndrun b/flexiblepower.runtime.test/test.bndrun index 3e12da4..ac9f23b 100644 --- a/flexiblepower.runtime.test/test.bndrun +++ b/flexiblepower.runtime.test/test.bndrun @@ -14,4 +14,3 @@ -runfw: org.eclipse.osgi;version='[3.9,4)' -runtrace: true -runvm: -ea - From c9fc61f3cabeb8418589903d1acf997d118e65e3 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 2 Dec 2014 10:17:12 +0100 Subject: [PATCH 012/105] Started to move to gradle --- .gradle/2.1/taskArtifacts/cache.properties | 1 + .../2.1/taskArtifacts/cache.properties.lock | Bin 0 -> 17 bytes .gradle/2.1/taskArtifacts/fileHashes.bin | Bin 0 -> 43704 bytes .gradle/2.1/taskArtifacts/fileSnapshots.bin | Bin 0 -> 222155 bytes .../2.1/taskArtifacts/outputFileStates.bin | Bin 0 -> 19082 bytes .gradle/2.1/taskArtifacts/taskArtifacts.bin | Bin 0 -> 28743 bytes build.gradle | 32 +++++ gradle.properties | 15 +++ settings.gradle | 109 ++++++++++++++++++ 9 files changed, 157 insertions(+) create mode 100755 .gradle/2.1/taskArtifacts/cache.properties create mode 100755 .gradle/2.1/taskArtifacts/cache.properties.lock create mode 100755 .gradle/2.1/taskArtifacts/fileHashes.bin create mode 100755 .gradle/2.1/taskArtifacts/fileSnapshots.bin create mode 100755 .gradle/2.1/taskArtifacts/outputFileStates.bin create mode 100755 .gradle/2.1/taskArtifacts/taskArtifacts.bin create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 settings.gradle diff --git a/.gradle/2.1/taskArtifacts/cache.properties b/.gradle/2.1/taskArtifacts/cache.properties new file mode 100755 index 0000000..5f760e2 --- /dev/null +++ b/.gradle/2.1/taskArtifacts/cache.properties @@ -0,0 +1 @@ +#Mon Nov 10 10:04:41 CET 2014 diff --git a/.gradle/2.1/taskArtifacts/cache.properties.lock b/.gradle/2.1/taskArtifacts/cache.properties.lock new file mode 100755 index 0000000000000000000000000000000000000000..dd1d4e3b2a52633d71a3623c5509648db282a0c6 GIT binary patch literal 17 VcmZR6lYXiApU0Qe3}C>b1pr1p1 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 Nsy4{VEi1h**8w~BT&@5B literal 0 HcmV?d00001 diff --git a/.gradle/2.1/taskArtifacts/fileSnapshots.bin b/.gradle/2.1/taskArtifacts/fileSnapshots.bin new file mode 100755 index 0000000000000000000000000000000000000000..a3dd85c95a785f2505f4ec42e3585954d59051af GIT binary patch literal 222155 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 S)N&)ei{EQ_(_v+8+qU1Fs*Z~Q literal 0 HcmV?d00001 diff --git a/.gradle/2.1/taskArtifacts/taskArtifacts.bin b/.gradle/2.1/taskArtifacts/taskArtifacts.bin new file mode 100755 index 0000000000000000000000000000000000000000..aa7eca551177c634a945e7a9455e42a27eb5bd30 GIT binary patch literal 28743 zcmeI44Qw366@d3_2NDwUL)t=xic%4z(8e2^LTWW4H26o3>&6%2pb)l7=61)IwfA;6 zGjsMDwTRLtB|;6jcH%MjABjl7;W){ z5GsAi$_lk}{IyxPj`V0+%{(|fZ|9c3%^C0b+P?6b=42E}cyRMkYxKHnkLAjL7L_0F zeXD=&j(1jv<*j?8^3k!rn-|t{@h3%L^tpc2_OL^fCP{L5 z|I>q`pT75=wWk*?5zA7)KH#ymo@T^ys7`!a7le0l-LgsA^|-K2uD3(U4b=CTkb7Gi zsOd2xs5M#9k-xKDvX;tMp$LAVNIR9-b@||&*T1vi*qqlcZR~&XrHMz2){@G)mSekV zy@jv>xfMqf^}^T>A7i|v1*MZ^E#<1xY6MgTYXf6Ce-L~Xke!t(6EOx*#;v` zU8+<(^PJvE*ehicp32&e)nPl7D-?C3k33*A{^&_H^NR#hs*^=viSq`WnVaZ>!Bk@aLS z8{3xQF~7ENW-k=p8@m3C7nymk@yvdpB*q30-H-c1H8q1$?pS!(e(DA6V-3;did~$@`TS^8OFd*a1OUnhGhA2s>pvw&)F2sI1jj?wM3A ztdW)0Ir}1U1@L0czVbbr-4H{5ZzL-I^u#1BdrwJC`A2Rb?5eW>_(`#9Xh6-ZATXX( z|H0aA^C_V;aeaFiX-@hvz*voxspF zDd#uPP#<0}*yo)nX*{NE*N_i?U}PxaS(p$^&+Vp6P-ghV>;g?}x5N8GnJbBjK2~PY zS=SbE)yvIidzQEYhC)<_zD;DDzf4CXEYGY~6Qq&xGPGCs-Sq2at|!+IsttcCv+Sv$ z1CNpj(4(%_q*SS-+rTtn0qxA95g1 z*AOgu0>d$kuO?I88$Y?PCN~|aIV}zKTv&~mYsjtgzT@MqLzi~-9^Rb3ZRyS{#&LYZ zG6XI?;L^hxi+qu@IzyKpmeoAj<}Tgz?9R`wG(TT+vK0q14rE+IEVf!d!w2%J^;>tJ z-g(&**9`BU@1w^Z1_sa~qecF>S!B61cG2*HwaVk(3*Po_xg{PSex_#P_dkAM>4xza zPG0@bPZbaL$#p9k>uZPaf;F+q($>%Ot68#!YDRh1fgmA-1qkakWZ7@Zv|1LIf22$@ znF_3Or6-rK?hAM4iu72(2SPdpL0a2|=!Q$2TzEw)Ceb#~4g!sDhr@i(HWq9dFo|o~ z76fnWWi+lyhA!nOgpk_B`DkRT?RHVCnec5JsQ8^Twt3GRU$_i@X)cJOj4EcCJAa^I z$DX~cm5dMy?V?tB z#R?fRTCqVeXvC_(7uxNmM1P^@)gq|@&3s@Ef{gRqq?t|IzDBpo6QvAw`&IQE27pd)1(%Iv=Wsk!Hs&z-4Jl>3YnH6yD+9lFc?kI zoibdvDdU7ELx-mE1I^Vf8$$_Uf=%8o-q{0De3%X)^pcyQKkQt(ssvhU65JQHmbx-6 zzzS7eM>3PfBTPO~W}%%?3TEStA13?voc!L+$}IRQeWgNZRWi^lwAm51;LgHq1EJ}l zEF=qnW0YB<%#$G_X-22jRjb$OHCwK_MjCb%@7Lkp`y zQ%1DOe3O{X)lf8H + rootProject.ext.bndPlugin = bndPlugin + } +} + +/* Initialize the bnd workspace */ +def workspace = Workspace.getWorkspace(rootDir, bnd_cnf) +if (workspace == null) { + throw new GradleException("Unable to load workspace ${rootDir}/${bnd_cnf}") +} + +/* Add cnf project to the graph */ +include bnd_cnf + +/* Start with the declared build project name */ +def defaultProjectName = bnd_build + +/* If in a subproject, use the subproject name */ +for (def currentDir = startParameter.currentDir; currentDir != rootDir; currentDir = currentDir.parentFile) { + defaultProjectName = currentDir.name +} + +/* Build a set of project names we need to include from the specified tasks */ +def projectNames = startParameter.taskNames.collect { taskName -> + def elements = taskName.split(':') + switch (elements.length) { + case 1: + return defaultProjectName + case 2: + return elements[0].empty ? bnd_build : elements[0] + default: + return elements[0].empty ? elements[1] : elements[0] + } +}.toSet() + +/* Include the default project name if in a subproject or no tasks specified */ +if ((startParameter.currentDir != rootDir) || projectNames.empty) { + projectNames += defaultProjectName +} + +/* If bnd_build used but declared empty, add all non-private folders of rootDir */ +if (projectNames.remove('')) { + rootDir.eachDir { + def projectName = it.name + if (!projectName.startsWith('.')) { + projectNames += projectName + } + } +} + +/* Add each project and its dependencies to the graph */ +projectNames.each { projectName -> + include projectName + def project = getBndProject(workspace, projectName) + project?.dependson.each { + include it.name + } +} + +/* Get the bnd project for the specified project name */ +def getBndProject(Workspace workspace, String projectName) { + def project = workspace.getProject(projectName) + if (project == null) { + return null + } + project.prepare() + if (project.isValid()) { + return project + } + + project.getInfo(workspace, "${rootDir} :") + def errorCount = 0 + project.warnings.each { + println "Warning: ${it}" + } + project.errors.each { + println "Error : ${it}" + errorCount++ + } + if (!project.isOk()) { + def str = 'even though no errors were reported' + if (errorCount == 1) { + str = 'one error was reported' + } else if (errorCount > 1) { + str = "${errorCount} errors were reported" + } + throw new GradleException("Project ${rootDir}/${projectName} is invalid, ${str}") + } + throw new GradleException("Project ${rootDir}/${projectName} is not a valid bnd project") +} + From 65b01464d60ce3e4f83e7d6560685a460ac764f7 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Thu, 11 Dec 2014 18:32:44 +0100 Subject: [PATCH 013/105] An attempt to make the UserAdmin really optional in the UI --- .../src/org/flexiblepower/ui/User.java | 11 +++ flexiblepower.ui/bnd.bnd | 3 + .../runtime/ui/server/PageServlet.java | 2 +- .../server/pages/DashboardWidgetServlet.java | 2 +- .../ui/server/widgets/WidgetRegistration.java | 2 +- .../runtime/ui/user/LoginServlet.java | 93 ++++++++++++------- .../runtime/ui/user/LogoutServlet.java | 22 +++-- .../runtime/ui/user/Session.java | 2 +- .../runtime/ui/user/SessionManager.java | 9 +- .../runtime/ui/user/UserImpl.java | 33 +++++++ .../ui/user/UserSessionHttpContext.java | 49 ++++++---- 11 files changed, 155 insertions(+), 73 deletions(-) create mode 100755 flexiblepower.api/src/org/flexiblepower/ui/User.java mode change 100644 => 100755 flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/LoginServlet.java create mode 100755 flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/UserImpl.java diff --git a/flexiblepower.api/src/org/flexiblepower/ui/User.java b/flexiblepower.api/src/org/flexiblepower/ui/User.java new file mode 100755 index 0000000..ba06576 --- /dev/null +++ b/flexiblepower.api/src/org/flexiblepower/ui/User.java @@ -0,0 +1,11 @@ +package org.flexiblepower.ui; + +import java.util.Dictionary; + +public interface User { + String getName(); + + Dictionary getProperties(); + + boolean hasCredential(String key, Object value); +} diff --git a/flexiblepower.ui/bnd.bnd b/flexiblepower.ui/bnd.bnd index 7560eb6..7e803e0 100644 --- a/flexiblepower.ui/bnd.bnd +++ b/flexiblepower.ui/bnd.bnd @@ -9,3 +9,6 @@ Private-Package: org.flexiblepower.runtime.ui.server,\ org.flexiblepower.runtime.ui.user Service-Component: * +Import-Package: \ + org.osgi.service.useradmin;resolution:=optional,\ + * \ No newline at end of file diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/PageServlet.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/PageServlet.java index 0c120a0..7b91801 100644 --- a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/PageServlet.java +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/PageServlet.java @@ -10,7 +10,7 @@ import javax.servlet.http.HttpServletResponse; import org.flexiblepower.runtime.ui.server.widgets.WidgetRegistration; -import org.osgi.service.useradmin.User; +import org.flexiblepower.ui.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/pages/DashboardWidgetServlet.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/pages/DashboardWidgetServlet.java index 72f7a46..a4dbfe5 100644 --- a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/pages/DashboardWidgetServlet.java +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/pages/DashboardWidgetServlet.java @@ -11,7 +11,7 @@ import org.flexiblepower.runtime.ui.server.HttpUtils; import org.flexiblepower.runtime.ui.server.widgets.WidgetRegistration; -import org.osgi.service.useradmin.User; +import org.flexiblepower.ui.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/widgets/WidgetRegistration.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/widgets/WidgetRegistration.java index 6288e8a..2270ae5 100644 --- a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/widgets/WidgetRegistration.java +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/widgets/WidgetRegistration.java @@ -6,8 +6,8 @@ import java.util.Locale; import java.util.concurrent.atomic.AtomicInteger; +import org.flexiblepower.ui.User; import org.flexiblepower.ui.Widget; -import org.osgi.service.useradmin.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/LoginServlet.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/LoginServlet.java old mode 100644 new mode 100755 index 8ac99db..014b3ab --- a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/LoginServlet.java +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/LoginServlet.java @@ -5,6 +5,7 @@ import java.io.Reader; import java.net.URL; import java.nio.charset.Charset; +import java.util.Hashtable; import javax.servlet.Servlet; import javax.servlet.ServletException; @@ -14,30 +15,33 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.flexiblepower.ui.User; import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; import org.osgi.service.useradmin.Group; import org.osgi.service.useradmin.Role; -import org.osgi.service.useradmin.User; import org.osgi.service.useradmin.UserAdmin; +import org.osgi.util.tracker.ServiceTracker; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import aQute.bnd.annotation.component.Activate; -import aQute.bnd.annotation.component.Component; -import aQute.bnd.annotation.component.Reference; - -@Component(provide = Servlet.class, properties = { "alias=/login.html" }) public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 6873319359921321938L; private static final int SECONDS_PER_YEAR = 60 * 60 * 24 * 365; private static final Logger logger = LoggerFactory.getLogger(LoginServlet.class); - private String document; + private final String document; + private final ServiceTracker userAdminTracker; + + private final ServiceRegistration registerService; + + private final SessionManager sessionManager; - @Activate - public void activate(BundleContext bundleContext) throws IOException { - URL url = bundleContext.getBundle().getEntry("login.html"); + public LoginServlet(BundleContext context, SessionManager sessionManager) throws IOException, NoClassDefFoundError { + this.sessionManager = sessionManager; + + URL url = context.getBundle().getEntry("login.html"); Reader reader = new InputStreamReader(url.openStream()); StringBuilder sb = new StringBuilder(); @@ -49,32 +53,47 @@ public void activate(BundleContext bundleContext) throws IOException { document = sb.toString(); reader.close(); + + userAdminTracker = new ServiceTracker(context, UserAdmin.class, null); + userAdminTracker.open(); + fillUsers(); + + Hashtable properties = new Hashtable(); + properties.put("alias", "/login.html"); + properties.put("contextId", "fps"); + registerService = context.registerService(Servlet.class, this, properties); } - private UserAdmin userAdmin; + public void close() { + registerService.unregister(); + userAdminTracker.close(); + } @SuppressWarnings("unchecked") - @Reference - public void setUserAdmin(final UserAdmin userAdmin) { - this.userAdmin = userAdmin; - + private void fillUsers() { new Thread("Creating users") { @Override public void run() { + UserAdmin userAdmin = null; + try { + userAdmin = userAdminTracker.waitForService(0); + } catch (InterruptedException ex) { + return; + } while (userAdmin.getRole("root") == null || userAdmin.getRole("user") == null) { logger.info("Adding default groups and roles"); Group administrators = (Group) userAdmin.getRole("Administrators"); if (administrators == null) { administrators = (Group) userAdmin.createRole("Administrators", Role.GROUP); - User root = (User) userAdmin.getRole("root"); + org.osgi.service.useradmin.User root = (org.osgi.service.useradmin.User) userAdmin.getRole("root"); if (root == null) { - root = (User) userAdmin.createRole("root", Role.USER); + root = (org.osgi.service.useradmin.User) userAdmin.createRole("root", Role.USER); if (root == null) { logger.error("Could not create user root!"); } else { root.getCredentials() - .put("password", "$2a$10$FhfxMQS1BPDEqcdUT8Qo0O4Gg6Xb0gI8udk/EYVJ8urNqSZKcnfra"); + .put("password", "$2a$10$FhfxMQS1BPDEqcdUT8Qo0O4Gg6Xb0gI8udk/EYVJ8urNqSZKcnfra"); administrators.addMember(root); } } @@ -84,14 +103,14 @@ public void run() { if (users == null) { users = (Group) userAdmin.createRole("Users", Role.GROUP); - User user = (User) userAdmin.getRole("user"); + org.osgi.service.useradmin.User user = (org.osgi.service.useradmin.User) userAdmin.getRole("user"); if (user == null) { - user = (User) userAdmin.createRole("user", Role.USER); + user = (org.osgi.service.useradmin.User) userAdmin.createRole("user", Role.USER); if (user == null) { logger.error("Could not create user user!"); } else { user.getCredentials() - .put("password", "$2a$10$FhfxMQS1BPDEqcdUT8Qo0OG8/AsfgzG9eGA/WIbuH3Rb33E.XOGe."); + .put("password", "$2a$10$FhfxMQS1BPDEqcdUT8Qo0OG8/AsfgzG9eGA/WIbuH3Rb33E.XOGe."); users.addMember(user); users.addMember(userAdmin.getRole("root")); } @@ -144,7 +163,7 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S if (username == null) { logger.info("Not logged in yet, serving login form"); - } else if (userAdmin == null) { + } else if (userAdminTracker == null) { logger.warn("The userAdmin is unavailable to the LoginServlet"); error = "Could not connect to user management service, please try again..."; } else { @@ -152,7 +171,7 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S if (user != null) { logger.info("Authenticated " + username + ", creating session"); - Session session = SessionManager.getInstance().createSession(user); + Session session = sessionManager.createSession(user); Cookie cookie = new Cookie(SessionManager.SESSION_ID, session.getId()); cookie.setMaxAge(SECONDS_PER_YEAR); @@ -172,24 +191,30 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S createResponse(resp, error, redirect); } - private User authenticateUser(String username, String password) { + private UserImpl authenticateUser(String username, String password) { logger.info("Authenticating with username: " + username); final String salt = "$2a$10$FhfxMQS1BPDEqcdUT8Qo0O"; String hash = BCrypt.hashpw(password, salt); - if (userAdmin != null) { - User user = (User) userAdmin.getRole(username); + UserAdmin userAdmin = null; + try { + userAdmin = userAdminTracker.waitForService(1000); + } catch (InterruptedException e) { + } + if (userAdmin == null) { + logger.warn("No UserAdmin active yet!"); + return null; + } - if (user == null || !(user.hasCredential("password", hash) || user.hasCredential("password", password))) { - logger.warn("No valid user with username " + username); - return null; - } else { - return user; - } - } else { - logger.warn("The userAdmin is unavailable to the LoginServlet when authenticating"); + org.osgi.service.useradmin.User user = (org.osgi.service.useradmin.User) userAdmin.getRole(username); + + if (user == null || !(user.hasCredential("password", hash) || user.hasCredential("password", password))) { + logger.warn("No valid user with username " + username); return null; + } else { + final org.osgi.service.useradmin.User userRef = user; + return new UserImpl(userRef); } } } diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/LogoutServlet.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/LogoutServlet.java index f2e2145..27a40c0 100644 --- a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/LogoutServlet.java +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/LogoutServlet.java @@ -2,6 +2,8 @@ import java.io.IOException; import java.io.PrintWriter; +import java.util.Dictionary; +import java.util.Hashtable; import javax.servlet.Servlet; import javax.servlet.http.Cookie; @@ -10,26 +12,28 @@ import javax.servlet.http.HttpServletResponse; import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import aQute.bnd.annotation.component.Activate; -import aQute.bnd.annotation.component.Component; - -@Component(provide = Servlet.class, properties = { "alias=/logout.html,contextId=fps" }) public class LogoutServlet extends HttpServlet { - private static final long serialVersionUID = 5622570409132973468L; private static final Logger logger = LoggerFactory.getLogger(LogoutServlet.class); private final SessionManager sessionManager; + private final ServiceRegistration serviceRegistration; + + public LogoutServlet(BundleContext context, SessionManager sessionManager) { + this.sessionManager = sessionManager; - public LogoutServlet() { - sessionManager = SessionManager.getInstance(); + Dictionary properties = new Hashtable(); + properties.put("alias", "/logout.html"); + properties.put("contextId", "fps"); + serviceRegistration = context.registerService(Servlet.class, this, properties); } - @Activate - public void activate(BundleContext context) { + public void close() { + serviceRegistration.unregister(); } @Override diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/Session.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/Session.java index ab3dfd9..edd3286 100644 --- a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/Session.java +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/Session.java @@ -2,7 +2,7 @@ import java.util.HashMap; -import org.osgi.service.useradmin.User; +import org.flexiblepower.ui.User; public class Session extends HashMap { private static final long serialVersionUID = -1885458683578572091L; diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/SessionManager.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/SessionManager.java index f4f5bc9..8d7414b 100644 --- a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/SessionManager.java +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/SessionManager.java @@ -7,22 +7,17 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; -import org.osgi.service.useradmin.User; +import org.flexiblepower.ui.User; public class SessionManager { public static final String SESSION_ID = "org.flexiblepower.session"; - private static final SessionManager instance = new SessionManager(); private final Map sessions; - private SessionManager() { + public SessionManager() { sessions = new HashMap(); } - public static SessionManager getInstance() { - return instance; - } - public Session createSession(User user) { String id = UUID.randomUUID().toString(); Session session = new Session(id, user); diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/UserImpl.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/UserImpl.java new file mode 100755 index 0000000..efe5564 --- /dev/null +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/UserImpl.java @@ -0,0 +1,33 @@ +package org.flexiblepower.runtime.ui.user; + +import java.util.Dictionary; + +import org.flexiblepower.ui.User; + +final class UserImpl implements User { + private final org.osgi.service.useradmin.User user; + + UserImpl(org.osgi.service.useradmin.User userRef) { + user = userRef; + } + + @Override + public boolean hasCredential(String key, Object value) { + return user.hasCredential(key, value); + } + + @SuppressWarnings("unchecked") + @Override + public Dictionary getProperties() { + return user.getProperties(); + } + + @Override + public String getName() { + return user.getName(); + } + + public org.osgi.service.useradmin.User getUser() { + return user; + } +} diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/UserSessionHttpContext.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/UserSessionHttpContext.java index 636454c..24b06df 100644 --- a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/UserSessionHttpContext.java +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/UserSessionHttpContext.java @@ -13,21 +13,20 @@ import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.service.http.HttpContext; -import org.osgi.service.useradmin.UserAdmin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import aQute.bnd.annotation.component.Activate; import aQute.bnd.annotation.component.Component; import aQute.bnd.annotation.component.ConfigurationPolicy; -import aQute.bnd.annotation.component.Reference; +import aQute.bnd.annotation.component.Deactivate; import aQute.bnd.annotation.metatype.Meta; @Component(provide = HttpContext.class, -properties = "contextId=fps", -designate = UserSessionHttpContext.Config.class, -configurationPolicy = ConfigurationPolicy.optional, -immediate = true) + properties = "contextId=fps", + designate = UserSessionHttpContext.Config.class, + configurationPolicy = ConfigurationPolicy.optional, + immediate = true) public class UserSessionHttpContext implements HttpContext { private final static Logger logger = LoggerFactory.getLogger(UserSessionHttpContext.class); @@ -40,26 +39,18 @@ public interface Config { private final SessionManager sessionManager; public UserSessionHttpContext() { - sessionManager = SessionManager.getInstance(); + sessionManager = new SessionManager(); } private Bundle bundle; private boolean disabled; - private UserAdmin userAdmin; - - @Reference(dynamic = true, optional = true) - public void setUserAdmin(UserAdmin userAdmin) { - this.userAdmin = userAdmin; - } - - public void unsetUserAdmin(UserAdmin userAdmin) { - this.userAdmin = null; - } + private LoginServlet loginServlet; + private LogoutServlet logoutServlet; @Activate - public void activate(BundleContext context, Map parameters) { + public void activate(BundleContext context, Map parameters) throws IOException { bundle = context.getBundle(); disabled = false; @@ -68,14 +59,34 @@ public void activate(BundleContext context, Map parameters) { disabled = Boolean.parseBoolean(isDisabled.toString()); } + if (!disabled) { + try { + loginServlet = new LoginServlet(context, sessionManager); + logoutServlet = new LogoutServlet(context, sessionManager); + } catch (NoClassDefFoundError error) { + // No UserAdmin package available... + disabled = true; + } + } + logger.debug("Started user context. Disabled = {}", disabled); } + @Deactivate + public void deactivate() { + if (loginServlet != null) { + loginServlet.close(); + } + if (logoutServlet != null) { + logoutServlet.close(); + } + } + @Override public boolean handleSecurity(HttpServletRequest request, HttpServletResponse response) throws IOException { logger.trace("Entering handleSecurity, request.pathInfo = {}", request.getPathInfo()); - if (disabled || userAdmin == null) { + if (disabled) { return true; } From 16f26d5fb6aece0384bad85bbf23aa18b61dfa7a Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Thu, 11 Dec 2014 18:35:35 +0100 Subject: [PATCH 014/105] Updated the package version of org.flexiblepower.ui --- flexiblepower.api/src/org/flexiblepower/ui/package-info.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flexiblepower.api/src/org/flexiblepower/ui/package-info.java b/flexiblepower.api/src/org/flexiblepower/ui/package-info.java index 39b525a..d89f69e 100644 --- a/flexiblepower.api/src/org/flexiblepower/ui/package-info.java +++ b/flexiblepower.api/src/org/flexiblepower/ui/package-info.java @@ -1,7 +1,7 @@ /** * The UI package provides the {@link org.flexiblepower.ui.Widget} interface. */ -@Version("1.0.0.${qualifier}") +@Version("1.1.0.${qualifier}") package org.flexiblepower.ui; import aQute.bnd.annotation.Version; From 5e82e4a7fca6670e2c2970c0cddf349d1d491d27 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Thu, 11 Dec 2014 18:32:44 +0100 Subject: [PATCH 015/105] An attempt to make the UserAdmin really optional in the UI --- .../src/org/flexiblepower/ui/User.java | 11 +++ flexiblepower.ui/bnd.bnd | 3 + .../runtime/ui/server/PageServlet.java | 2 +- .../server/pages/DashboardWidgetServlet.java | 2 +- .../ui/server/widgets/WidgetRegistration.java | 2 +- .../runtime/ui/user/LoginServlet.java | 93 ++++++++++++------- .../runtime/ui/user/LogoutServlet.java | 22 +++-- .../runtime/ui/user/Session.java | 2 +- .../runtime/ui/user/SessionManager.java | 9 +- .../runtime/ui/user/UserImpl.java | 33 +++++++ .../ui/user/UserSessionHttpContext.java | 49 ++++++---- 11 files changed, 155 insertions(+), 73 deletions(-) create mode 100755 flexiblepower.api/src/org/flexiblepower/ui/User.java mode change 100644 => 100755 flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/LoginServlet.java create mode 100755 flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/UserImpl.java diff --git a/flexiblepower.api/src/org/flexiblepower/ui/User.java b/flexiblepower.api/src/org/flexiblepower/ui/User.java new file mode 100755 index 0000000..ba06576 --- /dev/null +++ b/flexiblepower.api/src/org/flexiblepower/ui/User.java @@ -0,0 +1,11 @@ +package org.flexiblepower.ui; + +import java.util.Dictionary; + +public interface User { + String getName(); + + Dictionary getProperties(); + + boolean hasCredential(String key, Object value); +} diff --git a/flexiblepower.ui/bnd.bnd b/flexiblepower.ui/bnd.bnd index 7560eb6..7e803e0 100644 --- a/flexiblepower.ui/bnd.bnd +++ b/flexiblepower.ui/bnd.bnd @@ -9,3 +9,6 @@ Private-Package: org.flexiblepower.runtime.ui.server,\ org.flexiblepower.runtime.ui.user Service-Component: * +Import-Package: \ + org.osgi.service.useradmin;resolution:=optional,\ + * \ No newline at end of file diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/PageServlet.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/PageServlet.java index 0c120a0..7b91801 100644 --- a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/PageServlet.java +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/PageServlet.java @@ -10,7 +10,7 @@ import javax.servlet.http.HttpServletResponse; import org.flexiblepower.runtime.ui.server.widgets.WidgetRegistration; -import org.osgi.service.useradmin.User; +import org.flexiblepower.ui.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/pages/DashboardWidgetServlet.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/pages/DashboardWidgetServlet.java index 72f7a46..a4dbfe5 100644 --- a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/pages/DashboardWidgetServlet.java +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/pages/DashboardWidgetServlet.java @@ -11,7 +11,7 @@ import org.flexiblepower.runtime.ui.server.HttpUtils; import org.flexiblepower.runtime.ui.server.widgets.WidgetRegistration; -import org.osgi.service.useradmin.User; +import org.flexiblepower.ui.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/widgets/WidgetRegistration.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/widgets/WidgetRegistration.java index 6288e8a..2270ae5 100644 --- a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/widgets/WidgetRegistration.java +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/widgets/WidgetRegistration.java @@ -6,8 +6,8 @@ import java.util.Locale; import java.util.concurrent.atomic.AtomicInteger; +import org.flexiblepower.ui.User; import org.flexiblepower.ui.Widget; -import org.osgi.service.useradmin.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/LoginServlet.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/LoginServlet.java old mode 100644 new mode 100755 index 8ac99db..014b3ab --- a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/LoginServlet.java +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/LoginServlet.java @@ -5,6 +5,7 @@ import java.io.Reader; import java.net.URL; import java.nio.charset.Charset; +import java.util.Hashtable; import javax.servlet.Servlet; import javax.servlet.ServletException; @@ -14,30 +15,33 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.flexiblepower.ui.User; import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; import org.osgi.service.useradmin.Group; import org.osgi.service.useradmin.Role; -import org.osgi.service.useradmin.User; import org.osgi.service.useradmin.UserAdmin; +import org.osgi.util.tracker.ServiceTracker; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import aQute.bnd.annotation.component.Activate; -import aQute.bnd.annotation.component.Component; -import aQute.bnd.annotation.component.Reference; - -@Component(provide = Servlet.class, properties = { "alias=/login.html" }) public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 6873319359921321938L; private static final int SECONDS_PER_YEAR = 60 * 60 * 24 * 365; private static final Logger logger = LoggerFactory.getLogger(LoginServlet.class); - private String document; + private final String document; + private final ServiceTracker userAdminTracker; + + private final ServiceRegistration registerService; + + private final SessionManager sessionManager; - @Activate - public void activate(BundleContext bundleContext) throws IOException { - URL url = bundleContext.getBundle().getEntry("login.html"); + public LoginServlet(BundleContext context, SessionManager sessionManager) throws IOException, NoClassDefFoundError { + this.sessionManager = sessionManager; + + URL url = context.getBundle().getEntry("login.html"); Reader reader = new InputStreamReader(url.openStream()); StringBuilder sb = new StringBuilder(); @@ -49,32 +53,47 @@ public void activate(BundleContext bundleContext) throws IOException { document = sb.toString(); reader.close(); + + userAdminTracker = new ServiceTracker(context, UserAdmin.class, null); + userAdminTracker.open(); + fillUsers(); + + Hashtable properties = new Hashtable(); + properties.put("alias", "/login.html"); + properties.put("contextId", "fps"); + registerService = context.registerService(Servlet.class, this, properties); } - private UserAdmin userAdmin; + public void close() { + registerService.unregister(); + userAdminTracker.close(); + } @SuppressWarnings("unchecked") - @Reference - public void setUserAdmin(final UserAdmin userAdmin) { - this.userAdmin = userAdmin; - + private void fillUsers() { new Thread("Creating users") { @Override public void run() { + UserAdmin userAdmin = null; + try { + userAdmin = userAdminTracker.waitForService(0); + } catch (InterruptedException ex) { + return; + } while (userAdmin.getRole("root") == null || userAdmin.getRole("user") == null) { logger.info("Adding default groups and roles"); Group administrators = (Group) userAdmin.getRole("Administrators"); if (administrators == null) { administrators = (Group) userAdmin.createRole("Administrators", Role.GROUP); - User root = (User) userAdmin.getRole("root"); + org.osgi.service.useradmin.User root = (org.osgi.service.useradmin.User) userAdmin.getRole("root"); if (root == null) { - root = (User) userAdmin.createRole("root", Role.USER); + root = (org.osgi.service.useradmin.User) userAdmin.createRole("root", Role.USER); if (root == null) { logger.error("Could not create user root!"); } else { root.getCredentials() - .put("password", "$2a$10$FhfxMQS1BPDEqcdUT8Qo0O4Gg6Xb0gI8udk/EYVJ8urNqSZKcnfra"); + .put("password", "$2a$10$FhfxMQS1BPDEqcdUT8Qo0O4Gg6Xb0gI8udk/EYVJ8urNqSZKcnfra"); administrators.addMember(root); } } @@ -84,14 +103,14 @@ public void run() { if (users == null) { users = (Group) userAdmin.createRole("Users", Role.GROUP); - User user = (User) userAdmin.getRole("user"); + org.osgi.service.useradmin.User user = (org.osgi.service.useradmin.User) userAdmin.getRole("user"); if (user == null) { - user = (User) userAdmin.createRole("user", Role.USER); + user = (org.osgi.service.useradmin.User) userAdmin.createRole("user", Role.USER); if (user == null) { logger.error("Could not create user user!"); } else { user.getCredentials() - .put("password", "$2a$10$FhfxMQS1BPDEqcdUT8Qo0OG8/AsfgzG9eGA/WIbuH3Rb33E.XOGe."); + .put("password", "$2a$10$FhfxMQS1BPDEqcdUT8Qo0OG8/AsfgzG9eGA/WIbuH3Rb33E.XOGe."); users.addMember(user); users.addMember(userAdmin.getRole("root")); } @@ -144,7 +163,7 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S if (username == null) { logger.info("Not logged in yet, serving login form"); - } else if (userAdmin == null) { + } else if (userAdminTracker == null) { logger.warn("The userAdmin is unavailable to the LoginServlet"); error = "Could not connect to user management service, please try again..."; } else { @@ -152,7 +171,7 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S if (user != null) { logger.info("Authenticated " + username + ", creating session"); - Session session = SessionManager.getInstance().createSession(user); + Session session = sessionManager.createSession(user); Cookie cookie = new Cookie(SessionManager.SESSION_ID, session.getId()); cookie.setMaxAge(SECONDS_PER_YEAR); @@ -172,24 +191,30 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S createResponse(resp, error, redirect); } - private User authenticateUser(String username, String password) { + private UserImpl authenticateUser(String username, String password) { logger.info("Authenticating with username: " + username); final String salt = "$2a$10$FhfxMQS1BPDEqcdUT8Qo0O"; String hash = BCrypt.hashpw(password, salt); - if (userAdmin != null) { - User user = (User) userAdmin.getRole(username); + UserAdmin userAdmin = null; + try { + userAdmin = userAdminTracker.waitForService(1000); + } catch (InterruptedException e) { + } + if (userAdmin == null) { + logger.warn("No UserAdmin active yet!"); + return null; + } - if (user == null || !(user.hasCredential("password", hash) || user.hasCredential("password", password))) { - logger.warn("No valid user with username " + username); - return null; - } else { - return user; - } - } else { - logger.warn("The userAdmin is unavailable to the LoginServlet when authenticating"); + org.osgi.service.useradmin.User user = (org.osgi.service.useradmin.User) userAdmin.getRole(username); + + if (user == null || !(user.hasCredential("password", hash) || user.hasCredential("password", password))) { + logger.warn("No valid user with username " + username); return null; + } else { + final org.osgi.service.useradmin.User userRef = user; + return new UserImpl(userRef); } } } diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/LogoutServlet.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/LogoutServlet.java index f2e2145..27a40c0 100644 --- a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/LogoutServlet.java +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/LogoutServlet.java @@ -2,6 +2,8 @@ import java.io.IOException; import java.io.PrintWriter; +import java.util.Dictionary; +import java.util.Hashtable; import javax.servlet.Servlet; import javax.servlet.http.Cookie; @@ -10,26 +12,28 @@ import javax.servlet.http.HttpServletResponse; import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import aQute.bnd.annotation.component.Activate; -import aQute.bnd.annotation.component.Component; - -@Component(provide = Servlet.class, properties = { "alias=/logout.html,contextId=fps" }) public class LogoutServlet extends HttpServlet { - private static final long serialVersionUID = 5622570409132973468L; private static final Logger logger = LoggerFactory.getLogger(LogoutServlet.class); private final SessionManager sessionManager; + private final ServiceRegistration serviceRegistration; + + public LogoutServlet(BundleContext context, SessionManager sessionManager) { + this.sessionManager = sessionManager; - public LogoutServlet() { - sessionManager = SessionManager.getInstance(); + Dictionary properties = new Hashtable(); + properties.put("alias", "/logout.html"); + properties.put("contextId", "fps"); + serviceRegistration = context.registerService(Servlet.class, this, properties); } - @Activate - public void activate(BundleContext context) { + public void close() { + serviceRegistration.unregister(); } @Override diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/Session.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/Session.java index ab3dfd9..edd3286 100644 --- a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/Session.java +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/Session.java @@ -2,7 +2,7 @@ import java.util.HashMap; -import org.osgi.service.useradmin.User; +import org.flexiblepower.ui.User; public class Session extends HashMap { private static final long serialVersionUID = -1885458683578572091L; diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/SessionManager.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/SessionManager.java index f4f5bc9..8d7414b 100644 --- a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/SessionManager.java +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/SessionManager.java @@ -7,22 +7,17 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; -import org.osgi.service.useradmin.User; +import org.flexiblepower.ui.User; public class SessionManager { public static final String SESSION_ID = "org.flexiblepower.session"; - private static final SessionManager instance = new SessionManager(); private final Map sessions; - private SessionManager() { + public SessionManager() { sessions = new HashMap(); } - public static SessionManager getInstance() { - return instance; - } - public Session createSession(User user) { String id = UUID.randomUUID().toString(); Session session = new Session(id, user); diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/UserImpl.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/UserImpl.java new file mode 100755 index 0000000..efe5564 --- /dev/null +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/UserImpl.java @@ -0,0 +1,33 @@ +package org.flexiblepower.runtime.ui.user; + +import java.util.Dictionary; + +import org.flexiblepower.ui.User; + +final class UserImpl implements User { + private final org.osgi.service.useradmin.User user; + + UserImpl(org.osgi.service.useradmin.User userRef) { + user = userRef; + } + + @Override + public boolean hasCredential(String key, Object value) { + return user.hasCredential(key, value); + } + + @SuppressWarnings("unchecked") + @Override + public Dictionary getProperties() { + return user.getProperties(); + } + + @Override + public String getName() { + return user.getName(); + } + + public org.osgi.service.useradmin.User getUser() { + return user; + } +} diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/UserSessionHttpContext.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/UserSessionHttpContext.java index 636454c..24b06df 100644 --- a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/UserSessionHttpContext.java +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/UserSessionHttpContext.java @@ -13,21 +13,20 @@ import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.service.http.HttpContext; -import org.osgi.service.useradmin.UserAdmin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import aQute.bnd.annotation.component.Activate; import aQute.bnd.annotation.component.Component; import aQute.bnd.annotation.component.ConfigurationPolicy; -import aQute.bnd.annotation.component.Reference; +import aQute.bnd.annotation.component.Deactivate; import aQute.bnd.annotation.metatype.Meta; @Component(provide = HttpContext.class, -properties = "contextId=fps", -designate = UserSessionHttpContext.Config.class, -configurationPolicy = ConfigurationPolicy.optional, -immediate = true) + properties = "contextId=fps", + designate = UserSessionHttpContext.Config.class, + configurationPolicy = ConfigurationPolicy.optional, + immediate = true) public class UserSessionHttpContext implements HttpContext { private final static Logger logger = LoggerFactory.getLogger(UserSessionHttpContext.class); @@ -40,26 +39,18 @@ public interface Config { private final SessionManager sessionManager; public UserSessionHttpContext() { - sessionManager = SessionManager.getInstance(); + sessionManager = new SessionManager(); } private Bundle bundle; private boolean disabled; - private UserAdmin userAdmin; - - @Reference(dynamic = true, optional = true) - public void setUserAdmin(UserAdmin userAdmin) { - this.userAdmin = userAdmin; - } - - public void unsetUserAdmin(UserAdmin userAdmin) { - this.userAdmin = null; - } + private LoginServlet loginServlet; + private LogoutServlet logoutServlet; @Activate - public void activate(BundleContext context, Map parameters) { + public void activate(BundleContext context, Map parameters) throws IOException { bundle = context.getBundle(); disabled = false; @@ -68,14 +59,34 @@ public void activate(BundleContext context, Map parameters) { disabled = Boolean.parseBoolean(isDisabled.toString()); } + if (!disabled) { + try { + loginServlet = new LoginServlet(context, sessionManager); + logoutServlet = new LogoutServlet(context, sessionManager); + } catch (NoClassDefFoundError error) { + // No UserAdmin package available... + disabled = true; + } + } + logger.debug("Started user context. Disabled = {}", disabled); } + @Deactivate + public void deactivate() { + if (loginServlet != null) { + loginServlet.close(); + } + if (logoutServlet != null) { + logoutServlet.close(); + } + } + @Override public boolean handleSecurity(HttpServletRequest request, HttpServletResponse response) throws IOException { logger.trace("Entering handleSecurity, request.pathInfo = {}", request.getPathInfo()); - if (disabled || userAdmin == null) { + if (disabled) { return true; } From ad161c8771964f5ee5f985360678e256ba08223d Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Thu, 11 Dec 2014 18:35:35 +0100 Subject: [PATCH 016/105] Updated the package version of org.flexiblepower.ui --- flexiblepower.api/src/org/flexiblepower/ui/package-info.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flexiblepower.api/src/org/flexiblepower/ui/package-info.java b/flexiblepower.api/src/org/flexiblepower/ui/package-info.java index 39b525a..d89f69e 100644 --- a/flexiblepower.api/src/org/flexiblepower/ui/package-info.java +++ b/flexiblepower.api/src/org/flexiblepower/ui/package-info.java @@ -1,7 +1,7 @@ /** * The UI package provides the {@link org.flexiblepower.ui.Widget} interface. */ -@Version("1.0.0.${qualifier}") +@Version("1.1.0.${qualifier}") package org.flexiblepower.ui; import aQute.bnd.annotation.Version; From ba3d623f4a1ab4365e079c8bef6f33db89a63092 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Fri, 12 Dec 2014 20:20:57 +0100 Subject: [PATCH 017/105] Move to shared gradle config --- .gitignore | 2 + .gitmodules | 6 +- build.gradle | 33 +------ cnf.shared | 1 - cnf/.classpath | 0 cnf/.project | 0 cnf/build-master.xml | 18 ---- cnf/build.bnd | 2 +- cnf/build.xml | 4 - cnf/deployment/etc/all.policy | 3 - cnf/deployment/etc/logback.xml | 26 ------ cnf/deployment/org.apache.felix.main.jar | Bin 538830 -> 0 bytes cnf/deployment/run.bat | 11 --- cnf/deployment/run.sh | 9 -- cnf/ext/defaults.bnd | 29 ------ cnf/ext/repositories.bnd | 30 +++++-- cnf/ext/test.bnd | 4 + cnf/gradle | 1 + gradle.properties | 10 +-- settings.gradle | 110 +---------------------- 20 files changed, 36 insertions(+), 263 deletions(-) delete mode 160000 cnf.shared mode change 100644 => 100755 cnf/.classpath mode change 100644 => 100755 cnf/.project delete mode 100644 cnf/build-master.xml mode change 100644 => 100755 cnf/build.bnd delete mode 100644 cnf/build.xml delete mode 100644 cnf/deployment/etc/all.policy delete mode 100644 cnf/deployment/etc/logback.xml delete mode 100644 cnf/deployment/org.apache.felix.main.jar delete mode 100644 cnf/deployment/run.bat delete mode 100644 cnf/deployment/run.sh delete mode 100644 cnf/ext/defaults.bnd mode change 100644 => 100755 cnf/ext/repositories.bnd create mode 100755 cnf/ext/test.bnd create mode 160000 cnf/gradle diff --git a/.gitignore b/.gitignore index 3a66c16..d0ab384 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ cnf/db cnf/cache cnf/release +/.gradle/ bin bin_test generated @@ -11,6 +12,7 @@ cobertura.ser instrumented coverage.xml RemoteSystemsTempFiles +reports # Keep the projects list .metadata/* diff --git a/.gitmodules b/.gitmodules index d9c437a..7ffa73a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "cnf.shared"] - path = cnf.shared - url = https://github.com/flexiblepower/fpai-shared-config.git +[submodule "cnf/gradle"] + path = cnf/gradle + url = git@github.com:flexiblepower/fpai-shared-config.git diff --git a/build.gradle b/build.gradle index 284342b..89781e8 100644 --- a/build.gradle +++ b/build.gradle @@ -1,32 +1 @@ -/* - * Master Gradle build script - * - * Depends on bndPlugin property set by settings.gradle. - * and bnd_* values from gradle.properties. - */ - -import aQute.bnd.build.Workspace - -/* Add bnd gradle plugin as a script dependency */ -buildscript { - dependencies { - classpath bndPlugin - } -} - -/* Initialize the bnd workspace */ -ext.bndWorkspace = Workspace.getWorkspace(rootDir, bnd_cnf) -if (bndWorkspace == null) { - throw new GradleException("Unable to load workspace ${rootDir}/${bnd_cnf}") -} - -ext.cnf = rootProject.project(bnd_cnf) - -/* Configure the subprojects */ -subprojects { - def bndProject = bndWorkspace.getProject(name) - if (bndProject != null) { - plugins.apply 'biz.aQute.bnd' - } -} - +apply from: rootProject.file("${bnd_cnf_shared}/master.gradle") diff --git a/cnf.shared b/cnf.shared deleted file mode 160000 index 766b113..0000000 --- a/cnf.shared +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 766b113f3091700aafd32a33d2475e1b8959c67d diff --git a/cnf/.classpath b/cnf/.classpath old mode 100644 new mode 100755 diff --git a/cnf/.project b/cnf/.project old mode 100644 new mode 100755 diff --git a/cnf/build-master.xml b/cnf/build-master.xml deleted file mode 100644 index 61593a0..0000000 --- a/cnf/build-master.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/cnf/build.bnd b/cnf/build.bnd old mode 100644 new mode 100755 index 7b04d1a..f3a1221 --- a/cnf/build.bnd +++ b/cnf/build.bnd @@ -1,4 +1,4 @@ --include: cnf.shared/build.bnd +include: cnf/gradle/base.bnd Bundle-Category: FlexiblePower Application Infrastructure qualifier: SNAPSHOT-${tstamp} diff --git a/cnf/build.xml b/cnf/build.xml deleted file mode 100644 index faa5f86..0000000 --- a/cnf/build.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/cnf/deployment/etc/all.policy b/cnf/deployment/etc/all.policy deleted file mode 100644 index c26e27b..0000000 --- a/cnf/deployment/etc/all.policy +++ /dev/null @@ -1,3 +0,0 @@ -grant { - permission java.security.AllPermission; -}; \ No newline at end of file diff --git a/cnf/deployment/etc/logback.xml b/cnf/deployment/etc/logback.xml deleted file mode 100644 index 6ec8a98..0000000 --- a/cnf/deployment/etc/logback.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - WARN - - - %d{HH:mm:ss.SSS} %-5level %-36.36logger{36} - %msg%n - - - - log/fpai.log - - log/fpai.%d{yyyy-MM-dd}.log - 30 - - - %d{HH:mm:ss.SSS} %-5level %-36.36logger{36} - %msg%n - - - - - - - - - diff --git a/cnf/deployment/org.apache.felix.main.jar b/cnf/deployment/org.apache.felix.main.jar deleted file mode 100644 index 59a26a63b5efa6adf17bb0ff6bf770e7383e90a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 538830 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ⅈKhP1$Jtu^3-`E!| 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 UD*(MM5nmGO4hB-b4F2o?01&Vgf&c&j diff --git a/cnf/deployment/run.bat b/cnf/deployment/run.bat deleted file mode 100644 index b253f45..0000000 --- a/cnf/deployment/run.bat +++ /dev/null @@ -1,11 +0,0 @@ -@echo off -title Starting the PowerMatcher Suite -echo Starting the PowerMatcher Suite -echo Running from %CD% - -start "PowerMatcher Suite" java ^ - -Djava.security.policy=etc/all.policy ^ - -Dfelix.config.properties=file:etc/config.properties ^ - -Dfelix.cm.dir="%CD%\config" ^ - -Dlogback.configurationFile=etc/logback.xml ^ - -jar org.apache.felix.main.jar diff --git a/cnf/deployment/run.sh b/cnf/deployment/run.sh deleted file mode 100644 index 7cd1bf3..0000000 --- a/cnf/deployment/run.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -echo Running from `pwd` - -java \ - -Djava.security.policy=etc/all.policy \ - -Dfelix.config.properties=file:etc/config.properties \ - -Dfelix.cm.dir="`pwd`/config" \ - -Dlogback.configurationFile=etc/logback.xml \ - -jar org.apache.felix.main.jar diff --git a/cnf/ext/defaults.bnd b/cnf/ext/defaults.bnd deleted file mode 100644 index 4593c14..0000000 --- a/cnf/ext/defaults.bnd +++ /dev/null @@ -1,29 +0,0 @@ -# General Options -project.dependson = ${p-dependson;:} -project.bootclasspath = ${p-bootclasspath;:} -project.buildpath = ${p-buildpath;:} -project.sourcepath = ${p-sourcepath;:} -project.allsourcepath = ${p-allsourcepath;:} -project.output = ${p-output} -project.testpath = ${p-testpath;:} - --verbose: true -project: ${basedir} -src: src -bin: bin -target-dir: generated -target: ${project}/${target-dir} -build: ${workspace}/cnf -p: ${basename;${project}} -project.name: ${p} - -# Java Compiler Options -java: java -javac: javac -javac.source: 1.5 -javac.target: 1.5 -javac.debug: on - -# Bnd Options --sources: true --sourcepath: ${project}/src diff --git a/cnf/ext/repositories.bnd b/cnf/ext/repositories.bnd old mode 100644 new mode 100755 index 110f6d8..dae0c9e --- a/cnf/ext/repositories.bnd +++ b/cnf/ext/repositories.bnd @@ -1,13 +1,25 @@ -plugindir: ${workspace}/cnf.shared/bnd - --pluginpath: \ - ${plugindir}/biz.aQute.repository-2.2.0.jar,\ - ${plugindir}/biz.aQute.bndlib-2.4.1.jar +-pluginpath: ${workspace}/cnf/gradle/bnd/biz.aQute.repository.jar -plugin:\ - aQute.bnd.deployer.repository.LocalIndexedRepo; name=Release; local=${workspace}/cnf/release;pretty=true,\ - aQute.bnd.deployer.repository.FixedIndexedRepo; name=FPAI Bundle Hub; locations=https://raw.githubusercontent.com/flexiblepower/bundle-hub/master/index.xml.gz; cache=${workspace}/cnf/cache,\ - aQute.bnd.deployer.repository.FixedIndexedRepo; name=fpai-core-prev; locations=https://github.com/flexiblepower/fpai-core/releases/download/v14.10/index.xml; cache=${workspace}/cnf/cache - #aQute.bnd.deployer.repository.LocalIndexedRepo; name=Local Bundle Hub; local=${workspace}/../bundle-hub; pretty=false,\ + aQute.bnd.deployer.repository.LocalIndexedRepo;\ + name=Release;\ + local=${workspace}/cnf/release;\ + pretty=true,\ + aQute.bnd.deployer.repository.FixedIndexedRepo;\ + name=FPAI Bundle Hub - Build;\ + locations=https://raw.githubusercontent.com/flexiblepower/bundle-hub/split-repos/build/index.xml;\ + cache=${workspace}/cnf/cache,\ + aQute.bnd.deployer.repository.FixedIndexedRepo;\ + name=FPAI Bundle Hub - Run;\ + locations=https://raw.githubusercontent.com/flexiblepower/bundle-hub/split-repos/run/index.xml;\ + cache=${workspace}/cnf/cache,\ + aQute.bnd.deployer.repository.FixedIndexedRepo;\ + name=FPAI Bundle Hub - Test;\ + locations=https://raw.githubusercontent.com/flexiblepower/bundle-hub/split-repos/test/index.xml;\ + cache=${workspace}/cnf/cache,\ + aQute.bnd.deployer.repository.FixedIndexedRepo;\ + name=FPAI Core Release 14.10;\ + locations=https://github.com/flexiblepower/fpai-core/releases/download/v14.10/index.xml;\ + cache=${workspace}/cnf/cache -releaserepo: Release diff --git a/cnf/ext/test.bnd b/cnf/ext/test.bnd new file mode 100755 index 0000000..d6c75a5 --- /dev/null +++ b/cnf/ext/test.bnd @@ -0,0 +1,4 @@ +test:\ + junit.osgi;version=latest,\ + org.hamcrest.core;version=latest,\ + org.mockito.mockito-all;version=latest diff --git a/cnf/gradle b/cnf/gradle new file mode 160000 index 0000000..cf8e7f7 --- /dev/null +++ b/cnf/gradle @@ -0,0 +1 @@ +Subproject commit cf8e7f7778bdf949d8c7440dbc8962548c855d27 diff --git a/gradle.properties b/gradle.properties index dc13aa3..71cb711 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,15 +1,9 @@ # cnf project name bnd_cnf=cnf -# bnd_plugin is the dependency declaration for the bnd gradle plugin -bnd_plugin=biz.aQute.bnd:biz.aQute.bnd.gradle:2.4.0 - -# bnd_build can be set to the name of a "master" project whose dependencies will seed the set of projects to build. -bnd_build= +# shared gradle and bnd directory (where shared-config is checked out) +bnd_cnf_shared=cnf/gradle # Default gradle task to build bnd_defaultTask=build -# This should be false. It only needs to be true in rare cases. -bnd_preCompileRefresh=false - diff --git a/settings.gradle b/settings.gradle index fcb9a2b..dc0840a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,109 +1 @@ -/* - * Master Gradle initialization script - * - * Depends on bnd_* values from gradle.properties. - */ - -import aQute.bnd.build.Workspace - -/* Add bnd gradle plugin as a script dependency */ -buildscript { - repositories { - jcenter() - } - dependencies { - classpath bnd_plugin - } - /* Pass bnd gradle plugin classpath to rootProject once created */ - def bndPlugin = files(configurations.classpath.files) - gradle.rootProject { rootProject -> - rootProject.ext.bndPlugin = bndPlugin - } -} - -/* Initialize the bnd workspace */ -def workspace = Workspace.getWorkspace(rootDir, bnd_cnf) -if (workspace == null) { - throw new GradleException("Unable to load workspace ${rootDir}/${bnd_cnf}") -} - -/* Add cnf project to the graph */ -include bnd_cnf - -/* Start with the declared build project name */ -def defaultProjectName = bnd_build - -/* If in a subproject, use the subproject name */ -for (def currentDir = startParameter.currentDir; currentDir != rootDir; currentDir = currentDir.parentFile) { - defaultProjectName = currentDir.name -} - -/* Build a set of project names we need to include from the specified tasks */ -def projectNames = startParameter.taskNames.collect { taskName -> - def elements = taskName.split(':') - switch (elements.length) { - case 1: - return defaultProjectName - case 2: - return elements[0].empty ? bnd_build : elements[0] - default: - return elements[0].empty ? elements[1] : elements[0] - } -}.toSet() - -/* Include the default project name if in a subproject or no tasks specified */ -if ((startParameter.currentDir != rootDir) || projectNames.empty) { - projectNames += defaultProjectName -} - -/* If bnd_build used but declared empty, add all non-private folders of rootDir */ -if (projectNames.remove('')) { - rootDir.eachDir { - def projectName = it.name - if (!projectName.startsWith('.')) { - projectNames += projectName - } - } -} - -/* Add each project and its dependencies to the graph */ -projectNames.each { projectName -> - include projectName - def project = getBndProject(workspace, projectName) - project?.dependson.each { - include it.name - } -} - -/* Get the bnd project for the specified project name */ -def getBndProject(Workspace workspace, String projectName) { - def project = workspace.getProject(projectName) - if (project == null) { - return null - } - project.prepare() - if (project.isValid()) { - return project - } - - project.getInfo(workspace, "${rootDir} :") - def errorCount = 0 - project.warnings.each { - println "Warning: ${it}" - } - project.errors.each { - println "Error : ${it}" - errorCount++ - } - if (!project.isOk()) { - def str = 'even though no errors were reported' - if (errorCount == 1) { - str = 'one error was reported' - } else if (errorCount > 1) { - str = "${errorCount} errors were reported" - } - throw new GradleException("Project ${rootDir}/${projectName} is invalid, ${str}") - } - throw new GradleException("Project ${rootDir}/${projectName} is not a valid bnd project") -} - +apply from: file("${bnd_cnf_shared}/init.gradle") From 0a0e02eb5eb054e0d191aa39e33034e5f00c16d5 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Mon, 15 Dec 2014 10:14:47 +0100 Subject: [PATCH 018/105] Ignoring the gradle folder --- .gitignore | 2 +- .gradle/2.1/taskArtifacts/cache.properties | 1 - .../2.1/taskArtifacts/cache.properties.lock | Bin 17 -> 0 bytes .gradle/2.1/taskArtifacts/fileHashes.bin | Bin 43704 -> 0 bytes .gradle/2.1/taskArtifacts/fileSnapshots.bin | Bin 222155 -> 0 bytes .gradle/2.1/taskArtifacts/outputFileStates.bin | Bin 19082 -> 0 bytes .gradle/2.1/taskArtifacts/taskArtifacts.bin | Bin 28743 -> 0 bytes 7 files changed, 1 insertion(+), 2 deletions(-) delete mode 100755 .gradle/2.1/taskArtifacts/cache.properties delete mode 100755 .gradle/2.1/taskArtifacts/cache.properties.lock delete mode 100755 .gradle/2.1/taskArtifacts/fileHashes.bin delete mode 100755 .gradle/2.1/taskArtifacts/fileSnapshots.bin delete mode 100755 .gradle/2.1/taskArtifacts/outputFileStates.bin delete mode 100755 .gradle/2.1/taskArtifacts/taskArtifacts.bin diff --git a/.gitignore b/.gitignore index d0ab384..782a543 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ cnf/db cnf/cache cnf/release -/.gradle/ +.gradle bin bin_test generated diff --git a/.gradle/2.1/taskArtifacts/cache.properties b/.gradle/2.1/taskArtifacts/cache.properties deleted file mode 100755 index 5f760e2..0000000 --- a/.gradle/2.1/taskArtifacts/cache.properties +++ /dev/null @@ -1 +0,0 @@ -#Mon Nov 10 10:04:41 CET 2014 diff --git a/.gradle/2.1/taskArtifacts/cache.properties.lock b/.gradle/2.1/taskArtifacts/cache.properties.lock deleted file mode 100755 index dd1d4e3b2a52633d71a3623c5509648db282a0c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZR6lYXiApU0Qe3}C>b1pr1p1 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 Nsy4{VEi1h**8w~BT&@5B diff --git a/.gradle/2.1/taskArtifacts/fileSnapshots.bin b/.gradle/2.1/taskArtifacts/fileSnapshots.bin deleted file mode 100755 index a3dd85c95a785f2505f4ec42e3585954d59051af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222155 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 S)N&)ei{EQ_(_v+8+qU1Fs*Z~Q diff --git a/.gradle/2.1/taskArtifacts/taskArtifacts.bin b/.gradle/2.1/taskArtifacts/taskArtifacts.bin deleted file mode 100755 index aa7eca551177c634a945e7a9455e42a27eb5bd30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28743 zcmeI44Qw366@d3_2NDwUL)t=xic%4z(8e2^LTWW4H26o3>&6%2pb)l7=61)IwfA;6 zGjsMDwTRLtB|;6jcH%MjABjl7;W){ z5GsAi$_lk}{IyxPj`V0+%{(|fZ|9c3%^C0b+P?6b=42E}cyRMkYxKHnkLAjL7L_0F zeXD=&j(1jv<*j?8^3k!rn-|t{@h3%L^tpc2_OL^fCP{L5 z|I>q`pT75=wWk*?5zA7)KH#ymo@T^ys7`!a7le0l-LgsA^|-K2uD3(U4b=CTkb7Gi zsOd2xs5M#9k-xKDvX;tMp$LAVNIR9-b@||&*T1vi*qqlcZR~&XrHMz2){@G)mSekV zy@jv>xfMqf^}^T>A7i|v1*MZ^E#<1xY6MgTYXf6Ce-L~Xke!t(6EOx*#;v` zU8+<(^PJvE*ehicp32&e)nPl7D-?C3k33*A{^&_H^NR#hs*^=viSq`WnVaZ>!Bk@aLS z8{3xQF~7ENW-k=p8@m3C7nymk@yvdpB*q30-H-c1H8q1$?pS!(e(DA6V-3;did~$@`TS^8OFd*a1OUnhGhA2s>pvw&)F2sI1jj?wM3A ztdW)0Ir}1U1@L0czVbbr-4H{5ZzL-I^u#1BdrwJC`A2Rb?5eW>_(`#9Xh6-ZATXX( z|H0aA^C_V;aeaFiX-@hvz*voxspF zDd#uPP#<0}*yo)nX*{NE*N_i?U}PxaS(p$^&+Vp6P-ghV>;g?}x5N8GnJbBjK2~PY zS=SbE)yvIidzQEYhC)<_zD;DDzf4CXEYGY~6Qq&xGPGCs-Sq2at|!+IsttcCv+Sv$ z1CNpj(4(%_q*SS-+rTtn0qxA95g1 z*AOgu0>d$kuO?I88$Y?PCN~|aIV}zKTv&~mYsjtgzT@MqLzi~-9^Rb3ZRyS{#&LYZ zG6XI?;L^hxi+qu@IzyKpmeoAj<}Tgz?9R`wG(TT+vK0q14rE+IEVf!d!w2%J^;>tJ z-g(&**9`BU@1w^Z1_sa~qecF>S!B61cG2*HwaVk(3*Po_xg{PSex_#P_dkAM>4xza zPG0@bPZbaL$#p9k>uZPaf;F+q($>%Ot68#!YDRh1fgmA-1qkakWZ7@Zv|1LIf22$@ znF_3Or6-rK?hAM4iu72(2SPdpL0a2|=!Q$2TzEw)Ceb#~4g!sDhr@i(HWq9dFo|o~ z76fnWWi+lyhA!nOgpk_B`DkRT?RHVCnec5JsQ8^Twt3GRU$_i@X)cJOj4EcCJAa^I z$DX~cm5dMy?V?tB z#R?fRTCqVeXvC_(7uxNmM1P^@)gq|@&3s@Ef{gRqq?t|IzDBpo6QvAw`&IQE27pd)1(%Iv=Wsk!Hs&z-4Jl>3YnH6yD+9lFc?kI zoibdvDdU7ELx-mE1I^Vf8$$_Uf=%8o-q{0De3%X)^pcyQKkQt(ssvhU65JQHmbx-6 zzzS7eM>3PfBTPO~W}%%?3TEStA13?voc!L+$}IRQeWgNZRWi^lwAm51;LgHq1EJ}l zEF=qnW0YB<%#$G_X-22jRjb$OHCwK_MjCb%@7Lkp`y zQ%1DOe3O{X)lf8H Date: Mon, 15 Dec 2014 11:16:48 +0100 Subject: [PATCH 019/105] Fixed baseline repo name --- cnf/build.bnd | 4 ++-- cnf/ext/repositories.bnd | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cnf/build.bnd b/cnf/build.bnd index f3a1221..e757962 100755 --- a/cnf/build.bnd +++ b/cnf/build.bnd @@ -1,7 +1,7 @@ -include: cnf/gradle/base.bnd +-include: cnf/gradle/base.bnd Bundle-Category: FlexiblePower Application Infrastructure qualifier: SNAPSHOT-${tstamp} -baseline: * --baselinerepo: fpai-core-prev +-baselinerepo: FPAI Core Current Release diff --git a/cnf/ext/repositories.bnd b/cnf/ext/repositories.bnd index dae0c9e..2af04fd 100755 --- a/cnf/ext/repositories.bnd +++ b/cnf/ext/repositories.bnd @@ -18,7 +18,7 @@ locations=https://raw.githubusercontent.com/flexiblepower/bundle-hub/split-repos/test/index.xml;\ cache=${workspace}/cnf/cache,\ aQute.bnd.deployer.repository.FixedIndexedRepo;\ - name=FPAI Core Release 14.10;\ + name=FPAI Core Current Release;\ locations=https://github.com/flexiblepower/fpai-core/releases/download/v14.10/index.xml;\ cache=${workspace}/cnf/cache From 4dcba235b236de3c87f3c2af2f728fddcc657ebd Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Mon, 15 Dec 2014 11:45:15 +0100 Subject: [PATCH 020/105] Fixed the gradle build --- cnf/gradle | 2 +- flexiblepower.api.efi.utils/bnd.bnd | 8 -------- flexiblepower.api.efi/bnd.bnd | 8 -------- flexiblepower.api/bnd.bnd | 12 +----------- flexiblepower.runtime.test/bnd.bnd | 21 ++++++++++++++++++++- flexiblepower.runtime.test/test.bndrun | 16 ---------------- flexiblepower.ui.connectionspage/bnd.bnd | 4 ++-- gradle.properties | 3 +++ 8 files changed, 27 insertions(+), 47 deletions(-) delete mode 100644 flexiblepower.runtime.test/test.bndrun diff --git a/cnf/gradle b/cnf/gradle index cf8e7f7..3c9636d 160000 --- a/cnf/gradle +++ b/cnf/gradle @@ -1 +1 @@ -Subproject commit cf8e7f7778bdf949d8c7440dbc8962548c855d27 +Subproject commit 3c9636db161c1382a63106b591ce09f9bdc72501 diff --git a/flexiblepower.api.efi.utils/bnd.bnd b/flexiblepower.api.efi.utils/bnd.bnd index 32326d0..753c07a 100644 --- a/flexiblepower.api.efi.utils/bnd.bnd +++ b/flexiblepower.api.efi.utils/bnd.bnd @@ -10,11 +10,3 @@ Export-Package: \ org.flexiblepower.api.efi.unconstrainedhelper,\ org.flexiblepower.api.efi.commonhelper -Test-Cases: ${classes;CONCRETE;EXTENDS;junit.framework.TestCase} -Tester-Plugin: biz.aQute.junit --runtrace: true --runbundles: biz.aQute.junit --runproperties: \ - tester.trace=true, \ - tester.continuous=true, \ - tester.dir=testdir diff --git a/flexiblepower.api.efi/bnd.bnd b/flexiblepower.api.efi/bnd.bnd index 20b9cd7..fb52bda 100644 --- a/flexiblepower.api.efi/bnd.bnd +++ b/flexiblepower.api.efi/bnd.bnd @@ -13,11 +13,3 @@ Export-Package: \ org.flexiblepower.efi.uncontrolled,\ org.flexiblepower.efi -Test-Cases: ${classes;CONCRETE;EXTENDS;junit.framework.TestCase} -Tester-Plugin: biz.aQute.junit --runtrace: true --runbundles: biz.aQute.junit --runproperties: \ - tester.trace=true, \ - tester.continuous=true, \ - tester.dir=testdir diff --git a/flexiblepower.api/bnd.bnd b/flexiblepower.api/bnd.bnd index 429a52a..25429ad 100644 --- a/flexiblepower.api/bnd.bnd +++ b/flexiblepower.api/bnd.bnd @@ -1,8 +1,8 @@ -buildpath: \ osgi.cmpn;version='[4.3,5)',\ osgi.core;version='[4.3,5)',\ - junit.osgi;version='[3.8,4)',\ biz.aQute.bnd.annotation +-testpath: ${test} Bundle-Version: 2.1.0.${qualifier} Export-Package: \ @@ -19,13 +19,3 @@ Export-Package: \ org.flexiblepower.ral,\ org.flexiblepower.time,\ org.flexiblepower.ui -# org.flexiblepower.provisioning <-- disabled for current release, will be introduced later - -Test-Cases: ${classes;CONCRETE;EXTENDS;junit.framework.TestCase} -Tester-Plugin: biz.aQute.junit --runtrace: true --runbundles: biz.aQute.junit --runproperties: \ - tester.trace=true, \ - tester.continuous=true, \ - tester.dir=testdir diff --git a/flexiblepower.runtime.test/bnd.bnd b/flexiblepower.runtime.test/bnd.bnd index 1bdfd1f..9399c28 100644 --- a/flexiblepower.runtime.test/bnd.bnd +++ b/flexiblepower.runtime.test/bnd.bnd @@ -7,4 +7,23 @@ Bundle-Version: 1.0.1.${qualifier} Private-Package: org.flexiblepower.runtime.*test -Test-Cases: ${classes;CONCRETE;EXTENDS;junit.framework.TestCase},${classes;ANNOTATION;org.junit.Test} \ No newline at end of file + +Test-Cases: ${classes;CONCRETE;EXTENDS;junit.framework.TestCase},${classes;ANNOTATION;org.junit.Test} + +-runbundles: \ + flexiblepower.api;version=latest,\ + flexiblepower.api.efi;version=latest,\ + flexiblepower.api.ext;version=latest,\ + flexiblepower.runtime;version=latest,\ + flexiblepower.runtime.test;version=latest,\ + ch.qos.logback.classic;version=latest,\ + ch.qos.logback.core;version=latest,\ + org.apache.felix.configadmin;version=latest,\ + org.apache.felix.scr;version=latest,\ + biz.aQute.bnd.annotation;version=latest,\ + slf4j.api;version=latest +-runee: JavaSE-1.6 +-runfw: org.apache.felix.framework +-runtrace: true +-runvm: -ea + diff --git a/flexiblepower.runtime.test/test.bndrun b/flexiblepower.runtime.test/test.bndrun deleted file mode 100644 index ac9f23b..0000000 --- a/flexiblepower.runtime.test/test.bndrun +++ /dev/null @@ -1,16 +0,0 @@ --runbundles: \ - flexiblepower.api;version=latest,\ - flexiblepower.api.efi;version=latest,\ - flexiblepower.api.ext;version=latest,\ - flexiblepower.runtime;version=latest,\ - flexiblepower.runtime.test;version=latest,\ - ch.qos.logback.classic;version=latest,\ - ch.qos.logback.core;version=latest,\ - org.apache.felix.configadmin;version=latest,\ - org.apache.felix.scr;version=latest,\ - biz.aQute.bnd.annotation;version=latest,\ - slf4j.api;version=latest --runee: JavaSE-1.6 --runfw: org.eclipse.osgi;version='[3.9,4)' --runtrace: true --runvm: -ea diff --git a/flexiblepower.ui.connectionspage/bnd.bnd b/flexiblepower.ui.connectionspage/bnd.bnd index 8727819..17a4c74 100644 --- a/flexiblepower.ui.connectionspage/bnd.bnd +++ b/flexiblepower.ui.connectionspage/bnd.bnd @@ -2,8 +2,8 @@ org.apache.felix.http.servlet-api,\ flexiblepower.runtime;version=latest -Bundle-Version: 1.1.0.${qualifier} +Bundle-Version: 1.0.0.${qualifier} Private-Package: org.flexiblepower.runtime.ui.connectionspage Service-Component: org.flexiblepower.runtime.ui.connectionspage.* Import-Package: \ - * \ No newline at end of file + * diff --git a/gradle.properties b/gradle.properties index 71cb711..510d157 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,6 +4,9 @@ bnd_cnf=cnf # shared gradle and bnd directory (where shared-config is checked out) bnd_cnf_shared=cnf/gradle +# all projects should be build +bnd_build= + # Default gradle task to build bnd_defaultTask=build From 2770f9e5ca1eefe4847bd454c2f0fa705ca3b5c8 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Mon, 15 Dec 2014 11:50:21 +0100 Subject: [PATCH 021/105] Added metatype and logging to the runtime.test dependancies and disable trace --- flexiblepower.runtime.test/bnd.bnd | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/flexiblepower.runtime.test/bnd.bnd b/flexiblepower.runtime.test/bnd.bnd index 9399c28..9c3fd48 100644 --- a/flexiblepower.runtime.test/bnd.bnd +++ b/flexiblepower.runtime.test/bnd.bnd @@ -20,10 +20,12 @@ Test-Cases: ${classes;CONCRETE;EXTENDS;junit.framework.TestCase},${classes;ANNOT ch.qos.logback.core;version=latest,\ org.apache.felix.configadmin;version=latest,\ org.apache.felix.scr;version=latest,\ + org.apache.felix.metatype;version=latest,\ biz.aQute.bnd.annotation;version=latest,\ + org.slf4j.osgi-over-slf4j;version=latest,\ slf4j.api;version=latest -runee: JavaSE-1.6 -runfw: org.apache.felix.framework --runtrace: true +#-runtrace: true -runvm: -ea From 3cbdc4c66f12c8606602d28bb7901cf587190d08 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Mon, 15 Dec 2014 11:51:57 +0100 Subject: [PATCH 022/105] Now using the (anonymous) HTTP url for shared-config module --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 7ffa73a..de94837 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "cnf/gradle"] path = cnf/gradle - url = git@github.com:flexiblepower/fpai-shared-config.git + url = https://github.com/flexiblepower/fpai-shared-config.git From 2aa6b2cc04d99a4134d101df3e88771209546ee0 Mon Sep 17 00:00:00 2001 From: Jan Pieter Wijbenga Date: Mon, 15 Dec 2014 12:00:33 +0100 Subject: [PATCH 023/105] Added TimerModelTest. Improved comments in Constraint to make clear it is generic. Typed the helper class buffer actuator. --- flexiblepower.api.efi.utils/bnd.bnd | 2 +- .../api/efi/bufferhelper/Buffer.java | 54 +++++--- .../api/efi/bufferhelper/BufferActuator.java | 50 ++++--- .../api/efi/bufferhelper/package-info.java | 2 +- .../api/efi/commonhelper/TimerModel.java | 4 + .../unconstrainedhelper/Unconstrained.java | 57 +++++--- .../api/efi/bufferhelper/BufferTest.java | 106 +++++++++++++- .../UnconstrainedTest.java | 130 ++++++++++-------- .../api/efi/commonhelper/TimerModelTest.java | 44 ++++++ .../flexiblepower/rai/values/Constraint.java | 37 +++-- 10 files changed, 347 insertions(+), 139 deletions(-) create mode 100644 flexiblepower.api.efi.utils/test/org/flexiblepower/api/efi/commonhelper/TimerModelTest.java diff --git a/flexiblepower.api.efi.utils/bnd.bnd b/flexiblepower.api.efi.utils/bnd.bnd index 32326d0..1b86bd7 100644 --- a/flexiblepower.api.efi.utils/bnd.bnd +++ b/flexiblepower.api.efi.utils/bnd.bnd @@ -4,7 +4,7 @@ flexiblepower.api.efi;version=latest,\ junit.osgi -Bundle-Version: 1.1.0.${qualifier} +Bundle-Version: 2.0.0.${qualifier} Export-Package: \ org.flexiblepower.api.efi.bufferhelper,\ org.flexiblepower.api.efi.unconstrainedhelper,\ diff --git a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/Buffer.java b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/Buffer.java index b899b3a..d6705df 100644 --- a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/Buffer.java +++ b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/Buffer.java @@ -34,7 +34,7 @@ public class Buffer { private final String fillLevelLabel; private final Unit fillLevelUnit; private final Measurable allocationDelay; - private final Map actuators; + private final Map> actuators; private FillLevelFunction leakageFunction; private Measurable currentFillLevel; private boolean hasReceivedSystemDescription = false; @@ -73,9 +73,9 @@ private Buffer(String resourceId, fillLevelLabel = getxLabel; fillLevelUnit = getxUnit; this.allocationDelay = allocationDelay; - actuators = new HashMap(); + actuators = new HashMap>(); for (Actuator ac : actuatorCapabilities) { - actuators.put(ac.getActuatorId(), new BufferActuator(ac)); + actuators.put(ac.getActuatorId(), new BufferActuator(ac, this)); } } @@ -89,6 +89,7 @@ private Buffer(String resourceId, * When the ActuatorId in the BufferSystemDescription is not known */ public void processSystemDescription(BufferSystemDescription bsd) { + hasReceivedStateUpdate = false; setLeakageFunction(bsd.getBufferLeakage()); for (ActuatorBehaviour actuatorDescription : bsd.getActuators()) { @@ -120,7 +121,7 @@ public void processStateUpdate(BufferStateUpdate bsu) for (ActuatorUpdate actUpdate : bsu.getCurrentRunningMode()) { if (actuators.containsKey(actUpdate.getActuatorId())) { - BufferActuator theActuator = actuators.get(actUpdate.getActuatorId()); + BufferActuator theActuator = actuators.get(actUpdate.getActuatorId()); if (!theActuator.hasRunningMode(actUpdate.getCurrentRunningModeId())) { throw new IllegalArgumentException("The RunningModeId in this message is not known."); @@ -148,9 +149,9 @@ public void processStateUpdate(BufferStateUpdate bsu) * * @return A list of all electrical BufferActuators or an empty list if none are found. */ - public List getElectricalActuators() { - List result = new ArrayList(); - for (BufferActuator a : actuators.values()) { + public List> getElectricalActuators() { + List> result = new ArrayList>(); + for (BufferActuator a : actuators.values()) { if (a.getSupportedCommodities().contains(Commodity.ELECTRICITY)) { result.add(a); } @@ -163,9 +164,9 @@ public List getElectricalActuators() { * * @return A Map of all electrical BufferActuators or an empty list if none are found. The key is the Actuator Id. */ - public Map getElectricalActuatorMap() { - Map result = new HashMap(); - for (BufferActuator a : actuators.values()) { + public Map> getElectricalActuatorMap() { + Map> result = new HashMap>(); + for (BufferActuator a : actuators.values()) { if (a.getSupportedCommodities().contains(Commodity.ELECTRICITY)) { result.put(a.getActuatorId(), a); } @@ -177,11 +178,19 @@ public Map getElectricalActuatorMap() { * Gets the fill level of the buffer relative to the maximum and minimum fill level. It is expressed in the fill * level unit that is defined in the registration message. * - * @return The fill fraction computed where 0 is minimum and 1 is the maximum fill level. + * @return The fill fraction computed where 0 is minimum and 1 is the maximum fill level. May be bigger than 1 or + * smaller than 0 (when circumstances cause the buffer temperature to go out of the bounds of the minimum + * and maximum). * @throws IllegalArgumentException * When minimum fill level is greater than or equal to the maximum fill level, this throws. + * @throws IllegalStateException + * When no information is available yet about the state of the buffer. */ - public double getCurrentFillFraction() { + public double getCurrentFillFraction() throws IllegalStateException, IllegalArgumentException { + if (!hasReceivedStateUpdate) + { + throw new IllegalStateException("No valid state update has been received yet, so cannot give a fill fraction."); + } double minimumFillLevel = getMinimumFillLevel(); double maximumFillLevel = getMaximumFillLevel(); @@ -195,13 +204,13 @@ public double getCurrentFillFraction() { } /** - * Gets the current fill level of the buffer. + * Gets the current fill level of the buffer. May be outside of the 'official' range of the running modes. * * @return A Measurable object containing the current fill level of the buffer and quantity information. * @throws IllegalStateException * When no state update has been received. */ - public Measurable getCurrentFillLevel() { + public Measurable getCurrentFillLevel() throws IllegalStateException { if (!hasReceivedStateUpdate) { throw new IllegalStateException("Cannot give a fill level when no state update has been sent yet."); } @@ -227,33 +236,34 @@ public boolean hasReceivedStateUpdate() { } /** + * For a heat pump, minimum fill level is the lowest temperature of the buffer. For a freezer, minimum fill level is + * the lowest temperature of the freezer. + * * @return The minimum of all actuators, not only the electrical. * * @throws IllegalStateException * When no system description has been received, this throws. - * **/ - public double getMinimumFillLevel() { + public double getMinimumFillLevel() throws IllegalStateException { double lowestBound = Double.MAX_VALUE; if (!hasReceivedSystemDescription) { throw new IllegalStateException("Cannot give a minimum fill level when no system description has been sent yet."); } - for (BufferActuator a : actuators.values()) { + for (BufferActuator a : actuators.values()) { lowestBound = Math.min(lowestBound, a.getMinimumFillLevel()); } return lowestBound; } /** - * * @return The maximum of all actuators, not only the electrical. */ - public double getMaximumFillLevel() { + public double getMaximumFillLevel() throws IllegalStateException { double highestBound = Double.MIN_VALUE; if (!hasReceivedSystemDescription) { throw new IllegalStateException("Cannot give a maximum fill level when no system description has been sent yet."); } - for (BufferActuator a : actuators.values()) { + for (BufferActuator a : actuators.values()) { highestBound = Math.max(highestBound, a.getMaximumFillLevel()); } return highestBound; @@ -320,7 +330,7 @@ public Unit getUnit() { * * @return A map with all actuators indexed on their id. */ - public Map getActuators() { + public Map> getActuators() { return actuators; } @@ -331,7 +341,7 @@ public Map getActuators() { * The id of the actuator. * @return The actuator object. */ - public BufferActuator getActuatorById(int id) { + public BufferActuator getActuatorById(int id) { if (actuators.containsKey(id)) { return actuators.get(id); } diff --git a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/BufferActuator.java b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/BufferActuator.java index 03a345e..c7fbc33 100644 --- a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/BufferActuator.java +++ b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/BufferActuator.java @@ -11,6 +11,7 @@ import javax.measure.Measurable; import javax.measure.quantity.Power; +import javax.measure.quantity.Quantity; import org.flexiblepower.api.efi.commonhelper.TimerModel; import org.flexiblepower.efi.buffer.Actuator; @@ -24,14 +25,17 @@ /** * The BufferActuator that integrates updated EFI messages and provides additional methods. + * + * @param */ -public class BufferActuator { +public class BufferActuator { private final int actuatorId; private final String actuatorLabel; private final CommoditySet commodities; private int currentRunningModeId; private Map>> allRunningModes = new HashMap>>(); private Map timers = new HashMap(); + private final Buffer parentBuffer; /** * Gets the identifier of the current running mode. @@ -46,8 +50,11 @@ public int getCurrentRunningModeId() { * Sets the current running mode. * * @param currentRunningModeId + * + * @throws IllegalArgumentException + * When running mode id is not valid. */ - public void setCurrentRunningModeId(int currentRunningModeId) { + public void setCurrentRunningModeId(int currentRunningModeId) throws IllegalArgumentException { if (allRunningModes.containsKey(currentRunningModeId)) { this.currentRunningModeId = currentRunningModeId; } @@ -113,9 +120,10 @@ public boolean hasRunningMode(int rmId) { * @return The reachable running modes including the current one. * * @throws IllegalArgumentException - * When an unknown runningmode id is returned from the reachable running modes. + * When an unknown running mode id is returned from the reachable running modes. */ - public Collection>> getReachableRunningModes(Date now) { + public Collection>> + getReachableRunningModes(Date now) throws IllegalArgumentException { Set>> rmSet = new HashSet>>(); for (int rmId : getReachableRunningModeIds(now)) { if (!allRunningModes.containsKey(rmId)) @@ -143,8 +151,13 @@ public Set getReachableRunningModeIds(Date now) { return targets; } for (Transition transition : allRunningModes.get(currentRunningModeId).getTransitions()) { - // Check for timers that block this transition. - if (!isBlockedAt(transition, now) && !willOverOrUndercharge(transition, now)) { + // Check for timers that block this transition, over and undercharge and that the current state of charge is + // within the valid range of the target running mode. + if (!isBlockedAt(transition, now) && !willOverOrUndercharge(transition, now) + && !allRunningModes.get(transition.getToRunningMode()) + .getValue() + .isOutsideOfRange(parentBuffer.getCurrentFillLevel() + .doubleValue(parentBuffer.getUnit()))) { targets.add(transition.getToRunningMode()); } } @@ -159,7 +172,7 @@ public Set getReachableRunningModeIds(Date now) { * @param transition * The transition to be checked. * @param now - * The moment for whicht the transition should be checked. + * The moment for which the transition should be checked. * @return Whether the transition is impossible due to timers follow-up transitions. Always returns false for now. */ private boolean willOverOrUndercharge(Transition transition, Date now) { @@ -195,9 +208,11 @@ private boolean isBlockedAt(Transition transition, Date moment) { * * @param ac * The Actuator's initial information. + * @param parentBuffer + * The Parent Buffer (to gain access to the fill level). */ - public BufferActuator(Actuator ac) { - this(ac.getActuatorId(), ac.getActuatorLabel(), ac.getCommodities()); + public BufferActuator(Actuator ac, Buffer parentBuffer) { + this(ac.getActuatorId(), ac.getActuatorLabel(), ac.getCommodities(), parentBuffer); } /** @@ -210,10 +225,11 @@ public BufferActuator(Actuator ac) { * @param commodities * The supported commodities of this actuator. */ - private BufferActuator(int actuatorId, String actuatorLabel, CommoditySet commodities) { + private BufferActuator(int actuatorId, String actuatorLabel, CommoditySet commodities, Buffer buffer) { this.actuatorId = actuatorId; this.actuatorLabel = actuatorLabel; this.commodities = commodities; + parentBuffer = buffer; } /** @@ -265,7 +281,7 @@ public void updateTimer(int timerId, Date finishedAt) { * @throws IllegalArgumentException * When a FillLevelFunction of a reachable state has no range elements. */ - public List> getPossibleDemands(Date moment, double fillLevel) { + public List> getPossibleDemands(Date moment, double fillLevel) throws IllegalArgumentException { List> resultMap = new LinkedList>(); for (RunningMode> rm : getReachableRunningModes(moment)) { @@ -293,14 +309,14 @@ public List> getPossibleDemands(Date moment, double fillLevel) } /** - * Gets the minimum fill level of the buffer expressed in the agreed upon unit. + * Gets the minimum fill level of the buffer actuator expressed in the agreed upon unit. * - * @return The minimum fill level of the buffer. + * @return The minimum fill level of the buffer actuator. * * @throws IllegalStateException * Thrown when no running mode is known yet and a minimum fill level is requested. */ - public double getMinimumFillLevel() { + public double getMinimumFillLevel() throws IllegalStateException { double lowestBound = Double.MAX_VALUE; if (allRunningModes.isEmpty()) { throw new IllegalStateException("Cannot give minimum fill level, because it is not known yet."); @@ -312,13 +328,13 @@ public double getMinimumFillLevel() { } /** - * Gets the maximum fill level of the buffer expressed in the agreed upon unit. + * Gets the maximum fill level of the buffer actuator expressed in the agreed upon unit. * - * @return The maximum fill level of the buffer. + * @return The maximum fill level of the buffer actuator. * @throws IllegalStateException * Thrown when no running mode is known yet and a maximum fill level is requested. */ - public double getMaximumFillLevel() { + public double getMaximumFillLevel() throws IllegalStateException { double upperBound = Double.MIN_VALUE; if (allRunningModes.isEmpty()) { throw new IllegalStateException("Cannot give minimum fill level, because it is not known yet."); diff --git a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/package-info.java b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/package-info.java index 7dc43b8..218cb98 100644 --- a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/package-info.java +++ b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/package-info.java @@ -1,4 +1,4 @@ -@Version("1.1.0.${qualifier}") +@Version("2.0.0.${qualifier}") package org.flexiblepower.api.efi.bufferhelper; import aQute.bnd.annotation.Version; diff --git a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/commonhelper/TimerModel.java b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/commonhelper/TimerModel.java index 1062321..553e6f6 100644 --- a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/commonhelper/TimerModel.java +++ b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/commonhelper/TimerModel.java @@ -45,6 +45,10 @@ public Date getFinishedAt() { * @return A boolean indicating whether the timer is blocking or not at the given moment. */ public boolean isBlockingAt(Date moment) { + if (moment == null) + { + return false; + } return (finishedAt != null && finishedAt.after(moment)); } } diff --git a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/Unconstrained.java b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/Unconstrained.java index 45549ae..66564bf 100644 --- a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/Unconstrained.java +++ b/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/Unconstrained.java @@ -69,6 +69,7 @@ private Unconstrained(String resourceId, CommoditySet supportedCommodities) { * The description message with Timers and RunningModes. */ public void processSystemDescription(UnconstrainedSystemDescription description) { + hasReceivedStateUpdate = false; allRunningModes = new HashMap>(); for (RunningMode rm : description.getRunningModes()) { @@ -95,6 +96,9 @@ public void processSystemDescription(UnconstrainedSystemDescription description) * @param stateUpdate * Contains an update for the timers that have a new finishedAt time. No timer information means no * updated information and the previously known finishedAt remains true. + * + * @throws IllegalArgumentException + * StateUpdate contains not known RunningMode. */ public void processStateUpdate(UnconstrainedStateUpdate stateUpdate) { if (!hasReceivedSystemDescription) { @@ -120,8 +124,12 @@ public void processStateUpdate(UnconstrainedStateUpdate stateUpdate) { * @param now * The current time. * @return The reachable running modes including the current one. + * + * @throws IllegalArgumentException + * The RunningModeId is not known. */ - public Collection> getReachableRunningModes(Date now) { + public Collection> + getReachableRunningModes(Date now) throws IllegalArgumentException { Set> rmSet = new HashSet>(); for (int rmId : getReachableRunningModeIds(now)) { if (!allRunningModes.containsKey(rmId)) @@ -159,32 +167,43 @@ public Set getReachableRunningModeIds(Date now) { } /** - * Gets the electrical demands of all reachable RunningModes at this moment including the current one, given this - * fill level of the buffer. It returns an empty list when there has not been a state update. + * Gets the electrical demands of all reachable RunningModes at this moment including the current one. It returns an + * empty list when there has not been a state update. * * @param moment * The moment of interest. - * @param fillLevel - * The buffer's current fill level expressed as a value where 0 is the minimum and 1 is the maximum. Its - * unit is the agreed upon unit. * @return An unordered list of the possible electricity consumption demands of the RunningModes, possibly including - * running modes with the same power demand. For fill levels outside the defined minimum and maximum range, - * the minimum and maximum value is returned. + * running modes with the same power demand. * * @throws IllegalArgumentException - * When a FillLevelFunction of a reachable state has no range elements. + * When a RunningMode is empty. */ - public List> getPossibleDemands(Date moment, double fillLevel) { - List> resultMap = new LinkedList>(); + public List> getPossibleDemands(Date moment) { + List> resultList = new LinkedList>(); for (RunningMode rm : getReachableRunningModes(moment)) { // Check whether the Running Mode is not empty. if (rm.getValue() == null) { throw new IllegalArgumentException("RunningMode was not expected to be empty."); } - - resultMap.add(rm.getValue().getCommodityConsumption().get(Commodity.ELECTRICITY)); + resultList.add(rm.getValue().getCommodityConsumption().get(Commodity.ELECTRICITY)); } - return resultMap; + return resultList; + } + + /** + * Gets the electrical demands of all reachable RunningModes at this moment including the current one. It returns an + * empty list when there has not been a state update. + * + * @param moment + * The moment of interest. + * @return An unordered list of the possible electricity consumption demands of the RunningModes, possibly including + * running modes with the same power demand. + * + * @throws IllegalArgumentException + * When a RunningMode is empty. + */ + public List> getPossibleDemands(Date moment, double fillLevel) { + return getPossibleDemands(moment); } /** @@ -213,8 +232,14 @@ private boolean willOverOrUndercharge(Transition transition, Date now) { * @param moment * The moment at which the possibility is or is not blocked. * @return True if the transition is blocked, false if it is not. + * + * @throws IllegalStateException + * */ - private boolean isBlockedAt(Transition transition, Date moment) { + private boolean isBlockedAt(Transition transition, Date moment) throws IllegalStateException { + if (!hasReceivedSystemDescription) { + throw new IllegalStateException("Can not call this method when no sys description is known yet."); + } for (org.flexiblepower.efi.util.Timer t : transition.getBlockingTimers()) { TimerModel at = timers.get(t.getId()); if (at.isBlockingAt(moment)) { @@ -282,7 +307,7 @@ public int getCurrentRunningModeId() { /** * The ResourceId of this Unconstrained device - * + * * @return The ResourceId of this Unconstrained device. */ public String getResourceId() { diff --git a/flexiblepower.api.efi.utils/test/flexiblepower/api/efi/bufferhelper/BufferTest.java b/flexiblepower.api.efi.utils/test/flexiblepower/api/efi/bufferhelper/BufferTest.java index 69dc946..13a993d 100644 --- a/flexiblepower.api.efi.utils/test/flexiblepower/api/efi/bufferhelper/BufferTest.java +++ b/flexiblepower.api.efi.utils/test/flexiblepower/api/efi/bufferhelper/BufferTest.java @@ -168,6 +168,94 @@ private static BufferSystemDescription constructBSD(BufferRegistration br) { + // Make a BufferStateUpdate + // This fictional device uses both gas and electricity. + CommodityMeasurables commodityConsumptionOn = CommodityMeasurables.create() + .electricity(Measure.valueOf(1000, + SI.WATT)) + .gas(Measure.valueOf(.00025, + NonSI.CUBIC_METRE_PER_SECOND)) + .build(); + CommodityMeasurables commodityConsumptionOff = CommodityMeasurables.create() + .electricity(Measure.valueOf(0, + SI.WATT)) + .gas(Measure.valueOf(0, + NonSI.CUBIC_METRE_PER_SECOND)) + .build(); + + FillLevelFunction flf_On = FillLevelFunction. create(-100) + .add(-10, + new RunningModeBehaviour(10, + commodityConsumptionOn, + Measure.valueOf(0.24, + NonSI.EUR_PER_HOUR))) + .build(); + FillLevelFunction flf_Off = FillLevelFunction. create(-100) + .add(-10, + new RunningModeBehaviour(10, + commodityConsumptionOff, + Measure.valueOf(0.24, + NonSI.EUR_PER_HOUR))) + .build(); + + Timer minOnTimer = new Timer(1, "Minimum Run Timer", Measure.valueOf(2, SI.SECOND)); + Set onTimerSet = new HashSet(); + onTimerSet.add(minOnTimer); + + Timer minOffTimer = new Timer(2, "Minimum Off Timer", Measure.valueOf(2, SI.SECOND)); + Set offTimerSet = new HashSet(); + offTimerSet.add(minOffTimer); + + Set transitionsFromOn = new HashSet(); + transitionsFromOn.add(new Transition(2, + onTimerSet, + offTimerSet, + Measure.valueOf(0, NonSI.EUR), + Measure.valueOf(0, SI.SECOND))); + + Set transitionsFromOff = new HashSet(); + transitionsFromOff.add(new Transition(1, + offTimerSet, + onTimerSet, + Measure.valueOf(0, NonSI.EUR), + Measure.valueOf(0, SI.SECOND))); + + Set>> runningModesOfActuator1 = new HashSet>>(); + runningModesOfActuator1.add(new RunningMode>(2, + "rmOn", + flf_On, + transitionsFromOff)); + runningModesOfActuator1.add(new RunningMode>(1, + "rmOff", + flf_Off, + transitionsFromOn)); + + Set>> runningModesOfActuator2 = new HashSet>>(); + runningModesOfActuator2.add(new RunningMode>(2, + "rm2On", + flf_On, + transitionsFromOff)); + runningModesOfActuator2.add(new RunningMode>(1, + "rm2Off", + flf_Off, + transitionsFromOn)); + + Set actBeh = new HashSet(); + actBeh.add(new ActuatorBehaviour(1, runningModesOfActuator1)); + actBeh.add(new ActuatorBehaviour(2, runningModesOfActuator2)); + + FillLevelFunction leakageFunction = FillLevelFunction. create(-100) + .add(100, new LeakageRate(14)) + .build(); + + return (new BufferSystemDescription(br, + new Date(), + new Date(), + actBeh, + leakageFunction)); + } + private static BufferRegistration constructTestElectricalBufferRegistration() { return new BufferRegistration("BR1", new Date(), @@ -201,7 +289,7 @@ public void testOneElectricalActuator() { } public void testGetReachableRunningModes() { - for (BufferActuator a : incompleteBuffer.getElectricalActuators()) { + for (BufferActuator a : incompleteBuffer.getElectricalActuators()) { Assert.assertTrue(a.getReachableRunningModes(new Date()).isEmpty()); } @@ -209,7 +297,7 @@ public void testGetReachableRunningModes() { // Actuator 1 is off (rm 1) and in minimum off time for 5 minutes. fullBuffer.processStateUpdate(bsu); - BufferActuator a1 = fullBuffer.getActuatorById(1); + BufferActuator a1 = fullBuffer.getActuatorById(1); Set reachableRunningModes = a1.getReachableRunningModeIds(new Date()); // Minimum Off timer restricts actuator 1 from going to rm 2 (on). Assert.assertTrue(reachableRunningModes.contains(a1.getCurrentRunningModeId())); @@ -228,7 +316,7 @@ public void testGetReachableRunningModes() { Assert.assertTrue(a1.getReachableRunningModeIds(cal3.getTime()).contains(2)); // Actuator 2 has no running timers so should have both runningmodes as options. - BufferActuator a2 = fullBuffer.getActuatorById(2); + BufferActuator a2 = fullBuffer.getActuatorById(2); Set reachableRunningModes2 = a2.getReachableRunningModeIds(new Date()); Assert.assertTrue(reachableRunningModes2.contains(a2.getCurrentRunningModeId())); Assert.assertEquals(a2.getCurrentRunningModeId(), 2); @@ -238,12 +326,12 @@ public void testGetReachableRunningModes() { public void testGetPossibleDemands() { fullBuffer.processSystemDescription(bsd); fullBuffer.processStateUpdate(bsu); - BufferActuator a1 = fullBuffer.getActuatorById(1); + BufferActuator a1 = fullBuffer.getActuatorById(1); List> demandList = a1.getPossibleDemands(new Date(), .2); // First actuator is in must off state. Assert.assertTrue(demandList.size() == 1); Assert.assertEquals(demandList.get(0).doubleValue(SI.WATT), 0d); - BufferActuator a2 = fullBuffer.getActuatorById(2); + BufferActuator a2 = fullBuffer.getActuatorById(2); List> demandList2 = a2.getPossibleDemands(new Date(), .2); // Second actuator should have two possible states. Assert.assertTrue(demandList2.size() == 2); @@ -288,4 +376,12 @@ public void testFillLevelCalculations() { Assert.assertEquals(-1d, fullBuffer.getCurrentFillLevel().doubleValue(fullBuffer.getUnit())); Assert.assertEquals(SI.CELSIUS, fullBuffer.getUnit()); } + + public void testNewSysDescription() { + fullBuffer.processSystemDescription(bsd); + fullBuffer.processStateUpdate(bsu); + Assert.assertEquals(0.9, fullBuffer.getCurrentFillFraction()); + fullBuffer.processSystemDescription(constructNewBSD(br)); + Assert.assertFalse(fullBuffer.hasReceivedStateUpdate()); + } } diff --git a/flexiblepower.api.efi.utils/test/flexiblepower/api/efi/unconstrainedhelper/UnconstrainedTest.java b/flexiblepower.api.efi.utils/test/flexiblepower/api/efi/unconstrainedhelper/UnconstrainedTest.java index 1fc3ef6..d52085e 100644 --- a/flexiblepower.api.efi.utils/test/flexiblepower/api/efi/unconstrainedhelper/UnconstrainedTest.java +++ b/flexiblepower.api.efi.utils/test/flexiblepower/api/efi/unconstrainedhelper/UnconstrainedTest.java @@ -43,13 +43,76 @@ public void setUp() { usu = UnconstrainedTest.constructUSU(ur, 45); } + public void testGetReachableRunningModes() { + Assert.assertTrue(incompleteUnconstrained.getReachableRunningModes(new Date()).isEmpty()); + + fullUnconstrained.processSystemDescription(usd); + // Unconstrained device is off (rm 1) and in minimum off time for 5 minutes. + fullUnconstrained.processStateUpdate(usu); + + Set reachableRunningModes = fullUnconstrained.getReachableRunningModeIds(new Date()); + // Minimum Off timer restricts unconstrained from going to rm 2 (on). + Assert.assertTrue(reachableRunningModes.contains(fullUnconstrained.getCurrentRunningModeId())); + Assert.assertEquals(1, fullUnconstrained.getCurrentRunningModeId()); + Assert.assertFalse(reachableRunningModes.contains(2)); + + // Also in 4 minutes from now, the running mode with id 2 should not be reachable. + Calendar cal2 = Calendar.getInstance(); + cal2.add(Calendar.MINUTE, 4); + Assert.assertTrue(fullUnconstrained.getReachableRunningModeIds(cal2.getTime()).contains(1)); + Assert.assertFalse(fullUnconstrained.getReachableRunningModeIds(cal2.getTime()).contains(2)); + + // In 6 minutes from now, the running mode with id 2 should be reachable. + Calendar cal3 = Calendar.getInstance(); + cal3.add(Calendar.MINUTE, 6); + + Assert.assertTrue(fullUnconstrained.getReachableRunningModeIds(cal3.getTime()).contains(2)); + Assert.assertTrue(fullUnconstrained.getReachableRunningModeIds(cal3.getTime()).contains(1)); + } + + public void testGetPossibleDemands() { + fullUnconstrained.processSystemDescription(usd); + fullUnconstrained.processStateUpdate(usu); + List> demandList = fullUnconstrained.getPossibleDemands(new Date()); + // Unconstrained device is in must off state. + Assert.assertTrue(demandList.size() == 1); + Assert.assertEquals(0d, demandList.get(0).doubleValue(SI.WATT)); + } + + public void testReceivedMessages() { + Assert.assertFalse(fullUnconstrained.hasReceivedSystemDescription()); + Assert.assertFalse(fullUnconstrained.hasReceivedStateUpdate()); + + // Ignore state update if system description is not in yet. + fullUnconstrained.processStateUpdate(usu); + Assert.assertFalse(fullUnconstrained.hasReceivedSystemDescription()); + Assert.assertFalse(fullUnconstrained.hasReceivedStateUpdate()); + + fullUnconstrained.processSystemDescription(usd); + Assert.assertTrue(fullUnconstrained.hasReceivedSystemDescription()); + fullUnconstrained.processStateUpdate(usu); + Assert.assertTrue(fullUnconstrained.hasReceivedStateUpdate()); + } + + /** + * Gets the electrical demands of all reachable RunningModes at this moment including the current one. It returns an + * empty list when there has not been a state update. + * + * @param moment + * The moment of interest. + * @return An unordered list of the possible electricity consumption demands of the RunningModes, possibly including + * running modes with the same power demand. + * + * @throws IllegalArgumentException + * When a RunningMode is empty. + */ private static UnconstrainedStateUpdate constructUSU(UnconstrainedRegistration ur, double fillLevel) { Set timerUpdates = new HashSet(); - Calendar cal = Calendar.getInstance(); - cal.add(Calendar.MINUTE, 5); + Calendar moment = Calendar.getInstance(); + moment.add(Calendar.MINUTE, 5); // Set the minimum off timer (timer 2) to be finished 5 minutes from now. - timerUpdates.add(new TimerUpdate(2, cal.getTime())); + timerUpdates.add(new TimerUpdate(2, moment.getTime())); // Unconstrained device is on and in minimum run mode. return new UnconstrainedStateUpdate(ur.getResourceId(), @@ -75,10 +138,10 @@ private static UnconstrainedSystemDescription constructUSD(UnconstrainedRegistra NonSI.CUBIC_METRE_PER_SECOND)) .build(); - RunningModeBehaviour flf_On = new RunningModeBehaviour(commodityConsumptionOn, - Measure.valueOf(0.24, NonSI.EUR_PER_HOUR)); - RunningModeBehaviour flf_Off = new RunningModeBehaviour(commodityConsumptionOff, - Measure.valueOf(0.24, NonSI.EUR_PER_HOUR)); + RunningModeBehaviour rb_On = new RunningModeBehaviour(commodityConsumptionOn, + Measure.valueOf(0.24, NonSI.EUR_PER_HOUR)); + RunningModeBehaviour rb_Off = new RunningModeBehaviour(commodityConsumptionOff, + Measure.valueOf(0.00, NonSI.EUR_PER_HOUR)); Timer minOnTimer = new Timer(1, "Minimum Run Timer", Measure.valueOf(2, SI.SECOND)); Set onTimerSet = new HashSet(); @@ -105,11 +168,11 @@ private static UnconstrainedSystemDescription constructUSD(UnconstrainedRegistra Set> runningModeSet = new HashSet>(); runningModeSet.add(new RunningMode(2, "rmOn", - flf_On, + rb_On, transitionsFromOff)); runningModeSet.add(new RunningMode(1, "rmOff", - flf_Off, + rb_Off, transitionsFromOn)); return new UnconstrainedSystemDescription(br.getResourceId(), @@ -131,53 +194,4 @@ private static UnconstrainedRegistration constructTestUnconstrainedRegistration( Measure.zero(SI.SECOND), CommoditySet.onlyGas); } - - public void testGetReachableRunningModes() { - Assert.assertTrue(incompleteUnconstrained.getReachableRunningModes(new Date()).isEmpty()); - - fullUnconstrained.processSystemDescription(usd); - // Unconstrained device is off (rm 1) and in minimum off time for 5 minutes. - fullUnconstrained.processStateUpdate(usu); - - Set reachableRunningModes = fullUnconstrained.getReachableRunningModeIds(new Date()); - // Minimum Off timer restricts unconstrained from going to rm 2 (on). - Assert.assertTrue(reachableRunningModes.contains(fullUnconstrained.getCurrentRunningModeId())); - Assert.assertEquals(fullUnconstrained.getCurrentRunningModeId(), 1); - Assert.assertFalse(reachableRunningModes.contains(2)); - - // Also in 4 minutes from now, the running mode with id 2 should not be reachable. - Calendar cal2 = Calendar.getInstance(); - cal2.add(Calendar.MINUTE, 4); - Assert.assertFalse(fullUnconstrained.getReachableRunningModeIds(cal2.getTime()).contains(2)); - - // In 6 minutes from now, the running mode with id 2 should be reachable. - Calendar cal3 = Calendar.getInstance(); - cal3.add(Calendar.MINUTE, 6); - - Assert.assertTrue(fullUnconstrained.getReachableRunningModeIds(cal3.getTime()).contains(2)); - } - - public void testGetPossibleDemands() { - fullUnconstrained.processSystemDescription(usd); - fullUnconstrained.processStateUpdate(usu); - List> demandList = fullUnconstrained.getPossibleDemands(new Date(), .2); - // Unconstrained device is in must off state. - Assert.assertTrue(demandList.size() == 1); - Assert.assertEquals(demandList.get(0).doubleValue(SI.WATT), 0d); - } - - public void testReceivedMessages() { - Assert.assertFalse(fullUnconstrained.hasReceivedSystemDescription()); - Assert.assertFalse(fullUnconstrained.hasReceivedStateUpdate()); - - // Ignore state update if system description is not in yet. - fullUnconstrained.processStateUpdate(usu); - Assert.assertFalse(fullUnconstrained.hasReceivedSystemDescription()); - Assert.assertFalse(fullUnconstrained.hasReceivedStateUpdate()); - - fullUnconstrained.processSystemDescription(usd); - Assert.assertTrue(fullUnconstrained.hasReceivedSystemDescription()); - fullUnconstrained.processStateUpdate(usu); - Assert.assertTrue(fullUnconstrained.hasReceivedStateUpdate()); - } } diff --git a/flexiblepower.api.efi.utils/test/org/flexiblepower/api/efi/commonhelper/TimerModelTest.java b/flexiblepower.api.efi.utils/test/org/flexiblepower/api/efi/commonhelper/TimerModelTest.java new file mode 100644 index 0000000..b17ea60 --- /dev/null +++ b/flexiblepower.api.efi.utils/test/org/flexiblepower/api/efi/commonhelper/TimerModelTest.java @@ -0,0 +1,44 @@ +package org.flexiblepower.api.efi.commonhelper; + +import java.util.Calendar; +import java.util.Date; + +import javax.measure.Measure; +import javax.measure.unit.SI; + +import junit.framework.TestCase; + +import org.flexiblepower.efi.util.Timer; + +public class TimerModelTest extends TestCase { + + @Override + public void setUp() { + + } + + public void testTimerCreation() { + Timer source = new Timer(0, "minOn", Measure.valueOf(100, SI.SECOND)); + Timer source2 = new Timer(1, "minOff", Measure.valueOf(10, SI.SECOND)); + TimerModel timerOn = new TimerModel(source); + assertFalse(timerOn.isBlockingAt(new Date())); + timerOn.updateFinishedAt(null); + assertFalse(timerOn.isBlockingAt(new Date())); + + Calendar moment = Calendar.getInstance(); + Date now = moment.getTime(); + moment.add(Calendar.SECOND, 30); + Date inHalfAMinute = moment.getTime(); + moment.add(Calendar.SECOND, 30); + Date inOneMinute = moment.getTime(); + moment.add(Calendar.MILLISECOND, 1); + Date inJustOverOneMinute = moment.getTime(); + timerOn.updateFinishedAt(inOneMinute); + assertTrue(timerOn.isBlockingAt(inHalfAMinute)); + // Timer is not blocking if the time is now. + assertFalse(timerOn.isBlockingAt(inOneMinute)); + assertFalse(timerOn.isBlockingAt(inJustOverOneMinute)); + timerOn.updateFinishedAt(inOneMinute); + assertFalse(timerOn.isBlockingAt(null)); + } +} diff --git a/flexiblepower.api/src/org/flexiblepower/rai/values/Constraint.java b/flexiblepower.api/src/org/flexiblepower/rai/values/Constraint.java index ba0e7b2..17f8be1 100644 --- a/flexiblepower.api/src/org/flexiblepower/rai/values/Constraint.java +++ b/flexiblepower.api/src/org/flexiblepower/rai/values/Constraint.java @@ -8,7 +8,7 @@ /** * A Constraint represents a range of values from the lowerBound to the upperBound. This is mainly used for the * {@link ConstraintList}. - * + * * @param * The quantity of the constraint (see the javax.measure package) */ @@ -17,13 +17,13 @@ public final class Constraint { private final Measurable upperBound; /** - * Construct power constraint with a lower and upper bound as power values. If both are equal, this constructs a - * single value power constraint. - * + * Construct a constraint with a lower and upper bound expressed in the quantity. If both are equal, this constructs + * a single value constraint. + * * @param lowerBound - * is the lower bound in Power + * is the lower bound expressed in a unit that fits with Q * @param upperBound - * is the upper bound in Power + * is the upper bound expressed in a unit that fits with Q * @throws NullPointerException * if either the lower or upper bound is null * @throws IllegalArgumentException @@ -43,21 +43,20 @@ public Constraint(Measurable lowerBound, Measurable upperBound) { } /** - * Constructs a power constraint with single power value. - * - * @param power - * is the single power value + * Constructs a constraint with a single value. + * + * @param value + * is the single typed input value. * @throws NullPointerException - * if power is null + * if value is null */ - public Constraint(Measurable power) { - this(power, power); + public Constraint(Measurable value) { + this(value, value); } /** - * Construct a power constraint with two (different) power values. If both are equal, this constructs a single value - * power constraint. - * + * Construct a constraint with two (different) values. If both are equal, this constructs a single value constraint. + * * @param lowerBound * is the lower bound * @param upperBound @@ -79,15 +78,15 @@ public boolean isSingleValue() { } /** - * @return The lower bound of the power constraint + * @return The lower bound of the constraint */ public Measurable getLowerBound() { return lowerBound; } /** - * @return The upper bound of the power constraint, which will be equal to the lower bound if this represents a - * single value. + * @return The upper bound of the constraint, which will be equal to the lower bound if this represents a single + * value. */ public Measurable getUpperBound() { return upperBound; From 22d1e3f30209a45d98fe6eca94edf31d037d7aec Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Mon, 15 Dec 2014 21:57:48 +0100 Subject: [PATCH 024/105] Removed java dependancy (was already in bnd) --- flexiblepower.felix.webconsole.plugins/.classpath | 1 - 1 file changed, 1 deletion(-) diff --git a/flexiblepower.felix.webconsole.plugins/.classpath b/flexiblepower.felix.webconsole.plugins/.classpath index 3653a9f..1b35e9d 100644 --- a/flexiblepower.felix.webconsole.plugins/.classpath +++ b/flexiblepower.felix.webconsole.plugins/.classpath @@ -3,6 +3,5 @@ - From 46e8460571f064c70d9f317209f8f854e4c54358 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Fri, 19 Dec 2014 09:14:43 +0100 Subject: [PATCH 025/105] Tried to solve the ConcurrentModificationExceptions --- .../org/flexiblepower/runtime/messaging/EndpointPortImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/EndpointPortImpl.java b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/EndpointPortImpl.java index dfef21d..4cd9e58 100644 --- a/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/EndpointPortImpl.java +++ b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/EndpointPortImpl.java @@ -82,7 +82,8 @@ public boolean isConnected() { } public void close() { - for (PotentialConnectionImpl connection : getPotentialConnections().values()) { + PotentialConnectionImpl[] conns = getPotentialConnections().values().toArray(new PotentialConnectionImpl[0]); + for (PotentialConnectionImpl connection : conns) { connection.close(); removeMatch(connection); connection.getOtherEnd(this).removeMatch(connection); From 922f4b988b5b0f7f7837a73c83eaef6c5ec62667 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Mon, 22 Dec 2014 15:49:14 +0100 Subject: [PATCH 026/105] Fixed a lot of the JavaDocs to be able to build with JDK 8 --- .gitignore | 1 + cnf/gradle | 2 +- .../efi/buffer/BufferStateUpdate.java | 4 +- .../efi/buffer/BufferTargetProfileUpdate.java | 4 +- .../UnconstrainedAllocation.java | 4 +- .../uncontrolled/UncontrolledAllocation.java | 3 +- .../flexiblepower/efi/util/Transition.java | 6 +- .../drivers/dishwasher/DishwasherState.java | 36 +++-- .../ral/ext/AbstractResourceDriver.java | 4 +- .../ral/ext/AbstractResourceManager.java | 10 +- .../src/javax/measure/DecimalMeasure.java | 28 ++-- .../src/javax/measure/Measurable.java | 59 +++++--- .../src/javax/measure/VectorMeasure.java | 57 ++++---- .../javax/measure/converter/LogConverter.java | 20 +-- .../src/javax/measure/unit/BaseUnit.java | 26 ++-- .../src/javax/measure/unit/CompoundUnit.java | 26 ++-- .../src/javax/measure/unit/Dimension.java | 70 +++++----- .../src/javax/measure/unit/SI.java | 70 +++++----- .../src/javax/measure/unit/Unit.java | 131 +++++++++--------- .../observation/ObservationProvider.java | 41 +++--- .../rai/values/CommodityForecast.java | 16 ++- .../rai/values/ConstraintList.java | 3 +- .../org/flexiblepower/rai/values/Profile.java | 4 +- .../values/UncertainMeasurableProfile.java | 2 +- .../flexiblepower/ral/ResourceManager.java | 3 +- 25 files changed, 350 insertions(+), 280 deletions(-) diff --git a/.gitignore b/.gitignore index 782a543..edc43ff 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ instrumented coverage.xml RemoteSystemsTempFiles reports +build # Keep the projects list .metadata/* diff --git a/cnf/gradle b/cnf/gradle index 3c9636d..74bdca5 160000 --- a/cnf/gradle +++ b/cnf/gradle @@ -1 +1 @@ -Subproject commit 3c9636db161c1382a63106b591ce09f9bdc72501 +Subproject commit 74bdca52191211dcde9776c75b6ee60a3313e9e0 diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferStateUpdate.java b/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferStateUpdate.java index a2b9e70..b067a6d 100644 --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferStateUpdate.java +++ b/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferStateUpdate.java @@ -23,8 +23,8 @@ public class BufferStateUpdate extends BufferUpdate { /** * Constructs a new {@link BufferStateUpdate} message with the specific validFrom * - * @param resourceId - * The resource identifier + * @param bufferRegistration + * The registration message to which this update is referring to * @param timestamp * The moment when this constructor is called (should be {@link TimeService#getTime()} * @param validFrom diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferTargetProfileUpdate.java b/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferTargetProfileUpdate.java index 2ad611e..11b5666 100644 --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferTargetProfileUpdate.java +++ b/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferTargetProfileUpdate.java @@ -20,8 +20,8 @@ public class BufferTargetProfileUpdate extends BufferUpdate /** * Constructs a new {@link BufferTargetProfileUpdate} message with the specific validFrom * - * @param resourceId - * The resource identifier + * @param bufferRegistration + * The registration message to which this update is referring * @param timestamp * The moment when this constructor is called (should be {@link TimeService#getTime()} * @param validFrom diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedAllocation.java b/flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedAllocation.java index b6dd788..0ce9d40 100644 --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedAllocation.java +++ b/flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedAllocation.java @@ -20,10 +20,10 @@ public class UnconstrainedAllocation extends Allocation { /** * Constructs a new {@link UnconstrainedAllocation} object as a response to a specific {@link ControlSpaceUpdate}. * + * @param resourceUpdate + * The {@link ControlSpaceUpdate} object to which this {@link Allocation} is responding to. * @param timestamp * The moment when this constructor is called (should be {@link TimeService#getTime()} - * @param controlSpaceUpdate - * The {@link ControlSpaceUpdate} object to which this {@link Allocation} is responding to. * @param isEmergencyAllocation * This Boolean value is optional and is true when a grid emergency situation occurs. (e.g. congestion, * black start etc.) The energy app then strongly advices the appliance driver to adapt to the sent diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledAllocation.java b/flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledAllocation.java index 56f76ea..c9fd9ec 100644 --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledAllocation.java +++ b/flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledAllocation.java @@ -4,6 +4,7 @@ import org.flexiblepower.rai.Allocation; import org.flexiblepower.rai.values.Commodity; +import org.flexiblepower.rai.values.ConstraintProfile; import org.flexiblepower.rai.values.ConstraintProfileMap; /** @@ -47,7 +48,7 @@ public Date getStartTime() { /** * - * @return a map of {@link CurtialmentProfile} for every applicable {@link Commodity} + * @return a map of {@link ConstraintProfile} for every applicable {@link Commodity} */ public ConstraintProfileMap getCurtailmentProfiles() { return curtailmentProfiles; diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/util/Transition.java b/flexiblepower.api.efi/src/org/flexiblepower/efi/util/Transition.java index 2cdd03c..aa71c85 100644 --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/util/Transition.java +++ b/flexiblepower.api.efi/src/org/flexiblepower/efi/util/Transition.java @@ -12,7 +12,7 @@ import javax.measure.unit.SI; /** - * This class contains the constraints for switching from one {@link BufferRunningMode} to another + * This class contains the constraints for switching from one {@link RunningMode} to another */ public class Transition { public static Builder create(int toRunningMode) { @@ -95,7 +95,7 @@ public Transition build() { /** * @param toRunningMode - * When making this transition this attributes indicates the new {@link BufferRunningMode} + * When making this transition this attributes indicates the new {@link RunningMode} * @param startTimers * This is a set of zero or more Timer objects. All these timers have to be started when this transition * is made. E.g. when an actuator is being switched on, the “on” timer has to start to make sure that the @@ -126,7 +126,7 @@ public Transition(int toRunningMode, } /** - * @return When making this transition this attributes indicates the new {@link BufferRunningMode} + * @return When making this transition this attributes indicates the new {@link RunningMode} */ public int getToRunningMode() { return toRunningMode; diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/dishwasher/DishwasherState.java b/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/dishwasher/DishwasherState.java index 09ee2dd..2ebf745 100644 --- a/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/dishwasher/DishwasherState.java +++ b/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/dishwasher/DishwasherState.java @@ -8,15 +8,33 @@ /** * The {@link DishwasherState} that describes the current state of a dishwasher. In general there are 3 options: * - *

    - *
  • latestStartTime == null && startTime == null && program == null
    - * This means that the dishwasher is off or no program has been selected. In this case there is nothing to control.
  • - *
  • latestStartTime != null && startTime == null && program != null
    - * This means that the dishwasher is on with a selected program that has been delayed. It can be started anywhere - * between now and the latestStartTime.
  • - *
  • startTime != null && program != null
    - * This means that the program has started at the startTime and it can not be interrupted anymore. - *
+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
latestStartTimestartTimeprogramMeaning
nullnullnullThe dishwasher is off or no program has been selected. In this case there is nothing to control.
not nullnullnot nullThe dishwasher is on with a selected program that has been delayed. It can be started anywhere between now and + * the latestStartTime.
??not nullnot nullThe program has started at the startTime and it can not be interrupted anymore.
*/ public interface DishwasherState extends ResourceState { /** diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/ext/AbstractResourceDriver.java b/flexiblepower.api.ext/src/org/flexiblepower/ral/ext/AbstractResourceDriver.java index 439952b..d344de2 100644 --- a/flexiblepower.api.ext/src/org/flexiblepower/ral/ext/AbstractResourceDriver.java +++ b/flexiblepower.api.ext/src/org/flexiblepower/ral/ext/AbstractResourceDriver.java @@ -12,8 +12,8 @@ /** * Gives a basic implementation for a {@link ResourceDriver}. Any subclass of this class should only implement the - * {@link #setControlParameters(ResourceControlParameters)} method and some way to periodically send states (e.g. make - * it {@link Runnable} and use the {@link ScheduledExecutorService} for scheduling itself). + * {@link #handleControlParameters(ResourceControlParameters)} method and some way to periodically send states (e.g. + * make it {@link Runnable} and use the {@link ScheduledExecutorService} for scheduling itself). * * @param * The type of {@link ResourceState} diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/ext/AbstractResourceManager.java b/flexiblepower.api.ext/src/org/flexiblepower/ral/ext/AbstractResourceManager.java index 12cfdcd..fd26cc7 100644 --- a/flexiblepower.api.ext/src/org/flexiblepower/ral/ext/AbstractResourceManager.java +++ b/flexiblepower.api.ext/src/org/flexiblepower/ral/ext/AbstractResourceManager.java @@ -6,6 +6,7 @@ import org.flexiblepower.messaging.MessageHandler; import org.flexiblepower.rai.AllocationStatusUpdate; import org.flexiblepower.rai.ResourceMessage; +import org.flexiblepower.ral.ControllerManager; import org.flexiblepower.ral.ResourceControlParameters; import org.flexiblepower.ral.ResourceDriver; import org.flexiblepower.ral.ResourceManager; @@ -115,9 +116,9 @@ public void disconnected() { } /** - * Indicate if this {@link ResourceManager} is currently connected to a {@link ResourceController} + * Indicate if this {@link ResourceManager} is currently connected to a {@link ControllerManager} * - * @return boolean indicating if this {@link ResourceManager} is currently connected to a {@link ResourceController} + * @return boolean indicating if this {@link ResourceManager} is currently connected to a {@link ControllerManager} */ protected boolean isConnectedWithResourceController() { return controllerConnection != null; @@ -148,9 +149,10 @@ protected void allocationStatusUpdate(AllocationStatusUpdate allocationStatusUpd } /** - * Send control parameters to attached controller + * Send control parameters to attached driver * - * @param allocationStatusUpdate + * @param controlParameters + * The parameters that have to be sent to the driver */ protected void sendControlParameters(ResourceControlParameters controlParameters) { if (driverConnection != null) { diff --git a/flexiblepower.api/src/javax/measure/DecimalMeasure.java b/flexiblepower.api/src/javax/measure/DecimalMeasure.java index 5eeff2c..2a92002 100644 --- a/flexiblepower.api/src/javax/measure/DecimalMeasure.java +++ b/flexiblepower.api/src/javax/measure/DecimalMeasure.java @@ -2,7 +2,7 @@ * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. * Copyright (C) 2007 - JScience (http://jscience.org/) * All rights reserved. - * + * * Permission to use, copy, modify, and distribute this software is * freely granted, provided that this notice is preserved. */ @@ -21,14 +21,18 @@ *

* This class represents a measure whose value is an arbitrary-precision decimal number. *

- * + * *

- * When converting, applications may supply the java.math.Context:[code] DecimalMeasure c = - * DecimalMeasure.valueOf("299792458 m/s"); DecimalMeasure milesPerHour = c.to(MILES_PER_HOUR, - * MathContext.DECIMAL128); System.out.println(milesPerHour); - * - * > 670616629.3843951324266284896206156 mph [/code] - * + * When converting, applications may supply the java.math.Context: + * + *

+ * DecimalMeasure<Velocity> c = DecimalMeasure.valueOf("299792458 m/s");
+ * DecimalMeasure<Velocity> milesPerHour = c.to(MILES_PER_HOUR, MathContext.DECIMAL128);
+ * System.out.println(milesPerHour);
+ *
+ * > 670616629.3843951324266284896206156 mph
+ * 
+ * * @author
Jean-Marie Dautelle * @version 4.3, October 3, 2007 * @param @@ -48,7 +52,7 @@ public class DecimalMeasure extends Measure { /** * Creates a decimal measure for the specified number stated in the specified unit. - * + * * @param value * The value * @param unit @@ -61,7 +65,7 @@ public DecimalMeasure(BigDecimal value, Unit unit) { /** * Returns the decimal measure for the specified number stated in the specified unit. - * + * * @param decimal * the measurement value. * @param unit @@ -121,7 +125,7 @@ public BigDecimal getValue() { /** * Returns the decimal measure equivalent to this measure but stated in the specified unit. This method will raise * an ArithmeticException if the resulting measure does not have a terminating decimal expansion. - * + * * @param unit * the new measurement unit. * @return the measure stated in the specified unit. @@ -137,7 +141,7 @@ public DecimalMeasure to(Unit unit) { /** * Returns the decimal measure equivalent to this measure but stated in the specified unit, the conversion is * performed using the specified math context. - * + * * @param unit * the new measurement unit. * @param mathContext diff --git a/flexiblepower.api/src/javax/measure/Measurable.java b/flexiblepower.api/src/javax/measure/Measurable.java index 348aad7..c59945b 100644 --- a/flexiblepower.api/src/javax/measure/Measurable.java +++ b/flexiblepower.api/src/javax/measure/Measurable.java @@ -2,7 +2,7 @@ * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. * Copyright (C) 2007 - JScience (http://jscience.org/) * All rights reserved. - * + * * Permission to use, copy, modify, and distribute this software is * freely granted, provided that this notice is preserved. */ @@ -12,27 +12,42 @@ import javax.measure.unit.Unit; /** - *

* This interface represents the measurable, countable, or comparable property or aspect of a thing. - *

- * - *

- * Implementing instances are typically the result of a measurement:[code] Measurable weight = - * Measure.valueOf(180.0, POUND); [/code] They can also be created from custom classes:[code] class Delay implements - * Measurable { private long nanoSeconds; // Implicit internal unit. public double doubleValue(Unit - * unit) { ... } public long longValue(Unit unit) { ... } } Thread.wait(new Delay(24, HOUR)); // Assuming - * Thread.wait(Measurable) method. [/code] - *

+ * + * Implementing instances are typically the result of a measurement: + * + *
+ * Measurable<Mass> weight = Measure.valueOf(180.0, POUND);
+ * 
+ * + * They can also be created from custom classes: + * + *
+ * class Delay implements Measurable<Duration> {
+ *     private long nanoSeconds; // Implicit internal unit.
+ *     public double doubleValue(Unit<Velocity> unit) { ... }
+ *     public long longValue(Unit<Velocity> unit) { ... }
+ * }
  * 
- * 

+ * Thread.wait(new Delay(24, HOUR)); // Assuming Thread.wait(Measurable<Duration>) method. + *

+ * * Although measurable instances are for the most part scalar quantities; more complex implementations (e.g. vectors, - * data set) are allowed as long as an aggregate magnitude can be determined. For example:[code] class Velocity3D - * implements Measurable { private double x, y, z; // Meter per seconds. public double - * doubleValue(Unit unit) { ... } // Returns vector norm. ... } class Sensors - * extends Measure { public doubleValue(Unit - * unit) { ... } // Returns median value. ... } [/code] - *

+ * data set) are allowed as long as an aggregate magnitude can be determined. For example: + * + *
+ * class Velocity3D implements Measurable<Velocity> {
+ *     private double x, y, z; // Meter per seconds.
+ *     public double doubleValue(Unit<Velocity> unit) { ... } // Returns vector norm.
+ *     ...
+ * }
  * 
+ * class Sensors<Q extends Quantity> extends Measure<double[], Q> {
+ *     public doubleValue(Unit<Q> unit) { ... } // Returns median value.
+ *     ...
+ * }
+ * 
+ * * @author Jean-Marie Dautelle * @version 4.1, June 8, 2007 */ @@ -42,7 +57,7 @@ public interface Measurable extends Comparable * Returns the value of this measurable stated in the specified unit as a double. If the measurable has * too great a magnitude to be represented as a double, it will be converted to * Double.NEGATIVE_INFINITY or Double.POSITIVE_INFINITY as appropriate. - * + * * @param unit * the unit in which this measurable value is stated. * @return the numeric value after conversion to type double. @@ -51,12 +66,12 @@ public interface Measurable extends Comparable /** * Returns the estimated integral value of this measurable stated in the specified unit as a long. - * + * *

* Note: This method differs from the Number.longValue() in the sense that the closest integer value is * returned and an ArithmeticException is raised instead of a bit truncation in case of overflow (safety critical). *

- * + * * @param unit * the unit in which the measurable value is stated. * @return the numeric value after conversion to type long. @@ -67,7 +82,7 @@ public interface Measurable extends Comparable /** * Adds the other Measurable to this one, returning a Measurable object of the same type as the original. - * + * * @param other * The measurable that should be added to this one. * @return A new measurable that contains the summed up value of this and the other one. diff --git a/flexiblepower.api/src/javax/measure/VectorMeasure.java b/flexiblepower.api/src/javax/measure/VectorMeasure.java index 0dd803a..3d76a9a 100644 --- a/flexiblepower.api/src/javax/measure/VectorMeasure.java +++ b/flexiblepower.api/src/javax/measure/VectorMeasure.java @@ -2,7 +2,7 @@ * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. * Copyright (C) 2007 - JScience (http://jscience.org/) * All rights reserved. - * + * * Permission to use, copy, modify, and distribute this software is * freely granted, provided that this notice is preserved. */ @@ -14,30 +14,35 @@ import javax.measure.unit.Unit; /** - *

- * This class represents a measurement vector of two or more dimensions. For example:[code] VectorMeasure - * dimension = VectorMeasure.valueOf(12.0, 30.0, 40.0, MILLIMETER); VectorMeasure v2d = - * VectorMeasure.valueOf(-2.2, -3.0, KNOTS); VectorMeasure c2d = VectorMeasure.valueOf(-7.3, 3.5, - * NANOAMPERE); [/code] - *

+ * This class represents a measurement vector of two or more dimensions. For example: + * + *
+ * VectorMeasure<Length> dimension = VectorMeasure.valueOf(12.0, 30.0, 40.0, MILLIMETER);
+ * VectorMeasure<Velocity> v2d = VectorMeasure.valueOf(-2.2, -3.0, KNOTS);
+ * VectorMeasure<ElectricCurrent> c2d = VectorMeasure.valueOf(-7.3, 3.5, NANOAMPERE);
+ * 
* - *

- * Subclasses may provide fixed dimensions specializations:[code] class Velocity2D extends VectorMeasure { - * public Velocity2D(double x, double y, Unit unit) { ... } } [/code] - *

+ * Subclasses may provide fixed dimensions specializations: * - *

- * Measurement vectors may use {@link CompoundUnit compound units}:[code] VectorMeasure latLong = - * VectorMeasure.valueOf(12.345, 22.23, DEGREE_ANGLE); Unit HOUR_MINUTE_SECOND_ANGLE = - * DEGREE_ANGLE.compound(MINUTE_ANGLE).compound(SECOND_ANGLE); System.out.println(latLong.to(HOUR_MINUTE_SECOND_ANGLE)); + *

+ * class Velocity2D extends VectorMeasure<Velocity> {
+ *     public Velocity2D(double x, double y, Unit<Velocity> unit) { ... }
+ * }
  * 
- * > [12°19'42", 22°12'48"] [/code]
- * 

+ *
+ * + * Measurement vectors may use {@link CompoundUnit compound units}: + * + *
+ * VectorMeasure<Angle> latLong = VectorMeasure.valueOf(12.345, 22.23, DEGREE_ANGLE);
+ * Unit<Angle> HOUR_MINUTE_SECOND_ANGLE = DEGREE_ANGLE.compound(MINUTE_ANGLE).compound(SECOND_ANGLE);
+ * System.out.println(latLong.to(HOUR_MINUTE_SECOND_ANGLE));
+ *
+ * > [12°19'42", 22°12'48"]
+ * 
* - *

* Instances of this class (and sub-classes) are immutable. - *

- * + * * @param * The quantity of the vector (e.g. Power) * @author Jean-Marie Dautelle @@ -73,7 +78,7 @@ public Measurable add(Measurable other) { /** * Returns a 2-dimensional measurement vector. - * + * * @param x * the first vector component value. * @param y @@ -87,7 +92,7 @@ public static VectorMeasure valueOf(double x, double y, /** * Returns a 3-dimensional measurement vector. - * + * * @param x * the first vector component value. * @param y @@ -103,7 +108,7 @@ public static VectorMeasure valueOf(double x, double y, /** * Returns a multi-dimensional measurement vector. - * + * * @param components * the vector component values. * @param unit @@ -115,7 +120,7 @@ public static VectorMeasure valueOf(double[] components, /** * Returns the measurement vector equivalent to this one but stated in the specified unit. - * + * * @param unit * the new measurement unit. * @return the vector measure stated in the specified unit. @@ -125,7 +130,7 @@ public static VectorMeasure valueOf(double[] components, /** * Returns the norm of this measurement vector stated in the specified unit. - * + * * @param unit * the unit in which the norm is stated. * @return |this| @@ -136,7 +141,7 @@ public static VectorMeasure valueOf(double[] components, /** * Returns the String representation of this measurement vector (for example * [2.3 m/s, 5.6 m/s]). - * + * * @return the textual representation of the measurement vector. */ @Override diff --git a/flexiblepower.api/src/javax/measure/converter/LogConverter.java b/flexiblepower.api/src/javax/measure/converter/LogConverter.java index 35d2f4e..2bbf483 100644 --- a/flexiblepower.api/src/javax/measure/converter/LogConverter.java +++ b/flexiblepower.api/src/javax/measure/converter/LogConverter.java @@ -2,22 +2,22 @@ * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. * Copyright (C) 2006 - JScience (http://jscience.org/) * All rights reserved. - * + * * Permission to use, copy, modify, and distribute this software is * freely granted, provided that this notice is preserved. */ package javax.measure.converter; /** - *

* This class represents a logarithmic converter. Such converter is typically used to create logarithmic unit. For - * example:[code] Unit BEL = Unit.ONE.transform(new LogConverter(10).inverse()); [/code] - *

- * - *

+ * example: + * + *

+ * Unit<Dimensionless> BEL = Unit.ONE.transform(new LogConverter(10).inverse());
+ * 
+ * * Instances of this class are immutable. - *

- * + * * @author Jean-Marie Dautelle * @version 3.1, April 22, 2006 */ @@ -45,7 +45,7 @@ public final class LogConverter extends UnitConverter { /** * Creates a logarithmic converter having the specified base. - * + * * @param base * the logarithmic base (e.g. Math.E for the Natural Logarithm). */ @@ -57,7 +57,7 @@ public LogConverter(double base) { /** * Returns the logarithmic base of this converter. - * + * * @return the logarithmic base (e.g. Math.E for the Natural Logarithm). */ public double getBase() { diff --git a/flexiblepower.api/src/javax/measure/unit/BaseUnit.java b/flexiblepower.api/src/javax/measure/unit/BaseUnit.java index ec03226..e99f6ee 100644 --- a/flexiblepower.api/src/javax/measure/unit/BaseUnit.java +++ b/flexiblepower.api/src/javax/measure/unit/BaseUnit.java @@ -2,7 +2,7 @@ * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. * Copyright (C) 2006 - JScience (http://jscience.org/) * All rights reserved. - * + * * Permission to use, copy, modify, and distribute this software is * freely granted, provided that this notice is preserved. */ @@ -16,18 +16,24 @@ * This class represents the building blocks on top of which all others units are created. Base units are typically * dimensionally independent. The actual unit dimension is determinated by the current {@link Dimension.Model model}. * For example using the {@link Dimension.Model#STANDARD standard} model, {@link SI#CANDELA} has the dimension of - * {@link SI#WATT watt}:[code] // Standard model. BaseUnit METER = new BaseUnit("m"); - * BaseUnit CANDELA = new BaseUnit("cd"); - * System.out.println(METER.getDimension()); System.out.println(CANDELA.getDimension()); - * - * > [L] > [L]²·[M]/[T]³ [/code] + * {@link SI#WATT watt}: + * + * + * // Standard model. + * BaseUnit<Length> METER = new BaseUnit<Length>("m"); + * BaseUnit<LuminousIntensity> CANDELA = new BaseUnit<LuminousIntensity>("cd"); + * System.out.println(METER.getDimension()); + * System.out.println(CANDELA.getDimension()); + * + * > [L] > [L]²·[M]/[T]³ + * *

*

* This class represents the "standard base units" which includes SI base units and possibly others user-defined base * units. It does not represent the base units of any specific {@link SystemOfUnits} (they would have be base units * accross all possible systems otherwise). *

- * + * * @author Jean-Marie Dautelle * @version 3.1, April 22, 2006 * @see Wikipedia: SI base unit @@ -41,7 +47,7 @@ public class BaseUnit extends Unit { /** * Creates a base unit having the specified symbol. - * + * * @param symbol * the symbol of this base unit. * @throws IllegalArgumentException @@ -64,7 +70,7 @@ public BaseUnit(String symbol) { /** * Returns the unique symbol for this base unit. - * + * * @return this base unit symbol. */ public final String getSymbol() { @@ -74,7 +80,7 @@ public final String getSymbol() { /** * Indicates if this base unit is considered equals to the specified object (both are base units with equal symbol, * standard dimension and standard transform). - * + * * @param that * the object to compare for equality. * @return true if this and that are considered equals; false diff --git a/flexiblepower.api/src/javax/measure/unit/CompoundUnit.java b/flexiblepower.api/src/javax/measure/unit/CompoundUnit.java index f65c02d..019b4a2 100644 --- a/flexiblepower.api/src/javax/measure/unit/CompoundUnit.java +++ b/flexiblepower.api/src/javax/measure/unit/CompoundUnit.java @@ -2,7 +2,7 @@ * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. * Copyright (C) 2006 - JScience (http://jscience.org/) * All rights reserved. - * + * * Permission to use, copy, modify, and distribute this software is * freely granted, provided that this notice is preserved. */ @@ -12,16 +12,16 @@ import javax.measure.quantity.Quantity; /** - *

* This class represents the multi-radix units (such as "hour:min:sec"). Instances of this class are created using the * {@link Unit#compound Unit.compound} method. - *

- * - *

- * Examples of compound units:[code] Unit HOUR_MINUTE_SECOND = HOUR.compound(MINUTE).compound(SECOND); - * Unit DEGREE_MINUTE_ANGLE = DEGREE_ANGLE.compound(MINUTE_ANGLE); [/code] - *

- * + * + * Examples of compound units: + * + *
+ * Unit<Duration> HOUR_MINUTE_SECOND = HOUR.compound(MINUTE).compound(SECOND);
+ * Unit<Angle> DEGREE_MINUTE_ANGLE = DEGREE_ANGLE.compound(MINUTE_ANGLE);
+ * 
+ * * @author Jean-Marie Dautelle * @version 3.1, April 22, 2006 */ @@ -39,7 +39,7 @@ public final class CompoundUnit extends DerivedUnit { /** * Creates a compound unit from the specified units. - * + * * @param high * the high unit. * @param low @@ -58,7 +58,7 @@ public final class CompoundUnit extends DerivedUnit { /** * Returns the lower unit of this compound unit. - * + * * @return the lower unit. */ public Unit getLower() { @@ -67,7 +67,7 @@ public Unit getLower() { /** * Returns the higher unit of this compound unit. - * + * * @return the higher unit. */ public Unit getHigher() { @@ -77,7 +77,7 @@ public Unit getHigher() { /** * Indicates if this compound unit is considered equals to the specified object (both are compound units with same * composing units in the same order). - * + * * @param that * the object to compare for equality. * @return true if this and that are considered equals; false diff --git a/flexiblepower.api/src/javax/measure/unit/Dimension.java b/flexiblepower.api/src/javax/measure/unit/Dimension.java index 320d561..25bff34 100644 --- a/flexiblepower.api/src/javax/measure/unit/Dimension.java +++ b/flexiblepower.api/src/javax/measure/unit/Dimension.java @@ -2,7 +2,7 @@ * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. * Copyright (C) 2006 - JScience (http://jscience.org/) * All rights reserved. - * + * * Permission to use, copy, modify, and distribute this software is * freely granted, provided that this notice is preserved. */ @@ -15,15 +15,11 @@ import javax.measure.quantity.Dimensionless; /** - *

* This class represents the dimension of an unit. Two units u1 and u2 are * {@link Unit#isCompatible compatible} if and only if (u1.getDimension().equals(u2.getDimension()))) - *

- * - *

+ * * Instances of this class are immutable. - *

- * + * * @author Jean-Marie Dautelle * @version 3.1, April 22, 2006 * @see Wikipedia: Dimensional Analysis @@ -77,7 +73,7 @@ public final class Dimension implements Serializable { /** * Creates a new dimension associated to the specified symbol. - * + * * @param symbol * the associated symbol. */ @@ -87,7 +83,7 @@ public Dimension(char symbol) { /** * Creates a dimension having the specified pseudo-unit (base unit or product of base unit). - * + * * @param pseudoUnit * the pseudo-unit identifying this dimension. */ @@ -97,7 +93,7 @@ private Dimension(Unit pseudoUnit) { /** * Returns the product of this dimension with the one specified. - * + * * @param that * the dimension multiplicand. * @return this * that @@ -108,7 +104,7 @@ public Dimension times(Dimension that) { /** * Returns the quotient of this dimension with the one specified. - * + * * @param that * the dimension divisor. * @return this / that @@ -119,7 +115,7 @@ public Dimension divide(Dimension that) { /** * Returns this dimension raised to an exponent. - * + * * @param n * the exponent. * @return the result of raising this dimension to the exponent. @@ -130,7 +126,7 @@ public Dimension pow(int n) { /** * Returns the given root of this dimension. - * + * * @param n * the root's order. * @return the result of taking the given root of this dimension. @@ -143,7 +139,7 @@ public Dimension root(int n) { /** * Returns the representation of this dimension. - * + * * @return the representation of this dimension. */ @Override @@ -153,7 +149,7 @@ public String toString() { /** * Indicates if the specified dimension is equals to the one specified. - * + * * @param that * the object to compare to. * @return true if this dimension is equals to that dimension; false otherwise. @@ -168,7 +164,7 @@ public boolean equals(Object that) { /** * Returns the hash code for this dimension. - * + * * @return this dimension hashcode value. */ @Override @@ -178,7 +174,7 @@ public int hashCode() { /** * Sets the model used to determinate the units dimensions. - * + * * @param model * the new model to be used when calculating unit dimensions. */ @@ -188,7 +184,7 @@ public static void setModel(Model model) { /** * Returns the model used to determinate the units dimensions (default {@link Model#STANDARD STANDARD}). - * + * * @return the model used when calculating unit dimensions. */ public static Model getModel() { @@ -197,20 +193,32 @@ public static Model getModel() { /** * This interface represents the mapping between {@link BaseUnit base units} and {@link Dimension dimensions}. - * Custom models may allow conversions not possible using the {@link #STANDARD standard} model. For example:[code] - * public static void main(String[] args) { Dimension.Model relativistic = new Dimension.Model() { RationalConverter - * meterToSecond = new RationalConverter(1, 299792458); // 1/c - * - * public Dimension getDimension(BaseUnit unit) { if (unit.equals(SI.METER)) return Dimension.TIME; return - * Dimension.Model.STANDARD.getDimension(unit); } + * Custom models may allow conversions not possible using the {@link #STANDARD standard} model. For example: + * + *
+     * public static void main(String[] args) {
+     *     Dimension.Model relativistic = new Dimension.Model() { 
+     *         RationalConverter meterToSecond = new RationalConverter(1, 299792458); // 1/c
+     *         
+     *         public Dimension getDimension(BaseUnit unit) { 
+     *             if (unit.equals(SI.METER)) return Dimension.TIME; 
+     *             else return Dimension.Model.STANDARD.getDimension(unit); 
+     *         }
      * 
-     * public UnitConverter getTransform(BaseUnit unit) { if (unit.equals(SI.METER)) return meterToSecond; return
-     * Dimension.Model.STANDARD.getTransform(unit); }}; Dimension.setModel(relativistic);
+     *         public UnitConverter getTransform(BaseUnit unit) { 
+     *             if (unit.equals(SI.METER)) return meterToSecond; 
+     *             else return Dimension.Model.STANDARD.getTransform(unit); 
+     *         }
+     *     };
+     *     
+     *     Dimension.setModel(relativistic);
      * 
-     * // Converts 1.0 GeV (energy) to kg (mass).
-     * System.out.println(Unit.valueOf("GeV").getConverterTo(KILOGRAM).convert(1.0)); }
+     *     // Converts 1.0 GeV (energy) to kg (mass).
+     *     System.out.println(Unit.valueOf("GeV").getConverterTo(KILOGRAM).convert(1.0)); 
+     * }
      * 
-     * > 1.7826617302520883E-27[/code]
+     * > 1.7826617302520883E-27
+     * 
*/ public interface Model { @@ -256,7 +264,7 @@ public UnitConverter getTransform(BaseUnit unit) { /** * Returns the dimension of the specified base unit (a dimension particular to the base unit if the base unit is * not recognized). - * + * * @param unit * the base unit for which the dimension is returned. * @return the dimension of the specified unit. @@ -266,7 +274,7 @@ public UnitConverter getTransform(BaseUnit unit) { /** * Returns the normalization transform of the specified base unit ({@link UnitConverter#IDENTITY IDENTITY} if * the base unit is not recognized). - * + * * @param unit * the base unit for which the transform is returned. * @return the normalization transform. diff --git a/flexiblepower.api/src/javax/measure/unit/SI.java b/flexiblepower.api/src/javax/measure/unit/SI.java index 505a90b..a835843 100644 --- a/flexiblepower.api/src/javax/measure/unit/SI.java +++ b/flexiblepower.api/src/javax/measure/unit/SI.java @@ -2,7 +2,7 @@ * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. * Copyright (C) 2006 - JScience (http://jscience.org/) * All rights reserved. - * + * * Permission to use, copy, modify, and distribute this software is * freely granted, provided that this notice is preserved. */ @@ -50,16 +50,18 @@ import javax.measure.quantity.Volume; /** - *

* This class contains SI (Système International d'Unités) base units, and derived units. - *

- * - *

- * It also defines the 20 SI prefixes used to form decimal multiples and submultiples of SI units. For example:[code] - * import static org.jscience.physics.units.SI.*; // Static import. ... Unit HECTO_PASCAL = HECTO(PASCAL); - * Unit KILO_METER = KILO(METER); [/code] - *

+ * + * It also defines the 20 SI prefixes used to form decimal multiples and submultiples of SI units. For example: + * + *
+ * import static javax.measure.unit.SI.*;
+ * ...
  * 
+ * Unit<Pressure> HECTO_PASCAL = HECTO(PASCAL);
+ * Unit<Length> KILO_METER = KILO(METER);
+ * 
+ * * @author Jean-Marie Dautelle * @version 4.2, August 26, 2006 * @see Wikipedia: SI @@ -80,7 +82,7 @@ private SI() { /** * Returns the unique instance of this class. - * + * * @return the SI instance. */ public static SI getInstance() { @@ -105,7 +107,7 @@ public static SI getInstance() { * The base unit for luminous intensity quantities (cd). The candela is the luminous intensity, in a * given direction, of a source that emits monochromatic radiation of frequency 540 × 1012 hertz and that has a * radiant intensity in that direction of 1/683 watt per steradian - * + * * @see Wikipedia: Candela */ public static final BaseUnit CANDELA = si(new BaseUnit("cd")); @@ -121,7 +123,7 @@ public static SI getInstance() { * The base unit for mass quantities (kg). It is the only SI unit with a prefix as part of its name and * symbol. The kilogram is equal to the mass of an international prototype in the form of a platinum-iridium * cylinder kept at Sevres in France. - * + * * @see #GRAM */ public static final BaseUnit KILOGRAM = si(new BaseUnit("kg")); @@ -391,7 +393,7 @@ public static SI getInstance() { /** * Returns the specified unit multiplied by the factor 1024 - * + * * @param unit * any unit. * @return unit.multiply(1e24). @@ -402,7 +404,7 @@ public static Unit YOTTA(Unit unit) { /** * Returns the specified unit multiplied by the factor 1021 - * + * * @param unit * any unit. * @return unit.multiply(1e21). @@ -413,7 +415,7 @@ public static Unit ZETTA(Unit unit) { /** * Returns the specified unit multiplied by the factor 1018 - * + * * @param unit * any unit. * @return unit.multiply(1e18). @@ -424,7 +426,7 @@ public static Unit EXA(Unit unit) { /** * Returns the specified unit multiplied by the factor 1015 - * + * * @param unit * any unit. * @return unit.multiply(1e15). @@ -435,7 +437,7 @@ public static Unit PETA(Unit unit) { /** * Returns the specified unit multiplied by the factor 1012 - * + * * @param unit * any unit. * @return unit.multiply(1e12). @@ -446,7 +448,7 @@ public static Unit TERA(Unit unit) { /** * Returns the specified unit multiplied by the factor 109 - * + * * @param unit * any unit. * @return unit.multiply(1e9). @@ -457,7 +459,7 @@ public static Unit GIGA(Unit unit) { /** * Returns the specified unit multiplied by the factor 106 - * + * * @param unit * any unit. * @return unit.multiply(1e6). @@ -468,7 +470,7 @@ public static Unit MEGA(Unit unit) { /** * Returns the specified unit multiplied by the factor 103 - * + * * @param unit * any unit. * @return unit.multiply(1e3). @@ -479,7 +481,7 @@ public static Unit KILO(Unit unit) { /** * Returns the specified unit multiplied by the factor 102 - * + * * @param unit * any unit. * @return unit.multiply(1e2). @@ -490,7 +492,7 @@ public static Unit HECTO(Unit unit) { /** * Returns the specified unit multiplied by the factor 101 - * + * * @param unit * any unit. * @return unit.multiply(1e1). @@ -501,7 +503,7 @@ public static Unit DEKA(Unit unit) { /** * Returns the specified unit multiplied by the factor 10-1 - * + * * @param unit * any unit. * @return unit.multiply(1e-1). @@ -512,7 +514,7 @@ public static Unit DECI(Unit unit) { /** * Returns the specified unit multiplied by the factor 10-2 - * + * * @param unit * any unit. * @return unit.multiply(1e-2). @@ -523,7 +525,7 @@ public static Unit CENTI(Unit unit) { /** * Returns the specified unit multiplied by the factor 10-3 - * + * * @param unit * any unit. * @return unit.multiply(1e-3). @@ -534,7 +536,7 @@ public static Unit MILLI(Unit unit) { /** * Returns the specified unit multiplied by the factor 10-6 - * + * * @param unit * any unit. * @return unit.multiply(1e-6). @@ -545,7 +547,7 @@ public static Unit MICRO(Unit unit) { /** * Returns the specified unit multiplied by the factor 10-9 - * + * * @param unit * any unit. * @return unit.multiply(1e-9). @@ -556,7 +558,7 @@ public static Unit NANO(Unit unit) { /** * Returns the specified unit multiplied by the factor 10-12 - * + * * @param unit * any unit. * @return unit.multiply(1e-12). @@ -567,7 +569,7 @@ public static Unit PICO(Unit unit) { /** * Returns the specified unit multiplied by the factor 10-15 - * + * * @param unit * any unit. * @return unit.multiply(1e-15). @@ -578,7 +580,7 @@ public static Unit FEMTO(Unit unit) { /** * Returns the specified unit multiplied by the factor 10-18 - * + * * @param unit * any unit. * @return unit.multiply(1e-18). @@ -589,7 +591,7 @@ public static Unit ATTO(Unit unit) { /** * Returns the specified unit multiplied by the factor 10-21 - * + * * @param unit * any unit. * @return unit.multiply(1e-21). @@ -600,7 +602,7 @@ public static Unit ZEPTO(Unit unit) { /** * Returns the specified unit multiplied by the factor 10-24 - * + * * @param unit * any unit. * @return unit.multiply(1e-24). @@ -615,7 +617,7 @@ public static Unit YOCTO(Unit unit) { /** * Returns a read only view over theunits defined in this class. - * + * * @return the collection of SI units. */ @Override @@ -625,7 +627,7 @@ public Set> getUnits() { /** * Adds a new unit to the collection. - * + * * @param unit * the unit being added. * @return unit. diff --git a/flexiblepower.api/src/javax/measure/unit/Unit.java b/flexiblepower.api/src/javax/measure/unit/Unit.java index 0839904..155b276 100644 --- a/flexiblepower.api/src/javax/measure/unit/Unit.java +++ b/flexiblepower.api/src/javax/measure/unit/Unit.java @@ -2,7 +2,7 @@ * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. * Copyright (C) 2006 - JScience (http://jscience.org/) * All rights reserved. - * + * * Permission to use, copy, modify, and distribute this software is * freely granted, provided that this notice is preserved. */ @@ -23,33 +23,23 @@ import javax.measure.quantity.Quantity; /** - *

* This class represents a determinate {@link javax.measure.quantity.Quantity quantity} (as of length, time, heat, or * value) adopted as a standard of measurement. - *

- * - *

+ * * It is helpful to think of instances of this class as recording the history by which they are created. Thus, for * example, the string "g/kg" (which is a dimensionless unit) would result from invoking the method toString() on a unit * that was created by dividing a gram unit by a kilogram unit. Yet, "kg" divided by "kg" returns {@link #ONE} and not * "kg/kg" due to automatic unit factorization. - *

- * - *

+ * * This class supports the multiplication of offsets units. The result is usually a unit not convertible to its * {@link #getStandardUnit standard unit}. Such units may appear in derivative quantities. For example °C/m is an unit * of gradient, which is common in atmospheric and oceanographic research. - *

- * - *

+ * * Units raised at rational powers are also supported. For example the cubic root of "liter" is a unit compatible with * meter. - *

- * - *

+ * * Instances of this class are immutable. - *

- * + * * @author Jean-Marie Dautelle * @author Steve Emmerson * @author Martin Desruisseaux @@ -84,29 +74,34 @@ protected Unit() { /** * Returns the {@link BaseUnit base unit}, {@link AlternateUnit alternate unit} or product of base units and * alternate units this unit is derived from. The standard unit identifies the "type" of - * {@link javax.measure.quantity.Quantity quantity} for which this unit is employed. For example:[code] boolean - * isAngularVelocity(Unit u) { return u.getStandardUnit().equals(RADIAN.divide(SECOND)); } - * assert(REVOLUTION.divide(MINUTE).isAngularVelocity()); [/code] - * + * {@link javax.measure.quantity.Quantity quantity} for which this unit is employed. For example: + * + *
+     * boolean isAngularVelocity(Unit<?> u) {
+     *   return u.getStandardUnit().equals(RADIAN.divide(SECOND));
+     * }
+     * assert(REVOLUTION.divide(MINUTE).isAngularVelocity());
+     * 
+ * *

* Note: Having the same system unit is not sufficient to ensure that a converter exists between the two units * (e.g. °C/m and K/m). *

- * + * * @return the system unit this unit is derived from. */ public abstract Unit getStandardUnit(); /** * Returns the converter from this unit to its system unit. - * + * * @return this.getConverterTo(this.getSystemUnit()) */ public abstract UnitConverter toStandardUnit(); /** * Returns the hash code for this unit. - * + * * @return this unit hashcode value. */ @Override @@ -114,7 +109,7 @@ protected Unit() { /** * Indicates if the specified unit can be considered equals to the one specified. - * + * * @param that * the object to compare to. * @return true if this unit is considered equal to that unit; false otherwise. @@ -125,7 +120,7 @@ protected Unit() { /** * Indicates if this unit is a standard unit (base units and alternate units are standard units). The standard unit * identifies the "type" of {@link javax.measure.quantity.Quantity quantity} for which the unit is employed. - * + * * @return getStandardUnit().equals(this) */ public boolean isStandardUnit() { @@ -135,7 +130,7 @@ public boolean isStandardUnit() { /** * Indicates if this unit is compatible with the unit specified. Units don't need to be equals to be compatible. For * example:[code] RADIAN.equals(ONE) == false RADIAN.isCompatible(ONE) == true [/code] - * + * * @param that * the other unit. * @return this.getDimension().equals(that.getDimension()) @@ -148,9 +143,12 @@ public final boolean isCompatible(Unit that) { /** * Casts this unit to a parameterized unit of specified nature or throw a ClassCastException if the - * dimension of the specified quantity and this unit's dimension do not match. For example:[code] Unit - * LIGHT_YEAR = NonSI.C.times(NonSI.YEAR).asType(Length.class); [/code] - * + * dimension of the specified quantity and this unit's dimension do not match. For example: + * + *
+     * Unit<Length> LIGHT_YEAR = NonSI.C.times(NonSI.YEAR).asType(Length.class);
+     * 
+ * * @param type * the quantity class identifying the nature of the unit. * @return this unit parameterized with the specified type. @@ -178,7 +176,7 @@ public final Unit asType(Class type) throws ClassCast /** * Returns the dimension of this unit (depends upon the current dimensional {@link Dimension.Model model}). - * + * * @return the dimension of this unit for the current model. */ public final Dimension getDimension() { @@ -202,7 +200,7 @@ public final Dimension getDimension() { /** * Returns a converter of numeric values from this unit to another unit. - * + * * @param that * the unit to which to convert the numeric values. * @return the converter from this unit to that unit. @@ -282,13 +280,15 @@ private static UnitConverter transformOf(Unit baseUnits) { /** * Returns a unit equivalent to this unit but used in expressions to distinguish between quantities of a different * nature but of the same dimensions. - * - *

- * Examples of alternate units:[code] Unit RADIAN = ONE.alternate("rad"); Unit NEWTON = - * METER.times(KILOGRAM).divide(SECOND.pow(2)).alternate("N"); Unit PASCAL = - * NEWTON.divide(METER.pow(2)).alternate("Pa"); [/code] - *

- * + * + * Examples of alternate units: + * + *
+     * Unit<Angle> RADIAN = ONE.alternate("rad");
+     * Unit<Force> NEWTON = METER.times(KILOGRAM).divide(SECOND.pow(2)).alternate("N");
+     * Unit<Pressure> PASCAL = NEWTON.divide(METER.pow(2)).alternate("Pa");
+     * 
+ * * @param symbol * the new symbol for the alternate unit. * @return the alternate unit. @@ -306,7 +306,7 @@ public final AlternateUnit alternate(String symbol) { * formatting purpose. Examples of compound units:[code] HOUR_MINUTE = NonSI.HOUR.compound(NonSI.MINUTE); * DEGREE_MINUTE_SECOND_ANGLE = NonSI.DEGREE_ANGLE.compound( NonSI.DEGREE_MINUTE).compound(NonSI.SECOND_ANGLE); * [/code] - * + * * @param subunit * the sub-unit to combine with this unit. * @return the corresponding compound unit. @@ -317,9 +317,13 @@ public final CompoundUnit compound(Unit subunit) { /** * Returns the unit derived from this unit using the specified converter. The converter does not need to be linear. - * For example:[code] Unit DECIBEL = Unit.ONE.transform( new LogConverter(10).inverse().concatenate( - * new RationalConverter(1, 10)));[/code] - * + * For example: + * + *
+     * Unit<Dimensionless> DECIBEL = Unit.ONE.transform(new LogConverter(10).inverse()
+     *                                                                      .concatenate(new RationalConverter(1, 10)));
+     * 
+ * * @param operation * the converter from the transformed unit to this unit. * @return the unit after the specified transformation. @@ -343,7 +347,7 @@ public final Unit transform(UnitConverter operation) { /** * Returns the result of adding an offset to this unit. The returned unit is convertible with all units that are * convertible with this unit. - * + * * @param offset * the offset added (expressed in this unit, e.g. CELSIUS = KELVIN.plus(273.15)). * @return this.transform(new AddConverter(offset)) @@ -354,7 +358,7 @@ public final Unit plus(double offset) { /** * Returns the result of multiplying this unit by an exact factor. - * + * * @param factor * the exact scale factor (e.g. KILOMETER = METER.times(1000)). * @return this.transform(new RationalConverter(factor, 1)) @@ -365,7 +369,7 @@ public final Unit times(long factor) { /** * Returns the result of multiplying this unit by a an approximate factor - * + * * @param factor * the approximate factor (e.g. ELECTRON_MASS = KILOGRAM.times(9.10938188e-31)). * @return this.transform(new MultiplyConverter(factor)) @@ -376,7 +380,7 @@ public final Unit times(double factor) { /** * Returns the product of this unit with the one specified. - * + * * @param that * the unit multiplicand. * @return this * that @@ -387,7 +391,7 @@ public final Unit times(Unit that) { /** * Returns the inverse of this unit. - * + * * @return 1 / this */ public final Unit inverse() { @@ -396,7 +400,7 @@ public final Unit inverse() { /** * Returns the result of dividing this unit by an exact divisor. - * + * * @param divisor * the exact divisor. (e.g. QUART = GALLON_LIQUID_US.divide(4)). * @return this.transform(new RationalConverter(1 , divisor)) @@ -407,7 +411,7 @@ public final Unit divide(long divisor) { /** * Returns the result of dividing this unit by an approximate divisor. - * + * * @param divisor * the approximate divisor. * @return this.transform(new MultiplyConverter(1.0 / divisor)) @@ -418,7 +422,7 @@ public final Unit divide(double divisor) { /** * Returns the quotient of this unit with the one specified. - * + * * @param that * the unit divisor. * @return this / that @@ -429,7 +433,7 @@ public final Unit divide(Unit that) { /** * Returns a unit equals to the given root of this unit. - * + * * @param n * the root's order. * @return the result of taking the given root of this unit. @@ -448,7 +452,7 @@ public final Unit root(int n) { /** * Returns a unit equals to this unit raised to an exponent. - * + * * @param n * the exponent. * @return the result of raising this unit to the exponent. @@ -466,16 +470,17 @@ public final Unit pow(int n) { /** * Returns a unit instance that is defined from the specified character sequence using the * {@link UnitFormat#getInstance() standard unit format}. - *

- * Examples of valid entries (all for meters per second squared) are:

    - *
  • m*s-2
  • - *
  • m/s²
  • - *
  • m·s-²
  • - *
  • m*s**-2
  • - *
  • m^+1 s^-2
  • - *
- *

- * + * + * Examples of valid entries (all for meters per second squared) are: + * + *
+     * m*s-2
+     * m/s²
+     * m·s-²
+     * m*s**-2
+     * m^+1 s^-2
+     * 
+ * * @param csq * the character sequence to parse. * @return UnitFormat.getStandardInstance().parse(csq, new ParsePosition(0)) @@ -498,7 +503,7 @@ public static Unit valueOf(CharSequence csq) { * Returns the standard String representation of this unit. This representation is not affected by * locale. Locale-sensitive unit formatting and parsing is handled by the {@link MeasureFormat} class and its * subclasses. - * + * * @return UnitFormat.getStandardInstance().format(this) */ @Override diff --git a/flexiblepower.api/src/org/flexiblepower/observation/ObservationProvider.java b/flexiblepower.api/src/org/flexiblepower/observation/ObservationProvider.java index d1804c2..1be6565 100644 --- a/flexiblepower.api/src/org/flexiblepower/observation/ObservationProvider.java +++ b/flexiblepower.api/src/org/flexiblepower/observation/ObservationProvider.java @@ -3,26 +3,29 @@ import org.flexiblepower.ral.ResourceDriver; /** - * The {@link ObservationProvider} is any object that wants to publish {@link Observation}s to + * The {@link ObservationProvider} is any object that wants to publish {@link Observation}s to a * {@link ObservationConsumer}. When using OSGi, there are a couple of properties that should be registered to make it - * easier for consumers to find the proper providers.
- * org.flexiblepower.monitoring.observedBy: describes the component that does the observations. Normally - * this will be the name of the component itself.
- * org.flexiblepower.monitoring.observationOf: describes the physical thing that it is observing. Normally - * this will be the resource identifier when using the {@link ResourceDriver}.
- * org.flexiblepower.monitoring.type: gives the full classname of the type of value that will be published - * by the provider.
- * org.flexiblepower.monitoring.type.X: for each attribute, the X is replaced by the name of the attribute - * (as will be returned by the {@link Observation#getValueMap() method} and the value is the type description, usually - * the classname.
- * org.flexiblepower.monitoring.type.X.unit: optionally describes the unit in which the attribute will be - * transformed. This is only relevant for raw values, like doubles or integers.
- * org.flexiblepower.monitoring.type.X.optional: optionally describes if an attribute is optional. By + * easier for consumers to find the proper providers. + * + *
    + *
  • org.flexiblepower.monitoring.observedBy: describes the component that does the observations. + * Normally this will be the name of the component itself. + *
  • org.flexiblepower.monitoring.observationOf: describes the physical thing that it is observing. + * Normally this will be the resource identifier when using the {@link ResourceDriver}. + *
  • org.flexiblepower.monitoring.type: gives the full classname of the type of value that will be + * published by the provider. + *
  • org.flexiblepower.monitoring.type.X: for each attribute, the X is replaced by the name of the + * attribute (as will be returned by the {@link Observation#getValueMap() method} and the value is the type description, + * usually the classname. + *
  • org.flexiblepower.monitoring.type.X.unit: optionally describes the unit in which the attribute will + * be transformed. This is only relevant for raw values, like doubles or integers. + *
  • org.flexiblepower.monitoring.type.X.optional: optionally describes if an attribute is optional. By * default the consumer may assume that all attributes are available each time, but by setting this to true it can * indicate otherwise. - * + *
+ * * @author TNO - * + * * @param * The type of value that will be in the published observations. */ @@ -31,7 +34,7 @@ public interface ObservationProvider { * Binds the consumer to this provider. After this call has returned, all the observations produced by the provider * should be sent to this consumer via its {@link ObservationConsumer#consume(ObservationProvider, Observation)} * method. - * + * * @param consumer * The {@link ObservationConsumer} that will be bound to this provider. */ @@ -40,7 +43,7 @@ public interface ObservationProvider { /** * Unbinds the consumer from this provider. After this call has returned, the observations must no longer be sent to * the consumer. - * + * * @param consumer * The {@link ObservationConsumer} that will be unbound from this provider. */ @@ -48,7 +51,7 @@ public interface ObservationProvider { /** * Get the last published {@link Observation}. - * + * * @return The last published observation, or null when no observation has been published yet. */ Observation getLastObservation(); diff --git a/flexiblepower.api/src/org/flexiblepower/rai/values/CommodityForecast.java b/flexiblepower.api/src/org/flexiblepower/rai/values/CommodityForecast.java index ef8cd4f..f79603e 100644 --- a/flexiblepower.api/src/org/flexiblepower/rai/values/CommodityForecast.java +++ b/flexiblepower.api/src/org/flexiblepower/rai/values/CommodityForecast.java @@ -80,9 +80,10 @@ public Builder heat(UncertainMeasure value) { } /** - * Uses the values as set by the {@link #duration(Measurable)}, {@link #electricity(Measurable)}, - * {@link #gas(Measurable)} and {@link #heat(Measurable)} methods to create a new element. This does not reset - * the values, so if you call this method again it will create a second element that is equal to the first. + * Uses the values as set by the {@link #duration(Measurable)}, {@link #electricity(UncertainMeasure)}, + * {@link #gas(UncertainMeasure)} and {@link #heat(UncertainMeasure)} methods to create a new element. This does + * not reset the values, so if you call this method again it will create a second element that is equal to the + * first. * * @return This builder * @throws IllegalArgumentException @@ -93,9 +94,9 @@ public Builder next() { throw new IllegalArgumentException("duration not set"); } elements.add(new CommodityForecast.Element(duration, - new CommodityUncertainMeasurables(electricityValue, - gasValue, - heatValue))); + new CommodityUncertainMeasurables(electricityValue, + gasValue, + heatValue))); return this; } @@ -169,7 +170,8 @@ public CommoditySet getCommodities() { } @Override - public Profile subProfile(Measurable offset, Measurable duration) { + public Profile + subProfile(Measurable offset, Measurable duration) { // TODO Needs to be implemented throw new UnsupportedOperationException(); } diff --git a/flexiblepower.api/src/org/flexiblepower/rai/values/ConstraintList.java b/flexiblepower.api/src/org/flexiblepower/rai/values/ConstraintList.java index d00550b..9e37b7c 100644 --- a/flexiblepower.api/src/org/flexiblepower/rai/values/ConstraintList.java +++ b/flexiblepower.api/src/org/flexiblepower/rai/values/ConstraintList.java @@ -11,8 +11,7 @@ /** * The {@link ConstraintList} is used as a method to describe several modes. It is most commonly used for representing - * different possible charge speeds in the {@link BufferControlSpace}. This is a list of several values or ranges of - * values. + * different possible charge speeds in a buffer. This is a list of several values or ranges of values. * * @param * The quantity of the values that are stored here. diff --git a/flexiblepower.api/src/org/flexiblepower/rai/values/Profile.java b/flexiblepower.api/src/org/flexiblepower/rai/values/Profile.java index 926a425..e3a4d4b 100644 --- a/flexiblepower.api/src/org/flexiblepower/rai/values/Profile.java +++ b/flexiblepower.api/src/org/flexiblepower/rai/values/Profile.java @@ -15,8 +15,6 @@ * * @param * The type of the values stored in the elements - * @param - * The type of the {@link ProfileElement} */ public abstract class Profile extends AbstractList> { /** @@ -85,7 +83,7 @@ public Measurable getTotalDuration() { * Find the element in the {@link Profile} at a specific offset * * @param offset - * Measurable of the offset to search for an element + * Measurable<Duration> of the offset to search for an element * @return The element of the profile at offset or null if the offset is bigger than the profile */ public Element getElementAtOffset(Measurable offset) { diff --git a/flexiblepower.api/src/org/flexiblepower/rai/values/UncertainMeasurableProfile.java b/flexiblepower.api/src/org/flexiblepower/rai/values/UncertainMeasurableProfile.java index a88d0cf..9758be3 100644 --- a/flexiblepower.api/src/org/flexiblepower/rai/values/UncertainMeasurableProfile.java +++ b/flexiblepower.api/src/org/flexiblepower/rai/values/UncertainMeasurableProfile.java @@ -33,7 +33,7 @@ public static final class Builder { * @param duration * The duration for the element * @return This builder - * @see #next() + * @see #add(UncertainMeasure) */ public Builder duration(Measurable duration) { this.duration = duration; diff --git a/flexiblepower.api/src/org/flexiblepower/ral/ResourceManager.java b/flexiblepower.api/src/org/flexiblepower/ral/ResourceManager.java index 5207e68..dbf04f7 100644 --- a/flexiblepower.api/src/org/flexiblepower/ral/ResourceManager.java +++ b/flexiblepower.api/src/org/flexiblepower/ral/ResourceManager.java @@ -4,10 +4,11 @@ import org.flexiblepower.messaging.Port; import org.flexiblepower.messaging.Ports; import org.flexiblepower.rai.Allocation; +import org.flexiblepower.rai.ResourceMessage; /** * The {@link ResourceManager} is responsible to translating the current state of an appliance (as received from a - * {@link ResourceDriver}) to {@link ControlSpace} messages and to translate the {@link Allocation}s to actions that are + * {@link ResourceDriver}) to {@link ResourceMessage}s to translate the {@link Allocation}s to actions that are * performed on the {@link ResourceDriver}. The {@link ResourceDriver} is dynamically connected to the * {@link ResourceManager} in OSGi, using the messaging framework in FPAI. For this it is expected for each * {@link ResourceManager} to define 2 ports: 1 for the link to the controller and 1 for the link to the driver. It is From 6323d1025be669915fec2060d6f18a83dc9ddd00 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Mon, 22 Dec 2014 16:24:14 +0100 Subject: [PATCH 027/105] Enabled checkstyle again on all the projects --- cnf/gradle | 2 +- flexiblepower.api.efi.utils/.checkstyle | 10 ++++++++++ flexiblepower.api.efi.utils/.project | 6 ++++++ flexiblepower.api.efi/.checkstyle | 10 ++++++++++ flexiblepower.api.efi/.project | 6 ++++++ flexiblepower.api.ext/.checkstyle | 4 ++-- flexiblepower.api.ext/.project | 5 +++++ flexiblepower.api/.checkstyle | 7 +++++-- flexiblepower.api/.project | 5 +++++ flexiblepower.felix.webconsole.plugins/.checkstyle | 4 ++-- flexiblepower.runtime.test/.checkstyle | 5 ++++- flexiblepower.runtime.test/.project | 6 ++++++ flexiblepower.runtime/.checkstyle | 4 ++-- flexiblepower.ui/.checkstyle | 4 ++-- 14 files changed, 66 insertions(+), 12 deletions(-) create mode 100644 flexiblepower.api.efi.utils/.checkstyle create mode 100644 flexiblepower.api.efi/.checkstyle diff --git a/cnf/gradle b/cnf/gradle index 74bdca5..a2a06c7 160000 --- a/cnf/gradle +++ b/cnf/gradle @@ -1 +1 @@ -Subproject commit 74bdca52191211dcde9776c75b6ee60a3313e9e0 +Subproject commit a2a06c7a5b0d50fec1716282d4dbef179c42b2ae diff --git a/flexiblepower.api.efi.utils/.checkstyle b/flexiblepower.api.efi.utils/.checkstyle new file mode 100644 index 0000000..99999c8 --- /dev/null +++ b/flexiblepower.api.efi.utils/.checkstyle @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/flexiblepower.api.efi.utils/.project b/flexiblepower.api.efi.utils/.project index 90999f3..f59608a 100644 --- a/flexiblepower.api.efi.utils/.project +++ b/flexiblepower.api.efi.utils/.project @@ -15,9 +15,15 @@ + + net.sf.eclipsecs.core.CheckstyleBuilder + + + org.eclipse.jdt.core.javanature bndtools.core.bndnature + net.sf.eclipsecs.core.CheckstyleNature diff --git a/flexiblepower.api.efi/.checkstyle b/flexiblepower.api.efi/.checkstyle new file mode 100644 index 0000000..99999c8 --- /dev/null +++ b/flexiblepower.api.efi/.checkstyle @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/flexiblepower.api.efi/.project b/flexiblepower.api.efi/.project index 90999f3..f59608a 100644 --- a/flexiblepower.api.efi/.project +++ b/flexiblepower.api.efi/.project @@ -15,9 +15,15 @@ + + net.sf.eclipsecs.core.CheckstyleBuilder + + + org.eclipse.jdt.core.javanature bndtools.core.bndnature + net.sf.eclipsecs.core.CheckstyleNature diff --git a/flexiblepower.api.ext/.checkstyle b/flexiblepower.api.ext/.checkstyle index aadbdc2..99999c8 100644 --- a/flexiblepower.api.ext/.checkstyle +++ b/flexiblepower.api.ext/.checkstyle @@ -1,10 +1,10 @@ - + - + diff --git a/flexiblepower.api.ext/.project b/flexiblepower.api.ext/.project index 1663d9d..7a29b91 100644 --- a/flexiblepower.api.ext/.project +++ b/flexiblepower.api.ext/.project @@ -15,6 +15,11 @@ + + net.sf.eclipsecs.core.CheckstyleBuilder + + + org.eclipse.jdt.core.javanature diff --git a/flexiblepower.api/.checkstyle b/flexiblepower.api/.checkstyle index aadbdc2..c6432ad 100644 --- a/flexiblepower.api/.checkstyle +++ b/flexiblepower.api/.checkstyle @@ -1,10 +1,13 @@ - + - + + + + diff --git a/flexiblepower.api/.project b/flexiblepower.api/.project index 6cafab9..aaac879 100644 --- a/flexiblepower.api/.project +++ b/flexiblepower.api/.project @@ -15,6 +15,11 @@ + + net.sf.eclipsecs.core.CheckstyleBuilder + + + org.eclipse.jdt.core.javanature diff --git a/flexiblepower.felix.webconsole.plugins/.checkstyle b/flexiblepower.felix.webconsole.plugins/.checkstyle index aadbdc2..99999c8 100644 --- a/flexiblepower.felix.webconsole.plugins/.checkstyle +++ b/flexiblepower.felix.webconsole.plugins/.checkstyle @@ -1,10 +1,10 @@ - + - + diff --git a/flexiblepower.runtime.test/.checkstyle b/flexiblepower.runtime.test/.checkstyle index 9b233d4..99999c8 100644 --- a/flexiblepower.runtime.test/.checkstyle +++ b/flexiblepower.runtime.test/.checkstyle @@ -1,7 +1,10 @@ - + + + + diff --git a/flexiblepower.runtime.test/.project b/flexiblepower.runtime.test/.project index bb765db..7111d75 100644 --- a/flexiblepower.runtime.test/.project +++ b/flexiblepower.runtime.test/.project @@ -15,9 +15,15 @@ + + net.sf.eclipsecs.core.CheckstyleBuilder + + + org.eclipse.jdt.core.javanature bndtools.core.bndnature + net.sf.eclipsecs.core.CheckstyleNature diff --git a/flexiblepower.runtime/.checkstyle b/flexiblepower.runtime/.checkstyle index aadbdc2..99999c8 100644 --- a/flexiblepower.runtime/.checkstyle +++ b/flexiblepower.runtime/.checkstyle @@ -1,10 +1,10 @@ - + - + diff --git a/flexiblepower.ui/.checkstyle b/flexiblepower.ui/.checkstyle index aadbdc2..99999c8 100644 --- a/flexiblepower.ui/.checkstyle +++ b/flexiblepower.ui/.checkstyle @@ -1,10 +1,10 @@ - + - + From c6e86b50e00b8bf3beabf914e3f06ccc46ed859e Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Mon, 22 Dec 2014 16:29:42 +0100 Subject: [PATCH 028/105] Removed old ant build files (no longer needed) --- flexiblepower.api.efi.utils/build.xml | 4 ---- flexiblepower.api.efi/build.xml | 4 ---- flexiblepower.api.ext/build.xml | 4 ---- flexiblepower.api/build.xml | 4 ---- flexiblepower.felix.webconsole.plugins/build.xml | 7 ------- flexiblepower.runtime.test/build.xml | 8 -------- flexiblepower.runtime/build.xml | 4 ---- flexiblepower.ui/build.xml | 4 ---- 8 files changed, 39 deletions(-) delete mode 100644 flexiblepower.api.efi.utils/build.xml delete mode 100644 flexiblepower.api.efi/build.xml delete mode 100644 flexiblepower.api.ext/build.xml delete mode 100644 flexiblepower.api/build.xml delete mode 100644 flexiblepower.felix.webconsole.plugins/build.xml delete mode 100644 flexiblepower.runtime.test/build.xml delete mode 100644 flexiblepower.runtime/build.xml delete mode 100644 flexiblepower.ui/build.xml diff --git a/flexiblepower.api.efi.utils/build.xml b/flexiblepower.api.efi.utils/build.xml deleted file mode 100644 index a1f3bf3..0000000 --- a/flexiblepower.api.efi.utils/build.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/flexiblepower.api.efi/build.xml b/flexiblepower.api.efi/build.xml deleted file mode 100644 index 1f3a2bf..0000000 --- a/flexiblepower.api.efi/build.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/flexiblepower.api.ext/build.xml b/flexiblepower.api.ext/build.xml deleted file mode 100644 index fc1cc8b..0000000 --- a/flexiblepower.api.ext/build.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/flexiblepower.api/build.xml b/flexiblepower.api/build.xml deleted file mode 100644 index 1c84ab8..0000000 --- a/flexiblepower.api/build.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/flexiblepower.felix.webconsole.plugins/build.xml b/flexiblepower.felix.webconsole.plugins/build.xml deleted file mode 100644 index bec58d0..0000000 --- a/flexiblepower.felix.webconsole.plugins/build.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/flexiblepower.runtime.test/build.xml b/flexiblepower.runtime.test/build.xml deleted file mode 100644 index ceda4f4..0000000 --- a/flexiblepower.runtime.test/build.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/flexiblepower.runtime/build.xml b/flexiblepower.runtime/build.xml deleted file mode 100644 index 2402664..0000000 --- a/flexiblepower.runtime/build.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/flexiblepower.ui/build.xml b/flexiblepower.ui/build.xml deleted file mode 100644 index b17558b..0000000 --- a/flexiblepower.ui/build.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - From 249fe7a0bb49ffddc26c9db0f763acdb66ddecc8 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Mon, 22 Dec 2014 16:36:06 +0100 Subject: [PATCH 029/105] Make sure the javax.measure package is ignored in checkstyle --- flexiblepower.api/build.gradle | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 flexiblepower.api/build.gradle diff --git a/flexiblepower.api/build.gradle b/flexiblepower.api/build.gradle new file mode 100644 index 0000000..11f13b0 --- /dev/null +++ b/flexiblepower.api/build.gradle @@ -0,0 +1,2 @@ +checkstyleMain.exclude '**/javax/measure/**' + From be6d0f039c2a93d37dffba8151472edea1f05e3e Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Mon, 22 Dec 2014 16:54:42 +0100 Subject: [PATCH 030/105] Updated gradle --- cnf/gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnf/gradle b/cnf/gradle index a2a06c7..53843d0 160000 --- a/cnf/gradle +++ b/cnf/gradle @@ -1 +1 @@ -Subproject commit a2a06c7a5b0d50fec1716282d4dbef179c42b2ae +Subproject commit 53843d09b8de17ad481f8fffc6a809b39dae9b3c From 550af1809f6f1f55363722f8ed0cef701792618e Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Mon, 22 Dec 2014 20:30:39 +0100 Subject: [PATCH 031/105] Updated shared configuration and fixed the root project name --- cnf/gradle | 2 +- settings.gradle | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/cnf/gradle b/cnf/gradle index 53843d0..e500fb9 160000 --- a/cnf/gradle +++ b/cnf/gradle @@ -1 +1 @@ -Subproject commit 53843d09b8de17ad481f8fffc6a809b39dae9b3c +Subproject commit e500fb95d426a709790ba25eb46c1cce697aa1b4 diff --git a/settings.gradle b/settings.gradle index dc0840a..91218b6 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,3 @@ apply from: file("${bnd_cnf_shared}/init.gradle") +rootProject.name = 'fpai-core' + From 044a70dc295d2570ed4fc08f830cc05ce8cea9cc Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Mon, 22 Dec 2014 21:34:01 +0100 Subject: [PATCH 032/105] Update shared-config --- cnf/gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnf/gradle b/cnf/gradle index e500fb9..4459795 160000 --- a/cnf/gradle +++ b/cnf/gradle @@ -1 +1 @@ -Subproject commit e500fb95d426a709790ba25eb46c1cce697aa1b4 +Subproject commit 4459795202bdffcb451b70c8c41679b353c12eb3 From f85fc9efbf8bfe480287e59283bfffa7924704e9 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 23 Dec 2014 00:00:43 +0100 Subject: [PATCH 033/105] Fixed counting the incoming messages in the listener in the test --- .../runtime/wiring/test/EndpointTester.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java b/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java index 3b47575..50a2d0e 100644 --- a/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java +++ b/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java @@ -6,6 +6,7 @@ import java.util.Iterator; import java.util.List; import java.util.SortedMap; +import java.util.concurrent.atomic.AtomicInteger; import junit.framework.TestCase; @@ -47,7 +48,7 @@ public TestEndpoint(String expectedPortName, Object sendMessage, Object expected this.expectedMessage = expectedMessage; } - boolean connected = false; + private boolean connected = false; @Override public MessageHandler onConnect(Connection connection) { @@ -628,20 +629,29 @@ public void testMissingImplementation() throws Exception { public static class CountingMessageListener implements MessageListener { private final int expectedCount; - private int count; + private final AtomicInteger count = new AtomicInteger(0); public CountingMessageListener(int expectedCount) { this.expectedCount = expectedCount; } - public void check() { - assertEquals(expectedCount, count); + public synchronized void check() { + while (count.get() < expectedCount) { + try { + wait(SLEEP_TIME); + break; // If no message has been received for some time, assume it failed + } catch (InterruptedException e) { + // Hopefully this happens and we can check again + } + } + assertEquals(expectedCount, count.get()); } @Override - public void handleMessage(EndpointPort from, EndpointPort to, Object message) { + public synchronized void handleMessage(EndpointPort from, EndpointPort to, Object message) { System.out.println(from.toString() + " -> " + to.toString() + " : " + message.toString()); - count++; + count.incrementAndGet(); + notifyAll(); } } From ec112b9adac5ccfe456f59579828c31cbe855742 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 23 Dec 2014 10:24:49 +0100 Subject: [PATCH 034/105] Fixed travis.yml for gradle --- .travis.yml | 1 - flexiblepower.api/build.gradle | 1 - 2 files changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9f1313e..f16e7d5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,4 +2,3 @@ language: java jdk: - openjdk6 - oraclejdk7 -script: ant -f cnf/build-master.xml snapshot diff --git a/flexiblepower.api/build.gradle b/flexiblepower.api/build.gradle index 11f13b0..7c2d9e3 100644 --- a/flexiblepower.api/build.gradle +++ b/flexiblepower.api/build.gradle @@ -1,2 +1 @@ checkstyleMain.exclude '**/javax/measure/**' - From 7fe5b88d2c6df25b1d74f6bfdfe1643dbb4cc9ed Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 23 Dec 2014 12:40:43 +0100 Subject: [PATCH 035/105] Added deployment generation --- cnf/deployment/etc/all.policy | 3 +++ cnf/deployment/etc/logback.xml | 26 +++++++++++++++++++++++ cnf/deployment/org.apache.felix.main.jar | Bin 0 -> 538830 bytes cnf/deployment/run.bat | 11 ++++++++++ cnf/deployment/run.sh | 9 ++++++++ cnf/gradle | 2 +- 6 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 cnf/deployment/etc/all.policy create mode 100644 cnf/deployment/etc/logback.xml create mode 100644 cnf/deployment/org.apache.felix.main.jar create mode 100644 cnf/deployment/run.bat create mode 100644 cnf/deployment/run.sh diff --git a/cnf/deployment/etc/all.policy b/cnf/deployment/etc/all.policy new file mode 100644 index 0000000..c26e27b --- /dev/null +++ b/cnf/deployment/etc/all.policy @@ -0,0 +1,3 @@ +grant { + permission java.security.AllPermission; +}; \ No newline at end of file diff --git a/cnf/deployment/etc/logback.xml b/cnf/deployment/etc/logback.xml new file mode 100644 index 0000000..6ec8a98 --- /dev/null +++ b/cnf/deployment/etc/logback.xml @@ -0,0 +1,26 @@ + + + + WARN + + + %d{HH:mm:ss.SSS} %-5level %-36.36logger{36} - %msg%n + + + + log/fpai.log + + log/fpai.%d{yyyy-MM-dd}.log + 30 + + + %d{HH:mm:ss.SSS} %-5level %-36.36logger{36} - %msg%n + + + + + + + + + diff --git a/cnf/deployment/org.apache.felix.main.jar b/cnf/deployment/org.apache.felix.main.jar new file mode 100644 index 0000000000000000000000000000000000000000..59a26a63b5efa6adf17bb0ff6bf770e7383e90a7 GIT binary patch literal 538830 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ⅈKhP1$Jtu^3-`E!| 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
N;F;G{qe`d{-n$6f$pkZHXXUuP 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 UD*(MM5nmGO4hB-b4F2o?01&Vgf&c&j literal 0 HcmV?d00001 diff --git a/cnf/deployment/run.bat b/cnf/deployment/run.bat new file mode 100644 index 0000000..b253f45 --- /dev/null +++ b/cnf/deployment/run.bat @@ -0,0 +1,11 @@ +@echo off +title Starting the PowerMatcher Suite +echo Starting the PowerMatcher Suite +echo Running from %CD% + +start "PowerMatcher Suite" java ^ + -Djava.security.policy=etc/all.policy ^ + -Dfelix.config.properties=file:etc/config.properties ^ + -Dfelix.cm.dir="%CD%\config" ^ + -Dlogback.configurationFile=etc/logback.xml ^ + -jar org.apache.felix.main.jar diff --git a/cnf/deployment/run.sh b/cnf/deployment/run.sh new file mode 100644 index 0000000..7cd1bf3 --- /dev/null +++ b/cnf/deployment/run.sh @@ -0,0 +1,9 @@ +#!/bin/bash +echo Running from `pwd` + +java \ + -Djava.security.policy=etc/all.policy \ + -Dfelix.config.properties=file:etc/config.properties \ + -Dfelix.cm.dir="`pwd`/config" \ + -Dlogback.configurationFile=etc/logback.xml \ + -jar org.apache.felix.main.jar diff --git a/cnf/gradle b/cnf/gradle index 4459795..b179f3c 160000 --- a/cnf/gradle +++ b/cnf/gradle @@ -1 +1 @@ -Subproject commit 4459795202bdffcb451b70c8c41679b353c12eb3 +Subproject commit b179f3c5769c41a69207f07ceff3ffe60ea72cfb From 9f34307e15ba35fc2588ad216c3ab46ef5470c42 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 23 Dec 2014 13:20:24 +0100 Subject: [PATCH 036/105] Ignoring runtime.test for deployment --- cnf/gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnf/gradle b/cnf/gradle index b179f3c..d3f7918 160000 --- a/cnf/gradle +++ b/cnf/gradle @@ -1 +1 @@ -Subproject commit b179f3c5769c41a69207f07ceff3ffe60ea72cfb +Subproject commit d3f79182256f9e0bb3037703eeacff8ae6883e0f From adc0f0fd0e735945d6b8c89552a80c093412a1a7 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 23 Dec 2014 14:01:32 +0100 Subject: [PATCH 037/105] Moved the checkstyle configuration --- cnf/gradle | 2 +- flexiblepower.api.efi/.checkstyle | 2 +- flexiblepower.api.ext/.checkstyle | 2 +- flexiblepower.api/.checkstyle | 2 +- flexiblepower.felix.webconsole.plugins/.checkstyle | 2 +- flexiblepower.runtime.test/.checkstyle | 2 +- flexiblepower.runtime/.checkstyle | 2 +- flexiblepower.ui.connectionspage/.checkstyle | 4 ++-- flexiblepower.ui/.checkstyle | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cnf/gradle b/cnf/gradle index d3f7918..fd1eb06 160000 --- a/cnf/gradle +++ b/cnf/gradle @@ -1 +1 @@ -Subproject commit d3f79182256f9e0bb3037703eeacff8ae6883e0f +Subproject commit fd1eb063eae8f2c40206970cfdb19dcf46dbd66b diff --git a/flexiblepower.api.efi/.checkstyle b/flexiblepower.api.efi/.checkstyle index 99999c8..c2c11f5 100644 --- a/flexiblepower.api.efi/.checkstyle +++ b/flexiblepower.api.efi/.checkstyle @@ -1,7 +1,7 @@ - + diff --git a/flexiblepower.api.ext/.checkstyle b/flexiblepower.api.ext/.checkstyle index 99999c8..c2c11f5 100644 --- a/flexiblepower.api.ext/.checkstyle +++ b/flexiblepower.api.ext/.checkstyle @@ -1,7 +1,7 @@ - + diff --git a/flexiblepower.api/.checkstyle b/flexiblepower.api/.checkstyle index c6432ad..60f3b8d 100644 --- a/flexiblepower.api/.checkstyle +++ b/flexiblepower.api/.checkstyle @@ -1,7 +1,7 @@ - + diff --git a/flexiblepower.felix.webconsole.plugins/.checkstyle b/flexiblepower.felix.webconsole.plugins/.checkstyle index 99999c8..c2c11f5 100644 --- a/flexiblepower.felix.webconsole.plugins/.checkstyle +++ b/flexiblepower.felix.webconsole.plugins/.checkstyle @@ -1,7 +1,7 @@ - + diff --git a/flexiblepower.runtime.test/.checkstyle b/flexiblepower.runtime.test/.checkstyle index 99999c8..c2c11f5 100644 --- a/flexiblepower.runtime.test/.checkstyle +++ b/flexiblepower.runtime.test/.checkstyle @@ -1,7 +1,7 @@ - + diff --git a/flexiblepower.runtime/.checkstyle b/flexiblepower.runtime/.checkstyle index 99999c8..c2c11f5 100644 --- a/flexiblepower.runtime/.checkstyle +++ b/flexiblepower.runtime/.checkstyle @@ -1,7 +1,7 @@ - + diff --git a/flexiblepower.ui.connectionspage/.checkstyle b/flexiblepower.ui.connectionspage/.checkstyle index aadbdc2..c2c11f5 100644 --- a/flexiblepower.ui.connectionspage/.checkstyle +++ b/flexiblepower.ui.connectionspage/.checkstyle @@ -1,10 +1,10 @@ - + - + diff --git a/flexiblepower.ui/.checkstyle b/flexiblepower.ui/.checkstyle index 99999c8..c2c11f5 100644 --- a/flexiblepower.ui/.checkstyle +++ b/flexiblepower.ui/.checkstyle @@ -1,7 +1,7 @@ - + From c91a1a7dee0ce9c6be378035900fd5f60c9f8f5b Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 23 Dec 2014 14:27:20 +0100 Subject: [PATCH 038/105] Renamed the logger (checkstyle warning) --- .../scheduling/SimulatedScheduleService.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/flexiblepower.runtime/src/org/flexiblepower/simulation/scheduling/SimulatedScheduleService.java b/flexiblepower.runtime/src/org/flexiblepower/simulation/scheduling/SimulatedScheduleService.java index caff19d..6f70803 100644 --- a/flexiblepower.runtime/src/org/flexiblepower/simulation/scheduling/SimulatedScheduleService.java +++ b/flexiblepower.runtime/src/org/flexiblepower/simulation/scheduling/SimulatedScheduleService.java @@ -23,7 +23,7 @@ @Component(provide = { ScheduledExecutorService.class, TimeService.class, Simulation.class }) public class SimulatedScheduleService implements ScheduledExecutorService, TimeService, Simulation, Runnable { - private static final Logger log = LoggerFactory.getLogger(SimulatedScheduleService.class); + private static final Logger logger = LoggerFactory.getLogger(SimulatedScheduleService.class); private volatile boolean running; private final Thread thread; @@ -124,23 +124,23 @@ public void run() { if (simulationClock.isRunning() || simulationClock.isStopping()) { synchronized (this) { long now = simulationClock.getCurrentTimeMillis(); - log.trace("Simulation step {}", now); + logger.trace("Simulation step {}", now); long waitTime = getNextJobTime() - now; if (waitTime <= 0) { Job job = jobs.remove(); currentTime = Math.max(currentTime, job.getTimeOfNextRun()); - log.trace("Executing {}", job); + logger.trace("Executing {}", job); job.run(); if (!job.isDone()) { jobs.add(job); - log.trace("Rescheduling {}", job); + logger.trace("Rescheduling {}", job); } } else if (simulationClock.isStopping()) { - log.trace("Stopping simulation clock"); + logger.trace("Stopping simulation clock"); simulationClock.stop(); } else { long sleepTime = (long) (waitTime / simulationClock.getSpeedFactor()); - log.trace("Sleeping {}ms until next job", sleepTime); + logger.trace("Sleeping {}ms until next job", sleepTime); try { if (sleepTime > 0) { isWaiting = true; @@ -181,7 +181,7 @@ public synchronized void startSimulation(Date startTime, double speedFactor) { @Override public synchronized void startSimulation(Date startTime, Date stopTime, double speedFactor) { - log.trace("Starting simulation @ {} until {} with factor {}", startTime, stopTime, speedFactor); + logger.trace("Starting simulation @ {} until {} with factor {}", startTime, stopTime, speedFactor); Job[] oldJobs = jobs.toArray(new Job[jobs.size()]); jobs.clear(); @@ -201,7 +201,7 @@ public synchronized void startSimulation(Date startTime, Date stopTime, double s @Override public synchronized void stopSimulation() { - log.trace("Signaling the end of the simulation @ {}", simulationClock.getCurrentTimeMillis()); + logger.trace("Signaling the end of the simulation @ {}", simulationClock.getCurrentTimeMillis()); simulationClock.stop(); notifyAll(); } @@ -215,13 +215,13 @@ public synchronized void changeSpeedFactor(double newSpeedFactor) { @Override public synchronized void pause() { - log.trace("Pause @ {}", simulationClock.getCurrentTimeMillis()); + logger.trace("Pause @ {}", simulationClock.getCurrentTimeMillis()); simulationClock.pause(); } @Override public synchronized void unpause() { - log.trace("Unpause @ {}", simulationClock.getCurrentTimeMillis()); + logger.trace("Unpause @ {}", simulationClock.getCurrentTimeMillis()); simulationClock.unpause(); notifyAll(); } From 5c18151480621ac946bc6c158bb774e51d50c1f2 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 23 Dec 2014 14:27:36 +0100 Subject: [PATCH 039/105] Made the test more robust, no longer dependant on waiting --- .../simulation/test/SchedulerTest.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/flexiblepower.runtime/test/org/flexiblepower/simulation/test/SchedulerTest.java b/flexiblepower.runtime/test/org/flexiblepower/simulation/test/SchedulerTest.java index 5a20af1..76d5e3e 100644 --- a/flexiblepower.runtime/test/org/flexiblepower/simulation/test/SchedulerTest.java +++ b/flexiblepower.runtime/test/org/flexiblepower/simulation/test/SchedulerTest.java @@ -4,13 +4,13 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import junit.framework.Assert; import junit.framework.TestCase; +import org.flexiblepower.simulation.Simulation; import org.flexiblepower.simulation.scheduling.SimulatedScheduleService; public class SchedulerTest extends TestCase { - public void testRecurringTask() { + public void testRecurringTask() throws InterruptedException { SimulatedScheduleService scheduler = new SimulatedScheduleService(); scheduler.activate(); @@ -22,17 +22,20 @@ public void run() { } }, 0, 1, TimeUnit.SECONDS); - Date d1_1_2012 = new Date(1325376000000l); + Date startDate = new Date(1325376000000L); // 01-01-2012 00:00:00.000 + Date endDate = new Date(1325376059999L); // 01-01-2012 00:00:59.999 runCounter.set(0); - scheduler.startSimulation(d1_1_2012, 2); - try { - Thread.sleep(2250); - } catch (InterruptedException e) { + scheduler.startSimulation(startDate, endDate, 60); + long startTime = System.currentTimeMillis(); + while (scheduler.getSimulationClockState() != Simulation.State.STOPPED) { + Thread.sleep(10); } - scheduler.stopSimulation(); + long duration = System.currentTimeMillis() - startTime; - Assert.assertEquals(5, runCounter.get()); + assertEquals(60, runCounter.get()); + System.out.printf("Running took %dms, expected around 1 sec%n", duration); + assertTrue(duration > 950 && duration < 1150); } } From b0f828b666e5f33f3956b34650e04261dc2adc0c Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 23 Dec 2014 14:46:15 +0100 Subject: [PATCH 040/105] Fixed waiting for the messages in the MessageListener test --- .../runtime/wiring/test/EndpointTester.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java b/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java index 50a2d0e..c62140a 100644 --- a/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java +++ b/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java @@ -638,10 +638,12 @@ public CountingMessageListener(int expectedCount) { public synchronized void check() { while (count.get() < expectedCount) { try { + long now = System.currentTimeMillis(); wait(SLEEP_TIME); - break; // If no message has been received for some time, assume it failed + if (System.currentTimeMillis() - now >= SLEEP_TIME) { + break; // If no message has been received for some time, assume it failed + } } catch (InterruptedException e) { - // Hopefully this happens and we can check again } } assertEquals(expectedCount, count.get()); @@ -650,8 +652,9 @@ public synchronized void check() { @Override public synchronized void handleMessage(EndpointPort from, EndpointPort to, Object message) { System.out.println(from.toString() + " -> " + to.toString() + " : " + message.toString()); - count.incrementAndGet(); - notifyAll(); + if (count.incrementAndGet() == expectedCount) { + notifyAll(); + } } } From 90604d36b9d08a82c1da21428ac738c58fe16023 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 23 Dec 2014 15:21:43 +0100 Subject: [PATCH 041/105] Moved generation of the deployment ZIP to this specific build.gradle --- build.gradle | 108 ++++++++++++++++++ cnf/gradle | 2 +- .../runtime/wiring/test/EndpointTester.java | 4 +- 3 files changed, 111 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 89781e8..592b6b9 100644 --- a/build.gradle +++ b/build.gradle @@ -1 +1,109 @@ apply from: rootProject.file("${bnd_cnf_shared}/master.gradle") + +import aQute.bnd.deployer.repository.* +import java.io.* +import java.util.zip.* + +/* Add bnd as a script dependency */ +buildscript { + dependencies { + classpath files(bndURI, bndRepoURI) + } +} + +// These methods are used to generate a deployment zip file +def zipDir(ZipOutputStream zos, File dir) { + def topDirLength = dir.absolutePath.length() + 1 + dir.eachFileRecurse { file -> + def relative = file.absolutePath.substring(topDirLength).replaceAll('\\\\', '/') + if ( file.isDirectory() && !relative.endsWith('/')){ + relative += "/" + } + + ZipEntry entry = new ZipEntry(relative) + entry.time = file.lastModified() + zos.putNextEntry(entry) + if(file.isFile()) { + zos << new FileInputStream(file) + } + } +} + +def zipFiles(ZipOutputStream zos, Iterable files, String baseDir) { + return files.collect { file -> + def name = "${baseDir}/${file.name}" + zos.putNextEntry(new ZipEntry(name)) + zos << new FileInputStream(file) + return name + } +} + +def downloadRepo(ZipOutputStream zos, String url) { + def repo = new FixedIndexedRepo() + repo.setProperties(["locations": url]) + zipFiles(zos, + repo.list(null).collect { + bsn -> repo.get(bsn, repo.versions(bsn).last().toString()) + }.flatten(), + "bundles/ext"); +} + +def copyRelease(ZipOutputStream zos) { + zipFiles(zos, + fileTree("${deploymentDir.absolutePath}/repo").include("**/*.jar").exclude("**/*.test/**").getFiles(), + "bundles/fpai-core") +} + +def generateProperties(ZipOutputStream zos, Iterable dependancyFiles, Iterable fpaiFiles) { + zos.putNextEntry(new ZipEntry("etc/config.properties")); + new OutputStreamWriter(zos).withPrintWriter { w -> + w.println("org.osgi.framework.storage.clean=onFirstInit"); + w.println() + w.println("felix.startlevel.framework=1"); + w.println("felix.startlevel.bundle=3"); + w.println("org.osgi.framework.startlevel.beginning=3"); + w.println() + + // First all the framework stuff + w.println("felix.auto.start.1=\\"); + for (String name : dependancyFiles) { + w.println("\tfile:./${name} \\") + } + w.println() + + // Then add the fpai bundles + w.println("felix.auto.start.2=\\"); + for (String name : fpaiFiles) { + w.println("\tfile:./${name} \\"); + } + w.println() + + w.println("felix.auto.deploy.dir=bundles/fpai-apps"); + w.println("felix.auto.deploy.action=install,update,start"); + w.println("#org.osgi.framework.security=osgi"); + } +} + +task(generateDeploymentZip, dependsOn: [cleanDeployment, releaseBundles]) { + def deployDir = file("${cnf.projectDir}/deployment") + ext.dependancies = 'https://raw.githubusercontent.com/flexiblepower/bundle-hub/split-repos/run/index.xml' + if(deployDir.exists() && deployDir.isDirectory()) { + doFirst { + def zipfile = file("${deploymentDir.absolutePath}/${project.name}-runtime-${qualifier}.zip") + logger.info("Generating ZIP file: ${zipfile.absolutePath}") + def zos = new ZipOutputStream(new FileOutputStream(zipfile)) + + zipDir(zos, deployDir) + def dependancyFiles = downloadRepo(zos, dependancies) + def fpaiFiles = copyRelease(zos) + zos.putNextEntry(new ZipEntry("bundles/fpai-apps/")) + + generateProperties(zos, dependancyFiles, fpaiFiles) + + zos.close(); + } + } +} + +distribute.dependsOn generateDeploymentZip + diff --git a/cnf/gradle b/cnf/gradle index fd1eb06..d3d44b2 160000 --- a/cnf/gradle +++ b/cnf/gradle @@ -1 +1 @@ -Subproject commit fd1eb063eae8f2c40206970cfdb19dcf46dbd66b +Subproject commit d3d44b2047087eb78ab5888e1b0a0bfe86e95931 diff --git a/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java b/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java index c62140a..ace56a6 100644 --- a/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java +++ b/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java @@ -453,7 +453,7 @@ public void disconnected() { @Port(name = "something", sends = DecodedStringMessage.class, accepts = DecodedStringMessage.class) class SendDataEndpoint implements Endpoint { - private boolean finished = false; + private volatile boolean finished = false; public void checkIfFinishedAndReset() { assertTrue("We did not receive all the messages", finished); @@ -471,10 +471,10 @@ public void handleMessage(Object message) { if (message.toString().length() < 1024) { connection.sendMessage(new DecodedStringMessage(message.toString() + message)); } else { + finished = true; synchronized (EndpointTester.this) { EndpointTester.this.notifyAll(); } - finished = true; } } From aedad876040c1f537d6684405f40524386eb6977 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Wed, 18 Feb 2015 18:46:29 +0100 Subject: [PATCH 042/105] Moved a lot of packages and files. Also imported the api from the base. --- .gitignore | 1 + cnf/ext/repositories.bnd | 40 +-- flexiblepower.api.efi/bnd.bnd | 15 - .../simulation/package-info.java | 8 - flexiblepower.api/.checkstyle | 4 +- flexiblepower.api/.classpath | 0 flexiblepower.api/.project | 0 .../.settings/bndtools.core.prefs | 0 .../org.eclipse.core.resources.prefs | 0 .../.settings/org.eclipse.jdt.core.prefs | 0 .../.settings/org.eclipse.jdt.ui.prefs | 0 flexiblepower.api/bnd.bnd | 14 +- flexiblepower.api/build.gradle | 1 + .../res/OSGI-INF/permissions.perm | 0 .../src/javax/measure/DecimalMeasure.java | 0 .../src/javax/measure/Measurable.java | 0 .../src/javax/measure/Measure.java | 0 .../src/javax/measure/MeasureFormat.java | 0 .../src/javax/measure/VectorMeasure.java | 0 .../javax/measure/converter/AddConverter.java | 0 .../converter/ConversionException.java | 0 .../javax/measure/converter/LogConverter.java | 0 .../measure/converter/MultiplyConverter.java | 0 .../measure/converter/RationalConverter.java | 0 .../measure/converter/UnitConverter.java | 0 .../measure/converter/doc-files/converter.png | Bin .../src/javax/measure/converter/package.html | 0 .../src/javax/measure/package.html | 0 .../src/javax/measure/packageinfo | 0 .../javax/measure/quantity/Acceleration.java | 0 .../measure/quantity/AmountOfSubstance.java | 0 .../src/javax/measure/quantity/Angle.java | 0 .../measure/quantity/AngularAcceleration.java | 0 .../measure/quantity/AngularVelocity.java | 0 .../src/javax/measure/quantity/Area.java | 0 .../measure/quantity/CatalyticActivity.java | 0 .../javax/measure/quantity/DataAmount.java | 0 .../src/javax/measure/quantity/DataRate.java | 0 .../javax/measure/quantity/Dimensionless.java | 0 .../src/javax/measure/quantity/Duration.java | 0 .../measure/quantity/DynamicViscosity.java | 0 .../measure/quantity/ElectricCapacitance.java | 0 .../measure/quantity/ElectricCharge.java | 0 .../measure/quantity/ElectricConductance.java | 0 .../measure/quantity/ElectricCurrent.java | 0 .../measure/quantity/ElectricInductance.java | 0 .../measure/quantity/ElectricPotential.java | 0 .../measure/quantity/ElectricResistance.java | 0 .../src/javax/measure/quantity/Energy.java | 0 .../src/javax/measure/quantity/Force.java | 0 .../src/javax/measure/quantity/Frequency.java | 0 .../javax/measure/quantity/Illuminance.java | 0 .../measure/quantity/KinematicViscosity.java | 0 .../src/javax/measure/quantity/Length.java | 0 .../javax/measure/quantity/LuminousFlux.java | 0 .../measure/quantity/LuminousIntensity.java | 0 .../javax/measure/quantity/MagneticFlux.java | 0 .../measure/quantity/MagneticFluxDensity.java | 0 .../src/javax/measure/quantity/Mass.java | 0 .../javax/measure/quantity/MassFlowRate.java | 0 .../src/javax/measure/quantity/Money.java | 0 .../src/javax/measure/quantity/MoneyFlow.java | 0 .../src/javax/measure/quantity/Power.java | 0 .../src/javax/measure/quantity/Pressure.java | 0 .../src/javax/measure/quantity/Quantity.java | 0 .../quantity/RadiationDoseAbsorbed.java | 0 .../quantity/RadiationDoseEffective.java | 0 .../measure/quantity/RadioactiveActivity.java | 0 .../javax/measure/quantity/SolidAngle.java | 0 .../javax/measure/quantity/Temperature.java | 0 .../src/javax/measure/quantity/Torque.java | 0 .../src/javax/measure/quantity/Velocity.java | 0 .../src/javax/measure/quantity/Volume.java | 0 .../measure/quantity/VolumetricDensity.java | 0 .../measure/quantity/VolumetricFlowRate.java | 0 .../src/javax/measure/quantity/package.html | 0 .../src/javax/measure/unit/AlternateUnit.java | 0 .../src/javax/measure/unit/BaseUnit.java | 0 .../src/javax/measure/unit/CompoundUnit.java | 0 .../src/javax/measure/unit/DerivedUnit.java | 0 .../src/javax/measure/unit/Dimension.java | 0 .../src/javax/measure/unit/NonSI.java | 0 .../src/javax/measure/unit/ProductUnit.java | 0 .../src/javax/measure/unit/SI.java | 0 .../src/javax/measure/unit/SystemOfUnits.java | 0 .../javax/measure/unit/TransformedUnit.java | 0 .../src/javax/measure/unit/Unit.java | 0 .../src/javax/measure/unit/UnitFormat.java | 0 .../javax/measure/unit/doc-files/momey.png | Bin .../src/javax/measure/unit/doc-files/unit.png | Bin .../src/javax/measure/unit/package.html | 0 .../context/FlexiblePowerContext.java | 17 + .../org/flexiblepower/context/Scheduler.java | 158 ++++++++++ .../flexiblepower/context}/Simulation.java | 12 +- .../flexiblepower/context/package-info.java | 3 + .../flexiblepower/messaging/Cardinality.java | 0 .../flexiblepower/messaging/Connection.java | 0 .../messaging/ConnectionManager.java | 0 .../org/flexiblepower/messaging/Endpoint.java | 0 .../messaging/MessageHandler.java | 0 .../src/org/flexiblepower/messaging/Port.java | 2 - .../org/flexiblepower/messaging/Ports.java | 0 .../flexiblepower/messaging/package-info.java | 0 .../observation/Observation.java | 0 .../observation/ObservationConsumer.java | 0 .../observation/ObservationProvider.java | 2 - .../ObservationTranslationHelper.java | 0 .../ext/AbstractObservationProvider.java | 0 .../observation/ext/ObservationAttribute.java | 0 ...ObservationProviderRegistrationHelper.java | 0 .../observation/ext/package-info.java | 0 .../observation/package-info.java | 0 .../org/flexiblepower/time/TimeService.java | 23 -- .../src/org/flexiblepower/time/TimeUtil.java | 0 .../org/flexiblepower/time/package-info.java | 0 .../src/org/flexiblepower/ui/Widget.java | 0 .../org/flexiblepower/ui/package-info.java | 0 .../observation/ObservationTest.java | 0 .../ObservationTranslationHelperTest.java | 0 .../.checkstyle | 0 .../.classpath | 0 flexiblepower.ral.efi.utils/.project | 29 ++ .../.settings/bndtools.core.prefs | 0 .../org.eclipse.core.resources.prefs | 0 .../.settings/org.eclipse.jdt.core.prefs | 0 .../.settings/org.eclipse.jdt.ui.prefs | 0 .../bnd.bnd | 3 +- .../res/OSGI-INF/permissions.perm | 0 .../api/efi/bufferhelper/Buffer.java | 2 +- .../api/efi/bufferhelper/BufferActuator.java | 4 +- .../api/efi/bufferhelper/package-info.java | 0 .../api/efi/commonhelper/TimerModel.java | 0 .../api/efi/commonhelper/package-info.java | 0 .../unconstrainedhelper/Unconstrained.java | 4 +- .../efi/unconstrainedhelper/package-info.java | 0 .../api/efi/bufferhelper/BufferTest.java | 4 +- .../UnconstrainedTest.java | 4 +- .../api/efi/commonhelper/TimerModelTest.java | 0 .../.checkstyle | 0 .../.classpath | 0 .../.project | 2 +- .../.settings/bndtools.core.prefs | 0 .../org.eclipse.core.resources.prefs | 0 .../.settings/org.eclipse.jdt.core.prefs | 0 .../.settings/org.eclipse.jdt.ui.prefs | 0 flexiblepower.ral.efi/bnd.bnd | 11 + .../res/OSGI-INF/permissions.perm | 0 .../efi/BufferResourceManager.java | 6 +- .../efi/EfiControllerManager.java | 6 +- .../efi/TimeShifterResourceManager.java | 6 +- .../efi/UnconstrainedResourceManager.java | 6 +- .../efi/UncontrolledResourceManager.java | 6 +- .../flexiblepower/efi/buffer/Actuator.java | 4 +- .../efi/buffer/ActuatorAllocation.java | 0 .../efi/buffer/ActuatorBehaviour.java | 0 .../efi/buffer/ActuatorUpdate.java | 0 .../efi/buffer/BufferAllocation.java | 4 +- .../efi/buffer/BufferRegistration.java | 3 +- .../efi/buffer/BufferStateUpdate.java | 2 - .../efi/buffer/BufferSystemDescription.java | 1 - .../efi/buffer/BufferTargetProfileUpdate.java | 3 +- .../efi/buffer/BufferUpdate.java | 3 +- .../efi/buffer/BufferUsageForecast.java | 2 +- .../flexiblepower/efi/buffer/LeakageRate.java | 0 .../efi/buffer/RunningModeBehaviour.java | 2 +- .../efi/buffer/package-info.java | 0 .../org/flexiblepower/efi/buffer/packageinfo | 0 .../org/flexiblepower/efi/package-info.java | 0 .../efi/timeshifter/SequentialProfile.java | 2 +- .../SequentialProfileAllocation.java | 0 .../timeshifter/TimeShifterAllocation.java | 5 +- .../timeshifter/TimeShifterRegistration.java | 7 +- .../efi/timeshifter/TimeShifterUpdate.java | 3 +- .../efi/timeshifter/package-info.java | 0 .../flexiblepower/efi/timeshifter/packageinfo | 0 .../unconstrained/RunningModeBehaviour.java | 4 +- .../unconstrained/RunningModeSelector.java | 0 .../UnconstrainedAllocation.java | 5 +- .../UnconstrainedRegistration.java | 4 +- .../UnconstrainedStateUpdate.java | 1 - .../UnconstrainedSystemDescription.java | 0 .../unconstrained/UnconstrainedUpdate.java | 3 +- .../efi/unconstrained/package-info.java | 0 .../efi/unconstrained/packageinfo | 0 .../uncontrolled/UncontrolledAllocation.java | 8 +- .../uncontrolled/UncontrolledForecast.java | 2 +- .../uncontrolled/UncontrolledMeasurement.java | 4 +- .../UncontrolledRegistration.java | 11 +- .../efi/uncontrolled/UncontrolledUpdate.java | 3 +- .../efi/uncontrolled/package-info.java | 0 .../efi/uncontrolled/packageinfo | 0 .../efi/util/FillLevelFunction.java | 0 .../flexiblepower/efi/util/RunningMode.java | 0 .../src/org/flexiblepower/efi/util/Timer.java | 0 .../flexiblepower/efi/util/TimerUpdate.java | 0 .../flexiblepower/efi/util/Transition.java | 0 .../flexiblepower/efi/util/package-info.java | 0 .../org/flexiblepower/efi/util/packageinfo | 0 .../efi/BufferControlSpaceTest.java | 0 .../uml/Buffer.png | Bin .../uml/Buffer.ucls | 0 .../uml/Buffer/BufferAllocation.png | Bin .../uml/Buffer/BufferAllocation.ucls | 0 .../uml/Buffer/BufferRegistration.png | Bin .../uml/Buffer/BufferRegistration.ucls | 0 .../uml/Buffer/BufferStateUpdate.png | Bin .../uml/Buffer/BufferStateUpdate.ucls | 0 .../uml/Buffer/BufferSystemDescription.png | Bin .../uml/Buffer/BufferSystemDescription.ucls | 0 .../uml/Buffer/BufferTargetProfile.png | Bin .../uml/Buffer/BufferTargetProfile.ucls | 0 .../uml/Buffer/BufferUsageForecast.png | Bin .../uml/Buffer/BufferUsageForecast.ucls | 0 .../uml/Common/Commodity.png | Bin .../uml/Common/Commodity.ucls | 0 .../uml/Common/CommodityForecast.png | Bin .../uml/Common/CommodityForecast.ucls | 0 .../uml/Common/CommodityProfile.png | Bin .../uml/Common/CommodityProfile.ucls | 0 .../uml/Common/Revoke.png | Bin .../uml/Common/Revoke.ucls | 0 .../uml/Timeshifter/TimeshifterAllocation.png | Bin .../Timeshifter/TimeshifterAllocation.ucls | 0 .../Timeshifter/TimeshifterRegistration.png | Bin .../Timeshifter/TimeshifterRegistration.ucls | 0 .../uml/Timeshifter/TimeshifterUpdate.png | Bin .../uml/Timeshifter/TimeshifterUpdate.ucls | 0 .../Unconstrained/UnconstrainedAllocation.png | Bin .../UnconstrainedAllocation.ucls | 0 .../UnconstrainedRegistration.png | Bin .../UnconstrainedRegistration.ucls | 0 .../UnconstrainedStateUpdate.png | Bin .../UnconstrainedStateUpdate.ucls | 0 .../UnconstrainedSystemDescription.png | Bin .../UnconstrainedSystemDescription.ucls | 0 .../Uncontrolled/UncontrolledAllocation.png | Bin .../Uncontrolled/UncontrolledAllocation.ucls | 0 .../uml/Uncontrolled/UncontrolledForecast.png | Bin .../Uncontrolled/UncontrolledForecast.ucls | 0 .../Uncontrolled/UncontrolledMeasurement.png | Bin .../Uncontrolled/UncontrolledMeasurement.ucls | 0 .../Uncontrolled/UncontrolledRegistration.png | Bin .../UncontrolledRegistration.ucls | 0 .../uml/rai.comm/RAI.png | Bin .../uml/rai.comm/RAI.ucls | 0 .../.checkstyle | 0 .../.classpath | 0 .../.project | 2 +- .../.settings/bndtools.core.prefs | 0 .../org.eclipse.core.resources.prefs | 0 .../.settings/org.eclipse.jdt.core.prefs | 0 .../.settings/org.eclipse.jdt.ui.prefs | 0 .../bnd.bnd | 3 +- .../res/OSGI-INF/permissions.perm | 0 .../battery/BatteryControlParameters.java | 1 + .../ral/drivers/battery/BatteryDriver.java | 0 .../ral/drivers/battery/BatteryMode.java | 0 .../ral/drivers/battery/BatteryState.java | 0 .../ral/drivers/battery/package-info.java | 0 .../DishwasherControlParameters.java | 0 .../drivers/dishwasher/DishwasherDriver.java | 0 .../drivers/dishwasher/DishwasherState.java | 2 +- .../ral/drivers/dishwasher/package-info.java | 0 .../RefrigeratorControlParameters.java | 1 + .../refrigerator/RefrigeratorDriver.java | 0 .../refrigerator/RefrigeratorState.java | 0 .../drivers/refrigerator/package-info.java | 0 .../ral/drivers/uncontrolled/PowerState.java | 0 .../uncontrolled/UncontrollableDriver.java | 0 .../drivers/uncontrolled/package-info.java | 0 .../ral/ext/AbstractResourceDriver.java | 0 .../ral/ext/AbstractResourceManager.java | 4 +- .../flexiblepower/ral/ext/package-info.java | 0 .../ObservationRegistrationHelperTest.java | 0 flexiblepower.ral/.checkstyle | 13 + flexiblepower.ral/.classpath | 8 + .../.project | 2 +- .../.settings/bndtools.core.prefs | 3 + .../org.eclipse.core.resources.prefs | 2 + .../.settings/org.eclipse.jdt.core.prefs | 292 ++++++++++++++++++ .../.settings/org.eclipse.jdt.ui.prefs | 62 ++++ .../UML/AllocationHelperClasses.png | Bin .../UML/AllocationHelperClasses.ucls | 0 .../UML/BufferControlSpace.png | Bin .../UML/BufferControlSpace.ucls | 0 .../UML/BufferControlSpaceHelperClasses.png | Bin .../UML/BufferControlSpaceHelperClasses.ucls | 0 .../UML/ControlSpace.png | Bin .../UML/ControlSpace.ucls | 0 .../UML/ControlSpaceAndAllocation.png | Bin .../UML/ControlSpaceAndAllocation.ucls | 0 .../UML/ControlSpaceOverview.png | Bin .../UML/ControlSpaceOverview.ucls | 0 .../UML/StorageControlSPace.png | Bin .../UML/StorageControlSPace.ucls | 0 .../UML/TimeShifterControlSpace.png | Bin .../UML/TimeShifterControlSpace.ucls | 0 .../UML/UncontrolledControlSpace.png | Bin .../UML/UncontrolledControlSpace.ucls | 0 flexiblepower.ral/bnd.bnd | 9 + flexiblepower.ral/build.gradle | 1 + .../res/OSGI-INF/permissions.perm | 2 + .../flexiblepower/ral/ControllerManager.java | 2 +- .../ral/ResourceControlParameters.java | 0 .../org/flexiblepower/ral/ResourceDriver.java | 0 .../flexiblepower/ral/ResourceManager.java | 10 +- .../org/flexiblepower/ral/ResourceState.java | 0 .../ral/messages}/Allocation.java | 4 +- .../ral/messages}/AllocationRevoke.java | 4 +- .../ral/messages}/AllocationStatus.java | 2 +- .../ral/messages}/AllocationStatusUpdate.java | 4 +- .../messages}/ControlSpaceRegistration.java | 3 +- .../ral/messages}/ControlSpaceRevoke.java | 4 +- .../ral/messages}/ControlSpaceUpdate.java | 4 +- .../ral/messages}/ResourceMessage.java | 4 +- .../ral/messages}/package-info.java | 2 +- .../org/flexiblepower/ral/package-info.java | 0 .../flexiblepower/ral}/values/Commodity.java | 2 +- .../ral}/values/CommodityForecast.java | 2 +- .../ral}/values/CommodityMap.java | 2 +- .../ral}/values/CommodityMeasurables.java | 2 +- .../ral}/values/CommodityProfile.java | 2 +- .../ral}/values/CommoditySet.java | 2 +- .../values/CommodityUncertainMeasurables.java | 2 +- .../flexiblepower/ral}/values/Constraint.java | 2 +- .../ral}/values/ConstraintList.java | 2 +- .../ral}/values/ConstraintListMap.java | 2 +- .../ral}/values/ConstraintProfile.java | 2 +- .../ral}/values/ConstraintProfileMap.java | 2 +- .../flexiblepower/ral}/values/Profile.java | 2 +- .../values/UncertainMeasurableProfile.java | 2 +- .../ral}/values/UncertainMeasure.java | 2 +- .../ral}/values/package-info.java | 2 +- .../observation/test/ObservationTest.java | 80 +++++ .../ObservationTranslationHelperTest.java | 47 +++ .../ral/values/test}/ConstraintListTest.java | 6 +- .../LoggingScheduledExecutorService.java | 0 .../RuntimeContext.java} | 0 flexiblepower.ui.connectionspage/bnd.bnd | 1 + 339 files changed, 876 insertions(+), 219 deletions(-) delete mode 100644 flexiblepower.api.efi/bnd.bnd delete mode 100644 flexiblepower.api.ext/src/org/flexiblepower/simulation/package-info.java mode change 100644 => 100755 flexiblepower.api/.checkstyle mode change 100644 => 100755 flexiblepower.api/.classpath mode change 100644 => 100755 flexiblepower.api/.project mode change 100644 => 100755 flexiblepower.api/.settings/bndtools.core.prefs mode change 100644 => 100755 flexiblepower.api/.settings/org.eclipse.core.resources.prefs mode change 100644 => 100755 flexiblepower.api/.settings/org.eclipse.jdt.core.prefs mode change 100644 => 100755 flexiblepower.api/.settings/org.eclipse.jdt.ui.prefs mode change 100644 => 100755 flexiblepower.api/bnd.bnd mode change 100644 => 100755 flexiblepower.api/build.gradle mode change 100644 => 100755 flexiblepower.api/res/OSGI-INF/permissions.perm mode change 100644 => 100755 flexiblepower.api/src/javax/measure/DecimalMeasure.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/Measurable.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/Measure.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/MeasureFormat.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/VectorMeasure.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/converter/AddConverter.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/converter/ConversionException.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/converter/LogConverter.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/converter/MultiplyConverter.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/converter/RationalConverter.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/converter/UnitConverter.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/converter/doc-files/converter.png mode change 100644 => 100755 flexiblepower.api/src/javax/measure/converter/package.html mode change 100644 => 100755 flexiblepower.api/src/javax/measure/package.html mode change 100644 => 100755 flexiblepower.api/src/javax/measure/packageinfo mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/Acceleration.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/AmountOfSubstance.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/Angle.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/AngularAcceleration.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/AngularVelocity.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/Area.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/CatalyticActivity.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/DataAmount.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/DataRate.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/Dimensionless.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/Duration.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/DynamicViscosity.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/ElectricCapacitance.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/ElectricCharge.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/ElectricConductance.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/ElectricCurrent.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/ElectricInductance.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/ElectricPotential.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/ElectricResistance.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/Energy.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/Force.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/Frequency.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/Illuminance.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/KinematicViscosity.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/Length.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/LuminousFlux.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/LuminousIntensity.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/MagneticFlux.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/MagneticFluxDensity.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/Mass.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/MassFlowRate.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/Money.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/MoneyFlow.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/Power.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/Pressure.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/Quantity.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/RadiationDoseAbsorbed.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/RadiationDoseEffective.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/RadioactiveActivity.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/SolidAngle.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/Temperature.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/Torque.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/Velocity.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/Volume.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/VolumetricDensity.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/VolumetricFlowRate.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/quantity/package.html mode change 100644 => 100755 flexiblepower.api/src/javax/measure/unit/AlternateUnit.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/unit/BaseUnit.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/unit/CompoundUnit.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/unit/DerivedUnit.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/unit/Dimension.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/unit/NonSI.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/unit/ProductUnit.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/unit/SI.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/unit/SystemOfUnits.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/unit/TransformedUnit.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/unit/Unit.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/unit/UnitFormat.java mode change 100644 => 100755 flexiblepower.api/src/javax/measure/unit/doc-files/momey.png mode change 100644 => 100755 flexiblepower.api/src/javax/measure/unit/doc-files/unit.png mode change 100644 => 100755 flexiblepower.api/src/javax/measure/unit/package.html create mode 100755 flexiblepower.api/src/org/flexiblepower/context/FlexiblePowerContext.java create mode 100755 flexiblepower.api/src/org/flexiblepower/context/Scheduler.java rename {flexiblepower.api.ext/src/org/flexiblepower/simulation => flexiblepower.api/src/org/flexiblepower/context}/Simulation.java (93%) mode change 100644 => 100755 create mode 100755 flexiblepower.api/src/org/flexiblepower/context/package-info.java mode change 100644 => 100755 flexiblepower.api/src/org/flexiblepower/messaging/Cardinality.java mode change 100644 => 100755 flexiblepower.api/src/org/flexiblepower/messaging/Connection.java mode change 100644 => 100755 flexiblepower.api/src/org/flexiblepower/messaging/ConnectionManager.java mode change 100644 => 100755 flexiblepower.api/src/org/flexiblepower/messaging/Endpoint.java mode change 100644 => 100755 flexiblepower.api/src/org/flexiblepower/messaging/MessageHandler.java mode change 100644 => 100755 flexiblepower.api/src/org/flexiblepower/messaging/Port.java mode change 100644 => 100755 flexiblepower.api/src/org/flexiblepower/messaging/Ports.java mode change 100644 => 100755 flexiblepower.api/src/org/flexiblepower/messaging/package-info.java mode change 100644 => 100755 flexiblepower.api/src/org/flexiblepower/observation/Observation.java mode change 100644 => 100755 flexiblepower.api/src/org/flexiblepower/observation/ObservationConsumer.java mode change 100644 => 100755 flexiblepower.api/src/org/flexiblepower/observation/ObservationProvider.java mode change 100644 => 100755 flexiblepower.api/src/org/flexiblepower/observation/ObservationTranslationHelper.java rename {flexiblepower.api.ext => flexiblepower.api}/src/org/flexiblepower/observation/ext/AbstractObservationProvider.java (100%) rename {flexiblepower.api.ext => flexiblepower.api}/src/org/flexiblepower/observation/ext/ObservationAttribute.java (100%) rename {flexiblepower.api.ext => flexiblepower.api}/src/org/flexiblepower/observation/ext/ObservationProviderRegistrationHelper.java (100%) rename {flexiblepower.api.ext => flexiblepower.api}/src/org/flexiblepower/observation/ext/package-info.java (100%) mode change 100644 => 100755 flexiblepower.api/src/org/flexiblepower/observation/package-info.java delete mode 100644 flexiblepower.api/src/org/flexiblepower/time/TimeService.java mode change 100644 => 100755 flexiblepower.api/src/org/flexiblepower/time/TimeUtil.java mode change 100644 => 100755 flexiblepower.api/src/org/flexiblepower/time/package-info.java mode change 100644 => 100755 flexiblepower.api/src/org/flexiblepower/ui/Widget.java mode change 100644 => 100755 flexiblepower.api/src/org/flexiblepower/ui/package-info.java mode change 100644 => 100755 flexiblepower.api/test/org/flexiblepower/observation/ObservationTest.java mode change 100644 => 100755 flexiblepower.api/test/org/flexiblepower/observation/ObservationTranslationHelperTest.java rename {flexiblepower.api.efi.utils => flexiblepower.ral.efi.utils}/.checkstyle (100%) rename {flexiblepower.api.efi.utils => flexiblepower.ral.efi.utils}/.classpath (100%) create mode 100644 flexiblepower.ral.efi.utils/.project rename {flexiblepower.api.efi.utils => flexiblepower.ral.efi.utils}/.settings/bndtools.core.prefs (100%) rename {flexiblepower.api.efi.utils => flexiblepower.ral.efi.utils}/.settings/org.eclipse.core.resources.prefs (100%) rename {flexiblepower.api.efi.utils => flexiblepower.ral.efi.utils}/.settings/org.eclipse.jdt.core.prefs (100%) rename {flexiblepower.api.efi.utils => flexiblepower.ral.efi.utils}/.settings/org.eclipse.jdt.ui.prefs (100%) rename {flexiblepower.api.efi.utils => flexiblepower.ral.efi.utils}/bnd.bnd (78%) rename {flexiblepower.api.efi.utils => flexiblepower.ral.efi.utils}/res/OSGI-INF/permissions.perm (100%) rename {flexiblepower.api.efi.utils => flexiblepower.ral.efi.utils}/src/org/flexiblepower/api/efi/bufferhelper/Buffer.java (99%) rename {flexiblepower.api.efi.utils => flexiblepower.ral.efi.utils}/src/org/flexiblepower/api/efi/bufferhelper/BufferActuator.java (99%) rename {flexiblepower.api.efi.utils => flexiblepower.ral.efi.utils}/src/org/flexiblepower/api/efi/bufferhelper/package-info.java (100%) rename {flexiblepower.api.efi.utils => flexiblepower.ral.efi.utils}/src/org/flexiblepower/api/efi/commonhelper/TimerModel.java (100%) rename {flexiblepower.api.efi.utils => flexiblepower.ral.efi.utils}/src/org/flexiblepower/api/efi/commonhelper/package-info.java (100%) rename {flexiblepower.api.efi.utils => flexiblepower.ral.efi.utils}/src/org/flexiblepower/api/efi/unconstrainedhelper/Unconstrained.java (99%) rename {flexiblepower.api.efi.utils => flexiblepower.ral.efi.utils}/src/org/flexiblepower/api/efi/unconstrainedhelper/package-info.java (100%) rename {flexiblepower.api.efi.utils => flexiblepower.ral.efi.utils}/test/flexiblepower/api/efi/bufferhelper/BufferTest.java (99%) rename {flexiblepower.api.efi.utils => flexiblepower.ral.efi.utils}/test/flexiblepower/api/efi/unconstrainedhelper/UnconstrainedTest.java (98%) rename {flexiblepower.api.efi.utils => flexiblepower.ral.efi.utils}/test/org/flexiblepower/api/efi/commonhelper/TimerModelTest.java (100%) rename {flexiblepower.api.efi => flexiblepower.ral.efi}/.checkstyle (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/.classpath (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi.utils => flexiblepower.ral.efi}/.project (94%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/.settings/bndtools.core.prefs (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/.settings/org.eclipse.core.resources.prefs (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/.settings/org.eclipse.jdt.core.prefs (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/.settings/org.eclipse.jdt.ui.prefs (100%) mode change 100644 => 100755 create mode 100755 flexiblepower.ral.efi/bnd.bnd rename {flexiblepower.api.efi => flexiblepower.ral.efi}/res/OSGI-INF/permissions.perm (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/BufferResourceManager.java (78%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/EfiControllerManager.java (93%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/TimeShifterResourceManager.java (80%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/UnconstrainedResourceManager.java (81%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/UncontrolledResourceManager.java (81%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/buffer/Actuator.java (97%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/buffer/ActuatorAllocation.java (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/buffer/ActuatorBehaviour.java (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/buffer/ActuatorUpdate.java (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/buffer/BufferAllocation.java (94%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/buffer/BufferRegistration.java (98%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/buffer/BufferStateUpdate.java (98%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/buffer/BufferSystemDescription.java (99%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/buffer/BufferTargetProfileUpdate.java (94%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/buffer/BufferUpdate.java (89%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/buffer/BufferUsageForecast.java (95%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/buffer/LeakageRate.java (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/buffer/RunningModeBehaviour.java (98%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/buffer/package-info.java (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/buffer/packageinfo (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/package-info.java (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/timeshifter/SequentialProfile.java (98%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/timeshifter/SequentialProfileAllocation.java (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/timeshifter/TimeShifterAllocation.java (96%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/timeshifter/TimeShifterRegistration.java (92%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/timeshifter/TimeShifterUpdate.java (98%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/timeshifter/package-info.java (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/timeshifter/packageinfo (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/unconstrained/RunningModeBehaviour.java (97%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/unconstrained/RunningModeSelector.java (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/unconstrained/UnconstrainedAllocation.java (95%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/unconstrained/UnconstrainedRegistration.java (94%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/unconstrained/UnconstrainedStateUpdate.java (98%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/unconstrained/UnconstrainedSystemDescription.java (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/unconstrained/UnconstrainedUpdate.java (90%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/unconstrained/package-info.java (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/unconstrained/packageinfo (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/uncontrolled/UncontrolledAllocation.java (91%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/uncontrolled/UncontrolledForecast.java (96%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/uncontrolled/UncontrolledMeasurement.java (95%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/uncontrolled/UncontrolledRegistration.java (93%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/uncontrolled/UncontrolledUpdate.java (89%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/uncontrolled/package-info.java (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/uncontrolled/packageinfo (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/util/FillLevelFunction.java (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/util/RunningMode.java (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/util/Timer.java (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/util/TimerUpdate.java (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/util/Transition.java (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/util/package-info.java (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/src/org/flexiblepower/efi/util/packageinfo (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/test/org/flexiblepower/efi/BufferControlSpaceTest.java (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Buffer.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Buffer.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Buffer/BufferAllocation.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Buffer/BufferAllocation.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Buffer/BufferRegistration.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Buffer/BufferRegistration.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Buffer/BufferStateUpdate.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Buffer/BufferStateUpdate.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Buffer/BufferSystemDescription.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Buffer/BufferSystemDescription.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Buffer/BufferTargetProfile.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Buffer/BufferTargetProfile.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Buffer/BufferUsageForecast.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Buffer/BufferUsageForecast.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Common/Commodity.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Common/Commodity.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Common/CommodityForecast.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Common/CommodityForecast.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Common/CommodityProfile.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Common/CommodityProfile.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Common/Revoke.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Common/Revoke.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Timeshifter/TimeshifterAllocation.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Timeshifter/TimeshifterAllocation.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Timeshifter/TimeshifterRegistration.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Timeshifter/TimeshifterRegistration.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Timeshifter/TimeshifterUpdate.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Timeshifter/TimeshifterUpdate.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Unconstrained/UnconstrainedAllocation.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Unconstrained/UnconstrainedAllocation.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Unconstrained/UnconstrainedRegistration.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Unconstrained/UnconstrainedRegistration.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Unconstrained/UnconstrainedStateUpdate.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Unconstrained/UnconstrainedStateUpdate.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Unconstrained/UnconstrainedSystemDescription.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Unconstrained/UnconstrainedSystemDescription.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Uncontrolled/UncontrolledAllocation.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Uncontrolled/UncontrolledAllocation.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Uncontrolled/UncontrolledForecast.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Uncontrolled/UncontrolledForecast.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Uncontrolled/UncontrolledMeasurement.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Uncontrolled/UncontrolledMeasurement.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Uncontrolled/UncontrolledRegistration.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/Uncontrolled/UncontrolledRegistration.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/rai.comm/RAI.png (100%) mode change 100644 => 100755 rename {flexiblepower.api.efi => flexiblepower.ral.efi}/uml/rai.comm/RAI.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api.ext => flexiblepower.ral.ext}/.checkstyle (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/.classpath (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/.project (94%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/.settings/bndtools.core.prefs (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/.settings/org.eclipse.core.resources.prefs (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/.settings/org.eclipse.jdt.core.prefs (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/.settings/org.eclipse.jdt.ui.prefs (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/bnd.bnd (84%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/res/OSGI-INF/permissions.perm (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/src/org/flexiblepower/ral/drivers/battery/BatteryControlParameters.java (99%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/src/org/flexiblepower/ral/drivers/battery/BatteryDriver.java (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/src/org/flexiblepower/ral/drivers/battery/BatteryMode.java (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/src/org/flexiblepower/ral/drivers/battery/BatteryState.java (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/src/org/flexiblepower/ral/drivers/battery/package-info.java (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/src/org/flexiblepower/ral/drivers/dishwasher/DishwasherControlParameters.java (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/src/org/flexiblepower/ral/drivers/dishwasher/DishwasherDriver.java (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/src/org/flexiblepower/ral/drivers/dishwasher/DishwasherState.java (97%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/src/org/flexiblepower/ral/drivers/dishwasher/package-info.java (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/src/org/flexiblepower/ral/drivers/refrigerator/RefrigeratorControlParameters.java (99%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/src/org/flexiblepower/ral/drivers/refrigerator/RefrigeratorDriver.java (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/src/org/flexiblepower/ral/drivers/refrigerator/RefrigeratorState.java (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/src/org/flexiblepower/ral/drivers/refrigerator/package-info.java (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/src/org/flexiblepower/ral/drivers/uncontrolled/PowerState.java (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/src/org/flexiblepower/ral/drivers/uncontrolled/UncontrollableDriver.java (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/src/org/flexiblepower/ral/drivers/uncontrolled/package-info.java (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/src/org/flexiblepower/ral/ext/AbstractResourceDriver.java (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/src/org/flexiblepower/ral/ext/AbstractResourceManager.java (98%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/src/org/flexiblepower/ral/ext/package-info.java (100%) rename {flexiblepower.api.ext => flexiblepower.ral.ext}/test/org/flexiblepower/observation/test/ObservationRegistrationHelperTest.java (100%) create mode 100755 flexiblepower.ral/.checkstyle create mode 100755 flexiblepower.ral/.classpath rename {flexiblepower.api.efi => flexiblepower.ral}/.project (94%) mode change 100644 => 100755 create mode 100755 flexiblepower.ral/.settings/bndtools.core.prefs create mode 100755 flexiblepower.ral/.settings/org.eclipse.core.resources.prefs create mode 100755 flexiblepower.ral/.settings/org.eclipse.jdt.core.prefs create mode 100755 flexiblepower.ral/.settings/org.eclipse.jdt.ui.prefs rename {flexiblepower.api => flexiblepower.ral}/UML/AllocationHelperClasses.png (100%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/UML/AllocationHelperClasses.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/UML/BufferControlSpace.png (100%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/UML/BufferControlSpace.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/UML/BufferControlSpaceHelperClasses.png (100%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/UML/BufferControlSpaceHelperClasses.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/UML/ControlSpace.png (100%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/UML/ControlSpace.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/UML/ControlSpaceAndAllocation.png (100%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/UML/ControlSpaceAndAllocation.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/UML/ControlSpaceOverview.png (100%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/UML/ControlSpaceOverview.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/UML/StorageControlSPace.png (100%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/UML/StorageControlSPace.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/UML/TimeShifterControlSpace.png (100%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/UML/TimeShifterControlSpace.ucls (100%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/UML/UncontrolledControlSpace.png (100%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/UML/UncontrolledControlSpace.ucls (100%) mode change 100644 => 100755 create mode 100755 flexiblepower.ral/bnd.bnd create mode 100755 flexiblepower.ral/build.gradle create mode 100755 flexiblepower.ral/res/OSGI-INF/permissions.perm rename {flexiblepower.api => flexiblepower.ral}/src/org/flexiblepower/ral/ControllerManager.java (92%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/src/org/flexiblepower/ral/ResourceControlParameters.java (100%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/src/org/flexiblepower/ral/ResourceDriver.java (100%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/src/org/flexiblepower/ral/ResourceManager.java (76%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/src/org/flexiblepower/ral/ResourceState.java (100%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral/messages}/Allocation.java (98%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral/messages}/AllocationRevoke.java (91%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral/messages}/AllocationStatus.java (97%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral/messages}/AllocationStatusUpdate.java (98%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral/messages}/ControlSpaceRegistration.java (97%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral/messages}/ControlSpaceRevoke.java (91%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral/messages}/ControlSpaceUpdate.java (95%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral/messages}/ResourceMessage.java (97%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral/messages}/package-info.java (82%) mode change 100644 => 100755 rename {flexiblepower.api => flexiblepower.ral}/src/org/flexiblepower/ral/package-info.java (100%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral}/values/Commodity.java (99%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral}/values/CommodityForecast.java (99%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral}/values/CommodityMap.java (99%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral}/values/CommodityMeasurables.java (98%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral}/values/CommodityProfile.java (99%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral}/values/CommoditySet.java (99%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral}/values/CommodityUncertainMeasurables.java (98%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral}/values/Constraint.java (99%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral}/values/ConstraintList.java (99%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral}/values/ConstraintListMap.java (98%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral}/values/ConstraintProfile.java (98%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral}/values/ConstraintProfileMap.java (98%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral}/values/Profile.java (98%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral}/values/UncertainMeasurableProfile.java (98%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral}/values/UncertainMeasure.java (99%) mode change 100644 => 100755 rename {flexiblepower.api/src/org/flexiblepower/rai => flexiblepower.ral/src/org/flexiblepower/ral}/values/package-info.java (80%) mode change 100644 => 100755 create mode 100755 flexiblepower.ral/test/org/flexiblepower/observation/test/ObservationTest.java create mode 100755 flexiblepower.ral/test/org/flexiblepower/observation/test/ObservationTranslationHelperTest.java rename {flexiblepower.api/test/org/flexiblepower/rai/values => flexiblepower.ral/test/org/flexiblepower/ral/values/test}/ConstraintListTest.java (85%) mode change 100644 => 100755 rename flexiblepower.runtime/src/org/flexiblepower/runtime/{scheduling => context}/LoggingScheduledExecutorService.java (100%) rename flexiblepower.runtime/src/org/flexiblepower/runtime/{scheduling/SystemClockTimeService.java => context/RuntimeContext.java} (100%) diff --git a/.gitignore b/.gitignore index edc43ff..dab91f3 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ build !.metadata/.plugins/org.eclipse.core.resources/ .metadata/.plugins/org.eclipse.core.resources/* !.metadata/.plugins/org.eclipse.core.resources/.plugins/ +.com_puppetlabs_geppetto_pptp_target # GWT generated stuff .gwt diff --git a/cnf/ext/repositories.bnd b/cnf/ext/repositories.bnd index 2af04fd..35bb11f 100755 --- a/cnf/ext/repositories.bnd +++ b/cnf/ext/repositories.bnd @@ -1,25 +1,25 @@ -pluginpath: ${workspace}/cnf/gradle/bnd/biz.aQute.repository.jar -plugin:\ - aQute.bnd.deployer.repository.LocalIndexedRepo;\ - name=Release;\ - local=${workspace}/cnf/release;\ - pretty=true,\ - aQute.bnd.deployer.repository.FixedIndexedRepo;\ - name=FPAI Bundle Hub - Build;\ - locations=https://raw.githubusercontent.com/flexiblepower/bundle-hub/split-repos/build/index.xml;\ - cache=${workspace}/cnf/cache,\ - aQute.bnd.deployer.repository.FixedIndexedRepo;\ - name=FPAI Bundle Hub - Run;\ - locations=https://raw.githubusercontent.com/flexiblepower/bundle-hub/split-repos/run/index.xml;\ - cache=${workspace}/cnf/cache,\ - aQute.bnd.deployer.repository.FixedIndexedRepo;\ - name=FPAI Bundle Hub - Test;\ - locations=https://raw.githubusercontent.com/flexiblepower/bundle-hub/split-repos/test/index.xml;\ - cache=${workspace}/cnf/cache,\ - aQute.bnd.deployer.repository.FixedIndexedRepo;\ - name=FPAI Core Current Release;\ - locations=https://github.com/flexiblepower/fpai-core/releases/download/v14.10/index.xml;\ - cache=${workspace}/cnf/cache + aQute.bnd.deployer.repository.LocalIndexedRepo;\ + name=Release;\ + local=${workspace}/cnf/release;\ + pretty=true,\ + aQute.bnd.deployer.repository.FixedIndexedRepo;\ + name=FPAI Bundle Hub - Build;\ + locations=https://raw.githubusercontent.com/flexiblepower/bundle-hub/split-repos/build/index.xml;\ + cache=${workspace}/cnf/cache,\ + aQute.bnd.deployer.repository.FixedIndexedRepo;\ + name=FPAI Bundle Hub - Run;\ + locations=https://raw.githubusercontent.com/flexiblepower/bundle-hub/split-repos/run/index.xml;\ + cache=${workspace}/cnf/cache,\ + aQute.bnd.deployer.repository.FixedIndexedRepo;\ + name=FPAI Bundle Hub - Test;\ + locations=https://raw.githubusercontent.com/flexiblepower/bundle-hub/split-repos/test/index.xml;\ + cache=${workspace}/cnf/cache,\ + aQute.bnd.deployer.repository.FixedIndexedRepo;\ + name=FPAI Core Current Release;\ + locations=https://github.com/flexiblepower/fpai-core/releases/download/v14.10/index.xml;\ + cache=${workspace}/cnf/cache -releaserepo: Release diff --git a/flexiblepower.api.efi/bnd.bnd b/flexiblepower.api.efi/bnd.bnd deleted file mode 100644 index fb52bda..0000000 --- a/flexiblepower.api.efi/bnd.bnd +++ /dev/null @@ -1,15 +0,0 @@ --buildpath: \ - osgi.cmpn;version='[4.3,5)',\ - osgi.core;version='[4.3,5)',\ - junit.osgi;version='[3.8,4)',\ - biz.aQute.bnd.annotation,\ - flexiblepower.api;version=latest -Bundle-Version: 2.0.1.${qualifier} -Export-Package: \ - org.flexiblepower.efi.buffer,\ - org.flexiblepower.efi.unconstrained,\ - org.flexiblepower.efi.util,\ - org.flexiblepower.efi.timeshifter,\ - org.flexiblepower.efi.uncontrolled,\ - org.flexiblepower.efi - diff --git a/flexiblepower.api.ext/src/org/flexiblepower/simulation/package-info.java b/flexiblepower.api.ext/src/org/flexiblepower/simulation/package-info.java deleted file mode 100644 index 9d50d3a..0000000 --- a/flexiblepower.api.ext/src/org/flexiblepower/simulation/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * This package contains the interface Simulation. This is only available in a simulation runtime. - */ -@Version("1.0.0.${qualifier}") -package org.flexiblepower.simulation; - -import aQute.bnd.annotation.Version; - diff --git a/flexiblepower.api/.checkstyle b/flexiblepower.api/.checkstyle old mode 100644 new mode 100755 index 60f3b8d..3c5c9a3 --- a/flexiblepower.api/.checkstyle +++ b/flexiblepower.api/.checkstyle @@ -1,10 +1,10 @@ - + - + diff --git a/flexiblepower.api/.classpath b/flexiblepower.api/.classpath old mode 100644 new mode 100755 diff --git a/flexiblepower.api/.project b/flexiblepower.api/.project old mode 100644 new mode 100755 diff --git a/flexiblepower.api/.settings/bndtools.core.prefs b/flexiblepower.api/.settings/bndtools.core.prefs old mode 100644 new mode 100755 diff --git a/flexiblepower.api/.settings/org.eclipse.core.resources.prefs b/flexiblepower.api/.settings/org.eclipse.core.resources.prefs old mode 100644 new mode 100755 diff --git a/flexiblepower.api/.settings/org.eclipse.jdt.core.prefs b/flexiblepower.api/.settings/org.eclipse.jdt.core.prefs old mode 100644 new mode 100755 diff --git a/flexiblepower.api/.settings/org.eclipse.jdt.ui.prefs b/flexiblepower.api/.settings/org.eclipse.jdt.ui.prefs old mode 100644 new mode 100755 diff --git a/flexiblepower.api/bnd.bnd b/flexiblepower.api/bnd.bnd old mode 100644 new mode 100755 index 25429ad..6af827d --- a/flexiblepower.api/bnd.bnd +++ b/flexiblepower.api/bnd.bnd @@ -6,16 +6,10 @@ Bundle-Version: 2.1.0.${qualifier} Export-Package: \ - javax.measure,\ - javax.measure.converter,\ - org.flexiblepower.rai,\ - javax.measure.quantity,\ - javax.measure.unit,\ - org.flexiblepower.control,\ - org.flexiblepower.observation,\ + javax.measure*,\ + org.flexiblepower.context,\ org.flexiblepower.messaging,\ - org.flexiblepower.rai.comm,\ - org.flexiblepower.rai.values,\ - org.flexiblepower.ral,\ + org.flexiblepower.observation,\ + org.flexiblepower.observation.ext,\ org.flexiblepower.time,\ org.flexiblepower.ui diff --git a/flexiblepower.api/build.gradle b/flexiblepower.api/build.gradle old mode 100644 new mode 100755 index 7c2d9e3..11f13b0 --- a/flexiblepower.api/build.gradle +++ b/flexiblepower.api/build.gradle @@ -1 +1,2 @@ checkstyleMain.exclude '**/javax/measure/**' + diff --git a/flexiblepower.api/res/OSGI-INF/permissions.perm b/flexiblepower.api/res/OSGI-INF/permissions.perm old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/DecimalMeasure.java b/flexiblepower.api/src/javax/measure/DecimalMeasure.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/Measurable.java b/flexiblepower.api/src/javax/measure/Measurable.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/Measure.java b/flexiblepower.api/src/javax/measure/Measure.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/MeasureFormat.java b/flexiblepower.api/src/javax/measure/MeasureFormat.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/VectorMeasure.java b/flexiblepower.api/src/javax/measure/VectorMeasure.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/converter/AddConverter.java b/flexiblepower.api/src/javax/measure/converter/AddConverter.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/converter/ConversionException.java b/flexiblepower.api/src/javax/measure/converter/ConversionException.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/converter/LogConverter.java b/flexiblepower.api/src/javax/measure/converter/LogConverter.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/converter/MultiplyConverter.java b/flexiblepower.api/src/javax/measure/converter/MultiplyConverter.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/converter/RationalConverter.java b/flexiblepower.api/src/javax/measure/converter/RationalConverter.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/converter/UnitConverter.java b/flexiblepower.api/src/javax/measure/converter/UnitConverter.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/converter/doc-files/converter.png b/flexiblepower.api/src/javax/measure/converter/doc-files/converter.png old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/converter/package.html b/flexiblepower.api/src/javax/measure/converter/package.html old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/package.html b/flexiblepower.api/src/javax/measure/package.html old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/packageinfo b/flexiblepower.api/src/javax/measure/packageinfo old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/Acceleration.java b/flexiblepower.api/src/javax/measure/quantity/Acceleration.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/AmountOfSubstance.java b/flexiblepower.api/src/javax/measure/quantity/AmountOfSubstance.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/Angle.java b/flexiblepower.api/src/javax/measure/quantity/Angle.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/AngularAcceleration.java b/flexiblepower.api/src/javax/measure/quantity/AngularAcceleration.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/AngularVelocity.java b/flexiblepower.api/src/javax/measure/quantity/AngularVelocity.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/Area.java b/flexiblepower.api/src/javax/measure/quantity/Area.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/CatalyticActivity.java b/flexiblepower.api/src/javax/measure/quantity/CatalyticActivity.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/DataAmount.java b/flexiblepower.api/src/javax/measure/quantity/DataAmount.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/DataRate.java b/flexiblepower.api/src/javax/measure/quantity/DataRate.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/Dimensionless.java b/flexiblepower.api/src/javax/measure/quantity/Dimensionless.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/Duration.java b/flexiblepower.api/src/javax/measure/quantity/Duration.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/DynamicViscosity.java b/flexiblepower.api/src/javax/measure/quantity/DynamicViscosity.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/ElectricCapacitance.java b/flexiblepower.api/src/javax/measure/quantity/ElectricCapacitance.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/ElectricCharge.java b/flexiblepower.api/src/javax/measure/quantity/ElectricCharge.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/ElectricConductance.java b/flexiblepower.api/src/javax/measure/quantity/ElectricConductance.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/ElectricCurrent.java b/flexiblepower.api/src/javax/measure/quantity/ElectricCurrent.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/ElectricInductance.java b/flexiblepower.api/src/javax/measure/quantity/ElectricInductance.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/ElectricPotential.java b/flexiblepower.api/src/javax/measure/quantity/ElectricPotential.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/ElectricResistance.java b/flexiblepower.api/src/javax/measure/quantity/ElectricResistance.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/Energy.java b/flexiblepower.api/src/javax/measure/quantity/Energy.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/Force.java b/flexiblepower.api/src/javax/measure/quantity/Force.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/Frequency.java b/flexiblepower.api/src/javax/measure/quantity/Frequency.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/Illuminance.java b/flexiblepower.api/src/javax/measure/quantity/Illuminance.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/KinematicViscosity.java b/flexiblepower.api/src/javax/measure/quantity/KinematicViscosity.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/Length.java b/flexiblepower.api/src/javax/measure/quantity/Length.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/LuminousFlux.java b/flexiblepower.api/src/javax/measure/quantity/LuminousFlux.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/LuminousIntensity.java b/flexiblepower.api/src/javax/measure/quantity/LuminousIntensity.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/MagneticFlux.java b/flexiblepower.api/src/javax/measure/quantity/MagneticFlux.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/MagneticFluxDensity.java b/flexiblepower.api/src/javax/measure/quantity/MagneticFluxDensity.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/Mass.java b/flexiblepower.api/src/javax/measure/quantity/Mass.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/MassFlowRate.java b/flexiblepower.api/src/javax/measure/quantity/MassFlowRate.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/Money.java b/flexiblepower.api/src/javax/measure/quantity/Money.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/MoneyFlow.java b/flexiblepower.api/src/javax/measure/quantity/MoneyFlow.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/Power.java b/flexiblepower.api/src/javax/measure/quantity/Power.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/Pressure.java b/flexiblepower.api/src/javax/measure/quantity/Pressure.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/Quantity.java b/flexiblepower.api/src/javax/measure/quantity/Quantity.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/RadiationDoseAbsorbed.java b/flexiblepower.api/src/javax/measure/quantity/RadiationDoseAbsorbed.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/RadiationDoseEffective.java b/flexiblepower.api/src/javax/measure/quantity/RadiationDoseEffective.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/RadioactiveActivity.java b/flexiblepower.api/src/javax/measure/quantity/RadioactiveActivity.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/SolidAngle.java b/flexiblepower.api/src/javax/measure/quantity/SolidAngle.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/Temperature.java b/flexiblepower.api/src/javax/measure/quantity/Temperature.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/Torque.java b/flexiblepower.api/src/javax/measure/quantity/Torque.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/Velocity.java b/flexiblepower.api/src/javax/measure/quantity/Velocity.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/Volume.java b/flexiblepower.api/src/javax/measure/quantity/Volume.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/VolumetricDensity.java b/flexiblepower.api/src/javax/measure/quantity/VolumetricDensity.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/VolumetricFlowRate.java b/flexiblepower.api/src/javax/measure/quantity/VolumetricFlowRate.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/quantity/package.html b/flexiblepower.api/src/javax/measure/quantity/package.html old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/unit/AlternateUnit.java b/flexiblepower.api/src/javax/measure/unit/AlternateUnit.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/unit/BaseUnit.java b/flexiblepower.api/src/javax/measure/unit/BaseUnit.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/unit/CompoundUnit.java b/flexiblepower.api/src/javax/measure/unit/CompoundUnit.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/unit/DerivedUnit.java b/flexiblepower.api/src/javax/measure/unit/DerivedUnit.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/unit/Dimension.java b/flexiblepower.api/src/javax/measure/unit/Dimension.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/unit/NonSI.java b/flexiblepower.api/src/javax/measure/unit/NonSI.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/unit/ProductUnit.java b/flexiblepower.api/src/javax/measure/unit/ProductUnit.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/unit/SI.java b/flexiblepower.api/src/javax/measure/unit/SI.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/unit/SystemOfUnits.java b/flexiblepower.api/src/javax/measure/unit/SystemOfUnits.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/unit/TransformedUnit.java b/flexiblepower.api/src/javax/measure/unit/TransformedUnit.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/unit/Unit.java b/flexiblepower.api/src/javax/measure/unit/Unit.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/unit/UnitFormat.java b/flexiblepower.api/src/javax/measure/unit/UnitFormat.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/unit/doc-files/momey.png b/flexiblepower.api/src/javax/measure/unit/doc-files/momey.png old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/unit/doc-files/unit.png b/flexiblepower.api/src/javax/measure/unit/doc-files/unit.png old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/javax/measure/unit/package.html b/flexiblepower.api/src/javax/measure/unit/package.html old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/org/flexiblepower/context/FlexiblePowerContext.java b/flexiblepower.api/src/org/flexiblepower/context/FlexiblePowerContext.java new file mode 100755 index 0000000..a8bea37 --- /dev/null +++ b/flexiblepower.api/src/org/flexiblepower/context/FlexiblePowerContext.java @@ -0,0 +1,17 @@ +package org.flexiblepower.context; + +import java.util.Date; + +public interface FlexiblePowerContext { + + long currentTimeMillis(); + + Date currentTime(); + + Scheduler getScheduler(); + + boolean isSimulation(); + + Simulation getSimulation(); + +} diff --git a/flexiblepower.api/src/org/flexiblepower/context/Scheduler.java b/flexiblepower.api/src/org/flexiblepower/context/Scheduler.java new file mode 100755 index 0000000..5f82316 --- /dev/null +++ b/flexiblepower.api/src/org/flexiblepower/context/Scheduler.java @@ -0,0 +1,158 @@ +package org.flexiblepower.context; + +import java.util.concurrent.Callable; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; + +import javax.measure.Measurable; +import javax.measure.quantity.Duration; + +/** + * A {@link Scheduler} is a class similar to the {@link ScheduledExecutorService} that is delivered by java, but it can + * not be managed externally. You can submit tasks to the scheduler + */ +public interface Scheduler { + /** + * Submits a value-returning task for execution and returns a Future representing the pending results of the task. + * The Future's {@code get} method will return the task's result upon successful completion. + * + *

+ * If you would like to immediately block waiting for a task, you can use constructions of the form + * {@code result = exec.submit(aCallable).get();} + * + *

+ * Note: The {@link Executors} class includes a set of methods that can convert some other common closure-like + * objects, for example, {@link java.security.PrivilegedAction} to {@link Callable} form so they can be submitted. + * + * @param task + * the task to submit + * @param + * the type of the task's result + * @return a Future representing pending completion of the task + * @throws RejectedExecutionException + * if the task cannot be scheduled for execution + * @throws NullPointerException + * if the task is null + */ + Future submit(Callable task); + + /** + * Submits a Runnable task for execution and returns a Future representing that task. The Future's {@code get} + * method will return the given result upon successful completion. + * + * @param task + * the task to submit + * @param result + * the result to return + * @param + * the type of the result + * @return a Future representing pending completion of the task + * @throws RejectedExecutionException + * if the task cannot be scheduled for execution + * @throws NullPointerException + * if the task is null + */ + Future submit(Runnable task, T result); + + /** + * Submits a Runnable task for execution and returns a Future representing that task. The Future's {@code get} + * method will return {@code null} upon successful completion. + * + * @param task + * the task to submit + * @return a Future representing pending completion of the task + * @throws RejectedExecutionException + * if the task cannot be scheduled for execution + * @throws NullPointerException + * if the task is null + */ + Future submit(Runnable task); + + /** + * Creates and executes a one-shot action that becomes enabled after the given delay. + * + * @param command + * the task to execute + * @param delay + * the time from now to delay execution + * @return a ScheduledFuture representing pending completion of the task and whose {@code get()} method will return + * {@code null} upon completion + * @throws RejectedExecutionException + * if the task cannot be scheduled for execution + * @throws NullPointerException + * if command is null + */ + ScheduledFuture schedule(Runnable command, Measurable delay); + + /** + * Creates and executes a ScheduledFuture that becomes enabled after the given delay. + * + * @param callable + * the function to execute + * @param delay + * the time from now to delay execution + * @param + * the type of the callable's result + * @return a ScheduledFuture that can be used to extract result or cancel + * @throws RejectedExecutionException + * if the task cannot be scheduled for execution + * @throws NullPointerException + * if callable is null + */ + ScheduledFuture schedule(Callable callable, Measurable delay); + + /** + * Creates and executes a periodic action that becomes enabled first after the given initial delay, and subsequently + * with the given period; that is executions will commence after {@code initialDelay} then + * {@code initialDelay+period}, then {@code initialDelay + 2 * period}, and so on. If any execution of the task + * encounters an exception, subsequent executions are suppressed. Otherwise, the task will only terminate via + * cancellation or termination of the executor. If any execution of this task takes longer than its period, then + * subsequent executions may start late, but will not concurrently execute. + * + * @param command + * the task to execute + * @param initialDelay + * the time to delay first execution + * @param period + * the period between successive executions + * @return a ScheduledFuture representing pending completion of the task, and whose {@code get()} method will throw + * an exception upon cancellation + * @throws RejectedExecutionException + * if the task cannot be scheduled for execution + * @throws NullPointerException + * if command is null + * @throws IllegalArgumentException + * if period less than or equal to zero + */ + ScheduledFuture scheduleAtFixedRate(Runnable command, + Measurable initialDelay, + Measurable period); + + /** + * Creates and executes a periodic action that becomes enabled first after the given initial delay, and subsequently + * with the given delay between the termination of one execution and the commencement of the next. If any execution + * of the task encounters an exception, subsequent executions are suppressed. Otherwise, the task will only + * terminate via cancellation or termination of the executor. + * + * @param command + * the task to execute + * @param initialDelay + * the time to delay first execution + * @param delay + * the delay between the termination of one execution and the commencement of the next + * @return a ScheduledFuture representing pending completion of the task, and whose {@code get()} method will throw + * an exception upon cancellation + * @throws RejectedExecutionException + * if the task cannot be scheduled for execution + * @throws NullPointerException + * if command is null + * @throws IllegalArgumentException + * if delay less than or equal to zero + */ + ScheduledFuture scheduleWithFixedDelay(Runnable command, + Measurable initialDelay, + Measurable delay); +} diff --git a/flexiblepower.api.ext/src/org/flexiblepower/simulation/Simulation.java b/flexiblepower.api/src/org/flexiblepower/context/Simulation.java old mode 100644 new mode 100755 similarity index 93% rename from flexiblepower.api.ext/src/org/flexiblepower/simulation/Simulation.java rename to flexiblepower.api/src/org/flexiblepower/context/Simulation.java index d337aa2..5529dd2 --- a/flexiblepower.api.ext/src/org/flexiblepower/simulation/Simulation.java +++ b/flexiblepower.api/src/org/flexiblepower/context/Simulation.java @@ -1,14 +1,12 @@ -package org.flexiblepower.simulation; +package org.flexiblepower.context; import java.util.Date; -import org.flexiblepower.time.TimeService; - /** * When a service of this type is available in the service repository, we are running in a simulation environment. It is * possible for any package to give a controlling mechanism for this simulation. */ -public interface Simulation extends TimeService { +public interface Simulation { /** * The current state of the simulation. */ @@ -33,7 +31,7 @@ public static enum State { /** * Starts the simulation without a planned ending. - * + * * @param startTime * The virtual time at which to start the simulation. * @param speedFactor @@ -43,7 +41,7 @@ public static enum State { /** * Starts the simulation with a planned ending. - * + * * @param startTime * The virtual time at which to start the simulation. * @param stopTime @@ -70,7 +68,7 @@ public static enum State { /** * Changes the speedfactor during the run of the simulation. When the simulation has stopped, this has no effect. - * + * * @param newSpeedFactor * The new speedFactor. */ diff --git a/flexiblepower.api/src/org/flexiblepower/context/package-info.java b/flexiblepower.api/src/org/flexiblepower/context/package-info.java new file mode 100755 index 0000000..27ff42f --- /dev/null +++ b/flexiblepower.api/src/org/flexiblepower/context/package-info.java @@ -0,0 +1,3 @@ +@Version("1.0.0.${qualifier}") +package org.flexiblepower.context; +import aQute.bnd.annotation.Version; diff --git a/flexiblepower.api/src/org/flexiblepower/messaging/Cardinality.java b/flexiblepower.api/src/org/flexiblepower/messaging/Cardinality.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/org/flexiblepower/messaging/Connection.java b/flexiblepower.api/src/org/flexiblepower/messaging/Connection.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/org/flexiblepower/messaging/ConnectionManager.java b/flexiblepower.api/src/org/flexiblepower/messaging/ConnectionManager.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/org/flexiblepower/messaging/Endpoint.java b/flexiblepower.api/src/org/flexiblepower/messaging/Endpoint.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/org/flexiblepower/messaging/MessageHandler.java b/flexiblepower.api/src/org/flexiblepower/messaging/MessageHandler.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/org/flexiblepower/messaging/Port.java b/flexiblepower.api/src/org/flexiblepower/messaging/Port.java old mode 100644 new mode 100755 index 6208713..ee628eb --- a/flexiblepower.api/src/org/flexiblepower/messaging/Port.java +++ b/flexiblepower.api/src/org/flexiblepower/messaging/Port.java @@ -6,8 +6,6 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import org.flexiblepower.ral.ResourceManager; - /** * The {@link Port} annotation should be put on {@link Endpoint}s that are registered in the service registry. It * indicates what kind of connections it can support (including what object it can send, receive and the cardinality). diff --git a/flexiblepower.api/src/org/flexiblepower/messaging/Ports.java b/flexiblepower.api/src/org/flexiblepower/messaging/Ports.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/org/flexiblepower/messaging/package-info.java b/flexiblepower.api/src/org/flexiblepower/messaging/package-info.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/org/flexiblepower/observation/Observation.java b/flexiblepower.api/src/org/flexiblepower/observation/Observation.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/org/flexiblepower/observation/ObservationConsumer.java b/flexiblepower.api/src/org/flexiblepower/observation/ObservationConsumer.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/org/flexiblepower/observation/ObservationProvider.java b/flexiblepower.api/src/org/flexiblepower/observation/ObservationProvider.java old mode 100644 new mode 100755 index 1be6565..a85401a --- a/flexiblepower.api/src/org/flexiblepower/observation/ObservationProvider.java +++ b/flexiblepower.api/src/org/flexiblepower/observation/ObservationProvider.java @@ -1,7 +1,5 @@ package org.flexiblepower.observation; -import org.flexiblepower.ral.ResourceDriver; - /** * The {@link ObservationProvider} is any object that wants to publish {@link Observation}s to a * {@link ObservationConsumer}. When using OSGi, there are a couple of properties that should be registered to make it diff --git a/flexiblepower.api/src/org/flexiblepower/observation/ObservationTranslationHelper.java b/flexiblepower.api/src/org/flexiblepower/observation/ObservationTranslationHelper.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api.ext/src/org/flexiblepower/observation/ext/AbstractObservationProvider.java b/flexiblepower.api/src/org/flexiblepower/observation/ext/AbstractObservationProvider.java similarity index 100% rename from flexiblepower.api.ext/src/org/flexiblepower/observation/ext/AbstractObservationProvider.java rename to flexiblepower.api/src/org/flexiblepower/observation/ext/AbstractObservationProvider.java diff --git a/flexiblepower.api.ext/src/org/flexiblepower/observation/ext/ObservationAttribute.java b/flexiblepower.api/src/org/flexiblepower/observation/ext/ObservationAttribute.java similarity index 100% rename from flexiblepower.api.ext/src/org/flexiblepower/observation/ext/ObservationAttribute.java rename to flexiblepower.api/src/org/flexiblepower/observation/ext/ObservationAttribute.java diff --git a/flexiblepower.api.ext/src/org/flexiblepower/observation/ext/ObservationProviderRegistrationHelper.java b/flexiblepower.api/src/org/flexiblepower/observation/ext/ObservationProviderRegistrationHelper.java similarity index 100% rename from flexiblepower.api.ext/src/org/flexiblepower/observation/ext/ObservationProviderRegistrationHelper.java rename to flexiblepower.api/src/org/flexiblepower/observation/ext/ObservationProviderRegistrationHelper.java diff --git a/flexiblepower.api.ext/src/org/flexiblepower/observation/ext/package-info.java b/flexiblepower.api/src/org/flexiblepower/observation/ext/package-info.java similarity index 100% rename from flexiblepower.api.ext/src/org/flexiblepower/observation/ext/package-info.java rename to flexiblepower.api/src/org/flexiblepower/observation/ext/package-info.java diff --git a/flexiblepower.api/src/org/flexiblepower/observation/package-info.java b/flexiblepower.api/src/org/flexiblepower/observation/package-info.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/org/flexiblepower/time/TimeService.java b/flexiblepower.api/src/org/flexiblepower/time/TimeService.java deleted file mode 100644 index 1a27559..0000000 --- a/flexiblepower.api/src/org/flexiblepower/time/TimeService.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.flexiblepower.time; - -import java.util.Date; - -/** - * The {@link TimeService} is always provided by the runtime environment and should be used to get the current time. - * When doing this at all times, you make sure that the code is also easily ported to the simulation runtime in which the - * time can be simulated. - */ -public interface TimeService { - /** - * @return The current time as a {@link Date} object. In a normal runtime this would be equal to - * new Date(). - */ - Date getTime(); - - /** - * @see System#currentTimeMillis() - * @return The current time as milliseconds since epoch. In a normal runtime this would be equal to - * System.currentTimeMillis(). - */ - long getCurrentTimeMillis(); -} diff --git a/flexiblepower.api/src/org/flexiblepower/time/TimeUtil.java b/flexiblepower.api/src/org/flexiblepower/time/TimeUtil.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/org/flexiblepower/time/package-info.java b/flexiblepower.api/src/org/flexiblepower/time/package-info.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/org/flexiblepower/ui/Widget.java b/flexiblepower.api/src/org/flexiblepower/ui/Widget.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/src/org/flexiblepower/ui/package-info.java b/flexiblepower.api/src/org/flexiblepower/ui/package-info.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/test/org/flexiblepower/observation/ObservationTest.java b/flexiblepower.api/test/org/flexiblepower/observation/ObservationTest.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api/test/org/flexiblepower/observation/ObservationTranslationHelperTest.java b/flexiblepower.api/test/org/flexiblepower/observation/ObservationTranslationHelperTest.java old mode 100644 new mode 100755 diff --git a/flexiblepower.api.efi.utils/.checkstyle b/flexiblepower.ral.efi.utils/.checkstyle similarity index 100% rename from flexiblepower.api.efi.utils/.checkstyle rename to flexiblepower.ral.efi.utils/.checkstyle diff --git a/flexiblepower.api.efi.utils/.classpath b/flexiblepower.ral.efi.utils/.classpath similarity index 100% rename from flexiblepower.api.efi.utils/.classpath rename to flexiblepower.ral.efi.utils/.classpath diff --git a/flexiblepower.ral.efi.utils/.project b/flexiblepower.ral.efi.utils/.project new file mode 100644 index 0000000..eecfb59 --- /dev/null +++ b/flexiblepower.ral.efi.utils/.project @@ -0,0 +1,29 @@ + + + flexiblepower.ral.efi.utils + + + + + + org.eclipse.jdt.core.javabuilder + + + + + bndtools.core.bndbuilder + + + + + net.sf.eclipsecs.core.CheckstyleBuilder + + + + + + org.eclipse.jdt.core.javanature + bndtools.core.bndnature + net.sf.eclipsecs.core.CheckstyleNature + + diff --git a/flexiblepower.api.efi.utils/.settings/bndtools.core.prefs b/flexiblepower.ral.efi.utils/.settings/bndtools.core.prefs similarity index 100% rename from flexiblepower.api.efi.utils/.settings/bndtools.core.prefs rename to flexiblepower.ral.efi.utils/.settings/bndtools.core.prefs diff --git a/flexiblepower.api.efi.utils/.settings/org.eclipse.core.resources.prefs b/flexiblepower.ral.efi.utils/.settings/org.eclipse.core.resources.prefs similarity index 100% rename from flexiblepower.api.efi.utils/.settings/org.eclipse.core.resources.prefs rename to flexiblepower.ral.efi.utils/.settings/org.eclipse.core.resources.prefs diff --git a/flexiblepower.api.efi.utils/.settings/org.eclipse.jdt.core.prefs b/flexiblepower.ral.efi.utils/.settings/org.eclipse.jdt.core.prefs similarity index 100% rename from flexiblepower.api.efi.utils/.settings/org.eclipse.jdt.core.prefs rename to flexiblepower.ral.efi.utils/.settings/org.eclipse.jdt.core.prefs diff --git a/flexiblepower.api.efi.utils/.settings/org.eclipse.jdt.ui.prefs b/flexiblepower.ral.efi.utils/.settings/org.eclipse.jdt.ui.prefs similarity index 100% rename from flexiblepower.api.efi.utils/.settings/org.eclipse.jdt.ui.prefs rename to flexiblepower.ral.efi.utils/.settings/org.eclipse.jdt.ui.prefs diff --git a/flexiblepower.api.efi.utils/bnd.bnd b/flexiblepower.ral.efi.utils/bnd.bnd similarity index 78% rename from flexiblepower.api.efi.utils/bnd.bnd rename to flexiblepower.ral.efi.utils/bnd.bnd index d8959df..9fed646 100644 --- a/flexiblepower.api.efi.utils/bnd.bnd +++ b/flexiblepower.ral.efi.utils/bnd.bnd @@ -1,7 +1,8 @@ -buildpath: \ biz.aQute.bnd.annotation,\ flexiblepower.api;version=latest,\ - flexiblepower.api.efi;version=latest,\ + flexiblepower.ral;version=latest,\ + flexiblepower.ral.efi;version=latest,\ junit.osgi Bundle-Version: 2.0.0.${qualifier} diff --git a/flexiblepower.api.efi.utils/res/OSGI-INF/permissions.perm b/flexiblepower.ral.efi.utils/res/OSGI-INF/permissions.perm similarity index 100% rename from flexiblepower.api.efi.utils/res/OSGI-INF/permissions.perm rename to flexiblepower.ral.efi.utils/res/OSGI-INF/permissions.perm diff --git a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/Buffer.java b/flexiblepower.ral.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/Buffer.java similarity index 99% rename from flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/Buffer.java rename to flexiblepower.ral.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/Buffer.java index d6705df..ee6df41 100644 --- a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/Buffer.java +++ b/flexiblepower.ral.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/Buffer.java @@ -20,7 +20,7 @@ import org.flexiblepower.efi.buffer.LeakageRate; import org.flexiblepower.efi.util.FillLevelFunction; import org.flexiblepower.efi.util.TimerUpdate; -import org.flexiblepower.rai.values.Commodity; +import org.flexiblepower.ral.values.Commodity; /** * This class processes EFI messages: (buffer registration, system description and update messages). It offers helper diff --git a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/BufferActuator.java b/flexiblepower.ral.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/BufferActuator.java similarity index 99% rename from flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/BufferActuator.java rename to flexiblepower.ral.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/BufferActuator.java index c7fbc33..3e728e5 100644 --- a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/BufferActuator.java +++ b/flexiblepower.ral.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/BufferActuator.java @@ -20,8 +20,8 @@ import org.flexiblepower.efi.util.FillLevelFunction.RangeElement; import org.flexiblepower.efi.util.RunningMode; import org.flexiblepower.efi.util.Transition; -import org.flexiblepower.rai.values.Commodity; -import org.flexiblepower.rai.values.CommoditySet; +import org.flexiblepower.ral.values.Commodity; +import org.flexiblepower.ral.values.CommoditySet; /** * The BufferActuator that integrates updated EFI messages and provides additional methods. diff --git a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/package-info.java b/flexiblepower.ral.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/package-info.java similarity index 100% rename from flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/package-info.java rename to flexiblepower.ral.efi.utils/src/org/flexiblepower/api/efi/bufferhelper/package-info.java diff --git a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/commonhelper/TimerModel.java b/flexiblepower.ral.efi.utils/src/org/flexiblepower/api/efi/commonhelper/TimerModel.java similarity index 100% rename from flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/commonhelper/TimerModel.java rename to flexiblepower.ral.efi.utils/src/org/flexiblepower/api/efi/commonhelper/TimerModel.java diff --git a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/commonhelper/package-info.java b/flexiblepower.ral.efi.utils/src/org/flexiblepower/api/efi/commonhelper/package-info.java similarity index 100% rename from flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/commonhelper/package-info.java rename to flexiblepower.ral.efi.utils/src/org/flexiblepower/api/efi/commonhelper/package-info.java diff --git a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/Unconstrained.java b/flexiblepower.ral.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/Unconstrained.java similarity index 99% rename from flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/Unconstrained.java rename to flexiblepower.ral.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/Unconstrained.java index 66564bf..d36760f 100644 --- a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/Unconstrained.java +++ b/flexiblepower.ral.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/Unconstrained.java @@ -20,8 +20,8 @@ import org.flexiblepower.efi.util.RunningMode; import org.flexiblepower.efi.util.TimerUpdate; import org.flexiblepower.efi.util.Transition; -import org.flexiblepower.rai.values.Commodity; -import org.flexiblepower.rai.values.CommoditySet; +import org.flexiblepower.ral.values.Commodity; +import org.flexiblepower.ral.values.CommoditySet; /** * This class contains helper functions to process the Unconstrained EFI messages (registration, update and system diff --git a/flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/package-info.java b/flexiblepower.ral.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/package-info.java similarity index 100% rename from flexiblepower.api.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/package-info.java rename to flexiblepower.ral.efi.utils/src/org/flexiblepower/api/efi/unconstrainedhelper/package-info.java diff --git a/flexiblepower.api.efi.utils/test/flexiblepower/api/efi/bufferhelper/BufferTest.java b/flexiblepower.ral.efi.utils/test/flexiblepower/api/efi/bufferhelper/BufferTest.java similarity index 99% rename from flexiblepower.api.efi.utils/test/flexiblepower/api/efi/bufferhelper/BufferTest.java rename to flexiblepower.ral.efi.utils/test/flexiblepower/api/efi/bufferhelper/BufferTest.java index 13a993d..aebf473 100644 --- a/flexiblepower.api.efi.utils/test/flexiblepower/api/efi/bufferhelper/BufferTest.java +++ b/flexiblepower.ral.efi.utils/test/flexiblepower/api/efi/bufferhelper/BufferTest.java @@ -33,8 +33,8 @@ import org.flexiblepower.efi.util.Timer; import org.flexiblepower.efi.util.TimerUpdate; import org.flexiblepower.efi.util.Transition; -import org.flexiblepower.rai.values.CommodityMeasurables; -import org.flexiblepower.rai.values.CommoditySet; +import org.flexiblepower.ral.values.CommodityMeasurables; +import org.flexiblepower.ral.values.CommoditySet; public class BufferTest extends TestCase { private Buffer fullBuffer; diff --git a/flexiblepower.api.efi.utils/test/flexiblepower/api/efi/unconstrainedhelper/UnconstrainedTest.java b/flexiblepower.ral.efi.utils/test/flexiblepower/api/efi/unconstrainedhelper/UnconstrainedTest.java similarity index 98% rename from flexiblepower.api.efi.utils/test/flexiblepower/api/efi/unconstrainedhelper/UnconstrainedTest.java rename to flexiblepower.ral.efi.utils/test/flexiblepower/api/efi/unconstrainedhelper/UnconstrainedTest.java index d52085e..e3bac4b 100644 --- a/flexiblepower.api.efi.utils/test/flexiblepower/api/efi/unconstrainedhelper/UnconstrainedTest.java +++ b/flexiblepower.ral.efi.utils/test/flexiblepower/api/efi/unconstrainedhelper/UnconstrainedTest.java @@ -24,8 +24,8 @@ import org.flexiblepower.efi.util.Timer; import org.flexiblepower.efi.util.TimerUpdate; import org.flexiblepower.efi.util.Transition; -import org.flexiblepower.rai.values.CommodityMeasurables; -import org.flexiblepower.rai.values.CommoditySet; +import org.flexiblepower.ral.values.CommodityMeasurables; +import org.flexiblepower.ral.values.CommoditySet; public class UnconstrainedTest extends TestCase { private Unconstrained fullUnconstrained; diff --git a/flexiblepower.api.efi.utils/test/org/flexiblepower/api/efi/commonhelper/TimerModelTest.java b/flexiblepower.ral.efi.utils/test/org/flexiblepower/api/efi/commonhelper/TimerModelTest.java similarity index 100% rename from flexiblepower.api.efi.utils/test/org/flexiblepower/api/efi/commonhelper/TimerModelTest.java rename to flexiblepower.ral.efi.utils/test/org/flexiblepower/api/efi/commonhelper/TimerModelTest.java diff --git a/flexiblepower.api.efi/.checkstyle b/flexiblepower.ral.efi/.checkstyle old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/.checkstyle rename to flexiblepower.ral.efi/.checkstyle diff --git a/flexiblepower.api.efi/.classpath b/flexiblepower.ral.efi/.classpath old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/.classpath rename to flexiblepower.ral.efi/.classpath diff --git a/flexiblepower.api.efi.utils/.project b/flexiblepower.ral.efi/.project old mode 100644 new mode 100755 similarity index 94% rename from flexiblepower.api.efi.utils/.project rename to flexiblepower.ral.efi/.project index f59608a..7da8552 --- a/flexiblepower.api.efi.utils/.project +++ b/flexiblepower.ral.efi/.project @@ -1,6 +1,6 @@ - flexiblepower.api.efi + flexiblepower.ral.efi diff --git a/flexiblepower.api.efi/.settings/bndtools.core.prefs b/flexiblepower.ral.efi/.settings/bndtools.core.prefs old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/.settings/bndtools.core.prefs rename to flexiblepower.ral.efi/.settings/bndtools.core.prefs diff --git a/flexiblepower.api.efi/.settings/org.eclipse.core.resources.prefs b/flexiblepower.ral.efi/.settings/org.eclipse.core.resources.prefs old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/.settings/org.eclipse.core.resources.prefs rename to flexiblepower.ral.efi/.settings/org.eclipse.core.resources.prefs diff --git a/flexiblepower.api.efi/.settings/org.eclipse.jdt.core.prefs b/flexiblepower.ral.efi/.settings/org.eclipse.jdt.core.prefs old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/.settings/org.eclipse.jdt.core.prefs rename to flexiblepower.ral.efi/.settings/org.eclipse.jdt.core.prefs diff --git a/flexiblepower.api.efi/.settings/org.eclipse.jdt.ui.prefs b/flexiblepower.ral.efi/.settings/org.eclipse.jdt.ui.prefs old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/.settings/org.eclipse.jdt.ui.prefs rename to flexiblepower.ral.efi/.settings/org.eclipse.jdt.ui.prefs diff --git a/flexiblepower.ral.efi/bnd.bnd b/flexiblepower.ral.efi/bnd.bnd new file mode 100755 index 0000000..21c1d8e --- /dev/null +++ b/flexiblepower.ral.efi/bnd.bnd @@ -0,0 +1,11 @@ +-buildpath: \ + osgi.cmpn;version='[4.3,5)',\ + osgi.core;version='[4.3,5)',\ + junit.osgi;version='[3.8,4)',\ + biz.aQute.bnd.annotation,\ + flexiblepower.api;version=latest,\ + flexiblepower.ral;version=latest + +Bundle-Version: 1.0.0.${qualifier} +Export-Package: org.flexiblepower.efi* + diff --git a/flexiblepower.api.efi/res/OSGI-INF/permissions.perm b/flexiblepower.ral.efi/res/OSGI-INF/permissions.perm old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/res/OSGI-INF/permissions.perm rename to flexiblepower.ral.efi/res/OSGI-INF/permissions.perm diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/BufferResourceManager.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/BufferResourceManager.java old mode 100644 new mode 100755 similarity index 78% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/BufferResourceManager.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/BufferResourceManager.java index ca554df..485eab6 --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/BufferResourceManager.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/BufferResourceManager.java @@ -5,10 +5,10 @@ import org.flexiblepower.efi.buffer.BufferUpdate; import org.flexiblepower.messaging.Cardinality; import org.flexiblepower.messaging.Port; -import org.flexiblepower.rai.AllocationRevoke; -import org.flexiblepower.rai.AllocationStatusUpdate; -import org.flexiblepower.rai.ControlSpaceRevoke; import org.flexiblepower.ral.ResourceManager; +import org.flexiblepower.ral.messages.AllocationRevoke; +import org.flexiblepower.ral.messages.AllocationStatusUpdate; +import org.flexiblepower.ral.messages.ControlSpaceRevoke; @Port(name = "controller", accepts = { BufferAllocation.class, AllocationRevoke.class }, diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/EfiControllerManager.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/EfiControllerManager.java old mode 100644 new mode 100755 similarity index 93% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/EfiControllerManager.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/EfiControllerManager.java index d91e150..b179efe --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/EfiControllerManager.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/EfiControllerManager.java @@ -15,10 +15,10 @@ import org.flexiblepower.messaging.Cardinality; import org.flexiblepower.messaging.Port; import org.flexiblepower.messaging.Ports; -import org.flexiblepower.rai.AllocationRevoke; -import org.flexiblepower.rai.AllocationStatusUpdate; -import org.flexiblepower.rai.ControlSpaceRevoke; import org.flexiblepower.ral.ControllerManager; +import org.flexiblepower.ral.messages.AllocationRevoke; +import org.flexiblepower.ral.messages.AllocationStatusUpdate; +import org.flexiblepower.ral.messages.ControlSpaceRevoke; @Ports({ @Port(name = "buffer", accepts = { BufferRegistration.class, diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/TimeShifterResourceManager.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/TimeShifterResourceManager.java old mode 100644 new mode 100755 similarity index 80% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/TimeShifterResourceManager.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/TimeShifterResourceManager.java index 58e1276..1ea324a --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/TimeShifterResourceManager.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/TimeShifterResourceManager.java @@ -5,10 +5,10 @@ import org.flexiblepower.efi.timeshifter.TimeShifterUpdate; import org.flexiblepower.messaging.Cardinality; import org.flexiblepower.messaging.Port; -import org.flexiblepower.rai.AllocationRevoke; -import org.flexiblepower.rai.AllocationStatusUpdate; -import org.flexiblepower.rai.ControlSpaceRevoke; import org.flexiblepower.ral.ResourceManager; +import org.flexiblepower.ral.messages.AllocationRevoke; +import org.flexiblepower.ral.messages.AllocationStatusUpdate; +import org.flexiblepower.ral.messages.ControlSpaceRevoke; @Port(name = "controller", accepts = { TimeShifterAllocation.class, AllocationRevoke.class }, diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/UnconstrainedResourceManager.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/UnconstrainedResourceManager.java old mode 100644 new mode 100755 similarity index 81% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/UnconstrainedResourceManager.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/UnconstrainedResourceManager.java index 8b5de07..f22800d --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/UnconstrainedResourceManager.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/UnconstrainedResourceManager.java @@ -5,10 +5,10 @@ import org.flexiblepower.efi.unconstrained.UnconstrainedUpdate; import org.flexiblepower.messaging.Cardinality; import org.flexiblepower.messaging.Port; -import org.flexiblepower.rai.AllocationRevoke; -import org.flexiblepower.rai.AllocationStatusUpdate; -import org.flexiblepower.rai.ControlSpaceRevoke; import org.flexiblepower.ral.ResourceManager; +import org.flexiblepower.ral.messages.AllocationRevoke; +import org.flexiblepower.ral.messages.AllocationStatusUpdate; +import org.flexiblepower.ral.messages.ControlSpaceRevoke; @Port(name = "controller", accepts = { UnconstrainedAllocation.class, AllocationRevoke.class }, diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/UncontrolledResourceManager.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/UncontrolledResourceManager.java old mode 100644 new mode 100755 similarity index 81% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/UncontrolledResourceManager.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/UncontrolledResourceManager.java index e29d8cc..e0cd75e --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/UncontrolledResourceManager.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/UncontrolledResourceManager.java @@ -5,10 +5,10 @@ import org.flexiblepower.efi.uncontrolled.UncontrolledUpdate; import org.flexiblepower.messaging.Cardinality; import org.flexiblepower.messaging.Port; -import org.flexiblepower.rai.AllocationRevoke; -import org.flexiblepower.rai.AllocationStatusUpdate; -import org.flexiblepower.rai.ControlSpaceRevoke; import org.flexiblepower.ral.ResourceManager; +import org.flexiblepower.ral.messages.AllocationRevoke; +import org.flexiblepower.ral.messages.AllocationStatusUpdate; +import org.flexiblepower.ral.messages.ControlSpaceRevoke; @Port(name = "controller", accepts = { UncontrolledAllocation.class, AllocationRevoke.class }, diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/Actuator.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/Actuator.java old mode 100644 new mode 100755 similarity index 97% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/Actuator.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/Actuator.java index 5f3ae14..da37327 --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/Actuator.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/Actuator.java @@ -1,7 +1,7 @@ package org.flexiblepower.efi.buffer; -import org.flexiblepower.rai.values.Commodity; -import org.flexiblepower.rai.values.CommoditySet; +import org.flexiblepower.ral.values.Commodity; +import org.flexiblepower.ral.values.CommoditySet; /** * This class describes the capabilities of an actuator within an appliance of the buffer category. diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/ActuatorAllocation.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/ActuatorAllocation.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/ActuatorAllocation.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/ActuatorAllocation.java diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/ActuatorBehaviour.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/ActuatorBehaviour.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/ActuatorBehaviour.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/ActuatorBehaviour.java diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/ActuatorUpdate.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/ActuatorUpdate.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/ActuatorUpdate.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/ActuatorUpdate.java diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferAllocation.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/BufferAllocation.java old mode 100644 new mode 100755 similarity index 94% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferAllocation.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/BufferAllocation.java index 9b8e3cd..a3a1403 --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferAllocation.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/BufferAllocation.java @@ -3,8 +3,8 @@ import java.util.Date; import java.util.Set; -import org.flexiblepower.rai.Allocation; -import org.flexiblepower.rai.ControlSpaceUpdate; +import org.flexiblepower.ral.messages.Allocation; +import org.flexiblepower.ral.messages.ControlSpaceUpdate; /** * This class is derived from {@link Allocation} and contains specific allocation information for a buffer appliance. diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferRegistration.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/BufferRegistration.java old mode 100644 new mode 100755 similarity index 98% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferRegistration.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/BufferRegistration.java index bdabcca..b0514fa --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferRegistration.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/BufferRegistration.java @@ -11,8 +11,7 @@ import javax.measure.quantity.Quantity; import javax.measure.unit.Unit; -import org.flexiblepower.rai.ControlSpaceRegistration; -import org.flexiblepower.time.TimeService; +import org.flexiblepower.ral.messages.ControlSpaceRegistration; /** * This class is derived from ControlSpaceRegistration and contains the registration items that are unique to a buffer. diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferStateUpdate.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/BufferStateUpdate.java old mode 100644 new mode 100755 similarity index 98% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferStateUpdate.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/BufferStateUpdate.java index b067a6d..255f20b --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferStateUpdate.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/BufferStateUpdate.java @@ -8,8 +8,6 @@ import javax.measure.quantity.Quantity; import javax.measure.unit.Unit; -import org.flexiblepower.time.TimeService; - /** * This class contains up to date information about the state of the buffer. * diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferSystemDescription.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/BufferSystemDescription.java old mode 100644 new mode 100755 similarity index 99% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferSystemDescription.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/BufferSystemDescription.java index 9ea553a..22d728d --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferSystemDescription.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/BufferSystemDescription.java @@ -8,7 +8,6 @@ import java.util.TreeMap; import org.flexiblepower.efi.util.FillLevelFunction; -import org.flexiblepower.time.TimeService; /** * This class is derived from BufferUpdate and contains the actuators and the buffer leakage information. diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferTargetProfileUpdate.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/BufferTargetProfileUpdate.java old mode 100644 new mode 100755 similarity index 94% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferTargetProfileUpdate.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/BufferTargetProfileUpdate.java index 11b5666..737f899 --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferTargetProfileUpdate.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/BufferTargetProfileUpdate.java @@ -4,8 +4,7 @@ import javax.measure.quantity.Quantity; -import org.flexiblepower.rai.values.ConstraintProfile; -import org.flexiblepower.time.TimeService; +import org.flexiblepower.ral.values.ConstraintProfile; /** * This message is being used to communicate a target profile that has to be met by this buffer. It is important to diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferUpdate.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/BufferUpdate.java old mode 100644 new mode 100755 similarity index 89% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferUpdate.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/BufferUpdate.java index 34d5ddd..3901b82 --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferUpdate.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/BufferUpdate.java @@ -2,8 +2,7 @@ import java.util.Date; -import org.flexiblepower.rai.ControlSpaceUpdate; -import org.flexiblepower.time.TimeService; +import org.flexiblepower.ral.messages.ControlSpaceUpdate; /** * This class is derived from {@link ControlSpaceUpdate} and is used to bundle all updates from an appliance of the diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferUsageForecast.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/BufferUsageForecast.java old mode 100644 new mode 100755 similarity index 95% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferUsageForecast.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/BufferUsageForecast.java index dc0a7fb..060d73b --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/BufferUsageForecast.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/BufferUsageForecast.java @@ -4,7 +4,7 @@ import javax.measure.quantity.Quantity; -import org.flexiblepower.rai.values.UncertainMeasurableProfile; +import org.flexiblepower.ral.values.UncertainMeasurableProfile; public class BufferUsageForecast extends BufferUpdate { private final UncertainMeasurableProfile profile; diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/LeakageRate.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/LeakageRate.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/LeakageRate.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/LeakageRate.java diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/RunningModeBehaviour.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/RunningModeBehaviour.java old mode 100644 new mode 100755 similarity index 98% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/RunningModeBehaviour.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/RunningModeBehaviour.java index b4cb52c..ff595b6 --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/RunningModeBehaviour.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/RunningModeBehaviour.java @@ -5,7 +5,7 @@ import org.flexiblepower.efi.util.FillLevelFunction; import org.flexiblepower.efi.util.RunningMode; -import org.flexiblepower.rai.values.CommodityMeasurables; +import org.flexiblepower.ral.values.CommodityMeasurables; /** * Describes the behavior of a {@link RunningMode}. This class is usually used as the value of a diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/package-info.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/package-info.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/package-info.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/package-info.java diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/packageinfo b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/packageinfo old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/buffer/packageinfo rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/packageinfo diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/package-info.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/package-info.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/package-info.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/package-info.java diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/timeshifter/SequentialProfile.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/timeshifter/SequentialProfile.java old mode 100644 new mode 100755 similarity index 98% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/timeshifter/SequentialProfile.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/timeshifter/SequentialProfile.java index a671369..fed7951 --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/timeshifter/SequentialProfile.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/timeshifter/SequentialProfile.java @@ -3,7 +3,7 @@ import javax.measure.Measurable; import javax.measure.quantity.Duration; -import org.flexiblepower.rai.values.CommodityForecast; +import org.flexiblepower.ral.values.CommodityForecast; /** * A SequentialProfile is typically used by a time shifter appliance driver to indicate the indicate the order of diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/timeshifter/SequentialProfileAllocation.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/timeshifter/SequentialProfileAllocation.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/timeshifter/SequentialProfileAllocation.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/timeshifter/SequentialProfileAllocation.java diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/timeshifter/TimeShifterAllocation.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/timeshifter/TimeShifterAllocation.java old mode 100644 new mode 100755 similarity index 96% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/timeshifter/TimeShifterAllocation.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/timeshifter/TimeShifterAllocation.java index b0c02ac..d211df8 --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/timeshifter/TimeShifterAllocation.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/timeshifter/TimeShifterAllocation.java @@ -6,9 +6,8 @@ import java.util.Date; import java.util.List; -import org.flexiblepower.rai.Allocation; -import org.flexiblepower.rai.ControlSpaceUpdate; -import org.flexiblepower.time.TimeService; +import org.flexiblepower.ral.messages.Allocation; +import org.flexiblepower.ral.messages.ControlSpaceUpdate; /** * When an energy app allocates the energy flexibility of a time shifter it sends a time shifter allocation to the diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/timeshifter/TimeShifterRegistration.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/timeshifter/TimeShifterRegistration.java old mode 100644 new mode 100755 similarity index 92% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/timeshifter/TimeShifterRegistration.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/timeshifter/TimeShifterRegistration.java index bd25a7a..765db7a --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/timeshifter/TimeShifterRegistration.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/timeshifter/TimeShifterRegistration.java @@ -5,10 +5,9 @@ import javax.measure.Measurable; import javax.measure.quantity.Duration; -import org.flexiblepower.rai.ControlSpaceRegistration; -import org.flexiblepower.rai.values.Commodity; -import org.flexiblepower.rai.values.CommoditySet; -import org.flexiblepower.time.TimeService; +import org.flexiblepower.ral.messages.ControlSpaceRegistration; +import org.flexiblepower.ral.values.Commodity; +import org.flexiblepower.ral.values.CommoditySet; /** * The {@link TimeShifterRegistration} contains information about the commodities supported by the appliance. diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/timeshifter/TimeShifterUpdate.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/timeshifter/TimeShifterUpdate.java old mode 100644 new mode 100755 similarity index 98% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/timeshifter/TimeShifterUpdate.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/timeshifter/TimeShifterUpdate.java index 254fce1..3744501 --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/timeshifter/TimeShifterUpdate.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/timeshifter/TimeShifterUpdate.java @@ -6,8 +6,7 @@ import java.util.Date; import java.util.List; -import org.flexiblepower.rai.ControlSpaceUpdate; -import org.flexiblepower.time.TimeService; +import org.flexiblepower.ral.messages.ControlSpaceUpdate; /** * If a new program is scheduled by time shifter appliance the resource manager sends a time shifter control space diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/timeshifter/package-info.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/timeshifter/package-info.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/timeshifter/package-info.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/timeshifter/package-info.java diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/timeshifter/packageinfo b/flexiblepower.ral.efi/src/org/flexiblepower/efi/timeshifter/packageinfo old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/timeshifter/packageinfo rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/timeshifter/packageinfo diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/RunningModeBehaviour.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/RunningModeBehaviour.java old mode 100644 new mode 100755 similarity index 97% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/RunningModeBehaviour.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/RunningModeBehaviour.java index 01e1a6a..2ea7fdb --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/RunningModeBehaviour.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/RunningModeBehaviour.java @@ -3,7 +3,7 @@ import javax.measure.Measurable; import javax.measure.quantity.MoneyFlow; -import org.flexiblepower.rai.values.CommodityMeasurables; +import org.flexiblepower.ral.values.CommodityMeasurables; /** * A RunningModeBehaviour object contains pairs of Commodity and Consumption values, and contains an object in which the @@ -18,7 +18,7 @@ public class RunningModeBehaviour { /** * Constructs a RunningModeBehaviour object with details about this RunningMode. - * + * * @param commodityConsumption * * @param runningCosts diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/RunningModeSelector.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/RunningModeSelector.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/RunningModeSelector.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/RunningModeSelector.java diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedAllocation.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedAllocation.java old mode 100644 new mode 100755 similarity index 95% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedAllocation.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedAllocation.java index 0ce9d40..57cd461 --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedAllocation.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedAllocation.java @@ -6,9 +6,8 @@ import java.util.HashSet; import java.util.Set; -import org.flexiblepower.rai.Allocation; -import org.flexiblepower.rai.ControlSpaceUpdate; -import org.flexiblepower.time.TimeService; +import org.flexiblepower.ral.messages.Allocation; +import org.flexiblepower.ral.messages.ControlSpaceUpdate; /** * This class is derived from {@link Allocation} and contains specific allocation information for a unconstrained diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedRegistration.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedRegistration.java old mode 100644 new mode 100755 similarity index 94% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedRegistration.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedRegistration.java index 03cbfa7..5efb139 --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedRegistration.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedRegistration.java @@ -5,8 +5,8 @@ import javax.measure.Measurable; import javax.measure.quantity.Duration; -import org.flexiblepower.rai.ControlSpaceRegistration; -import org.flexiblepower.rai.values.CommoditySet; +import org.flexiblepower.ral.messages.ControlSpaceRegistration; +import org.flexiblepower.ral.values.CommoditySet; /** * This class is derived from ControlSpaceRegistration and contains the registration items that are unique to a buffer. diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedStateUpdate.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedStateUpdate.java old mode 100644 new mode 100755 similarity index 98% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedStateUpdate.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedStateUpdate.java index ee40df3..36ebdd5 --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedStateUpdate.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedStateUpdate.java @@ -7,7 +7,6 @@ import java.util.Set; import org.flexiblepower.efi.util.TimerUpdate; -import org.flexiblepower.time.TimeService; /** * This class contains up to date information about the state of the buffer. diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedSystemDescription.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedSystemDescription.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedSystemDescription.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedSystemDescription.java diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedUpdate.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedUpdate.java old mode 100644 new mode 100755 similarity index 90% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedUpdate.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedUpdate.java index b5bb517..37f94cd --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedUpdate.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/UnconstrainedUpdate.java @@ -2,8 +2,7 @@ import java.util.Date; -import org.flexiblepower.rai.ControlSpaceUpdate; -import org.flexiblepower.time.TimeService; +import org.flexiblepower.ral.messages.ControlSpaceUpdate; /** * This class is derived from {@link ControlSpaceUpdate} and is used to bundle all updates from an appliance of the diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/package-info.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/package-info.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/package-info.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/package-info.java diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/packageinfo b/flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/packageinfo old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/unconstrained/packageinfo rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/unconstrained/packageinfo diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledAllocation.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledAllocation.java old mode 100644 new mode 100755 similarity index 91% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledAllocation.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledAllocation.java index c9fd9ec..20f24cf --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledAllocation.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledAllocation.java @@ -2,10 +2,10 @@ import java.util.Date; -import org.flexiblepower.rai.Allocation; -import org.flexiblepower.rai.values.Commodity; -import org.flexiblepower.rai.values.ConstraintProfile; -import org.flexiblepower.rai.values.ConstraintProfileMap; +import org.flexiblepower.ral.messages.Allocation; +import org.flexiblepower.ral.values.Commodity; +import org.flexiblepower.ral.values.ConstraintProfile; +import org.flexiblepower.ral.values.ConstraintProfileMap; /** * An allocation will can be sent to appliances which support curtailing production/consumption. diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledForecast.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledForecast.java old mode 100644 new mode 100755 similarity index 96% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledForecast.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledForecast.java index c1355e1..495c248 --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledForecast.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledForecast.java @@ -2,7 +2,7 @@ import java.util.Date; -import org.flexiblepower.rai.values.CommodityForecast; +import org.flexiblepower.ral.values.CommodityForecast; /** * This message is optional and can only be used if there is a mechanism in the resource manager that can calculate a diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledMeasurement.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledMeasurement.java old mode 100644 new mode 100755 similarity index 95% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledMeasurement.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledMeasurement.java index 5ecfeb6..e317282 --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledMeasurement.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledMeasurement.java @@ -2,8 +2,8 @@ import java.util.Date; -import org.flexiblepower.rai.values.Commodity; -import org.flexiblepower.rai.values.CommodityMeasurables; +import org.flexiblepower.ral.values.Commodity; +import org.flexiblepower.ral.values.CommodityMeasurables; /** * The uncontrolled measurement update message is used for updating the consumption/production information of an diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledRegistration.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledRegistration.java old mode 100644 new mode 100755 similarity index 93% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledRegistration.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledRegistration.java index 41ad955..4273469 --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledRegistration.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledRegistration.java @@ -6,12 +6,11 @@ import javax.measure.quantity.Duration; import javax.measure.quantity.Quantity; -import org.flexiblepower.rai.ControlSpaceRegistration; -import org.flexiblepower.rai.values.Commodity; -import org.flexiblepower.rai.values.CommoditySet; -import org.flexiblepower.rai.values.ConstraintList; -import org.flexiblepower.rai.values.ConstraintListMap; -import org.flexiblepower.time.TimeService; +import org.flexiblepower.ral.messages.ControlSpaceRegistration; +import org.flexiblepower.ral.values.Commodity; +import org.flexiblepower.ral.values.CommoditySet; +import org.flexiblepower.ral.values.ConstraintList; +import org.flexiblepower.ral.values.ConstraintListMap; /** * The UncontrolledRegistration object registers the uncontrolled resource manager to the energy app, the message is diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledUpdate.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledUpdate.java old mode 100644 new mode 100755 similarity index 89% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledUpdate.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledUpdate.java index e9f6bb1..7336a7c --- a/flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledUpdate.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/uncontrolled/UncontrolledUpdate.java @@ -2,8 +2,7 @@ import java.util.Date; -import org.flexiblepower.rai.ControlSpaceUpdate; -import org.flexiblepower.time.TimeService; +import org.flexiblepower.ral.messages.ControlSpaceUpdate; /** * A marker class for uncontrolled updates. Parent of {@link UncontrolledMeasurement} and {@link UncontrolledForecast}. diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/package-info.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/uncontrolled/package-info.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/package-info.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/uncontrolled/package-info.java diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/packageinfo b/flexiblepower.ral.efi/src/org/flexiblepower/efi/uncontrolled/packageinfo old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/uncontrolled/packageinfo rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/uncontrolled/packageinfo diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/util/FillLevelFunction.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/util/FillLevelFunction.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/util/FillLevelFunction.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/util/FillLevelFunction.java diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/util/RunningMode.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/util/RunningMode.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/util/RunningMode.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/util/RunningMode.java diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/util/Timer.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/util/Timer.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/util/Timer.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/util/Timer.java diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/util/TimerUpdate.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/util/TimerUpdate.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/util/TimerUpdate.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/util/TimerUpdate.java diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/util/Transition.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/util/Transition.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/util/Transition.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/util/Transition.java diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/util/package-info.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/util/package-info.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/util/package-info.java rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/util/package-info.java diff --git a/flexiblepower.api.efi/src/org/flexiblepower/efi/util/packageinfo b/flexiblepower.ral.efi/src/org/flexiblepower/efi/util/packageinfo old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/src/org/flexiblepower/efi/util/packageinfo rename to flexiblepower.ral.efi/src/org/flexiblepower/efi/util/packageinfo diff --git a/flexiblepower.api.efi/test/org/flexiblepower/efi/BufferControlSpaceTest.java b/flexiblepower.ral.efi/test/org/flexiblepower/efi/BufferControlSpaceTest.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/test/org/flexiblepower/efi/BufferControlSpaceTest.java rename to flexiblepower.ral.efi/test/org/flexiblepower/efi/BufferControlSpaceTest.java diff --git a/flexiblepower.api.efi/uml/Buffer.png b/flexiblepower.ral.efi/uml/Buffer.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Buffer.png rename to flexiblepower.ral.efi/uml/Buffer.png diff --git a/flexiblepower.api.efi/uml/Buffer.ucls b/flexiblepower.ral.efi/uml/Buffer.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Buffer.ucls rename to flexiblepower.ral.efi/uml/Buffer.ucls diff --git a/flexiblepower.api.efi/uml/Buffer/BufferAllocation.png b/flexiblepower.ral.efi/uml/Buffer/BufferAllocation.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Buffer/BufferAllocation.png rename to flexiblepower.ral.efi/uml/Buffer/BufferAllocation.png diff --git a/flexiblepower.api.efi/uml/Buffer/BufferAllocation.ucls b/flexiblepower.ral.efi/uml/Buffer/BufferAllocation.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Buffer/BufferAllocation.ucls rename to flexiblepower.ral.efi/uml/Buffer/BufferAllocation.ucls diff --git a/flexiblepower.api.efi/uml/Buffer/BufferRegistration.png b/flexiblepower.ral.efi/uml/Buffer/BufferRegistration.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Buffer/BufferRegistration.png rename to flexiblepower.ral.efi/uml/Buffer/BufferRegistration.png diff --git a/flexiblepower.api.efi/uml/Buffer/BufferRegistration.ucls b/flexiblepower.ral.efi/uml/Buffer/BufferRegistration.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Buffer/BufferRegistration.ucls rename to flexiblepower.ral.efi/uml/Buffer/BufferRegistration.ucls diff --git a/flexiblepower.api.efi/uml/Buffer/BufferStateUpdate.png b/flexiblepower.ral.efi/uml/Buffer/BufferStateUpdate.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Buffer/BufferStateUpdate.png rename to flexiblepower.ral.efi/uml/Buffer/BufferStateUpdate.png diff --git a/flexiblepower.api.efi/uml/Buffer/BufferStateUpdate.ucls b/flexiblepower.ral.efi/uml/Buffer/BufferStateUpdate.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Buffer/BufferStateUpdate.ucls rename to flexiblepower.ral.efi/uml/Buffer/BufferStateUpdate.ucls diff --git a/flexiblepower.api.efi/uml/Buffer/BufferSystemDescription.png b/flexiblepower.ral.efi/uml/Buffer/BufferSystemDescription.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Buffer/BufferSystemDescription.png rename to flexiblepower.ral.efi/uml/Buffer/BufferSystemDescription.png diff --git a/flexiblepower.api.efi/uml/Buffer/BufferSystemDescription.ucls b/flexiblepower.ral.efi/uml/Buffer/BufferSystemDescription.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Buffer/BufferSystemDescription.ucls rename to flexiblepower.ral.efi/uml/Buffer/BufferSystemDescription.ucls diff --git a/flexiblepower.api.efi/uml/Buffer/BufferTargetProfile.png b/flexiblepower.ral.efi/uml/Buffer/BufferTargetProfile.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Buffer/BufferTargetProfile.png rename to flexiblepower.ral.efi/uml/Buffer/BufferTargetProfile.png diff --git a/flexiblepower.api.efi/uml/Buffer/BufferTargetProfile.ucls b/flexiblepower.ral.efi/uml/Buffer/BufferTargetProfile.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Buffer/BufferTargetProfile.ucls rename to flexiblepower.ral.efi/uml/Buffer/BufferTargetProfile.ucls diff --git a/flexiblepower.api.efi/uml/Buffer/BufferUsageForecast.png b/flexiblepower.ral.efi/uml/Buffer/BufferUsageForecast.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Buffer/BufferUsageForecast.png rename to flexiblepower.ral.efi/uml/Buffer/BufferUsageForecast.png diff --git a/flexiblepower.api.efi/uml/Buffer/BufferUsageForecast.ucls b/flexiblepower.ral.efi/uml/Buffer/BufferUsageForecast.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Buffer/BufferUsageForecast.ucls rename to flexiblepower.ral.efi/uml/Buffer/BufferUsageForecast.ucls diff --git a/flexiblepower.api.efi/uml/Common/Commodity.png b/flexiblepower.ral.efi/uml/Common/Commodity.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Common/Commodity.png rename to flexiblepower.ral.efi/uml/Common/Commodity.png diff --git a/flexiblepower.api.efi/uml/Common/Commodity.ucls b/flexiblepower.ral.efi/uml/Common/Commodity.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Common/Commodity.ucls rename to flexiblepower.ral.efi/uml/Common/Commodity.ucls diff --git a/flexiblepower.api.efi/uml/Common/CommodityForecast.png b/flexiblepower.ral.efi/uml/Common/CommodityForecast.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Common/CommodityForecast.png rename to flexiblepower.ral.efi/uml/Common/CommodityForecast.png diff --git a/flexiblepower.api.efi/uml/Common/CommodityForecast.ucls b/flexiblepower.ral.efi/uml/Common/CommodityForecast.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Common/CommodityForecast.ucls rename to flexiblepower.ral.efi/uml/Common/CommodityForecast.ucls diff --git a/flexiblepower.api.efi/uml/Common/CommodityProfile.png b/flexiblepower.ral.efi/uml/Common/CommodityProfile.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Common/CommodityProfile.png rename to flexiblepower.ral.efi/uml/Common/CommodityProfile.png diff --git a/flexiblepower.api.efi/uml/Common/CommodityProfile.ucls b/flexiblepower.ral.efi/uml/Common/CommodityProfile.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Common/CommodityProfile.ucls rename to flexiblepower.ral.efi/uml/Common/CommodityProfile.ucls diff --git a/flexiblepower.api.efi/uml/Common/Revoke.png b/flexiblepower.ral.efi/uml/Common/Revoke.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Common/Revoke.png rename to flexiblepower.ral.efi/uml/Common/Revoke.png diff --git a/flexiblepower.api.efi/uml/Common/Revoke.ucls b/flexiblepower.ral.efi/uml/Common/Revoke.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Common/Revoke.ucls rename to flexiblepower.ral.efi/uml/Common/Revoke.ucls diff --git a/flexiblepower.api.efi/uml/Timeshifter/TimeshifterAllocation.png b/flexiblepower.ral.efi/uml/Timeshifter/TimeshifterAllocation.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Timeshifter/TimeshifterAllocation.png rename to flexiblepower.ral.efi/uml/Timeshifter/TimeshifterAllocation.png diff --git a/flexiblepower.api.efi/uml/Timeshifter/TimeshifterAllocation.ucls b/flexiblepower.ral.efi/uml/Timeshifter/TimeshifterAllocation.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Timeshifter/TimeshifterAllocation.ucls rename to flexiblepower.ral.efi/uml/Timeshifter/TimeshifterAllocation.ucls diff --git a/flexiblepower.api.efi/uml/Timeshifter/TimeshifterRegistration.png b/flexiblepower.ral.efi/uml/Timeshifter/TimeshifterRegistration.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Timeshifter/TimeshifterRegistration.png rename to flexiblepower.ral.efi/uml/Timeshifter/TimeshifterRegistration.png diff --git a/flexiblepower.api.efi/uml/Timeshifter/TimeshifterRegistration.ucls b/flexiblepower.ral.efi/uml/Timeshifter/TimeshifterRegistration.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Timeshifter/TimeshifterRegistration.ucls rename to flexiblepower.ral.efi/uml/Timeshifter/TimeshifterRegistration.ucls diff --git a/flexiblepower.api.efi/uml/Timeshifter/TimeshifterUpdate.png b/flexiblepower.ral.efi/uml/Timeshifter/TimeshifterUpdate.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Timeshifter/TimeshifterUpdate.png rename to flexiblepower.ral.efi/uml/Timeshifter/TimeshifterUpdate.png diff --git a/flexiblepower.api.efi/uml/Timeshifter/TimeshifterUpdate.ucls b/flexiblepower.ral.efi/uml/Timeshifter/TimeshifterUpdate.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Timeshifter/TimeshifterUpdate.ucls rename to flexiblepower.ral.efi/uml/Timeshifter/TimeshifterUpdate.ucls diff --git a/flexiblepower.api.efi/uml/Unconstrained/UnconstrainedAllocation.png b/flexiblepower.ral.efi/uml/Unconstrained/UnconstrainedAllocation.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Unconstrained/UnconstrainedAllocation.png rename to flexiblepower.ral.efi/uml/Unconstrained/UnconstrainedAllocation.png diff --git a/flexiblepower.api.efi/uml/Unconstrained/UnconstrainedAllocation.ucls b/flexiblepower.ral.efi/uml/Unconstrained/UnconstrainedAllocation.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Unconstrained/UnconstrainedAllocation.ucls rename to flexiblepower.ral.efi/uml/Unconstrained/UnconstrainedAllocation.ucls diff --git a/flexiblepower.api.efi/uml/Unconstrained/UnconstrainedRegistration.png b/flexiblepower.ral.efi/uml/Unconstrained/UnconstrainedRegistration.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Unconstrained/UnconstrainedRegistration.png rename to flexiblepower.ral.efi/uml/Unconstrained/UnconstrainedRegistration.png diff --git a/flexiblepower.api.efi/uml/Unconstrained/UnconstrainedRegistration.ucls b/flexiblepower.ral.efi/uml/Unconstrained/UnconstrainedRegistration.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Unconstrained/UnconstrainedRegistration.ucls rename to flexiblepower.ral.efi/uml/Unconstrained/UnconstrainedRegistration.ucls diff --git a/flexiblepower.api.efi/uml/Unconstrained/UnconstrainedStateUpdate.png b/flexiblepower.ral.efi/uml/Unconstrained/UnconstrainedStateUpdate.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Unconstrained/UnconstrainedStateUpdate.png rename to flexiblepower.ral.efi/uml/Unconstrained/UnconstrainedStateUpdate.png diff --git a/flexiblepower.api.efi/uml/Unconstrained/UnconstrainedStateUpdate.ucls b/flexiblepower.ral.efi/uml/Unconstrained/UnconstrainedStateUpdate.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Unconstrained/UnconstrainedStateUpdate.ucls rename to flexiblepower.ral.efi/uml/Unconstrained/UnconstrainedStateUpdate.ucls diff --git a/flexiblepower.api.efi/uml/Unconstrained/UnconstrainedSystemDescription.png b/flexiblepower.ral.efi/uml/Unconstrained/UnconstrainedSystemDescription.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Unconstrained/UnconstrainedSystemDescription.png rename to flexiblepower.ral.efi/uml/Unconstrained/UnconstrainedSystemDescription.png diff --git a/flexiblepower.api.efi/uml/Unconstrained/UnconstrainedSystemDescription.ucls b/flexiblepower.ral.efi/uml/Unconstrained/UnconstrainedSystemDescription.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Unconstrained/UnconstrainedSystemDescription.ucls rename to flexiblepower.ral.efi/uml/Unconstrained/UnconstrainedSystemDescription.ucls diff --git a/flexiblepower.api.efi/uml/Uncontrolled/UncontrolledAllocation.png b/flexiblepower.ral.efi/uml/Uncontrolled/UncontrolledAllocation.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Uncontrolled/UncontrolledAllocation.png rename to flexiblepower.ral.efi/uml/Uncontrolled/UncontrolledAllocation.png diff --git a/flexiblepower.api.efi/uml/Uncontrolled/UncontrolledAllocation.ucls b/flexiblepower.ral.efi/uml/Uncontrolled/UncontrolledAllocation.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Uncontrolled/UncontrolledAllocation.ucls rename to flexiblepower.ral.efi/uml/Uncontrolled/UncontrolledAllocation.ucls diff --git a/flexiblepower.api.efi/uml/Uncontrolled/UncontrolledForecast.png b/flexiblepower.ral.efi/uml/Uncontrolled/UncontrolledForecast.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Uncontrolled/UncontrolledForecast.png rename to flexiblepower.ral.efi/uml/Uncontrolled/UncontrolledForecast.png diff --git a/flexiblepower.api.efi/uml/Uncontrolled/UncontrolledForecast.ucls b/flexiblepower.ral.efi/uml/Uncontrolled/UncontrolledForecast.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Uncontrolled/UncontrolledForecast.ucls rename to flexiblepower.ral.efi/uml/Uncontrolled/UncontrolledForecast.ucls diff --git a/flexiblepower.api.efi/uml/Uncontrolled/UncontrolledMeasurement.png b/flexiblepower.ral.efi/uml/Uncontrolled/UncontrolledMeasurement.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Uncontrolled/UncontrolledMeasurement.png rename to flexiblepower.ral.efi/uml/Uncontrolled/UncontrolledMeasurement.png diff --git a/flexiblepower.api.efi/uml/Uncontrolled/UncontrolledMeasurement.ucls b/flexiblepower.ral.efi/uml/Uncontrolled/UncontrolledMeasurement.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Uncontrolled/UncontrolledMeasurement.ucls rename to flexiblepower.ral.efi/uml/Uncontrolled/UncontrolledMeasurement.ucls diff --git a/flexiblepower.api.efi/uml/Uncontrolled/UncontrolledRegistration.png b/flexiblepower.ral.efi/uml/Uncontrolled/UncontrolledRegistration.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Uncontrolled/UncontrolledRegistration.png rename to flexiblepower.ral.efi/uml/Uncontrolled/UncontrolledRegistration.png diff --git a/flexiblepower.api.efi/uml/Uncontrolled/UncontrolledRegistration.ucls b/flexiblepower.ral.efi/uml/Uncontrolled/UncontrolledRegistration.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/Uncontrolled/UncontrolledRegistration.ucls rename to flexiblepower.ral.efi/uml/Uncontrolled/UncontrolledRegistration.ucls diff --git a/flexiblepower.api.efi/uml/rai.comm/RAI.png b/flexiblepower.ral.efi/uml/rai.comm/RAI.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/rai.comm/RAI.png rename to flexiblepower.ral.efi/uml/rai.comm/RAI.png diff --git a/flexiblepower.api.efi/uml/rai.comm/RAI.ucls b/flexiblepower.ral.efi/uml/rai.comm/RAI.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api.efi/uml/rai.comm/RAI.ucls rename to flexiblepower.ral.efi/uml/rai.comm/RAI.ucls diff --git a/flexiblepower.api.ext/.checkstyle b/flexiblepower.ral.ext/.checkstyle similarity index 100% rename from flexiblepower.api.ext/.checkstyle rename to flexiblepower.ral.ext/.checkstyle diff --git a/flexiblepower.api.ext/.classpath b/flexiblepower.ral.ext/.classpath similarity index 100% rename from flexiblepower.api.ext/.classpath rename to flexiblepower.ral.ext/.classpath diff --git a/flexiblepower.api.ext/.project b/flexiblepower.ral.ext/.project similarity index 94% rename from flexiblepower.api.ext/.project rename to flexiblepower.ral.ext/.project index 7a29b91..b75df02 100644 --- a/flexiblepower.api.ext/.project +++ b/flexiblepower.ral.ext/.project @@ -1,6 +1,6 @@ - flexiblepower.api.ext + flexiblepower.ral.ext diff --git a/flexiblepower.api.ext/.settings/bndtools.core.prefs b/flexiblepower.ral.ext/.settings/bndtools.core.prefs similarity index 100% rename from flexiblepower.api.ext/.settings/bndtools.core.prefs rename to flexiblepower.ral.ext/.settings/bndtools.core.prefs diff --git a/flexiblepower.api.ext/.settings/org.eclipse.core.resources.prefs b/flexiblepower.ral.ext/.settings/org.eclipse.core.resources.prefs similarity index 100% rename from flexiblepower.api.ext/.settings/org.eclipse.core.resources.prefs rename to flexiblepower.ral.ext/.settings/org.eclipse.core.resources.prefs diff --git a/flexiblepower.api.ext/.settings/org.eclipse.jdt.core.prefs b/flexiblepower.ral.ext/.settings/org.eclipse.jdt.core.prefs similarity index 100% rename from flexiblepower.api.ext/.settings/org.eclipse.jdt.core.prefs rename to flexiblepower.ral.ext/.settings/org.eclipse.jdt.core.prefs diff --git a/flexiblepower.api.ext/.settings/org.eclipse.jdt.ui.prefs b/flexiblepower.ral.ext/.settings/org.eclipse.jdt.ui.prefs similarity index 100% rename from flexiblepower.api.ext/.settings/org.eclipse.jdt.ui.prefs rename to flexiblepower.ral.ext/.settings/org.eclipse.jdt.ui.prefs diff --git a/flexiblepower.api.ext/bnd.bnd b/flexiblepower.ral.ext/bnd.bnd similarity index 84% rename from flexiblepower.api.ext/bnd.bnd rename to flexiblepower.ral.ext/bnd.bnd index 9f0f7af..9c3ea36 100644 --- a/flexiblepower.api.ext/bnd.bnd +++ b/flexiblepower.ral.ext/bnd.bnd @@ -3,8 +3,7 @@ junit.osgi;version='[3.8,4)',\ biz.aQute.bnd.annotation,\ slf4j.api;version='[1.7,2)',\ - flexiblepower.api;version=latest,\ - flexiblepower.api.efi;version=latest,\ + flexiblepower.ral;version=latest,\ org.mockito.mockito-all;verion='[1.9,2)' Bundle-Version: 2.0.1.${qualifier} diff --git a/flexiblepower.api.ext/res/OSGI-INF/permissions.perm b/flexiblepower.ral.ext/res/OSGI-INF/permissions.perm similarity index 100% rename from flexiblepower.api.ext/res/OSGI-INF/permissions.perm rename to flexiblepower.ral.ext/res/OSGI-INF/permissions.perm diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/battery/BatteryControlParameters.java b/flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/battery/BatteryControlParameters.java similarity index 99% rename from flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/battery/BatteryControlParameters.java rename to flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/battery/BatteryControlParameters.java index aab9691..7774cdd 100644 --- a/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/battery/BatteryControlParameters.java +++ b/flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/battery/BatteryControlParameters.java @@ -2,6 +2,7 @@ import org.flexiblepower.ral.ResourceControlParameters; + /** * The control parameters for a battery is to set its mode. */ diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/battery/BatteryDriver.java b/flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/battery/BatteryDriver.java similarity index 100% rename from flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/battery/BatteryDriver.java rename to flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/battery/BatteryDriver.java diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/battery/BatteryMode.java b/flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/battery/BatteryMode.java similarity index 100% rename from flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/battery/BatteryMode.java rename to flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/battery/BatteryMode.java diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/battery/BatteryState.java b/flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/battery/BatteryState.java similarity index 100% rename from flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/battery/BatteryState.java rename to flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/battery/BatteryState.java diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/battery/package-info.java b/flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/battery/package-info.java similarity index 100% rename from flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/battery/package-info.java rename to flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/battery/package-info.java diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/dishwasher/DishwasherControlParameters.java b/flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/dishwasher/DishwasherControlParameters.java similarity index 100% rename from flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/dishwasher/DishwasherControlParameters.java rename to flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/dishwasher/DishwasherControlParameters.java diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/dishwasher/DishwasherDriver.java b/flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/dishwasher/DishwasherDriver.java similarity index 100% rename from flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/dishwasher/DishwasherDriver.java rename to flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/dishwasher/DishwasherDriver.java diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/dishwasher/DishwasherState.java b/flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/dishwasher/DishwasherState.java similarity index 97% rename from flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/dishwasher/DishwasherState.java rename to flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/dishwasher/DishwasherState.java index 2ebf745..e33674e 100644 --- a/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/dishwasher/DishwasherState.java +++ b/flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/dishwasher/DishwasherState.java @@ -2,8 +2,8 @@ import java.util.Date; -import org.flexiblepower.rai.values.CommodityProfile; import org.flexiblepower.ral.ResourceState; +import org.flexiblepower.ral.values.CommodityProfile; /** * The {@link DishwasherState} that describes the current state of a dishwasher. In general there are 3 options: diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/dishwasher/package-info.java b/flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/dishwasher/package-info.java similarity index 100% rename from flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/dishwasher/package-info.java rename to flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/dishwasher/package-info.java diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/refrigerator/RefrigeratorControlParameters.java b/flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/refrigerator/RefrigeratorControlParameters.java similarity index 99% rename from flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/refrigerator/RefrigeratorControlParameters.java rename to flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/refrigerator/RefrigeratorControlParameters.java index 932e829..71c7f14 100644 --- a/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/refrigerator/RefrigeratorControlParameters.java +++ b/flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/refrigerator/RefrigeratorControlParameters.java @@ -2,6 +2,7 @@ import org.flexiblepower.ral.ResourceControlParameters; + /** * The control, setting the super cool on or off. */ diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/refrigerator/RefrigeratorDriver.java b/flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/refrigerator/RefrigeratorDriver.java similarity index 100% rename from flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/refrigerator/RefrigeratorDriver.java rename to flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/refrigerator/RefrigeratorDriver.java diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/refrigerator/RefrigeratorState.java b/flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/refrigerator/RefrigeratorState.java similarity index 100% rename from flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/refrigerator/RefrigeratorState.java rename to flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/refrigerator/RefrigeratorState.java diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/refrigerator/package-info.java b/flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/refrigerator/package-info.java similarity index 100% rename from flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/refrigerator/package-info.java rename to flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/refrigerator/package-info.java diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/uncontrolled/PowerState.java b/flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/uncontrolled/PowerState.java similarity index 100% rename from flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/uncontrolled/PowerState.java rename to flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/uncontrolled/PowerState.java diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/uncontrolled/UncontrollableDriver.java b/flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/uncontrolled/UncontrollableDriver.java similarity index 100% rename from flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/uncontrolled/UncontrollableDriver.java rename to flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/uncontrolled/UncontrollableDriver.java diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/uncontrolled/package-info.java b/flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/uncontrolled/package-info.java similarity index 100% rename from flexiblepower.api.ext/src/org/flexiblepower/ral/drivers/uncontrolled/package-info.java rename to flexiblepower.ral.ext/src/org/flexiblepower/ral/drivers/uncontrolled/package-info.java diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/ext/AbstractResourceDriver.java b/flexiblepower.ral.ext/src/org/flexiblepower/ral/ext/AbstractResourceDriver.java similarity index 100% rename from flexiblepower.api.ext/src/org/flexiblepower/ral/ext/AbstractResourceDriver.java rename to flexiblepower.ral.ext/src/org/flexiblepower/ral/ext/AbstractResourceDriver.java diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/ext/AbstractResourceManager.java b/flexiblepower.ral.ext/src/org/flexiblepower/ral/ext/AbstractResourceManager.java similarity index 98% rename from flexiblepower.api.ext/src/org/flexiblepower/ral/ext/AbstractResourceManager.java rename to flexiblepower.ral.ext/src/org/flexiblepower/ral/ext/AbstractResourceManager.java index fd26cc7..1233081 100644 --- a/flexiblepower.api.ext/src/org/flexiblepower/ral/ext/AbstractResourceManager.java +++ b/flexiblepower.ral.ext/src/org/flexiblepower/ral/ext/AbstractResourceManager.java @@ -4,13 +4,13 @@ import org.flexiblepower.messaging.Connection; import org.flexiblepower.messaging.MessageHandler; -import org.flexiblepower.rai.AllocationStatusUpdate; -import org.flexiblepower.rai.ResourceMessage; import org.flexiblepower.ral.ControllerManager; import org.flexiblepower.ral.ResourceControlParameters; import org.flexiblepower.ral.ResourceDriver; import org.flexiblepower.ral.ResourceManager; import org.flexiblepower.ral.ResourceState; +import org.flexiblepower.ral.messages.AllocationStatusUpdate; +import org.flexiblepower.ral.messages.ResourceMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/flexiblepower.api.ext/src/org/flexiblepower/ral/ext/package-info.java b/flexiblepower.ral.ext/src/org/flexiblepower/ral/ext/package-info.java similarity index 100% rename from flexiblepower.api.ext/src/org/flexiblepower/ral/ext/package-info.java rename to flexiblepower.ral.ext/src/org/flexiblepower/ral/ext/package-info.java diff --git a/flexiblepower.api.ext/test/org/flexiblepower/observation/test/ObservationRegistrationHelperTest.java b/flexiblepower.ral.ext/test/org/flexiblepower/observation/test/ObservationRegistrationHelperTest.java similarity index 100% rename from flexiblepower.api.ext/test/org/flexiblepower/observation/test/ObservationRegistrationHelperTest.java rename to flexiblepower.ral.ext/test/org/flexiblepower/observation/test/ObservationRegistrationHelperTest.java diff --git a/flexiblepower.ral/.checkstyle b/flexiblepower.ral/.checkstyle new file mode 100755 index 0000000..60f3b8d --- /dev/null +++ b/flexiblepower.ral/.checkstyle @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/flexiblepower.ral/.classpath b/flexiblepower.ral/.classpath new file mode 100755 index 0000000..023968b --- /dev/null +++ b/flexiblepower.ral/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/flexiblepower.api.efi/.project b/flexiblepower.ral/.project old mode 100644 new mode 100755 similarity index 94% rename from flexiblepower.api.efi/.project rename to flexiblepower.ral/.project index f59608a..baf068b --- a/flexiblepower.api.efi/.project +++ b/flexiblepower.ral/.project @@ -1,6 +1,6 @@ - flexiblepower.api.efi + flexiblepower.ral diff --git a/flexiblepower.ral/.settings/bndtools.core.prefs b/flexiblepower.ral/.settings/bndtools.core.prefs new file mode 100755 index 0000000..cfd70fe --- /dev/null +++ b/flexiblepower.ral/.settings/bndtools.core.prefs @@ -0,0 +1,3 @@ +compileErrorAction=skip +eclipse.preferences.version=1 +eclipseClasspath=expose diff --git a/flexiblepower.ral/.settings/org.eclipse.core.resources.prefs b/flexiblepower.ral/.settings/org.eclipse.core.resources.prefs new file mode 100755 index 0000000..99f26c0 --- /dev/null +++ b/flexiblepower.ral/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/flexiblepower.ral/.settings/org.eclipse.jdt.core.prefs b/flexiblepower.ral/.settings/org.eclipse.jdt.core.prefs new file mode 100755 index 0000000..7a9b0a6 --- /dev/null +++ b/flexiblepower.ral/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,292 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=82 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=82 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=82 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=82 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=82 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=82 +org.eclipse.jdt.core.formatter.alignment_for_assignment=82 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=82 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=82 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=82 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=82 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=82 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=82 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=82 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=82 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=82 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=82 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=82 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=82 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=82 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=82 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=82 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=82 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true +org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert +org.eclipse.jdt.core.formatter.comment.line_length=120 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=false +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.lineSplit=120 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=space +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/flexiblepower.ral/.settings/org.eclipse.jdt.ui.prefs b/flexiblepower.ral/.settings/org.eclipse.jdt.ui.prefs new file mode 100755 index 0000000..fdf3387 --- /dev/null +++ b/flexiblepower.ral/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,62 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_FlexiblePowerSuite +formatter_settings_version=12 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=true +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=false +sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=false +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=true +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.on_save_use_additional_actions=true +sp_cleanup.organize_imports=true +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=true +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_type_arguments=false +sp_cleanup.remove_trailing_whitespaces=true +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=true +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=true +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=false +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=true +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=true +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true +sp_cleanup.use_type_arguments=false diff --git a/flexiblepower.api/UML/AllocationHelperClasses.png b/flexiblepower.ral/UML/AllocationHelperClasses.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/UML/AllocationHelperClasses.png rename to flexiblepower.ral/UML/AllocationHelperClasses.png diff --git a/flexiblepower.api/UML/AllocationHelperClasses.ucls b/flexiblepower.ral/UML/AllocationHelperClasses.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/UML/AllocationHelperClasses.ucls rename to flexiblepower.ral/UML/AllocationHelperClasses.ucls diff --git a/flexiblepower.api/UML/BufferControlSpace.png b/flexiblepower.ral/UML/BufferControlSpace.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/UML/BufferControlSpace.png rename to flexiblepower.ral/UML/BufferControlSpace.png diff --git a/flexiblepower.api/UML/BufferControlSpace.ucls b/flexiblepower.ral/UML/BufferControlSpace.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/UML/BufferControlSpace.ucls rename to flexiblepower.ral/UML/BufferControlSpace.ucls diff --git a/flexiblepower.api/UML/BufferControlSpaceHelperClasses.png b/flexiblepower.ral/UML/BufferControlSpaceHelperClasses.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/UML/BufferControlSpaceHelperClasses.png rename to flexiblepower.ral/UML/BufferControlSpaceHelperClasses.png diff --git a/flexiblepower.api/UML/BufferControlSpaceHelperClasses.ucls b/flexiblepower.ral/UML/BufferControlSpaceHelperClasses.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/UML/BufferControlSpaceHelperClasses.ucls rename to flexiblepower.ral/UML/BufferControlSpaceHelperClasses.ucls diff --git a/flexiblepower.api/UML/ControlSpace.png b/flexiblepower.ral/UML/ControlSpace.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/UML/ControlSpace.png rename to flexiblepower.ral/UML/ControlSpace.png diff --git a/flexiblepower.api/UML/ControlSpace.ucls b/flexiblepower.ral/UML/ControlSpace.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/UML/ControlSpace.ucls rename to flexiblepower.ral/UML/ControlSpace.ucls diff --git a/flexiblepower.api/UML/ControlSpaceAndAllocation.png b/flexiblepower.ral/UML/ControlSpaceAndAllocation.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/UML/ControlSpaceAndAllocation.png rename to flexiblepower.ral/UML/ControlSpaceAndAllocation.png diff --git a/flexiblepower.api/UML/ControlSpaceAndAllocation.ucls b/flexiblepower.ral/UML/ControlSpaceAndAllocation.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/UML/ControlSpaceAndAllocation.ucls rename to flexiblepower.ral/UML/ControlSpaceAndAllocation.ucls diff --git a/flexiblepower.api/UML/ControlSpaceOverview.png b/flexiblepower.ral/UML/ControlSpaceOverview.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/UML/ControlSpaceOverview.png rename to flexiblepower.ral/UML/ControlSpaceOverview.png diff --git a/flexiblepower.api/UML/ControlSpaceOverview.ucls b/flexiblepower.ral/UML/ControlSpaceOverview.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/UML/ControlSpaceOverview.ucls rename to flexiblepower.ral/UML/ControlSpaceOverview.ucls diff --git a/flexiblepower.api/UML/StorageControlSPace.png b/flexiblepower.ral/UML/StorageControlSPace.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/UML/StorageControlSPace.png rename to flexiblepower.ral/UML/StorageControlSPace.png diff --git a/flexiblepower.api/UML/StorageControlSPace.ucls b/flexiblepower.ral/UML/StorageControlSPace.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/UML/StorageControlSPace.ucls rename to flexiblepower.ral/UML/StorageControlSPace.ucls diff --git a/flexiblepower.api/UML/TimeShifterControlSpace.png b/flexiblepower.ral/UML/TimeShifterControlSpace.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/UML/TimeShifterControlSpace.png rename to flexiblepower.ral/UML/TimeShifterControlSpace.png diff --git a/flexiblepower.api/UML/TimeShifterControlSpace.ucls b/flexiblepower.ral/UML/TimeShifterControlSpace.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/UML/TimeShifterControlSpace.ucls rename to flexiblepower.ral/UML/TimeShifterControlSpace.ucls diff --git a/flexiblepower.api/UML/UncontrolledControlSpace.png b/flexiblepower.ral/UML/UncontrolledControlSpace.png old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/UML/UncontrolledControlSpace.png rename to flexiblepower.ral/UML/UncontrolledControlSpace.png diff --git a/flexiblepower.api/UML/UncontrolledControlSpace.ucls b/flexiblepower.ral/UML/UncontrolledControlSpace.ucls old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/UML/UncontrolledControlSpace.ucls rename to flexiblepower.ral/UML/UncontrolledControlSpace.ucls diff --git a/flexiblepower.ral/bnd.bnd b/flexiblepower.ral/bnd.bnd new file mode 100755 index 0000000..f9e2a51 --- /dev/null +++ b/flexiblepower.ral/bnd.bnd @@ -0,0 +1,9 @@ +-buildpath: \ + osgi.cmpn;version='[4.3,5)',\ + osgi.core;version='[4.3,5)',\ + biz.aQute.bnd.annotation,\ + flexiblepower.api;version=latest +-testpath: ${test} + +Bundle-Version: 1.0.0.${qualifier} +Export-Package: org.flexiblepower.ral* diff --git a/flexiblepower.ral/build.gradle b/flexiblepower.ral/build.gradle new file mode 100755 index 0000000..7c2d9e3 --- /dev/null +++ b/flexiblepower.ral/build.gradle @@ -0,0 +1 @@ +checkstyleMain.exclude '**/javax/measure/**' diff --git a/flexiblepower.ral/res/OSGI-INF/permissions.perm b/flexiblepower.ral/res/OSGI-INF/permissions.perm new file mode 100755 index 0000000..0302abd --- /dev/null +++ b/flexiblepower.ral/res/OSGI-INF/permissions.perm @@ -0,0 +1,2 @@ +(org.osgi.framework.ServicePermission "*" "get,register") +(org.osgi.framework.PackagePermission "*" "import,exportonly") diff --git a/flexiblepower.api/src/org/flexiblepower/ral/ControllerManager.java b/flexiblepower.ral/src/org/flexiblepower/ral/ControllerManager.java old mode 100644 new mode 100755 similarity index 92% rename from flexiblepower.api/src/org/flexiblepower/ral/ControllerManager.java rename to flexiblepower.ral/src/org/flexiblepower/ral/ControllerManager.java index 367943b..b5379cb --- a/flexiblepower.api/src/org/flexiblepower/ral/ControllerManager.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/ControllerManager.java @@ -1,7 +1,7 @@ package org.flexiblepower.ral; import org.flexiblepower.messaging.Endpoint; -import org.flexiblepower.rai.ResourceMessage; +import org.flexiblepower.ral.messages.ResourceMessage; /** * The {@link ControllerManager} is the main interface of an Energy Application. This should be implemented as an diff --git a/flexiblepower.api/src/org/flexiblepower/ral/ResourceControlParameters.java b/flexiblepower.ral/src/org/flexiblepower/ral/ResourceControlParameters.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/src/org/flexiblepower/ral/ResourceControlParameters.java rename to flexiblepower.ral/src/org/flexiblepower/ral/ResourceControlParameters.java diff --git a/flexiblepower.api/src/org/flexiblepower/ral/ResourceDriver.java b/flexiblepower.ral/src/org/flexiblepower/ral/ResourceDriver.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/src/org/flexiblepower/ral/ResourceDriver.java rename to flexiblepower.ral/src/org/flexiblepower/ral/ResourceDriver.java diff --git a/flexiblepower.api/src/org/flexiblepower/ral/ResourceManager.java b/flexiblepower.ral/src/org/flexiblepower/ral/ResourceManager.java old mode 100644 new mode 100755 similarity index 76% rename from flexiblepower.api/src/org/flexiblepower/ral/ResourceManager.java rename to flexiblepower.ral/src/org/flexiblepower/ral/ResourceManager.java index dbf04f7..5dee228 --- a/flexiblepower.api/src/org/flexiblepower/ral/ResourceManager.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/ResourceManager.java @@ -3,8 +3,8 @@ import org.flexiblepower.messaging.Endpoint; import org.flexiblepower.messaging.Port; import org.flexiblepower.messaging.Ports; -import org.flexiblepower.rai.Allocation; -import org.flexiblepower.rai.ResourceMessage; +import org.flexiblepower.ral.messages.Allocation; +import org.flexiblepower.ral.messages.ResourceMessage; /** * The {@link ResourceManager} is responsible to translating the current state of an appliance (as received from a @@ -15,9 +15,9 @@ * also possible for the {@link ResourceManager} to be connected to several drivers (e.g. for a heatbuffer and an * actuator when they are connected separately). * - * Any {@link ResourceManager} is an {@link Endpoint} and should have (at least) 2 ports. One called "driver" to connect - * to a {@link ResourceDriver} and one called "controller" to connect to a {@link ControllerManager}. + * Any {@link ResourceManager} is an {@link Endpoint} and should have (at least) 1 port, called "controller" to connect + * to a {@link ControllerManager}. */ -@Ports({ @Port(name = "driver"), @Port(name = "controller") }) +@Ports(@Port(name = "controller")) public interface ResourceManager extends Endpoint { } diff --git a/flexiblepower.api/src/org/flexiblepower/ral/ResourceState.java b/flexiblepower.ral/src/org/flexiblepower/ral/ResourceState.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/src/org/flexiblepower/ral/ResourceState.java rename to flexiblepower.ral/src/org/flexiblepower/ral/ResourceState.java diff --git a/flexiblepower.api/src/org/flexiblepower/rai/Allocation.java b/flexiblepower.ral/src/org/flexiblepower/ral/messages/Allocation.java old mode 100644 new mode 100755 similarity index 98% rename from flexiblepower.api/src/org/flexiblepower/rai/Allocation.java rename to flexiblepower.ral/src/org/flexiblepower/ral/messages/Allocation.java index 8375ca2..a26cb3e --- a/flexiblepower.api/src/org/flexiblepower/rai/Allocation.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/messages/Allocation.java @@ -1,10 +1,8 @@ -package org.flexiblepower.rai; +package org.flexiblepower.ral.messages; import java.util.Date; import java.util.UUID; -import org.flexiblepower.time.TimeService; - /** * An {@link Allocation} message is always a response from the energy application to a {@link ControlSpaceUpdate} * message. It contains instructions on how to use (or fix) the flexibility described in the {@link ControlSpaceUpdate}. diff --git a/flexiblepower.api/src/org/flexiblepower/rai/AllocationRevoke.java b/flexiblepower.ral/src/org/flexiblepower/ral/messages/AllocationRevoke.java old mode 100644 new mode 100755 similarity index 91% rename from flexiblepower.api/src/org/flexiblepower/rai/AllocationRevoke.java rename to flexiblepower.ral/src/org/flexiblepower/ral/messages/AllocationRevoke.java index 094a25b..6eb4813 --- a/flexiblepower.api/src/org/flexiblepower/rai/AllocationRevoke.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/messages/AllocationRevoke.java @@ -1,9 +1,7 @@ -package org.flexiblepower.rai; +package org.flexiblepower.ral.messages; import java.util.Date; -import org.flexiblepower.time.TimeService; - /** * An energy application can revoke sent {@link Allocation}s by sending the {@link AllocationRevoke} message. After * sending the message all the received {@link Allocation}s should be removed by the appliance driver. The appliance diff --git a/flexiblepower.api/src/org/flexiblepower/rai/AllocationStatus.java b/flexiblepower.ral/src/org/flexiblepower/ral/messages/AllocationStatus.java old mode 100644 new mode 100755 similarity index 97% rename from flexiblepower.api/src/org/flexiblepower/rai/AllocationStatus.java rename to flexiblepower.ral/src/org/flexiblepower/ral/messages/AllocationStatus.java index 11837b6..b7c1b1a --- a/flexiblepower.api/src/org/flexiblepower/rai/AllocationStatus.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/messages/AllocationStatus.java @@ -1,4 +1,4 @@ -package org.flexiblepower.rai; +package org.flexiblepower.ral.messages; /** * This enumeration contains all possible states that may be fed back by an appliance driver to an energy app in diff --git a/flexiblepower.api/src/org/flexiblepower/rai/AllocationStatusUpdate.java b/flexiblepower.ral/src/org/flexiblepower/ral/messages/AllocationStatusUpdate.java old mode 100644 new mode 100755 similarity index 98% rename from flexiblepower.api/src/org/flexiblepower/rai/AllocationStatusUpdate.java rename to flexiblepower.ral/src/org/flexiblepower/ral/messages/AllocationStatusUpdate.java index a987308..97e3686 --- a/flexiblepower.api/src/org/flexiblepower/rai/AllocationStatusUpdate.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/messages/AllocationStatusUpdate.java @@ -1,10 +1,8 @@ -package org.flexiblepower.rai; +package org.flexiblepower.ral.messages; import java.util.Date; import java.util.UUID; -import org.flexiblepower.time.TimeService; - /** * After an appliance driver received an {@link Allocation} message, it is good practice to provide feedback to the * energy application on the follow up actions. This can be done via this message. All ControlSpace categories use this diff --git a/flexiblepower.api/src/org/flexiblepower/rai/ControlSpaceRegistration.java b/flexiblepower.ral/src/org/flexiblepower/ral/messages/ControlSpaceRegistration.java old mode 100644 new mode 100755 similarity index 97% rename from flexiblepower.api/src/org/flexiblepower/rai/ControlSpaceRegistration.java rename to flexiblepower.ral/src/org/flexiblepower/ral/messages/ControlSpaceRegistration.java index 910780e..faee65e --- a/flexiblepower.api/src/org/flexiblepower/rai/ControlSpaceRegistration.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/messages/ControlSpaceRegistration.java @@ -1,4 +1,4 @@ -package org.flexiblepower.rai; +package org.flexiblepower.ral.messages; import java.util.Date; @@ -7,7 +7,6 @@ import javax.measure.quantity.Duration; import org.flexiblepower.ral.ControllerManager; -import org.flexiblepower.time.TimeService; /** * As soon as an appliance becomes available to an energy application (see {@link ControllerManager}), it will send a diff --git a/flexiblepower.api/src/org/flexiblepower/rai/ControlSpaceRevoke.java b/flexiblepower.ral/src/org/flexiblepower/ral/messages/ControlSpaceRevoke.java old mode 100644 new mode 100755 similarity index 91% rename from flexiblepower.api/src/org/flexiblepower/rai/ControlSpaceRevoke.java rename to flexiblepower.ral/src/org/flexiblepower/ral/messages/ControlSpaceRevoke.java index 25b7743..7dfb3ed --- a/flexiblepower.api/src/org/flexiblepower/rai/ControlSpaceRevoke.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/messages/ControlSpaceRevoke.java @@ -1,9 +1,7 @@ -package org.flexiblepower.rai; +package org.flexiblepower.ral.messages; import java.util.Date; -import org.flexiblepower.time.TimeService; - /** * An appliance driver can revoke an already sent {@link ControlSpaceUpdate} message by sending the * {@link ControlSpaceRevoke} message. After sending the message every received {@link ControlSpaceUpdate} should be diff --git a/flexiblepower.api/src/org/flexiblepower/rai/ControlSpaceUpdate.java b/flexiblepower.ral/src/org/flexiblepower/ral/messages/ControlSpaceUpdate.java old mode 100644 new mode 100755 similarity index 95% rename from flexiblepower.api/src/org/flexiblepower/rai/ControlSpaceUpdate.java rename to flexiblepower.ral/src/org/flexiblepower/ral/messages/ControlSpaceUpdate.java index fb08226..8bffeb6 --- a/flexiblepower.api/src/org/flexiblepower/rai/ControlSpaceUpdate.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/messages/ControlSpaceUpdate.java @@ -1,9 +1,7 @@ -package org.flexiblepower.rai; +package org.flexiblepower.ral.messages; import java.util.Date; -import org.flexiblepower.time.TimeService; - /** * This message contains information about the flexibility an appliance has to offer. Just like the * {@link ControlSpaceRegistration} message, each of the ControlSpace categories will have its own update class or diff --git a/flexiblepower.api/src/org/flexiblepower/rai/ResourceMessage.java b/flexiblepower.ral/src/org/flexiblepower/ral/messages/ResourceMessage.java old mode 100644 new mode 100755 similarity index 97% rename from flexiblepower.api/src/org/flexiblepower/rai/ResourceMessage.java rename to flexiblepower.ral/src/org/flexiblepower/ral/messages/ResourceMessage.java index 5048af5..78612b5 --- a/flexiblepower.api/src/org/flexiblepower/rai/ResourceMessage.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/messages/ResourceMessage.java @@ -1,10 +1,8 @@ -package org.flexiblepower.rai; +package org.flexiblepower.ral.messages; import java.util.Date; import java.util.UUID; -import org.flexiblepower.time.TimeService; - /** * The super class for all messages of the Resource Abstraction Interface. This contains: * diff --git a/flexiblepower.api/src/org/flexiblepower/rai/package-info.java b/flexiblepower.ral/src/org/flexiblepower/ral/messages/package-info.java old mode 100644 new mode 100755 similarity index 82% rename from flexiblepower.api/src/org/flexiblepower/rai/package-info.java rename to flexiblepower.ral/src/org/flexiblepower/ral/messages/package-info.java index f8e2691..1a0e9f4 --- a/flexiblepower.api/src/org/flexiblepower/rai/package-info.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/messages/package-info.java @@ -2,7 +2,7 @@ * The Resource Abstraction Interfaces (RAI) layer, that describes the datatypes (control spaces and allocations). */ @Version("2.0.0.${qualifier}") -package org.flexiblepower.rai; +package org.flexiblepower.ral.messages; import aQute.bnd.annotation.Version; diff --git a/flexiblepower.api/src/org/flexiblepower/ral/package-info.java b/flexiblepower.ral/src/org/flexiblepower/ral/package-info.java old mode 100644 new mode 100755 similarity index 100% rename from flexiblepower.api/src/org/flexiblepower/ral/package-info.java rename to flexiblepower.ral/src/org/flexiblepower/ral/package-info.java diff --git a/flexiblepower.api/src/org/flexiblepower/rai/values/Commodity.java b/flexiblepower.ral/src/org/flexiblepower/ral/values/Commodity.java old mode 100644 new mode 100755 similarity index 99% rename from flexiblepower.api/src/org/flexiblepower/rai/values/Commodity.java rename to flexiblepower.ral/src/org/flexiblepower/ral/values/Commodity.java index 91b95c5..e389ea8 --- a/flexiblepower.api/src/org/flexiblepower/rai/values/Commodity.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/values/Commodity.java @@ -1,4 +1,4 @@ -package org.flexiblepower.rai.values; +package org.flexiblepower.ral.values; import java.io.Serializable; diff --git a/flexiblepower.api/src/org/flexiblepower/rai/values/CommodityForecast.java b/flexiblepower.ral/src/org/flexiblepower/ral/values/CommodityForecast.java old mode 100644 new mode 100755 similarity index 99% rename from flexiblepower.api/src/org/flexiblepower/rai/values/CommodityForecast.java rename to flexiblepower.ral/src/org/flexiblepower/ral/values/CommodityForecast.java index f79603e..22a1110 --- a/flexiblepower.api/src/org/flexiblepower/rai/values/CommodityForecast.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/values/CommodityForecast.java @@ -1,4 +1,4 @@ -package org.flexiblepower.rai.values; +package org.flexiblepower.ral.values; import java.util.ArrayList; import java.util.List; diff --git a/flexiblepower.api/src/org/flexiblepower/rai/values/CommodityMap.java b/flexiblepower.ral/src/org/flexiblepower/ral/values/CommodityMap.java old mode 100644 new mode 100755 similarity index 99% rename from flexiblepower.api/src/org/flexiblepower/rai/values/CommodityMap.java rename to flexiblepower.ral/src/org/flexiblepower/ral/values/CommodityMap.java index f5d5b28..4747411 --- a/flexiblepower.api/src/org/flexiblepower/rai/values/CommodityMap.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/values/CommodityMap.java @@ -1,4 +1,4 @@ -package org.flexiblepower.rai.values; +package org.flexiblepower.ral.values; import java.util.ArrayList; import java.util.Collection; diff --git a/flexiblepower.api/src/org/flexiblepower/rai/values/CommodityMeasurables.java b/flexiblepower.ral/src/org/flexiblepower/ral/values/CommodityMeasurables.java old mode 100644 new mode 100755 similarity index 98% rename from flexiblepower.api/src/org/flexiblepower/rai/values/CommodityMeasurables.java rename to flexiblepower.ral/src/org/flexiblepower/ral/values/CommodityMeasurables.java index c1e1616..84303ce --- a/flexiblepower.api/src/org/flexiblepower/rai/values/CommodityMeasurables.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/values/CommodityMeasurables.java @@ -1,4 +1,4 @@ -package org.flexiblepower.rai.values; +package org.flexiblepower.ral.values; import javax.measure.Measurable; import javax.measure.quantity.Power; diff --git a/flexiblepower.api/src/org/flexiblepower/rai/values/CommodityProfile.java b/flexiblepower.ral/src/org/flexiblepower/ral/values/CommodityProfile.java old mode 100644 new mode 100755 similarity index 99% rename from flexiblepower.api/src/org/flexiblepower/rai/values/CommodityProfile.java rename to flexiblepower.ral/src/org/flexiblepower/ral/values/CommodityProfile.java index eec672c..93231a7 --- a/flexiblepower.api/src/org/flexiblepower/rai/values/CommodityProfile.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/values/CommodityProfile.java @@ -1,4 +1,4 @@ -package org.flexiblepower.rai.values; +package org.flexiblepower.ral.values; import java.util.ArrayList; import java.util.List; diff --git a/flexiblepower.api/src/org/flexiblepower/rai/values/CommoditySet.java b/flexiblepower.ral/src/org/flexiblepower/ral/values/CommoditySet.java old mode 100644 new mode 100755 similarity index 99% rename from flexiblepower.api/src/org/flexiblepower/rai/values/CommoditySet.java rename to flexiblepower.ral/src/org/flexiblepower/ral/values/CommoditySet.java index 56257de..cd34bdc --- a/flexiblepower.api/src/org/flexiblepower/rai/values/CommoditySet.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/values/CommoditySet.java @@ -1,4 +1,4 @@ -package org.flexiblepower.rai.values; +package org.flexiblepower.ral.values; import java.util.AbstractSet; import java.util.Collection; diff --git a/flexiblepower.api/src/org/flexiblepower/rai/values/CommodityUncertainMeasurables.java b/flexiblepower.ral/src/org/flexiblepower/ral/values/CommodityUncertainMeasurables.java old mode 100644 new mode 100755 similarity index 98% rename from flexiblepower.api/src/org/flexiblepower/rai/values/CommodityUncertainMeasurables.java rename to flexiblepower.ral/src/org/flexiblepower/ral/values/CommodityUncertainMeasurables.java index a6d4fa0..aae692e --- a/flexiblepower.api/src/org/flexiblepower/rai/values/CommodityUncertainMeasurables.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/values/CommodityUncertainMeasurables.java @@ -1,4 +1,4 @@ -package org.flexiblepower.rai.values; +package org.flexiblepower.ral.values; import javax.measure.quantity.Power; import javax.measure.quantity.Quantity; diff --git a/flexiblepower.api/src/org/flexiblepower/rai/values/Constraint.java b/flexiblepower.ral/src/org/flexiblepower/ral/values/Constraint.java old mode 100644 new mode 100755 similarity index 99% rename from flexiblepower.api/src/org/flexiblepower/rai/values/Constraint.java rename to flexiblepower.ral/src/org/flexiblepower/ral/values/Constraint.java index 17f8be1..1fcf76b --- a/flexiblepower.api/src/org/flexiblepower/rai/values/Constraint.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/values/Constraint.java @@ -1,4 +1,4 @@ -package org.flexiblepower.rai.values; +package org.flexiblepower.ral.values; import javax.measure.Measurable; import javax.measure.Measure; diff --git a/flexiblepower.api/src/org/flexiblepower/rai/values/ConstraintList.java b/flexiblepower.ral/src/org/flexiblepower/ral/values/ConstraintList.java old mode 100644 new mode 100755 similarity index 99% rename from flexiblepower.api/src/org/flexiblepower/rai/values/ConstraintList.java rename to flexiblepower.ral/src/org/flexiblepower/ral/values/ConstraintList.java index 9e37b7c..3830c52 --- a/flexiblepower.api/src/org/flexiblepower/rai/values/ConstraintList.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/values/ConstraintList.java @@ -1,4 +1,4 @@ -package org.flexiblepower.rai.values; +package org.flexiblepower.ral.values; import java.util.AbstractList; import java.util.ArrayList; diff --git a/flexiblepower.api/src/org/flexiblepower/rai/values/ConstraintListMap.java b/flexiblepower.ral/src/org/flexiblepower/ral/values/ConstraintListMap.java old mode 100644 new mode 100755 similarity index 98% rename from flexiblepower.api/src/org/flexiblepower/rai/values/ConstraintListMap.java rename to flexiblepower.ral/src/org/flexiblepower/ral/values/ConstraintListMap.java index 5ac37c0..394c27e --- a/flexiblepower.api/src/org/flexiblepower/rai/values/ConstraintListMap.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/values/ConstraintListMap.java @@ -1,4 +1,4 @@ -package org.flexiblepower.rai.values; +package org.flexiblepower.ral.values; import javax.measure.quantity.Power; import javax.measure.quantity.Quantity; diff --git a/flexiblepower.api/src/org/flexiblepower/rai/values/ConstraintProfile.java b/flexiblepower.ral/src/org/flexiblepower/ral/values/ConstraintProfile.java old mode 100644 new mode 100755 similarity index 98% rename from flexiblepower.api/src/org/flexiblepower/rai/values/ConstraintProfile.java rename to flexiblepower.ral/src/org/flexiblepower/ral/values/ConstraintProfile.java index ad21b9f..21e645c --- a/flexiblepower.api/src/org/flexiblepower/rai/values/ConstraintProfile.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/values/ConstraintProfile.java @@ -1,4 +1,4 @@ -package org.flexiblepower.rai.values; +package org.flexiblepower.ral.values; import java.util.ArrayList; import java.util.List; diff --git a/flexiblepower.api/src/org/flexiblepower/rai/values/ConstraintProfileMap.java b/flexiblepower.ral/src/org/flexiblepower/ral/values/ConstraintProfileMap.java old mode 100644 new mode 100755 similarity index 98% rename from flexiblepower.api/src/org/flexiblepower/rai/values/ConstraintProfileMap.java rename to flexiblepower.ral/src/org/flexiblepower/ral/values/ConstraintProfileMap.java index 2979b8d..653be42 --- a/flexiblepower.api/src/org/flexiblepower/rai/values/ConstraintProfileMap.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/values/ConstraintProfileMap.java @@ -1,4 +1,4 @@ -package org.flexiblepower.rai.values; +package org.flexiblepower.ral.values; import javax.measure.quantity.Power; import javax.measure.quantity.Quantity; diff --git a/flexiblepower.api/src/org/flexiblepower/rai/values/Profile.java b/flexiblepower.ral/src/org/flexiblepower/ral/values/Profile.java old mode 100644 new mode 100755 similarity index 98% rename from flexiblepower.api/src/org/flexiblepower/rai/values/Profile.java rename to flexiblepower.ral/src/org/flexiblepower/ral/values/Profile.java index e3a4d4b..791c0d5 --- a/flexiblepower.api/src/org/flexiblepower/rai/values/Profile.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/values/Profile.java @@ -1,4 +1,4 @@ -package org.flexiblepower.rai.values; +package org.flexiblepower.ral.values; import java.util.AbstractList; import java.util.Arrays; diff --git a/flexiblepower.api/src/org/flexiblepower/rai/values/UncertainMeasurableProfile.java b/flexiblepower.ral/src/org/flexiblepower/ral/values/UncertainMeasurableProfile.java old mode 100644 new mode 100755 similarity index 98% rename from flexiblepower.api/src/org/flexiblepower/rai/values/UncertainMeasurableProfile.java rename to flexiblepower.ral/src/org/flexiblepower/ral/values/UncertainMeasurableProfile.java index 9758be3..8542c15 --- a/flexiblepower.api/src/org/flexiblepower/rai/values/UncertainMeasurableProfile.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/values/UncertainMeasurableProfile.java @@ -1,4 +1,4 @@ -package org.flexiblepower.rai.values; +package org.flexiblepower.ral.values; import java.util.ArrayList; import java.util.List; diff --git a/flexiblepower.api/src/org/flexiblepower/rai/values/UncertainMeasure.java b/flexiblepower.ral/src/org/flexiblepower/ral/values/UncertainMeasure.java old mode 100644 new mode 100755 similarity index 99% rename from flexiblepower.api/src/org/flexiblepower/rai/values/UncertainMeasure.java rename to flexiblepower.ral/src/org/flexiblepower/ral/values/UncertainMeasure.java index 550c002..7dbbb73 --- a/flexiblepower.api/src/org/flexiblepower/rai/values/UncertainMeasure.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/values/UncertainMeasure.java @@ -1,4 +1,4 @@ -package org.flexiblepower.rai.values; +package org.flexiblepower.ral.values; import java.io.Serializable; diff --git a/flexiblepower.api/src/org/flexiblepower/rai/values/package-info.java b/flexiblepower.ral/src/org/flexiblepower/ral/values/package-info.java old mode 100644 new mode 100755 similarity index 80% rename from flexiblepower.api/src/org/flexiblepower/rai/values/package-info.java rename to flexiblepower.ral/src/org/flexiblepower/ral/values/package-info.java index 823e4e3..d61854e --- a/flexiblepower.api/src/org/flexiblepower/rai/values/package-info.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/values/package-info.java @@ -2,7 +2,7 @@ * The values that are used in the Resource Abstraction Interfaces (RAI) layer. */ @Version("2.0.0.${qualifier}") -package org.flexiblepower.rai.values; +package org.flexiblepower.ral.values; import aQute.bnd.annotation.Version; diff --git a/flexiblepower.ral/test/org/flexiblepower/observation/test/ObservationTest.java b/flexiblepower.ral/test/org/flexiblepower/observation/test/ObservationTest.java new file mode 100755 index 0000000..c80965f --- /dev/null +++ b/flexiblepower.ral/test/org/flexiblepower/observation/test/ObservationTest.java @@ -0,0 +1,80 @@ +package org.flexiblepower.observation.test; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.flexiblepower.observation.Observation; + +import junit.framework.TestCase; + +public class ObservationTest extends TestCase { + static class DeepValue { + public int getX() { + return 1; + } + + public int getY() { + return 2; + } + + public String getZ() { + return "Z"; + } + + @Override + public boolean equals(Object obj) { + return getClass() == obj.getClass(); + } + + @Override + public int hashCode() { + return 1; + } + } + + static class ParentValue { + public boolean isActive() { + return true; + } + + public DeepValue getDeep() { + return new DeepValue(); + } + + public List getList() { + return Arrays.asList(1, 2, 3); + } + + @Override + public boolean equals(Object obj) { + return getClass() == obj.getClass(); + } + + @Override + public int hashCode() { + return 2; + } + } + + public void testDeepValues() { + Observation observation = new Observation(new Date(), new ParentValue()); + + Map map = observation.getValueMap(); + assertEquals(6, map.size()); + assertEquals(true, map.get("active")); + assertEquals(new DeepValue(), map.get("deep")); + assertEquals(1, map.get("deep.x")); + assertEquals(2, map.get("deep.y")); + assertEquals("Z", map.get("deep.z")); + assertEquals(Arrays.asList(1, 2, 3), map.get("list")); + + assertEquals(true, observation.getValue("active")); + assertEquals(new DeepValue(), observation.getValue("deep")); + assertEquals(1, observation.getValue("deep.x")); + assertEquals(2, observation.getValue("deep.y")); + assertEquals("Z", observation.getValue("deep.z")); + assertEquals(Arrays.asList(1, 2, 3), observation.getValue("list")); + } +} diff --git a/flexiblepower.ral/test/org/flexiblepower/observation/test/ObservationTranslationHelperTest.java b/flexiblepower.ral/test/org/flexiblepower/observation/test/ObservationTranslationHelperTest.java new file mode 100755 index 0000000..10691d6 --- /dev/null +++ b/flexiblepower.ral/test/org/flexiblepower/observation/test/ObservationTranslationHelperTest.java @@ -0,0 +1,47 @@ +package org.flexiblepower.observation.test; + +import java.lang.reflect.Method; +import java.util.Map; + +import org.flexiblepower.observation.ObservationTranslationHelper; + +import junit.framework.TestCase; + +public class ObservationTranslationHelperTest extends TestCase { + interface TestBean { + boolean isBoolean(); + + int getInteger(); + + String getComplexNamingType(); + } + + public void testGettingGetters() { + Map map = ObservationTranslationHelper.getGetterMethods(TestBean.class); + assertEquals(3, map.size()); + assertEquals(Boolean.TYPE, map.get("boolean").getReturnType()); + assertEquals(Integer.TYPE, map.get("integer").getReturnType()); + assertEquals(String.class, map.get("complex_naming_type").getReturnType()); + } + + interface NonBean { + void getNonsense(); + + int getMoreNonsense(int x); + + int calculate(); + } + + enum TestEnum { + X, Y, Z; + } + + public void testIsJavaBean() { + assertTrue(ObservationTranslationHelper.isJavaBean(TestBean.class)); + assertFalse(ObservationTranslationHelper.isJavaBean(String.class)); + assertFalse(ObservationTranslationHelper.isJavaBean(int.class)); + assertFalse(ObservationTranslationHelper.isJavaBean(TestBean[].class)); + assertFalse(ObservationTranslationHelper.isJavaBean(NonBean.class)); + assertFalse(ObservationTranslationHelper.isJavaBean(TestEnum.class)); + } +} diff --git a/flexiblepower.api/test/org/flexiblepower/rai/values/ConstraintListTest.java b/flexiblepower.ral/test/org/flexiblepower/ral/values/test/ConstraintListTest.java old mode 100644 new mode 100755 similarity index 85% rename from flexiblepower.api/test/org/flexiblepower/rai/values/ConstraintListTest.java rename to flexiblepower.ral/test/org/flexiblepower/ral/values/test/ConstraintListTest.java index 1730bd2..90573cc --- a/flexiblepower.api/test/org/flexiblepower/rai/values/ConstraintListTest.java +++ b/flexiblepower.ral/test/org/flexiblepower/ral/values/test/ConstraintListTest.java @@ -1,4 +1,4 @@ -package org.flexiblepower.rai.values; +package org.flexiblepower.ral.values.test; import static javax.measure.unit.SI.KILO; import static javax.measure.unit.SI.WATT; @@ -8,8 +8,8 @@ import junit.framework.TestCase; -import org.flexiblepower.rai.values.Constraint; -import org.flexiblepower.rai.values.ConstraintList; +import org.flexiblepower.ral.values.Constraint; +import org.flexiblepower.ral.values.ConstraintList; public class ConstraintListTest extends TestCase { public void testBuild() { diff --git a/flexiblepower.runtime/src/org/flexiblepower/runtime/scheduling/LoggingScheduledExecutorService.java b/flexiblepower.runtime/src/org/flexiblepower/runtime/context/LoggingScheduledExecutorService.java similarity index 100% rename from flexiblepower.runtime/src/org/flexiblepower/runtime/scheduling/LoggingScheduledExecutorService.java rename to flexiblepower.runtime/src/org/flexiblepower/runtime/context/LoggingScheduledExecutorService.java diff --git a/flexiblepower.runtime/src/org/flexiblepower/runtime/scheduling/SystemClockTimeService.java b/flexiblepower.runtime/src/org/flexiblepower/runtime/context/RuntimeContext.java similarity index 100% rename from flexiblepower.runtime/src/org/flexiblepower/runtime/scheduling/SystemClockTimeService.java rename to flexiblepower.runtime/src/org/flexiblepower/runtime/context/RuntimeContext.java diff --git a/flexiblepower.ui.connectionspage/bnd.bnd b/flexiblepower.ui.connectionspage/bnd.bnd index 17a4c74..a7c4350 100644 --- a/flexiblepower.ui.connectionspage/bnd.bnd +++ b/flexiblepower.ui.connectionspage/bnd.bnd @@ -1,5 +1,6 @@ -buildpath: ${default-buildpath},\ org.apache.felix.http.servlet-api,\ + flexiblepower.ral;version=latest flexiblepower.runtime;version=latest Bundle-Version: 1.0.0.${qualifier} From 6817ef9fc1964c82e7c2c8596e72384ee5921582 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Wed, 18 Feb 2015 23:05:15 +0100 Subject: [PATCH 043/105] Implemented the correct RuntimeContext Now each bundle gets its own RuntimeContext and single thread for scheduling --- flexiblepower.api/bnd.bnd | 7 +- flexiblepower.ral.efi.utils/bnd.bnd | 2 +- flexiblepower.ral.ext/.classpath | 1 - flexiblepower.ral.ext/bnd.bnd | 2 +- .../ObservationRegistrationHelperTest.java | 123 ------- flexiblepower.runtime.test/.project | 6 - flexiblepower.runtime.test/bnd.bnd | 2 - .../test/FlexiblePowerContextTester.java | 95 ++++++ .../flexiblepower.runtime.bnd | 5 +- .../flexiblepower.runtime.simulation.bnd | 7 +- .../LoggingScheduledExecutorService.java | 169 ---------- .../runtime/context/RuntimeContext.java | 63 +++- .../runtime/messaging/Command.java | 12 +- .../messaging/ConnectionManagerImpl.java | 20 +- .../runtime/messaging/EndpointWrapper.java | 14 +- .../messaging/PotentialConnectionImpl.java | 14 +- .../scheduling/AbstractScheduler.java | 159 +++++++++ .../{simulation => }/scheduling/Job.java | 75 +++-- .../SimulationClock.java | 20 +- .../simulation/context/SimulationContext.java | 180 +++++++++++ .../scheduling/SimulatedScheduleService.java | 306 ------------------ .../simulation/test/SchedulerTest.java | 12 +- flexiblepower.ui/bnd.bnd | 2 +- 23 files changed, 591 insertions(+), 705 deletions(-) delete mode 100644 flexiblepower.ral.ext/test/org/flexiblepower/observation/test/ObservationRegistrationHelperTest.java create mode 100755 flexiblepower.runtime.test/src/org/flexiblepower/runtime/context/test/FlexiblePowerContextTester.java delete mode 100644 flexiblepower.runtime/src/org/flexiblepower/runtime/context/LoggingScheduledExecutorService.java create mode 100755 flexiblepower.runtime/src/org/flexiblepower/scheduling/AbstractScheduler.java rename flexiblepower.runtime/src/org/flexiblepower/{simulation => }/scheduling/Job.java (64%) mode change 100644 => 100755 rename flexiblepower.runtime/src/org/flexiblepower/simulation/{scheduling => context}/SimulationClock.java (83%) create mode 100644 flexiblepower.runtime/src/org/flexiblepower/simulation/context/SimulationContext.java delete mode 100644 flexiblepower.runtime/src/org/flexiblepower/simulation/scheduling/SimulatedScheduleService.java diff --git a/flexiblepower.api/bnd.bnd b/flexiblepower.api/bnd.bnd index 6af827d..c3d3e0a 100755 --- a/flexiblepower.api/bnd.bnd +++ b/flexiblepower.api/bnd.bnd @@ -4,9 +4,12 @@ biz.aQute.bnd.annotation -testpath: ${test} -Bundle-Version: 2.1.0.${qualifier} +Bundle-Version: 3.0.0.${qualifier} Export-Package: \ - javax.measure*,\ + javax.measure,\ + javax.measure.converter,\ + javax.measure.quantity,\ + javax.measure.unit,\ org.flexiblepower.context,\ org.flexiblepower.messaging,\ org.flexiblepower.observation,\ diff --git a/flexiblepower.ral.efi.utils/bnd.bnd b/flexiblepower.ral.efi.utils/bnd.bnd index 9fed646..ba2ff8e 100644 --- a/flexiblepower.ral.efi.utils/bnd.bnd +++ b/flexiblepower.ral.efi.utils/bnd.bnd @@ -5,7 +5,7 @@ flexiblepower.ral.efi;version=latest,\ junit.osgi -Bundle-Version: 2.0.0.${qualifier} +Bundle-Version: 1.0.0.${qualifier} Export-Package: \ org.flexiblepower.api.efi.bufferhelper,\ org.flexiblepower.api.efi.unconstrainedhelper,\ diff --git a/flexiblepower.ral.ext/.classpath b/flexiblepower.ral.ext/.classpath index 023968b..a449a41 100644 --- a/flexiblepower.ral.ext/.classpath +++ b/flexiblepower.ral.ext/.classpath @@ -1,7 +1,6 @@ - diff --git a/flexiblepower.ral.ext/bnd.bnd b/flexiblepower.ral.ext/bnd.bnd index 9c3ea36..c6dac1d 100644 --- a/flexiblepower.ral.ext/bnd.bnd +++ b/flexiblepower.ral.ext/bnd.bnd @@ -6,7 +6,7 @@ flexiblepower.ral;version=latest,\ org.mockito.mockito-all;verion='[1.9,2)' -Bundle-Version: 2.0.1.${qualifier} +Bundle-Version: 1.0.0.${qualifier} Export-Package: \ org.flexiblepower.observation.ext,\ org.flexiblepower.ral.ext,\ diff --git a/flexiblepower.ral.ext/test/org/flexiblepower/observation/test/ObservationRegistrationHelperTest.java b/flexiblepower.ral.ext/test/org/flexiblepower/observation/test/ObservationRegistrationHelperTest.java deleted file mode 100644 index f6275b4..0000000 --- a/flexiblepower.ral.ext/test/org/flexiblepower/observation/test/ObservationRegistrationHelperTest.java +++ /dev/null @@ -1,123 +0,0 @@ -package org.flexiblepower.observation.test; - -import static org.flexiblepower.observation.ext.ObservationProviderRegistrationHelper.KEY_OBSERVATION_OF; -import static org.flexiblepower.observation.ext.ObservationProviderRegistrationHelper.KEY_OBSERVATION_TYPE; -import static org.flexiblepower.observation.ext.ObservationProviderRegistrationHelper.KEY_OBSERVED_BY; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.util.Arrays; -import java.util.Hashtable; -import java.util.Map; - -import junit.framework.TestCase; - -import org.flexiblepower.observation.ObservationProvider; -import org.flexiblepower.observation.ext.ObservationAttribute; -import org.flexiblepower.observation.ext.ObservationProviderRegistrationHelper; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceRegistration; - -public class ObservationRegistrationHelperTest extends TestCase { - interface SubType { - int getInt(); - - double getDouble(); - - String getString(); - - Map getMap(); - } - - interface ComplexType { - SubType getSubType(); - - int getInt(); - } - - @SuppressWarnings("unchecked") - public void testComplexObservationType() { - final ServiceRegistration reg = mock(ServiceRegistration.class); - BundleContext context = mock(BundleContext.class); - when(context.registerService(any(String[].class), eq(this), any(Hashtable.class))).then(new Answer>() { - @Override - public ServiceRegistration answer(InvocationOnMock invocation) throws Throwable { - String[] interfaces = (String[]) invocation.getArguments()[0]; - assertTrue(Arrays.equals(new String[] { ObservationProvider.class.getName() }, interfaces)); - - Hashtable table = (Hashtable) invocation.getArguments()[2]; - assertEquals(9, table.size()); - assertEquals(ObservationRegistrationHelperTest.class.getName(), table.get(KEY_OBSERVED_BY)); - assertEquals("unknown", table.get(KEY_OBSERVATION_OF)); - assertTrue(Arrays.equals(new String[] { ComplexType.class.getName() }, - (String[]) table.get(KEY_OBSERVATION_TYPE))); - assertEquals(SubType.class.getName(), table.get(KEY_OBSERVATION_TYPE + ".sub_type")); - assertEquals("int", table.get(KEY_OBSERVATION_TYPE + ".sub_type.int")); - assertEquals("double", table.get(KEY_OBSERVATION_TYPE + ".sub_type.double")); - assertEquals("string", table.get(KEY_OBSERVATION_TYPE + ".sub_type.string")); - assertEquals(Map.class.getName(), table.get(KEY_OBSERVATION_TYPE + ".sub_type.map")); - assertEquals("int", table.get(KEY_OBSERVATION_TYPE + ".int")); - - return reg; - } - }); - assertEquals(reg, new ObservationProviderRegistrationHelper(this, context).observationType(ComplexType.class) - .register()); - } - - interface CyclicType { - CyclicType getCycle(); - } - - public void testCyclicType() { - BundleContext context = mock(BundleContext.class); - try { - new ObservationProviderRegistrationHelper(this, context).observationType(CyclicType.class).register(); - fail("Expected an IllegalArgumentException"); - } catch (IllegalArgumentException ex) { - assertTrue(ex.getMessage().startsWith("Circular typing detected")); - } - } - - interface UnitType { - @ObservationAttribute(unit = "Watt", optional = false) - int getPower(); - - @ObservationAttribute(unit = "kWh", optional = true) - double getTotal(); - } - - @SuppressWarnings({ "unchecked" }) - public void testUnitType() { - final ServiceRegistration reg = mock(ServiceRegistration.class); - BundleContext context = mock(BundleContext.class); - when(context.registerService(any(String[].class), eq(this), any(Hashtable.class))).then(new Answer>() { - @Override - public ServiceRegistration answer(InvocationOnMock invocation) throws Throwable { - String[] interfaces = (String[]) invocation.getArguments()[0]; - assertTrue(Arrays.equals(new String[] { ObservationProvider.class.getName() }, interfaces)); - - Hashtable table = (Hashtable) invocation.getArguments()[2]; - assertEquals(9, table.size()); - assertEquals(ObservationRegistrationHelperTest.class.getName(), table.get(KEY_OBSERVED_BY)); - assertEquals("unknown", table.get(KEY_OBSERVATION_OF)); - assertTrue(Arrays.equals(new String[] { UnitType.class.getName() }, - (String[]) table.get(KEY_OBSERVATION_TYPE))); - assertEquals("int", table.get(KEY_OBSERVATION_TYPE + ".power")); - assertEquals("Watt", table.get(KEY_OBSERVATION_TYPE + ".power.unit")); - assertEquals(false, table.get(KEY_OBSERVATION_TYPE + ".power.optional")); - assertEquals("double", table.get(KEY_OBSERVATION_TYPE + ".total")); - assertEquals("kWh", table.get(KEY_OBSERVATION_TYPE + ".total.unit")); - assertEquals(true, table.get(KEY_OBSERVATION_TYPE + ".total.optional")); - - return reg; - } - }); - assertEquals(reg, new ObservationProviderRegistrationHelper(this, context).observationType(UnitType.class) - .register()); - } -} diff --git a/flexiblepower.runtime.test/.project b/flexiblepower.runtime.test/.project index 7111d75..bb765db 100644 --- a/flexiblepower.runtime.test/.project +++ b/flexiblepower.runtime.test/.project @@ -15,15 +15,9 @@ - - net.sf.eclipsecs.core.CheckstyleBuilder - - - org.eclipse.jdt.core.javanature bndtools.core.bndnature - net.sf.eclipsecs.core.CheckstyleNature diff --git a/flexiblepower.runtime.test/bnd.bnd b/flexiblepower.runtime.test/bnd.bnd index 9c3fd48..a8387ab 100644 --- a/flexiblepower.runtime.test/bnd.bnd +++ b/flexiblepower.runtime.test/bnd.bnd @@ -12,8 +12,6 @@ Test-Cases: ${classes;CONCRETE;EXTENDS;junit.framework.TestCase},${classes;ANNOT -runbundles: \ flexiblepower.api;version=latest,\ - flexiblepower.api.efi;version=latest,\ - flexiblepower.api.ext;version=latest,\ flexiblepower.runtime;version=latest,\ flexiblepower.runtime.test;version=latest,\ ch.qos.logback.classic;version=latest,\ diff --git a/flexiblepower.runtime.test/src/org/flexiblepower/runtime/context/test/FlexiblePowerContextTester.java b/flexiblepower.runtime.test/src/org/flexiblepower/runtime/context/test/FlexiblePowerContextTester.java new file mode 100755 index 0000000..c39a6b8 --- /dev/null +++ b/flexiblepower.runtime.test/src/org/flexiblepower/runtime/context/test/FlexiblePowerContextTester.java @@ -0,0 +1,95 @@ +package org.flexiblepower.runtime.context.test; + +import java.util.LinkedList; +import java.util.Queue; +import java.util.concurrent.Future; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.measure.Measure; +import javax.measure.unit.SI; + +import junit.framework.TestCase; + +import org.flexiblepower.context.FlexiblePowerContext; +import org.flexiblepower.context.Scheduler; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.util.tracker.ServiceTracker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class FlexiblePowerContextTester extends TestCase { + private static final Logger logger = LoggerFactory.getLogger(FlexiblePowerContext.class); + + private ServiceTracker contextTracker; + + private final BundleContext bundleContext = FrameworkUtil.getBundle(getClass()).getBundleContext(); + + private FlexiblePowerContext getContext() throws InterruptedException { + + contextTracker = new ServiceTracker(bundleContext, + FlexiblePowerContext.class, + null); + contextTracker.open(); + FlexiblePowerContext service = contextTracker.waitForService(10000); + + return service; + } + + public void testContext() throws InterruptedException { + FlexiblePowerContext ctx = getContext(); + + assertTrue("Time should be system time (approximately)", + Math.abs(System.currentTimeMillis() - ctx.currentTimeMillis()) < 20); + assertTrue("Date should be system time (approximately)", + Math.abs(System.currentTimeMillis() - ctx.currentTime().getTime()) < 20); + assertFalse("The runtime should not be a simulation", ctx.isSimulation()); + assertNull("The runtime should not be a simulation", ctx.getSimulation()); + } + + public void testSchedulerThread() throws Exception { + FlexiblePowerContext ctx = getContext(); + Scheduler scheduler = ctx.getScheduler(); + + logger.info("Adding 100 runnables"); + Queue> futures = new LinkedList>(); + for (int ix = 0; ix < 100; ix++) { + final boolean firstThread = ix == 0; + futures.add(scheduler.submit(new Runnable() { + @Override + public void run() { + String threadName = Thread.currentThread().getName(); + if (firstThread) { + logger.info("TreadName: {}", threadName); + } + assertTrue("Any scheduled stuff should be run on the 1 local thread", + threadName.contains(bundleContext.getBundle().getSymbolicName())); + } + })); + } + + for (Future future = futures.poll(); future != null; future = futures.poll()) { + assertNull(future.get(1, TimeUnit.SECONDS)); // Should not take long! + } + + final AtomicInteger counter = new AtomicInteger(); + + ScheduledFuture future = scheduler.scheduleAtFixedRate(new Runnable() { + @Override + public void run() { + counter.incrementAndGet(); + } + }, Measure.valueOf(0.05, SI.SECOND), Measure.valueOf(0.1, SI.SECOND)); + + Thread.sleep(4000); + assertEquals(40, counter.get()); + Thread.sleep(1000); + assertEquals(50, counter.get()); + future.cancel(false); + Thread.sleep(1000); + assertEquals(50, counter.get()); + assertNull(future.get(0, TimeUnit.SECONDS)); + } +} diff --git a/flexiblepower.runtime/flexiblepower.runtime.bnd b/flexiblepower.runtime/flexiblepower.runtime.bnd index 6c92ebe..de9ee84 100644 --- a/flexiblepower.runtime/flexiblepower.runtime.bnd +++ b/flexiblepower.runtime/flexiblepower.runtime.bnd @@ -1,6 +1,7 @@ -Bundle-Version: 2.0.1.${qualifier} +Bundle-Version: 3.0.0.${qualifier} Bundle-SymbolicName: flexiblepower.runtime Private-Package: \ + org.flexiblepower.runtime.context,\ org.flexiblepower.runtime.messaging,\ - org.flexiblepower.runtime.scheduling + org.flexiblepower.scheduling Service-Component: * diff --git a/flexiblepower.runtime/flexiblepower.runtime.simulation.bnd b/flexiblepower.runtime/flexiblepower.runtime.simulation.bnd index 2b4cbf6..479ea73 100644 --- a/flexiblepower.runtime/flexiblepower.runtime.simulation.bnd +++ b/flexiblepower.runtime/flexiblepower.runtime.simulation.bnd @@ -1,6 +1,7 @@ -Bundle-Version: 2.0.1.${qualifier} +Bundle-Version: 3.0.0.${qualifier} Bundle-SymbolicName: flexiblepower.runtime.simulation Private-Package: \ - org.flexiblepower.runtime.messaging, \ - org.flexiblepower.simulation.scheduling + org.flexiblepower.simulation.context,\ + org.flexiblepower.runtime.messaging,\ + org.flexiblepower.scheduling Service-Component: * diff --git a/flexiblepower.runtime/src/org/flexiblepower/runtime/context/LoggingScheduledExecutorService.java b/flexiblepower.runtime/src/org/flexiblepower/runtime/context/LoggingScheduledExecutorService.java deleted file mode 100644 index 7f350e7..0000000 --- a/flexiblepower.runtime/src/org/flexiblepower/runtime/context/LoggingScheduledExecutorService.java +++ /dev/null @@ -1,169 +0,0 @@ -package org.flexiblepower.runtime.scheduling; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import aQute.bnd.annotation.component.Component; -import aQute.bnd.annotation.component.Deactivate; - -@Component -public class LoggingScheduledExecutorService implements ScheduledExecutorService { - static final Logger logger = LoggerFactory.getLogger(LoggingScheduledExecutorService.class); - - private static class CallableWrapper implements Callable { - private final Callable wrapped; - - public CallableWrapper(Callable wrapped) { - this.wrapped = wrapped; - } - - @Override - public T call() { - try { - return wrapped.call(); - } catch (Exception ex) { - logger.error("Error while executing " + wrapped, ex); - return null; - } - } - } - - private static class RunnableWrapper implements Runnable { - private final Runnable wrapped; - - public RunnableWrapper(Runnable wrapped) { - this.wrapped = wrapped; - } - - @Override - public void run() { - try { - wrapped.run(); - } catch (Exception ex) { - logger.error("Error while executing " + wrapped, ex); - } - } - } - - private final ScheduledExecutorService executor; - - public LoggingScheduledExecutorService() { - executor = new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors() * 2); - } - - @Deactivate - public void deactivate() { - executor.shutdownNow(); - } - - @Override - public Future submit(Callable task) { - return executor.submit(new CallableWrapper(task)); - } - - @Override - public Future submit(Runnable task, T result) { - return executor.submit(new RunnableWrapper(task), result); - } - - @Override - public Future submit(Runnable task) { - return executor.submit(new RunnableWrapper(task)); - } - - private List> wrap(Collection> tasks) { - List> result = new ArrayList>(tasks.size()); - for (Callable task : tasks) { - result.add(new CallableWrapper(task)); - } - return result; - } - - @Override - public List> invokeAll(Collection> tasks) throws InterruptedException { - return executor.invokeAll(wrap(tasks)); - } - - @Override - public - List> - invokeAll(Collection> tasks, long timeout, TimeUnit unit) throws InterruptedException { - return executor.invokeAll(wrap(tasks), timeout, unit); - } - - @Override - public T invokeAny(Collection> tasks) throws InterruptedException, ExecutionException { - return executor.invokeAny(wrap(tasks)); - } - - @Override - public - T - invokeAny(Collection> tasks, long timeout, TimeUnit unit) throws InterruptedException, - ExecutionException, - TimeoutException { - return executor.invokeAny(wrap(tasks), timeout, unit); - } - - @Override - public void execute(Runnable command) { - executor.execute(new RunnableWrapper(command)); - } - - @Override - public ScheduledFuture schedule(Runnable command, long delay, TimeUnit unit) { - return executor.schedule(new RunnableWrapper(command), delay, unit); - } - - @Override - public ScheduledFuture schedule(Callable callable, long delay, TimeUnit unit) { - return executor.schedule(new CallableWrapper(callable), delay, unit); - } - - @Override - public ScheduledFuture scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) { - return executor.scheduleAtFixedRate(new RunnableWrapper(command), initialDelay, period, unit); - } - - @Override - public ScheduledFuture scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) { - return executor.scheduleWithFixedDelay(new RunnableWrapper(command), initialDelay, delay, unit); - } - - @Override - public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException { - throw new SecurityException("The awaitTermination method may not be called by non-runtime components"); - } - - @Override - public boolean isShutdown() { - return executor.isShutdown(); - } - - @Override - public boolean isTerminated() { - return executor.isTerminated(); - } - - @Override - public void shutdown() { - throw new SecurityException("The shutdown method may not be called by non-runtime components"); - } - - @Override - public List shutdownNow() { - throw new SecurityException("The shutdownNow method may not be called by non-runtime components"); - } -} diff --git a/flexiblepower.runtime/src/org/flexiblepower/runtime/context/RuntimeContext.java b/flexiblepower.runtime/src/org/flexiblepower/runtime/context/RuntimeContext.java index b13945e..523c16b 100644 --- a/flexiblepower.runtime/src/org/flexiblepower/runtime/context/RuntimeContext.java +++ b/flexiblepower.runtime/src/org/flexiblepower/runtime/context/RuntimeContext.java @@ -1,20 +1,67 @@ -package org.flexiblepower.runtime.scheduling; +package org.flexiblepower.runtime.context; import java.util.Date; -import org.flexiblepower.time.TimeService; +import org.flexiblepower.context.FlexiblePowerContext; +import org.flexiblepower.context.Scheduler; +import org.flexiblepower.context.Simulation; +import org.flexiblepower.scheduling.AbstractScheduler; +import org.osgi.framework.Bundle; +import org.osgi.service.component.ComponentContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import aQute.bnd.annotation.component.Activate; import aQute.bnd.annotation.component.Component; +import aQute.bnd.annotation.component.Deactivate; -@Component(provide = TimeService.class) -public class SystemClockTimeService implements TimeService { - @Override - public Date getTime() { - return new Date(); +@Component(servicefactory = true, provide = FlexiblePowerContext.class) +public class RuntimeContext implements FlexiblePowerContext { + private static final Logger logger = LoggerFactory.getLogger(RuntimeContext.class); + + private AbstractScheduler scheduler; + + @Activate + public void activate(ComponentContext context) { + Bundle bundle = context.getUsingBundle(); + logger.info("Created RuntimeContext for bundle: {}", bundle.getSymbolicName()); + + scheduler = new AbstractScheduler(bundle.getBundleId() + "-" + bundle.getSymbolicName()) { + @Override + public long currentTimeMillis() { + return RuntimeContext.this.currentTimeMillis(); + } + }; + scheduler.start(); + } + + @Deactivate + public void deactivate() { + scheduler.stop(); } @Override - public long getCurrentTimeMillis() { + public long currentTimeMillis() { return System.currentTimeMillis(); } + + @Override + public Date currentTime() { + return new Date(currentTimeMillis()); + } + + @Override + public Scheduler getScheduler() { + return scheduler; + } + + @Override + public boolean isSimulation() { + return false; + } + + @Override + public Simulation getSimulation() { + return null; + } } diff --git a/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/Command.java b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/Command.java index b0accc8..4c31d88 100644 --- a/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/Command.java +++ b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/Command.java @@ -10,7 +10,7 @@ public interface Command { void execute(); public class HandleMessage implements Command { - private static final Logger log = LoggerFactory.getLogger(Command.HandleMessage.class); + private static final Logger logger = LoggerFactory.getLogger(Command.HandleMessage.class); private final Object message; private final MessageHandler handler; @@ -26,16 +26,16 @@ public HandleMessage(Object message, MessageHandler handler) { @Override public void execute() { try { - log.trace("Handling message {}", message); + logger.trace("Handling message {}", message); handler.handleMessage(message); } catch (RuntimeException ex) { - log.error("Error while handling message (" + message + "): " + ex.getMessage(), ex); + logger.error("Error while handling message (" + message + "): " + ex.getMessage(), ex); } } } public class Disconnect implements Command { - private static final Logger log = LoggerFactory.getLogger(Command.Disconnect.class); + private static final Logger logger = LoggerFactory.getLogger(Command.Disconnect.class); private final MessageHandler handler; private final CountDownLatch latch; @@ -48,10 +48,10 @@ public Disconnect(MessageHandler handler, CountDownLatch latch) { @Override public void execute() { try { - log.trace("Disconnecting"); + logger.trace("Disconnecting"); handler.disconnected(); } catch (RuntimeException ex) { - log.error("Error while disconnecting: " + ex.getMessage(), ex); + logger.error("Error while disconnecting: " + ex.getMessage(), ex); } finally { latch.countDown(); } diff --git a/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/ConnectionManagerImpl.java b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/ConnectionManagerImpl.java index 5d6d518..5842f39 100644 --- a/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/ConnectionManagerImpl.java +++ b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/ConnectionManagerImpl.java @@ -38,7 +38,7 @@ provide = ConnectionManager.class) public class ConnectionManagerImpl implements ConnectionManager { private static final String KEY_ACTIVE_CONNECTIONS = "active.connections"; - private static final Logger log = LoggerFactory.getLogger(ConnectionManagerImpl.class); + private static final Logger logger = LoggerFactory.getLogger(ConnectionManagerImpl.class); public static interface Config { @Meta.AD(name = KEY_ACTIVE_CONNECTIONS, @@ -106,13 +106,13 @@ public synchronized void activate() throws IOException { } } } - log.debug("These connections are configured at boottime: {}", activeConnections); + logger.debug("These connections are configured at boottime: {}", activeConnections); for (EndpointWrapper leftWrapper : endpointWrappers.values()) { for (EndpointPortImpl leftPort : leftWrapper.getPorts().values()) { for (PotentialConnectionImpl connection : leftPort.getPotentialConnections().values()) { if (connection.isConnectable() && activeConnections.contains(connection.toString())) { - log.info("Auto-starting connection on {}", connection); + logger.info("Auto-starting connection on {}", connection); connection.connect(); } } @@ -178,7 +178,7 @@ private void storeConnections() { try { configuration.update(properties); } catch (IOException e) { - log.warn("Could not store the new active connections: " + e.getMessage(), e); + logger.warn("Could not store the new active connections: " + e.getMessage(), e); } } } @@ -193,10 +193,10 @@ public synchronized void addEndpoint(Endpoint endpoint, Map propertie EndpointWrapper wrapper = new EndpointWrapper(key, endpoint, this); endpointWrappers.put(key, wrapper); detectPossibleConnections(wrapper); - log.debug("Added endpoint on key [{}]", key); + logger.debug("Added endpoint on key [{}]", key); } } catch (IllegalArgumentException ex) { - log.warn("Could not add endpoint: {}", ex.getMessage()); + logger.warn("Could not add endpoint: {}", ex.getMessage()); } } @@ -206,7 +206,7 @@ public synchronized void removeEndpoint(Endpoint endpoint, Map proper EndpointWrapper endpointWrapper = endpointWrappers.remove(key); if (endpointWrapper != null && endpointWrapper.getEndpoint() == endpoint) { endpointWrapper.close(); - log.debug("Removed endpoint on key [{}]", key); + logger.debug("Removed endpoint on key [{}]", key); } } } @@ -230,13 +230,13 @@ private void detectPossibleConnections(EndpointWrapper leftWrapper) { left.getPort() .accepts())) { PotentialConnectionImpl connection = new PotentialConnectionImpl(left, right); - log.info("Found matching ports: {} <--> {}", left, right); + logger.info("Found matching ports: {} <--> {}", left, right); left.addMatch(connection); right.addMatch(connection); String key = connection.toString(); if (activeConnections.contains(key)) { - log.info("Auto-starting connection on {}", connection); + logger.info("Auto-starting connection on {}", connection); connection.connect(); } } @@ -322,7 +322,7 @@ public synchronized void autoConnect() { if ((otherEnd.getCardinality() == Cardinality.SINGLE && otherEnd.getPotentialConnections() .size() == 1) || otherEnd.getCardinality() == Cardinality.MULTIPLE) { connection.connect(); - log.debug("Autoconnected [" + port + "] to [" + otherEnd + "]"); + logger.debug("Autoconnected [" + port + "] to [" + otherEnd + "]"); } } } diff --git a/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/EndpointWrapper.java b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/EndpointWrapper.java index 4cec1fc..4c0a93f 100644 --- a/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/EndpointWrapper.java +++ b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/EndpointWrapper.java @@ -15,7 +15,7 @@ import org.slf4j.LoggerFactory; public class EndpointWrapper implements Runnable, ManagedEndpoint, Closeable { - private static final Logger log = LoggerFactory.getLogger(EndpointWrapper.class); + private static final Logger logger = LoggerFactory.getLogger(EndpointWrapper.class); private final String pid; private final Endpoint endpoint; @@ -43,7 +43,7 @@ public EndpointWrapper(String pid, Endpoint endpoint, ConnectionManagerImpl conn } private void parsePorts(Class clazz) { - log.debug("Start detection of ports on {}", clazz.getName()); + logger.debug("Start detection of ports on {}", clazz.getName()); Port[] ports = null; Ports portsAnnotation = clazz.getAnnotation(Ports.class); @@ -63,27 +63,27 @@ private void parsePorts(Class clazz) { EndpointPortImpl storedPort = this.ports.get(port.name()); if (storedPort == null) { - log.debug("Adding port on endpoint [{}]: {}", endpoint, port.name()); + logger.debug("Adding port on endpoint [{}]: {}", endpoint, port.name()); this.ports.put(port.name(), endpointPort); } else if (storedPort.getPort().sends().length == 0 && storedPort.getPort().accepts().length == 0) { if (storedPort.getPort().cardinality() != port.cardinality()) { - log.warn("Defined cardinality {} on port {} is different from the implementation port {}", + logger.warn("Defined cardinality {} on port {} is different from the implementation port {}", storedPort.getCardinality(), port.name(), port.cardinality()); } - log.debug("Replacing port on endpoint [{}]: {}", endpoint, port.name()); + logger.debug("Replacing port on endpoint [{}]: {}", endpoint, port.name()); this.ports.put(port.name(), endpointPort); storedPort.close(); } else if (port.sends().length == 0 && port.accepts().length == 0) { if (storedPort.getPort().cardinality() != port.cardinality()) { - log.warn("Defined cardinality {} on port {} is different from the implementation port {}", + logger.warn("Defined cardinality {} on port {} is different from the implementation port {}", storedPort.getCardinality(), port.name(), port.cardinality()); } } else { - log.error("Implementation of port {} is defined multiple times! Possibly undefined behavior can be expected.", + logger.error("Implementation of port {} is defined multiple times! Possibly undefined behavior can be expected.", port.name()); } } diff --git a/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/PotentialConnectionImpl.java b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/PotentialConnectionImpl.java index 578dc44..d1c6c08 100644 --- a/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/PotentialConnectionImpl.java +++ b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/PotentialConnectionImpl.java @@ -12,12 +12,12 @@ import org.slf4j.LoggerFactory; final class PotentialConnectionImpl implements PotentialConnection { - private static final Logger log = LoggerFactory.getLogger(PotentialConnectionImpl.class); + private static final Logger logger = LoggerFactory.getLogger(PotentialConnectionImpl.class); private static final MessageHandler DUMP = new MessageHandler() { @Override public void handleMessage(Object message) { - log.debug("Dumping message {}", message); + logger.debug("Dumping message {}", message); } @Override @@ -52,7 +52,7 @@ synchronized void setMessageHandler(MessageHandler messageHandler) { @Override public void sendMessage(Object message) { if (message == null) { - log.warn("Trying to send a null message to {}, ignoring", receivingEndpoint.getPid()); + logger.warn("Trying to send a null message to {}, ignoring", receivingEndpoint.getPid()); return; } @@ -142,7 +142,7 @@ public synchronized void connect() { throw new IllegalStateException(connectableError); } - log.debug("Connecting port [{}] to port [{}]", left, right); + logger.debug("Connecting port [{}] to port [{}]", left, right); HalfConnection leftHalfConnection = new HalfConnection(left, right); HalfConnection rightHalfConnection = new HalfConnection(right, left); @@ -151,7 +151,7 @@ public synchronized void connect() { rightMessageHandler = right.getEndpoint().getEndpoint().onConnect(rightHalfConnection); if (leftMessageHandler == null || rightMessageHandler == null) { - log.warn("Could not connect port [{}] to port [{}], because the onConnect failed (returned null)", + logger.warn("Could not connect port [{}] to port [{}], because the onConnect failed (returned null)", left, right); @@ -164,7 +164,7 @@ public synchronized void connect() { rightHalfConnection.setMessageHandler(leftMessageHandler); left.getEndpoint().getConnectionManager().connectedPort(toString()); - log.debug("Connected port [{}] to port [{}]", left, right); + logger.debug("Connected port [{}] to port [{}]", left, right); } } } @@ -177,7 +177,7 @@ public synchronized void disconnect() { synchronized void close() { if (isConnected()) { - log.debug("Disconnecting port [{}] to port [{}]", left, right); + logger.debug("Disconnecting port [{}] to port [{}]", left, right); try { CountDownLatch latch = new CountDownLatch(2); diff --git a/flexiblepower.runtime/src/org/flexiblepower/scheduling/AbstractScheduler.java b/flexiblepower.runtime/src/org/flexiblepower/scheduling/AbstractScheduler.java new file mode 100755 index 0000000..ea66741 --- /dev/null +++ b/flexiblepower.runtime/src/org/flexiblepower/scheduling/AbstractScheduler.java @@ -0,0 +1,159 @@ +package org.flexiblepower.scheduling; + +import java.util.PriorityQueue; +import java.util.concurrent.Callable; +import java.util.concurrent.Future; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.measure.Measurable; +import javax.measure.quantity.Duration; +import javax.measure.unit.SI; +import javax.measure.unit.Unit; + +import org.flexiblepower.context.Scheduler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class AbstractScheduler implements Scheduler, Runnable { + public static final Unit MS = SI.MILLI(SI.SECOND); + + public static final ThreadGroup schedulerGroup = new ThreadGroup("FlexiblePower Scheduling"); + + protected final Logger logger = LoggerFactory.getLogger(getClass()); + + private final String name; + + protected final AtomicBoolean running; + protected final PriorityQueue> jobs; + + private volatile Thread thread; + + public AbstractScheduler(String name) { + this.name = name; + + running = new AtomicBoolean(false); + jobs = new PriorityQueue>(); + } + + public void start() { + if (running.compareAndSet(false, true)) { + thread = new Thread(schedulerGroup, this, "Scheduler thread for " + name); + thread.setDaemon(true); + thread.start(); + } + } + + public void stop() { + synchronized (jobs) { + running.set(false); + jobs.notifyAll(); + + try { + thread.join(); + } catch (InterruptedException e) { + } finally { + thread = null; + } + } + } + + public abstract long currentTimeMillis(); + + private Job addJob(Job job) { + synchronized (jobs) { + jobs.add(job); + jobs.notifyAll(); + return job; + } + } + + void remove(Job job) { + synchronized (jobs) { + jobs.remove(job); + jobs.notifyAll(); + } + } + + @Override + public Future submit(Callable task) { + logger.trace("submit(callable: {})", task); + return addJob(Job.create(task, this, currentTimeMillis(), 0)); + } + + @Override + public Future submit(Runnable task, T result) { + logger.trace("submit(runnable: {}, result: {})", task, result); + return addJob(Job.create(task, result, this, currentTimeMillis(), 0)); + } + + @Override + public Future submit(Runnable task) { + return submit(task, null); + } + + @Override + public ScheduledFuture schedule(Runnable command, Measurable delay) { + logger.trace("schedule(runnable: {}, delay: {})", command, delay); + long ms = delay.longValue(MS); + return addJob(Job.create(command, null, this, currentTimeMillis() + ms, 0)); + } + + @Override + public ScheduledFuture schedule(Callable callable, Measurable delay) { + logger.trace("schedule(callable: {}, delay: {})", callable, delay); + long ms = delay.longValue(MS); + return addJob(Job.create(callable, this, currentTimeMillis() + ms, 0)); + } + + @Override + public ScheduledFuture scheduleAtFixedRate(Runnable command, + Measurable initialDelay, + Measurable period) { + logger.trace("scheduleAtFixedRate(runnable: {}, initialDelay: {}, period: {})", command, initialDelay, period); + return addJob(Job.create(command, + null, + this, + currentTimeMillis() + initialDelay.longValue(MS), + period.longValue(MS))); + } + + @Override + public ScheduledFuture scheduleWithFixedDelay(Runnable command, + Measurable initialDelay, + Measurable delay) { + logger.trace("scheduleWithFixedDelay(runnable: {}, initialDelay: {}, delay: {})", command, initialDelay, delay); + return addJob(Job.create(command, + null, + this, + currentTimeMillis() + initialDelay.longValue(MS), + -delay.longValue(MS))); + } + + protected long getNextJobTime() { + return jobs.isEmpty() ? Long.MAX_VALUE : jobs.peek().getTimeOfNextRun(); + } + + @Override + public void run() { + while (running.get()) { + synchronized (jobs) { + long now = currentTimeMillis(); + long waitTime = getNextJobTime() - now; + if (waitTime <= 0) { + Job job = jobs.remove(); + job.run(); + if (!job.isDone()) { + jobs.add(job); + } + } else { + logger.debug("Sleeping {}ms until next job", waitTime); + try { + jobs.wait(waitTime); + } catch (final InterruptedException ex) { + } + } + } + } + } +} diff --git a/flexiblepower.runtime/src/org/flexiblepower/simulation/scheduling/Job.java b/flexiblepower.runtime/src/org/flexiblepower/scheduling/Job.java old mode 100644 new mode 100755 similarity index 64% rename from flexiblepower.runtime/src/org/flexiblepower/simulation/scheduling/Job.java rename to flexiblepower.runtime/src/org/flexiblepower/scheduling/Job.java index a5fdea2..cc970be --- a/flexiblepower.runtime/src/org/flexiblepower/simulation/scheduling/Job.java +++ b/flexiblepower.runtime/src/org/flexiblepower/scheduling/Job.java @@ -1,6 +1,5 @@ -package org.flexiblepower.simulation.scheduling; +package org.flexiblepower.scheduling; -import java.util.Date; import java.util.concurrent.Callable; import java.util.concurrent.Delayed; import java.util.concurrent.ExecutionException; @@ -14,49 +13,52 @@ public class Job implements ScheduledFuture { private final static Logger logger = LoggerFactory.getLogger(Job.class); - public static Job create(final Runnable runnable, - final SimulatedScheduleService scheduleService, - long timeOfNextRun, - long timeStep) { - return new Job(new Callable() { + public static Job create(final Runnable runnable, + final V result, + final AbstractScheduler scheduler, + long timeOfNextRun, + long timeStep) { + return new Job(new Callable() { @Override - public Object call() throws Exception { + public V call() throws Exception { runnable.run(); - return null; + return result; } @Override public String toString() { return runnable.toString(); } - }, scheduleService, timeOfNextRun, timeStep); + }, scheduler, timeOfNextRun, timeStep); } public static Job create(final Callable callable, - final SimulatedScheduleService scheduleService, + final AbstractScheduler scheduler, long timeOfNextRun, long timeStep) { - return new Job(callable, scheduleService, timeOfNextRun, timeStep); + return new Job(callable, scheduler, timeOfNextRun, timeStep); } private final Callable callable; - private final SimulatedScheduleService scheduleService; + private final AbstractScheduler scheduler; private volatile V result; private volatile Exception exception; // Both of these are is milliseconds private volatile long timeOfNextRun, timeStep; + private volatile boolean cancelled; - private Job(Callable callable, SimulatedScheduleService scheduleService, long timeOfNextRun, long timeStep) { + private Job(Callable callable, AbstractScheduler scheduler, long timeOfNextRun, long timeStep) { this.callable = callable; - this.scheduleService = scheduleService; + this.scheduler = scheduler; this.timeOfNextRun = timeOfNextRun; this.timeStep = timeStep; result = null; exception = null; + cancelled = false; } public long getTimeOfNextRun() { @@ -69,7 +71,7 @@ public long getTimeStep() { @Override public long getDelay(TimeUnit unit) { - long delay = timeOfNextRun - scheduleService.getCurrentTimeMillis(); + long delay = timeOfNextRun - scheduler.currentTimeMillis(); if (delay < 0) { delay = 0; } @@ -94,15 +96,18 @@ public int compareTo(Delayed o) { @Override public boolean cancel(boolean mayInterruptIfRunning) { - timeOfNextRun = 0; - timeStep = 0; - scheduleService.remove(this); + if (timeOfNextRun > 0) { + cancelled = true; + timeOfNextRun = 0; + timeStep = 0; + scheduler.remove(this); + } return true; } @Override public boolean isCancelled() { - return isDone(); + return cancelled; } @Override @@ -111,7 +116,7 @@ public boolean isDone() { } public synchronized void run() { - logger.debug("Running Job " + this); + logger.trace("Running {}", this); try { result = callable.call(); } catch (Exception e) { @@ -122,16 +127,19 @@ public synchronized void run() { if (timeStep > 0) { timeOfNextRun += timeStep; - logger.debug("Rescheduled job " + this + " to " + timeOfNextRun); + logger.trace("Rescheduled {}", this); + } else if (timeStep < 0) { + timeOfNextRun = scheduler.currentTimeMillis() + timeStep; + logger.trace("Rescheduled {}", this); } else { timeOfNextRun = 0; - logger.debug("Unscheduled job " + this); + logger.trace("Unscheduled {}", this); } } @Override public synchronized V get() throws InterruptedException, ExecutionException { - if (!isDone()) { + while (!isDone()) { this.wait(); } @@ -146,12 +154,17 @@ public synchronized V get() throws InterruptedException, ExecutionException { public synchronized V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { - if (!isDone()) { - this.wait(TimeUnit.MILLISECONDS.convert(timeout, unit)); + long waitUntil = scheduler.currentTimeMillis() + TimeUnit.MILLISECONDS.convert(timeout, unit); + long waitTime = waitUntil - scheduler.currentTimeMillis(); + while (!isDone() && waitTime > 0) { + this.wait(waitTime); + waitTime = waitUntil - scheduler.currentTimeMillis(); } if (exception != null) { throw new ExecutionException(exception); + } else if (!isDone()) { + throw new TimeoutException(); } else { return result; } @@ -159,16 +172,8 @@ public synchronized V get(long timeout, TimeUnit unit) throws InterruptedExcepti public void reschedule(long time) { if (timeOfNextRun > time) { - // if (timeStep > 0) { - // timeOfNextRun -= ((timeOfNextRun - time) / timeStep) * timeStep; - // } else { - // timeOfNextRun = time; - // } timeOfNextRun = time; - - if (logger.isDebugEnabled()) { - logger.debug("Rescheduled job " + this + " to " + new Date(timeOfNextRun)); - } + logger.trace("Rescheduled {}", this); } } diff --git a/flexiblepower.runtime/src/org/flexiblepower/simulation/scheduling/SimulationClock.java b/flexiblepower.runtime/src/org/flexiblepower/simulation/context/SimulationClock.java similarity index 83% rename from flexiblepower.runtime/src/org/flexiblepower/simulation/scheduling/SimulationClock.java rename to flexiblepower.runtime/src/org/flexiblepower/simulation/context/SimulationClock.java index 62106b9..8a1bd84 100644 --- a/flexiblepower.runtime/src/org/flexiblepower/simulation/scheduling/SimulationClock.java +++ b/flexiblepower.runtime/src/org/flexiblepower/simulation/context/SimulationClock.java @@ -1,15 +1,15 @@ -package org.flexiblepower.simulation.scheduling; +package org.flexiblepower.simulation.context; import java.util.Date; -import org.flexiblepower.simulation.Simulation; -import org.flexiblepower.simulation.Simulation.State; +import org.flexiblepower.context.Simulation; +import org.flexiblepower.context.Simulation.State; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SimulationClock { - private static final Logger LOG = LoggerFactory.getLogger(SimulationClock.class); + private static final Logger logger = LoggerFactory.getLogger(SimulationClock.class); private long simulationStartTime; private long simulationStopTime; @@ -38,7 +38,7 @@ public synchronized void start(long startTime, long stopTime, double speedFactor wallStartTime = System.currentTimeMillis(); this.speedFactor = speedFactor; state = Simulation.State.RUNNING; - LOG.debug("Simulation starting with simulated time " + new Date(startTime).toString()); + logger.debug("Simulation starting with simulated time " + new Date(startTime).toString()); } public synchronized void pause() { @@ -47,7 +47,7 @@ public synchronized void pause() { } simulationStartTime = getCurrentTimeMillis(); state = Simulation.State.PAUSED; - LOG.debug("Simulation paused at simulated time " + new Date(simulationStartTime).toString()); + logger.debug("Simulation paused at simulated time " + new Date(simulationStartTime).toString()); } public synchronized void unpause() { @@ -56,11 +56,11 @@ public synchronized void unpause() { } state = Simulation.State.RUNNING; wallStartTime = System.currentTimeMillis(); - LOG.debug("Simulation upaused at simulated time " + new Date(simulationStartTime).toString()); + logger.debug("Simulation upaused at simulated time " + new Date(simulationStartTime).toString()); } public synchronized void stop() { - LOG.debug("Simulation stopped"); + logger.debug("Simulation stopped"); state = Simulation.State.STOPPED; } @@ -122,8 +122,8 @@ public synchronized long getCurrentTimeMillis() { default: long currentTime = (long) ((System.currentTimeMillis() - wallStartTime) * speedFactor + simulationStartTime); if (currentTime > simulationStopTime) { - LOG.debug("Simulation reached end time " + new Date(simulationStopTime).toString() - + ", stopping simulation..."); + logger.debug("Simulation reached end time " + new Date(simulationStopTime).toString() + + ", stopping simulation..."); state = State.STOPPING; return simulationStopTime; } else { diff --git a/flexiblepower.runtime/src/org/flexiblepower/simulation/context/SimulationContext.java b/flexiblepower.runtime/src/org/flexiblepower/simulation/context/SimulationContext.java new file mode 100644 index 0000000..5d73eb1 --- /dev/null +++ b/flexiblepower.runtime/src/org/flexiblepower/simulation/context/SimulationContext.java @@ -0,0 +1,180 @@ +package org.flexiblepower.simulation.context; + +import java.util.Date; + +import org.flexiblepower.context.FlexiblePowerContext; +import org.flexiblepower.context.Scheduler; +import org.flexiblepower.context.Simulation; +import org.flexiblepower.scheduling.AbstractScheduler; +import org.flexiblepower.scheduling.Job; + +import aQute.bnd.annotation.component.Activate; +import aQute.bnd.annotation.component.Component; +import aQute.bnd.annotation.component.Deactivate; + +@Component(provide = { FlexiblePowerContext.class }) +public class SimulationContext extends AbstractScheduler + implements + FlexiblePowerContext, + Simulation { + + private final SimulationClock simulationClock = new SimulationClock(); + + public SimulationContext() { + super("Simulation"); + } + + @Activate + public void activate() { + start(); + } + + @Deactivate + public void deactivate() { + stop(); + } + + private volatile boolean isWaiting = false; + private volatile long currentTime = 0; + + @Override + public long currentTimeMillis() { + if (simulationClock.isStopped()) { + return System.currentTimeMillis(); + } else { + if (isWaiting) { + long clockTime = simulationClock.getCurrentTimeMillis(); + if (clockTime > currentTime && clockTime < getNextJobTime()) { + currentTime = clockTime; + } + } + return currentTime; + } + } + + @Override + public Date currentTime() { + return new Date(currentTimeMillis()); + } + + @Override + public Scheduler getScheduler() { + return this; + } + + @Override + public Simulation getSimulation() { + return this; + } + + @Override + public boolean isSimulation() { + return true; + } + + // The main run method + @Override + public void run() { + while (running.get()) { + if (simulationClock.isRunning() || simulationClock.isStopping()) { + synchronized (this) { + long now = simulationClock.getCurrentTimeMillis(); + logger.trace("Simulation step {}", now); + long waitTime = getNextJobTime() - now; + if (waitTime <= 0) { + Job job = jobs.remove(); + currentTime = Math.max(currentTime, job.getTimeOfNextRun()); + logger.trace("Executing {}", job); + job.run(); + if (!job.isDone()) { + jobs.add(job); + logger.trace("Rescheduling {}", job); + } + } else if (simulationClock.isStopping()) { + logger.trace("Stopping simulation clock"); + simulationClock.stop(); + } else { + long sleepTime = (long) (waitTime / simulationClock.getSpeedFactor()); + logger.trace("Sleeping {}ms until next job", sleepTime); + try { + if (sleepTime > 0) { + isWaiting = true; + wait(sleepTime); + } + } catch (final InterruptedException ex) { + } + isWaiting = false; + } + } + } else { + // Wait for simulation start + try { + synchronized (this) { + wait(); + currentTime = simulationClock.getSimulationStartTime(); + } + } catch (InterruptedException e) { + } + } + } + } + + // Start or stop the simulation + + @Override + public synchronized void startSimulation(Date startTime, double speedFactor) { + startSimulation(startTime, null, speedFactor); + } + + @Override + public synchronized void startSimulation(Date startTime, Date stopTime, double speedFactor) { + logger.trace("Starting simulation @ {} until {} with factor {}", startTime, stopTime, speedFactor); + Job[] oldJobs = jobs.toArray(new Job[jobs.size()]); + jobs.clear(); + + for (Job job : oldJobs) { + job.reschedule(startTime.getTime()); + jobs.add(job); + } + + if (stopTime == null) { + simulationClock.start(startTime.getTime(), speedFactor); + } else { + simulationClock.start(startTime.getTime(), stopTime.getTime(), speedFactor); + } + + notifyAll(); + } + + @Override + public synchronized void stopSimulation() { + logger.trace("Signaling the end of the simulation @ {}", simulationClock.getCurrentTimeMillis()); + simulationClock.stop(); + notifyAll(); + } + + @Override + public synchronized void changeSpeedFactor(double newSpeedFactor) { + if (!simulationClock.isStopped()) { + simulationClock.changeSpeedFactor(newSpeedFactor); + } + } + + @Override + public synchronized void pause() { + logger.trace("Pause @ {}", simulationClock.getCurrentTimeMillis()); + simulationClock.pause(); + } + + @Override + public synchronized void unpause() { + logger.trace("Unpause @ {}", simulationClock.getCurrentTimeMillis()); + simulationClock.unpause(); + notifyAll(); + } + + @Override + public synchronized Simulation.State getSimulationClockState() { + return simulationClock.getState(); + } +} diff --git a/flexiblepower.runtime/src/org/flexiblepower/simulation/scheduling/SimulatedScheduleService.java b/flexiblepower.runtime/src/org/flexiblepower/simulation/scheduling/SimulatedScheduleService.java deleted file mode 100644 index 6f70803..0000000 --- a/flexiblepower.runtime/src/org/flexiblepower/simulation/scheduling/SimulatedScheduleService.java +++ /dev/null @@ -1,306 +0,0 @@ -package org.flexiblepower.simulation.scheduling; - -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.PriorityQueue; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import org.flexiblepower.simulation.Simulation; -import org.flexiblepower.time.TimeService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import aQute.bnd.annotation.component.Activate; -import aQute.bnd.annotation.component.Component; -import aQute.bnd.annotation.component.Deactivate; - -@Component(provide = { ScheduledExecutorService.class, TimeService.class, Simulation.class }) -public class SimulatedScheduleService implements ScheduledExecutorService, TimeService, Simulation, Runnable { - private static final Logger logger = LoggerFactory.getLogger(SimulatedScheduleService.class); - - private volatile boolean running; - private final Thread thread; - private final PriorityQueue> jobs = new PriorityQueue>(); - private final SimulationClock simulationClock = new SimulationClock(); - - public SimulatedScheduleService() { - thread = new Thread(this, "SimulatedScheduleService"); - } - - @Activate - public void activate() { - running = true; - thread.start(); - } - - @Deactivate - public void deactivate() { - running = false; - synchronized (this) { - notifyAll(); - } - try { - thread.join(); - } catch (InterruptedException e) { - } - } - - // Calculating time stuff - - private long getNextJobTime() { - return jobs.isEmpty() ? Long.MAX_VALUE : jobs.peek().getTimeOfNextRun(); - } - - private volatile boolean isWaiting = false; - private volatile long currentTime = 0; - - @Override - public long getCurrentTimeMillis() { - if (simulationClock.isStopped()) { - return System.currentTimeMillis(); - } else { - if (isWaiting) { - long clockTime = simulationClock.getCurrentTimeMillis(); - if (clockTime > currentTime && clockTime < getNextJobTime()) { - currentTime = clockTime; - } - } - return currentTime; - } - } - - @Override - public Date getTime() { - return new Date(getCurrentTimeMillis()); - } - - private synchronized void addJob(Job job) { - jobs.add(job); - notifyAll(); - } - - // Adding jobs - - @Override - public void execute(Runnable command) { - addJob(Job.create(command, this, getCurrentTimeMillis(), 0)); - } - - @Override - public ScheduledFuture schedule(Runnable command, long delay, TimeUnit unit) { - Job job = Job.create(command, this, getCurrentTimeMillis() + TimeUnit.MILLISECONDS.convert(delay, unit), 0); - addJob(job); - return job; - } - - @Override - public ScheduledFuture schedule(Callable callable, long delay, TimeUnit unit) { - Job job = Job.create(callable, this, getCurrentTimeMillis() + TimeUnit.MILLISECONDS.convert(delay, unit), 0); - addJob(job); - return job; - } - - @Override - public ScheduledFuture scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) { - Job job = Job.create(command, - this, - getCurrentTimeMillis() + TimeUnit.MILLISECONDS.convert(initialDelay, unit), - TimeUnit.MILLISECONDS.convert(period, unit)); - addJob(job); - return job; - } - - // The main run method - @Override - public void run() { - while (running) { - if (simulationClock.isRunning() || simulationClock.isStopping()) { - synchronized (this) { - long now = simulationClock.getCurrentTimeMillis(); - logger.trace("Simulation step {}", now); - long waitTime = getNextJobTime() - now; - if (waitTime <= 0) { - Job job = jobs.remove(); - currentTime = Math.max(currentTime, job.getTimeOfNextRun()); - logger.trace("Executing {}", job); - job.run(); - if (!job.isDone()) { - jobs.add(job); - logger.trace("Rescheduling {}", job); - } - } else if (simulationClock.isStopping()) { - logger.trace("Stopping simulation clock"); - simulationClock.stop(); - } else { - long sleepTime = (long) (waitTime / simulationClock.getSpeedFactor()); - logger.trace("Sleeping {}ms until next job", sleepTime); - try { - if (sleepTime > 0) { - isWaiting = true; - wait(sleepTime); - } - } catch (final InterruptedException ex) { - } - isWaiting = false; - } - } - } else { - // Wait for simulation start - try { - synchronized (this) { - wait(); - currentTime = simulationClock.getSimulationStartTime(); - } - } catch (InterruptedException e) { - } - } - } - } - - // Removing jobs - - synchronized void remove(Job job) { - jobs.remove(job); - - notifyAll(); - } - - // Start or stop the simulation - - @Override - public synchronized void startSimulation(Date startTime, double speedFactor) { - startSimulation(startTime, null, speedFactor); - } - - @Override - public synchronized void startSimulation(Date startTime, Date stopTime, double speedFactor) { - logger.trace("Starting simulation @ {} until {} with factor {}", startTime, stopTime, speedFactor); - Job[] oldJobs = jobs.toArray(new Job[jobs.size()]); - jobs.clear(); - - for (Job job : oldJobs) { - job.reschedule(startTime.getTime()); - jobs.add(job); - } - - if (stopTime == null) { - simulationClock.start(startTime.getTime(), speedFactor); - } else { - simulationClock.start(startTime.getTime(), stopTime.getTime(), speedFactor); - } - - notifyAll(); - } - - @Override - public synchronized void stopSimulation() { - logger.trace("Signaling the end of the simulation @ {}", simulationClock.getCurrentTimeMillis()); - simulationClock.stop(); - notifyAll(); - } - - @Override - public synchronized void changeSpeedFactor(double newSpeedFactor) { - if (!simulationClock.isStopped()) { - simulationClock.changeSpeedFactor(newSpeedFactor); - } - } - - @Override - public synchronized void pause() { - logger.trace("Pause @ {}", simulationClock.getCurrentTimeMillis()); - simulationClock.pause(); - } - - @Override - public synchronized void unpause() { - logger.trace("Unpause @ {}", simulationClock.getCurrentTimeMillis()); - simulationClock.unpause(); - notifyAll(); - } - - @Override - public synchronized Simulation.State getSimulationClockState() { - return simulationClock.getState(); - } - - @Override - public boolean awaitTermination(long arg0, TimeUnit arg1) throws InterruptedException { - throw new UnsupportedOperationException(); - } - - @Override - public List> invokeAll(Collection> arg0) throws InterruptedException { - throw new UnsupportedOperationException(); - } - - @Override - public - List> - invokeAll(Collection> arg0, long arg1, TimeUnit arg2) throws InterruptedException { - throw new UnsupportedOperationException(); - } - - @Override - public T invokeAny(Collection> arg0) throws InterruptedException, ExecutionException { - throw new UnsupportedOperationException(); - } - - @Override - public - T - invokeAny(Collection> arg0, long arg1, TimeUnit arg2) throws InterruptedException, - ExecutionException, - TimeoutException { - throw new UnsupportedOperationException(); - } - - @Override - public boolean isShutdown() { - throw new UnsupportedOperationException(); - } - - @Override - public boolean isTerminated() { - throw new UnsupportedOperationException(); - } - - @Override - public void shutdown() { - throw new UnsupportedOperationException(); - } - - @Override - public List shutdownNow() { - throw new UnsupportedOperationException(); - } - - @Override - public Future submit(Callable arg0) { - throw new UnsupportedOperationException(); - } - - @Override - public Future submit(Runnable arg0) { - throw new UnsupportedOperationException(); - } - - @Override - public Future submit(Runnable arg0, T arg1) { - throw new UnsupportedOperationException(); - } - - @Override - public ScheduledFuture scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) { - // The scheduler already makes sure that there are no parallel executions of the same runnable, so for - // simplicity we chose to give both methods the same implementation - return scheduleAtFixedRate(command, initialDelay, delay, unit); - } -} diff --git a/flexiblepower.runtime/test/org/flexiblepower/simulation/test/SchedulerTest.java b/flexiblepower.runtime/test/org/flexiblepower/simulation/test/SchedulerTest.java index 76d5e3e..06f0510 100644 --- a/flexiblepower.runtime/test/org/flexiblepower/simulation/test/SchedulerTest.java +++ b/flexiblepower.runtime/test/org/flexiblepower/simulation/test/SchedulerTest.java @@ -1,17 +1,19 @@ package org.flexiblepower.simulation.test; import java.util.Date; -import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import javax.measure.Measure; +import javax.measure.unit.SI; + import junit.framework.TestCase; -import org.flexiblepower.simulation.Simulation; -import org.flexiblepower.simulation.scheduling.SimulatedScheduleService; +import org.flexiblepower.context.Simulation; +import org.flexiblepower.simulation.context.SimulationContext; public class SchedulerTest extends TestCase { public void testRecurringTask() throws InterruptedException { - SimulatedScheduleService scheduler = new SimulatedScheduleService(); + SimulationContext scheduler = new SimulationContext(); scheduler.activate(); final AtomicInteger runCounter = new AtomicInteger(); @@ -20,7 +22,7 @@ public void testRecurringTask() throws InterruptedException { public void run() { runCounter.incrementAndGet(); } - }, 0, 1, TimeUnit.SECONDS); + }, Measure.valueOf(0, SI.SECOND), Measure.valueOf(1, SI.SECOND)); Date startDate = new Date(1325376000000L); // 01-01-2012 00:00:00.000 Date endDate = new Date(1325376059999L); // 01-01-2012 00:00:59.999 diff --git a/flexiblepower.ui/bnd.bnd b/flexiblepower.ui/bnd.bnd index 7e803e0..7fa6efc 100644 --- a/flexiblepower.ui/bnd.bnd +++ b/flexiblepower.ui/bnd.bnd @@ -2,7 +2,7 @@ com.google.gson,\ org.apache.felix.http.servlet-api -Bundle-Version: 1.0.2.${qualifier} +Bundle-Version: 1.1.0.${qualifier} Private-Package: org.flexiblepower.runtime.ui.server,\ org.flexiblepower.runtime.ui.server.pages,\ org.flexiblepower.runtime.ui.server.widgets,\ From c83d28f4da88636f9eda67e8616cccc802c33424 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Wed, 18 Feb 2015 23:13:10 +0100 Subject: [PATCH 044/105] Small fixes to the build, versioning and stuff --- .../src/org/flexiblepower/time/package-info.java | 2 +- flexiblepower.ral.ext/bnd.bnd | 6 ++---- .../src/org/flexiblepower/scheduling/AbstractScheduler.java | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/flexiblepower.api/src/org/flexiblepower/time/package-info.java b/flexiblepower.api/src/org/flexiblepower/time/package-info.java index 1de6731..ac4fe90 100755 --- a/flexiblepower.api/src/org/flexiblepower/time/package-info.java +++ b/flexiblepower.api/src/org/flexiblepower/time/package-info.java @@ -2,7 +2,7 @@ * The time package provides the {@link org.flexiblepower.time.TimeService} interface and a useful * {@link org.flexiblepower.time.TimeUtil} utility class for time calculations. */ -@Version("1.0.0.${qualifier}") +@Version("2.0.0.${qualifier}") package org.flexiblepower.time; import aQute.bnd.annotation.Version; diff --git a/flexiblepower.ral.ext/bnd.bnd b/flexiblepower.ral.ext/bnd.bnd index c6dac1d..e6fd301 100644 --- a/flexiblepower.ral.ext/bnd.bnd +++ b/flexiblepower.ral.ext/bnd.bnd @@ -3,13 +3,11 @@ junit.osgi;version='[3.8,4)',\ biz.aQute.bnd.annotation,\ slf4j.api;version='[1.7,2)',\ + flexiblepower.api;version=latest,\ flexiblepower.ral;version=latest,\ org.mockito.mockito-all;verion='[1.9,2)' Bundle-Version: 1.0.0.${qualifier} Export-Package: \ - org.flexiblepower.observation.ext,\ org.flexiblepower.ral.ext,\ - org.flexiblepower.ral.drivers.*,\ - org.flexiblepower.ral.wiring,\ - org.flexiblepower.simulation + org.flexiblepower.ral.drivers.* diff --git a/flexiblepower.runtime/src/org/flexiblepower/scheduling/AbstractScheduler.java b/flexiblepower.runtime/src/org/flexiblepower/scheduling/AbstractScheduler.java index ea66741..285a058 100755 --- a/flexiblepower.runtime/src/org/flexiblepower/scheduling/AbstractScheduler.java +++ b/flexiblepower.runtime/src/org/flexiblepower/scheduling/AbstractScheduler.java @@ -147,7 +147,7 @@ public void run() { jobs.add(job); } } else { - logger.debug("Sleeping {}ms until next job", waitTime); + logger.trace("Sleeping {}ms until next job", waitTime); try { jobs.wait(waitTime); } catch (final InterruptedException ex) { From 2219d34b0a8a0d403da8ed6aa79d6c760c2f4d6a Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Fri, 20 Feb 2015 17:53:09 +0100 Subject: [PATCH 045/105] Moved the flexiblepower.ui package --- .gitmodules | 2 +- cnf/ext/repositories.bnd | 4 ++++ cnf/gradle | 2 +- flexiblepower.api/bnd.bnd | 3 +-- flexiblepower.ui.connectionspage/bnd.bnd | 5 +++-- flexiblepower.ui/bnd.bnd | 10 ++++------ .../src/org/flexiblepower/ui/User.java | 0 .../src/org/flexiblepower/ui/Widget.java | 0 .../src/org/flexiblepower/ui/package-info.java | 0 9 files changed, 14 insertions(+), 12 deletions(-) rename {flexiblepower.api => flexiblepower.ui}/src/org/flexiblepower/ui/User.java (100%) rename {flexiblepower.api => flexiblepower.ui}/src/org/flexiblepower/ui/Widget.java (100%) rename {flexiblepower.api => flexiblepower.ui}/src/org/flexiblepower/ui/package-info.java (100%) diff --git a/.gitmodules b/.gitmodules index de94837..52c9686 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "cnf/gradle"] path = cnf/gradle - url = https://github.com/flexiblepower/fpai-shared-config.git + url = git://github.com/flexiblepower/flexiblepower-build-tools.git diff --git a/cnf/ext/repositories.bnd b/cnf/ext/repositories.bnd index 35bb11f..adbd063 100755 --- a/cnf/ext/repositories.bnd +++ b/cnf/ext/repositories.bnd @@ -17,6 +17,10 @@ name=FPAI Bundle Hub - Test;\ locations=https://raw.githubusercontent.com/flexiblepower/bundle-hub/split-repos/test/index.xml;\ cache=${workspace}/cnf/cache,\ + aQute.bnd.deployer.repository.FixedIndexedRepo;\ + name=FlexiblePower Base (snapshot);\ + locations=http://fpai-ci.sensorlab.tno.nl/builds/flexiblepower-base/development/LATEST/repo/index.xml;\ + cache=${workspace}/cnf/cache,\ aQute.bnd.deployer.repository.FixedIndexedRepo;\ name=FPAI Core Current Release;\ locations=https://github.com/flexiblepower/fpai-core/releases/download/v14.10/index.xml;\ diff --git a/cnf/gradle b/cnf/gradle index d3d44b2..8c738e8 160000 --- a/cnf/gradle +++ b/cnf/gradle @@ -1 +1 @@ -Subproject commit d3d44b2047087eb78ab5888e1b0a0bfe86e95931 +Subproject commit 8c738e8e380ff10405bb3bb5549c92b01f4fee64 diff --git a/flexiblepower.api/bnd.bnd b/flexiblepower.api/bnd.bnd index c3d3e0a..01a2e02 100755 --- a/flexiblepower.api/bnd.bnd +++ b/flexiblepower.api/bnd.bnd @@ -14,5 +14,4 @@ Export-Package: \ org.flexiblepower.messaging,\ org.flexiblepower.observation,\ org.flexiblepower.observation.ext,\ - org.flexiblepower.time,\ - org.flexiblepower.ui + org.flexiblepower.time diff --git a/flexiblepower.ui.connectionspage/bnd.bnd b/flexiblepower.ui.connectionspage/bnd.bnd index a7c4350..78ad6c4 100644 --- a/flexiblepower.ui.connectionspage/bnd.bnd +++ b/flexiblepower.ui.connectionspage/bnd.bnd @@ -1,7 +1,8 @@ -buildpath: ${default-buildpath},\ org.apache.felix.http.servlet-api,\ - flexiblepower.ral;version=latest - flexiblepower.runtime;version=latest + flexiblepower.ral;version=latest,\ + flexiblepower.runtime;version=latest,\ + flexiblepower.ui;version=latest Bundle-Version: 1.0.0.${qualifier} Private-Package: org.flexiblepower.runtime.ui.connectionspage diff --git a/flexiblepower.ui/bnd.bnd b/flexiblepower.ui/bnd.bnd index 7fa6efc..f672ca3 100644 --- a/flexiblepower.ui/bnd.bnd +++ b/flexiblepower.ui/bnd.bnd @@ -2,12 +2,10 @@ com.google.gson,\ org.apache.felix.http.servlet-api -Bundle-Version: 1.1.0.${qualifier} -Private-Package: org.flexiblepower.runtime.ui.server,\ - org.flexiblepower.runtime.ui.server.pages,\ - org.flexiblepower.runtime.ui.server.widgets,\ - org.flexiblepower.runtime.ui.user - +Bundle-Version: 1.2.0.${qualifier} +Private-Package: org.flexiblepower.runtime.ui.* +Export-Package: org.flexiblepower.ui + Service-Component: * Import-Package: \ org.osgi.service.useradmin;resolution:=optional,\ diff --git a/flexiblepower.api/src/org/flexiblepower/ui/User.java b/flexiblepower.ui/src/org/flexiblepower/ui/User.java similarity index 100% rename from flexiblepower.api/src/org/flexiblepower/ui/User.java rename to flexiblepower.ui/src/org/flexiblepower/ui/User.java diff --git a/flexiblepower.api/src/org/flexiblepower/ui/Widget.java b/flexiblepower.ui/src/org/flexiblepower/ui/Widget.java similarity index 100% rename from flexiblepower.api/src/org/flexiblepower/ui/Widget.java rename to flexiblepower.ui/src/org/flexiblepower/ui/Widget.java diff --git a/flexiblepower.api/src/org/flexiblepower/ui/package-info.java b/flexiblepower.ui/src/org/flexiblepower/ui/package-info.java similarity index 100% rename from flexiblepower.api/src/org/flexiblepower/ui/package-info.java rename to flexiblepower.ui/src/org/flexiblepower/ui/package-info.java From dea1f401a3405c5dbde006bbf6ae1ca7f935e926 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Fri, 20 Feb 2015 17:57:55 +0100 Subject: [PATCH 046/105] Made sure the new FlexiblePowerContext from the base is implemented --- .../test/FlexiblePowerContextTester.java | 8 ++--- .../flexiblepower.runtime.simulation.bnd | 1 + .../runtime/context/RuntimeContext.java | 32 ++----------------- .../scheduling/AbstractScheduler.java | 13 +++----- .../simulation/api}/Simulation.java | 2 +- .../simulation/api/package-info.java | 3 ++ .../simulation/context/SimulationClock.java | 4 +-- .../simulation/context/SimulationContext.java | 31 +++--------------- .../simulation/test/SchedulerTest.java | 2 +- 9 files changed, 22 insertions(+), 74 deletions(-) rename {flexiblepower.api/src/org/flexiblepower/context => flexiblepower.runtime/src/org/flexiblepower/simulation/api}/Simulation.java (98%) create mode 100755 flexiblepower.runtime/src/org/flexiblepower/simulation/api/package-info.java diff --git a/flexiblepower.runtime.test/src/org/flexiblepower/runtime/context/test/FlexiblePowerContextTester.java b/flexiblepower.runtime.test/src/org/flexiblepower/runtime/context/test/FlexiblePowerContextTester.java index c39a6b8..716bd29 100755 --- a/flexiblepower.runtime.test/src/org/flexiblepower/runtime/context/test/FlexiblePowerContextTester.java +++ b/flexiblepower.runtime.test/src/org/flexiblepower/runtime/context/test/FlexiblePowerContextTester.java @@ -13,7 +13,6 @@ import junit.framework.TestCase; import org.flexiblepower.context.FlexiblePowerContext; -import org.flexiblepower.context.Scheduler; import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; import org.osgi.util.tracker.ServiceTracker; @@ -45,19 +44,16 @@ public void testContext() throws InterruptedException { Math.abs(System.currentTimeMillis() - ctx.currentTimeMillis()) < 20); assertTrue("Date should be system time (approximately)", Math.abs(System.currentTimeMillis() - ctx.currentTime().getTime()) < 20); - assertFalse("The runtime should not be a simulation", ctx.isSimulation()); - assertNull("The runtime should not be a simulation", ctx.getSimulation()); } public void testSchedulerThread() throws Exception { FlexiblePowerContext ctx = getContext(); - Scheduler scheduler = ctx.getScheduler(); logger.info("Adding 100 runnables"); Queue> futures = new LinkedList>(); for (int ix = 0; ix < 100; ix++) { final boolean firstThread = ix == 0; - futures.add(scheduler.submit(new Runnable() { + futures.add(ctx.submit(new Runnable() { @Override public void run() { String threadName = Thread.currentThread().getName(); @@ -76,7 +72,7 @@ public void run() { final AtomicInteger counter = new AtomicInteger(); - ScheduledFuture future = scheduler.scheduleAtFixedRate(new Runnable() { + ScheduledFuture future = ctx.scheduleAtFixedRate(new Runnable() { @Override public void run() { counter.incrementAndGet(); diff --git a/flexiblepower.runtime/flexiblepower.runtime.simulation.bnd b/flexiblepower.runtime/flexiblepower.runtime.simulation.bnd index 479ea73..3066477 100644 --- a/flexiblepower.runtime/flexiblepower.runtime.simulation.bnd +++ b/flexiblepower.runtime/flexiblepower.runtime.simulation.bnd @@ -4,4 +4,5 @@ Private-Package: \ org.flexiblepower.simulation.context,\ org.flexiblepower.runtime.messaging,\ org.flexiblepower.scheduling +Export-Package: org.flexiblepower.simulation.api Service-Component: * diff --git a/flexiblepower.runtime/src/org/flexiblepower/runtime/context/RuntimeContext.java b/flexiblepower.runtime/src/org/flexiblepower/runtime/context/RuntimeContext.java index 523c16b..d84f0d4 100644 --- a/flexiblepower.runtime/src/org/flexiblepower/runtime/context/RuntimeContext.java +++ b/flexiblepower.runtime/src/org/flexiblepower/runtime/context/RuntimeContext.java @@ -3,8 +3,6 @@ import java.util.Date; import org.flexiblepower.context.FlexiblePowerContext; -import org.flexiblepower.context.Scheduler; -import org.flexiblepower.context.Simulation; import org.flexiblepower.scheduling.AbstractScheduler; import org.osgi.framework.Bundle; import org.osgi.service.component.ComponentContext; @@ -16,28 +14,19 @@ import aQute.bnd.annotation.component.Deactivate; @Component(servicefactory = true, provide = FlexiblePowerContext.class) -public class RuntimeContext implements FlexiblePowerContext { +public class RuntimeContext extends AbstractScheduler { private static final Logger logger = LoggerFactory.getLogger(RuntimeContext.class); - private AbstractScheduler scheduler; - @Activate public void activate(ComponentContext context) { Bundle bundle = context.getUsingBundle(); + start(bundle.getSymbolicName()); logger.info("Created RuntimeContext for bundle: {}", bundle.getSymbolicName()); - - scheduler = new AbstractScheduler(bundle.getBundleId() + "-" + bundle.getSymbolicName()) { - @Override - public long currentTimeMillis() { - return RuntimeContext.this.currentTimeMillis(); - } - }; - scheduler.start(); } @Deactivate public void deactivate() { - scheduler.stop(); + stop(); } @Override @@ -49,19 +38,4 @@ public long currentTimeMillis() { public Date currentTime() { return new Date(currentTimeMillis()); } - - @Override - public Scheduler getScheduler() { - return scheduler; - } - - @Override - public boolean isSimulation() { - return false; - } - - @Override - public Simulation getSimulation() { - return null; - } } diff --git a/flexiblepower.runtime/src/org/flexiblepower/scheduling/AbstractScheduler.java b/flexiblepower.runtime/src/org/flexiblepower/scheduling/AbstractScheduler.java index 285a058..1138112 100755 --- a/flexiblepower.runtime/src/org/flexiblepower/scheduling/AbstractScheduler.java +++ b/flexiblepower.runtime/src/org/flexiblepower/scheduling/AbstractScheduler.java @@ -11,32 +11,28 @@ import javax.measure.unit.SI; import javax.measure.unit.Unit; -import org.flexiblepower.context.Scheduler; +import org.flexiblepower.context.FlexiblePowerContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class AbstractScheduler implements Scheduler, Runnable { +public abstract class AbstractScheduler implements FlexiblePowerContext, Runnable { public static final Unit MS = SI.MILLI(SI.SECOND); public static final ThreadGroup schedulerGroup = new ThreadGroup("FlexiblePower Scheduling"); protected final Logger logger = LoggerFactory.getLogger(getClass()); - private final String name; - protected final AtomicBoolean running; protected final PriorityQueue> jobs; private volatile Thread thread; - public AbstractScheduler(String name) { - this.name = name; - + public AbstractScheduler() { running = new AtomicBoolean(false); jobs = new PriorityQueue>(); } - public void start() { + public void start(String name) { if (running.compareAndSet(false, true)) { thread = new Thread(schedulerGroup, this, "Scheduler thread for " + name); thread.setDaemon(true); @@ -58,6 +54,7 @@ public void stop() { } } + @Override public abstract long currentTimeMillis(); private Job addJob(Job job) { diff --git a/flexiblepower.api/src/org/flexiblepower/context/Simulation.java b/flexiblepower.runtime/src/org/flexiblepower/simulation/api/Simulation.java similarity index 98% rename from flexiblepower.api/src/org/flexiblepower/context/Simulation.java rename to flexiblepower.runtime/src/org/flexiblepower/simulation/api/Simulation.java index 5529dd2..30408fe 100755 --- a/flexiblepower.api/src/org/flexiblepower/context/Simulation.java +++ b/flexiblepower.runtime/src/org/flexiblepower/simulation/api/Simulation.java @@ -1,4 +1,4 @@ -package org.flexiblepower.context; +package org.flexiblepower.simulation.api; import java.util.Date; diff --git a/flexiblepower.runtime/src/org/flexiblepower/simulation/api/package-info.java b/flexiblepower.runtime/src/org/flexiblepower/simulation/api/package-info.java new file mode 100755 index 0000000..c6172df --- /dev/null +++ b/flexiblepower.runtime/src/org/flexiblepower/simulation/api/package-info.java @@ -0,0 +1,3 @@ +@Version("1.0.0.${qualifier}") +package org.flexiblepower.simulation.api; +import aQute.bnd.annotation.Version; diff --git a/flexiblepower.runtime/src/org/flexiblepower/simulation/context/SimulationClock.java b/flexiblepower.runtime/src/org/flexiblepower/simulation/context/SimulationClock.java index 8a1bd84..ce0a169 100644 --- a/flexiblepower.runtime/src/org/flexiblepower/simulation/context/SimulationClock.java +++ b/flexiblepower.runtime/src/org/flexiblepower/simulation/context/SimulationClock.java @@ -2,8 +2,8 @@ import java.util.Date; -import org.flexiblepower.context.Simulation; -import org.flexiblepower.context.Simulation.State; +import org.flexiblepower.simulation.api.Simulation; +import org.flexiblepower.simulation.api.Simulation.State; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/flexiblepower.runtime/src/org/flexiblepower/simulation/context/SimulationContext.java b/flexiblepower.runtime/src/org/flexiblepower/simulation/context/SimulationContext.java index 5d73eb1..ab71c34 100644 --- a/flexiblepower.runtime/src/org/flexiblepower/simulation/context/SimulationContext.java +++ b/flexiblepower.runtime/src/org/flexiblepower/simulation/context/SimulationContext.java @@ -3,30 +3,22 @@ import java.util.Date; import org.flexiblepower.context.FlexiblePowerContext; -import org.flexiblepower.context.Scheduler; -import org.flexiblepower.context.Simulation; import org.flexiblepower.scheduling.AbstractScheduler; import org.flexiblepower.scheduling.Job; +import org.flexiblepower.simulation.api.Simulation; import aQute.bnd.annotation.component.Activate; import aQute.bnd.annotation.component.Component; import aQute.bnd.annotation.component.Deactivate; -@Component(provide = { FlexiblePowerContext.class }) -public class SimulationContext extends AbstractScheduler - implements - FlexiblePowerContext, - Simulation { +@Component(provide = { FlexiblePowerContext.class, Simulation.class }) +public class SimulationContext extends AbstractScheduler implements Simulation { private final SimulationClock simulationClock = new SimulationClock(); - public SimulationContext() { - super("Simulation"); - } - @Activate public void activate() { - start(); + start("simulator"); } @Deactivate @@ -57,21 +49,6 @@ public Date currentTime() { return new Date(currentTimeMillis()); } - @Override - public Scheduler getScheduler() { - return this; - } - - @Override - public Simulation getSimulation() { - return this; - } - - @Override - public boolean isSimulation() { - return true; - } - // The main run method @Override public void run() { diff --git a/flexiblepower.runtime/test/org/flexiblepower/simulation/test/SchedulerTest.java b/flexiblepower.runtime/test/org/flexiblepower/simulation/test/SchedulerTest.java index 06f0510..e3c7cf9 100644 --- a/flexiblepower.runtime/test/org/flexiblepower/simulation/test/SchedulerTest.java +++ b/flexiblepower.runtime/test/org/flexiblepower/simulation/test/SchedulerTest.java @@ -8,7 +8,7 @@ import junit.framework.TestCase; -import org.flexiblepower.context.Simulation; +import org.flexiblepower.simulation.api.Simulation; import org.flexiblepower.simulation.context.SimulationContext; public class SchedulerTest extends TestCase { From dd0d700cf09e0324240b493d7b1e80fd106efe02 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Fri, 20 Feb 2015 17:59:03 +0100 Subject: [PATCH 047/105] Removed flexiblepower.api from this repo (now from the base) --- flexiblepower.api/.checkstyle | 13 - flexiblepower.api/.classpath | 8 - flexiblepower.api/.project | 29 - .../.settings/bndtools.core.prefs | 3 - .../org.eclipse.core.resources.prefs | 2 - .../.settings/org.eclipse.jdt.core.prefs | 292 ----- .../.settings/org.eclipse.jdt.ui.prefs | 62 - flexiblepower.api/bnd.bnd | 17 - flexiblepower.api/build.gradle | 2 - .../res/OSGI-INF/permissions.perm | 2 - .../src/javax/measure/DecimalMeasure.java | 201 ---- .../src/javax/measure/Measurable.java | 91 -- .../src/javax/measure/Measure.java | 461 -------- .../src/javax/measure/MeasureFormat.java | 170 --- .../src/javax/measure/VectorMeasure.java | 315 ----- .../javax/measure/converter/AddConverter.java | 85 -- .../converter/ConversionException.java | 38 - .../javax/measure/converter/LogConverter.java | 105 -- .../measure/converter/MultiplyConverter.java | 90 -- .../measure/converter/RationalConverter.java | 134 --- .../measure/converter/UnitConverter.java | 193 --- .../measure/converter/doc-files/converter.png | Bin 110953 -> 0 bytes .../src/javax/measure/converter/package.html | 5 - .../src/javax/measure/converter/packageinfo | 1 - .../src/javax/measure/package.html | 77 -- .../src/javax/measure/packageinfo | 1 - .../javax/measure/quantity/Acceleration.java | 28 - .../measure/quantity/AmountOfSubstance.java | 28 - .../src/javax/measure/quantity/Angle.java | 28 - .../measure/quantity/AngularAcceleration.java | 29 - .../measure/quantity/AngularVelocity.java | 29 - .../src/javax/measure/quantity/Area.java | 28 - .../measure/quantity/CatalyticActivity.java | 27 - .../javax/measure/quantity/DataAmount.java | 28 - .../src/javax/measure/quantity/DataRate.java | 29 - .../javax/measure/quantity/Dimensionless.java | 26 - .../src/javax/measure/quantity/Duration.java | 27 - .../measure/quantity/DynamicViscosity.java | 29 - .../measure/quantity/ElectricCapacitance.java | 27 - .../measure/quantity/ElectricCharge.java | 27 - .../measure/quantity/ElectricConductance.java | 27 - .../measure/quantity/ElectricCurrent.java | 28 - .../measure/quantity/ElectricInductance.java | 27 - .../measure/quantity/ElectricPotential.java | 28 - .../measure/quantity/ElectricResistance.java | 27 - .../src/javax/measure/quantity/Energy.java | 28 - .../src/javax/measure/quantity/Force.java | 28 - .../src/javax/measure/quantity/Frequency.java | 28 - .../javax/measure/quantity/Illuminance.java | 27 - .../measure/quantity/KinematicViscosity.java | 29 - .../src/javax/measure/quantity/Length.java | 28 - .../javax/measure/quantity/LuminousFlux.java | 27 - .../measure/quantity/LuminousIntensity.java | 28 - .../javax/measure/quantity/MagneticFlux.java | 27 - .../measure/quantity/MagneticFluxDensity.java | 27 - .../src/javax/measure/quantity/Mass.java | 29 - .../javax/measure/quantity/MassFlowRate.java | 29 - .../src/javax/measure/quantity/Money.java | 25 - .../src/javax/measure/quantity/MoneyFlow.java | 25 - .../src/javax/measure/quantity/Power.java | 27 - .../src/javax/measure/quantity/Pressure.java | 28 - .../src/javax/measure/quantity/Quantity.java | 32 - .../quantity/RadiationDoseAbsorbed.java | 28 - .../quantity/RadiationDoseEffective.java | 28 - .../measure/quantity/RadioactiveActivity.java | 27 - .../javax/measure/quantity/SolidAngle.java | 28 - .../javax/measure/quantity/Temperature.java | 28 - .../src/javax/measure/quantity/Torque.java | 34 - .../src/javax/measure/quantity/Velocity.java | 28 - .../src/javax/measure/quantity/Volume.java | 28 - .../measure/quantity/VolumetricDensity.java | 28 - .../measure/quantity/VolumetricFlowRate.java | 29 - .../src/javax/measure/quantity/package.html | 6 - .../src/javax/measure/quantity/packageinfo | 1 - .../src/javax/measure/unit/AlternateUnit.java | 131 --- .../src/javax/measure/unit/BaseUnit.java | 117 -- .../src/javax/measure/unit/CompoundUnit.java | 114 -- .../src/javax/measure/unit/DerivedUnit.java | 29 - .../src/javax/measure/unit/Dimension.java | 286 ----- .../src/javax/measure/unit/NonSI.java | 754 ------------ .../src/javax/measure/unit/ProductUnit.java | 487 -------- .../src/javax/measure/unit/SI.java | 693 ----------- .../src/javax/measure/unit/SystemOfUnits.java | 32 - .../javax/measure/unit/TransformedUnit.java | 128 -- .../src/javax/measure/unit/Unit.java | 513 -------- .../src/javax/measure/unit/UnitFormat.java | 1035 ----------------- .../javax/measure/unit/doc-files/momey.png | Bin 151854 -> 0 bytes .../src/javax/measure/unit/doc-files/unit.png | Bin 215249 -> 0 bytes .../src/javax/measure/unit/package.html | 61 - .../src/javax/measure/unit/packageinfo | 1 - .../context/FlexiblePowerContext.java | 17 - .../org/flexiblepower/context/Scheduler.java | 158 --- .../flexiblepower/context/package-info.java | 3 - .../flexiblepower/messaging/Cardinality.java | 8 - .../flexiblepower/messaging/Connection.java | 28 - .../messaging/ConnectionManager.java | 146 --- .../org/flexiblepower/messaging/Endpoint.java | 12 - .../org/flexiblepower/messaging/Filter.java | 12 - .../messaging/MessageHandler.java | 26 - .../messaging/MessageListener.java | 7 - .../src/org/flexiblepower/messaging/Port.java | 56 - .../org/flexiblepower/messaging/Ports.java | 21 - .../flexiblepower/messaging/package-info.java | 8 - .../observation/Observation.java | 149 --- .../observation/ObservationConsumer.java | 24 - .../observation/ObservationProvider.java | 56 - .../ObservationTranslationHelper.java | 137 --- .../ext/AbstractObservationProvider.java | 52 - .../observation/ext/ObservationAttribute.java | 28 - ...ObservationProviderRegistrationHelper.java | 179 --- .../observation/ext/package-info.java | 9 - .../observation/package-info.java | 9 - .../src/org/flexiblepower/time/TimeUtil.java | 81 -- .../org/flexiblepower/time/package-info.java | 9 - .../observation/ObservationTest.java | 78 -- .../ObservationTranslationHelperTest.java | 45 - 116 files changed, 9428 deletions(-) delete mode 100755 flexiblepower.api/.checkstyle delete mode 100755 flexiblepower.api/.classpath delete mode 100755 flexiblepower.api/.project delete mode 100755 flexiblepower.api/.settings/bndtools.core.prefs delete mode 100755 flexiblepower.api/.settings/org.eclipse.core.resources.prefs delete mode 100755 flexiblepower.api/.settings/org.eclipse.jdt.core.prefs delete mode 100755 flexiblepower.api/.settings/org.eclipse.jdt.ui.prefs delete mode 100755 flexiblepower.api/bnd.bnd delete mode 100755 flexiblepower.api/build.gradle delete mode 100755 flexiblepower.api/res/OSGI-INF/permissions.perm delete mode 100755 flexiblepower.api/src/javax/measure/DecimalMeasure.java delete mode 100755 flexiblepower.api/src/javax/measure/Measurable.java delete mode 100755 flexiblepower.api/src/javax/measure/Measure.java delete mode 100755 flexiblepower.api/src/javax/measure/MeasureFormat.java delete mode 100755 flexiblepower.api/src/javax/measure/VectorMeasure.java delete mode 100755 flexiblepower.api/src/javax/measure/converter/AddConverter.java delete mode 100755 flexiblepower.api/src/javax/measure/converter/ConversionException.java delete mode 100755 flexiblepower.api/src/javax/measure/converter/LogConverter.java delete mode 100755 flexiblepower.api/src/javax/measure/converter/MultiplyConverter.java delete mode 100755 flexiblepower.api/src/javax/measure/converter/RationalConverter.java delete mode 100755 flexiblepower.api/src/javax/measure/converter/UnitConverter.java delete mode 100755 flexiblepower.api/src/javax/measure/converter/doc-files/converter.png delete mode 100755 flexiblepower.api/src/javax/measure/converter/package.html delete mode 100755 flexiblepower.api/src/javax/measure/converter/packageinfo delete mode 100755 flexiblepower.api/src/javax/measure/package.html delete mode 100755 flexiblepower.api/src/javax/measure/packageinfo delete mode 100755 flexiblepower.api/src/javax/measure/quantity/Acceleration.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/AmountOfSubstance.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/Angle.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/AngularAcceleration.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/AngularVelocity.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/Area.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/CatalyticActivity.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/DataAmount.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/DataRate.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/Dimensionless.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/Duration.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/DynamicViscosity.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/ElectricCapacitance.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/ElectricCharge.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/ElectricConductance.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/ElectricCurrent.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/ElectricInductance.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/ElectricPotential.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/ElectricResistance.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/Energy.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/Force.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/Frequency.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/Illuminance.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/KinematicViscosity.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/Length.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/LuminousFlux.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/LuminousIntensity.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/MagneticFlux.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/MagneticFluxDensity.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/Mass.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/MassFlowRate.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/Money.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/MoneyFlow.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/Power.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/Pressure.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/Quantity.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/RadiationDoseAbsorbed.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/RadiationDoseEffective.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/RadioactiveActivity.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/SolidAngle.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/Temperature.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/Torque.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/Velocity.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/Volume.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/VolumetricDensity.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/VolumetricFlowRate.java delete mode 100755 flexiblepower.api/src/javax/measure/quantity/package.html delete mode 100755 flexiblepower.api/src/javax/measure/quantity/packageinfo delete mode 100755 flexiblepower.api/src/javax/measure/unit/AlternateUnit.java delete mode 100755 flexiblepower.api/src/javax/measure/unit/BaseUnit.java delete mode 100755 flexiblepower.api/src/javax/measure/unit/CompoundUnit.java delete mode 100755 flexiblepower.api/src/javax/measure/unit/DerivedUnit.java delete mode 100755 flexiblepower.api/src/javax/measure/unit/Dimension.java delete mode 100755 flexiblepower.api/src/javax/measure/unit/NonSI.java delete mode 100755 flexiblepower.api/src/javax/measure/unit/ProductUnit.java delete mode 100755 flexiblepower.api/src/javax/measure/unit/SI.java delete mode 100755 flexiblepower.api/src/javax/measure/unit/SystemOfUnits.java delete mode 100755 flexiblepower.api/src/javax/measure/unit/TransformedUnit.java delete mode 100755 flexiblepower.api/src/javax/measure/unit/Unit.java delete mode 100755 flexiblepower.api/src/javax/measure/unit/UnitFormat.java delete mode 100755 flexiblepower.api/src/javax/measure/unit/doc-files/momey.png delete mode 100755 flexiblepower.api/src/javax/measure/unit/doc-files/unit.png delete mode 100755 flexiblepower.api/src/javax/measure/unit/package.html delete mode 100755 flexiblepower.api/src/javax/measure/unit/packageinfo delete mode 100755 flexiblepower.api/src/org/flexiblepower/context/FlexiblePowerContext.java delete mode 100755 flexiblepower.api/src/org/flexiblepower/context/Scheduler.java delete mode 100755 flexiblepower.api/src/org/flexiblepower/context/package-info.java delete mode 100755 flexiblepower.api/src/org/flexiblepower/messaging/Cardinality.java delete mode 100755 flexiblepower.api/src/org/flexiblepower/messaging/Connection.java delete mode 100755 flexiblepower.api/src/org/flexiblepower/messaging/ConnectionManager.java delete mode 100755 flexiblepower.api/src/org/flexiblepower/messaging/Endpoint.java delete mode 100755 flexiblepower.api/src/org/flexiblepower/messaging/Filter.java delete mode 100755 flexiblepower.api/src/org/flexiblepower/messaging/MessageHandler.java delete mode 100755 flexiblepower.api/src/org/flexiblepower/messaging/MessageListener.java delete mode 100755 flexiblepower.api/src/org/flexiblepower/messaging/Port.java delete mode 100755 flexiblepower.api/src/org/flexiblepower/messaging/Ports.java delete mode 100755 flexiblepower.api/src/org/flexiblepower/messaging/package-info.java delete mode 100755 flexiblepower.api/src/org/flexiblepower/observation/Observation.java delete mode 100755 flexiblepower.api/src/org/flexiblepower/observation/ObservationConsumer.java delete mode 100755 flexiblepower.api/src/org/flexiblepower/observation/ObservationProvider.java delete mode 100755 flexiblepower.api/src/org/flexiblepower/observation/ObservationTranslationHelper.java delete mode 100644 flexiblepower.api/src/org/flexiblepower/observation/ext/AbstractObservationProvider.java delete mode 100644 flexiblepower.api/src/org/flexiblepower/observation/ext/ObservationAttribute.java delete mode 100644 flexiblepower.api/src/org/flexiblepower/observation/ext/ObservationProviderRegistrationHelper.java delete mode 100644 flexiblepower.api/src/org/flexiblepower/observation/ext/package-info.java delete mode 100755 flexiblepower.api/src/org/flexiblepower/observation/package-info.java delete mode 100755 flexiblepower.api/src/org/flexiblepower/time/TimeUtil.java delete mode 100755 flexiblepower.api/src/org/flexiblepower/time/package-info.java delete mode 100755 flexiblepower.api/test/org/flexiblepower/observation/ObservationTest.java delete mode 100755 flexiblepower.api/test/org/flexiblepower/observation/ObservationTranslationHelperTest.java diff --git a/flexiblepower.api/.checkstyle b/flexiblepower.api/.checkstyle deleted file mode 100755 index 3c5c9a3..0000000 --- a/flexiblepower.api/.checkstyle +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/flexiblepower.api/.classpath b/flexiblepower.api/.classpath deleted file mode 100755 index 023968b..0000000 --- a/flexiblepower.api/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/flexiblepower.api/.project b/flexiblepower.api/.project deleted file mode 100755 index aaac879..0000000 --- a/flexiblepower.api/.project +++ /dev/null @@ -1,29 +0,0 @@ - - - flexiblepower.api - - - - - - org.eclipse.jdt.core.javabuilder - - - - - bndtools.core.bndbuilder - - - - - net.sf.eclipsecs.core.CheckstyleBuilder - - - - - - org.eclipse.jdt.core.javanature - bndtools.core.bndnature - net.sf.eclipsecs.core.CheckstyleNature - - diff --git a/flexiblepower.api/.settings/bndtools.core.prefs b/flexiblepower.api/.settings/bndtools.core.prefs deleted file mode 100755 index cfd70fe..0000000 --- a/flexiblepower.api/.settings/bndtools.core.prefs +++ /dev/null @@ -1,3 +0,0 @@ -compileErrorAction=skip -eclipse.preferences.version=1 -eclipseClasspath=expose diff --git a/flexiblepower.api/.settings/org.eclipse.core.resources.prefs b/flexiblepower.api/.settings/org.eclipse.core.resources.prefs deleted file mode 100755 index 99f26c0..0000000 --- a/flexiblepower.api/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/flexiblepower.api/.settings/org.eclipse.jdt.core.prefs b/flexiblepower.api/.settings/org.eclipse.jdt.core.prefs deleted file mode 100755 index 7a9b0a6..0000000 --- a/flexiblepower.api/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,292 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.6 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=82 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=82 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=82 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=82 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=82 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=82 -org.eclipse.jdt.core.formatter.alignment_for_assignment=82 -org.eclipse.jdt.core.formatter.alignment_for_binary_expression=82 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=82 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=82 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=82 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=82 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=82 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=82 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=82 -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=82 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=82 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=82 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=82 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=82 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=82 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=82 -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=82 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true -org.eclipse.jdt.core.formatter.comment.indent_root_tags=true -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert -org.eclipse.jdt.core.formatter.comment.line_length=120 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=2 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=false -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.lineSplit=120 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=space -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=true -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false -org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/flexiblepower.api/.settings/org.eclipse.jdt.ui.prefs b/flexiblepower.api/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100755 index fdf3387..0000000 --- a/flexiblepower.api/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,62 +0,0 @@ -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_FlexiblePowerSuite -formatter_settings_version=12 -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=true -sp_cleanup.always_use_parentheses_in_expressions=true -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_functional_interfaces=false -sp_cleanup.convert_to_enhanced_for_loop=true -sp_cleanup.correct_indentation=false -sp_cleanup.format_source_code=true -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.insert_inferred_type_arguments=false -sp_cleanup.make_local_variable_final=false -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=true -sp_cleanup.never_use_blocks=false -sp_cleanup.never_use_parentheses_in_expressions=false -sp_cleanup.on_save_use_additional_actions=true -sp_cleanup.organize_imports=true -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=true -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_redundant_type_arguments=false -sp_cleanup.remove_trailing_whitespaces=true -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true -sp_cleanup.remove_unnecessary_nls_tags=false -sp_cleanup.remove_unused_imports=true -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_anonymous_class_creation=false -sp_cleanup.use_blocks=true -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_lambda=false -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=true -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=true -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true -sp_cleanup.use_type_arguments=false diff --git a/flexiblepower.api/bnd.bnd b/flexiblepower.api/bnd.bnd deleted file mode 100755 index 01a2e02..0000000 --- a/flexiblepower.api/bnd.bnd +++ /dev/null @@ -1,17 +0,0 @@ --buildpath: \ - osgi.cmpn;version='[4.3,5)',\ - osgi.core;version='[4.3,5)',\ - biz.aQute.bnd.annotation --testpath: ${test} - -Bundle-Version: 3.0.0.${qualifier} -Export-Package: \ - javax.measure,\ - javax.measure.converter,\ - javax.measure.quantity,\ - javax.measure.unit,\ - org.flexiblepower.context,\ - org.flexiblepower.messaging,\ - org.flexiblepower.observation,\ - org.flexiblepower.observation.ext,\ - org.flexiblepower.time diff --git a/flexiblepower.api/build.gradle b/flexiblepower.api/build.gradle deleted file mode 100755 index 11f13b0..0000000 --- a/flexiblepower.api/build.gradle +++ /dev/null @@ -1,2 +0,0 @@ -checkstyleMain.exclude '**/javax/measure/**' - diff --git a/flexiblepower.api/res/OSGI-INF/permissions.perm b/flexiblepower.api/res/OSGI-INF/permissions.perm deleted file mode 100755 index 0302abd..0000000 --- a/flexiblepower.api/res/OSGI-INF/permissions.perm +++ /dev/null @@ -1,2 +0,0 @@ -(org.osgi.framework.ServicePermission "*" "get,register") -(org.osgi.framework.PackagePermission "*" "import,exportonly") diff --git a/flexiblepower.api/src/javax/measure/DecimalMeasure.java b/flexiblepower.api/src/javax/measure/DecimalMeasure.java deleted file mode 100755 index 2a92002..0000000 --- a/flexiblepower.api/src/javax/measure/DecimalMeasure.java +++ /dev/null @@ -1,201 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2007 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure; - -import java.math.BigDecimal; -import java.math.MathContext; - -import javax.measure.converter.AddConverter; -import javax.measure.converter.RationalConverter; -import javax.measure.converter.UnitConverter; -import javax.measure.quantity.Quantity; -import javax.measure.unit.Unit; - -/** - *

- * This class represents a measure whose value is an arbitrary-precision decimal number. - *

- * - *

- * When converting, applications may supply the java.math.Context: - * - *

- * DecimalMeasure<Velocity> c = DecimalMeasure.valueOf("299792458 m/s");
- * DecimalMeasure<Velocity> milesPerHour = c.to(MILES_PER_HOUR, MathContext.DECIMAL128);
- * System.out.println(milesPerHour);
- *
- * > 670616629.3843951324266284896206156 mph
- * 
- * - * @author Jean-Marie Dautelle - * @version 4.3, October 3, 2007 - * @param - * The quantity - */ -public class DecimalMeasure extends Measure { - - /** - * Holds the BigDecimal value. - */ - private final BigDecimal value; - - /** - * Holds the unit. - */ - private final Unit unit; - - /** - * Creates a decimal measure for the specified number stated in the specified unit. - * - * @param value - * The value - * @param unit - * The unit - */ - public DecimalMeasure(BigDecimal value, Unit unit) { - this.value = value; - this.unit = unit; - } - - /** - * Returns the decimal measure for the specified number stated in the specified unit. - * - * @param decimal - * the measurement value. - * @param unit - * the measurement unit. - * @param - * The quantity - */ - public static DecimalMeasure valueOf(BigDecimal decimal, Unit unit) { - return new DecimalMeasure(decimal, unit); - } - - /** - * @param csq - * the decimal measure representation (including unit if any). - * @param - * The quantity - * @return the decimal measure for the specified textual representation. This method first reads the - * BigDecimal value, then the unit if any (value and unit should be separated by white spaces). - * @throws NumberFormatException - * if the specified character sequence is not a valid representation of decimal measure. - */ - @SuppressWarnings("unchecked") - public static DecimalMeasure valueOf(CharSequence csq) { - String str = csq.toString(); - int numberLength = str.length(); - int unitStartIndex = -1; - for (int i = 0; i < str.length(); i++) { - if (Character.isWhitespace(str.charAt(i))) { - for (int j = i + 1; j < str.length(); j++) { - if (!Character.isWhitespace(str.charAt(j))) { - unitStartIndex = j; - break; - } - } - numberLength = i; - break; - } - } - BigDecimal decimal = new BigDecimal(str.substring(0, numberLength)); - Unit unit = Unit.ONE; - if (unitStartIndex > 0) { - unit = Unit.valueOf(str.substring(unitStartIndex)); - } - return new DecimalMeasure(decimal, (Unit) unit); - } - - @Override - public Unit getUnit() { - return this.unit; - } - - @Override - public BigDecimal getValue() { - return this.value; - } - - /** - * Returns the decimal measure equivalent to this measure but stated in the specified unit. This method will raise - * an ArithmeticException if the resulting measure does not have a terminating decimal expansion. - * - * @param unit - * the new measurement unit. - * @return the measure stated in the specified unit. - * @throws ArithmeticException - * if the converted measure value does not have a terminating decimal expansion - * @see #to(Unit, MathContext) - */ - @Override - public DecimalMeasure to(Unit unit) { - return to(unit, null); - } - - /** - * Returns the decimal measure equivalent to this measure but stated in the specified unit, the conversion is - * performed using the specified math context. - * - * @param unit - * the new measurement unit. - * @param mathContext - * the mathContext used to convert BigDecimal values or null if none. - * @return the measure stated in the specified unit. - * @throws ArithmeticException - * if the result is inexact but the rounding mode is MathContext.UNNECESSARY or - * mathContext.precision == 0 and the quotient has a non-terminating decimal expansion. - */ - public DecimalMeasure to(Unit unit, MathContext mathContext) { - if ((unit == this.unit) || (unit.equals(this.unit))) { - return this; - } - UnitConverter cvtr = this.unit.getConverterTo(unit); - if (cvtr instanceof RationalConverter) { - RationalConverter factor = (RationalConverter) cvtr; - BigDecimal dividend = BigDecimal.valueOf(factor.getDividend()); - BigDecimal divisor = BigDecimal.valueOf(factor.getDivisor()); - BigDecimal result = mathContext == null ? this.value.multiply(dividend).divide(divisor) - : this.value.multiply(dividend, mathContext).divide(divisor, - mathContext); - return new DecimalMeasure(result, unit); - } else if (cvtr.isLinear()) { - BigDecimal factor = BigDecimal.valueOf(cvtr.convert(1.0)); - BigDecimal result = mathContext == null ? this.value.multiply(factor) : this.value.multiply(factor, - mathContext); - return new DecimalMeasure(result, unit); - } else if (cvtr instanceof AddConverter) { - BigDecimal offset = BigDecimal.valueOf(((AddConverter) cvtr).getOffset()); - BigDecimal result = mathContext == null ? this.value.add(offset) : this.value.add(offset, mathContext); - return new DecimalMeasure(result, unit); - } else { // Non-linear and not an offset, convert the double value. - BigDecimal result = BigDecimal.valueOf(cvtr.convert(this.value.doubleValue())); - return new DecimalMeasure(result, unit); - } - } - - @Override - public double doubleValue(Unit unit) { - if ((unit == this.unit) || (unit.equals(this.unit))) { - return this.value.doubleValue(); - } - return this.unit.getConverterTo(unit).convert(this.value.doubleValue()); - } - - @Override - public Measurable add(Measurable other) { - if (other instanceof DecimalMeasure) { - DecimalMeasure otherDec = (DecimalMeasure) other; - return new DecimalMeasure(value.add(otherDec.to(unit).value), unit); - } else { - return new DecimalMeasure(value.add(BigDecimal.valueOf(other.doubleValue(unit))), unit); - } - } - - private static final long serialVersionUID = 1L; -} diff --git a/flexiblepower.api/src/javax/measure/Measurable.java b/flexiblepower.api/src/javax/measure/Measurable.java deleted file mode 100755 index c59945b..0000000 --- a/flexiblepower.api/src/javax/measure/Measurable.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2007 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure; - -import javax.measure.quantity.Quantity; -import javax.measure.unit.Unit; - -/** - * This interface represents the measurable, countable, or comparable property or aspect of a thing. - * - * Implementing instances are typically the result of a measurement: - * - *
- * Measurable<Mass> weight = Measure.valueOf(180.0, POUND);
- * 
- * - * They can also be created from custom classes: - * - *
- * class Delay implements Measurable<Duration> {
- *     private long nanoSeconds; // Implicit internal unit.
- *     public double doubleValue(Unit<Velocity> unit) { ... }
- *     public long longValue(Unit<Velocity> unit) { ... }
- * }
- * 
- * Thread.wait(new Delay(24, HOUR)); // Assuming Thread.wait(Measurable<Duration>) method.
- * 
- * - * Although measurable instances are for the most part scalar quantities; more complex implementations (e.g. vectors, - * data set) are allowed as long as an aggregate magnitude can be determined. For example: - * - *
- * class Velocity3D implements Measurable<Velocity> {
- *     private double x, y, z; // Meter per seconds.
- *     public double doubleValue(Unit<Velocity> unit) { ... } // Returns vector norm.
- *     ...
- * }
- * 
- * class Sensors<Q extends Quantity> extends Measure<double[], Q> {
- *     public doubleValue(Unit<Q> unit) { ... } // Returns median value.
- *     ...
- * }
- * 
- * - * @author Jean-Marie Dautelle - * @version 4.1, June 8, 2007 - */ -public interface Measurable extends Comparable> { - - /** - * Returns the value of this measurable stated in the specified unit as a double. If the measurable has - * too great a magnitude to be represented as a double, it will be converted to - * Double.NEGATIVE_INFINITY or Double.POSITIVE_INFINITY as appropriate. - * - * @param unit - * the unit in which this measurable value is stated. - * @return the numeric value after conversion to type double. - */ - double doubleValue(Unit unit); - - /** - * Returns the estimated integral value of this measurable stated in the specified unit as a long. - * - *

- * Note: This method differs from the Number.longValue() in the sense that the closest integer value is - * returned and an ArithmeticException is raised instead of a bit truncation in case of overflow (safety critical). - *

- * - * @param unit - * the unit in which the measurable value is stated. - * @return the numeric value after conversion to type long. - * @throws ArithmeticException - * if this quantity cannot be represented as a long number in the specified unit. - */ - long longValue(Unit unit) throws ArithmeticException; - - /** - * Adds the other Measurable to this one, returning a Measurable object of the same type as the original. - * - * @param other - * The measurable that should be added to this one. - * @return A new measurable that contains the summed up value of this and the other one. - */ - Measurable add(Measurable other); -} diff --git a/flexiblepower.api/src/javax/measure/Measure.java b/flexiblepower.api/src/javax/measure/Measure.java deleted file mode 100755 index 31e2249..0000000 --- a/flexiblepower.api/src/javax/measure/Measure.java +++ /dev/null @@ -1,461 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2007 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure; - -import java.io.Serializable; - -import javax.measure.quantity.Quantity; -import javax.measure.unit.CompoundUnit; -import javax.measure.unit.Unit; - -/** - *

- * This class represents the result of a measurement stated in a known unit. - *

- * - *

- * There is no constraint upon the measurement value itself: scalars, vectors, or even data sets are valid values as - * long as an aggregate magnitude can be determined (see {@link Measurable}). - *

- * - * @author Jean-Marie Dautelle - * @version 4.2, August 26, 2007 - */ -public abstract class Measure implements Measurable, Serializable { - private static final long serialVersionUID = -3953001540770358347L; - - /** - * Default constructor. - */ - protected Measure() { - } - - public static Measurable zero(Unit unit) { - return new Integer(0, unit); - } - - /** - * Returns the scalar measure for the specified double stated in the specified unit. - * - * @param doubleValue - * the measurement value. - * @param unit - * the measurement unit. - */ - public static Measure valueOf(double doubleValue, Unit unit) { - return new Double(doubleValue, unit); - } - - /** - * Returns the scalar measure for the specified double stated in the specified unit. - * - * @param longValue - * the measurement value. - * @param unit - * the measurement unit. - */ - public static Measure valueOf(long longValue, Unit unit) { - return new Long(longValue, unit); - } - - /** - * Returns the scalar measure for the specified float stated in the specified unit. - * - * @param floatValue - * the measurement value. - * @param unit - * the measurement unit. - */ - public static Measure valueOf(float floatValue, Unit unit) { - return new Float(floatValue, unit); - } - - /** - * Returns the scalar measure for the specified int stated in the specified unit. - * - * @param intValue - * the measurement value. - * @param unit - * the measurement unit. - */ - public static Measure valueOf(int intValue, Unit unit) { - return new Integer(intValue, unit); - } - - /** - * Returns the measurement value of this measure. - * - * @return the measurement value. - */ - public abstract V getValue(); - - /** - * Returns the measurement unit of this measure. - * - * @return the measurement unit. - */ - public abstract Unit getUnit(); - - /** - * Returns the measure equivalent to this measure but stated in the specified unit. This method may result in lost - * of precision (e.g. measure of integral value). - * - * @param unit - * the new measurement unit. - * @return the measure stated in the specified unit. - */ - public abstract Measure to(Unit unit); - - /** - * Returns the value of this measure stated in the specified unit as a double. If the measure has too - * great a magnitude to be represented as a double, it will be converted to - * Double.NEGATIVE_INFINITY or Double.POSITIVE_INFINITY as appropriate. - * - * @param unit - * the unit in which this measure is stated. - * @return the numeric value after conversion to type double. - */ - @Override - public abstract double doubleValue(Unit unit); - - /** - * Returns the estimated integral value of this measure stated in the specified unit as a long. - * - *

- * Note: This method differs from the Number.longValue() in the sense that the closest integer value is - * returned and an ArithmeticException is raised instead of a bit truncation in case of overflow (safety critical). - *

- * - * @param unit - * the unit in which the measurable value is stated. - * @return the numeric value after conversion to type long. - * @throws ArithmeticException - * if this quantity cannot be represented as a long number in the specified unit. - */ - @Override - public long longValue(Unit unit) throws ArithmeticException { - double doubleValue = doubleValue(unit); - if (java.lang.Double.isNaN(doubleValue) || (doubleValue < java.lang.Long.MIN_VALUE) - || (doubleValue > java.lang.Long.MAX_VALUE)) { - throw new ArithmeticException(doubleValue + " " + unit + " cannot be represented as long"); - } - return Math.round(doubleValue); - } - - /** - * Returns the value of this measure stated in the specified unit as a float. If the measure has too - * great a magnitude to be represented as a float, it will be converted to - * Float.NEGATIVE_INFINITY or Float.POSITIVE_INFINITY as appropriate. - * - * @param unit - * the unit in which the measure is stated. - * @return the numeric value after conversion to type float. - */ - public float floatValue(Unit unit) { - return (float) doubleValue(unit); - } - - /** - * Returns the estimated integral value of this measure stated in the specified unit as a int. - * - *

- * Note: This method differs from the Number.intValue() in the sense that the closest integer value is - * returned and an ArithmeticException is raised instead of a bit truncation in case of overflow (safety critical). - *

- * - * @param unit - * the unit in which the measurable value is stated. - * @return the numeric value after conversion to type int. - * @throws ArithmeticException - * if this quantity cannot be represented as a int number in the specified unit. - */ - public int intValue(Unit unit) { - long longValue = longValue(unit); - if ((longValue > java.lang.Integer.MAX_VALUE) || (longValue < java.lang.Integer.MIN_VALUE)) { - throw new ArithmeticException("Overflow"); - } - return (int) longValue; - } - - /** - * Compares this measure against the specified object for equality. If the units are compatible, the - * {@link #compareTo} is used to check for equality. Otherwise, false is returned. - * - * This is different from the standard implementation of JScience, which tests for strict equality. This is not - * according to the contract of the {@link #compareTo(Measurable)} method. - * - * @param obj - * the object to compare with. - * @return true if both objects are equal; false otherwise. - */ - @Override - @SuppressWarnings({ "unchecked", "rawtypes" }) - public boolean equals(Object obj) { - if (!(obj instanceof Measure)) { - return false; - } - Measure that = (Measure) obj; - if (that.getUnit().isCompatible(getUnit())) { - return compareTo(that) == 0; - } else { - return false; - } - } - - /** - * Returns the hash code for this scalar. - * - * @return the hash code value. - */ - @Override - public int hashCode() { - return getUnit().hashCode() + getValue().hashCode(); - } - - /** - * Returns the String representation of this measure The string produced for a given measure is always - * the same; it is not affected by locale. This means that it can be used as a canonical string representation for - * exchanging data, or as a key for a Hashtable, etc. Locale-sensitive measure formatting and parsing is handled by - * the {@link MeasureFormat} class and its subclasses. - * - * @return the string representation of this measure. - */ - @Override - public String toString() { - if (getUnit() instanceof CompoundUnit) { - return MeasureFormat.DEFAULT.formatCompound(doubleValue(getUnit()), getUnit(), new StringBuffer(), null) - .toString(); - } - return getValue() + " " + getUnit(); - } - - /** - * Compares this measure to the specified measurable quantity. This method compares the - * {@link Measurable#doubleValue(Unit)} of both this measure and the specified measurable stated in the same unit - * (this measure's {@link #getUnit() unit}). - * - * @return a negative integer, zero, or a positive integer as this measure is less than, equal to, or greater than - * the specified measurable quantity. - * @return Double.compare(this.doubleValue(getUnit()), - * that.doubleValue(getUnit())) - */ - @Override - public int compareTo(Measurable that) { - return java.lang.Double.compare(doubleValue(getUnit()), that.doubleValue(getUnit())); - } - - /** - * Holds scalar implementation for double values. - */ - private static final class Double extends Measure { - - private final double value; - - private final Unit unit; - - public Double(double value, Unit unit) { - this.value = value; - this.unit = unit; - } - - @Override - public Unit getUnit() { - return this.unit; - } - - @Override - public java.lang.Double getValue() { - return this.value; - } - - @Override - public Measurable add(Measurable other) { - return new Double(this.value + other.doubleValue(this.unit), this.unit); - } - - @Override - public Measure to(Unit unit) { - if ((unit == this.unit) || (unit.equals(this.unit))) { - return this; - } - return new Double(doubleValue(unit), unit); - } - - @Override - public double doubleValue(Unit unit) { - if ((unit == this.unit) || (unit.equals(this.unit))) { - return this.value; - } - return this.unit.getConverterTo(unit).convert(this.value); - } - - private static final long serialVersionUID = 1L; - } - - /** - * Holds scalar implementation for long values. - */ - private static final class Long extends Measure { - - private final long value; - - private final Unit unit; - - public Long(long value, Unit unit) { - this.value = value; - this.unit = unit; - } - - @Override - public Unit getUnit() { - return this.unit; - } - - @Override - public java.lang.Long getValue() { - return this.value; - } - - @Override - public Measurable add(Measurable other) { - return new Long(this.value + other.longValue(this.unit), this.unit); - } - - @Override - public Measure to(Unit unit) { - if ((unit == this.unit) || (unit.equals(this.unit))) { - return this; - } - return new Long(longValue(unit), unit); - } - - @Override - public double doubleValue(Unit unit) { - if ((unit == this.unit) || (unit.equals(this.unit))) { - return this.value; - } - return this.unit.getConverterTo(unit).convert(this.value); - } - - @Override - public long longValue(Unit unit) throws ArithmeticException { - if ((unit == this.unit) || (unit.equals(this.unit))) { - return this.value; // No conversion, returns value directly. - } - return super.longValue(unit); - } - - private static final long serialVersionUID = 1L; - - } - - /** - * Holds scalar implementation for float values. - */ - private static final class Float extends Measure { - - private final float value; - - private final Unit unit; - - public Float(float value, Unit unit) { - this.value = value; - this.unit = unit; - } - - @Override - public Unit getUnit() { - return this.unit; - } - - @Override - public java.lang.Float getValue() { - return this.value; - } - - @Override - public Measurable add(Measurable other) { - return new Double(this.value + other.doubleValue(this.unit), this.unit); - } - - @Override - public Measure to(Unit unit) { - if ((unit == this.unit) || (unit.equals(this.unit))) { - return this; - } - return new Float(floatValue(unit), unit); - } - - @Override - public double doubleValue(Unit unit) { - if ((unit == this.unit) || (unit.equals(this.unit))) { - return this.value; - } - return this.unit.getConverterTo(unit).convert(this.value); - } - - private static final long serialVersionUID = 1L; - } - - /** - * Holds scalar implementation for long values. - */ - private static final class Integer extends Measure { - - private final int value; - - private final Unit unit; - - public Integer(int value, Unit unit) { - this.value = value; - this.unit = unit; - } - - @Override - public Unit getUnit() { - return this.unit; - } - - @Override - public java.lang.Integer getValue() { - return this.value; - } - - @Override - public Measurable add(Measurable other) { - return new Long(this.value + other.longValue(this.unit), this.unit); - } - - @Override - public Measure to(Unit unit) { - if ((unit == this.unit) || (unit.equals(this.unit))) { - return this; - } - return new Integer(intValue(unit), unit); - } - - @Override - public double doubleValue(Unit unit) { - if ((unit == this.unit) || (unit.equals(this.unit))) { - return this.value; - } - return this.unit.getConverterTo(unit).convert(this.value); - } - - @Override - public long longValue(Unit unit) throws ArithmeticException { - if ((unit == this.unit) || (unit.equals(this.unit))) { - return this.value; // No conversion, returns value directly. - } - return super.longValue(unit); - } - - private static final long serialVersionUID = 1L; - } -} diff --git a/flexiblepower.api/src/javax/measure/MeasureFormat.java b/flexiblepower.api/src/javax/measure/MeasureFormat.java deleted file mode 100755 index 57a8d36..0000000 --- a/flexiblepower.api/src/javax/measure/MeasureFormat.java +++ /dev/null @@ -1,170 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2007 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure; - -import java.math.BigDecimal; -import java.text.FieldPosition; -import java.text.Format; -import java.text.NumberFormat; -import java.text.ParseException; -import java.text.ParsePosition; - -import javax.measure.unit.CompoundUnit; -import javax.measure.unit.Unit; -import javax.measure.unit.UnitFormat; - -/** - *

- * This class provides the interface for formatting and parsing {@link Measure measures}. - *

- * - *

- * As a minimum, instances of this class should be able to parse/format measure using {@link CompoundUnit}. - *

- * - * @author Jean-Marie Dautelle - * @version 4.2, August 26, 2007 - */ -public abstract class MeasureFormat extends Format { - private static final long serialVersionUID = 5216688014525404033L; - - /** - * Returns the measure format for the default locale. - * - * @return getInstance(Number.getInstance(), Unit.getInstance()) - */ - public static MeasureFormat getInstance() { - return DEFAULT; - } - - static final NumberUnit DEFAULT = new NumberUnit(NumberFormat.getInstance(), UnitFormat.getInstance()); - - /** - * Returns the measure format using the specified number format and unit format (the number and unit are separated - * by a space). - * - * @param numberFormat - * the number format. - * @param unitFormat - * the unit format. - * @return the corresponding format. - */ - public static MeasureFormat getInstance(NumberFormat numberFormat, UnitFormat unitFormat) { - return new NumberUnit(numberFormat, unitFormat); - } - - // Holds default implementation. - static final class NumberUnit extends MeasureFormat { - private final NumberFormat numberFormat; - - private final UnitFormat unitFormat; - - private NumberUnit(NumberFormat numberFormat, UnitFormat unitFormat) { - this.numberFormat = numberFormat; - this.unitFormat = unitFormat; - } - - @Override - public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) { - Measure measure = (Measure) obj; - Object value = measure.getValue(); - Unit unit = measure.getUnit(); - if (value instanceof Number) { - if (unit instanceof CompoundUnit) { - return formatCompound(((Number) value).doubleValue(), unit, toAppendTo, pos); - } - numberFormat.format(value, toAppendTo, pos); - } else { - toAppendTo.append(value); - } - if (!measure.getUnit().equals(Unit.ONE)) { - toAppendTo.append(' '); - unitFormat.format(unit, toAppendTo, pos); - } - return toAppendTo; - } - - // Measure using Compound unit have no separators in their representation. - StringBuffer formatCompound(double value, Unit unit, StringBuffer toAppendTo, FieldPosition pos) { - if (!(unit instanceof CompoundUnit)) { - toAppendTo.append((long) value); - return unitFormat.format(unit, toAppendTo, pos); - } - Unit high = ((CompoundUnit) unit).getHigher(); - Unit low = ((CompoundUnit) unit).getLower(); // The unit in which the value is stated. - long highValue = (long) low.getConverterTo(high).convert(value); - double lowValue = value - high.getConverterTo(low).convert(highValue); - formatCompound(highValue, high, toAppendTo, pos); - formatCompound(lowValue, low, toAppendTo, pos); - return toAppendTo; - } - - @Override - public Object parseObject(String source, ParsePosition pos) { - int start = pos.getIndex(); - try { - int i = start; - Number value = numberFormat.parse(source, pos); - if (i == pos.getIndex()) { - return null; // Cannot parse. - } - i = pos.getIndex(); - if (i >= source.length()) { - return measureOf(value, Unit.ONE); // No unit. - } - boolean isCompound = !Character.isWhitespace(source.charAt(i)); - if (isCompound) { - return parseCompound(value, source, pos); - } - if (++i >= source.length()) { - return measureOf(value, Unit.ONE); // No unit. - } - pos.setIndex(i); // Skips separator. - Unit unit = unitFormat.parseProductUnit(source, pos); - return measureOf(value, unit); - } catch (ParseException e) { - pos.setIndex(start); - pos.setErrorIndex(e.getErrorOffset()); - return null; - } - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - private Object parseCompound(Number highValue, String source, ParsePosition pos) throws ParseException { - Unit high = unitFormat.parseSingleUnit(source, pos); - int i = pos.getIndex(); - if (i >= source.length() || Character.isWhitespace(source.charAt(i))) { - return measureOf(highValue, high); - } - Measure lowMeasure = (Measure) parseObject(source, pos); - Unit unit = lowMeasure.getUnit(); - long l = lowMeasure.longValue(unit) + (long) high.getConverterTo(unit).convert(highValue.longValue()); - return Measure.valueOf(l, unit); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - private static Measure measureOf(Number value, Unit unit) { - if (value instanceof Double) { - return Measure.valueOf(value.doubleValue(), unit); - } else if (value instanceof Long) { - return Measure.valueOf(value.longValue(), unit); - } else if (value instanceof Float) { - return Measure.valueOf(value.floatValue(), unit); - } else if (value instanceof Integer) { - return Measure.valueOf(value.intValue(), unit); - } else if (value instanceof BigDecimal) { - return DecimalMeasure.valueOf((BigDecimal) value, unit); - } else { - return Measure.valueOf(value.doubleValue(), unit); - } - } - - private static final long serialVersionUID = 1L; - } -} diff --git a/flexiblepower.api/src/javax/measure/VectorMeasure.java b/flexiblepower.api/src/javax/measure/VectorMeasure.java deleted file mode 100755 index 3d76a9a..0000000 --- a/flexiblepower.api/src/javax/measure/VectorMeasure.java +++ /dev/null @@ -1,315 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2007 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure; - -import javax.measure.converter.UnitConverter; -import javax.measure.quantity.Quantity; -import javax.measure.unit.CompoundUnit; -import javax.measure.unit.Unit; - -/** - * This class represents a measurement vector of two or more dimensions. For example: - * - *
- * VectorMeasure<Length> dimension = VectorMeasure.valueOf(12.0, 30.0, 40.0, MILLIMETER);
- * VectorMeasure<Velocity> v2d = VectorMeasure.valueOf(-2.2, -3.0, KNOTS);
- * VectorMeasure<ElectricCurrent> c2d = VectorMeasure.valueOf(-7.3, 3.5, NANOAMPERE);
- * 
- * - * Subclasses may provide fixed dimensions specializations: - * - *
- * class Velocity2D extends VectorMeasure<Velocity> {
- *     public Velocity2D(double x, double y, Unit<Velocity> unit) { ... }
- * }
- * 
- * 
- * - * Measurement vectors may use {@link CompoundUnit compound units}: - * - *
- * VectorMeasure<Angle> latLong = VectorMeasure.valueOf(12.345, 22.23, DEGREE_ANGLE);
- * Unit<Angle> HOUR_MINUTE_SECOND_ANGLE = DEGREE_ANGLE.compound(MINUTE_ANGLE).compound(SECOND_ANGLE);
- * System.out.println(latLong.to(HOUR_MINUTE_SECOND_ANGLE));
- *
- * > [12°19'42", 22°12'48"]
- * 
- * - * Instances of this class (and sub-classes) are immutable. - * - * @param - * The quantity of the vector (e.g. Power) - * @author Jean-Marie Dautelle - * @version 4.3, October 3, 2007 - */ -public abstract class VectorMeasure extends Measure { - private static final long serialVersionUID = -6559201419685544465L; - - /** - * Default constructor (for sub-classes). - */ - protected VectorMeasure() { - } - - @Override - public Measurable add(Measurable other) { - if (other instanceof VectorMeasure) { - VectorMeasure otherVector = (VectorMeasure) other; - double[] left = getValue(); - double[] right = otherVector.to(getUnit()).getValue(); - if (left.length != right.length) { - throw new UnsupportedOperationException("The 2 vectors have different lengths"); - } - double[] result = new double[left.length]; - for (int ix = 0; ix < result.length; ix++) { - result[ix] = left[ix] + right[ix]; - } - return valueOf(result, getUnit()); - } else { - return Measure.valueOf(doubleValue(getUnit()) + other.doubleValue(getUnit()), getUnit()); - } - } - - /** - * Returns a 2-dimensional measurement vector. - * - * @param x - * the first vector component value. - * @param y - * the second vector component value. - * @param unit - * the measurement unit. - */ - public static VectorMeasure valueOf(double x, double y, Unit unit) { - return new TwoDimensional(x, y, unit); - } - - /** - * Returns a 3-dimensional measurement vector. - * - * @param x - * the first vector component value. - * @param y - * the second vector component value. - * @param z - * the third vector component value. - * @param unit - * the measurement unit. - */ - public static VectorMeasure valueOf(double x, double y, double z, Unit unit) { - return new ThreeDimensional(x, y, z, unit); - } - - /** - * Returns a multi-dimensional measurement vector. - * - * @param components - * the vector component values. - * @param unit - * the measurement unit. - */ - public static VectorMeasure valueOf(double[] components, Unit unit) { - return new MultiDimensional(components, unit); - } - - /** - * Returns the measurement vector equivalent to this one but stated in the specified unit. - * - * @param unit - * the new measurement unit. - * @return the vector measure stated in the specified unit. - */ - @Override - public abstract VectorMeasure to(Unit unit); - - /** - * Returns the norm of this measurement vector stated in the specified unit. - * - * @param unit - * the unit in which the norm is stated. - * @return |this| - */ - @Override - public abstract double doubleValue(Unit unit); - - /** - * Returns the String representation of this measurement vector (for example - * [2.3 m/s, 5.6 m/s]). - * - * @return the textual representation of the measurement vector. - */ - @Override - public String toString() { - double[] values = getValue(); - Unit unit = getUnit(); - StringBuffer tmp = new StringBuffer(); - tmp.append('['); - for (double v : values) { - if (tmp.length() > 1) { - tmp.append(", "); - } - if (unit instanceof CompoundUnit) { - MeasureFormat.DEFAULT.formatCompound(v, unit, tmp, null); - } else { - tmp.append(v).append(" ").append(unit); - } - } - tmp.append("] "); - return tmp.toString(); - } - - // Holds 2-dimensional implementation. - private static final class TwoDimensional extends VectorMeasure { - - private final double x; - - private final double y; - - private final Unit unit; - - private TwoDimensional(double x, double y, Unit unit) { - this.x = x; - this.y = y; - this.unit = unit; - } - - @Override - public double doubleValue(Unit unit) { - double norm = Math.sqrt(this.x * this.x + y * y); - if ((this.unit == unit) || (this.unit.equals(unit))) { - return norm; - } - return this.unit.getConverterTo(unit).convert(norm); - } - - @Override - public Unit getUnit() { - return unit; - } - - @Override - public double[] getValue() { - return new double[] { this.x, y }; - } - - @Override - public TwoDimensional to(Unit unit) { - if ((this.unit == unit) || (this.unit.equals(unit))) { - return this; - } - UnitConverter cvtr = this.unit.getConverterTo(unit); - return new TwoDimensional(cvtr.convert(this.x), cvtr.convert(y), unit); - } - - private static final long serialVersionUID = 1L; - - } - - // Holds 3-dimensional implementation. - private static final class ThreeDimensional extends VectorMeasure { - - private final double x; - - private final double y; - - private final double z; - - private final Unit unit; - - private ThreeDimensional(double x, double y, double z, Unit unit) { - this.x = x; - this.y = y; - this.z = z; - this.unit = unit; - } - - @Override - public double doubleValue(Unit unit) { - double norm = Math.sqrt(x * x + y * y + z * z); - if ((this.unit == unit) || (this.unit.equals(unit))) { - return norm; - } - return this.unit.getConverterTo(unit).convert(norm); - } - - @Override - public Unit getUnit() { - return unit; - } - - @Override - public double[] getValue() { - return new double[] { x, y, z }; - } - - @Override - public ThreeDimensional to(Unit unit) { - if ((this.unit == unit) || (this.unit.equals(unit))) { - return this; - } - UnitConverter cvtr = this.unit.getConverterTo(unit); - return new ThreeDimensional(cvtr.convert(x), cvtr.convert(y), cvtr.convert(z), unit); - } - - private static final long serialVersionUID = 1L; - - } - - // Holds multi-dimensional implementation. - private static final class MultiDimensional extends VectorMeasure { - - private final double[] components; - - private final Unit unit; - - private MultiDimensional(double[] components, Unit unit) { - this.components = components.clone(); - this.unit = unit; - } - - @Override - public double doubleValue(final Unit unit) { - double normSquare = this.components[0] * this.components[0]; - for (int i = 1, n = this.components.length; i < n;) { - double d = this.components[i++]; - normSquare += d * d; - } - if ((unit == this.unit) || (unit.equals(this.unit))) { - return Math.sqrt(normSquare); - } - return this.unit.getConverterTo(unit).convert(Math.sqrt(normSquare)); - } - - @Override - public Unit getUnit() { - return this.unit; - } - - @Override - public double[] getValue() { - return this.components.clone(); - } - - @Override - public MultiDimensional to(Unit unit) { - if ((unit == this.unit) || (unit.equals(this.unit))) { - return this; - } - UnitConverter cvtr = this.unit.getConverterTo(unit); - double[] newValues = new double[this.components.length]; - for (int i = 0; i < this.components.length; i++) { - newValues[i] = cvtr.convert(this.components[i]); - } - return new MultiDimensional(newValues, unit); - } - - private static final long serialVersionUID = 1L; - - } -} diff --git a/flexiblepower.api/src/javax/measure/converter/AddConverter.java b/flexiblepower.api/src/javax/measure/converter/AddConverter.java deleted file mode 100755 index 1037653..0000000 --- a/flexiblepower.api/src/javax/measure/converter/AddConverter.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.converter; - -/** - *

- * This class represents a converter adding a constant offset (approximated as a double) to numeric values. - *

- * - *

- * Instances of this class are immutable. - *

- * - * @author Jean-Marie Dautelle - * @version 3.1, April 22, 2006 - */ -public final class AddConverter extends UnitConverter { - - /** - * Holds the offset. - */ - private final double offset; - - /** - * Creates an add converter with the specified offset. - * - * @param offset - * the offset value. - * @throws IllegalArgumentException - * if offset is zero (or close to zero). - */ - public AddConverter(double offset) { - if ((float) offset == 0.0) { - throw new IllegalArgumentException("Identity converter not allowed"); - } - this.offset = offset; - } - - /** - * Returns the offset value for this add converter. - * - * @return the offset value. - */ - public double getOffset() { - return offset; - } - - @Override - public UnitConverter inverse() { - return new AddConverter(-offset); - } - - @Override - public double convert(double amount) { - return amount + offset; - } - - @Override - public boolean isLinear() { - return false; - } - - @Override - public UnitConverter concatenate(UnitConverter converter) { - if (converter instanceof AddConverter) { - double offset = this.offset + ((AddConverter) converter).offset; - return valueOf(offset); - } else { - return super.concatenate(converter); - } - } - - private static UnitConverter valueOf(double offset) { - float asFloat = (float) offset; - return asFloat == 0.0f ? UnitConverter.IDENTITY : new AddConverter(offset); - } - - private static final long serialVersionUID = 1L; -} diff --git a/flexiblepower.api/src/javax/measure/converter/ConversionException.java b/flexiblepower.api/src/javax/measure/converter/ConversionException.java deleted file mode 100755 index c6418ab..0000000 --- a/flexiblepower.api/src/javax/measure/converter/ConversionException.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.converter; - -/** - * Signals that a problem of some sort has occurred either when creating a converter between two units or during the - * conversion itself. - * - * @author Jean-Marie Dautelle - * @version 3.1, April 2, 2006 - */ -public class ConversionException extends RuntimeException { - - /** - * Constructs a ConversionException with no detail message. - */ - public ConversionException() { - super(); - } - - /** - * Constructs a ConversionException with the specified detail message. - * - * @param message - * the detail message. - */ - public ConversionException(String message) { - super(message); - } - - private static final long serialVersionUID = 1L; -} diff --git a/flexiblepower.api/src/javax/measure/converter/LogConverter.java b/flexiblepower.api/src/javax/measure/converter/LogConverter.java deleted file mode 100755 index 2bbf483..0000000 --- a/flexiblepower.api/src/javax/measure/converter/LogConverter.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.converter; - -/** - * This class represents a logarithmic converter. Such converter is typically used to create logarithmic unit. For - * example: - * - *
- * Unit<Dimensionless> BEL = Unit.ONE.transform(new LogConverter(10).inverse());
- * 
- * - * Instances of this class are immutable. - * - * @author Jean-Marie Dautelle - * @version 3.1, April 22, 2006 - */ -public final class LogConverter extends UnitConverter { - - /** - * Holds the logarithmic base. - */ - private final double base; - - /** - * Holds the natural logarithm of the base. - */ - private final double logBase; - - /** - * Holds the inverse of the natural logarithm of the base. - */ - private final double invLogBase; - - /** - * Holds the inverse of this converter. - */ - private final Inverse inverse = new Inverse(); - - /** - * Creates a logarithmic converter having the specified base. - * - * @param base - * the logarithmic base (e.g. Math.E for the Natural Logarithm). - */ - public LogConverter(double base) { - this.base = base; - logBase = Math.log(base); - invLogBase = 1.0 / logBase; - } - - /** - * Returns the logarithmic base of this converter. - * - * @return the logarithmic base (e.g. Math.E for the Natural Logarithm). - */ - public double getBase() { - return base; - } - - @Override - public UnitConverter inverse() { - return inverse; - } - - @Override - public double convert(double amount) { - return invLogBase * Math.log(amount); - } - - @Override - public boolean isLinear() { - return false; - } - - /** - * This inner class represents the inverse of the logarithmic converter (exponentiation converter). - */ - private class Inverse extends UnitConverter { - @Override - public UnitConverter inverse() { - return LogConverter.this; - } - - @Override - public double convert(double amount) { - return Math.exp(logBase * amount); - } - - @Override - public boolean isLinear() { - return false; - } - - private static final long serialVersionUID = 1L; - } - - private static final long serialVersionUID = 1L; -} diff --git a/flexiblepower.api/src/javax/measure/converter/MultiplyConverter.java b/flexiblepower.api/src/javax/measure/converter/MultiplyConverter.java deleted file mode 100755 index 8e3ab2c..0000000 --- a/flexiblepower.api/src/javax/measure/converter/MultiplyConverter.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.converter; - -/** - *

- * This class represents a converter multiplying numeric values by a constant scaling factor (approximated as a - * double). For exact scaling conversions {@link RationalConverter} is preferred. - *

- * - *

- * Instances of this class are immutable. - *

- * - * @author Jean-Marie Dautelle - * @version 3.1, April 22, 2006 - */ -public final class MultiplyConverter extends UnitConverter { - - /** - * Holds the scale factor. - */ - private final double factor; - - /** - * Creates a multiply converter with the specified scale factor. - * - * @param factor - * the scale factor. - * @throws IllegalArgumentException - * if offset is one (or close to one). - */ - public MultiplyConverter(double factor) { - if ((float) factor == 1.0) { - throw new IllegalArgumentException("Identity converter not allowed"); - } - this.factor = factor; - } - - /** - * Returns the scale factor. - * - * @return the scale factor. - */ - public double getFactor() { - return factor; - } - - @Override - public UnitConverter inverse() { - return new MultiplyConverter(1.0 / factor); - } - - @Override - public double convert(double amount) { - return factor * amount; - } - - @Override - public boolean isLinear() { - return true; - } - - @Override - public UnitConverter concatenate(UnitConverter converter) { - if (converter instanceof MultiplyConverter) { - double factor = this.factor * ((MultiplyConverter) converter).factor; - return valueOf(factor); - } else if (converter instanceof RationalConverter) { - double factor = this.factor * ((RationalConverter) converter).getDividend() - / ((RationalConverter) converter).getDivisor(); - return valueOf(factor); - } else { - return super.concatenate(converter); - } - } - - private static UnitConverter valueOf(double factor) { - float asFloat = (float) factor; - return asFloat == 1.0f ? UnitConverter.IDENTITY : new MultiplyConverter(factor); - } - - private static final long serialVersionUID = 1L; -} diff --git a/flexiblepower.api/src/javax/measure/converter/RationalConverter.java b/flexiblepower.api/src/javax/measure/converter/RationalConverter.java deleted file mode 100755 index 45c5051..0000000 --- a/flexiblepower.api/src/javax/measure/converter/RationalConverter.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.converter; - -/** - *

- * This class represents a converter multiplying numeric values by an exact scaling factor (represented as the quotient - * of two long numbers). - *

- * - *

- * Instances of this class are immutable. - *

- * - * @author Jean-Marie Dautelle - * @version 3.1, April 22, 2006 - */ -public final class RationalConverter extends UnitConverter { - - /** - * Holds the converter dividend. - */ - private final long dividend; - - /** - * Holds the converter divisor (always positive). - */ - private final long divisor; - - /** - * Creates a rational converter with the specified dividend and divisor. - * - * @param dividend - * the dividend. - * @param divisor - * the positive divisor. - * @throws IllegalArgumentException - * if divisor < 0 - * @throws IllegalArgumentException - * if dividend == divisor - */ - public RationalConverter(long dividend, long divisor) { - if (divisor < 0) { - throw new IllegalArgumentException("Negative divisor"); - } - if (dividend == divisor) { - throw new IllegalArgumentException("Identity converter not allowed"); - } - this.dividend = dividend; - this.divisor = divisor; - } - - /** - * Returns the dividend for this rational converter. - * - * @return this converter dividend. - */ - public long getDividend() { - return dividend; - } - - /** - * Returns the positive divisor for this rational converter. - * - * @return this converter divisor. - */ - public long getDivisor() { - return divisor; - } - - @Override - public UnitConverter inverse() { - return dividend < 0 ? new RationalConverter(-divisor, -dividend) : new RationalConverter(divisor, dividend); - } - - @Override - public double convert(double amount) { - return amount * dividend / divisor; - } - - @Override - public boolean isLinear() { - return true; - } - - @Override - public UnitConverter concatenate(UnitConverter converter) { - if (converter instanceof RationalConverter) { - RationalConverter that = (RationalConverter) converter; - long dividendLong = dividend * that.dividend; - long divisorLong = divisor * that.divisor; - double dividendDouble = ((double) dividend) * that.dividend; - double divisorDouble = ((double) divisor) * that.divisor; - if ((dividendLong != dividendDouble) || (divisorLong != divisorDouble)) { // Long overflows. - return new MultiplyConverter(dividendDouble / divisorDouble); - } - long gcd = gcd(dividendLong, divisorLong); - return RationalConverter.valueOf(dividendLong / gcd, divisorLong / gcd); - } else if (converter instanceof MultiplyConverter) { - return converter.concatenate(this); - } else { - return super.concatenate(converter); - } - } - - private static UnitConverter valueOf(long dividend, long divisor) { - return (dividend == 1L) && (divisor == 1L) ? UnitConverter.IDENTITY : new RationalConverter(dividend, divisor); - } - - /** - * Returns the greatest common divisor (Euclid's algorithm). - * - * @param m - * the first number. - * @param nn - * the second number. - * @return the greatest common divisor. - */ - private static long gcd(long m, long n) { - if (n == 0L) { - return m; - } else { - return gcd(n, m % n); - } - } - - private static final long serialVersionUID = 1L; -} diff --git a/flexiblepower.api/src/javax/measure/converter/UnitConverter.java b/flexiblepower.api/src/javax/measure/converter/UnitConverter.java deleted file mode 100755 index f80fee9..0000000 --- a/flexiblepower.api/src/javax/measure/converter/UnitConverter.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.converter; - -import java.io.Serializable; - -/** - *

- * This class represents a converter of numeric values. - *

- * - *

- * It is not required for sub-classes to be immutable (e.g. currency converter). - *

- * - *

- * Sub-classes must ensure unicity of the {@link #IDENTITY identity} converter. In other words, if the result of an - * operation is equivalent to the identity converter, then the unique {@link #IDENTITY} instance should be returned. - *

- * - * @author Jean-Marie Dautelle - * @version 3.1, April 22, 2006 - */ -public abstract class UnitConverter implements Serializable { - private static final long serialVersionUID = 7844169487993309253L; - - /** - * Holds the identity converter (unique). This converter does nothing (ONE.convert(x) == x). - */ - public static final UnitConverter IDENTITY = new Identity(); - - /** - * Default constructor. - */ - protected UnitConverter() { - } - - /** - * Returns the inverse of this converter. If x is a valid value, then - * x == inverse().convert(convert(x)) to within the accuracy of computer arithmetic. - * - * @return the inverse of this converter. - */ - public abstract UnitConverter inverse(); - - /** - * Converts a double value. - * - * @param x - * the numeric value to convert. - * @return the converted numeric value. - * @throws ConversionException - * if an error occurs during conversion. - */ - public abstract double convert(double x) throws ConversionException; - - /** - * Indicates if this converter is linear. A converter is linear if - * convert(u + v) == convert(u) + convert(v) and convert(r * u) == r * convert(u). For - * linear converters the following property always hold:[code] y1 = c1.convert(x1); y2 = c2.convert(x2); then y1*y2 - * = c1.concatenate(c2).convert(x1*x2)[/code] - * - * @return true if this converter is linear; false otherwise. - */ - public abstract boolean isLinear(); - - /** - * Indicates whether this converter is considered the same as the converter specified. To be considered equal this - * converter concatenated with the one specified must returns the {@link #IDENTITY}. - * - * @param cvtr - * the converter with which to compare. - * @return true if the specified object is a converter considered equals to this converter; - * false otherwise. - */ - @Override - public boolean equals(Object cvtr) { - if (!(cvtr instanceof UnitConverter)) { - return false; - } - return concatenate(((UnitConverter) cvtr).inverse()) == IDENTITY; - } - - /** - * Returns a hash code value for this converter. Equals object have equal hash codes. - * - * @return this converter hash code value. - * @see #equals - */ - @Override - public int hashCode() { - return Float.floatToIntBits((float) convert(1.0)); - } - - /** - * Concatenates this converter with another converter. The resulting converter is equivalent to first converting by - * the specified converter, and then converting by this converter. - * - *

- * Note: Implementations must ensure that the {@link #IDENTITY} instance is returned if the resulting converter is - * an identity converter. - *

- * - * @param converter - * the other converter. - * @return the concatenation of this converter with the other converter. - */ - public UnitConverter concatenate(UnitConverter converter) { - return (converter == IDENTITY) ? this : new Compound(converter, this); - } - - /** - * This inner class represents the identity converter (singleton). - */ - private static final class Identity extends UnitConverter { - - @Override - public UnitConverter inverse() { - return this; - } - - @Override - public double convert(double x) { - return x; - } - - @Override - public boolean isLinear() { - return true; - } - - @Override - public UnitConverter concatenate(UnitConverter converter) { - return converter; - } - - private static final long serialVersionUID = 1L; - - } - - /** - * This inner class represents a compound converter. - */ - private static final class Compound extends UnitConverter { - - /** - * Holds the first converter. - */ - private final UnitConverter first; - - /** - * Holds the second converter. - */ - private final UnitConverter second; - - /** - * Creates a compound converter resulting from the combined transformation of the specified converters. - * - * @param first - * the first converter. - * @param second - * the second converter. - */ - private Compound(UnitConverter first, UnitConverter second) { - this.first = first; - this.second = second; - } - - @Override - public UnitConverter inverse() { - return new Compound(second.inverse(), first.inverse()); - } - - @Override - public double convert(double x) { - return second.convert(first.convert(x)); - } - - @Override - public boolean isLinear() { - return first.isLinear() && second.isLinear(); - } - - private static final long serialVersionUID = 1L; - - } -} diff --git a/flexiblepower.api/src/javax/measure/converter/doc-files/converter.png b/flexiblepower.api/src/javax/measure/converter/doc-files/converter.png deleted file mode 100755 index 4a2fdba45581f2027e0e8e7ea2f260352650812f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110953 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 -

Provides support for unit conversion.

-

UML Diagram

- UML Diagram - \ No newline at end of file diff --git a/flexiblepower.api/src/javax/measure/converter/packageinfo b/flexiblepower.api/src/javax/measure/converter/packageinfo deleted file mode 100755 index 94c7259..0000000 --- a/flexiblepower.api/src/javax/measure/converter/packageinfo +++ /dev/null @@ -1 +0,0 @@ -version 5.0.0.${qualifier} \ No newline at end of file diff --git a/flexiblepower.api/src/javax/measure/package.html b/flexiblepower.api/src/javax/measure/package.html deleted file mode 100755 index 3579c94..0000000 --- a/flexiblepower.api/src/javax/measure/package.html +++ /dev/null @@ -1,77 +0,0 @@ - -

Provides strongly typed measurements to enforce compile-time - check of parameters consistency and avoid interface errors.

- -

Let's take the following example:[code] - class Person { - void setWeight(double weight); - }[/code] - Should the weight be in pound, kilogram ??
- Using measures there is no room for error:[code] - class Person { - void setWeight(Measurable weight); - }[/code] - Not only the interface is cleaner (the weight has to be of mass type); - but also there is no confusion on the measurement unit:[code] - double weightInKg = weight.doubleValue(KILOGRAM); - double weightInLb = weight.doubleValue(POUND);[/code] - Measurable work hand-in-hand with units (also parameterized). - For example, the following would result in compile-time error:[code] - double weightInLiter = weight.doubleValue(LITER); // Compile error, Unit required. - [/code]

- -

Users may create their own {@link javax.measure.Measurable - Measurable} implementation:[code] - - public class Period implements Measurable { - long nanoseconds; - ... - } - - public class Distance implements Measurable { - double meters; - ... - } - - public class Velocity3D implements Measurable { - double x, y, z; // In meters. - ... - } - - -[/code]

- -

Users may also combine a definite amount (scalar, vector, collection, etc.) - to a unit and make it a {@link javax.measure.Measure Measure} (and - a {@link javax.measure.Measurable Measurable} instance). For example: - [code] - - // Scalar measurement (numerical). - person.setWeight(Measure.valueOf(180.0, POUND)); // Measure - timer.setPeriod(Measure.valueOf(20, MILLI(SECOND)); // Measure - circuit.setCurrent(Measure.valueOf(Complex.valueOf(2, -3), AMPERE); // (2 - 3i) A - bottle.setPression(Measure.valueOf(Rational.valueOf(20, 100), ATMOSPHERE)); // (20/100) Atm - - // Vector measurement. - abstract class MeasureVector extends Measure { - ... // doubleValue(Unit) returns vector norm. - } - MeasureVector v = MeasureVector.valueOf(METRE_PER_SECOND, 1.0, 2.0, 3.0); - plane.setVelocity(v); - - // Statistical measurement. - class Average extends Measure{ - ... // doubleValue(Unit) returns average value. - } - sea.setTemperature(Average.valueOf(new double[] { 33.4, 44.55, 32.33} , CELCIUS)); - - // Measurement with uncertainty (and additional operations). - public class Amount extends Measurable { - public Amount(double value, double error, Unit unit) { ... } - public Amount plus(Amount that) {...} - public Amount times(Amount that) {...} - ... // doubleValue(Unit) returns estimated value. - } - [/code]

- - \ No newline at end of file diff --git a/flexiblepower.api/src/javax/measure/packageinfo b/flexiblepower.api/src/javax/measure/packageinfo deleted file mode 100755 index 94c7259..0000000 --- a/flexiblepower.api/src/javax/measure/packageinfo +++ /dev/null @@ -1 +0,0 @@ -version 5.0.0.${qualifier} \ No newline at end of file diff --git a/flexiblepower.api/src/javax/measure/quantity/Acceleration.java b/flexiblepower.api/src/javax/measure/quantity/Acceleration.java deleted file mode 100755 index 84c642c..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/Acceleration.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the rate of change of velocity with respect to time. The system unit for this quantity is - * "m/s²" (meter per square second). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface Acceleration extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.METRES_PER_SQUARE_SECOND; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/AmountOfSubstance.java b/flexiblepower.api/src/javax/measure/quantity/AmountOfSubstance.java deleted file mode 100755 index 6a1e4bf..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/AmountOfSubstance.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the number of elementary entities (molecules, for example) of a substance. The system unit - * for this quantity is "mol" (mole). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface AmountOfSubstance extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.MOLE; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/Angle.java b/flexiblepower.api/src/javax/measure/quantity/Angle.java deleted file mode 100755 index cd0dd58..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/Angle.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the figure formed by two lines diverging from a common point. The system unit for this - * quantity is "rad" (radian). This quantity is dimensionless. - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface Angle extends Dimensionless { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.RADIAN; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/AngularAcceleration.java b/flexiblepower.api/src/javax/measure/quantity/AngularAcceleration.java deleted file mode 100755 index 482f6c1..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/AngularAcceleration.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.ProductUnit; -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the rate of change of angular velocity with respect to time. The system unit for this - * quantity is "rad/s²" (radian per square second). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface AngularAcceleration extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = new ProductUnit(SI.RADIAN.divide(SI.SECOND.pow(2))); - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/AngularVelocity.java b/flexiblepower.api/src/javax/measure/quantity/AngularVelocity.java deleted file mode 100755 index 50ac028..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/AngularVelocity.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.ProductUnit; -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the rate of change of angular displacement with respect to time. The system unit for this - * quantity is "rad/s" (radian per second). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface AngularVelocity extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = new ProductUnit(SI.RADIAN.divide(SI.SECOND)); - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/Area.java b/flexiblepower.api/src/javax/measure/quantity/Area.java deleted file mode 100755 index 6f56edf..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/Area.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the extent of a planar region or of the surface of a solid measured in square units. The - * system unit for this quantity is "m²" (square meter). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface Area extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.SQUARE_METRE; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/CatalyticActivity.java b/flexiblepower.api/src/javax/measure/quantity/CatalyticActivity.java deleted file mode 100755 index 596704d..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/CatalyticActivity.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents a catalytic activity. The system unit for this quantity is "kat" (katal). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface CatalyticActivity extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.KATAL; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/DataAmount.java b/flexiblepower.api/src/javax/measure/quantity/DataAmount.java deleted file mode 100755 index d56b55e..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/DataAmount.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents a measure of data amount. The system unit for this quantity is "bit". This quantity is - * dimensionless. - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface DataAmount extends Dimensionless { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.BIT; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/DataRate.java b/flexiblepower.api/src/javax/measure/quantity/DataRate.java deleted file mode 100755 index 198648c..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/DataRate.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.ProductUnit; -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the speed of data-transmission. The system unit for this quantity is "bit/s" (bit per - * second). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface DataRate extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = new ProductUnit(SI.BIT.divide(SI.SECOND)); - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/Dimensionless.java b/flexiblepower.api/src/javax/measure/quantity/Dimensionless.java deleted file mode 100755 index 4f1a9f4..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/Dimensionless.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.Unit; - -/** - * This interface represents a dimensionless quantity. - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface Dimensionless extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = Unit.ONE; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/Duration.java b/flexiblepower.api/src/javax/measure/quantity/Duration.java deleted file mode 100755 index c7649d9..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/Duration.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents a period of existence or persistence. The system unit for this quantity is "s" (second). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface Duration extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.SECOND; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/DynamicViscosity.java b/flexiblepower.api/src/javax/measure/quantity/DynamicViscosity.java deleted file mode 100755 index 85dffe4..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/DynamicViscosity.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.ProductUnit; -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the dynamic viscosity. The system unit for this quantity is "Pa·s" (Pascal-Second). - * - * @author Jean-Marie Dautelle - * @version 3.0, March 2, 2006 - * @see Wikipedia: Viscosity - */ -public interface DynamicViscosity extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = new ProductUnit(SI.PASCAL.times(SI.SECOND)); - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/ElectricCapacitance.java b/flexiblepower.api/src/javax/measure/quantity/ElectricCapacitance.java deleted file mode 100755 index 902fc91..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/ElectricCapacitance.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents an electric capacitance. The system unit for this quantity is "F" (Farad). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface ElectricCapacitance extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.FARAD; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/ElectricCharge.java b/flexiblepower.api/src/javax/measure/quantity/ElectricCharge.java deleted file mode 100755 index ae887de..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/ElectricCharge.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents an electric charge. The system unit for this quantity is "C" (Coulomb). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface ElectricCharge extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.COULOMB; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/ElectricConductance.java b/flexiblepower.api/src/javax/measure/quantity/ElectricConductance.java deleted file mode 100755 index 8df5164..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/ElectricConductance.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents an electric conductance. The system unit for this quantity "S" (Siemens). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface ElectricConductance extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.SIEMENS; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/ElectricCurrent.java b/flexiblepower.api/src/javax/measure/quantity/ElectricCurrent.java deleted file mode 100755 index 1bd3321..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/ElectricCurrent.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the amount of electric charge flowing past a specified circuit point per unit time. The - * system unit for this quantity is "A" (Ampere). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface ElectricCurrent extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.AMPERE; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/ElectricInductance.java b/flexiblepower.api/src/javax/measure/quantity/ElectricInductance.java deleted file mode 100755 index e0143c1..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/ElectricInductance.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents an electric inductance. The system unit for this quantity is "H" (Henry). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface ElectricInductance extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.HENRY; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/ElectricPotential.java b/flexiblepower.api/src/javax/measure/quantity/ElectricPotential.java deleted file mode 100755 index 39ab4bc..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/ElectricPotential.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents an electric potential or electromotive force. The system unit for this quantity is "V" - * (Volt). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface ElectricPotential extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.VOLT; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/ElectricResistance.java b/flexiblepower.api/src/javax/measure/quantity/ElectricResistance.java deleted file mode 100755 index b21606d..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/ElectricResistance.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents an electric resistance. The system unit for this quantity is "Ω" (Ohm). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface ElectricResistance extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.OHM; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/Energy.java b/flexiblepower.api/src/javax/measure/quantity/Energy.java deleted file mode 100755 index 673619b..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/Energy.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the capacity of a physical system to do work. The system unit for this quantity "J" - * (Joule). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface Energy extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.JOULE; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/Force.java b/flexiblepower.api/src/javax/measure/quantity/Force.java deleted file mode 100755 index 8de986c..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/Force.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents a quantity that tends to produce an acceleration of a body in the direction of its - * application. The system unit for this quantity is "N" (Newton). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface Force extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.NEWTON; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/Frequency.java b/flexiblepower.api/src/javax/measure/quantity/Frequency.java deleted file mode 100755 index 5032b59..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/Frequency.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the number of times a specified phenomenon occurs within a specified interval. The system - * unit for this quantity is "Hz" (Hertz). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface Frequency extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.HERTZ; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/Illuminance.java b/flexiblepower.api/src/javax/measure/quantity/Illuminance.java deleted file mode 100755 index 5da6121..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/Illuminance.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents an illuminance. The system unit for this quantity is "lx" (lux). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface Illuminance extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.LUX; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/KinematicViscosity.java b/flexiblepower.api/src/javax/measure/quantity/KinematicViscosity.java deleted file mode 100755 index 8f8ee57..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/KinematicViscosity.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.ProductUnit; -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the diffusion of momentum. The system unit for this quantity is "m²/s". - * - * @author Jean-Marie Dautelle - * @version 3.0, March 2, 2006 - * @see Wikipedia: Viscosity - */ -public interface KinematicViscosity extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = new ProductUnit(SI.METRE.pow(2).divide(SI.SECOND)); - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/Length.java b/flexiblepower.api/src/javax/measure/quantity/Length.java deleted file mode 100755 index 8b37cae..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/Length.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the extent of something along its greatest dimension or the extent of space between two - * objects or places. The system unit for this quantity is "m" (meter). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface Length extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.METRE; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/LuminousFlux.java b/flexiblepower.api/src/javax/measure/quantity/LuminousFlux.java deleted file mode 100755 index 1f4e21e..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/LuminousFlux.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents a luminous flux. The system unit for this quantity is "lm" (lumen). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface LuminousFlux extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.LUMEN; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/LuminousIntensity.java b/flexiblepower.api/src/javax/measure/quantity/LuminousIntensity.java deleted file mode 100755 index 8a47cbf..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/LuminousIntensity.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the luminous flux density per solid angle as measured in a given direction relative to the - * emitting source. The system unit for this quantity is "cd" (candela). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface LuminousIntensity extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.CANDELA; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/MagneticFlux.java b/flexiblepower.api/src/javax/measure/quantity/MagneticFlux.java deleted file mode 100755 index b6d18dd..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/MagneticFlux.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents a magnetic flux. The system unit for this quantity is "Wb" (Weber). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface MagneticFlux extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.WEBER; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/MagneticFluxDensity.java b/flexiblepower.api/src/javax/measure/quantity/MagneticFluxDensity.java deleted file mode 100755 index 5f18286..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/MagneticFluxDensity.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents a magnetic flux density. The system unit for this quantity is "T" (Tesla). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface MagneticFluxDensity extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.TESLA; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/Mass.java b/flexiblepower.api/src/javax/measure/quantity/Mass.java deleted file mode 100755 index 6ea17fb..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/Mass.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the measure of the quantity of matter that a body or an object contains. The mass of the - * body is not dependent on gravity and therefore is different from but proportional to its weight. The system unit for - * this quantity is "kg" (kilogram). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface Mass extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.KILOGRAM; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/MassFlowRate.java b/flexiblepower.api/src/javax/measure/quantity/MassFlowRate.java deleted file mode 100755 index 26a792a..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/MassFlowRate.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the movement of mass per time. The system unit for this quantity is "kg/s" (kilogram per - * second). - * - * @author Jean-Marie Dautelle - * @version 3.0, March 2, 2006 - * @see Wikipedia: Mass Flow Rate - */ -public interface MassFlowRate extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - @SuppressWarnings("unchecked") - Unit UNIT = (Unit) SI.KILOGRAM.divide(SI.SECOND); -} diff --git a/flexiblepower.api/src/javax/measure/quantity/Money.java b/flexiblepower.api/src/javax/measure/quantity/Money.java deleted file mode 100755 index 58fbfef..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/Money.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.NonSI; -import javax.measure.unit.ProductUnit; -import javax.measure.unit.Unit; - -/** - * This interface represents monetray value. The default unit for this quantity is euros. - */ -public interface Money extends Quantity { - - /** - * Default value for money - */ - Unit UNIT = new ProductUnit(NonSI.EUR); - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/MoneyFlow.java b/flexiblepower.api/src/javax/measure/quantity/MoneyFlow.java deleted file mode 100755 index 91a3c8c..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/MoneyFlow.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.NonSI; -import javax.measure.unit.ProductUnit; -import javax.measure.unit.Unit; - -/** - * This interface represents MoneyFlow value. The default unit for this quantity is euros per hour. - */ -public interface MoneyFlow extends Quantity { - - /** - * Default value for money - */ - Unit UNIT = new ProductUnit(NonSI.EUR_PER_HOUR); - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/Power.java b/flexiblepower.api/src/javax/measure/quantity/Power.java deleted file mode 100755 index d73f270..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/Power.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the rate at which work is done. The system unit for this quantity is "W" (Watt). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface Power extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.WATT; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/Pressure.java b/flexiblepower.api/src/javax/measure/quantity/Pressure.java deleted file mode 100755 index 2a3f10c..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/Pressure.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents a force applied uniformly over a surface. The system unit for this quantity is "Pa" - * (Pascal). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface Pressure extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.PASCAL; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/Quantity.java b/flexiblepower.api/src/javax/measure/quantity/Quantity.java deleted file mode 100755 index af18a75..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/Quantity.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -/** - *

- * This interface represents any type of quantitative properties or attributes of thing. Mass, time, distance, heat, and - * angular separation are among the familiar examples of quantitative properties. - *

- * - *

- * Distinct quantities have usually different physical dimensions; although it is not required nor necessary, for - * example {@link Torque} and {@link Energy} have same dimension but are of different nature (vector for torque, scalar - * for energy). - *

- * - * @author Jean-Marie Dautelle - * @version 4.0, February 25, 2007 - * @see Wikipedia: Quantity - * @see Wikipedia: Dimensional Analysis - */ -public interface Quantity { - - // No method - Tagging interface. - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/RadiationDoseAbsorbed.java b/flexiblepower.api/src/javax/measure/quantity/RadiationDoseAbsorbed.java deleted file mode 100755 index 43bfaeb..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/RadiationDoseAbsorbed.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the amount of energy deposited per unit of mass. The system unit for this quantity is "Gy" - * (Gray). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface RadiationDoseAbsorbed extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.GRAY; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/RadiationDoseEffective.java b/flexiblepower.api/src/javax/measure/quantity/RadiationDoseEffective.java deleted file mode 100755 index a61427c..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/RadiationDoseEffective.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the effective (or "equivalent") dose of radiation received by a human or some other living - * organism. The system unit for this quantity is "Sv" (Sievert). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface RadiationDoseEffective extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.SIEVERT; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/RadioactiveActivity.java b/flexiblepower.api/src/javax/measure/quantity/RadioactiveActivity.java deleted file mode 100755 index b383939..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/RadioactiveActivity.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents a radioactive activity. The system unit for this quantity is "Bq" (Becquerel). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface RadioactiveActivity extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.BECQUEREL; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/SolidAngle.java b/flexiblepower.api/src/javax/measure/quantity/SolidAngle.java deleted file mode 100755 index 8307fd3..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/SolidAngle.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the angle formed by three or more planes intersecting at a common point. The system unit - * for this quantity is "sr" (steradian). This quantity is dimensionless. - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface SolidAngle extends Dimensionless { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.STERADIAN; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/Temperature.java b/flexiblepower.api/src/javax/measure/quantity/Temperature.java deleted file mode 100755 index 61f9d8c..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/Temperature.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This class represents the degree of hotness or coldness of a body or an environment. The system unit for this - * quantity is "K" (Kelvin). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface Temperature extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.KELVIN; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/Torque.java b/flexiblepower.api/src/javax/measure/quantity/Torque.java deleted file mode 100755 index 992fd07..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/Torque.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.ProductUnit; -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the moment of a force. The system unit for this quantity is "N·m" (Newton-Meter). - * - *

- * Note: The Newton-metre ("N·m") is also a way of exressing a Joule (unit of energy). However, torque is not energy. - * So, to avoid confusion, we will use the units "N·m" for torque and not "J". This distinction occurs due to the scalar - * nature of energy and the vector nature of torque. - *

- * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface Torque extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = new ProductUnit(SI.NEWTON.times(SI.METRE)); - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/Velocity.java b/flexiblepower.api/src/javax/measure/quantity/Velocity.java deleted file mode 100755 index 8c200bc..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/Velocity.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents a distance traveled divided by the time of travel. The system unit for this quantity is - * "m/s" (meter per second). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface Velocity extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.METRES_PER_SECOND; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/Volume.java b/flexiblepower.api/src/javax/measure/quantity/Volume.java deleted file mode 100755 index 69bd6a1..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/Volume.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the amount of space occupied by a three-dimensional object or region of space, expressed in - * cubic units. The system unit for this quantity is "m³" (cubic meter). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface Volume extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = SI.CUBIC_METRE; - -} diff --git a/flexiblepower.api/src/javax/measure/quantity/VolumetricDensity.java b/flexiblepower.api/src/javax/measure/quantity/VolumetricDensity.java deleted file mode 100755 index 83959af..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/VolumetricDensity.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.ProductUnit; -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents a mass per unit volume of a substance under specified conditions of pressure and - * temperature. The system unit for this quantity is "kg/m³" (kilogram per cubic meter). - * - * @author Jean-Marie Dautelle - * @version 1.0, January 14, 2006 - */ -public interface VolumetricDensity extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - Unit UNIT = new ProductUnit(SI.KILOGRAM.divide(SI.METRE.pow(3))); -} diff --git a/flexiblepower.api/src/javax/measure/quantity/VolumetricFlowRate.java b/flexiblepower.api/src/javax/measure/quantity/VolumetricFlowRate.java deleted file mode 100755 index 87294f5..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/VolumetricFlowRate.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.quantity; - -import javax.measure.unit.SI; -import javax.measure.unit.Unit; - -/** - * This interface represents the volume of fluid passing a point in a system per unit of time. The system unit for this - * quantity is "m³/s" (cubic meter per second). - * - * @author Jean-Marie Dautelle - * @version 3.0, March 2, 2006 - * @see Wikipedia: Volumetric Flow Rate - */ -public interface VolumetricFlowRate extends Quantity { - - /** - * Holds the SI unit (Système International d'Unités) for this quantity. - */ - @SuppressWarnings("unchecked") - Unit UNIT = (Unit) SI.METRE.pow(3).divide(SI.SECOND); -} diff --git a/flexiblepower.api/src/javax/measure/quantity/package.html b/flexiblepower.api/src/javax/measure/quantity/package.html deleted file mode 100755 index b6994ca..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/package.html +++ /dev/null @@ -1,6 +0,0 @@ - -

Provides quantitative properties or attributes of thing such as - mass, time, distance, heat, and angular separation.

-

Each quantity sub-interface holds a static UNIT field - holding the standard unit for the quantity.

- \ No newline at end of file diff --git a/flexiblepower.api/src/javax/measure/quantity/packageinfo b/flexiblepower.api/src/javax/measure/quantity/packageinfo deleted file mode 100755 index 94c7259..0000000 --- a/flexiblepower.api/src/javax/measure/quantity/packageinfo +++ /dev/null @@ -1 +0,0 @@ -version 5.0.0.${qualifier} \ No newline at end of file diff --git a/flexiblepower.api/src/javax/measure/unit/AlternateUnit.java b/flexiblepower.api/src/javax/measure/unit/AlternateUnit.java deleted file mode 100755 index 7f906c0..0000000 --- a/flexiblepower.api/src/javax/measure/unit/AlternateUnit.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.unit; - -import javax.measure.converter.UnitConverter; -import javax.measure.quantity.Quantity; - -/** - *

- * This class represents the units used in expressions to distinguish between quantities of a different nature but of - * the same dimensions. - *

- * - *

- * Instances of this class are created through the {@link Unit#alternate(String)} method. - *

- * - * @author Jean-Marie Dautelle - * @version 4.2, August 26, 2007 - */ -public final class AlternateUnit extends DerivedUnit { - - /** - * Holds the symbol. - */ - private final String symbol; - - /** - * Holds the parent unit (a system unit). - */ - private final Unit parent; - - /** - * Creates an alternate unit for the specified unit identified by the specified symbol. - * - * @param symbol - * the symbol for this alternate unit. - * @param parent - * the system unit from which this alternate unit is derived. - * @throws UnsupportedOperationException - * if the source is not a standard unit. - * @throws IllegalArgumentException - * if the specified symbol is associated to a different unit. - */ - AlternateUnit(String symbol, Unit parent) { - if (!parent.isStandardUnit()) { - throw new UnsupportedOperationException(parent + " is not a standard unit"); - } - this.symbol = symbol; - this.parent = parent; - // Checks if the symbol is associated to a different unit. - synchronized (Unit.SYMBOL_TO_UNIT) { - Unit unit = Unit.SYMBOL_TO_UNIT.get(symbol); - if (unit == null) { - Unit.SYMBOL_TO_UNIT.put(symbol, this); - return; - } - if (unit instanceof AlternateUnit) { - AlternateUnit existingUnit = (AlternateUnit) unit; - if (symbol.equals(existingUnit.symbol) && this.parent.equals(existingUnit.parent)) { - return; // OK, same unit. - } - } - throw new IllegalArgumentException("Symbol " + symbol + " is associated to a different unit"); - } - } - - /** - * Returns the symbol for this alternate unit. - * - * @return this alternate unit symbol. - */ - public String getSymbol() { - return this.symbol; - } - - /** - * Returns the parent unit from which this alternate unit is derived (a system unit itself). - * - * @return the parent of the alternate unit. - */ - @SuppressWarnings("unchecked") - public Unit getParent() { - return (Unit) this.parent; - } - - @Override - public Unit getStandardUnit() { - return this; - } - - @Override - public UnitConverter toStandardUnit() { - return UnitConverter.IDENTITY; - } - - /** - * Indicates if this alternate unit is considered equals to the specified object (both are alternate units with - * equal symbol, equal base units and equal converter to base units). - * - * @param that - * the object to compare for equality. - * @return true if this and that are considered equals; false - * otherwise. - */ - @Override - public boolean equals(Object that) { - if (this == that) { - return true; - } - if (!(that instanceof AlternateUnit)) { - return false; - } - AlternateUnit thatUnit = (AlternateUnit) that; - return this.symbol.equals(thatUnit.symbol); // Symbols are unique. - } - - // Implements abstract method. - @Override - public int hashCode() { - return this.symbol.hashCode(); - } - - private static final long serialVersionUID = 1L; -} diff --git a/flexiblepower.api/src/javax/measure/unit/BaseUnit.java b/flexiblepower.api/src/javax/measure/unit/BaseUnit.java deleted file mode 100755 index e99f6ee..0000000 --- a/flexiblepower.api/src/javax/measure/unit/BaseUnit.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.unit; - -import javax.measure.converter.UnitConverter; -import javax.measure.quantity.Quantity; - -/** - *

- * This class represents the building blocks on top of which all others units are created. Base units are typically - * dimensionally independent. The actual unit dimension is determinated by the current {@link Dimension.Model model}. - * For example using the {@link Dimension.Model#STANDARD standard} model, {@link SI#CANDELA} has the dimension of - * {@link SI#WATT watt}: - * - * - * // Standard model. - * BaseUnit<Length> METER = new BaseUnit<Length>("m"); - * BaseUnit<LuminousIntensity> CANDELA = new BaseUnit<LuminousIntensity>("cd"); - * System.out.println(METER.getDimension()); - * System.out.println(CANDELA.getDimension()); - * - * > [L] > [L]²·[M]/[T]³ - * - *

- *

- * This class represents the "standard base units" which includes SI base units and possibly others user-defined base - * units. It does not represent the base units of any specific {@link SystemOfUnits} (they would have be base units - * accross all possible systems otherwise). - *

- * - * @author Jean-Marie Dautelle - * @version 3.1, April 22, 2006 - * @see Wikipedia: SI base unit - */ -public class BaseUnit extends Unit { - - /** - * Holds the symbol. - */ - private final String symbol; - - /** - * Creates a base unit having the specified symbol. - * - * @param symbol - * the symbol of this base unit. - * @throws IllegalArgumentException - * if the specified symbol is associated to a different unit. - */ - public BaseUnit(String symbol) { - this.symbol = symbol; - // Checks if the symbol is associated to a different unit. - synchronized (Unit.SYMBOL_TO_UNIT) { - Unit unit = Unit.SYMBOL_TO_UNIT.get(symbol); - if (unit == null) { - Unit.SYMBOL_TO_UNIT.put(symbol, this); - return; - } - if (!(unit instanceof BaseUnit)) { - throw new IllegalArgumentException("Symbol " + symbol + " is associated to a different unit"); - } - } - } - - /** - * Returns the unique symbol for this base unit. - * - * @return this base unit symbol. - */ - public final String getSymbol() { - return this.symbol; - } - - /** - * Indicates if this base unit is considered equals to the specified object (both are base units with equal symbol, - * standard dimension and standard transform). - * - * @param that - * the object to compare for equality. - * @return true if this and that are considered equals; false - * otherwise. - */ - @Override - public boolean equals(Object that) { - if (this == that) { - return true; - } - if (!(that instanceof BaseUnit)) { - return false; - } - BaseUnit thatUnit = (BaseUnit) that; - return this.symbol.equals(thatUnit.symbol); - } - - @Override - public int hashCode() { - return this.symbol.hashCode(); - } - - @Override - public Unit getStandardUnit() { - return this; - } - - @Override - public UnitConverter toStandardUnit() { - return UnitConverter.IDENTITY; - } - - private static final long serialVersionUID = 1L; -} diff --git a/flexiblepower.api/src/javax/measure/unit/CompoundUnit.java b/flexiblepower.api/src/javax/measure/unit/CompoundUnit.java deleted file mode 100755 index 019b4a2..0000000 --- a/flexiblepower.api/src/javax/measure/unit/CompoundUnit.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.unit; - -import javax.measure.converter.UnitConverter; -import javax.measure.quantity.Quantity; - -/** - * This class represents the multi-radix units (such as "hour:min:sec"). Instances of this class are created using the - * {@link Unit#compound Unit.compound} method. - * - * Examples of compound units: - * - *
- * Unit<Duration> HOUR_MINUTE_SECOND = HOUR.compound(MINUTE).compound(SECOND);
- * Unit<Angle> DEGREE_MINUTE_ANGLE = DEGREE_ANGLE.compound(MINUTE_ANGLE);
- * 
- * - * @author Jean-Marie Dautelle - * @version 3.1, April 22, 2006 - */ -public final class CompoundUnit extends DerivedUnit { - - /** - * Holds the higher unit. - */ - private final Unit high; - - /** - * Holds the lower unit. - */ - private final Unit low; - - /** - * Creates a compound unit from the specified units. - * - * @param high - * the high unit. - * @param low - * the lower unit(s) - * @throws IllegalArgumentException - * if both units do not the same system unit. - */ - CompoundUnit(Unit high, Unit low) { - if (!high.getStandardUnit().equals(low.getStandardUnit())) { - throw new IllegalArgumentException("Both units do not have the same system unit"); - } - this.high = high; - this.low = low; - - } - - /** - * Returns the lower unit of this compound unit. - * - * @return the lower unit. - */ - public Unit getLower() { - return this.low; - } - - /** - * Returns the higher unit of this compound unit. - * - * @return the higher unit. - */ - public Unit getHigher() { - return this.high; - } - - /** - * Indicates if this compound unit is considered equals to the specified object (both are compound units with same - * composing units in the same order). - * - * @param that - * the object to compare for equality. - * @return true if this and that are considered equals; false - * otherwise. - */ - @Override - public boolean equals(Object that) { - if (this == that) { - return true; - } - if (!(that instanceof CompoundUnit)) { - return false; - } - CompoundUnit thatUnit = (CompoundUnit) that; - return this.high.equals(thatUnit.high) && this.low.equals(thatUnit.low); - } - - @Override - public int hashCode() { - return this.high.hashCode() ^ this.low.hashCode(); - } - - @Override - public Unit getStandardUnit() { - return this.low.getStandardUnit(); - } - - @Override - public UnitConverter toStandardUnit() { - return this.low.toStandardUnit(); - } - - private static final long serialVersionUID = 1L; -} diff --git a/flexiblepower.api/src/javax/measure/unit/DerivedUnit.java b/flexiblepower.api/src/javax/measure/unit/DerivedUnit.java deleted file mode 100755 index 00abd47..0000000 --- a/flexiblepower.api/src/javax/measure/unit/DerivedUnit.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.unit; - -import javax.measure.quantity.Quantity; - -/** - *

- * This class identifies the units created by combining or transforming other units. - *

- * - * @author Jean-Marie Dautelle - * @version 3.1, April 22, 2006 - */ -public abstract class DerivedUnit extends Unit { - private static final long serialVersionUID = -6961024809117869978L; - - /** - * Default constructor. - */ - protected DerivedUnit() { - } -} diff --git a/flexiblepower.api/src/javax/measure/unit/Dimension.java b/flexiblepower.api/src/javax/measure/unit/Dimension.java deleted file mode 100755 index 25bff34..0000000 --- a/flexiblepower.api/src/javax/measure/unit/Dimension.java +++ /dev/null @@ -1,286 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.unit; - -import java.io.Serializable; - -import javax.measure.converter.RationalConverter; -import javax.measure.converter.UnitConverter; -import javax.measure.quantity.Dimensionless; - -/** - * This class represents the dimension of an unit. Two units u1 and u2 are - * {@link Unit#isCompatible compatible} if and only if (u1.getDimension().equals(u2.getDimension()))) - * - * Instances of this class are immutable. - * - * @author Jean-Marie Dautelle - * @version 3.1, April 22, 2006 - * @see Wikipedia: Dimensional Analysis - */ -public final class Dimension implements Serializable { - - /** - * Holds the current physical model. - */ - private static Model currentModel = Model.STANDARD; - - /** - * Holds dimensionless. - */ - public static final Dimension NONE = new Dimension(Unit.ONE); - - /** - * Holds length dimension (L). - */ - public static final Dimension LENGTH = new Dimension('L'); - - /** - * Holds mass dimension (M). - */ - public static final Dimension MASS = new Dimension('M'); - - /** - * Holds time dimension (T). - */ - public static final Dimension TIME = new Dimension('T'); - - /** - * Holds electric current dimension (I). - */ - public static final Dimension ELECTRIC_CURRENT = new Dimension('I'); - - /** - * Holds temperature dimension (θ). - */ - public static final Dimension TEMPERATURE = new Dimension('θ'); - - /** - * Holds amount of substance dimension (N). - */ - public static final Dimension AMOUNT_OF_SUBSTANCE = new Dimension('N'); - - /** - * Holds the pseudo unit associated to this dimension. - */ - private final Unit pseudoUnit; - - /** - * Creates a new dimension associated to the specified symbol. - * - * @param symbol - * the associated symbol. - */ - public Dimension(char symbol) { - pseudoUnit = new BaseUnit("[" + symbol + "]"); - } - - /** - * Creates a dimension having the specified pseudo-unit (base unit or product of base unit). - * - * @param pseudoUnit - * the pseudo-unit identifying this dimension. - */ - private Dimension(Unit pseudoUnit) { - this.pseudoUnit = pseudoUnit; - } - - /** - * Returns the product of this dimension with the one specified. - * - * @param that - * the dimension multiplicand. - * @return this * that - */ - public Dimension times(Dimension that) { - return new Dimension(pseudoUnit.times(that.pseudoUnit)); - } - - /** - * Returns the quotient of this dimension with the one specified. - * - * @param that - * the dimension divisor. - * @return this / that - */ - public Dimension divide(Dimension that) { - return new Dimension(pseudoUnit.divide(that.pseudoUnit)); - } - - /** - * Returns this dimension raised to an exponent. - * - * @param n - * the exponent. - * @return the result of raising this dimension to the exponent. - */ - public Dimension pow(int n) { - return new Dimension(pseudoUnit.pow(n)); - } - - /** - * Returns the given root of this dimension. - * - * @param n - * the root's order. - * @return the result of taking the given root of this dimension. - * @throws ArithmeticException - * if n == 0. - */ - public Dimension root(int n) { - return new Dimension(pseudoUnit.root(n)); - } - - /** - * Returns the representation of this dimension. - * - * @return the representation of this dimension. - */ - @Override - public String toString() { - return pseudoUnit.toString(); - } - - /** - * Indicates if the specified dimension is equals to the one specified. - * - * @param that - * the object to compare to. - * @return true if this dimension is equals to that dimension; false otherwise. - */ - @Override - public boolean equals(Object that) { - if (this == that) { - return true; - } - return (that instanceof Dimension) && pseudoUnit.equals(((Dimension) that).pseudoUnit); - } - - /** - * Returns the hash code for this dimension. - * - * @return this dimension hashcode value. - */ - @Override - public int hashCode() { - return pseudoUnit.hashCode(); - } - - /** - * Sets the model used to determinate the units dimensions. - * - * @param model - * the new model to be used when calculating unit dimensions. - */ - public static void setModel(Model model) { - Dimension.currentModel = model; - } - - /** - * Returns the model used to determinate the units dimensions (default {@link Model#STANDARD STANDARD}). - * - * @return the model used when calculating unit dimensions. - */ - public static Model getModel() { - return Dimension.currentModel; - } - - /** - * This interface represents the mapping between {@link BaseUnit base units} and {@link Dimension dimensions}. - * Custom models may allow conversions not possible using the {@link #STANDARD standard} model. For example: - * - *
-     * public static void main(String[] args) {
-     *     Dimension.Model relativistic = new Dimension.Model() { 
-     *         RationalConverter meterToSecond = new RationalConverter(1, 299792458); // 1/c
-     *         
-     *         public Dimension getDimension(BaseUnit unit) { 
-     *             if (unit.equals(SI.METER)) return Dimension.TIME; 
-     *             else return Dimension.Model.STANDARD.getDimension(unit); 
-     *         }
-     * 
-     *         public UnitConverter getTransform(BaseUnit unit) { 
-     *             if (unit.equals(SI.METER)) return meterToSecond; 
-     *             else return Dimension.Model.STANDARD.getTransform(unit); 
-     *         }
-     *     };
-     *     
-     *     Dimension.setModel(relativistic);
-     * 
-     *     // Converts 1.0 GeV (energy) to kg (mass).
-     *     System.out.println(Unit.valueOf("GeV").getConverterTo(KILOGRAM).convert(1.0)); 
-     * }
-     * 
-     * > 1.7826617302520883E-27
-     * 
- */ - public interface Model { - - /** - * Holds the standard model (default). - */ - Model STANDARD = new Model() { - @Override - public Dimension getDimension(BaseUnit unit) { - if (unit.equals(SI.METRE)) { - return Dimension.LENGTH; - } - if (unit.equals(SI.KILOGRAM)) { - return Dimension.MASS; - } - if (unit.equals(SI.KELVIN)) { - return Dimension.TEMPERATURE; - } - if (unit.equals(SI.SECOND)) { - return Dimension.TIME; - } - if (unit.equals(SI.AMPERE)) { - return Dimension.ELECTRIC_CURRENT; - } - if (unit.equals(SI.MOLE)) { - return Dimension.AMOUNT_OF_SUBSTANCE; - } - if (unit.equals(SI.CANDELA)) { - return SI.WATT.getDimension(); - } - return new Dimension(new BaseUnit("[" + unit.getSymbol() + "]")); - } - - @Override - public UnitConverter getTransform(BaseUnit unit) { - if (unit.equals(SI.CANDELA)) { - return new RationalConverter(1, 683); - } - return UnitConverter.IDENTITY; - } - }; - - /** - * Returns the dimension of the specified base unit (a dimension particular to the base unit if the base unit is - * not recognized). - * - * @param unit - * the base unit for which the dimension is returned. - * @return the dimension of the specified unit. - */ - Dimension getDimension(BaseUnit unit); - - /** - * Returns the normalization transform of the specified base unit ({@link UnitConverter#IDENTITY IDENTITY} if - * the base unit is not recognized). - * - * @param unit - * the base unit for which the transform is returned. - * @return the normalization transform. - */ - UnitConverter getTransform(BaseUnit unit); - } - - private static final long serialVersionUID = 1L; -} diff --git a/flexiblepower.api/src/javax/measure/unit/NonSI.java b/flexiblepower.api/src/javax/measure/unit/NonSI.java deleted file mode 100755 index ee5d63a..0000000 --- a/flexiblepower.api/src/javax/measure/unit/NonSI.java +++ /dev/null @@ -1,754 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.unit; - -import static javax.measure.unit.SI.BECQUEREL; -import static javax.measure.unit.SI.BIT; -import static javax.measure.unit.SI.CENTI; -import static javax.measure.unit.SI.COULOMB; -import static javax.measure.unit.SI.CUBIC_METRE; -import static javax.measure.unit.SI.GRAM; -import static javax.measure.unit.SI.GRAY; -import static javax.measure.unit.SI.JOULE; -import static javax.measure.unit.SI.KELVIN; -import static javax.measure.unit.SI.KILOGRAM; -import static javax.measure.unit.SI.LUX; -import static javax.measure.unit.SI.METRE; -import static javax.measure.unit.SI.METRES_PER_SECOND; -import static javax.measure.unit.SI.METRES_PER_SQUARE_SECOND; -import static javax.measure.unit.SI.MOLE; -import static javax.measure.unit.SI.NEWTON; -import static javax.measure.unit.SI.PASCAL; -import static javax.measure.unit.SI.RADIAN; -import static javax.measure.unit.SI.SECOND; -import static javax.measure.unit.SI.SIEVERT; -import static javax.measure.unit.SI.SQUARE_METRE; -import static javax.measure.unit.SI.STERADIAN; -import static javax.measure.unit.SI.TESLA; -import static javax.measure.unit.SI.WATT; -import static javax.measure.unit.SI.WEBER; - -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - -import javax.measure.converter.LogConverter; -import javax.measure.converter.RationalConverter; -import javax.measure.quantity.Acceleration; -import javax.measure.quantity.AmountOfSubstance; -import javax.measure.quantity.Angle; -import javax.measure.quantity.Area; -import javax.measure.quantity.DataAmount; -import javax.measure.quantity.Dimensionless; -import javax.measure.quantity.Duration; -import javax.measure.quantity.DynamicViscosity; -import javax.measure.quantity.ElectricCharge; -import javax.measure.quantity.ElectricCurrent; -import javax.measure.quantity.Energy; -import javax.measure.quantity.Force; -import javax.measure.quantity.Illuminance; -import javax.measure.quantity.KinematicViscosity; -import javax.measure.quantity.Length; -import javax.measure.quantity.MagneticFlux; -import javax.measure.quantity.MagneticFluxDensity; -import javax.measure.quantity.Mass; -import javax.measure.quantity.Money; -import javax.measure.quantity.MoneyFlow; -import javax.measure.quantity.Power; -import javax.measure.quantity.Pressure; -import javax.measure.quantity.RadiationDoseAbsorbed; -import javax.measure.quantity.RadiationDoseEffective; -import javax.measure.quantity.RadioactiveActivity; -import javax.measure.quantity.SolidAngle; -import javax.measure.quantity.Temperature; -import javax.measure.quantity.Velocity; -import javax.measure.quantity.Volume; -import javax.measure.quantity.VolumetricFlowRate; - -/** - *

- * This class contains units that are not part of the International System of Units, that is, they are outside the SI, - * but are important and widely used. - *

- * - * @author Jean-Marie Dautelle - * @version 4.2, August 26, 2007 - */ -public final class NonSI extends SystemOfUnits { - - /** - * Holds collection of NonSI units. - */ - private static HashSet> units = new HashSet>(); - - /** - * Holds the standard gravity constant: 9.80665 m/s² exact. - */ - private static final int STANDARD_GRAVITY_DIVIDEND = 980665; - private static final int STANDARD_GRAVITY_DIVISOR = 100000; - - /** - * Holds the international foot: 0.3048 m exact. - */ - private static final int INTERNATIONAL_FOOT_DIVIDEND = 3048; - private static final int INTERNATIONAL_FOOT_DIVISOR = 10000; - - /** - * Holds the avoirdupois pound: 0.45359237 kg exact - */ - private static final int AVOIRDUPOIS_POUND_DIVIDEND = 45359237; - private static final int AVOIRDUPOIS_POUND_DIVISOR = 100000000; - - /** - * Holds the Avogadro constant. - */ - private static final double AVOGADRO_CONSTANT = 6.02214199e23; // (1/mol). - - /** - * Holds the electric charge of one electron. - */ - private static final double ELEMENTARY_CHARGE = 1.602176462e-19; // (C). - - /** - * Default constructor (prevents this class from being instantiated). - */ - private NonSI() { - } - - /** - * Returns the unique instance of this class. - * - * @return the NonSI instance. - */ - public static NonSI getInstance() { - return INSTANCE; - } - - private static final NonSI INSTANCE = new NonSI(); - - // ///////////////// - // Dimensionless // - // ///////////////// - - /** - * A dimensionless unit equals to 0.01 (standard name %). - */ - public static final Unit PERCENT = nonSI(Unit.ONE.divide(100)); - - /** - * A logarithmic unit used to describe a ratio (standard name dB). - */ - public static final Unit DECIBEL = nonSI(Unit.ONE.transform(new LogConverter(10).inverse() - .concatenate(new RationalConverter(1, - 10)))); - - // /////////////////////// - // Amount of substance // - // /////////////////////// - - /** - * A unit of amount of substance equals to one atom (standard name atom). - */ - public static final Unit ATOM = nonSI(MOLE.divide(AVOGADRO_CONSTANT)); - - // ////////// - // Length // - // ////////// - - /** - * A unit of length equal to 0.3048 m (standard name ft). - */ - public static final Unit FOOT = nonSI(METRE.times(INTERNATIONAL_FOOT_DIVIDEND) - .divide(INTERNATIONAL_FOOT_DIVISOR)); - - /** - * A unit of length equal to 1200/3937 m (standard name foot_survey_us). See also: foot - */ - public static final Unit FOOT_SURVEY_US = nonSI(METRE.times(1200).divide(3937)); - - /** - * A unit of length equal to 0.9144 m (standard name yd). - */ - public static final Unit YARD = nonSI(FOOT.times(3)); - - /** - * A unit of length equal to 0.0254 m (standard name in). - */ - public static final Unit INCH = nonSI(FOOT.divide(12)); - - /** - * A unit of length equal to 1609.344 m (standard name mi). - */ - public static final Unit MILE = nonSI(METRE.times(1609344).divide(1000)); - - /** - * A unit of length equal to 1852.0 m (standard name nmi). - */ - public static final Unit NAUTICAL_MILE = nonSI(METRE.times(1852)); - - /** - * A unit of length equal to 1E-10 m (standard name Å). - */ - public static final Unit ANGSTROM = nonSI(METRE.divide(10000000000L)); - - /** - * A unit of length equal to the average distance from the center of the Earth to the center of the Sun (standard - * name ua). - */ - public static final Unit ASTRONOMICAL_UNIT = nonSI(METRE.times(149597870691.0)); - - /** - * A unit of length equal to the distance that light travels in one year through a vacuum (standard name - * ly). - */ - public static final Unit LIGHT_YEAR = nonSI(METRE.times(9.460528405e15)); - - /** - * A unit of length equal to the distance at which a star would appear to shift its position by one arcsecond over - * the course the time (about 3 months) in which the Earth moves a distance of {@link #ASTRONOMICAL_UNIT} in the - * direction perpendicular to the direction to the star (standard name pc). - */ - public static final Unit PARSEC = nonSI(METRE.times(30856770e9)); - - /** - * A unit of length equal to 0.013837 {@link #INCH} exactly (standard name pt). - * - * @see #PIXEL - */ - public static final Unit POINT = nonSI(INCH.times(13837).divide(1000000)); - - /** - * A unit of length equal to 1/72 {@link #INCH} (standard name pixel). It is the American - * point rounded to an even 1/72 inch. - * - * @see #POINT - */ - public static final Unit PIXEL = nonSI(INCH.divide(72)); - - /** - * Equivalent {@link #PIXEL} - */ - public static final Unit COMPUTER_POINT = PIXEL; - - // //////////// - // Duration // - // //////////// - - /** - * A unit of duration equal to 60 s (standard name min). - */ - public static final Unit MINUTE = nonSI(SI.SECOND.times(60)); - - /** - * A unit of duration equal to 60 {@link #MINUTE} (standard name h). - */ - public static final Unit HOUR = nonSI(MINUTE.times(60)); - - /** - * A unit of duration equal to 24 {@link #HOUR} (standard name d). - */ - public static final Unit DAY = nonSI(HOUR.times(24)); - - /** - * A unit of duration equal to 7 {@link #DAY} (standard name week). - */ - public static final Unit WEEK = nonSI(DAY.times(7)); - - /** - * A unit of duration equal to 365 days, 5 hours, 49 minutes, and 12 seconds (standard name year). - */ - public static final Unit YEAR = nonSI(SECOND.times(31556952)); - - /** - * A unit of duration equal to one twelfth of a year (standard name month). - */ - public static final Unit MONTH = nonSI(YEAR.divide(12)); - - /** - * A unit of duration equal to the time required for a complete rotation of the earth in reference to any star or to - * the vernal equinox at the meridian, equal to 23 hours, 56 minutes, 4.09 seconds (standard name - * day_sidereal). - */ - public static final Unit DAY_SIDEREAL = nonSI(SECOND.times(86164.09)); - - /** - * A unit of duration equal to one complete revolution of the earth about the sun, relative to the fixed stars, or - * 365 days, 6 hours, 9 minutes, 9.54 seconds (standard name year_sidereal). - */ - public static final Unit YEAR_SIDEREAL = nonSI(SECOND.times(31558149.54)); - - /** - * A unit of duration equal to 365 {@link #DAY} (standard name year_calendar). - */ - public static final Unit YEAR_CALENDAR = nonSI(DAY.times(365)); - - // //////// - // Mass // - // //////// - - /** - * A unit of mass equal to 1/12 the mass of the carbon-12 atom (standard name u). - */ - public static final Unit ATOMIC_MASS = nonSI(KILOGRAM.times(1e-3 / AVOGADRO_CONSTANT)); - - /** - * A unit of mass equal to the mass of the electron (standard name me). - */ - public static final Unit ELECTRON_MASS = nonSI(KILOGRAM.times(9.10938188e-31)); - - /** - * A unit of mass equal to 453.59237 grams (avoirdupois pound, standard name lb). - */ - public static final Unit POUND = nonSI(KILOGRAM.times(AVOIRDUPOIS_POUND_DIVIDEND) - .divide(AVOIRDUPOIS_POUND_DIVISOR)); - - /** - * A unit of mass equal to 1 / 16 {@link #POUND} (standard name oz). - */ - public static final Unit OUNCE = nonSI(POUND.divide(16)); - - /** - * A unit of mass equal to 2000 {@link #POUND} (short ton, standard name ton_us). - */ - public static final Unit TON_US = nonSI(POUND.times(2000)); - - /** - * A unit of mass equal to 2240 {@link #POUND} (long ton, standard name ton_uk). - */ - public static final Unit TON_UK = nonSI(POUND.times(2240)); - - /** - * A unit of mass equal to 1000 kg (metric ton, standard name t). - */ - public static final Unit METRIC_TON = nonSI(KILOGRAM.times(1000)); - - // /////////////////// - // Electric charge // - // /////////////////// - - /** - * A unit of electric charge equal to the charge on one electron (standard name e). - */ - public static final Unit E = nonSI(COULOMB.times(ELEMENTARY_CHARGE)); - - /** - * A unit of electric charge equal to equal to the product of Avogadro's number (see {@link SI#MOLE}) and the charge - * (1 e) on a single electron (standard name Fd). - */ - public static final Unit FARADAY = nonSI(COULOMB.times(ELEMENTARY_CHARGE * AVOGADRO_CONSTANT)); // e/mol - - /** - * A unit of electric charge which exerts a force of one dyne on an equal charge at a distance of one centimeter - * (standard name Fr). - */ - public static final Unit FRANKLIN = nonSI(COULOMB.times(3.3356e-10)); - - // /////////////// - // Temperature // - // /////////////// - - /** - * A unit of temperature equal to 5/9 °K (standard name °R). - */ - public static final Unit RANKINE = nonSI(KELVIN.times(5).divide(9)); - - /** - * A unit of temperature equal to degree Rankine minus 459.67 °R (standard name °F). - * - * @see #RANKINE - */ - public static final Unit FAHRENHEIT = nonSI(RANKINE.plus(459.67)); - - // ///////// - // Angle // - // ///////// - - /** - * A unit of angle equal to a full circle or 2π - * {@link SI#RADIAN} (standard name rev). - */ - public static final Unit REVOLUTION = nonSI(RADIAN.times(2.0 * Math.PI)); - - /** - * A unit of angle equal to 1/360 {@link #REVOLUTION} (standard name °). - */ - public static final Unit DEGREE_ANGLE = nonSI(REVOLUTION.divide(360)); - - /** - * A unit of angle equal to 1/60 {@link #DEGREE_ANGLE} (standard name ). - */ - public static final Unit MINUTE_ANGLE = nonSI(DEGREE_ANGLE.divide(60)); - - /** - * A unit of angle equal to 1/60 {@link #MINUTE_ANGLE} (standard name "). - */ - public static final Unit SECOND_ANGLE = nonSI(MINUTE_ANGLE.divide(60)); - - /** - * A unit of angle equal to 0.01 {@link SI#RADIAN} (standard name centiradian). - */ - public static final Unit CENTIRADIAN = nonSI(RADIAN.divide(100)); - - /** - * A unit of angle measure equal to 1/400 {@link #REVOLUTION} (standard name grade). - */ - public static final Unit GRADE = nonSI(REVOLUTION.divide(400)); - - // //////////// - // Velocity // - // //////////// - - /** - * A unit of velocity expressing the number of international {@link #MILE miles} per {@link #HOUR hour} - * (abbreviation mph). - */ - public static final Unit MILES_PER_HOUR = nonSI(NonSI.MILE.divide(NonSI.HOUR)).asType(Velocity.class); - - /** - * A unit of velocity expressing the number of {@link SI#KILOMETRE} per {@link #HOUR hour}. - */ - public static final Unit KILOMETRES_PER_HOUR = nonSI(SI.KILOMETRE.divide(NonSI.HOUR)).asType(Velocity.class); - - /** - * Equivalent to {@link #KILOMETRES_PER_HOUR}. - */ - public static final Unit KILOMETERS_PER_HOUR = KILOMETRES_PER_HOUR; - - /** - * A unit of velocity expressing the number of {@link #NAUTICAL_MILE nautical miles} per {@link #HOUR hour} - * (abbreviation kn). - */ - public static final Unit KNOT = nonSI(NonSI.NAUTICAL_MILE.divide(NonSI.HOUR)).asType(Velocity.class); - - /** - * A unit of velocity to express the speed of an aircraft relative to the speed of sound (standard name - * Mach). - */ - public static final Unit MACH = nonSI(METRES_PER_SECOND.times(331.6)); - - /** - * A unit of velocity relative to the speed of light (standard name c). - */ - public static final Unit C = nonSI(METRES_PER_SECOND.times(299792458)); - - // //////////////// - // Acceleration // - // //////////////// - - /** - * A unit of acceleration equal to the gravity at the earth's surface (standard name grav). - */ - public static final Unit G = nonSI(METRES_PER_SQUARE_SECOND.times(STANDARD_GRAVITY_DIVIDEND) - .divide(STANDARD_GRAVITY_DIVISOR)); - - // //////// - // Area // - // //////// - - /** - * A unit of area equal to 100 m² (standard name a). - */ - public static final Unit ARE = nonSI(SQUARE_METRE.times(100)); - - /** - * A unit of area equal to 100 {@link #ARE} (standard name ha). - */ - public static final Unit HECTARE = nonSI(ARE.times(100)); // Exact. - - // /////////////// - // Data Amount // - // /////////////// - - /** - * A unit of data amount equal to 8 {@link SI#BIT} (BinarY TErm, standard name byte). - */ - public static final Unit BYTE = nonSI(BIT.times(8)); - - /** - * Equivalent {@link #BYTE} - */ - public static final Unit OCTET = BYTE; - - // //////////////////// - // Electric current // - // //////////////////// - - /** - * A unit of electric charge equal to the centimeter-gram-second electromagnetic unit of magnetomotive force, equal - * to 10/4 - * πampere-turn (standard name Gi). - */ - public static final Unit GILBERT = nonSI(SI.AMPERE.times(10.0 / (4.0 * Math.PI))); - - // ////////// - // Energy // - // ////////// - - /** - * A unit of energy equal to 1E-7 J (standard name erg). - */ - public static final Unit ERG = nonSI(JOULE.divide(10000000)); - - /** - * A unit of energy equal to one electron-volt (standard name eV, also recognized - * keV, MeV, GeV). - */ - public static final Unit ELECTRON_VOLT = nonSI(JOULE.times(ELEMENTARY_CHARGE)); - - /** - * A unit of energy equal to 3.6E6 J (standard name KiloWattHour). - */ - public static final Unit KWH = nonSI(SI.JOULE.times(60 * 60 * 1000)); - - // /////////////// - // Illuminance // - // /////////////// - - /** - * A unit of illuminance equal to 1E4 Lx (standard name La). - */ - public static final Unit LAMBERT = nonSI(LUX.times(10000)); - - // ///////////////// - // Magnetic Flux // - // ///////////////// - - /** - * A unit of magnetic flux equal 1E-8 Wb (standard name Mx). - */ - public static final Unit MAXWELL = nonSI(WEBER.divide(100000000)); - - // ///////////////////////// - // Magnetic Flux Density // - // ///////////////////////// - - /** - * A unit of magnetic flux density equal 1000 A/m (standard name G). - */ - public static final Unit GAUSS = nonSI(TESLA.divide(10000)); - - // ///////// - // Force // - // ///////// - - /** - * A unit of force equal to 1E-5 N (standard name dyn). - */ - public static final Unit DYNE = nonSI(NEWTON.divide(100000)); - - /** - * A unit of force equal to 9.80665 N (standard name kgf). - */ - public static final Unit KILOGRAM_FORCE = nonSI(NEWTON.times(STANDARD_GRAVITY_DIVIDEND) - .divide(STANDARD_GRAVITY_DIVISOR)); - - /** - * A unit of force equal to {@link #POUND}·{@link #G} (standard name lbf). - */ - public static final Unit POUND_FORCE = nonSI(NEWTON.times(1L * AVOIRDUPOIS_POUND_DIVIDEND - * STANDARD_GRAVITY_DIVIDEND) - .divide(1L * AVOIRDUPOIS_POUND_DIVISOR - * STANDARD_GRAVITY_DIVISOR)); - - // ///////// - // Power // - // ///////// - - /** - * A unit of power equal to the power required to raise a mass of 75 kilograms at a velocity of 1 meter per second - * (metric, standard name hp). - */ - public static final Unit HORSEPOWER = nonSI(WATT.times(735.499)); - - // //////////// - // Pressure // - // //////////// - - /** - * A unit of pressure equal to the average pressure of the Earth's atmosphere at sea level (standard name - * atm). - */ - public static final Unit ATMOSPHERE = nonSI(PASCAL.times(101325)); - - /** - * A unit of pressure equal to 100 kPa (standard name bar). - */ - public static final Unit BAR = nonSI(PASCAL.times(100000)); - - /** - * A unit of pressure equal to the pressure exerted at the Earth's surface by a column of mercury 1 millimeter high - * (standard name mmHg). - */ - public static final Unit MILLIMETER_OF_MERCURY = nonSI(PASCAL.times(133.322)); - - /** - * A unit of pressure equal to the pressure exerted at the Earth's surface by a column of mercury 1 inch high - * (standard name inHg). - */ - public static final Unit INCH_OF_MERCURY = nonSI(PASCAL.times(3386.388)); - - // /////////////////////////// - // Radiation dose absorbed // - // /////////////////////////// - - /** - * A unit of radiation dose absorbed equal to a dose of 0.01 joule of energy per kilogram of mass (J/kg) (standard - * name rd). - */ - public static final Unit RAD = nonSI(GRAY.divide(100)); - - /** - * A unit of radiation dose effective equal to 0.01 Sv (standard name rem). - */ - public static final Unit REM = nonSI(SIEVERT.divide(100)); - - // //////////////////////// - // Radioactive activity // - // //////////////////////// - - /** - * A unit of radioctive activity equal to the activity of a gram of radium (standard name Ci). - */ - public static final Unit CURIE = nonSI(BECQUEREL.times(37000000000L)); - - /** - * A unit of radioctive activity equal to 1 million radioactive disintegrations per second (standard name - * Rd). - */ - public static final Unit RUTHERFORD = nonSI(SI.BECQUEREL.times(1000000)); - - // /////////////// - // Solid angle // - // /////////////// - - /** - * A unit of solid angle equal to 4 π steradians (standard name sphere). - */ - public static final Unit SPHERE = nonSI(STERADIAN.times(4.0 * Math.PI)); - - // ////////// - // Volume // - // ////////// - - /** - * A unit of volume equal to one cubic decimeter (default label L, also recognized - * µL, mL, cL, dL). - */ - public static final Unit LITRE = nonSI(CUBIC_METRE.divide(1000)); - - /** - * Equivalent to {@link #LITRE} (American spelling). - */ - public static final Unit LITER = LITRE; - - /** - * A unit of volume equal to one cubic inch (in³). - */ - public static final Unit CUBIC_INCH = nonSI(INCH.pow(3).asType(Volume.class)); - - /** - * A unit of volume equal to one US gallon, Liquid Unit. The U.S. liquid gallon is based on the Queen Anne or Wine - * gallon occupying 231 cubic inches (standard name gal). - */ - public static final Unit GALLON_LIQUID_US = nonSI(CUBIC_INCH.times(231)); - - /** - * A unit of volume equal to 1 / 128 {@link #GALLON_LIQUID_US} (standard name oz_fl). - */ - public static final Unit OUNCE_LIQUID_US = nonSI(GALLON_LIQUID_US.divide(128)); - - /** - * A unit of volume equal to one US dry gallon. (standard name gallon_dry_us). - */ - public static final Unit GALLON_DRY_US = nonSI(CUBIC_INCH.times(2688025).divide(10000)); - - /** - * A unit of volume equal to 4.546 09 {@link #LITRE} (standard name gal_uk). - */ - public static final Unit GALLON_UK = nonSI(LITRE.times(454609).divide(100000)); - - /** - * A unit of volume equal to 1 / 160 {@link #GALLON_UK} (standard name oz_fl_uk). - */ - public static final Unit OUNCE_LIQUID_UK = nonSI(GALLON_UK.divide(160)); - - /** - * The metric unit for volume quantities (). - */ - public static final Unit CUBIC_METRE_PER_SECOND = nonSI(new ProductUnit(METRE.pow(3) - .divide(SECOND))); - - // ///////////// - // Viscosity // - // ///////////// - - /** - * A unit of dynamic viscosity equal to 1 g/(cm·s) (cgs unit). - */ - @SuppressWarnings("unchecked") - public static final Unit POISE = nonSI((Unit) GRAM.divide(CENTI(METRE).times(SECOND))); - - /** - * A unit of kinematic viscosity equal to 1 cm²/s (cgs unit). - */ - @SuppressWarnings("unchecked") - public static final Unit STOKE = nonSI((Unit) CENTI(METRE).pow(2) - .divide(SECOND)); - - // ///////// - // Money // - // ///////// - - public static final Unit EUR = nonSI(new BaseUnit("€")); - - public static final Unit EUROCENT = nonSI(CENTI(EUR)); - - @SuppressWarnings("unchecked") - public static final Unit EUR_PER_HOUR = (Unit) nonSI(EUR.divide(HOUR)); - - @SuppressWarnings("unchecked") - public static final Unit EURCENT_PER_SEC = (Unit) nonSI(EUROCENT.divide(SECOND)); - - // ////////// - // Others // - // ////////// - - /** - * A unit used to measure the ionizing ability of radiation (standard name Roentgen). - */ - public static final Unit ROENTGEN = nonSI(COULOMB.divide(KILOGRAM).times(2.58e-4)); - - // /////////////////// - // Collection View // - // /////////////////// - - /** - * Returns a read only view over the units defined in this class. - * - * @return the collection of NonSI units. - */ - @Override - public Set> getUnits() { - return Collections.unmodifiableSet(units); - } - - /** - * Adds a new unit to the collection. - * - * @param unit - * the unit being added. - * @return unit. - */ - private static > U nonSI(U unit) { - units.add(unit); - return unit; - } - -} diff --git a/flexiblepower.api/src/javax/measure/unit/ProductUnit.java b/flexiblepower.api/src/javax/measure/unit/ProductUnit.java deleted file mode 100755 index d444319..0000000 --- a/flexiblepower.api/src/javax/measure/unit/ProductUnit.java +++ /dev/null @@ -1,487 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.unit; - -import java.io.Serializable; - -import javax.measure.converter.ConversionException; -import javax.measure.converter.UnitConverter; -import javax.measure.quantity.Quantity; - -/** - *

- * This class represents units formed by the product of rational powers of existing units. - *

- * - *

- * This class maintains the canonical form of this product (simplest form after factorization). For example: - * METER.pow(2).divide(METER) returns METER. - *

- * - * @author Jean-Marie Dautelle - * @version 3.1, April 22, 2006 - * @see Unit#times(Unit) - * @see Unit#divide(Unit) - * @see Unit#pow(int) - * @see Unit#root(int) - */ -public final class ProductUnit extends DerivedUnit { - - /** - * Holds the units composing this product unit. - */ - private final Element[] elements; - - /** - * Holds the hashcode (optimization). - */ - private int hashCode; - - /** - * Default constructor (used solely to create ONE instance). - */ - ProductUnit() { - this.elements = new Element[0]; - } - - /** - * Copy constructor (allows for parameterization of product units). - * - * @param productUnit - * the product unit source. - * @throws ClassCastException - * if the specified unit is not a product unit. - */ - public ProductUnit(Unit productUnit) { - this.elements = ((ProductUnit) productUnit).elements; - } - - /** - * Product unit constructor. - * - * @param elements - * the product elements. - */ - private ProductUnit(Element[] elements) { - this.elements = elements; - } - - /** - * Returns the unit defined from the product of the specifed elements. - * - * @param leftElems - * left multiplicand elements. - * @param rightElems - * right multiplicand elements. - * @return the corresponding unit. - */ - @SuppressWarnings("rawtypes") - private static Unit getInstance(Element[] leftElems, Element[] rightElems) { - // Merges left elements with right elements. - Element[] result = new Element[leftElems.length + rightElems.length]; - int resultIndex = 0; - for (Element leftElem : leftElems) { - Unit unit = leftElem.unit; - int p1 = leftElem.pow; - int r1 = leftElem.root; - int p2 = 0; - int r2 = 1; - for (Element rightElem : rightElems) { - if (unit.equals(rightElem.unit)) { - p2 = rightElem.pow; - r2 = rightElem.root; - break; // No duplicate. - } - } - int pow = (p1 * r2) + (p2 * r1); - int root = r1 * r2; - if (pow != 0) { - int gcd = gcd(Math.abs(pow), root); - result[resultIndex++] = new Element(unit, pow / gcd, root / gcd); - } - } - - // Appends remaining right elements not merged. - for (Element rightElem : rightElems) { - Unit unit = rightElem.unit; - boolean hasBeenMerged = false; - for (Element leftElem : leftElems) { - if (unit.equals(leftElem.unit)) { - hasBeenMerged = true; - break; - } - } - if (!hasBeenMerged) { - result[resultIndex++] = rightElem; - } - } - - // Returns or creates instance. - if (resultIndex == 0) { - return ONE; - } else if ((resultIndex == 1) && (result[0].pow == result[0].root)) { - return result[0].unit; - } else { - Element[] elems = new Element[resultIndex]; - for (int i = 0; i < resultIndex; i++) { - elems[i] = result[i]; - } - return new ProductUnit(elems); - } - } - - /** - * Returns the product of the specified units. - * - * @param left - * the left unit operand. - * @param right - * the right unit operand. - * @return left * right - */ - static Unit getProductInstance(Unit left, Unit right) { - Element[] leftElems; - if (left instanceof ProductUnit) { - leftElems = ((ProductUnit) left).elements; - } else { - leftElems = new Element[] { new Element(left, 1, 1) }; - } - Element[] rightElems; - if (right instanceof ProductUnit) { - rightElems = ((ProductUnit) right).elements; - } else { - rightElems = new Element[] { new Element(right, 1, 1) }; - } - return getInstance(leftElems, rightElems); - } - - /** - * Returns the quotient of the specified units. - * - * @param left - * the dividend unit operand. - * @param right - * the divisor unit operand. - * @return dividend / divisor - */ - static Unit getQuotientInstance(Unit left, Unit right) { - Element[] leftElems; - if (left instanceof ProductUnit) { - leftElems = ((ProductUnit) left).elements; - } else { - leftElems = new Element[] { new Element(left, 1, 1) }; - } - Element[] rightElems; - if (right instanceof ProductUnit) { - Element[] elems = ((ProductUnit) right).elements; - rightElems = new Element[elems.length]; - for (int i = 0; i < elems.length; i++) { - rightElems[i] = new Element(elems[i].unit, -elems[i].pow, elems[i].root); - } - } else { - rightElems = new Element[] { new Element(right, -1, 1) }; - } - return getInstance(leftElems, rightElems); - } - - /** - * Returns the product unit corresponding to the specified root of the specified unit. - * - * @param unit - * the unit. - * @param n - * the root's order (n > 0). - * @return unit^(1/nn) - * @throws ArithmeticException - * if n == 0. - */ - static Unit getRootInstance(Unit unit, int n) { - Element[] unitElems; - if (unit instanceof ProductUnit) { - Element[] elems = ((ProductUnit) unit).elements; - unitElems = new Element[elems.length]; - for (int i = 0; i < elems.length; i++) { - int gcd = gcd(Math.abs(elems[i].pow), elems[i].root * n); - unitElems[i] = new Element(elems[i].unit, elems[i].pow / gcd, elems[i].root * n / gcd); - } - } else { - unitElems = new Element[] { new Element(unit, 1, n) }; - } - return getInstance(unitElems, new Element[0]); - } - - /** - * Returns the product unit corresponding to this unit raised to the specified exponent. - * - * @param unit - * the unit. - * @param nn - * the exponent (nn > 0). - * @return unit^n - */ - static Unit getPowInstance(Unit unit, int n) { - Element[] unitElems; - if (unit instanceof ProductUnit) { - Element[] elems = ((ProductUnit) unit).elements; - unitElems = new Element[elems.length]; - for (int i = 0; i < elems.length; i++) { - int gcd = gcd(Math.abs(elems[i].pow * n), elems[i].root); - unitElems[i] = new Element(elems[i].unit, elems[i].pow * n / gcd, elems[i].root / gcd); - } - } else { - unitElems = new Element[] { new Element(unit, n, 1) }; - } - return getInstance(unitElems, new Element[0]); - } - - /** - * Returns the number of units in this product. - * - * @return the number of units being multiplied. - */ - public int getUnitCount() { - return this.elements.length; - } - - /** - * Returns the unit at the specified position. - * - * @param index - * the index of the unit to return. - * @return the unit at the specified position. - * @throws IndexOutOfBoundsException - * if index is out of range (index < 0 || index >= size()). - */ - public Unit getUnit(int index) { - return this.elements[index].getUnit(); - } - - /** - * Returns the power exponent of the unit at the specified position. - * - * @param index - * the index of the unit to return. - * @return the unit power exponent at the specified position. - * @throws IndexOutOfBoundsException - * if index is out of range (index < 0 || index >= size()). - */ - public int getUnitPow(int index) { - return this.elements[index].getPow(); - } - - /** - * Returns the root exponent of the unit at the specified position. - * - * @param index - * the index of the unit to return. - * @return the unit root exponent at the specified position. - * @throws IndexOutOfBoundsException - * if index is out of range (index < 0 || index >= size()). - */ - public int getUnitRoot(int index) { - return this.elements[index].getRoot(); - } - - /** - * Indicates if this product unit is considered equals to the specified object. - * - * @param that - * the object to compare for equality. - * @return true if this and that are considered equals; false - * otherwise. - */ - @Override - public boolean equals(Object that) { - if (this == that) { - return true; - } - if (that instanceof ProductUnit) { - // Two products are equals if they have the same elements - // regardless of the elements' order. - Element[] elems = ((ProductUnit) that).elements; - if (this.elements.length == elems.length) { - for (Element element : this.elements) { - boolean unitFound = false; - for (Element elem : elems) { - if (element.unit.equals(elem.unit)) { - if ((element.pow != elem.pow) || (element.root != elem.root)) { - return false; - } else { - unitFound = true; - break; - } - } - } - if (!unitFound) { - return false; - } - } - return true; - } - } - return false; - } - - @Override - // Implements abstract method. - public int - hashCode() { - if (this.hashCode != 0) { - return this.hashCode; - } - int code = 0; - for (Element element : this.elements) { - code += element.unit.hashCode() * (element.pow * 3 - element.root * 2); - } - this.hashCode = code; - return code; - } - - @Override - @SuppressWarnings({ "unchecked", "rawtypes" }) - public Unit getStandardUnit() { - if (hasOnlyStandardUnit()) { - return this; - } - Unit systemUnit = ONE; - for (Element element : this.elements) { - Unit unit = element.unit.getStandardUnit(); - unit = unit.pow(element.pow); - unit = unit.root(element.root); - systemUnit = systemUnit.times(unit); - } - return systemUnit; - } - - @Override - public UnitConverter toStandardUnit() { - if (hasOnlyStandardUnit()) { - return UnitConverter.IDENTITY; - } - UnitConverter converter = UnitConverter.IDENTITY; - for (Element element : this.elements) { - UnitConverter cvtr = element.unit.toStandardUnit(); - if (!cvtr.isLinear()) { - throw new ConversionException(element.unit + " is non-linear, cannot convert"); - } - if (element.root != 1) { - throw new ConversionException(element.unit + " holds a base unit with fractional exponent"); - } - int pow = element.pow; - if (pow < 0) { // Negative power. - pow = -pow; - cvtr = cvtr.inverse(); - } - for (int j = 0; j < pow; j++) { - converter = converter.concatenate(cvtr); - } - } - return converter; - } - - /** - * Indicates if this product unit is a standard unit. - * - * @return true if all elements are standard units; false otherwise. - */ - private boolean hasOnlyStandardUnit() { - for (Element element : this.elements) { - Unit u = element.unit; - if (!u.isStandardUnit()) { - return false; - } - } - return true; - } - - /** - * Returns the greatest common divisor (Euclid's algorithm). - * - * @param m - * the first number. - * @param nn - * the second number. - * @return the greatest common divisor. - */ - private static int gcd(int m, int n) { - if (n == 0) { - return m; - } else { - return gcd(n, m % n); - } - } - - /** - * Inner product element represents a rational power of a single unit. - */ - private static final class Element implements Serializable { - - /** - * Holds the single unit. - */ - private final Unit unit; - - /** - * Holds the power exponent. - */ - private final int pow; - - /** - * Holds the root exponent. - */ - private final int root; - - /** - * Structural constructor. - * - * @param unit - * the unit. - * @param pow - * the power exponent. - * @param root - * the root exponent. - */ - private Element(Unit unit, int pow, int root) { - this.unit = unit; - this.pow = pow; - this.root = root; - } - - /** - * Returns this element's unit. - * - * @return the single unit. - */ - public Unit getUnit() { - return this.unit; - } - - /** - * Returns the power exponent. The power exponent can be negative but is always different from zero. - * - * @return the power exponent of the single unit. - */ - public int getPow() { - return this.pow; - } - - /** - * Returns the root exponent. The root exponent is always greater than zero. - * - * @return the root exponent of the single unit. - */ - public int getRoot() { - return this.root; - } - - private static final long serialVersionUID = 1L; - } - - private static final long serialVersionUID = 1L; -} diff --git a/flexiblepower.api/src/javax/measure/unit/SI.java b/flexiblepower.api/src/javax/measure/unit/SI.java deleted file mode 100755 index a835843..0000000 --- a/flexiblepower.api/src/javax/measure/unit/SI.java +++ /dev/null @@ -1,693 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.unit; - -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - -import javax.measure.converter.MultiplyConverter; -import javax.measure.converter.RationalConverter; -import javax.measure.quantity.Acceleration; -import javax.measure.quantity.AmountOfSubstance; -import javax.measure.quantity.Angle; -import javax.measure.quantity.Area; -import javax.measure.quantity.CatalyticActivity; -import javax.measure.quantity.DataAmount; -import javax.measure.quantity.Duration; -import javax.measure.quantity.ElectricCapacitance; -import javax.measure.quantity.ElectricCharge; -import javax.measure.quantity.ElectricConductance; -import javax.measure.quantity.ElectricCurrent; -import javax.measure.quantity.ElectricInductance; -import javax.measure.quantity.ElectricPotential; -import javax.measure.quantity.ElectricResistance; -import javax.measure.quantity.Energy; -import javax.measure.quantity.Force; -import javax.measure.quantity.Frequency; -import javax.measure.quantity.Illuminance; -import javax.measure.quantity.Length; -import javax.measure.quantity.LuminousFlux; -import javax.measure.quantity.LuminousIntensity; -import javax.measure.quantity.MagneticFlux; -import javax.measure.quantity.MagneticFluxDensity; -import javax.measure.quantity.Mass; -import javax.measure.quantity.Power; -import javax.measure.quantity.Pressure; -import javax.measure.quantity.Quantity; -import javax.measure.quantity.RadiationDoseAbsorbed; -import javax.measure.quantity.RadiationDoseEffective; -import javax.measure.quantity.RadioactiveActivity; -import javax.measure.quantity.SolidAngle; -import javax.measure.quantity.Temperature; -import javax.measure.quantity.Velocity; -import javax.measure.quantity.Volume; - -/** - * This class contains SI (Système International d'Unités) base units, and derived units. - * - * It also defines the 20 SI prefixes used to form decimal multiples and submultiples of SI units. For example: - * - *
- * import static javax.measure.unit.SI.*;
- * ...
- * 
- * Unit<Pressure> HECTO_PASCAL = HECTO(PASCAL);
- * Unit<Length> KILO_METER = KILO(METER);
- * 
- * - * @author Jean-Marie Dautelle - * @version 4.2, August 26, 2006 - * @see Wikipedia: SI - * @see Wikipedia: SI prefix - */ -public final class SI extends SystemOfUnits { - - /** - * Holds collection of SI units. - */ - private static HashSet> units = new HashSet>(); - - /** - * Default constructor (prevents this class from being instantiated). - */ - private SI() { - } - - /** - * Returns the unique instance of this class. - * - * @return the SI instance. - */ - public static SI getInstance() { - return INSTANCE; - } - - private static final SI INSTANCE = new SI(); - - // ////////////// - // BASE UNITS // - // ////////////// - - /** - * The base unit for electric current quantities (A). The Ampere is that constant current which, if - * maintained in two straight parallel conductors of infinite length, of negligible circular cross-section, and - * placed 1 metre apart in vacuum, would produce between these conductors a force equal to 2 × 10-7 newton per metre - * of length. It is named after the French physicist Andre Ampere (1775-1836). - */ - public static final BaseUnit AMPERE = si(new BaseUnit("A")); - - /** - * The base unit for luminous intensity quantities (cd). The candela is the luminous intensity, in a - * given direction, of a source that emits monochromatic radiation of frequency 540 × 1012 hertz and that has a - * radiant intensity in that direction of 1/683 watt per steradian - * - * @see Wikipedia: Candela - */ - public static final BaseUnit CANDELA = si(new BaseUnit("cd")); - - /** - * The base unit for thermodynamic temperature quantities (K). The kelvin is the 1/273.16th of the - * thermodynamic temperature of the triple point of water. It is named after the Scottish mathematician and - * physicist William Thomson 1st Lord Kelvin (1824-1907) - */ - public static final BaseUnit KELVIN = si(new BaseUnit("K")); - - /** - * The base unit for mass quantities (kg). It is the only SI unit with a prefix as part of its name and - * symbol. The kilogram is equal to the mass of an international prototype in the form of a platinum-iridium - * cylinder kept at Sevres in France. - * - * @see #GRAM - */ - public static final BaseUnit KILOGRAM = si(new BaseUnit("kg")); - - /** - * The base unit for length quantities (m). One meter was redefined in 1983 as the distance traveled by - * light in a vacuum in 1/299,792,458 of a second. - */ - public static final BaseUnit METRE = si(new BaseUnit("m")); - - /** - * Equivalent to {@link #METRE} (American spelling). - */ - public static final Unit METER = METRE; - - /** - * The base unit for amount of substance quantities (mol). The mole is the amount of substance of a - * system which contains as many elementary entities as there are atoms in 0.012 kilogram of carbon 12. - */ - public static final BaseUnit MOLE = si(new BaseUnit("mol")); - - /** - * The base unit for duration quantities (s). It is defined as the duration of 9,192,631,770 cycles of - * radiation corresponding to the transition between two hyperfine levels of the ground state of cesium (1967 - * Standard). - */ - public static final BaseUnit SECOND = si(new BaseUnit("s")); - - // ////////////////////////////// - // SI DERIVED ALTERNATE UNITS // - // ////////////////////////////// - - /** - * The derived unit for mass quantities (g). The base unit for mass quantity is {@link #KILOGRAM}. - */ - public static final Unit GRAM = KILOGRAM.divide(1000); - - /** - * The unit for plane angle quantities (rad). One radian is the angle between two radii of a circle - * such that the length of the arc between them is equal to the radius. - */ - public static final AlternateUnit RADIAN = si(new AlternateUnit("rad", Unit.ONE)); - - /** - * The unit for solid angle quantities (sr). One steradian is the solid angle subtended at the center - * of a sphere by an area on the surface of the sphere that is equal to the radius squared. The total solid angle of - * a sphere is 4*Pi steradians. - */ - public static final AlternateUnit STERADIAN = si(new AlternateUnit("sr", Unit.ONE)); - - /** - * The unit for binary information (bit). - */ - public static final AlternateUnit BIT = si(new AlternateUnit("bit", Unit.ONE)); - - /** - * The derived unit for frequency (Hz). A unit of frequency equal to one cycle per second. After - * Heinrich Rudolf Hertz (1857-1894), German physicist who was the first to produce radio waves artificially. - */ - public static final AlternateUnit HERTZ = si(new AlternateUnit("Hz", Unit.ONE.divide(SECOND))); - - /** - * The derived unit for force (N). One newton is the force required to give a mass of 1 kilogram an - * Force of 1 metre per second per second. It is named after the English mathematician and physicist Sir Isaac - * Newton (1642-1727). - */ - public static final AlternateUnit NEWTON = si(new AlternateUnit("N", METRE.times(KILOGRAM) - .divide(SECOND.pow(2)))); - - /** - * The derived unit for pressure, stress (Pa). One pascal is equal to one newton per square meter. It - * is named after the French philosopher and mathematician Blaise Pascal (1623-1662). - */ - public static final AlternateUnit PASCAL = si(new AlternateUnit("Pa", - NEWTON.divide(METRE.pow(2)))); - - /** - * The derived unit for energy, work, quantity of heat (J). One joule is the amount of work done when - * an applied force of 1 newton moves through a distance of 1 metre in the direction of the force. It is named after - * the English physicist James Prescott Joule (1818-1889). - */ - public static final AlternateUnit JOULE = si(new AlternateUnit("J", NEWTON.times(METRE))); - - /** - * The derived unit for power, radiant, flux (W). One watt is equal to one joule per second. It is - * named after the British scientist James Watt (1736-1819). - */ - public static final AlternateUnit WATT = si(new AlternateUnit("W", JOULE.divide(SECOND))); - - /** - * The derived unit for electric charge, quantity of electricity (C). One Coulomb is equal to the - * quantity of charge transferred in one second by a steady current of one ampere. It is named after the French - * physicist Charles Augustin de Coulomb (1736-1806). - */ - public static final AlternateUnit COULOMB = si(new AlternateUnit("C", - SECOND.times(AMPERE))); - - /** - * The derived unit for electric potential difference, electromotive force (V). One Volt is equal to - * the difference of electric potential between two points on a conducting wire carrying a constant current of one - * ampere when the power dissipated between the points is one watt. It is named after the Italian physicist Count - * Alessandro Volta (1745-1827). - */ - public static final AlternateUnit VOLT = si(new AlternateUnit("V", - WATT.divide(AMPERE))); - - /** - * The derived unit for capacitance (F). One Farad is equal to the capacitance of a capacitor having an - * equal and opposite charge of 1 coulomb on each plate and a potential difference of 1 volt between the plates. It - * is named after the British physicist and chemist Michael Faraday (1791-1867). - */ - public static final AlternateUnit FARAD = si(new AlternateUnit("F", - COULOMB.divide(VOLT))); - - /** - * The derived unit for electric resistance (Ω or Ohm). One Ohm is equal to the resistance - * of a conductor in which a current of one ampere is produced by a potential of one volt across its terminals. It - * is named after the German physicist Georg Simon Ohm (1789-1854). - */ - public static final AlternateUnit OHM = si(new AlternateUnit("Ω", - VOLT.divide(AMPERE))); - - /** - * The derived unit for electric conductance (S). One Siemens is equal to one ampere per volt. It is - * named after the German engineer Ernst Werner von Siemens (1816-1892). - */ - public static final AlternateUnit SIEMENS = si(new AlternateUnit("S", - AMPERE.divide(VOLT))); - - /** - * The derived unit for magnetic flux (Wb). One Weber is equal to the magnetic flux that in linking a - * circuit of one turn produces in it an electromotive force of one volt as it is uniformly reduced to zero within - * one second. It is named after the German physicist Wilhelm Eduard Weber (1804-1891). - */ - public static final AlternateUnit WEBER = si(new AlternateUnit("Wb", VOLT.times(SECOND))); - - /** - * The derived unit for magnetic flux density (T). One Tesla is equal equal to one weber per square - * meter. It is named after the Serbian-born American electrical engineer and physicist Nikola Tesla (1856-1943). - */ - public static final AlternateUnit TESLA = si(new AlternateUnit("T", - WEBER.divide(METRE.pow(2)))); - - /** - * The derived unit for inductance (H). One Henry is equal to the inductance for which an induced - * electromotive force of one volt is produced when the current is varied at the rate of one ampere per second. It - * is named after the American physicist Joseph Henry (1791-1878). - */ - public static final AlternateUnit HENRY = si(new AlternateUnit("H", - WEBER.divide(AMPERE))); - - /** - * The derived unit for Celsius temperature (). This is a unit of temperature such as the freezing - * point of water (at one atmosphere of pressure) is 0 ℃, while the boiling point is 100 ℃. - */ - public static final Unit CELSIUS = si(KELVIN.plus(273.15)); - - /** - * The derived unit for luminous flux (lm). One Lumen is equal to the amount of light given out through - * a solid angle by a source of one candela intensity radiating equally in all directions. - */ - public static final AlternateUnit LUMEN = si(new AlternateUnit("lm", - CANDELA.times(STERADIAN))); - - /** - * The derived unit for illuminance (lx). One Lux is equal to one lumen per square meter. - */ - public static final AlternateUnit LUX = si(new AlternateUnit("lx", - LUMEN.divide(METRE.pow(2)))); - - /** - * The derived unit for activity of a radionuclide (Bq). One becquerel is the radiation caused by one - * disintegration per second. It is named after the French physicist, Antoine-Henri Becquerel (1852-1908). - */ - public static final AlternateUnit BECQUEREL = si(new AlternateUnit("Bq", - Unit.ONE.divide(SECOND))); - - /** - * The derived unit for absorbed dose, specific energy (imparted), kerma (Gy). One gray is equal to the - * dose of one joule of energy absorbed per one kilogram of matter. It is named after the British physician L. H. - * Gray (1905-1965). - */ - public static final AlternateUnit GRAY = si(new AlternateUnit("Gy", - JOULE.divide(KILOGRAM))); - - /** - * The derived unit for dose equivalent (Sv). One Sievert is equal is equal to the actual dose, in - * grays, multiplied by a "quality factor" which is larger for more dangerous forms of radiation. It is named after - * the Swedish physicist Rolf Sievert (1898-1966). - */ - public static final AlternateUnit SIEVERT = si(new AlternateUnit("Sv", - JOULE.divide(KILOGRAM))); - - /** - * The derived unit for catalytic activity (kat). - */ - public static final AlternateUnit KATAL = si(new AlternateUnit("kat", - MOLE.divide(SECOND))); - - // //////////////////////////// - // SI DERIVED PRODUCT UNITS // - // //////////////////////////// - - /** - * The metric unit for velocity quantities (m/s). - */ - public static final Unit METRES_PER_SECOND = si(new ProductUnit(METRE.divide(SECOND))); - - /** - * Equivalent to {@link #METRES_PER_SECOND}. - */ - public static final Unit METERS_PER_SECOND = METRES_PER_SECOND; - - /** - * The metric unit for acceleration quantities (m/s²). - */ - public static final Unit METRES_PER_SQUARE_SECOND = si(new ProductUnit(METRES_PER_SECOND.divide(SECOND))); - - /** - * Equivalent to {@link #METRES_PER_SQUARE_SECOND}. - */ - public static final Unit METERS_PER_SQUARE_SECOND = METRES_PER_SQUARE_SECOND; - - /** - * The metric unit for area quantities (). - */ - public static final Unit SQUARE_METRE = si(new ProductUnit(METRE.times(METRE))); - - /** - * The metric unit for volume quantities (). - */ - public static final Unit CUBIC_METRE = si(new ProductUnit(SQUARE_METRE.times(METRE))); - - /** - * Equivalent to KILO(METRE). - */ - public static final Unit KILOMETRE = METER.times(1000); - - /** - * Equivalent to {@link #KILOMETRE}. - */ - public static final Unit KILOMETER = KILOMETRE; - - /** - * Equivalent to CENTI(METRE). - */ - public static final Unit CENTIMETRE = METRE.divide(100); - - /** - * Equivalent to {@link #CENTIMETRE}. - */ - public static final Unit CENTIMETER = CENTIMETRE; - - /** - * Equivalent to MILLI(METRE). - */ - public static final Unit MILLIMETRE = METRE.divide(1000); - - /** - * Equivalent to {@link #MILLIMETRE}. - */ - public static final Unit MILLIMETER = MILLIMETRE; - - // /////////////// - // SI PREFIXES // - // /////////////// - - /** - * Returns the specified unit multiplied by the factor 1024 - * - * @param unit - * any unit. - * @return unit.multiply(1e24). - */ - public static Unit YOTTA(Unit unit) { - return unit.transform(E24); - } - - /** - * Returns the specified unit multiplied by the factor 1021 - * - * @param unit - * any unit. - * @return unit.multiply(1e21). - */ - public static Unit ZETTA(Unit unit) { - return unit.transform(E21); - } - - /** - * Returns the specified unit multiplied by the factor 1018 - * - * @param unit - * any unit. - * @return unit.multiply(1e18). - */ - public static Unit EXA(Unit unit) { - return unit.transform(E18); - } - - /** - * Returns the specified unit multiplied by the factor 1015 - * - * @param unit - * any unit. - * @return unit.multiply(1e15). - */ - public static Unit PETA(Unit unit) { - return unit.transform(E15); - } - - /** - * Returns the specified unit multiplied by the factor 1012 - * - * @param unit - * any unit. - * @return unit.multiply(1e12). - */ - public static Unit TERA(Unit unit) { - return unit.transform(E12); - } - - /** - * Returns the specified unit multiplied by the factor 109 - * - * @param unit - * any unit. - * @return unit.multiply(1e9). - */ - public static Unit GIGA(Unit unit) { - return unit.transform(E9); - } - - /** - * Returns the specified unit multiplied by the factor 106 - * - * @param unit - * any unit. - * @return unit.multiply(1e6). - */ - public static Unit MEGA(Unit unit) { - return unit.transform(E6); - } - - /** - * Returns the specified unit multiplied by the factor 103 - * - * @param unit - * any unit. - * @return unit.multiply(1e3). - */ - public static Unit KILO(Unit unit) { - return unit.transform(E3); - } - - /** - * Returns the specified unit multiplied by the factor 102 - * - * @param unit - * any unit. - * @return unit.multiply(1e2). - */ - public static Unit HECTO(Unit unit) { - return unit.transform(E2); - } - - /** - * Returns the specified unit multiplied by the factor 101 - * - * @param unit - * any unit. - * @return unit.multiply(1e1). - */ - public static Unit DEKA(Unit unit) { - return unit.transform(E1); - } - - /** - * Returns the specified unit multiplied by the factor 10-1 - * - * @param unit - * any unit. - * @return unit.multiply(1e-1). - */ - public static Unit DECI(Unit unit) { - return unit.transform(Em1); - } - - /** - * Returns the specified unit multiplied by the factor 10-2 - * - * @param unit - * any unit. - * @return unit.multiply(1e-2). - */ - public static Unit CENTI(Unit unit) { - return unit.transform(Em2); - } - - /** - * Returns the specified unit multiplied by the factor 10-3 - * - * @param unit - * any unit. - * @return unit.multiply(1e-3). - */ - public static Unit MILLI(Unit unit) { - return unit.transform(Em3); - } - - /** - * Returns the specified unit multiplied by the factor 10-6 - * - * @param unit - * any unit. - * @return unit.multiply(1e-6). - */ - public static Unit MICRO(Unit unit) { - return unit.transform(Em6); - } - - /** - * Returns the specified unit multiplied by the factor 10-9 - * - * @param unit - * any unit. - * @return unit.multiply(1e-9). - */ - public static Unit NANO(Unit unit) { - return unit.transform(Em9); - } - - /** - * Returns the specified unit multiplied by the factor 10-12 - * - * @param unit - * any unit. - * @return unit.multiply(1e-12). - */ - public static Unit PICO(Unit unit) { - return unit.transform(Em12); - } - - /** - * Returns the specified unit multiplied by the factor 10-15 - * - * @param unit - * any unit. - * @return unit.multiply(1e-15). - */ - public static Unit FEMTO(Unit unit) { - return unit.transform(Em15); - } - - /** - * Returns the specified unit multiplied by the factor 10-18 - * - * @param unit - * any unit. - * @return unit.multiply(1e-18). - */ - public static Unit ATTO(Unit unit) { - return unit.transform(Em18); - } - - /** - * Returns the specified unit multiplied by the factor 10-21 - * - * @param unit - * any unit. - * @return unit.multiply(1e-21). - */ - public static Unit ZEPTO(Unit unit) { - return unit.transform(Em21); - } - - /** - * Returns the specified unit multiplied by the factor 10-24 - * - * @param unit - * any unit. - * @return unit.multiply(1e-24). - */ - public static Unit YOCTO(Unit unit) { - return unit.transform(Em24); - } - - // /////////////////// - // Collection View // - // /////////////////// - - /** - * Returns a read only view over theunits defined in this class. - * - * @return the collection of SI units. - */ - @Override - public Set> getUnits() { - return Collections.unmodifiableSet(units); - } - - /** - * Adds a new unit to the collection. - * - * @param unit - * the unit being added. - * @return unit. - */ - private static > U si(U unit) { - units.add(unit); - return unit; - } - - // Holds prefix converters (optimization). - - static final MultiplyConverter E24 = new MultiplyConverter(1E24); - - static final MultiplyConverter E21 = new MultiplyConverter(1E21); - - static final RationalConverter E18 = new RationalConverter(1000000000000000000L, 1); - - static final RationalConverter E15 = new RationalConverter(1000000000000000L, 1); - - static final RationalConverter E12 = new RationalConverter(1000000000000L, 1); - - static final RationalConverter E9 = new RationalConverter(1000000000L, 1); - - static final RationalConverter E6 = new RationalConverter(1000000L, 1); - - static final RationalConverter E3 = new RationalConverter(1000L, 1); - - static final RationalConverter E2 = new RationalConverter(100L, 1); - - static final RationalConverter E1 = new RationalConverter(10L, 1); - - static final RationalConverter Em1 = new RationalConverter(1, 10L); - - static final RationalConverter Em2 = new RationalConverter(1, 100L); - - static final RationalConverter Em3 = new RationalConverter(1, 1000L); - - static final RationalConverter Em6 = new RationalConverter(1, 1000000L); - - static final RationalConverter Em9 = new RationalConverter(1, 1000000000L); - - static final RationalConverter Em12 = new RationalConverter(1, 1000000000000L); - - static final RationalConverter Em15 = new RationalConverter(1, 1000000000000000L); - - static final RationalConverter Em18 = new RationalConverter(1, 1000000000000000000L); - - static final MultiplyConverter Em21 = new MultiplyConverter(1E-21); - - static final MultiplyConverter Em24 = new MultiplyConverter(1E-24); - - /** - * @deprecated replaced by {@link #METRES_PER_SECOND}. - */ - @Deprecated - public static final Unit METRE_PER_SECOND = METRES_PER_SECOND; - - /** - * @deprecated replaced by {@link #METRES_PER_SQUARE_SECOND}. - */ - @Deprecated - public static final Unit METRE_PER_SQUARE_SECOND = METRES_PER_SQUARE_SECOND; -} diff --git a/flexiblepower.api/src/javax/measure/unit/SystemOfUnits.java b/flexiblepower.api/src/javax/measure/unit/SystemOfUnits.java deleted file mode 100755 index 29367dc..0000000 --- a/flexiblepower.api/src/javax/measure/unit/SystemOfUnits.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.unit; - -import java.util.Set; - -/** - *

- * This class represents a system of units, it groups units together for historical or cultural reasons. Nothing - * prevents a unit from belonging to several system of units at the same time (for example an imperial system would have - * many of the units held by {@link NonSI}). - *

- * - * @author Jean-Marie Dautelle - * @version 4.2, August 26, 2007 - */ -public abstract class SystemOfUnits { - - /** - * Returns a read only view over the units defined in this system. - * - * @return the collection of units. - */ - public abstract Set> getUnits(); - -} diff --git a/flexiblepower.api/src/javax/measure/unit/TransformedUnit.java b/flexiblepower.api/src/javax/measure/unit/TransformedUnit.java deleted file mode 100755 index cd3cb88..0000000 --- a/flexiblepower.api/src/javax/measure/unit/TransformedUnit.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.unit; - -import javax.measure.converter.UnitConverter; -import javax.measure.quantity.Quantity; - -/** - *

- * This class represents the units derived from other units using {@link UnitConverter converters}. - *

- * - *

- * Examples of transformed units:[code] CELSIUS = KELVIN.add(273.15); FOOT = METER.multiply(0.3048); MILLISECOND = - * MILLI(SECOND); [/code] - *

- * - *

- * Transformed units have no label. But like any other units, they may have labels attached to them:[code] - * UnitFormat.getStandardInstance().label(FOOT, "ft"); [/code] or aliases: [code] - * UnitFormat.getStandardInstance().alias(CENTI(METER)), "centimeter"); - * UnitFormat.getStandardInstance().alias(CENTI(METER)), "centimetre"); [/code] - *

- * - * @author Jean-Marie Dautelle - * @version 3.1, April 22, 2006 - * @see Unit#plus(double) - * @see Unit#times(double) - * @see Unit#transform(UnitConverter) - * @see UnitFormat - */ -public final class TransformedUnit extends DerivedUnit { - - /** - * Holds the parent unit (not a transformed unit). - */ - private final Unit parentUnit; - - /** - * Holds the converter to the parent unit. - */ - private final UnitConverter toParentUnit; - - /** - * Creates a transformed unit from the specified parent unit. - * - * @param parentUnit - * the untransformed unit from which this unit is derived. - * @param toParentUnit - * the converter to the parent units. - * @throws IllegalArgumentException - * if toParentUnit == - * {@link UnitConverter#IDENTITY UnitConverter.IDENTITY} - */ - TransformedUnit(Unit parentUnit, UnitConverter toParentUnit) { - if (toParentUnit == UnitConverter.IDENTITY) { - throw new IllegalArgumentException("Identity not allowed"); - } - this.parentUnit = parentUnit; - this.toParentUnit = toParentUnit; - } - - /** - * Returns the parent unit for this unit. The parent unit is the untransformed unit from which this unit is derived. - * - * @return the untransformed unit from which this unit is derived. - */ - public Unit getParentUnit() { - return this.parentUnit; - } - - /** - * Returns the converter to the parent unit. - * - * @return the converter to the parent unit. - */ - public UnitConverter toParentUnit() { - return this.toParentUnit; - } - - /** - * Indicates if this transformed unit is considered equals to the specified object (both are transformed units with - * equal parent unit and equal converter to parent unit). - * - * @param that - * the object to compare for equality. - * @return true if this and that are considered equals; false - * otherwise. - */ - @Override - public boolean equals(Object that) { - if (this == that) { - return true; - } - if (!(that instanceof TransformedUnit)) { - return false; - } - TransformedUnit thatUnit = (TransformedUnit) that; - return this.parentUnit.equals(thatUnit.parentUnit) && this.toParentUnit.equals(thatUnit.toParentUnit); - } - - // Implements abstract method. - @Override - public int hashCode() { - return this.parentUnit.hashCode() + this.toParentUnit.hashCode(); - } - - // Implements abstract method. - @Override - public Unit getStandardUnit() { - return this.parentUnit.getStandardUnit(); - } - - // Implements abstract method. - @Override - public UnitConverter toStandardUnit() { - return this.parentUnit.toStandardUnit().concatenate(this.toParentUnit); - } - - private static final long serialVersionUID = 1L; - -} diff --git a/flexiblepower.api/src/javax/measure/unit/Unit.java b/flexiblepower.api/src/javax/measure/unit/Unit.java deleted file mode 100755 index 155b276..0000000 --- a/flexiblepower.api/src/javax/measure/unit/Unit.java +++ /dev/null @@ -1,513 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.unit; - -import java.io.Serializable; -import java.text.ParseException; -import java.text.ParsePosition; -import java.util.HashMap; - -import javax.measure.MeasureFormat; -import javax.measure.converter.AddConverter; -import javax.measure.converter.ConversionException; -import javax.measure.converter.MultiplyConverter; -import javax.measure.converter.RationalConverter; -import javax.measure.converter.UnitConverter; -import javax.measure.quantity.Dimensionless; -import javax.measure.quantity.Quantity; - -/** - * This class represents a determinate {@link javax.measure.quantity.Quantity quantity} (as of length, time, heat, or - * value) adopted as a standard of measurement. - * - * It is helpful to think of instances of this class as recording the history by which they are created. Thus, for - * example, the string "g/kg" (which is a dimensionless unit) would result from invoking the method toString() on a unit - * that was created by dividing a gram unit by a kilogram unit. Yet, "kg" divided by "kg" returns {@link #ONE} and not - * "kg/kg" due to automatic unit factorization. - * - * This class supports the multiplication of offsets units. The result is usually a unit not convertible to its - * {@link #getStandardUnit standard unit}. Such units may appear in derivative quantities. For example °C/m is an unit - * of gradient, which is common in atmospheric and oceanographic research. - * - * Units raised at rational powers are also supported. For example the cubic root of "liter" is a unit compatible with - * meter. - * - * Instances of this class are immutable. - * - * @author Jean-Marie Dautelle - * @author Steve Emmerson - * @author Martin Desruisseaux - * @version 3.2, August 28, 2006 - * @see Wikipedia: Units of measurement - * @param - * The quantity - */ -public abstract class Unit implements Serializable { - private static final long serialVersionUID = -3618398112494824857L; - - /** - * Holds the dimensionless unit ONE. - */ - public static final Unit ONE = new ProductUnit(); - - /** - * Holds the unique symbols collection (base unit or alternate units). - */ - static final HashMap> SYMBOL_TO_UNIT = new HashMap>(); - - /** - * Default constructor. - */ - protected Unit() { - } - - // //////////////////////////////////////////////////// - // Contract methods (for sub-classes to implement). // - // //////////////////////////////////////////////////// - - /** - * Returns the {@link BaseUnit base unit}, {@link AlternateUnit alternate unit} or product of base units and - * alternate units this unit is derived from. The standard unit identifies the "type" of - * {@link javax.measure.quantity.Quantity quantity} for which this unit is employed. For example: - * - *
-     * boolean isAngularVelocity(Unit<?> u) {
-     *   return u.getStandardUnit().equals(RADIAN.divide(SECOND));
-     * }
-     * assert(REVOLUTION.divide(MINUTE).isAngularVelocity());
-     * 
- * - *

- * Note: Having the same system unit is not sufficient to ensure that a converter exists between the two units - * (e.g. °C/m and K/m). - *

- * - * @return the system unit this unit is derived from. - */ - public abstract Unit getStandardUnit(); - - /** - * Returns the converter from this unit to its system unit. - * - * @return this.getConverterTo(this.getSystemUnit()) - */ - public abstract UnitConverter toStandardUnit(); - - /** - * Returns the hash code for this unit. - * - * @return this unit hashcode value. - */ - @Override - public abstract int hashCode(); - - /** - * Indicates if the specified unit can be considered equals to the one specified. - * - * @param that - * the object to compare to. - * @return true if this unit is considered equal to that unit; false otherwise. - */ - @Override - public abstract boolean equals(Object that); - - /** - * Indicates if this unit is a standard unit (base units and alternate units are standard units). The standard unit - * identifies the "type" of {@link javax.measure.quantity.Quantity quantity} for which the unit is employed. - * - * @return getStandardUnit().equals(this) - */ - public boolean isStandardUnit() { - return getStandardUnit().equals(this); - } - - /** - * Indicates if this unit is compatible with the unit specified. Units don't need to be equals to be compatible. For - * example:[code] RADIAN.equals(ONE) == false RADIAN.isCompatible(ONE) == true [/code] - * - * @param that - * the other unit. - * @return this.getDimension().equals(that.getDimension()) - * @see #getDimension() - */ - public final boolean isCompatible(Unit that) { - return (this == that) || this.getStandardUnit().equals(that.getStandardUnit()) - || this.getDimension().equals(that.getDimension()); - } - - /** - * Casts this unit to a parameterized unit of specified nature or throw a ClassCastException if the - * dimension of the specified quantity and this unit's dimension do not match. For example: - * - *
-     * Unit<Length> LIGHT_YEAR = NonSI.C.times(NonSI.YEAR).asType(Length.class);
-     * 
- * - * @param type - * the quantity class identifying the nature of the unit. - * @return this unit parameterized with the specified type. - * @throws ClassCastException - * if the dimension of this unit is different from the specified quantity dimension. - * @throws UnsupportedOperationException - * if the specified quantity class does not have a public static field named "UNIT" holding the standard - * unit for the quantity. - */ - @SuppressWarnings("unchecked") - public final Unit asType(Class type) throws ClassCastException { - Dimension dim1 = this.getDimension(); - Unit u = null; - try { - u = (Unit) type.getField("UNIT").get(null); - } catch (Exception e) { - throw new Error(e); - } - Dimension dim2 = u.getDimension(); - if (!dim1.equals(dim2)) { - throw new ClassCastException(); - } - return (Unit) this; - } - - /** - * Returns the dimension of this unit (depends upon the current dimensional {@link Dimension.Model model}). - * - * @return the dimension of this unit for the current model. - */ - public final Dimension getDimension() { - Unit systemUnit = this.getStandardUnit(); - if (systemUnit instanceof BaseUnit) { - return Dimension.getModel().getDimension((BaseUnit) systemUnit); - } - if (systemUnit instanceof AlternateUnit) { - return ((AlternateUnit) systemUnit).getParent().getDimension(); - } - // Product of units. - ProductUnit productUnit = (ProductUnit) systemUnit; - Dimension dimension = Dimension.NONE; - for (int i = 0; i < productUnit.getUnitCount(); i++) { - Unit unit = productUnit.getUnit(i); - Dimension d = unit.getDimension().pow(productUnit.getUnitPow(i)).root(productUnit.getUnitRoot(i)); - dimension = dimension.times(d); - } - return dimension; - } - - /** - * Returns a converter of numeric values from this unit to another unit. - * - * @param that - * the unit to which to convert the numeric values. - * @return the converter from this unit to that unit. - * @throws ConversionException - * if the conveter cannot be constructed (e.g. !this.isCompatible(that)). - */ - public final UnitConverter getConverterTo(Unit that) throws ConversionException { - if (this.equals(that)) { - return UnitConverter.IDENTITY; - } - Unit thisSystemUnit = this.getStandardUnit(); - Unit thatSystemUnit = that.getStandardUnit(); - if (thisSystemUnit.equals(thatSystemUnit)) { - return that.toStandardUnit().inverse().concatenate(this.toStandardUnit()); - } - // Use dimensional transforms. - if (!thisSystemUnit.getDimension().equals(thatSystemUnit.getDimension())) { - throw new ConversionException(this + " is not compatible with " + that); - } - // Transform between SystemUnit and BaseUnits is Identity. - UnitConverter thisTransform = this.toStandardUnit().concatenate(transformOf(this.getBaseUnits())); - UnitConverter thatTransform = that.toStandardUnit().concatenate(transformOf(that.getBaseUnits())); - return thatTransform.inverse().concatenate(thisTransform); - } - - private Unit getBaseUnits() { - Unit systemUnit = this.getStandardUnit(); - if (systemUnit instanceof BaseUnit) { - return systemUnit; - } - if (systemUnit instanceof AlternateUnit) { - return ((AlternateUnit) systemUnit).getParent().getBaseUnits(); - } - if (systemUnit instanceof ProductUnit) { - ProductUnit productUnit = (ProductUnit) systemUnit; - Unit baseUnits = ONE; - for (int i = 0; i < productUnit.getUnitCount(); i++) { - Unit unit = productUnit.getUnit(i).getBaseUnits(); - unit = unit.pow(productUnit.getUnitPow(i)); - unit = unit.root(productUnit.getUnitRoot(i)); - baseUnits = baseUnits.times(unit); - } - return baseUnits; - } else { - throw new InternalError("System Unit cannot be an instance of " + this.getClass()); - } - } - - private static UnitConverter transformOf(Unit baseUnits) { - if (baseUnits instanceof BaseUnit) { - return Dimension.getModel().getTransform((BaseUnit) baseUnits); - } - // Product of units. - ProductUnit productUnit = (ProductUnit) baseUnits; - UnitConverter converter = UnitConverter.IDENTITY; - for (int i = 0; i < productUnit.getUnitCount(); i++) { - Unit unit = productUnit.getUnit(i); - UnitConverter cvtr = transformOf(unit); - if (!cvtr.isLinear()) { - throw new ConversionException(baseUnits + " is non-linear, cannot convert"); - } - if (productUnit.getUnitRoot(i) != 1) { - throw new ConversionException(productUnit + " holds a base unit with fractional exponent"); - } - int pow = productUnit.getUnitPow(i); - if (pow < 0) { // Negative power. - pow = -pow; - cvtr = cvtr.inverse(); - } - for (int j = 0; j < pow; j++) { - converter = converter.concatenate(cvtr); - } - } - return converter; - } - - /** - * Returns a unit equivalent to this unit but used in expressions to distinguish between quantities of a different - * nature but of the same dimensions. - * - * Examples of alternate units: - * - *
-     * Unit<Angle> RADIAN = ONE.alternate("rad");
-     * Unit<Force> NEWTON = METER.times(KILOGRAM).divide(SECOND.pow(2)).alternate("N");
-     * Unit<Pressure> PASCAL = NEWTON.divide(METER.pow(2)).alternate("Pa");
-     * 
- * - * @param symbol - * the new symbol for the alternate unit. - * @return the alternate unit. - * @throws UnsupportedOperationException - * if this unit is not a standard unit. - * @throws IllegalArgumentException - * if the specified symbol is already associated to a different unit. - */ - public final AlternateUnit alternate(String symbol) { - return new AlternateUnit(symbol, this); - } - - /** - * Returns the combination of this unit with the specified sub-unit. Compound units are typically used for - * formatting purpose. Examples of compound units:[code] HOUR_MINUTE = NonSI.HOUR.compound(NonSI.MINUTE); - * DEGREE_MINUTE_SECOND_ANGLE = NonSI.DEGREE_ANGLE.compound( NonSI.DEGREE_MINUTE).compound(NonSI.SECOND_ANGLE); - * [/code] - * - * @param subunit - * the sub-unit to combine with this unit. - * @return the corresponding compound unit. - */ - public final CompoundUnit compound(Unit subunit) { - return new CompoundUnit(this, subunit); - } - - /** - * Returns the unit derived from this unit using the specified converter. The converter does not need to be linear. - * For example: - * - *
-     * Unit<Dimensionless> DECIBEL = Unit.ONE.transform(new LogConverter(10).inverse()
-     *                                                                      .concatenate(new RationalConverter(1, 10)));
-     * 
- * - * @param operation - * the converter from the transformed unit to this unit. - * @return the unit after the specified transformation. - */ - public final Unit transform(UnitConverter operation) { - if (this instanceof TransformedUnit) { - TransformedUnit tf = (TransformedUnit) this; - Unit parent = tf.getParentUnit(); - UnitConverter toParent = tf.toParentUnit().concatenate(operation); - if (toParent == UnitConverter.IDENTITY) { - return parent; - } - return new TransformedUnit(parent, toParent); - } - if (operation == UnitConverter.IDENTITY) { - return this; - } - return new TransformedUnit(this, operation); - } - - /** - * Returns the result of adding an offset to this unit. The returned unit is convertible with all units that are - * convertible with this unit. - * - * @param offset - * the offset added (expressed in this unit, e.g. CELSIUS = KELVIN.plus(273.15)). - * @return this.transform(new AddConverter(offset)) - */ - public final Unit plus(double offset) { - return transform(new AddConverter(offset)); - } - - /** - * Returns the result of multiplying this unit by an exact factor. - * - * @param factor - * the exact scale factor (e.g. KILOMETER = METER.times(1000)). - * @return this.transform(new RationalConverter(factor, 1)) - */ - public final Unit times(long factor) { - return transform(new RationalConverter(factor, 1)); - } - - /** - * Returns the result of multiplying this unit by a an approximate factor - * - * @param factor - * the approximate factor (e.g. ELECTRON_MASS = KILOGRAM.times(9.10938188e-31)). - * @return this.transform(new MultiplyConverter(factor)) - */ - public final Unit times(double factor) { - return transform(new MultiplyConverter(factor)); - } - - /** - * Returns the product of this unit with the one specified. - * - * @param that - * the unit multiplicand. - * @return this * that - */ - public final Unit times(Unit that) { - return ProductUnit.getProductInstance(this, that); - } - - /** - * Returns the inverse of this unit. - * - * @return 1 / this - */ - public final Unit inverse() { - return ProductUnit.getQuotientInstance(ONE, this); - } - - /** - * Returns the result of dividing this unit by an exact divisor. - * - * @param divisor - * the exact divisor. (e.g. QUART = GALLON_LIQUID_US.divide(4)). - * @return this.transform(new RationalConverter(1 , divisor)) - */ - public final Unit divide(long divisor) { - return transform(new RationalConverter(1, divisor)); - } - - /** - * Returns the result of dividing this unit by an approximate divisor. - * - * @param divisor - * the approximate divisor. - * @return this.transform(new MultiplyConverter(1.0 / divisor)) - */ - public final Unit divide(double divisor) { - return transform(new MultiplyConverter(1.0 / divisor)); - } - - /** - * Returns the quotient of this unit with the one specified. - * - * @param that - * the unit divisor. - * @return this / that - */ - public final Unit divide(Unit that) { - return this.times(that.inverse()); - } - - /** - * Returns a unit equals to the given root of this unit. - * - * @param n - * the root's order. - * @return the result of taking the given root of this unit. - * @throws ArithmeticException - * if n == 0. - */ - public final Unit root(int n) { - if (n > 0) { - return ProductUnit.getRootInstance(this, n); - } else if (n == 0) { - throw new ArithmeticException("Root's order of zero"); - } else { // n < 0 - return ONE.divide(this.root(-n)); - } - } - - /** - * Returns a unit equals to this unit raised to an exponent. - * - * @param n - * the exponent. - * @return the result of raising this unit to the exponent. - */ - public final Unit pow(int n) { - if (n > 0) { - return this.times(this.pow(n - 1)); - } else if (n == 0) { - return ONE; - } else { // n < 0 - return ONE.divide(this.pow(-n)); - } - } - - /** - * Returns a unit instance that is defined from the specified character sequence using the - * {@link UnitFormat#getInstance() standard unit format}. - * - * Examples of valid entries (all for meters per second squared) are: - * - *
-     * m*s-2
-     * m/s²
-     * m·s-²
-     * m*s**-2
-     * m^+1 s^-2
-     * 
- * - * @param csq - * the character sequence to parse. - * @return UnitFormat.getStandardInstance().parse(csq, new ParsePosition(0)) - * @throws IllegalArgumentException - * if the specified character sequence cannot be correctly parsed (e.g. symbol unknown). - */ - public static Unit valueOf(CharSequence csq) { - try { - return UnitFormat.getInstance().parseProductUnit(csq, new ParsePosition(0)); - } catch (ParseException e) { - throw new IllegalArgumentException(e); - } - } - - // //////////////////// - // GENERAL CONTRACT // - // //////////////////// - - /** - * Returns the standard String representation of this unit. This representation is not affected by - * locale. Locale-sensitive unit formatting and parsing is handled by the {@link MeasureFormat} class and its - * subclasses. - * - * @return UnitFormat.getStandardInstance().format(this) - */ - @Override - public final String toString() { - return UnitFormat.getInstance().format(this); - } -} diff --git a/flexiblepower.api/src/javax/measure/unit/UnitFormat.java b/flexiblepower.api/src/javax/measure/unit/UnitFormat.java deleted file mode 100755 index 2c0d1f8..0000000 --- a/flexiblepower.api/src/javax/measure/unit/UnitFormat.java +++ /dev/null @@ -1,1035 +0,0 @@ -/* - * JScience - Java(TM) Tools and Libraries for the Advancement of Sciences. - * Copyright (C) 2006 - JScience (http://jscience.org/) - * All rights reserved. - * - * Permission to use, copy, modify, and distribute this software is - * freely granted, provided that this notice is preserved. - */ -package javax.measure.unit; - -import static javax.measure.unit.SI.E1; -import static javax.measure.unit.SI.E12; -import static javax.measure.unit.SI.E15; -import static javax.measure.unit.SI.E18; -import static javax.measure.unit.SI.E2; -import static javax.measure.unit.SI.E21; -import static javax.measure.unit.SI.E24; -import static javax.measure.unit.SI.E3; -import static javax.measure.unit.SI.E6; -import static javax.measure.unit.SI.E9; -import static javax.measure.unit.SI.Em1; -import static javax.measure.unit.SI.Em12; -import static javax.measure.unit.SI.Em15; -import static javax.measure.unit.SI.Em18; -import static javax.measure.unit.SI.Em2; -import static javax.measure.unit.SI.Em21; -import static javax.measure.unit.SI.Em24; -import static javax.measure.unit.SI.Em3; -import static javax.measure.unit.SI.Em6; -import static javax.measure.unit.SI.Em9; - -import java.io.IOException; -import java.text.FieldPosition; -import java.text.Format; -import java.text.ParseException; -import java.text.ParsePosition; -import java.util.HashMap; -import java.util.Locale; - -//@RETROWEAVER import javolution.text.Appendable; -import javax.measure.converter.AddConverter; -import javax.measure.converter.MultiplyConverter; -import javax.measure.converter.RationalConverter; -import javax.measure.converter.UnitConverter; -import javax.measure.quantity.Quantity; - -/** - *

- * This class provides the interface for formatting and parsing {@link Unit units}. - *

- * - *

- * For all {@link SI} units, the 20 SI prefixes used to form decimal multiples and sub-multiples of SI units are - * recognized. {@link NonSI} units are directly recognized. For example:[code] - * Unit.valueOf("m°C").equals(SI.MILLI(SI.CELSIUS)) Unit.valueOf("kW").equals(SI.KILO(SI.WATT)) - * Unit.valueOf("ft").equals(SI.METER.multiply(0.3048))[/code] - *

- * - * @author
Jean-Marie Dautelle - * @author Eric Russell - * @version 1.3, August 29, 2006 - */ -public abstract class UnitFormat extends Format { - private static final long serialVersionUID = 1098093680937760914L; - - /** - * Holds the standard unit format. - */ - private static final DefaultFormat DEFAULT = new DefaultFormat(); - - /** - * Holds the ASCIIFormat unit format. - */ - private static final ASCIIFormat ASCII = new ASCIIFormat(); - - /** - * Returns the unit format for the default locale (format used by {@link Unit#valueOf(CharSequence) - * Unit.valueOf(CharSequence)} and {@link Unit#toString() Unit.toString()}). - * - * @return the default unit format (locale sensitive). - */ - public static UnitFormat getInstance() { - return UnitFormat.getInstance(Locale.getDefault()); - } - - /** - * Returns the unit format for the specified locale. - * - * @return the unit format for the specified locale. - */ - public static UnitFormat getInstance(Locale inLocale) { - return DEFAULT; // TBD: Implement Locale Format. - } - - /** - * Returns the UCUM international unit format; this - * format uses characters range 0000-007F exclusively and is not locale-sensitive. For example: - * kg.m/s2 - * - * @return the UCUM international format. - */ - public static UnitFormat getUCUMInstance() { - return UnitFormat.ASCII; // TBD - Provide UCUM implementation. - } - - /** - * Base constructor. - */ - protected UnitFormat() { - } - - /** - * Formats the specified unit. - * - * @param unit - * the unit to format. - * @param appendable - * the appendable destination. - * @throws IOException - * if an error occurs. - */ - public abstract Appendable format(Unit unit, Appendable appendable) throws IOException; - - /** - * Parses a sequence of character to produce a unit or a rational product of unit. - * - * @param csq - * the CharSequence to parse. - * @param pos - * an object holding the parsing index and error position. - * @return an {@link Unit} parsed from the character sequence. - * @throws IllegalArgumentException - * if the character sequence contains an illegal syntax. - */ - public abstract Unit - parseProductUnit(CharSequence csq, ParsePosition pos) throws ParseException; - - /** - * Parses a sequence of character to produce a single unit. - * - * @param csq - * the CharSequence to parse. - * @param pos - * an object holding the parsing index and error position. - * @return an {@link Unit} parsed from the character sequence. - * @throws IllegalArgumentException - * if the character sequence does not contain a valid unit identifier. - */ - public abstract Unit parseSingleUnit(CharSequence csq, ParsePosition pos) throws ParseException; - - /** - * Attaches a system-wide label to the specified unit. For example: [code] - * UnitFormat.getInstance().label(DAY.multiply(365), "year"); UnitFormat.getInstance().label(METER.multiply(0.3048), - * "ft"); [/code] If the specified label is already associated to an unit the previous association is discarded or - * ignored. - * - * @param unit - * the unit being labelled. - * @param label - * the new label for this unit. - * @throws IllegalArgumentException - * if the label is not a {@link UnitFormat#isValidIdentifier(String)} valid identifier. - */ - public abstract void label(Unit unit, String label); - - /** - * Attaches a system-wide alias to this unit. Multiple aliases may be attached to the same unit. Aliases are used - * during parsing to recognize different variants of the same unit. For example: [code] - * UnitFormat.getLocaleInstance().alias(METER.multiply(0.3048), "foot"); - * UnitFormat.getLocaleInstance().alias(METER.multiply(0.3048), "feet"); UnitFormat.getLocaleInstance().alias(METER, - * "meter"); UnitFormat.getLocaleInstance().alias(METER, "metre"); [/code] If the specified label is already - * associated to an unit the previous association is discarded or ignored. - * - * @param unit - * the unit being aliased. - * @param alias - * the alias attached to this unit. - * @throws IllegalArgumentException - * if the label is not a {@link UnitFormat#isValidIdentifier(String)} valid identifier. - */ - public abstract void alias(Unit unit, String alias); - - /** - * Indicates if the specified name can be used as unit identifier. - * - * @param name - * the identifier to be tested. - * @return true if the name specified can be used as label or alias for this format;false - * otherwise. - */ - public abstract boolean isValidIdentifier(String name); - - /** - * Formats an unit and appends the resulting text to a given string buffer (implements java.text.Format - * ). - * - * @param unit - * the unit to format. - * @param toAppendTo - * where the text is to be appended - * @param pos - * the field position (not used). - * @return toAppendTo - */ - @Override - public final StringBuffer format(Object unit, final StringBuffer toAppendTo, FieldPosition pos) { - try { - Object dest = toAppendTo; - if (dest instanceof Appendable) { - format((Unit) unit, (Appendable) dest); - } else { // When retroweaver is used to produce 1.4 binaries. - format((Unit) unit, new Appendable() { - - @Override - public Appendable append(char arg0) throws IOException { - toAppendTo.append(arg0); - return null; - } - - @Override - public Appendable append(CharSequence arg0) throws IOException { - toAppendTo.append(arg0); - return null; - } - - @Override - public Appendable append(CharSequence arg0, int arg1, int arg2) throws IOException { - toAppendTo.append(arg0.subSequence(arg1, arg2)); - return null; - } - }); - } - return toAppendTo; - } catch (IOException e) { - throw new Error(e); // Should never happen. - } - } - - /** - * Parses the text from a string to produce an object (implements java.text.Format). - * - * @param source - * the string source, part of which should be parsed. - * @param pos - * the cursor position. - * @return the corresponding unit or null if the string cannot be parsed. - */ - @Override - public final Unit parseObject(String source, ParsePosition pos) { - int start = pos.getIndex(); - try { - return parseProductUnit(source, pos); - } catch (ParseException e) { - pos.setIndex(start); - pos.setErrorIndex(e.getErrorOffset()); - return null; - } - } - - /** - * This class represents an exponent with both a power (numerator) and a root (denominator). - */ - private static class Exponent { - public final int pow; - public final int root; - - public Exponent(int pow, int root) { - this.pow = pow; - this.root = root; - } - } - - /** - * This class represents the standard format. - */ - protected static class DefaultFormat extends UnitFormat { - - /** - * Holds the name to unit mapping. - */ - final HashMap> nameToUnit = new HashMap>(); - - /** - * Holds the unit to name mapping. - */ - final HashMap, String> unitToName = new HashMap, String>(); - - @Override - public void label(Unit unit, String label) { - if (!isValidIdentifier(label)) { - throw new IllegalArgumentException("Label: " + label + " is not a valid identifier."); - } - synchronized (this) { - nameToUnit.put(label, unit); - unitToName.put(unit, label); - } - } - - @Override - public void alias(Unit unit, String alias) { - if (!isValidIdentifier(alias)) { - throw new IllegalArgumentException("Alias: " + alias + " is not a valid identifier."); - } - synchronized (this) { - nameToUnit.put(alias, unit); - } - } - - @Override - public boolean isValidIdentifier(String name) { - if ((name == null) || (name.length() == 0)) { - return false; - } - for (int i = 0; i < name.length(); i++) { - if (!isUnitIdentifierPart(name.charAt(i))) { - return false; - } - } - return true; - } - - static boolean isUnitIdentifierPart(char ch) { - return Character.isLetter(ch) || (!Character.isWhitespace(ch) && !Character.isDigit(ch) - && (ch != '·') - && (ch != '*') - && (ch != '/') - && (ch != '(') - && (ch != ')') - && (ch != '[') - && (ch != ']') - && (ch != '¹') - && (ch != '²') - && (ch != '³') - && (ch != '^') - && (ch != '+') && (ch != '-')); - } - - // Returns the name for the specified unit or null if product unit. - public String nameFor(Unit unit) { - // Searches label database. - String label = unitToName.get(unit); - if (label != null) { - return label; - } - if (unit instanceof BaseUnit) { - return ((BaseUnit) unit).getSymbol(); - } - if (unit instanceof AlternateUnit) { - return ((AlternateUnit) unit).getSymbol(); - } - if (unit instanceof TransformedUnit) { - TransformedUnit tfmUnit = (TransformedUnit) unit; - Unit baseUnits = tfmUnit.getStandardUnit(); - UnitConverter cvtr = tfmUnit.toStandardUnit(); - StringBuffer result = new StringBuffer(); - String baseUnitName = baseUnits.toString(); - if ((baseUnitName.indexOf('·') >= 0) || (baseUnitName.indexOf('*') >= 0) - || (baseUnitName.indexOf('/') >= 0)) { - // We could use parentheses whenever baseUnits is an - // instanceof ProductUnit, but most ProductUnits have aliases, - // so we'd end up with a lot of unnecessary parentheses. - result.append('('); - result.append(baseUnitName); - result.append(')'); - } else { - result.append(baseUnitName); - } - if (cvtr instanceof AddConverter) { - result.append('+'); - result.append(((AddConverter) cvtr).getOffset()); - } else if (cvtr instanceof RationalConverter) { - long dividend = ((RationalConverter) cvtr).getDividend(); - if (dividend != 1) { - result.append('*'); - result.append(dividend); - } - long divisor = ((RationalConverter) cvtr).getDivisor(); - if (divisor != 1) { - result.append('/'); - result.append(divisor); - } - } else if (cvtr instanceof MultiplyConverter) { - result.append('*'); - result.append(((MultiplyConverter) cvtr).getFactor()); - } else { // Other converters. - return "[" + baseUnits + "?]"; - } - return result.toString(); - } - // Compound unit. - if (unit instanceof CompoundUnit) { - CompoundUnit cpdUnit = (CompoundUnit) unit; - return nameFor(cpdUnit.getHigher()).toString() + ":" + nameFor(cpdUnit.getLower()); - } - return null; // Product unit. - } - - // Returns the unit for the specified name. - public Unit unitFor(String name) { - Unit unit = nameToUnit.get(name); - if (unit != null) { - return unit; - } - unit = Unit.SYMBOL_TO_UNIT.get(name); - return unit; - } - - // ////////////////////////// - // Parsing. - - @Override - @SuppressWarnings({ "unchecked", "rawtypes" }) - public Unit parseSingleUnit(CharSequence csq, ParsePosition pos) throws ParseException { - int startIndex = pos.getIndex(); - String name = readIdentifier(csq, pos); - Unit unit = unitFor(name); - check(unit != null, name + " not recognized", csq, startIndex); - return unit; - } - - @Override - public Unit parseProductUnit(CharSequence csq, ParsePosition pos) throws ParseException { - Unit result = Unit.ONE; - int token = nextToken(csq, pos); - switch (token) { - case IDENTIFIER: - result = parseSingleUnit(csq, pos); - break; - case OPEN_PAREN: - pos.setIndex(pos.getIndex() + 1); - result = parseProductUnit(csq, pos); - token = nextToken(csq, pos); - check(token == CLOSE_PAREN, "')' expected", csq, pos.getIndex()); - pos.setIndex(pos.getIndex() + 1); - break; - } - token = nextToken(csq, pos); - while (true) { - switch (token) { - case EXPONENT: - Exponent e = readExponent(csq, pos); - if (e.pow != 1) { - result = result.pow(e.pow); - } - if (e.root != 1) { - result = result.root(e.root); - } - break; - case MULTIPLY: - pos.setIndex(pos.getIndex() + 1); - token = nextToken(csq, pos); - if (token == INTEGER) { - long n = readLong(csq, pos); - if (n != 1) { - result = result.times(n); - } - } else if (token == FLOAT) { - double d = readDouble(csq, pos); - if (d != 1.0) { - result = result.times(d); - } - } else { - result = result.times(parseProductUnit(csq, pos)); - } - break; - case DIVIDE: - pos.setIndex(pos.getIndex() + 1); - token = nextToken(csq, pos); - if (token == INTEGER) { - long n = readLong(csq, pos); - if (n != 1) { - result = result.divide(n); - } - } else if (token == FLOAT) { - double d = readDouble(csq, pos); - if (d != 1.0) { - result = result.divide(d); - } - } else { - result = result.divide(parseProductUnit(csq, pos)); - } - break; - case PLUS: - pos.setIndex(pos.getIndex() + 1); - token = nextToken(csq, pos); - if (token == INTEGER) { - long n = readLong(csq, pos); - if (n != 1) { - result = result.plus(n); - } - } else if (token == FLOAT) { - double d = readDouble(csq, pos); - if (d != 1.0) { - result = result.plus(d); - } - } else { - throw new ParseException("not a number", pos.getIndex()); - } - break; - case EOF: - case CLOSE_PAREN: - return result; - default: - throw new ParseException("unexpected token " + token, pos.getIndex()); - } - token = nextToken(csq, pos); - } - } - - private static final int EOF = 0; - private static final int IDENTIFIER = 1; - private static final int OPEN_PAREN = 2; - private static final int CLOSE_PAREN = 3; - private static final int EXPONENT = 4; - private static final int MULTIPLY = 5; - private static final int DIVIDE = 6; - private static final int PLUS = 7; - private static final int INTEGER = 8; - private static final int FLOAT = 9; - - private int nextToken(CharSequence csq, ParsePosition pos) { - final int length = csq.length(); - while (pos.getIndex() < length) { - char c = csq.charAt(pos.getIndex()); - if (isUnitIdentifierPart(c)) { - return IDENTIFIER; - } else if (c == '(') { - return OPEN_PAREN; - } else if (c == ')') { - return CLOSE_PAREN; - } else if ((c == '^') || (c == '¹') || (c == '²') || (c == '³')) { - return EXPONENT; - } else if (c == '*') { - char c2 = csq.charAt(pos.getIndex() + 1); - if (c2 == '*') { - return EXPONENT; - } else { - return MULTIPLY; - } - } else if (c == '·') { - return MULTIPLY; - } else if (c == '/') { - return DIVIDE; - } else if (c == '+') { - return PLUS; - } else if ((c == '-') || Character.isDigit(c)) { - int index = pos.getIndex() + 1; - while ((index < length) && (Character.isDigit(c) || (c == '-') || (c == '.') || (c == 'E'))) { - c = csq.charAt(index++); - if (c == '.') { - return FLOAT; - } - } - return INTEGER; - } - pos.setIndex(pos.getIndex() + 1); - } - return EOF; - } - - private void check(boolean expr, String message, CharSequence csq, int index) throws ParseException { - if (!expr) { - throw new ParseException(message + " (in " + csq + " at index " + index + ")", index); - } - } - - private Exponent readExponent(CharSequence csq, ParsePosition pos) { - char c = csq.charAt(pos.getIndex()); - if (c == '^') { - pos.setIndex(pos.getIndex() + 1); - } else if (c == '*') { - pos.setIndex(pos.getIndex() + 2); - } - final int length = csq.length(); - int pow = 0; - boolean isPowNegative = false; - int root = 0; - boolean isRootNegative = false; - boolean isRoot = false; - while (pos.getIndex() < length) { - c = csq.charAt(pos.getIndex()); - if (c == '¹') { - if (isRoot) { - root = root * 10 + 1; - } else { - pow = pow * 10 + 1; - } - } else if (c == '²') { - if (isRoot) { - root = root * 10 + 2; - } else { - pow = pow * 10 + 2; - } - } else if (c == '³') { - if (isRoot) { - root = root * 10 + 3; - } else { - pow = pow * 10 + 3; - } - } else if (c == '-') { - if (isRoot) { - isRootNegative = true; - } else { - isPowNegative = true; - } - } else if ((c >= '0') && (c <= '9')) { - if (isRoot) { - root = root * 10 + (c - '0'); - } else { - pow = pow * 10 + (c - '0'); - } - } else if (c == ':') { - isRoot = true; - } else { - break; - } - pos.setIndex(pos.getIndex() + 1); - } - if (pow == 0) { - pow = 1; - } - if (root == 0) { - root = 1; - } - return new Exponent(isPowNegative ? -pow : pow, isRootNegative ? -root : root); - } - - private long readLong(CharSequence csq, ParsePosition pos) { - final int length = csq.length(); - int result = 0; - boolean isNegative = false; - while (pos.getIndex() < length) { - char c = csq.charAt(pos.getIndex()); - if (c == '-') { - isNegative = true; - } else if ((c >= '0') && (c <= '9')) { - result = result * 10 + (c - '0'); - } else { - break; - } - pos.setIndex(pos.getIndex() + 1); - } - return isNegative ? -result : result; - } - - private double readDouble(CharSequence csq, ParsePosition pos) { - final int length = csq.length(); - int start = pos.getIndex(); - int end = start + 1; - while (end < length) { - if ("012356789+-.E".indexOf(csq.charAt(end)) < 0) { - break; - } - end += 1; - } - pos.setIndex(end + 1); - return Double.parseDouble(csq.subSequence(start, end).toString()); - } - - private String readIdentifier(CharSequence csq, ParsePosition pos) { - final int length = csq.length(); - int start = pos.getIndex(); - int i = start; - while ((++i < length) && isUnitIdentifierPart(csq.charAt(i))) { - } - pos.setIndex(i); - return csq.subSequence(start, i).toString(); - } - - // ////////////////////////// - // Formatting. - - @Override - public Appendable format(Unit unit, Appendable appendable) throws IOException { - String name = nameFor(unit); - if (name != null) { - return appendable.append(name); - } - if (!(unit instanceof ProductUnit)) { - throw new IllegalArgumentException("Cannot format given Object as a Unit"); - } - - // Product unit. - ProductUnit productUnit = (ProductUnit) unit; - int invNbr = 0; - - // Write positive exponents first. - boolean start = true; - for (int i = 0; i < productUnit.getUnitCount(); i++) { - int pow = productUnit.getUnitPow(i); - if (pow >= 0) { - if (!start) { - appendable.append('·'); // Separator. - } - name = nameFor(productUnit.getUnit(i)); - int root = productUnit.getUnitRoot(i); - append(appendable, name, pow, root); - start = false; - } else { - invNbr++; - } - } - - // Write negative exponents. - if (invNbr != 0) { - if (start) { - appendable.append('1'); // e.g. 1/s - } - appendable.append('/'); - if (invNbr > 1) { - appendable.append('('); - } - start = true; - for (int i = 0; i < productUnit.getUnitCount(); i++) { - int pow = productUnit.getUnitPow(i); - if (pow < 0) { - name = nameFor(productUnit.getUnit(i)); - int root = productUnit.getUnitRoot(i); - if (!start) { - appendable.append('·'); // Separator. - } - append(appendable, name, -pow, root); - start = false; - } - } - if (invNbr > 1) { - appendable.append(')'); - } - } - return appendable; - } - - private void append(Appendable appendable, CharSequence symbol, int pow, int root) throws IOException { - appendable.append(symbol); - if ((pow != 1) || (root != 1)) { - // Write exponent. - if ((pow == 2) && (root == 1)) { - appendable.append('²'); // Square - } else if ((pow == 3) && (root == 1)) { - appendable.append('³'); // Cubic - } else { - // Use general exponent form. - appendable.append('^'); - appendable.append(String.valueOf(pow)); - if (root != 1) { - appendable.append(':'); - appendable.append(String.valueOf(root)); - } - } - } - } - - private static final long serialVersionUID = 1L; - } - - /** - * This class represents the ASCIIFormat format. - */ - protected static class ASCIIFormat extends DefaultFormat { - - @Override - public String nameFor(Unit unit) { - // First search if specific ASCII name should be used. - String name = unitToName.get(unit); - if (name != null) { - return name; - } - // Else returns default name. - return DEFAULT.nameFor(unit); - } - - @Override - public Unit unitFor(String name) { - // First search if specific ASCII name. - Unit unit = nameToUnit.get(name); - if (unit != null) { - return unit; - } - // Else returns default mapping. - return DEFAULT.unitFor(name); - } - - @Override - public Appendable format(Unit unit, Appendable appendable) throws IOException { - String name = nameFor(unit); - if (name != null) { - return appendable.append(name); - } - if (!(unit instanceof ProductUnit)) { - throw new IllegalArgumentException("Cannot format given Object as a Unit"); - } - - ProductUnit productUnit = (ProductUnit) unit; - for (int i = 0; i < productUnit.getUnitCount(); i++) { - if (i != 0) { - appendable.append('*'); // Separator. - } - name = nameFor(productUnit.getUnit(i)); - int pow = productUnit.getUnitPow(i); - int root = productUnit.getUnitRoot(i); - appendable.append(name); - if ((pow != 1) || (root != 1)) { - // Use general exponent form. - appendable.append('^'); - appendable.append(String.valueOf(pow)); - if (root != 1) { - appendable.append(':'); - appendable.append(String.valueOf(root)); - } - } - } - return appendable; - } - - private static final long serialVersionUID = 1L; - } - - // ////////////////////////////////////////////////////////////////////////// - // Initializes the standard unit database for SI units. - - private static final Unit[] SI_UNITS = { SI.AMPERE, - SI.BECQUEREL, - SI.CANDELA, - SI.COULOMB, - SI.FARAD, - SI.GRAY, - SI.HENRY, - SI.HERTZ, - SI.JOULE, - SI.KATAL, - SI.KELVIN, - SI.LUMEN, - SI.LUX, - SI.METRE, - SI.MOLE, - SI.NEWTON, - SI.OHM, - SI.PASCAL, - SI.RADIAN, - SI.SECOND, - SI.SIEMENS, - SI.SIEVERT, - SI.STERADIAN, - SI.TESLA, - SI.VOLT, - SI.WATT, - SI.WEBER }; - - private static final String[] PREFIXES = { "Y", - "Z", - "E", - "P", - "T", - "G", - "M", - "k", - "h", - "da", - "d", - "c", - "m", - "µ", - "n", - "p", - "f", - "a", - "z", - "y" }; - - private static final UnitConverter[] CONVERTERS = { E24, - E21, - E18, - E15, - E12, - E9, - E6, - E3, - E2, - E1, - Em1, - Em2, - Em3, - Em6, - Em9, - Em12, - Em15, - Em18, - Em21, - Em24 }; - - private static String asciiPrefix(String prefix) { - return prefix == "µ" ? "micro" : prefix; - } - - static { - for (Unit si : SI_UNITS) { - for (int j = 0; j < PREFIXES.length; j++) { - Unit u = si.transform(CONVERTERS[j]); - String symbol = (si instanceof BaseUnit) ? ((BaseUnit) si).getSymbol() - : ((AlternateUnit) si).getSymbol(); - DEFAULT.label(u, PREFIXES[j] + symbol); - if (PREFIXES[j] == "µ") { - ASCII.label(u, "micro" + symbol); - } - } - } - // Special case for KILOGRAM. - DEFAULT.label(SI.GRAM, "g"); - for (int i = 0; i < PREFIXES.length; i++) { - if (CONVERTERS[i] == E3) { - continue; // kg is already defined. - } - DEFAULT.label(SI.KILOGRAM.transform(CONVERTERS[i].concatenate(Em3)), PREFIXES[i] + "g"); - if (PREFIXES[i] == "µ") { - ASCII.label(SI.KILOGRAM.transform(CONVERTERS[i].concatenate(Em3)), "microg"); - } - } - - // Alias and ASCIIFormat for Ohm - DEFAULT.alias(SI.OHM, "Ohm"); - ASCII.label(SI.OHM, "Ohm"); - for (int i = 0; i < PREFIXES.length; i++) { - DEFAULT.alias(SI.OHM.transform(CONVERTERS[i]), PREFIXES[i] + "Ohm"); - ASCII.label(SI.OHM.transform(CONVERTERS[i]), asciiPrefix(PREFIXES[i]) + "Ohm"); - } - - // Special case for DEGREE_CElSIUS. - DEFAULT.label(SI.CELSIUS, "℃"); - DEFAULT.alias(SI.CELSIUS, "°C"); - ASCII.label(SI.CELSIUS, "Celsius"); - for (int i = 0; i < PREFIXES.length; i++) { - DEFAULT.label(SI.CELSIUS.transform(CONVERTERS[i]), PREFIXES[i] + "℃"); - DEFAULT.alias(SI.CELSIUS.transform(CONVERTERS[i]), PREFIXES[i] + "°C"); - ASCII.label(SI.CELSIUS.transform(CONVERTERS[i]), asciiPrefix(PREFIXES[i]) + "Celsius"); - } - } - - // ////////////////////////////////////////////////////////////////////////// - // To be moved in resource bundle in future release (locale dependent). - static { - DEFAULT.label(NonSI.PERCENT, "%"); - DEFAULT.label(NonSI.DECIBEL, "dB"); - DEFAULT.label(NonSI.G, "grav"); - DEFAULT.label(NonSI.ATOM, "atom"); - DEFAULT.label(NonSI.REVOLUTION, "rev"); - DEFAULT.label(NonSI.DEGREE_ANGLE, "°"); - ASCII.label(NonSI.DEGREE_ANGLE, "degree_angle"); - DEFAULT.label(NonSI.MINUTE_ANGLE, "'"); - DEFAULT.label(NonSI.SECOND_ANGLE, "\""); - DEFAULT.label(NonSI.CENTIRADIAN, "centiradian"); - DEFAULT.label(NonSI.GRADE, "grade"); - DEFAULT.label(NonSI.ARE, "a"); - DEFAULT.label(NonSI.HECTARE, "ha"); - DEFAULT.label(NonSI.BYTE, "byte"); - DEFAULT.label(NonSI.MINUTE, "min"); - DEFAULT.label(NonSI.HOUR, "h"); - DEFAULT.label(NonSI.DAY, "day"); - DEFAULT.label(NonSI.WEEK, "week"); - DEFAULT.label(NonSI.YEAR, "year"); - DEFAULT.label(NonSI.MONTH, "month"); - DEFAULT.label(NonSI.DAY_SIDEREAL, "day_sidereal"); - DEFAULT.label(NonSI.YEAR_SIDEREAL, "year_sidereal"); - DEFAULT.label(NonSI.YEAR_CALENDAR, "year_calendar"); - DEFAULT.label(NonSI.E, "e"); - DEFAULT.label(NonSI.FARADAY, "Fd"); - DEFAULT.label(NonSI.FRANKLIN, "Fr"); - DEFAULT.label(NonSI.GILBERT, "Gi"); - DEFAULT.label(NonSI.ERG, "erg"); - DEFAULT.label(NonSI.ELECTRON_VOLT, "eV"); - DEFAULT.label(NonSI.KWH, "kWh"); - DEFAULT.label(SI.KILO(NonSI.ELECTRON_VOLT), "keV"); - DEFAULT.label(SI.MEGA(NonSI.ELECTRON_VOLT), "MeV"); - DEFAULT.label(SI.GIGA(NonSI.ELECTRON_VOLT), "GeV"); - DEFAULT.label(NonSI.LAMBERT, "La"); - DEFAULT.label(NonSI.FOOT, "ft"); - DEFAULT.label(NonSI.FOOT_SURVEY_US, "foot_survey_us"); - DEFAULT.label(NonSI.YARD, "yd"); - DEFAULT.label(NonSI.INCH, "in"); - DEFAULT.label(NonSI.MILE, "mi"); - DEFAULT.label(NonSI.NAUTICAL_MILE, "nmi"); - DEFAULT.label(NonSI.MILES_PER_HOUR, "mph"); - DEFAULT.label(NonSI.ANGSTROM, "Å"); - ASCII.label(NonSI.ANGSTROM, "Angstrom"); - DEFAULT.label(NonSI.ASTRONOMICAL_UNIT, "ua"); - DEFAULT.label(NonSI.LIGHT_YEAR, "ly"); - DEFAULT.label(NonSI.PARSEC, "pc"); - DEFAULT.label(NonSI.POINT, "pt"); - DEFAULT.label(NonSI.PIXEL, "pixel"); - DEFAULT.label(NonSI.MAXWELL, "Mx"); - DEFAULT.label(NonSI.GAUSS, "G"); - DEFAULT.label(NonSI.ATOMIC_MASS, "u"); - DEFAULT.label(NonSI.ELECTRON_MASS, "me"); - DEFAULT.label(NonSI.POUND, "lb"); - DEFAULT.label(NonSI.OUNCE, "oz"); - DEFAULT.label(NonSI.TON_US, "ton_us"); - DEFAULT.label(NonSI.TON_UK, "ton_uk"); - DEFAULT.label(NonSI.METRIC_TON, "t"); - DEFAULT.label(NonSI.DYNE, "dyn"); - DEFAULT.label(NonSI.KILOGRAM_FORCE, "kgf"); - DEFAULT.label(NonSI.POUND_FORCE, "lbf"); - DEFAULT.label(NonSI.HORSEPOWER, "hp"); - DEFAULT.label(NonSI.ATMOSPHERE, "atm"); - DEFAULT.label(NonSI.BAR, "bar"); - DEFAULT.label(NonSI.MILLIMETER_OF_MERCURY, "mmHg"); - DEFAULT.label(NonSI.INCH_OF_MERCURY, "inHg"); - DEFAULT.label(NonSI.RAD, "rd"); - DEFAULT.label(NonSI.REM, "rem"); - DEFAULT.label(NonSI.CURIE, "Ci"); - DEFAULT.label(NonSI.RUTHERFORD, "Rd"); - DEFAULT.label(NonSI.SPHERE, "sphere"); - DEFAULT.label(NonSI.RANKINE, "°R"); - ASCII.label(NonSI.RANKINE, "degree_rankine"); - DEFAULT.label(NonSI.FAHRENHEIT, "°F"); - ASCII.label(NonSI.FAHRENHEIT, "degree_fahrenheit"); - DEFAULT.label(NonSI.KNOT, "kn"); - DEFAULT.label(NonSI.MACH, "Mach"); - DEFAULT.label(NonSI.C, "c"); - DEFAULT.label(NonSI.LITRE, "L"); - DEFAULT.label(SI.MICRO(NonSI.LITRE), "µL"); - ASCII.label(SI.MICRO(NonSI.LITRE), "microL"); - DEFAULT.label(SI.MILLI(NonSI.LITRE), "mL"); - DEFAULT.label(SI.CENTI(NonSI.LITRE), "cL"); - DEFAULT.label(SI.DECI(NonSI.LITRE), "dL"); - DEFAULT.label(NonSI.GALLON_LIQUID_US, "gal"); - DEFAULT.label(NonSI.OUNCE_LIQUID_US, "oz"); - DEFAULT.label(NonSI.GALLON_DRY_US, "gallon_dry_us"); - DEFAULT.label(NonSI.GALLON_UK, "gallon_uk"); - DEFAULT.label(NonSI.OUNCE_LIQUID_UK, "oz_uk"); - DEFAULT.label(NonSI.ROENTGEN, "Roentgen"); - if (Locale.getDefault().getCountry().equals("GB")) { - DEFAULT.label(NonSI.GALLON_UK, "gal"); - DEFAULT.label(NonSI.OUNCE_LIQUID_UK, "oz"); - } - } -} diff --git a/flexiblepower.api/src/javax/measure/unit/doc-files/momey.png b/flexiblepower.api/src/javax/measure/unit/doc-files/momey.png deleted file mode 100755 index e9209f8be8827dfc95e51e102038185ee7912069..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151854 zcmV)gK%~EkP)WFU8GbZ8({Xk{QrNlj4iWF>9@03ZNKL_t(|+U&hqjAU7Q z-}gJ)T_YkhE32xP>211uW_o&NJR~R!1PBV?lR$u!Wmq&M88mDQ^gNd}QA{i<#;3s$SxbEQj zu#>;L_6eGvDEUqr67Qoa`2lo#KlKlPd;k1Uehp{lp?12wlDJWY_L=8$2*fyX!wW^U1p_-tk9;B*UHa zn8q#c2(X-bd)03Jcl`sxfAalaNO6w$#7DM{@3GM>cJg=E|G?;9ypNW`2Nqyas=shwpPsR}i|!In-`hof?knfq-?XJ&`=Pb?{U{svVO)Z98_y(6 z;@!p^cAkn|`_bdO_tE($rQZ*`Pq@<{-|@??-493513ktIl-UQ)$oVmlkKzKliDy1{ zb}hE4OM3SV?^BZx91-pMkKTWj*ICBA==Hz}@^i1dMp4drfOhn->+d)JeN=;;3+VR; zD&pmb|K4srcm2KEe;z>f;$!pS-T3OXD{jx_6Y50XV-qLdGH=YFm^n&Yd=)F4?j8v#*R1c1I?U^SY5dH?=lbWche6R z(d^ni5p3e4%e)8c(VrR)X9YvJxBxuvXlK_RY##jRM)SQiBKQa!@43x)$3wezujxPj zi0tnl#)lupNwwpjdq_LUff&!qGO>H~JL6&3?!D0!KS(h+-*#5|uI<`A=fSg^p?LpB zcwr>%2X2JR4^Vi{k839vcI{)**&XyR@2(_@yBWLk!J5ze`1OL~-JQmI@Aa2$G~pCF z*YkcP#q+w%u3-98Z9G_OF~$&M#5spC27tcrDT?eIv+mmW&wbMpinD?*Y}qal5h#2J zNU77`J|dKOaKyIwXok+v_vA$eAtc=>dW6_1KD+iH5U@OFyq`wU96oxKNXTFz2BgUF z9+bKlzkPNSy}Lqo`g<`(LbNCe5kC#t@0M`aK4$Y<`uAgx$_t2+aj;~$`O%nx2c;oI zi=6h++dQke4bgfLkMG(ilAGK8+jF+oQA|eL=@T9XPd?F8jOpB`-~&eO_W%2~dOwVs zhhZ3yQf>{0uInhvl5~iX-C2`G>zpRqZE>J|+wPejDz0rksZNZ7j}Ov@zJOd52i?mpMce- z-`R9a{@O47B5ik!(sFy$;%@zR{rA8BfYO5CJi}lS(vX>&%vAi&Kln$?W_#~*G@sJy zZMlD+H=qE&@QXiB-yRc{L&*^rM=~uzYJ!D;LIzC`5*fq9-+o62_e6g=qX|q=pCEuJ zi73Va>S~|g|NTEC&uSttjt(g$TFagB@Bp~2e_&0WiOrAWh?Ej3B?kuw1aJ92{`cPp z+3!~3V{6}XE0?3VGn5(-WUA(9x#VyB^?#kZDrq(=v?KlS7!7$2N*BOD+paj=n{(2<$E+$4yWH(v`AS#e_JGz5#5?T?snRAipV##L znxa$~Bu)D+RaKucJa%-k>wnn&tIvmc!$GbL@eqAD)~k^Q|HseVnJ z@g!g5D0%>*4-%Xk8M+mh4iAW|7~C4IC16v!U(_kbH+i$t+_sSivD<$>K`-Oz$1z5?bkrSjvkX$D5Z!IGP45<{Ztzdr)f(<2Hx&5Ms_45M9$!&QsV@YeCoFqAWDC zDksKqC%kw4{p-ak+Dw+blgL!mPXH`!zoIG^D6LtoZn9X+aN~%U;)e$NSe9l&b_#S| zOHpLF&=aLaMUTMk)^XQ=tlsF9qNfe`u%T~T+O~nz z#T*E<-A&43!5y_k@s#JsbS)COg z9pBk!c=r2e(LtsSP@JWwL@QOfN7t_?i#-;L3TKzpdxvD1ObXV$!D~JDeC`BNP>LJhM{W&>0$*j{T<97d%7s!e8^m#2kCZufa44SItq!8pLp_ZoiZfB0Q~{qOuI z{L;Vj%l!Ob{+Icyf90?9tN-q=^Y{P$f6I4Ye1qt7>?nvqA*gZQV@$x)PR}QYXfP&w zU?jLe-hsFg#p!D*N)yupOU>vk;1Do9$2qnyfXhG)WJI4QdcxqHVC)r;yhlFvTfsRD zZd%8**?J#{k%>lfVo=k|+%ASCOlxK)nlOnj9Mkm-kgV5DqMzW1L_8iaXXw-rT$sF8 zB{52zw?K}wU`Ijl8t*3j^f2Os1=KX}9Ph(44zZmpu>>mY7^m?7Ea=;GpAg+d-C@gT zr^s8Nhy<*4+i|8jMuxEmGD3*cz0){}nuq~Py4EIow*rF3j}k%#u_Ran6hN7tPqP9P zHn@pL@@ecP-Ws3+)HKJ$cQHz=4e35{dNxr{V>S5Th=l1oV&dIAjn(<>98cxLINE7E zr(-vOq#IU1WVGFMEd%O_pNsAMA!2GM-|jPeq7Xc6w-Bj*NyFJefWPJNzWCct-g+lg7180UmJ+o=v?H~nQMo(RA|oRqTQb&>((gdni)v?i(}&;ntSx5XsC z#Y7t=U3a=aR9?7|ap-{=wwIHvjGu7r z1rR9mihxfu^QX|@^0o{TcQZQgbJ|jr1g8*66KM&u0~Eb)FnLYbx+n#`?FbA&VDKFw z7C2uJaT8sQfW5tEkWDn{Cz&FNglX*}Fk|dbmHljzTWTxcoIBMyA~BM(G?3HhbW;4-^*#2IkD>aQxOzUU1 z`b&&V{E%;Tro_idrx|)b$xyMC&DIN`qS*u@C6SzN@CXbsdc5yYN+4yTDU)gBB+Asz zaQJi^44FZW&744>H=r>4JFpe!! zYLu?=KH_YTHU(16APA(+aCSr>h%ur~!i^R};oL~qttpCqg130*Kq$t+f+&bVVF%AY z_@Dk)e)*UG4K|yezxB8NZGQ7Ne~Ul*qd(?%{>T5BU;X$0Hf6EL*Z#Brg1`G8|ECBguwRW4~B>0 z2PkQilSbUt^Z#)@?&6%5IK3B=Qq=by-UWP!C}j}jtT!8+^%UhLV(|3cDIW>4Y?c&c zH=yKfa_%VdY@hYI1vG+;wjBwfoE!#oVwjYjAds@g=*u+CNQ?_4mw<|*xB?VNRVM|; zTCCkrmNih&G$#mgIv+)|UIP-PGuEpmSzhC8KRK>E-fxg9Bg;$ru|W$>W@ZSHBZNeo zoaik@wU`X?M5Dobge)n`ON7|toI}fs(e@a#plw>DC{cQb_b$y@ClrcnGhVRBtUdrdAzIq@7V||a>>7t9+9onvP}K{{;(1o9Ki#Ha73Jp%0lNO5GP(`p&~teB7a00)f=*r;B}=Ry zaIT}wGqldp+H4~zAp{hLEC=s8l+O8kfA2rXTFY<$_HS``cu1b-AT{0&l(UjAed!B4 z`|Q*F&42A*VZ}8>or} zE+(bDC<+Sm7-a>=C;uM^hftBeU$M9NnFLWeev7LQUj{5nEO4v=M+hXPPzAJ}6QUwF z&!aS)ocvS3Ad!^W)3n{UP%3QzeK%0mGXVO2jTCFLd`{o3Day-u8_2WgD01j}&Un9m<3&z?ssXg04RWXU)*)U#)?_PbcW#@k4d?@^fNAtrDRYe6U&-F2Gv zEvniu^c%`*hPCS{3OF#ET_S`AAv};Vo9|=oiVyEKhxI3AN_Gm31V z7z09R`hG)EWE`Ko#=-toVic3-IHL88zU%ODLs{mykPIe|Cr*cYmh}Q5N{o4uet3a^ zN67{2_L#cbN0MQE$2e@LtIKTK6Uw4Oii{wKG+7k=&>)2;%lE(tY`?+ z^*usn#OTp7Fq<9Hj~$uGSS~j_{=^qJI{tsjWHM6MnGmY@!e> zn;X>ioV=J3@N|tM%Pyz%vF>O(eAi;_3K0wH>L>5ew2Km!%}b2K30a;|RabFNQ<`U~ z%8YIpi9lJU{i|udNuDn#i%TGCKJ(}!ELS6|_McDnAa=?m3Bbr=ah3J@h_dwLc{&KV zD*qw~7=~}8eWP2mSo|b|{WfE`NhS+=dqQDmv_nIcmn=8OEb0S7aNFqV&SKaZ59cFy4vY7Wx_X8@gY_z*hiGN!dW)8y!G%Ak@86{;O0*XAt)-|AfHfgF`Yuq_ z1S~V27Oa;`=6i=IDUc}ge8w;wPw5gfyp51)tZgxRhE$5^14hr0LQ>|>6Fivg z60l;^wX9d)#+Vu(Zy|)>(T9I(nuSgte_?PT5WJ?yi}kMQcqpDW{-_-ZBiH zEZ5}OCC1*76_-)krOh*r=xmQ+yoR$&w8@y|PhxEvhEN5Yb&D~Qsy+ar={F}_efVcs zt^Xe&CXZ0i99()jo$Na#+toV-c#ODAZ(kw!W28z5WFdkS5@!|8TI$)O(;OUH_t?=w zR7jb;o)O31;-M++Ng#DG8O9o8o==-Y0mC?=O@ilV%P9R`#H?@}s;5DLdYksT1ifK(ZyKOs{o)g#MO zJ&IC_7$OIUUzkolPJ2N=f)r5XKSkTVfHG<_{tKK{WLff5J3CSo3t%KOHQsqlmUtr1 z_S5IbfvUQ~ra7jb9Ux)`LQz$R5J%dLMM+0d9YS0&+CW`?nW_Xgf|7?=cZ60IoAr0l zdJj8zs`5#Mggk?x)0B0|yvnd{jnO&fg!3pQMrdv3Zp*@9;z~z*G_EM(Sz?!P0jPMNv$9&p>8!q)KU*ZX7X1P3%u2WIyIDDsJ33CPc|FTFQJM zqceD0P6z77lEHf-fh?;Kkc!Dw!8kay zDmb~dWVuYbT3K8oazd~v8XH4P-;Zdena>}FDMi?gf?<4#;0D|nnAJZ)mO*A<7%f7l zNQ^)bqM^#K0FJ%-3fq&t<1RgEXFS|BbLt|cHiGcX=FcRnb%bHOLD!Geb&b~h2nj|% zi*?r+hBb@Dmnky1e*Got`2ryWSFU^!YhkqCo$j4;`SSCGa2vLHwAV2P+SajGKg0gM z=FNA$!NI{#V<#oBXpFk@$A8Rk{KjuEn^%~uB*B%fFj-E!SyR@@R5iUh2icPa9Rh#}RgT6aX#Ey;63 zRiyQ^{#Ew(Kg%$tO*;rM<{7Mg13UI0GK_wFJ3Q|LN=Zz138OztQ6yRC++gUFh*+|>cpfF8?XHunM>&Pf?)sN0 ztK`j!ZcbHvo@|N`G@BQZiez*QS1F2F%HW+R@7!wj0!6V8^t5e5o|h;kF!>B)o~Fo8 zpU=^h=GCybc#6J*!^5xg);oVnT`j1}=g}Hg>lcYM7_(27Jxh#W?JI;h5UivspMwZR zmJGJ0eTjPZ6y0WIG5FU{!P}+G4t6RZ4ylsITXcnLh#$pvz8LpT10rS0#VL9QS)TqsUftke@hCB*0^8An&KDT@84$4E{232F z{1@1)liXaczr#3=RP%?}Up&gDg`s&>5YaOqk4F3B6~-=u3d zJoe~US*@YB-vViHUZP~i{=rw41p}@C03ZNKL_t)L61x5kVhCJ1c#>v{nkxNu~|oO#QgQWCiQ>d(7uoCSxc2@zs7}GB__EJcSf<${bFXH`(8NC_#h^c<<|K5s=U{nqow9gzauOxEISjASb&mbLWH=BZ zFF@?IFheTwBey;qg+-g~c;mlXnu*3YDSjc+7b6T#Z+1mBbA$zj#?FH@Bd z1CgTm3dCgay!i5;apj>)c-K?p&mbb0?915kMXKUCoP!W0xhcu3oK5!*)}NjYlcBVr zZPy%J-edog;rPU|X;Ovw4dw`yxsuS{;UW@NtD5J^PC<;ytW4-{tYgK9Bcc z#}tj`|nwsHy`popEyFnAOiGC1Eo35B8s6Y<((8)X=rl>8+>pn1p@GX@$%P>M|#U zWM~i}y_M0mHf<2V@$wYT*3vW$N|$)&_>({R6MpXJevU^TeKO^Y$DVd`3zL;t+fr63 z$Ntj(V)9fATxjUpH9!5+Kh0y0J;Cq&-tSM(Sl>3%#5n`)0dK?L&v-EfZQHPz9imN6 zuAinVVZHhucC=*K0wqeS@+;{?-Oy4LGqg$q%czI&E_pqS2BQy|%`Rii-nQJPX;y5e zEIKKmoQ}e1n~qBdpTnrf(Q5LX^xs3NJ*+bXFOr980Oww%8?MuA-k_-Ac=;MigLPm- z&p0Nc9<4;`12*fPs(fr~JXJ;V>}UEZf(!J$W7Aw?Z^5L@9CG!_7YPwY`(}!8SlFx+ zJv#?6WaK7!&w>Y|5(U)N7s<^5N>;>4kY|(OAVr#2S$vLE;3=5Tt^zO)>HUNK=NLLz zo~+4=1xnO_p;;$`>|pP!41>U1O;ue+sX5j`h$BLsKA$(~x+9wA22yF>c;iJ5_U3HX zP*nxich~{C4TPY`^qgVniQ!Z-)M!;QpFM}3KwXADl}yd*FF=e4ie#t+F!Ir~S!d~< z^VyRKa-2__)oIypo6sYVJGe|yDBJ{!bXou_L{eyn!7-m*;nuB_WaJt+y7^Kn zxy_-_PcfT4iw_YOA=5KF4r6kJ5Ck7TrH9j=$xRLrT*PFbM=4mId>t@T&5BkYu;)_((C2SwqG)bwJ#?adiB`tXlU6*KdG5>6G4oNt=^)l5g zrbx87MLWE}(XD@yiekl#gZ*TDZkqI6A{cQQr7B`ba((DvRzFMM!~Wj%8TA-txzB2O zs^nJ`*#fOxdW>L!VGZuU<{^)Y;o|GtZx*EEjl} z{-4cqh9T`kN-mhso?>}&Ti+Oam{m_O3<2u`dvihbp!MThe1al>l)8QzfcXr{{By*Z zv0Qdr-(cGxQPmpgi1b*0bGrw2y=Szi^c5KF1|gv+9!49ub^IMR-BBtgj{{lpFvlmB zet3hrT5RR6QJ+cltJ5A})Wb+&D9S|=ZxJ#x<7Aqjn~Wy`Eas0ufWAw6o`^83K8I4X zDHT+59zE{1mvPsAe2s^wAWTRrv4ohD3g+}}_w(dk8HQVgu*8L9>UqR-b6Xl=as|pV zx(TTVPsHKEh>wsJ;KGPDlF?mfus3LjcUZ1pB?|BnR-1Q#p23aO^$Zk@_S>}m+vEjU z52NoG{Y^%fJZ1fGgH8KgdfO8O)C<8FTAaN`ZzJn=z_~ZM_T~#X_Z~rj)R&nr7Ay`P z24J=NIwngY^Rg^ct%EXr;~U@LXMgr*iD9593PK1}^*$#j?_x}e5Q=s49ubS9!McGM z!<1?Qzw#@;!neNpoev28MIMMldOoD(xk`nxV_-I$QC0h_H%kx_rJ(Jgs0vJ`Sv5yQ z0#YYB7`i3Mi1pwC>>a?(Ti@o^$(xKW<*)*roSdMh@6@ve-S7&F#T@J5#?kk%_Eioq zf1a*SpK01RIl6TX9})sjw~-XtQ8>%j z*HPvQjsKErBzw`3didkl%-)dD+sY?|I!|} zPS(?Uc%tyk7Slc|0!?>9p4aFs@hVuFwxJ)cv0T5xVBe!3+62yVj@a>y?+V z+PuK6<%^Vcx)vC4{*6>$B*4XEmhIc4wlX9ym$OPgh_ykgFj-`UB^$@11^p< z-I~ul{uPkWwnvOMvRuE+YV&5oT8U7W&yZ&o-Pqv0r^suBR-ckBB;4iiw7m#fAf-Wy zB+56<2q^0EA==h%<-1U3O3h0i$SenIU!!S`=m#)4ELSI(VxGM19=h%pF20IY(0k~{ zBR1WdFs;w3eUYeaf~w^fy+1;!jxx)E1=2h>(HJb(FEQBnFj@NFhmLO8P*jsFaj z&RcI^OY%hm!lsNZ4Uv(-TD1ObijKMK1UyCcne=%D@7;QhA*_ia@pjv7*lcd03J?a? z{R<5C+eF>s!gV?aHiC<{u;D#Sbs0Z_SatSoZXUl)yP1@>5Lq`%VoWJuZ@=>bc6<>f za+b>_MR^G!3)=AnM@N)94S=dLsQw-{Zbt31!>#to}Y!fuiVoO_EPz=rf1+>5N%P!tkpE3RJsi)0yCzoKg! z>REy32rnAIp>$IE%i@4d`#t6d({IOyQi=zxxt{P4Bhcb!om=~(?NXx zF1m`?(eICUZ!yH`tY&zvyz@nZp*z~<-(=ZI*!P8-kq#u|pas%|J$+ii>l9`+k zJy{Oxb)+gvhR~#_gn%)$WVs?tVK!}GwK=BmPv@0$iuEjnKql z$+HqrSf9K&){gk#$TE#M&BPO6vQ&t6x)wK&uCupSqqIP(DHUbx*x$c|wWr?YY4cdE z6V{3njIO(#=cmDYOHr0cDH#XHV(%eBNFM%xVo~qYxD9>mFebmLp_t2d^{CHL`IM;CQoUUMNy!X!uvG0!S>AO^Mumo`c$7~P7Sn?GOOrq zk7J-|8l)1R9wqET9+tRq0BHz5d1CkW9!*eg`re$-!ozk+vhX_%VnIuQLeu-3x@4W|SuOXzP-5h~P z_b-YPX(Uo5BQr*eA~4zwy<4TD5(K!=(GAHkC@Z*e;{}XTTl)46oO9H5jZ%pgwbr;e z5V0&43nG?bY^kyt5HPY}bmNb`0u+76a&?nD%P6w~L?FbGJkMAz-yp_RM|ODlc}%8= zjI{l2XH(Oj+}31tigtVZ3Zn&Su8`%QL1#~N&!b^@Nh@3x0!#~8@- zlI3!8(2i@g76_T{-G`now9K=8I@hI$n*r-QM6<2uXqwmYVL)qv_o*n`#}TE&HdS%C zdKVbbX38WPH|*_~jP_MRg!$r8j5?&MpJW`D%w~(EXKm%nMXKx0fcP;t9wuZYapu4! zBt(-U5izA51)GCkQ0AY*_BHqe+>k=tP19gZ!qFc`sOtsY&~48TkP>1LSZfhNQ&o>n zDKYP+bPWZL4(mFqYC6CUMVwGpZf}yw683(omk%oi+| z%MXb3g--qc|%2<6m5_)VqGeTixH%VIG>(v zQlte!1WuOU!(>UwFZMo*)>jcCB2^NE+cWn<$v74)>c2!?{4`gj5)AM8?VbgsMt(-ZTxlF1D!- zN?&0%dyFibZ?8on&1Qo!$%89o^6V73NlMsckW0ygF+LzwAo%gL3(1_iFtOj8Y&RVahAEuEW!TNCt&AOf=wbv$h&o zRQXmUjw1=;SXlgIWNE3{w8spamnOG|X0dph2z33M#F*qmmVK6@d=@bode*%{!~!E_ zkpV7Yri)Jj4{qi5xz}`DYz(L8;!LR$n*o#U;hmoF@Ds0QxndmKElnaEQY2&kRB;+? zM_E_fRMrq8l0{14C_$Ny$cUeu3f^T%QBcTzdS@ub6G;74s_ZApvl=@Y+)^2urXkDn zEgy#%2$NGM%V2aJ0ZW#Z>Gw%|(+{sCg(zz3>Wc^gZTBW7i})}QBh(dW^CU&_EPMM; zZ4G6jCeKQSA^k>-k%6At%<$fyQSuUWvB^?u*5%7zrKqk_mXDxRl2hI%xMJth-Xw%T zi!7nJi3AgFj3MBVNWugx@nau+&{+cDK;W?$nVmuSadh2VtlOiMmSdhlkW&^l%ad0S z0%p}7GJiJh{rx+H=&*4h*f&z){iNhq)mL#itW7C)2+&&M@zZ)iQCwxQcm`vhNb*G` z1jbzFw`ooY%B)PzssKjMu!G#*12Jq>DC>G+Nbtr@7bw&LdyCH|W7fZk^BsN)1tg{3 zrf7Fasdc4%7#a70Iho!|MvjHx6}f&0H%vyxutCT`Bz?c{K?#X<2{L~ip{&vd;Qgs% zPtx@bLJ0c))h&+;0gJ^Kv9{Z3=R4!!Lp;yIfgC{C3Dehc`^*Qnxu1Fd2&P!j_bX=g z6J+M$1cT{dKHJ|a=TfE`2xD@x;`7@aLM?OhtVXM=DWqqw(=;oxgrtb3U{)TmX;T7f zH#SHi$uiAs&ZG#8L_+d9OkQb0Bv<)uZCk%c;q+?cJqU)DvayG*{MOt)C*DX^GMGWlk??2df z;|HEV%o%ULz}l3yB!rp{it-qlLiU?xBnF8fXI6g>BDC!rcyHNTJWdF(Tz!)=*GZ{0 zkD(1LSFa*f;PU0qCFNwiK{u{>6R!J$#X-~yoPhvIE8@Ei^uVy$7C8i zCSjlJE0o!S)yYdpU{+sAMr;Hn)43s*7Gn&{lXn@1O;QpfH0xJbF5klW*_-XtjqR2mH_clFzr@;x7!&NEb)JKR$FL4I?Q4v- zAvbf1;yHwX)%q2D=n*n0e9j8As>zE-wox}J4Vz}f$QieezJncK!;YzFdvGl#Q}{68 zL(1{L{d^v!%xhN5*HbQV_UJYuH;z3;zDKi~Qr3zREpnWVNRm;w*=*2CZs#`)V~RM* z#7|W*r|H&c{TZ?hj*hNT78Txm=JTH*L|880Kp?5>FHz-i^X4l^A=!)@lzud&fsEG} z{YYJ>!tIme>sS{!m|doGL&{5bX*2X5a-%6SLsmSoO~tu!2RJ@?g{r9W zalm8?BCu}$jNIgCeEw>s?~WtgX9edU`k; zcMdcoSb}X1Ny&sQL!v>#vT2%pHuPdbuw}ro{mv(mBK#K!elo}xgN8_fCbbw8$3tos zau)VF-96JwRaa$Ztam$`AI^=)tn8|u?jDj=-5Eb1aUmJcfxf%VTX&w_^OI;MRMp4nJBaQrw6OHO+dGMy&25&;Zxh|^y)C1qM%y3C zmm1bAmrIn*bq{UxCM3gT@)?|mw!h7Kdndy`1$^w8r;tj~bsdxHn4$x7NznkfSrDQt&(F`&6Z*aOi zVLJU>hQRi>G1{Q*XU2@nUAE1Fx|%Tb5v`}JmT%y~$-WkKr{D6{A|HZUI6&_nr99$3 z4=H=f^cSAn702X_ZgAhmnp_lQWM+0T2C7Q3T1U2&y(Y-9At9aO*}v z*AEz3phg9u^)uNJ?cQXwIzy{#Op2$eYdBrL3T%;5kzznd$@aa!~`oTJW-^AzfS0a5M zC<=wN8Mf3k3ucoeNHN1jA{@`3p{z%G)VM1&G!P?Uho9~TN;{z{ZKfJ^Knf_KX|_9q z!BN?Q&3cy!I06N3_y*1|h(XXa9h>#H=(>R$H$O*VA;blDPrkuNKKc`xwMRcev15~s zIeN5Md>bRx*!g!L#Rb!OiINtPz;$rr_|ps{%TqQw-pCQdu^?@`eSxAd82t$<`wT9g z5WHW}#XAbY=^3*%A2eE8jpwLGroSvM3bIc8fK~XkZ9CcwWjd zBM0;9M{=ahi|AXJsEpD%s;{E`mH;JyO|ZMqApZ!Rj2a zkVuFUsV0aBGG)kIRZ6^Hl0=6RQ;1-dVOo70Au}tP0G#^{2{qO$_9NMx;R!P?l5r!R?FLuO0mug@)DXJ+!rGHQ%#18Z!>JgQFP? zokYeQz|r!F5rX*^GJ)^m=C!97#)4`kpjj_ywyz^cr?GDvj;7ag6{CVe7rD1l%1*F0 z2^Bnj^Ht{a&$C>B(bs@n?-$2C)cMyzEceTGb>^uHHO`1d-j5eBEuY!j3&og}?S{9I z%+P4cvZmd%=%US3#zWqd1%m5Gw;*H|JYqtS^_&!W52)(A_oj4yT{~90Y->$()7(8< zqd5B}S!Lw`ezW);)y<6bI%OIheKw0PF*f%_>}2v0UBT<1TGs7~GnA z0+T5q9lhJ&hOZOHRIbvnZth{UpeQu;q(CXlWKyx&d@ax0)N*{iV!M5b5c2))T}};a zo3H6(&wPqROE+u~1cXc|IpF$xIR7$AXMqKx3!$?6I;+n*Y zw)-Xs_~_I1zDU&;fNbf9S291p0v}>NXJNDb7SK_Ya$MU(9-re0+wHe5jn8d_%7<#p<;jBp4O+$?3D$VuyqoXqpW!-ll0YaY66S3-!vfAjD>W-w_>~?FlYy zXqv2a=f^d}(BR!mIhw0>FeRPw_XB8cG8DwUnjr!s1S&Vr^XyQAA!ewXHjznP;f8PF z!kT(gF!T!+XKzpzxpC9b^-Sy(7kgriA07kjf%xOR@AzSjRDyo^Hf}Twq{=X(qJ)#v zuMy$~80T*VG4%|7g)u7QuN64I#fJfH^867p=Grg+GDUU12M7{(PhP{j=TSPZlVR-F z;zOoG4Y5ZGXqx9ie)MspV03X(P-%;1qn5_e2^_Wq5gXuianbrC^ zY@rY`!{ek(H0|rSFv3BA^#=OkIS`4V-|kuWydP-VB}xklYZ=^I=f6pScUzo)BiH$j zc2n2qH56ipEwU>20TL}`QPR8a+|UwX%;t|QBL~^f-*%gWO)fb4p~bnEDaw3LeHfhp z34Q+^w6bHv!eY-1HVhfY>D`85c$2Ei_jGXiGZJw7_IKHCxA=HQKb-5Uu0O?vSN8K% zjrX@3?%=|TX|~2uCfhnvIbzB|oNibW!v;CB*lpJLsLLtc&~fkN&#^_G*HXc934Q+; zxbPZ?T({8=**P~wE@1BBG84@VFQN39Rw#T=(zkx|XuMhKn!KHEYVc0(!dc>%{0W zCLlzM8{Wi)=h!!5hzr*1uOL;V>lUoG&y5pvf%9h=HKpsn#cKH$-rZq3t#HF_y8h4E zG%JMkDAC}6~N5@gHkZ+sbT1J){r;RLI43SNluC(A7|MN$eQ#@%3x3847= z=RePH{Kjwa%fI}~RFfIrWzPI;kg3sV>(Sa0k$B%?bxn$nd-qQG@|VBNKl(@i-Gzl0 zFFEb<@pLN0rRaiSY!W9?TH-^?d^&?9NnyhvZ!(_)Y;f^K`tAVx zKm@-GAMRmP!O>iE=gz-nI(?GO`gO`uvt0Zc>qUUrQy4=CEzZA0yIE7#IU|(WzM!yk z{IEgW64!4L7L+bXS*#ld001BWNkl z3~tz9>=bQ1h&A2tQvSVh!1)%bRusxG3}4R~xc)WDvH%8Nef1BS&p$HWKTq4Q@%~$Y zCZ+-Bmndmzx5&;edmizrc>aQ zX1l_<9a+FBM@KgA1??XbyrgYj#TJ?4)rD`;^^UTr@nOl?;;Tq03GobLB0dakn?Iwl z6IQD=!LR7Mfg3mA^bDMP0T;KlO^2CDQf%=amVuv~wFat1n{o1gS?lBOw^v z^8`1bv_v>Z+kS&)n;q~(#}FINR$nAWPidwk&bW2sI^b9>zlu@{txA^5#n|ySQJM+E z&|!?ih3B&_S)XD|0cwGW9oht(`^sn}ZnLpJ+{w=g1Kh(H!O?N#Z1H6_>oM@e1|>5M zP1~Gc%m$afwI8hzR!BLpT)f56@kep-HQHuHS>~~ev~1fm%HjwgUIYq;VS`jlLUeTf ziwr}H(UUyN@eCL2`M~ItM;{8(0xyN7Fi1>lf}rPjp>JQAUcg z!uvO9x^I$FLMur~TLc6B@H`NR$>E$s=>C0@p^Mr9erEP@dMG01cikefviwddgA*fyLQtlyw30w9O`WVx}d8H7SKLn%NOU zLy9fPgbzI+DGCF$EEcb3n3S$Tc)UMjel$TFnZGw=17})Kn3OdxZCG#Lpe!U-6$Cnr z_DrXS!fHb7DXk&VTxhoS4MNPAsa%{Y&oeM7@Y&CPmQQ~2Q~dUC|27~Aex#kk;(bGm z5v^(z6~hp)dXDps)oR6W{^oD;3%~FS939W@cM!zoTQ47D<&nnC*!7>Lm` zbW5sfg>yTWtVC6nNTu;%plwd5>iKxz5<*6#a7YA7X!@aHT25)*DSr4m)<_fvArvwB zF-znSA`;??v(r~{lwNdblL({OdW+$ zKuZ!WiGGX>HMH&?ffZIKW>d=$&VYne320ew-U8aOZfJ`(nSI2T0c9f4V{AEg`}MT# zTa;B#;1m~5>HS+I8s@WOATp`1BSlU-ixKZHQ79?t`z6z=q-oydZ1G1R5`DJ-8eo%^ zh3J6+A9~7462+3XT_BaEZQmlq1$8}PaHmYB1u1PwcxJO>LR>KnXE?V7wqwyZ*rK4S zYc|^jFtBOgqAV2K<_x70buB5&h>{T@16paEUjtj_^MbPa3?KdIk8ygIBXVuGz(~z} zc1-U!2q~$ma-0*;H!GrVGiDt{)2vWZ<9d%$_CugPc3@9^;s3OEY$2kprW=;{uq4p{ zEyjB4+As_&pamjDStE6z*}j!`favo+%|MDRO6NVYo|HhuYL#KBVM}T9-rWrwx?xE- zY|$nnRnHLaa&%NtmMXKph={d@ZF5QtE1+XKn^BY&=gv?DLg>a!crLVW+Phe*@;n_* zGW%HAjL@mXWGeCgl))`C1G&Y=Ek-A{&DprlJ+@2~<&?f#U$|EzF$tOJ z>L6K^g{IjsnbvfDrZUwkAoYM0j;700+lZF3RDkE^txqwX&#^{QPhfBhd_2RLp6OKK z!iwJAr5)~&SW}dd&GrtkLF$Ic60LfmLx=$vSDY+f$?HWpw8=E9E}WtSAY3-crN_rD zfd(J82s(;V1D<}!^H`fI6Rik=l!>yoxZ#X?G65t?JCw;p97De$qzz>$==>5*#`jg_ zgxR#B_osBj30h}zjBR^@Q4*;;l-;0ogH(>LUjUN%{5nD=`u>cRA`nQiL0fQci7|@4 zUys+O>B9oS0HWn=^<9qUHPGSWf}`Vl?9?4U9K;d_=ix8gJ{0GyN?iWSP2+qFcqeiM z#`h>`sq`@(FqBAP5fp@=@UG|h+7q~;W#|G`eS_e8q);d|BPBJ$1tL<}kzUhb?Tn%K z2r(fg&++k7q$KJ40nlh&k4AeSH>fJ`E{rCwM+?Plas!a`eS=JDkJl4PV&sgbSy5O2 z0ddG`wkVEBKJJyT5V;Fg*Y*VOk-FrUe(9I^-QWE^zWU`aFz2#ua@=+Vm3 z4=qL){Q9r|GlUTQ(l7lY%8X!N5#NFC>~WZa@}j?RpP2DC7^|tOf~H&1wz(B-*Egit zVQlW!>wHJkosA!4n9V!E*T)+7vlT z6*H8@drwsz(X}h8>S&~sbyzbQVQrRXo3SxU&ak#ZN)6N~StFS6)?2p$&C&d6ymw5i z5*V12GhF9@p2h0Bq|_r*jvh|y8BKeK7?;!*`fbLzcipp8Wq}I~q>iC&_EBB$wjdNm zJx8j{mIj`>J|cv`a=H4DL~lo$?Q|KJoPa>no@OU`G<*uH32aDWLp$8VT4=j9##F3U zZ;j5u5#D=*v`D2;Dj}pCJ90ZhXo#^TMh8hz+gpI8Yr%+;(#|NYLW#_Bmx3dv6@z<= z>C^#t>4(>tPKuGFL*QIX2stY2eS=b259O%qKwTY?>sMANr7(Jm6a`8iGYpQVY0%nW zjY6A5v)uri5C^oJqScJa)np+Vv>5)wV$ zw@55T8g3jvN!ug~l)5I-p{3041+21^HnYQN>6ugor^}boB(xmx zev6bPMwg@{_E1c%3WTTtix7&oX))$HS|6cxNgA^&g*v8l5yg~i^N$mgq8k!!kQgzi zciH|r%-4hS@bHxP#r_Wa3`EXIq$HSB*D?pVvKUd*`38|B0!`a?fI&%(HWhAYG1g*> zf}v{=LSSr#cRkkDNLkQ#9iWj?kMxyl>}F^n3AWoags3sPBxK$|`mRCi8QygnZepf% zZAaX%o|LL#u`~UKHAw|5;>;yv8c$X;cgc#ww-+i6`;eY%mC?)t`{@4E* zUFclx3h%J+;^ViOKgd2Adkd@<3+i&ttUhMDJ*BEA#5jzGip1z5Z}udHzGvt*qd`z& zOhJrcjQ*|>s=$^OF;--T*kj8Q=bG$L2!(SSKwz!K$A-GRPTy~cp~3qubI_-dvj{>0 zfx51Ngi<-npp~I_TePtp9Y2}V*v$&iq>yk!2b4gEwR*4Q{VOjc&&lX1${JhLxM2%8d}^p{K?p5MS(L7G3SDSSaSfu(#*)-P8pkJ~q{?)u z(c#>dVQ5jR!uy_-1V=|V==(Jx1gxEA=gdrifwHP{1Pg)IH8JMT0l{Q)Z8T&9&gJNS zi~}j=v3}x-kLAo==trtbi4P4(fzml@el(vUgax5TXMLcqDx_2_*Dum`uh55=A@zB# z4Fd?pY<>gpwxsCMrh@2k-3Ek3X+s+Ct(20RH*XS$@W_{3eBbZ7{P$p~t0TI8L1ha{ zQ)G;{@6bYw&DtbYS(9SJe108L!21>2R1CugQkU;RiiDBAQ7MU(1!AnX=-L)2DXUq2 zU%$b7pVwF#u%<)`jWre}bC>13?EN^uHA-rfGDumDYsV72N9zeG3A~Sh9U1#9AvmNg zND-`^GnpLIc1t22fu^3!i6IA&Vse0DyIN6J$4FTcV@Fv|K_t3%HD(5KUz(%oQ*5?p zq?9Y9r5t;V;4|DUwrDMpQW0aO`VPJ&#h&?mo(;-ojobmuFW05)s?L+Vl!1P~e>($j z_n99MJc)>)JWBfvjlomt3V~%(-k|9+t6zvN7s!i=N5 zq{e+Lv)U=8@NUCwevJ1mN)>e7g306#usGi$#)h(!Nkxk1BsR{q z<1KX@A03Ywx!g-6#sQ^DNCGKMwxzTtcuyMJyjS%RZfNP+4NBFtZI3ZEq(EVEhG7`l zCao!{%VT=iVNHE*6CNN+kDcg8uDb4PFeI~;xc6#graaw4F(RY^s|#d`kP=ln&9p5@ zNFigp$3|ba7>%(M^8y<=F^i&tG>ptI5=M`l)FFgoQcof6`X*$W&E0$Q=VYV2EbH;} z!#QVmih!f4CXgaZ2}lDw)&Ol1#7&0Tq>d;8V&qnf1ccH=G9^?>j-ULgzY9|GTfg;N z{EOfFm;B1F{0e{jZ~sSxFyMmWl^34lpa1j!gBM?Tm7o9l|APPezxw;wqNeXwBMd8J z8Ox$33>|80gwu9gs&?Ht%hbM*G2e`Zl_SnO>!@_$v%7sJ2qIeKqf+}u4hXfop_#@i`wjVX^Z1O) zc(jb!Pz#AMdc5!FfZdc5ecvPPUk`kw?OLiL z*IR^Ppe)P1(+u$;roX)O--9|y$4g3mhoQgtS~ohY`MHaa&*3y6q!`CsjC*o}wRxO( zYdr7KyWSi3baH((#>43F zoTp`#H0)aS?$-JF-jRP-)-Q>-(P8g+L({{vz3&0^gL4jJXAFa*uz9_fMNJ5!?t9#0 zrvikuY#YyfQqj2$)mm zjhdbZyv(ji>_|VIa$_sK*F$OC`{IaDko$Eb$Bj*E%Q?&0P6rKpry|dZfj!6-bsiWEu!lw9!o$^?_+GDluTj0fj`xQL z{MLABGaIQv#>Kf@o$-@D`2{}r`M<%JzVs!2|M!2NU;DLRW3gE9hp>;3Xw#){+H-*eyZl<)qU-qXG;AAT+3 z`%Qet_c4#&!#KZfoG#6w%Uh*z-&X>6??U`F>Aes`4iY42wmtQv;Le>p5AfaPJN%~0 zPQiu8yQ142RmzTxA>HT8Upns2KOk!%9&$_%8|(BA`s3Y1pVPzl>i4zp%Lnf-!aZay zyu3dxFJ6y;9e0cD__m?#PjIBloJV%|S)SR9!G7-QBK~f@+m``r79bRW*r?kTs zjl|e`%r0JRU@I<+>&1QYLF?thTG?al{okhSJZhBX;jAj6}|-zYTR?~ zJmeyx4ca(<@(X{H|K#ufRE`gXj+6ve*MKHPonbjClJH2O5Yix#G~K|hn@^3rB-fkR4GJpGf zJ-$6l@je_&F>q)W^~h!yDZ*y6W;TC{;62U!m!$&P*gcX zT-gbWvn9v2xX`%v^1O`i5Rf<=-`$ZBmZUB@!{-DHS{K~9^(5Qvipk_UN=Z_ZxyO(T z7mxx6xmwNxjA>Avcs7xez>H~j=QB>%sN9gkhaMpkV)Vl0uDxUu1n2P# z)b$f=w=KzMScR055Yh)HI&_eO9OQk86p|1FMNuG?AbHPryQQw?^zI(U>|ks==iwdd zqxNZvbLGEtI__gpe3!@bWJE+DFC6brR_yJG2V9fDapjwxJ-XS2kd~r2H~eCZy!`UZ zXl>rX0lXZ|estGwY{}W#n)&1!(6Vk$nAJBpzV_63eYs}wd>W1{`L{Su^XzBY7L4&b^6cv5nV=K#c4OQ_;Aa@{DS}{0}I;^{c9OOeUAq1=z z1fSKiwU(dxJ3q-}s_1(&a{uSOMm&UEL8eQ)l^Dyvg?LY3iH9DOB#Jm5^Y`tJ58oam zBBev_^pS~28Bb9d-nzHq#`UL=vgWC$o?;l<5l{bki|ZuEvybsJKl5`;W|80>eK%0s zYZ)TL*kb@7N#f3V5E-^44=h06pYd!EP{&v{O|o7kclZ031bZ2d%WKjgCFDyIu9Nnmq@u8jp=m7jt@}Emz)bJ zJJjVd?e;cRIUxpj zo_PQw`aVPVka_saxDO-a+YSzyBxz(dGrGWgk8=aYOi4)+VnS;>QYs(hYB~=hcej;S zx`W_@m|ZSL4gJ1|G2)S#Gmu0=py=EZqid9!AeDmHlTwQihN{l=q9L?Qr`bbK5wsDR z#gBA>vhg4XImm}i(vFVSXwpc6GM!Edv8S>n@je>aOw=IXwm0#>Jt`aSax~-L4`Auy zw>_A><()M{L>{8Pk5oeFvBi|G-=Jhk2$@1uDLu0Jna6v5B+qnK;KB;60#&I=G*q<( z;gM;$#KgA$<>&M7V8s5V*n$_=^)8{<_YF#An%CexLK>9PW3jY3jN6rU9+DWV?XU7A z_+AQ{eWXVUed+m#HJM^9rXg=;GIGut9<%xtnncLF$~&~w1s>;v9ONJ$Qk{HZjqk{k zb}*($Kw@aSv$5w(N!u-{%G?tohLIayRhhCf24ajzQ{(#$y2#B6Meqb4$N%%UChrhh zLJT9dk|u=)p$ySGq|{>*DV@8Z2~F}_gw{kiAeA9SpP`qoL7RdUJt0Me$iG1=n^oAs zcza}`6r|K)twkX5J`zGUwv~L`v)fr$#?%pFhf#^nZ&1o$gasT4&&A^Cv^SYXma;?U z;V)s6ikGsNI%gGu1n!vqc8=1JfqZ8Krr-8 zW;L{mbJitsA=8zEcIQpozHiEaD|*Zgeech9#%$^ckg}vGEGb3Y(4&n)D~VPx3=vx# z*8UZC9{fWZFI`pV;k|6s7o39qCQB9}Js~=}Id^2Z6uC)Gm7C zo8u4B!`-_tfG$W)!>6D5Azu3S^CaK%^he|tlK1rsc~mm=Jw{u)u47V73ADr@QOXcp zi!wWGOdQ?q2laV4=+pP@yp6VvyjXW7GzkO3qUvJo@sRM&p^c%c3|;3b%R`^4tLr?x z%?Q3~$A^u>`-%RDhd2;BSlGD9r3VL$4swu#Trm*|{EDF+u(kp{LLY79Xa>X%`T={U(^PTzgiKmP-UBN5|uP zV}ve@=M5|uK*`ZHAZ@@$=mV&H2%9_DNdZRDdtf-l)EXGBu>N=)^q0DSK7F7hVoSwl zdxp}G=!nT-RLMCDSeG3I5yw6cWAXIJz?9jR4$i~-H~sSX#rx)tB#~*{x~5~fTmqS< z-nkxQ3T&YdHq60!xM;~uv001BWNkl}Og+6*z@G+;~6 znv*jylNlrk+bzmkkck&x`eQ!!vA@NgyI(|_DHw>pMd|}|;gLF@Z_9SS-|YFLkuXTE zAAOv~V!)OKbyTbDk%!HpI^h!Qxw%<46mf~u%9GX*@Bht&We8!C0r8ww@Lhk%tCe+;&@C#=FRSL z9p;Oh#ye(5(gViroyPP*%I@91_F?b8oZ&gh!GL;iv**6;?h&uakKX(ou^)?`-}*Y6 z25^DQvNPGm(37Lu!hwkAeOr?z3Xl&B`o#;4&Mr9>yG1W9J69KLALF@0 zf7vDy>FuxC+W;fG;s~wE?;mS3gnNj-dQ9}!ep~`kTqJhUBosFj0E%H~kW!*`!7iLX z4DI+_ec`q5I707oAk#z4k%%N-I6pcJ2m}g2iSv;}2cl)@1GcCE$uM}VeZ>Cb_bQqb z=QhkR3@B;vX@dwkVxhF)?QpGkf`wgfMD<=aQE}<-AXnag+I3y zstXi~KqSUUQ53l|Z~15y;2U@TEVqdk0(61YfH4dKFa->m2Kq+zNlv;~39C(JxUZ(r zHGm{|kDAPBIzSnaf;Vq}gIiDjM0P@g2We2oWF%9J==m|J-DC}P@q9O)pIsxg4XUgO zZHKDnkRW!B!c0MpmEEcT;2N(7c^nonMg@N7cm7Xo*=E?%Frb7)8i5g=hA9-_O@aH(KuH`pq}cTxxlRRad! zb?CAp^esXLq|prh8A=+Isz78&l?xq4!@7NoS#=#K*sdaz`87xYDYo#Xb&^GYt$5VgjLX z5l9_H1xLjvsj7@GK3RQ}=JYo8^_y%vcw+VpK0sZ=atZ6~ zk38|&Y%CFwg{G<@bX%ls5!EEyKgmG~$Wl|(;QDRuQd~{&?FL;D; zK{=U`!W!_{;yifOcN?V97;QOSeV6O=V_;z2E||?fN#CAQR6VeBZZ6s*`Y~`G7_quj<+;mb-?pgIh!;#~j%G)+y{B!4u|u`o zw|;jnVeI4WzVBPmr|fvPZA(={8krYtaXAe3Srwjl-)rMx%JZ;^UD>cD zHY>n1D!Pk?Y*IOjsRdS*Y`ZlRRnqkxWm%Krh2D;jW@p0<8;qUcx(y~dPPhLb5P0#` ze?w8v0mWu{4^&Hiy@0f28@{>^RP@amMLh$yeCN%7hm;bOqut!4EKA-z`!c>?prr<7 z`HL6-HEI&Z_rAfM)A78>=bwAwUt{X?^F@8c(7uVSCoG#U0}JXS19+;b0s6x#B%aO|aI(NSpXG(E^Ok8EzIqK)pz?8;0G(KmFdOX)MDX($1T5vRb znywuli?qA31<+y28e+%Ldu&-zjL}dSm>$jZZ}Sb#IgBv~UC?fpRMQE>EiojdmLM#y zAD>4-=+IW~ot0eh2oNah;(MPb(yPR^)we@@11vXIR3RCKlqX&#N~;L0P%0tS zNc)-$QfX35gs9Nk&~+P%66VvJz`$m`W;(mY(Dm4|BzQ+k9aVKSuF1sp>jnr|T{8HN zW-~CE%&^81XbAlZTU4WCBF<|d$XURH9OSWg9)P{WVC^}p(qged$&$bKv%maUG>ds? zY*A!>;q`jWCqD5Bmdhm}1VRWDMM2;9IOmv5CMc!o`yM?qfOK7V9y$N3+4{!FdAQW& zL5!xd#JNOS)gTN4%`ila1zReXtA?X_{diB%9h-{Ktk-L*a)wW5;1x=0gq&O|CYKLz z9xi1Z_T?clKNRmATh8y14>ceU#nV?+B2v0BikG`Di_r+qG((y&1iHRqGAr1&D`vAJ zq$u$IaZuoyDzR%j%2Kmhcg&A&0t)Z8Xsrk#pp1p+5qgeQ12F^y71cCHT!+D7%LznJ z3;|PIqiZ%uxqIG$G^8*f^o(}9Kx>P!8k8m_hY*Gs2c(|SGz*Nfm?Gn}g)Bgnq>yVY zX7i5#k?nTLWKwZx*7hiy#62Vk^8pc|BH-y_M1~3@DYrG3~a`usQ~Me}>ipM3481LO+d`f_^xoERTqIobS;( zFrCdvNnp#HbnS++n&aXf6p?O-NNG??AcZ5+VRXgu@so5-hteHN6sW@C+!|w4HuI7h z?S-8l+>xyubk{*1Q|F=Y`+Ze>N{J8xP1A6Ee9RyItN-_Y2>D|kY;i6^i2Psw_wVq( z|FhrZ=YRee`N#kGzt89WIGQQ58%lY}0{yGHF5$*6=K)dhbIR7X>i~(dn!a}wg<<}f zI}Yb_$RUE~`1qJF{M3KQ%_k#p0){8(?^&6i$J?wGMQY%4_oF( zPXdA98nm4;bZcx`fUFITUvdB~y-MQI<_+VI+!HWD5us1%Y4)HmoR%mB9X{Z&H8& zK@cl}WLOE9NRbgFP6Q=d9LcocID%qYT1Rb?Th=eg4n#|1XB@i^E!vQI0gPgO0^T9fCyKz&BQU^Bis<63wnyhbPVTm%gLQGhU(F$=p-rYC@)D0X_vVmrq= zM-)$J+lnX}0Ue$|mQV0b(=-*M{3*!c^CJg@Y zIU5(VhS64xvtS~L>m|w6gP`eJk|f7^hxe{$j{>S?MUkIxp5#8mV;~s1uHz5?@DFieL85bnOd+(d zA~WFcxp>`gI+d@Kc@TbxGH;yeM{)%Gs`2myco_O&r6tu1;O)~-= zt(y_abQ3*&kj}R_HH(H-{l9o9va)4a5+!}9QK~b_s>Wzdq$AqeVxkQ193Dv&O=!A9 z>aIab#VAR!0petgwH6`9WU0WrnCHB<19F2BaV{rLEyz%>77#%w!7ZLuPvf% z#z$&gWu5dIlgSE9_Vj}~PHF3kD1kg3)ADdzK@ zGdr9J$ zw(E$D!Fi8VtLV!cb$n+;c2+`|!{n%j&00zH8g*=*#5@dQXDgYmO!slB9vgUoDD*3Z>)tu@dX$( zUKBzInx-L34M{qt@BE38YTd2q=NDyk|C&@MNfUL7U!&>_1Q1CtOt~6YlaWXU0*C%+ zdWNdw?NTI1&;77H49_DI;R$G!9&H!I!@N9XdN$G12kL+e6hdgg(6%j7%7MB(dMJ)x z>xiy%7$b)7&|w|;ps?1FWn`ODX)vPKF)lomAQoMN;~wKyOxwow|Ei+!>r zrL`TAjzLN$+gEYz5*4Lrnb4MVJOP#1o?$B*4dLQZOZ5#)W{(G zS`>ufh@yxjNeB;#@^{yD7#)+Df{q1Q@lFU}J9zBsJFpJs^E<nY3XCC2%f=^>QM zK$>WT5OiG+0Gy3jF7BY>3yjCGe``ivm2~YAV?ZiL-7H9AgVYgF^q;%BPlem8SsVLy z0uSfECNhr95k2AW{q8^G$N$DppkzYVf>tRXc<+Z#utE- zx)u*2AbM|r_VCz>t*R|6s;WXMg+wD&#!6r&Ni=j8-*#wXu#U92Kvyj>N|P76-~(|o z1|+s#Abdb&TZF1bM20B4bmRyrDnje9zUv!B*UFMkH&{y%27s}#M;Ab>|9=fo96etL z8p9|CuJt!~{`0|OwCM>ST91ii@;v9Se)z9)@zRL-bYOZ2@>?+Dy!n}7xpCqj;Mn0p z$&#G|{1B`!+R!!q{2iQQZ|`$NX2g|?@8G%TzJ@V^rdiN+L-}=- zvOQ5a*Rzb(mBYD`uDe57&dAbTOk|LFu+X&~O$o6`@w6a7YDrT;S2yfz71ZStV-(J} z>`V-il4uFDgMErr&@~m2GDxkl&2v;$#V8+h`_?{63Z#I=Vn$KKxX|FOKw3*(-D{58 z*v7uCG7sn1q||)rOJCvo^_%?A4}A=P-Q9~E989@*@gjfoZ~int|MNf3hd%U|+1Z%@ zV6A_1fP;8FfAH{th^nec(-fst-zPJq$!F6$jK{kyr-$T|T`+wU8&O{lH;zBRWCCpq zHx9mtZ%Tx)T)OnV+@5^_Fi_VBop3RKAGfQoF^S(vmO*P_Xbs`o%|APybVWEL((2hz zHa^PZSy8;x+t-!N{aTjdO_;lehDm2VX3$f3@x>SU)Mx&f+2R_b{L(8d1FwOqbH(QJ zW{zwsmL9BGke=z`O|~YFvsf%Cii`Z4|JKKkdK@1H>$(o-9kI$NZHtnU*&K=@0SUIX zBx&FBT-I}n(OU@~b|yPS2A12Zwh!oOUFIVp&?Yb|!Q-U=qb*cEHu$w{U0wX|gn9I=jwzw8LVyj}K53 z6Bf&xq*;tH250@Cn$3Og?Tu}010LQmbFSmJfBXOB2Y%rD8IOy8(Gr2Csqo(OmbW~{ z_kG{L#&7-BZ}QVW{nK<^M_t#9Mx*lrf9~PboPSHxw68~vBC4vwx(=;W-$x@9`D6_3 ze4xt>5F9((A7a*g4qr`?X~9nZ6#Mf}gEUA17e^o9_WW~w>2>JHQ=poW#c*x^bI>(l zB))BWMNV-#a@<#2i@VNk*o=?Vc)$DYG-zLAIe8NoZtE;sC)8C(k{TwHKERP>DW2sk z{N-y930pOczs6A_hlc0ZG2#g#u!*KVxOJteTDB$^S<#z1XAwdmgvNP))N^-Ut*Kjz zEJI08-5rv}yDXM>XzH&)s0OO}E%x_cBuOukjlg!d$nr}p>q8D_&$4^r3F@lXhAgXR z(aKZSHN{rJbpB;#^JmcJU5tAE0OoVB?XxuPO>_({EC}ASJ()0?K-*nMDroBk&Ow@t zDC_5#FTRG3-r3J25}NvDY`dUs!8=bJ6)2&xuEB>Dv&v8&8HNTc;n_4!Z|vIyJe>av zSW0;8u`7J^qaQ^|u(l;hBD9u-(AN_F)KC2feDaf@9C*v4q4D-Xe7AcjE3atT?xJTq z|Ir8M97Zd$EJI33)gF=;J5-AqZ+-0hxPAMx5cQ4D+sRWL)Sm|=Qm4>4_Gh2r>h53U z`u?BM)Nt5*iK~**AIQktRP9l_&1RRMmcq)p#57{@>f;f$7+e4yw zm;HmM8I89P2$TXP143Hnv#$a%0S~m4^_;5t8bSmDH8xnf?s?kAf^3M4z=jznk{nF` z6eS&XTVcK9+KvB@$h6e$a|CZ`?JeeuTL>0_!?s_>`hXD7+5@5}p|vk!^b>UUC16Qa zEqVO%Q|upnVQ7?=gR8fe30=$HZERx?CwMsL7qIO*w2Ao1pZNFD#()oK74aiK{Be>f zMM;CVjx5Rf>p%A61mEA3-a4dtgTI^b_Xc2RsV)b3_qKDM_jk^bBoU#rM#58=$t3 zj^M?cpFeg|PDDBVDd%xxkDi^r2K=d;N}hUzL2|2Sfh2s*47q6M6|7^8F~nmd^lL>>S~EZ)3i&B z&OjOt4_;!jeTlA}6Gda<S)ysWJ+zKcA|vs^$)9T+rAhiS7Z66fv!R+O+zJjy!<9j6xuAXSvC`@nc+XFnD_Y*WU>}q51&LIcd*^hkW zBPgv2-XoPFc;C~24pA3v%m6&h8wD9`gI-~J;Aj*&!ZI3wkQS9?>`5@_PyA? z9h|(L4$=?VhLbTfwF!Jas&-ESCjT0o>^I(uydXGeTT7g1wAQp;Nn-M2N8;$X*Rv*S z4GgXJTTv7HQ{PFg0V;9oedQVNBl_h>gyUr>XpSPJq8r{*3_2Res@=zwxU0_=_Xa*k zPSdgD#_GOZl|CU6LH9kt*ntq%4`Q4VK}baK1abOx`nlnVk!@huLIKgB>^mI0SYvGq z$DiH5ZV^YMx^gIq^rwo%Hy$#y{q3rrN# z)Q2?nSFx^Nj|7s&)_7Ob+C|S?<_?HdLe(B3gdi~)oo@)5qJz|zn*jx07rQ3NOsXV=&sZv&3S@(x+vXL~x=VwA?@5p8qGwd>E2=7PHV zJl0OpTCLqD{;sgX-S_aD-7~g+9QVi|o(PbhzGgPS=Rw+oKl|e0c}T5}{;!Pg!Ml=2 zqfip0INC=?=8ZqDyP}(G5xH0O_vhQ%wneEy&DVQE2qy^OEW(hcIHzTk_;PFB9pM%B) zXl;W)(z%vEpmj9@gE8+TgcL!CXO3gpvjGj@(0SG%lwwiNhrmfjRY97(7w-xPDb594 zsL(oK{gS3#AcPzOX>I^04JTOXf;=Bp2fiax5hmKfb{t*jRejJ4kWv#TG0>n?2b2V6 zM0$o&Gm_W?C6O|KBaI>wV}J%DC0ez>0( z_kabHadvcEMZS$3ej}q+bj3AMyd=#_UPkeO z;>sB>?tO{f;{EI`z65cf^~v?SSlX`;>LtYpP#$c>?ZYo{C4YOb431~M1o9NT?Nb^8 z2rb*YmjR2E9`8M^>`SO(nfF3jViN&*H0`Xc-|2d8{|ejB!SPE)Y=IR2001BWNklBB=N9q_U1&eB*BE5*U01DjPNYxT(=-LhwO=wF`l#PLggXuN4 zx3-7RNC86HxROZa1d|{z2t1MwsbYL^C}rquOYKUsc!#>{ z$m0t*=A>#1=-8W1NzGfxvR!1qpBXC{J5=#-K2vRy9Se7+K zK0!%I-7bhDP1P+ZvJsuDan=#XBdX>WvAIOky+E9fS(Mi(vIt`oP1Bsp5}jiwPfFU> zvYgiBTieWL&ods6`X=RSMw*QK;}2`hdcqC81c4CLeddSu71nBx4-P3o$(Ut1CrvYi zkkr+bB;D!*S!aSQKV*(p*{}Pt{_!fdzxnfzIO_WfN0pp@$mWLtq+5AWw;0|XBLf%W~VV(B(LBod@p$y~klic2W8t+PqbO+}mwzuDn>w4G` zm!#1ylkK-rRegnFSsjqX+az&9kzC|(@hoLkvc2_Al6YuMa(h68RwHK1&vWV0Uq(x~ zed}e)wxlR7lBSR02Q99)tw?l^0IpvC3mhC?qq8wZ{v@M9P}PCD`3BCmT)2FR#r!tP zEO8tnkW^iX5hLPw5cF~ug2c#}IELU7B6FG9Y>y}2_8u0?Kv_MHWE&k_VVv*cyk%>$ zMbq6N+j=X${UVjSPM%+;v5uQJzE0hAB=Lkie}bk4t)Z^(&{P$p(Gys=k5)TuZ^P|7 zcj&s3OS^C7&YfqGYDD83#^VptR5vK6V|GSQFk9}Cjo@(lRf_ZpBJ~)pYcaYH#waAC z>~U&)gU(LL()SQN6a^ek_qcK61)loA2f2Ck3+zn3pKAFTj0z~#;oKp%Te7UaOsw9@ zboK>`d_vRJXgx;j2!cciHC*%hB#1sw$yx!{2XxdoNsq=CXzU!VC0Tl*zk5Tkp55;s z24{W9#);QEU-TdDgGZ6#Tt%K;8s5`mWw=Z1l_rjZtID65?o=&M#SX zB^Srv&EEbsaF7)dX?}r&=~vm=+TmcjBuy*Ic1oH($!u{ArQzb`w=i4m0~W0>QMWHM z&L3w{-X@NQQVny7W%YHEt+}w+VJmSvj(J3#AGc^O}oSwz;!+0~;(^_88u` z)KyKKfHq@n_af72pss6jqnOP~w#Oq8eO4UOwn;lv#c<3i_TA3E+Ef7zVeG*7(FsQr+Y(XuBju&xKE!8uGE6USo~%R}-sK6bT*M+S)(AOk&U2>PLB zO*-ma^8QGGHHbcIwi^b}_`i#Qf9!w@sE}+O@dI*;;_AISc)%R69 zKdcWD78NY)vxK%p=mgu==y*b~3xr-@95LvJX?dN4#lIpF6^ph-C5Je9K%9i$ZxMp3f&H7$Q#Un^j;$T2 zni`?|?bF$eI5W%^&k*Z`rrje-cZZS<$VZA|G~(9YEyj}(Hgs4AyB9C8T*7GFa~C8@ zOx3__@hqUo^9f06XlzB(T_?>)SgWvY#Ar0Z#D=CTky;Q$--DJFW2&-7s{XUvreZvT zd^DnMde$1S%okHe*_b@-1I}&JfOKeOdTkitsGBA8JJ%4DWSM4^!@=H7CWQt%L~t}! zNt`N1ITX4e;8>J%M%fNlI>0j-gR?zBgLjsuhPLYa7+!qgYXr9-&EsB}Txpv68r$2C zapU^)?Cids!`T-x%2HP|Mw2mVTGBd4of+EeDND7vp^Xrt2s>x4viLL(&Qon zf!3N30Ajipta}z0W+;*2C~5qZSmpqf^}MGHEh|(4N~Q#_sH%>xwZyR=K!WC6ijsw1 zGsJmGxoFtgeH>`%+zd#m8jsQG(6^)41PTquJw2QaAWl2IV{>G7+!q_yVthuM4xJ=Lx7;8z3;nyR!s`Hpwte8AbhJj+B; zf7<1yY-s}?Hny?*Sd^yyoErjxjfOu7Jc4~kJfk=2spjp zsuA$Ph{U~;-MaNM#RS=t)*l0Rm6YCL&iy0TTAET=Gan2*9CXOadXH&MeMuVz+ zjB{}7;0|e$VqJq#hS_396oKtLsg60EPO;W?|MHsZ(k$QHH-5sjt5N#Y7j}V$aaCSjm zH>9ya>ppu@)fJs>k1%f6)x)^}??9=Ps=Y%LNn%;xaV*P2M%iQi+?$x%J*#vU}-?g8MkiT zqOD<+?l3QxWZ4dcz~!Aw)Fl*I+;i5%1<+DtDQyEqlCi9olx2gGj#x(=PH*wfcRtCB z-}n;aEwF6~!c)}?(j=y7=fq~4Bn53GRW$|C5XUJ=0!n*?gtj{*h$V5Hpbglzp|hZ3 zMOinDx2_Pl#qAqk03A8vB*hr0mothHwAF&D zp0PEV5XXJ21C=qIK8F!o%;qm(OvkcavRLk;B1h9!#94~byL4_3ts#gKr3HCWP&Ew! zi%uOubc8Uc>l{^8@%URF<6!?I4|2a|`y4GT%=nV9Ax}WM{XB=9cH+SaT>Aa+~fhfvZ zmNiL|V2s9#4a?yMJZx-Z_j7Ut5CU!6A`p!89ol9=6vueGL?wX82!4r>8f4(`;5L)( zi?q!FQ5*pQD;l&JA*cZh()P3sM)yvjn-PRVL>XC}@|$cD2l%9 zuk$ann9W$02YnrO@Mr@E2QLss8l|CY_L=OAXzM+uQ_uD!=iuOFwznV0duSTy>~-)< z?%a8n@n}R{fpt@i-U8+bDk3A8&u>yL_DJKXcgQX5?>|qPNtA@Hn^I&6&M#0J%4Ux{ zcRt7V&Mu2N%x5>aeCY~{<#jGx5J)qkX}(Ty*HF5=S&GAX=0TXp>?6 z5@R%-tvNV+j$-uoejXBi!g4YDI$gII^!}E_QNV^-Pq7+iOtzse_koVxotPJ|eVIJZ zdFiFEb7A)#R3#)SOs7xNb^F}B{WO!wJBZ@GW-rjW7l`9AO7*dn zWqE_Tn)Q_AD&W0GDv2bfTrSA+2~AZIr#n~+Tf4hhw@=q~q{$_$>nT}J0*7Ia6!KhU zB%(;-EGVr}GDZpmcwBHOF_bHvP>??j0`%Q}{e7m2W9vBByU8E_@gMU`zw}G|!Y}+H z*RS7XXZr$aHac1Q6i&Uz(R*1QUb=8`5AfiR=1(aVaU^M)jx6ghs1OFKR%bD4ibIu`U&s*KLEm0Kl%rnpM^2;ytk&k?2bArB^$nDXnPfe05PH=Pd`j7s# zALO6>=6^>Vdqn8dyHYv6xt@d5$8)xTk-tyeWMhw_$$?hzSlmp~_671`SQteH-V$WP zih0J`lpp)ipW%0Z=aYS3%{OC5_lq5#_xI6?_E2#0b$}oGx4)m?`~6QKWJz!ir4pPC zD4kH1`=n`#_Yx_4Va$L-X@hq)Qf0lWu<4zw;5|adl*>c1d@?uz{de#8({ycviF!f0 zs$7z$DF{tnElAQGnr2ldqtH5Gu{fkCc4*rLN=uYfH0_c&GPuwI0VN^=j<&PJCIvi= zUt*-9u^p-2rnL^GqW+jfMNgaQdH_cXXcVfiwGJ^+^iI0&=^;qa(OHXDMSn6^EIVSD zYkWNXzTKJt-O2$n;75I}yyylV`&GZoFt3F{uu?P}Q*FvMkm>F*)7Vq<)3Kw~1Jh*q zoQh-dI!UjOar%8FVfd{?SkI8Hfy>aZecoD>j_}qYbp}9U-br0QM+hB3mjm~H#>YPP zlYH_IKDFlL`nBsqpPEr0@C00jE~MZz=gGN*l>Lee852>MWCu{(mbK8 z4~dfkqf-`(<n?sT;L#h^pq%P+qX@s>m(I%p8_mEPf zb&9hKvOI=xFnljXUhE)c&wgeiNx6KPBuV>-DvsIo8sn|Y)a4D5Y(nrILVCLHfT9=y z6@nTi6K1n(jK>#xjRqlsmSuTJo{fo(!G<|FkCeSOa;gJWeVsJ90HGOb)LT6DFlrtWS2 zJSaM^K*-Vj({ZwY%C0&3gJSji-xCj?JAgyd;doY`*R5^i7}OjcM>RNKQGX2xc`9o* zhzkmOk_v5D%nv9=yR`L;(dc_J_}VOhp*})URbO27uvL;GrIzuyif`6pjImkB=@cY@e(pc}84l*(V0&~KlWG3L|LCXq)qnKg@{7OlUokFr z2e7CK;vP|W!NXg%bWZ@s$&5mHjlbE(HsIkr0SGu*zBC$*j$Yr`8*9!5RPY#M_~=JJ zN-F6ovt3XE+w9{) zOPuV|)(e93#QBK2yp0MLEfR!^@m)Y_iPkB>*K~~|N(%6S(e_nbyHAwlcx#bbQ!VF2 zu|#P>G1`V;2%SY3jkh&%+AIA=ksx>rp+oAFNcWL+*Vd>=5hr7sdPbb&1ZU3>e_wN6 z0|eh-U4sxk6*L&?dWJCurQ+jquoKZv-~YyUIg0B}WOHiPuxCV4hX(qvwmqyfa*5-= zIm(pEldrA6r?3Oy@DS3qQnfXD;8jK-DC9r^dJ;68WcN{80QI0wowF=&l4k`zIJ_Ge zZ;r~g?&Zmf`$zWAV>J9;&T2UQWIc;?H#<^UEr{b7qXl(ak?4p&`Sc%=XPWna=evna zAka`XB~QKgeM}}}KK#C^frd8Gf{fQOA8JFdro zpwPWL0b4M=0mZeMb2uAmy+8;J=HB9xQP1c)IouJG&RCn>!?NLAh9v zUdpG?r@YrSg8)H^(;=nMi2co~3D7?vZDcqw8F2^U8DIiBgon*;$7N?fl)R_d>kN*IvQWG#ylv z`x4yNwfx$z{Te^}vp-E@wy4{E;>cihfA9S4-}#UEPyX)T*ACH@oknj-q>q^l3_*V7s+l=y@#?5HT zn(dt}y3S+b2kShUD8*w*;!AisvZA1@=RAJp2e@|QQzTI|G&^gS<&-=dFrAV zoCIkw16Tnt$x}?H|1VcB{S~H%&yt#)s=Q5_MMR0j+BsSmy@M=4Jbsc%WJAeSraClFb-H3A871V)bp%Z@;W zU31WfUX7zNJGFL9cI`ZfGmdTDp%xeuBScJ|QkAJ*p&5pAXO7*^^Zh`04W~*Y;3=XR%yRK)x##TdDepK&yLo;;%~UgK5W3l zd5kSedDJw$0u3Pq;y6B0kH4`u##Rl}QJRt@3Eq2xsL?v=7p|~8Ra)>`;>LaKP@FL_ z-+wv^YYWF_@_Mw*onmY8YYU;wsS5d5apk{0P3Q$sab6`wo zW3))-hSPY~Fa`;#E4b!5(hs))hEZ@SpB}p>D+8V8My0${A2C44l z6tBv3hD<_GYhb_w1t%Gp(lyqm)9)jX%HEC{lGI6{bCiWxWiAFlbfPY6y&>8S+lM(S zqyu1DWi(drY0mg|#}04^o^sic7a7jBq}g^46x|%D(tC$jf;>4*9#I#cw|h67`QH=I zhx_;>;8h}*0 zA@ra=3L!Y0b2Lr$Ejj*g339)eZ+pM-+}PRQNo!5pS|TOMvW(em#$?h*!faQf%_~Lz z&w9_(b;M>k6{|(Qk0SXYYAElDHl5<44u&Jj#uL#sbw(uREM?+#hLSak&(rDjRfICA zwa*P8+LQaP>YRne3xCqVT{##*uR*7kvTStpcPEbJ=ykv5e5@S@kN89`!Wj$S@$cbm zi-}SUp1PZn#}j6YJ(LI!=KecMxAjqXL57JUwu^UgFuP9E&QV5^XYZ%A`y|m0%jP=U zldIGnwBQZkR;zjS$>g7Z<9oqh~r+Hp{$=n%L$Y1@8Hhu7ude= zIERNXBh84ScpFs)IlEYFS{^R`_OMI+jFPF`$tH)GLRKw@zG zgB~&gL!)pIYYoG!-Pfw1MyG)*@|Pg@{nzL*bDJ3Vm13!1h9 z6wZ74OE3c>JUNof%;zzZ5k5pncB#q)$u^Sl5J4QVSZH7u$Z4&@g$PLLtOn6Dp)8s` z8aD%ASua8Kw6KUk<7#ZMG@S#H3}Z~^1c-!XGsA`&gaM&xT}KeGs7er;&Q}8jaQI+o z+msMSAPhcqy)cu|_>kg>DVv&rqjMdSfMtQBLSksFKwxCFAOHX$07*naREQC+(>P&4 zD3B?L92W$Q>m7yGH*`+od;%iD4be%N8lkAD>oE++}%kpv>DMxfbcxdbgQpv{=N>4A-RIh};tm)=iRI*Q_5xTfaT&FfUvZHnRvjLgA3?s6r2>d^xPr36vbGcWaHwHBd29gsMsvmm;@=U`paL99FPvVShRGbUh8?Jw4{ z4(p#~hR6DAXLwY1y^lC~jHkdxpO10F=+F3`J*}%Y0c`}(g7Cy?L|@X?95Y3&j#~_r zvPaq@_gF84KL_s5+Cy;mV_iq%Ui+`V)!OT7h%H6w@%}pMU(_ZB8RNa=*MH-GK@X~W zQ5N6xJx?6gS>NHIdwes$$3xJ7zX1=g-^#K?Ykkxs;G83bfKuwH5m}&K_b3tQ*Ez~p z`8nP*EcTNBpS?GavFyt4`#xv6``c>imF(d)7$@52q#F3&%f+CwUq(}~z;WA`*v%0EY zz2&ZF%OCgE+SOdTIb>6Qzrw|-s&|)j@4M%m-}?P3)rZ-;t|Lo}d+z@|wL*Xt?>|1p zo!j6+s{S6+G{zW1*LC+zO4do3Tx%^-YT~FTLXtw0B-^yclf>IBtBT>^GLFE(VulhU zj29&FCQwk-0wG5PG*umdj6A=>c<=z7i)cGdT0G2^2fjd3Jc^7zkMkLAoASs*-%C|W zAjb!V5-FVvcrTBFcu6!MQ6n6VC`#yTM_JVb0*M}>lIv5;?{|k#6BV zOlP;SzCkIC^PWMzxmtiT0vaU}()39pJs^p%;fzH})u&pto-BO~DL2r1fMQ6ZHdcm` zLXjcTF9HLkzDBAy@j+6zC4FIMjFO62YYrAuVl_s|lnWOgC*Vla@4?ZhxWqc=m|xQW z3%q^!$yS8-_gH>ha`EEl5qiv^7?C6yNphJyO?v`HsY&95<#I{WR&-s5QW4%u_V#YD zvGE{TIzX$7EElg+mMvWy*xJ0pXtd4N)>VXnuJepXV;1uTRXrz?0&jPT<1MoE0TdDY z(-+tnZecrtQUe}*@G}es7y9T$T{9X*D_^TXOTn_65=(jp?8Tfc+h9;!psK5tlgc8M zKSwEnJCj3lP83O=6E)8m`EByjfs@&labBq^J{!_xmj`gN!K z@~ii`Us;c%4e#My68?l?cE1=9AJWixzaYi!TK*l+8BS~;?6^D4ET6Xav0ykHo>By@wM0pLPZion3`APP-}gp6gEvmnx>!V3+lb^jZCdE#`M1v zuX2^Qna?VU;RTwup~x@NnwBJ*Fd1%RoFP&J7K;Ug!GvLP5o=qVYe~}_DGHhzgeXwJ zc=Hh!%WqQFyG-%|C@8W=x%tk5=|1G?CED&y(zw8fj!4A_72_;;Ul7Gx7<+)V9a%a7 z0&SCZI;O5FvV268bENa3m5iY&?T=Q1^WZb#W!w;#UM$B~_&R)4G2@9(1lujh@mtYvLHyq~mf zOC0w`LRpp+MS<43S5)t1@mob??`0yAAE1Uyt*Yjf?2$Q8FdB~dp?~X#k)I&f!(ka< zSY`Bvm2d8Y)^^C1fl*ZzgF#MN))Yl{gfR6<8xE%;4*S#eBNpfd{VQyd?m2(-&MuF-W0k%^uc5ByzHJLfO<5 zsbY8c1`mJcGZa})nj|##CdTcNr%#c@kS6fP>#s2wUL=xZjDMT0%?GI~D9cw_ESGF; zT_n%L9f zwoFD>84O^ygq@xLm&tgGBzh3zZcvuDD2kr^tLttMsVf-w63$taUVDG;ACc$I68&U( za-us-w{kddh*XUaP~^SRm!O!=AkRIWfmnMM)h?O2h*EWnOCBF5}s9Y_^1%r=?VJEZXj_&^8{#hRvRNK#D*2ICA_GNd&nQ52n{t;+ZLecgWW z_RveESG6A>#5;e66JsrFS-3st^u~rsPq5Yv0OK?VTq7ARq)N1~~!9i|k0hFkN?K@O{$aTtG=d z6h&y2Fk8OEcyN`)e8F-7<-8@!6pi+|L0Zgt>*oJMk$#b~e21=S7>>S(G1nnPv`ygR zg$J1}YC-_5AH>>k<88rkuu0j>84X7)tCx`!j0YPS6H%6dt?kE|O>dB78!QhhhWRFq zxkX#UBM*IW!FY5LsaK$&<~6KY;(foLATSw@c}c``a`xQ2~ACuv5G8%Her^*;Z6h*kUH#V(n84tEd;wRX?0BH^vFJ44Q zm>#@M9QTH4RT`|X&?1MRa4xX1v4M3Z*4sW{C7~>#YUVhxWSC5_ZbnmiMxzacg6Zr9 zk|-jIAxU$y^i`!S3?n4r5n%3iuV?2&|clVosplv`>;95mhLK5dRwPiM&G9GP_ zr6bDabtaQ5D4}Som?#>toO!f_>A@ad+Y-DaO+iPF&Mc`)!*Fncwl&P>Fxi;UlMnUJ zFwMZ&3Tp#pc|eqOAQa1G|18VWGZ^Lw0nT}pDyYi0x%SY5?CryJ?*;bu_ArgW7<#D2 zc1fO2=!_>;G1kI#w$H}6peLnT!{*(ea<;hlr1Ex1a;90Go8MRl7Tc+G}Rt;`xa8yARHkW@*?NP%{LefAEGla(R2r( z48!3QwC)Y?OQzFZHnz3^i*p7cBtje`DczaqO|F&Ld$S&Trxg%{Kam1_;@w-@W@}l? z+IYAdImyiIoTI8LhQlGwb|@(jE4TUGv{LlG&$~4q#0luabFYIWQUOAbVi7uv(2_{2 zeqr+5Q~&R!?YkX)IAiYAydQ|-h}N}iZEvkSb^+%cv5tDhT}QWD9H$oJ?`+!2VcLOn z4j}|u^@u2C`TtSXf(sYEhy8;$NHa~>H5d<395K)d%kqFIk>nFiWu~;tB|>#b)lxN6 zJPmmPT4m(XBS6EV`WC}tz@mDArV(t7pX80#ud`8XQOyjk-Q%H$pJYCN17{=f6Sg+5 z;C;tz-l4UmZ5y)U5_Q|+oMUq{rtK=CIK{h`vN=F1NfceB?%rWOYuOw>LK2V3i!JIF zJPzYKBAv3RAW0ORvm6{OQBj1$GTG?&bH1aLyJR@b387**7+}p59c`eafU*5NT9!K$#RZ^dGU_=9oGnSS2!z7B5-9_1*P;?n zoQ~+)SDB0-XFC0T()bBl`#R1nkjk^MwL#nNBcvmadr~>)7bqF6pi9pya9+zt;2vD9 z33jDU*kicoqx3j=hZl7%Ygx&F)kN+`R~|-+dh@yEINii zl_DmCL^wg7Wc=^{_*e1XlSLUqi(|$86L!iSlEi7P$+C>5ZHN1E!GGwUAl(#(6&=_3@U06qQld&ec=l%=CAY+l{%)aTSk)yXxrDZVU89NaoiV^ z4~h-;_GaXR5xIi4g%EnQt28f&B1sUvA<}jYNs{C3k~nt6sb_!M5k(PFDAF_~NhFAt zD29Mxb7O>(0<9v9t;h@Tp(Rc{T3W1I;nWAk1J^ca8cSAqW^=Gc5Jw}d4dnR*r67cg zriDNQSQh0Tg8?{OGoQnt$PmI4#l10>r5n`E>(uR%uDgy_V@!8|F`!gLXG;cokH%Ck z_lY8Kp+(BI0&w3N5bt9&97A;q2n|iukQM_5!x02aoMm|9Ab{-}bdsWl!P^e0Jp_Z2 zeSLzlGtwl-hYnb*=A8~ihp`n=G^A_y&|0pX5uPMfcwZr9jPor@nN><_OH&_^W-)<= zBuQB=cNq*4yzjWR`#T6JXzgp5c0rVgp4d%ll0*YBZMPtahj?#}>eX&HrVdk>KFtih z_d~nl&k(Zb$`N7(7kd&i_D(e>-+AZLTGq0bPpR>62+Ml-yAXm9LeJcsX@2n^{$1M0 zAcMpU|Djs&;KQnbG{Sq|7tSRKZQGv0Q$O$XG|w^4;stkg{g0#d#uKM85=q&VL^48X zfo&~utWhqYwZya*7c5zl6NIPhEK>Fb$39q`r^hnaG1gm}ra{?=5hMPcANliWr3k98 zKo|725aQz~20vtxyaNZ%VU3K86rE{^B89*bydg--vicpM#27;o4VX{gU^Ms)Z41`z zk)>M*v7oA6Bg?jtswb~9?W?VHr~ zqL27R0^??kih{NSsXS>61Vh(2MuP$K@=faIZQ}SryoX{4*1byC_NY!$q%_SwqG*Xk zATLH3+bdmCyq|))mit9a*R7%my%%0dO=}&A?$dVCJfX+!XXUBykXiu_ov4*DAd%6^ z%PjhOD{l>HQUDg~IwEC=;t1#vh?TL>5+^aoaG@TpR`m!tj)R*PXh|~()Ceq4F&Lyk ziPRE#xMYQfDDL~EwcvR9J7Y!4O3Wbud(A zMN#C8@-YH%%dqmrg;Oz#_m+?2iMsVMe42%5sNt*)iVCD3>=$Qb}FEg9$sdb(Ap^&@?XtriVO@VO~B*S-(q`Ux(nbCk_4RrLaOeZXS*3J6bGy-SirbZ!Uhq3dn}aIkm{sELz=`Qi<l%t8?MHAB$KHM+kCo5Bkuh-`0XUB< z!S`vS!E@x<2qz*3!rz&2>`qgNIK=oCYa`&ET1%FW=v;%6DRph|0vrZKv>t+MSC-*O2Ly8@u0TYio;1mg8`D{Cp$LsY7$uX-^-ABuE?< zEkGkE+Y;|RX`1$FGctk1BP3Lz#Izk*nxoO|)q9MyA%d9JwP>ZeP+VZajCaa+*vvK= zilk3-y3@iNPU!OItjXdNet{Z0XOIkW!Q+f$GP+EfK-cx1+uMH$Ej6u~kwh6~Jw>aO zBHI99S-p#po+8a@%#27`MjMjF;wHmkL2LHOvXsU0HHL!?l1$UoHvmZ-rAVDHC={NS z&XokONs}S1S&&32qr3nl%W{uFv4NCsRg_*+Uj z&=mf3D^AWP;*3{XoL;7cJYjgqo)sN{XocAwIL!zxPwaQL-XZXD)olIY7LRuht-u;j zoTd!&lsq3G(JTI;+g(CyS<711#=|{NJ~H&%-AdUmkXrQFj=CSQZ*>_Xsegn{8clX2M+bgi*2-T~quG2P_x~Z6K zj`4oZvfO1*Bsdz1EXR4Uwr8RpsD=J2iAz z=jlvCo(f_WIH>nXqL?I#DeDB`ogJ2mB#&|rf zD@jzrYskLI?vW>aHe>#~@*IYlyXbv|U4yXSh%iX@#f8(V&r7UxBnpttoVl zvF{S6ig~%msMzlLR|aEX26&QK<9vyC5j#8IAW0-`^Lw;r|0tzRO2OKGxWC0%!=M;K zkT}x^in`7tM9N}$i@fO5huliFI|SZ!t8wjCWBl~r0Z0EH&zB{m;e@uU$>MDSj;gNF zItOBc{~)Zg{`RFvocQ}JcR)CqM<1^Ygw;6?9U+Iu1a;>6ewCAdJbxWST(8>?)As3S z5uNQw;t{R!C=IiN5%&kWYqPl zoR(-hKp_Q8=kKyH+Cq@wu*6bRb~B223+JaRq_Uh*F`(-XkU|r@KnRaQ;r$XNQCQuZLJS&(@XN)&4VtspJZ+TpUbmswg zO7R{IFZRF580Q5Lk!K@}ZE;=_LVU&uxYIe0b~@GE=CcmxmkZku;=IIKOB^Tf;duJwolk37%UV9A#slF4 zELe9`tR*%CgwQOTiaaeSD0sJhm(6@kLxTzCJwNw!h;aWZKT1jjir@tVNh3Oz%ZfbD zDbfLT)lwdm{N``|CcpjLzs+npXR%mdo#WD_OFaEuU*ef(p5dvdzQ8aWQk$BlZIM!9 zgC_#~D)O+p;)zB4eho7FqkandqR!43;t29#N^nz}rXec^fMGu0WiUudl7gn0nx`ro@*>5C1zIT5xBv>gt3d>`9AW%E)=kNx z3zW+R#o!Ws5o(R6r79N;iq8Oos(zb1>my21M8wgdA}(;QrLG)Fk|9+Jp~4GC)yx>A zj{-4OIU_F;AYkcpv=Xhc-lJr~#^?cztBKSmO}S5+2ee87+asS5u>JroW1?6S#{)q0 zEZsTyT=lh;aXT9FB*s4<3OgP9$**O$kaR{Ll~m zFiKkxY0p$2SOG_Plp@Icck(jEAfiB&?q zKcL}spV|^i#RT81$OjG1Rw%8>iU?4j6oUsb z%^dGLk~~6^GblEhzFVW)0ks2YzDvPbS%c~YG4AOgax zGu`VaI}tQTbpoQF{KN`2_ON!M|4gp-@3&JWd!nx|2)8lS-TqACC|UW}`?`*-g$>>*B(9XVLlsWK2@W@ zaZ&Vb5sLHp7{rOlgS>Mz2o3v@{ED_oe+P< z-zCqy!{?8cPe$)K))DTi_ELO=Ypl4-<4*SFgD~`->HCKz_dU0(;XC|%*7BY!{3j@W zHF7>&EAgZu>gS@BBkBvAPm(%`FrFkzdHTvz{ax1moHd9>SmOx}3Z0=EPhw&U6O;Q4 z*S1Ik37Ry-=vI;V2<;`>OHvzCh=QKED-f(kixgVPKox|>qEWqP-v;oCLgna2FbF9u zI#Q=lffe-NS1v5!g4m}YyaqLET<(u|MNf3wTB*}u`N1{Xnac@ zYILe-s7dmKSu^FQfBdKU5C4O|$p7$5zrw38zRD;bVOn=IVfE900471%zW*a`Ti`ik zNSrBPyeCEH1k9q~$fyb{|CC(;aaj|H;|$Yz0umt$5Cfv!>o2Z6pc!qu&1C##M#ZB<(c=)dXuC0!jjuo$ z6Q>uLY<&jfa$pnZCk#hVp!MgtaPeQJ?Z!AaW-xplskbm)%wY5wlZ_|P@(~c*7(1dU zo*>w(B=Hv*kG_gA1CrzlS$dI0xq}xCs3oXdl-(aN7(IfqeZGmruN<=C_zMmlI+7ed z`6$t-DD;tqU{+{13POX9L$5Fr9j6@zPHghHm??N!r@BVB4+>iYk#v{#7{^XDFw}0Vp;(gm+ z!)sh839kR{ojEg?oV^cm-o42)5e0cp-{kq{c;EA_x4YU-pjkzUK6=JUDpy<}XE(V@ zHI0tH!+TYFPoe^H2>#*mtG2U!T~Awg$HA$V-f{Lp5NY3M3*6mycz!7q+N~U;t%1(2 z0%YNis=-m9jeEcTT^;y-pWW8kJ3qUVF~bkj9$xO`_i9Re`uT*@@5F6=S<9!{c<^`K ziU86FWN~6L@GvRH_|{?SRsO7@k4$8+v%kZ5G@+|ogbh6Pz%x8?w-LfUt38~5$Mgv@F`Rlc~tFHt?e?D-Le zaCVM9Sr_r~4Zame9M)ROx+P6>Br&#YnIANysia7+(xH(eB~2e=XXiSL<-2701Lz2r zW#G!?FHkN6vxABoH?DK}@@JV&cc^QN_Xg`7DuPHrP%X3N4Wg(|^~ll*Q8K_dg|m{a zt!qs8=WK0XCQ7!kc1n_emc}R^eeBEJxKZ==+jFcB3qt@=2I*x z%Xo5?*kMjzxY{-W>+D_Jhx`bg7xJ9*tlJOW-sV{Pu+RQGD<(L!*0gO)lE&E95zL9;wFmzm zTX>)CXdibMt?TF0uB{1j#f2gT#JZnnm00na`19M~kI#2E+v?b(EI#+a?$^8H`#!0% z^nZIou!P_V-XFKC?d<-C=kRyY9%fu0lG)nE5vBS_FR`sVQdJK1q1z%AYXjob9(lM2 z$6FBidH)i;HGK;rnC;J)j5g3c9V#!r^FlvBmXN0f!NcZogU7c&e@JQy5j=6_3s~n! zbxb1T{>7@{bC*7U3?pvgsfWLaYdpbNY~Ar)m!CW&ON9;|A3aVclO76H^yj~@d71tF z88>e3^iDqynabbyD-bIf(p09jZHq+mTfg;NeE##F=gG%Ee`Gk^L3P8eLd4cuhRKkx ze)X%2$77y-_Sv4~>pmA_`q8bFB7}goeU5!me2FKY{34hFDJE==9wQviy|G2g2Gi_7 zfH+c^)}rN@$#9!%S0BN4(6${~^^;9oSA9U;D}+lK4>ob$VGRVYsg_H0lQ5`OSZZG_M2RL;38?X zjTV}BZ@$E0ew|2xKGf;yAS`iq&ZvOt-abX9xN-euvb3XaZV@YJE8EwDhCtUEQjrql z$YexUfvIAu+9Hq)qwzVW;|DeN{rSf3DYCAWbt(LN%+PBi;?pf2ZskmUoj6v3Q1Z5GNqQUUZnuCZN>z_anI3b;_%5JR zwN6`F8xMExewyY-dP>(>XyLODev!SsDNkPe99Sr_0hIkdX_Qiz4G$C#_NR#9&0B9k z2XY{Ia`Q_#<0%Mw6ah z+6IbZMAw28Db8v-3xbqLfr>Rs9U2&(`N51xY4QT9W)DZ%8#pp!vXNnI#q?l@#d1pB z>@ynYOb;wzm@lu>`2)%loRy3w6W)INZOU?o(da4wlkrx6?@82iZ%EKlM8IJTY;0}N znVR7wM~IFn_DBgymXIX9p_nBj8rvWU%<6s8M3AIo@@z!ew1B{!S1f;I034mO$0K}L#~zxf@jA@Cr=F!JK!_@~a@{j(ve}Gb; z^x=DAu(sluO?oYBxm)icx24n`rbhuN1dDQk2O3u+;y~pp=G~mA&{!P)F1MZ?WwnL7 zYaNC*w8%u^S7%Q0gbssJ3X8+x?%3Yb^@AaZbGFsJo!-v>@giVFz>B_5UKlJ6i^bwk zYz~X*_Y)4kI;M|e-(CNMFgP3?7K6ch0}`C|Sa0vF?5?8@ABpHs`wdKQO?yi=fRg>~ zWFy_LQC%NVXj^mi_5=s9iu*h7;Q1GyBTsW)f9G``dGHa4`>@=g81@B$BgG5fe37nc zNusnTWb>A?EK#eZ&am`6dgXHvKu}X)?ka80J@~yIq#ETfMQ64XK-&(IjU+o6}S< zNOS6T$>vz1CCm?Ms&bD=r{tL;jyLJd4kAER@3A!=QZ-AIphsvDDP1>3X9)-UZP9oDChhA=Xjd-fHX;nW2nnLobAuMxBC_w+bLaGFwQO@0@RC= zbO2eB)7g?(Cmcgu$`7IB`*RR^?obGO#v6G1=j*zMPqWOXyZnv6@n7hGLlaFaN?q2BYDqPr9?cv5;kgx(?WeJ}s#ME!7bes>n~j zzE#uUwMV`WL+@eQQ5?s#p+#v$S(Xe21GJ7-7WUy#^tVlO3Poc(q?9C4g0+F+aLE3_ z9zuxw*!W&eLEa;!>=Cd;K&>W&wynu^&V2C#QqL*00%Dr3A`%6GfDIkPL5#I?Y}hA` za&!b;2W|HTN*b(b$qJ1zORC0`#M@{Mwt=d86Wi`F80R==F?JuV!E`%}#szT#o|-5Y z9LznPonhU(jK-Hxs)u~7o3}7#iH;!8QXDhlqz|V$JELxHFrI9%3I<^8n|K$<3qY0} z%wOZ;r3YBdATQw7-iySMV6p*Sb3mHL)ZL7-hHS7xHwlhnkoBdBqQE#$+Xb?r>W$jE zAXKRnbIg7-ZioR1UvmeGtS1Og9olY!sScXfRz2| zbv8G)Iap4a47Pdb+6Dfl@B0D%mw)h&`3ryHr?A$bwL*$DHThaTidDkjLAmXxpW$GL z$MYxtxvqN#*LcRfJJ2gR7`74~CfBpL3_{8duYbuCGf@O?k{RW>&_ zxpnInN-4Itw<*i=eT;`Qo%+x;;r@uX<#a30z0i^I5qf5JC;c7Q?$fn$=XwWM&++c? zmVyYR!-S@4S?n*kvVE0y+48IZ@YfiR#yDq?O5fRmwU&QzjfWs$Hb3b9h@tfcjYf^( z(Mu2asDfHD%8UMeOQ7`~Qi>yk5k+d{xopUbg5Z}#5!BrdSv+LEIG~6(Xv!8L1EyMHIxuF2=@xY6O{`s_b&uN{ zXxX3tbBb(;4{u@YOF+Qc2Bl+QL2wNrEGWBgP`9tsnCA%`u&CaqET5w+=M0N2tbK{L z-32k^*6!C)+M#8-`YvF(_yamKLx_M74r5-W>vo8f0lRx&$A^|Q8vrw;((LX&Pv91H z^Dg_-=OH9m)1c!9Sn}@9^GMYJjx5euE`A$0peesiqOQ>T*D>t@QL@2!_#~abiK*Yl zvn0=Q7V|xdL3;FjZ&T`nI)fc}eq`+S@A53>J}2I>6$+DB8xVh3jE8^!-}@_UZ%_C$ zf9gkxVu|rBK3L*7rmhT9By3DBa{b0Fe&WafU1HtWq1AOumL=;)xR&pf-|1*A>71eI zYX1H&{R+C!EX{)2R^&;FG#U}aIm+|-Ere70w?E|=`LNPg{pNX2UDu>(%6vZO!uSHa z^If#oC+6q((h}fqpmrr55&F6`8RY3tZ!?OHq32KCzc{&UpXg0Eu``Fy?)W@M=7l(f z!M{7G;I^r`Jib6xHbh?Y6aV&~XD}*o-VwzytocON#>1V4jy_y~JmljH**RQ!{H}QA z*kA7T`iln{L)F&2yz?@jyV$21J$&I27z-!^&+mU7Ej7ZbBmJkCr`I@!sQnM;aCQ;7|mTSQ1z=8V-6^Xa_n1<6u!fPZaf)U5n*)hJykZ zW_aHhVHcUigeek%^#S2E{pC8GU7&Pt094H`c{-snduSaq%ws$)!=eBhJcb~9rsp_z z7(WLL-V2-$M3KV!8YO#H>1B0;K|aBnTf}Kj@Cs-t%Na$niPR3EG^5doroBa)Y~y@` z#sh-Z9FXY=rt64eO_IiR?VMN_wA~Gg>4XE=b~pr71~ucDtATlxi-InbyVW|M$j&*1hkYm?@;nR9?*K~`Ka8!pF-0?fR9#S!3t{M(D;fMcD?}`oz#1&l_yVe5#t-)Feql=Q_ObJoDYp@Y2gK_PNDA zfM0nKR#0fVXPUrvmRKiLO@)*aB@}Jj^0lx18ejRouOL4K-~J&CThlajU5}2GMkyh5 zD3#Dzg`_|rsO>Ig^Bk3Vg?aTdi~66TqB)j*JSBrcj`cm_OJ^3y)ih+9fD$=MrU+sP zJ-M9HLm#t8{j9zJHSzft;?xhU_7PPT9`U~8a3@;4y z%7$&gveAGIdnd09$gLWgnM}?_CX+em8)CTQnY_61-b*I4s?;^8$Wr_s0`cO$7dP%X z_r&?l-><+TfjkrR_5f`R-gOAM4I#xCgZDK8vxZDHbgc&zT5DoR2wsxsCEzj1cqq#Q zk~E>ITF{27`2gn}UH1{uTVhy|=8~@8$0QMG*Urtr*WjGP_HOu+07OmjdfhLi2|*5o zPz=`;0>mhA-UA8F3WC=lMiA8+ic{i34xRNcijj z_5UDv331>7(MFwsPmD&VzbDB?dvD~oY$L2=X}z`RM4^o2V0l1BLe$W!o=){RYi5jNTX>~M`tW(NiADCZ4p}0sE%5;^vbaa3tHLXq{m8!mjNd|jcBpbVWk5pScQsK zcC@miiZww-dTFu3;*`ZJM=v^p^22N4Ac>$NQ3ZO@VPy|0va(B3mC(uV}hB~Mx1nb zIrMP0v7whe$Ve3`g7nm}CdxpN;bgAb*pZZm#xTOr(<|@r@Bh<(%Brru_RG^bH}ss0MkFS~ zc}M3uob@>CF*;ux@{sF-y4?p_R?Qu>bVCLqbZZQbp*dJ#D6<@o1rmyUM$>jU2U4f> zeG8jd`E~DqYIX+2S9?6CDyKhp5E3-sRn0* z8YNQ_vqje}QCdK-^t~lX3Y0QPozQn3Av8>VL zX_w0(`;uhT%^aciiKCh(BSIKD`rEcbN=@HaXp>`-5h1p;Z4V+v>YOw!fCMShwPRsu zni_#dhytx9^xaUNB2|fPdx!~I<+Oc`k_sPMoC8FGP{m+aqE4KijeLVeJmElm5|cDf zCY#&HMt;qu_lt}eDTltl5CV1A5=CHdvd7K&O@xSOp$T#wM8YG5Vo@(yFegYsM^8&b zP?7!B{(y5NB0&zNnY(62?VucGWov)ah z5fDg?W=x5T9rNlCNo3I+(fAdG%n%|Vi0D+XVu2BYHmry^N|Q37L=w1H-KNwjJq=1k zJUu(o-OWn8h^mshAt#QIJ@8_(#C9~;_rCl+b?U0hux|+#&%u#j7Y`jHc zG)K)oXJ$L}vBT2S#s-;4WFm3O<5d_QI-s;dCK4|lUFc6T5?4O?TcQrkW?RhLBYs)! z_fX>>k?S&#Br#mLaGn=lc#i++fA}96sWD1uT<@`A!0^v>jzm$l6^TlaNS5`I2M-?b zzyF(m!+-G4{uybJl4L1S{O<4JDNn#x|7wiE7{h8=QB_0PPogtSGDe%BWX-6ARX+zD zNiu+Vm-%?TWoS}4rs-O&^8^nzG}K*XFgm4a?xGV*-^|I%DasfY^IOEA z(RzwRGA_q}r1u?C3>gUT3u2rADdlL3#yV_t7?S`I7dSnzkd)rwCb6)eXI~ zC{rSJ38KUWLs+xNX2}RaPC$}o6Xx^95Q$E5TlSq34HV^jPI$!j*mSy zvXS4~niK=z$N(zpi7_HkBp8fJ$S7z-k3>=XhR$1>*sxpfBGI(I!=R~MgCXJU=qyM6 zh@2dQVQClKS>5Ek-XoI&O(X@Zt=S?c6_SLAB4A=*M9RJ8=WOdSdt!pHJrkAjaCsX| zpsD9n@sP1hIa|)Kw&Lmh90{;$4$uVpeuc1>v&^WgBTA|9eM3UzL4Aw1nRBT;3v}ct zWUypNj_P~pI8bZ%^@>ag&ZT?wbV#8o^oWD%2rbM23!e@gR2GXua=*PtB+}8b>MDc~ z>?FG++N^Dkgx|2qMtaaS-+yr6can@1cyO zqGsh*WO>eEcen;4ix^?(uvC6U)PX))`Z%N#tFWS{qj4>7z4}jv&CJ1UXPZT{qKPe1 z|8ngqgg_t&G0=w|qYX+a{`61(ly}~FhabK3LwxHQr6s~e@DULrctMdB)J;7!TlYPG z{nvku5Q0Dc<3Gk)JD^T|ZNEszEM8!D z_bsY+pDZaby2M#QqDw$iqng&-jkvDTAiGmO4Wp3QJR z4q1+DLZT-qSqihTUTRb3TU3b^gX->?*%b}i~VK?{)Pu{5blx3 zV;mqSirPN%aF0ATN_-=~u9kR|>N0#Kt0jmy2DCvV4X*b*TpcnS?a+HW9CMZ(wM!xl zr5G{q=O`3oH3A}~9#O+qJyHMwAOJ~3K~#r|mWEQ5^zP8FF$Govyi;1eL8Q&4|0rT@sa& z=Y#E1CM8BC9CFCC+#>kEPBJ49*eiC}%D0GkmPbo+QiK;IXePykkth%dc8VDaMdjvT z1tUgSYdKTyA&|%@XuFQKZxBJC(2TPY895M{rc(rh1q(7VK7V)H zF|=*ZBpK6$hCQ>#IG-?gb26DAg5*rLOVia9WaJ{F?P~V&U9^`hn*}B)CdrsZd&G7z zV)B64Ig6>4P8e!O^>1{o;q*dU%&&RC3fT*wQ=e=$m{}93B{oTqGJ7Jb^fD zcp_ov%pQO8Cx60U{;R*@{p%kL+oT7HLPUw}29AItEx2{-7XR&E{de5CeUJa_KmSij z^MoWZ*so*FdHnL%KT8v=g*40PJBxKgG+apoA|p)-dhb|uJy6oLpyV#zPAKxHQF0sW z3cOF~dr99XK!H)aWa(KF2{LZe)Sk)Y97ey!=byhr-Cd_{u5j+mAA;Y-cakjGL9s__ z&eOFCM$GUbM>1ozY(Qib`B`8@T}$fPQ6zhWs0b*k+A%4frSCP-7xcBl+LBbCAx+K_ zd#)X5}{RvSFmg$X=1g zYzPKAiS2r3$qeBmecRzXk3mz&66q8Mjdz}N`8k&Tg1&DVrz2t?aMluiAohWAHbSGY zZBNtIO!EnC+hEX0FW4T>0EspQhke65b|lFJWX953Fc~ZFNb@O+wntLX_{d?`pw);) z(-Y7{7is$j6(n_C(YGB5hG{XO>sxlrHh1seL3%;gwZuLQ*H!oEXh@tHa1LsQYwIPk zj+{yNIFszKCwF=9@E#gP?|Whl7$na2XcSGXd3N_144RdzFd`)ke5mXddjuPp=F_1! z&Pnbr?-9IbOHWBK$S^n>5=Cz@LA|>VC@*bJYDAWikB~v{nC1r6mXG?Dl zjl?Kcs};_<6A&}+Jv}|EYQ@?7EWtSr!U1`n6P#zuY|*$OEjQLBhtu62^56W|f61Ty*`IOw@@4+wFa81{1c^>)y5^U{zF6?L z_9ElabA*tPny2YH*x5dhk|~qP1={vwOri&aCq{05{t>8>s&v5G|h^pT@B6kWEc(jNYge9rC8fE zHAs>0^rg4ZCSz1SOIbXJHY2nibN0+dj2KfEkQcAueMF0b-gV^J2=4{f?_=~Oma93E zjq~vP5c@sh@rcKW5&DsbV1uZ&k$-6OWdJ4*BuXQQ93CFhG#!aBG|P&&UVfXGrZ4i{ zi*I7Qrdie)m#~-a(HvEL@BH`p{<^Gi<9mln6-p^qZplo~s6&sXWm1&Lb+kifik6lD+_U%5QP6u!lIPr5 ze1RV4^dge!@|Q;5lv4Ec>vUio(3kp#tz^owUGT~)uke@u>aV!+)2sYn|L6bBhwp#H z(c+M@EV=Z|Mc)4YAM!8$<-a5=GfG|JuvC3TnU>UbMatxBeSe*UG?fHDI1wR0mKAv0 zQsleXCZ%2OB9lOorD%PI#o{B1VoaKz!#gNP=g?w?>*G)^<6DX}r>R$zqg`&_yG@K0 zK7i6KtL6d5q@-pC-IcpAx+w&n{!bZG;Hq*+uT(yGd1n zwVF|Rp5^KQA)qLpLW@1>rAH?nQnzevZ*%9~=Y(J=%X1tp_9==SDGIDx;CzKtyMz#N zJ@mFi$qeTg2nEty#@kPD9MQ!?LP%Iv(EEHkas{j(Q1+ z8PnMV@_YvnbglscLJZ98c`@PO;33=FkDKO@Uij68$&mbMGnU@^+@ z@bK@*Oit6!NzDW)GP*httYdE%^1Q@_4!yA}zxl>nl&7U4QLIsxjsf8HdXIY&Zv5uv zZ{#;1Q9dz>9Emi(Lo3a6JRwgr+Pu+}mvCO9OW zi=@UN+Q`(DG|QTu@swq^L^gp}FT4uCm>iA9*Bv7Fs6LV?4c4Qh@(ilrRh6DXvs)9Tbw%v4Ln8Np2OQOzr_ciTxYCD=qRy^ zo+Md0wGhCj23k)POW3{SC^Ncbnv3*Zr zib1bOLDz?qAmI?xR1hU?(^C`$JF}8iv!aP}@?t{O_NYwb@K10g<*DQF5 zLxQ4iYDS|89w;$5EGj5egs^5@6^~KFCnBNhD}<3~p>VcmloTAUj@TZ}Xq%4dc#F5+ zew#Pmc!Q!CI329DqG?t-$vd ztu=v$-QCxyYtW`-GTFjp4OMdst)VC~Lg-j7Z?HXk=A<(-&t~}0p!AxLJM{R_k{22g zQ=9|qJ4X2gNQSk8#AriZLs}GsP|oH5DfMtDy7zExyoPlzB>DS7;5>=~QS1=l!sN840Yh40}z&wO`i-_h{y-S-FxgfL7-V_uuS0Kkv$zQfBq zFAnS9z)wDYhuLTw8y(BGAyWl!?!0nBhx6h6_h{!e+v6=RO`biW$9Zw~5&)kad_rB< zyz%Wf2b67w^L}*rDa*DdOAN1W54=@Bxp$R6c=~%oThW>r;mW=D$V|qfTJYAh-vJF* zKD|ER8)(7%?_Vb`GlGC;FJ6Y_Py+qpxnT?+Ja~^ZPdHjG`0lfB4e$T_9Y$%v^V8=C zHL{NIU%h#iq9_K(K>$6xdg(Rj;HS5*U@}di5?)%54Fgv{dk>uq`pa6&_b$8v7T%kG zz{}e&f``xMU-0bK#ldRz@WU^Df+$b-75PhSiLY`LZR8v4JcuYsf(D=d+MCBrP9UzA zMGQnQi7`;dVu+*;NR^aA6J21M%@F;-6_JY);UOg@@k0;4h^P3#T0!&y?<1)x2o5q) zl1ad=$Dzs-WvN6?bnD4|M7b8KI61E6z~Z3(9_h5P7!Ml(pvb|(B-z6E5u*}ZXVF5T zvjPGrB+8_C8xZSnOhR&kZW4N!r8DS;K8Ykr@kA07-g|hXR3&2o};ppfdTU%3#e2Qy9k)TYZ?;l_iLDRO3 z#^7y(j|-#%Av9G5MUl|;`*<;@@8|fqT01d;wmBkAfw)hW284tdB3gAQAqft;_8!g! z@}dMGm>=C=N9{Yj?MTcT_GhTSwYhPqFYn14-Qk3E9$l(DZzP&A&_TVr_pF(fd*u=zO4pg z2C?73<$aUoN%v0J;fpN9WB;~M+8g-|`wl1EmB+-CYqufl6TVj8HB7g*2vXpLKsW)* zLB-stZt~3bC6XecYt~k|hg(OVb7A&02uO5_h?>+Cd~4@hFdnut0=znXnS1R$K40CT zX)5x<&>UF4cj3)bby>rAFTBaepM6M|c@k-ObM^|PgJDgC7cRWayPsXB>-_L#Ne9Q} zSnamf@yfSf9~_5A+J&B(QC!qq`qtgC)pQPL?7aQ`aprnBn?bFf!-)$@9Z?9@{Y~y#Dm-T)+3xsmY+$ z^Ob@z8LsiXdhw;frdgBjzCL@ITZ=oa)Dc=K=!WsXy#3;Eo(`TZE^>04J-l`9yS#Js zW1I?zI6&tPwnTi?koZy@Q7zam zw^0&SM-`*3^5;f%e&f+2@g%s`_=I2AyP*I?OECr|RvfKXY>jqt4ytBFmKJEUjSvv& z@e$J0QFn8+5uCsH0{8B|kMm&CfRu1>c$2NIOB^131QLRm6#26p9bG2^TU%qS9e5DZ z1Y&gf2-;X8fh@~dE(hZ&F@l4`>*V=aoZkl)2-%|yNHg$G^tPcWUclL#^bR_EG%$*K z@Btz%5kqgmq!Fn-ZMV;8bQ$L!()U2@5Cg?8tLg}6J!j8?a~)}t(|0S%a&UgT&N7+J zaCXpW)(vQ0&UfTlNoVJ1tr(Xh+76TsC_TaVj(l8V9k{+H%Z3bDXIChZpfz;u0tC2z z!E`#5n8gsVwj)hbq=c?J#F&)5GvHji*}8u}&AHR>C~7ku8~LrTG++qA3BJ7Uj)@7g z5%=!hqv~tYA}3AEn%Hn4A4S9E?Ps~Yyv_OX`5_o?%t?%_u3NnKyz%U7!?8Ks+P}et z?Pnmu+0j|vUwlk1QfRSmb6 zcezlW=OE z(ekb7^WZ^5@fgW&JYgPxbpMHuSu&e2#_xgi@W1?T|1);uJp68)hakyg!9V|x{}UW; z&0nzIaHr*?!T+zVeDTHq2Y5zB1_Xk=O7Y_N^-zeTFn0rng#M1A58=jE?Ij_K5dz;lj7MbNeH#{S2ee zQ4~;lfgYz9^R8O}EpB?H5C z=xN#|)^$jkp_HWW-lZtMO$-nNcn3B-Aoz;58$v-@RzQq29i)Y3x&@Jrx`8bJHr9TE z){5S)kWnI4L`ubjhtM=j#^ceZk!>Rz*~o8CJoKSwYiFB0&*_34Hng=B8IOZjIqdK6 z55{x_tJP|-Jw423GkR->*A5<3_t<~%fCr1)?CqQf57t_oAF`-fDtYhz&*-HcoRb<% z0{0%=rx`go0#f+a<>v-tUksm53(0{82b+f{#3(oN&2t{22sjaN zV&gpgE<_29bv+LsK13oB2)y^W-jk*Y-alTp^fhySB8-a>F7`;NshUI5q@=38;OJ;h z)6D5D_|W0{9_Mb-*#%k)e6W;xNmYG>loF{t;BbCPRbRuH0v{Se9P-3PX}JI38dBs4 zA*k!2vH9Np9}}a+x(@Fn*53fyp}E*CsoNXW^@6(TDDsl=B*VHJG|eGNs!%eaw@VHV zui`^X*AET-U4I?hJCyds=vh@)NYfIK%;$G0ih{2D1nZA5O3{T583SG0(Dgq>k`ftU zZ5NCC%op#HBn8g(cwZBPVE^DlisD)J4}L_RmE>f!c7c=w_r!dD4P&-g&Xs=4le^D1oW1|%{^(Fa^;Kbyz$g4m{dazx2v11j#h&) zt)S^@`p%s=97l^o_V)I;fB*h)Ac4AT*eWN84B9r(*_N0Iitz{}*dE5SEhyT-Kwqtm z^>yT*X1G?R1k2^}q^Ba)hSh4tbTlRSz_YuT0l0l|i}O1dKr!fodNq_Zt;fB+JELxg ztnZib3fwTJA}d&}YW8L`Zr-~=R;0}9C4Fdldodz;lAerP9=~5gk>}LQnon=u z;Ek8wV0mv&UwP2*+S4y{Yjp?PpO&P$uE!`%wW?05%aZl^x`=lUQfT@X?}z$x+w>S? z1}-Pfz=vuioo$C^_sAnq_g`KG;jtrY|7jz?FU|u%kPfFd&cp9)b53&AO)3ayc(Pc*0>aXv>eV42gjg< z_uqYw%p`PuOPc4DS*`R+H z7B3wOdpI~e$uKq_<7u`+LcrsQCkWAD%_=>xOAEr|(9n-8h9_1;Z`98>(|L#@5amD~ zzmea;{7Z;ZuvjdJL{gn1q8J*bg+zPx?bQO0pMeAiXzb$7T@B_XuL z5Z5f@5~&T&F3?&dbw&&gi5}oAT<{2CF*3o^k);|zLZVYzdx(+-Z3Mktk(z?KJ*3E{ zLoY)6KHzw8@CAF@XX$;5?E^)whk9FAqjiFi7BD>6zscUtE}jNSiqb>Ys_o}!BZ)W! z9v?cgB*%sZBL$z|{C`kuG_fc=TBe*rhiqgc8`;ROsna-(IuAkVq47aVsOyT5!OqU^ zue?KBIqE(!afdLMs$P(T+f+N=!`1ATPpT%TC4@lj*u z7cGj7lkl4lJpZmQzv?OAOwvXzGV+$DyOCkI*`yZ;vQP1D8g%dPtfT*lxvWv;}CS zObEUqhL$wVQ4*9&sg@6s(x6l_WPoD8b`{!ah=Hy-L`Ve~e6SE4-gbaT5!X%BJ#~FR zW(q{~Xqk|j4DTz7tfXy^aD7YPEr5=_?Q?^Zq!P+}f`}H|FA=c^Jb9jB`$P72b^(VZ z;9ZMg==abvVw6GR39-RQMWjIz=(-it(U1Xgu0_j~u3K();Eil#BfnPm;pdt(0+5o< zb{L~T40ZlZSPlQy!n{79i#1p8{}d8?elA>LJ>^h^VNsL7>?0XGl^54ci#W;Nk#)R%)`46-@{_L^YHF)ya1&YQmGTZ zNmVEu{b|30j6cVmm0xur9)E1)o11w6kWwR2CpBrC=YP0oDfJp5XfWc6w7{--h)1a$YZnABD9SOxw@9Ty1cDF5=ut}GeS=bpJkQoU*Sa$eKnA)1996d4`fS(G*d zB2hNs7`Lx&4k^boh%E>~*S4hD6r+wgO)AoSLi8=x_asSyk^{q!_ZFpw-Prk#qR5Ce zC^e_8AeI0CAOJ~3K~$6&bzL`E$ zj~5@%^bLJ$vC{IR+wY*YB)Y%{ z_pZ=8OVn_;zr%DoruQ9Lo(^iR8|G;=8)0P1${*mp<=s2iD9VCmdxX*h3GJkqV6CGK zJ*qH+BeTwsl-ngn8u4~AqBN{9&couerLvroG4@uIDWm6MmAfzxV za<1L~2|CL-S}d52cZkAsZ?(_UyO+53;9Yv((}ory1lRVjVpPJio1?Yn`r*4oDQIa= z90eIqO&0kpteuT~gPaEu<(f`ho=^yFp8w&VWfTPKPGIQ*fy5+V#=!g9i(hkDw1ZJ@ z2H8lr}{4tWUw2tP$!pC=;Z zKsZEnD3yQ+Yubu+;cJY;E*B+A57>BVR&dgZCLqg8i0jU_2x(eCv?t?Dvw9lct&-E|oEXNNrYWatRwCpOb`m14*TL{PLtlhLsv)l~734(%v`9JdNF1x` zB+)>>b_OC!4(mw@y`KAieO(eE2J$9i7+`5P1aTYL$VPqxjsuT74iOM)=nL}!DJ2TY zqFS<-ZXqPN5b)B`2Zzcejc<^-qK`enpAw}bKxNPX96{s09V68wk}3|w zxE4ng;JqVC@B~OS4Gl^tY+N@S2l(*eHDUq>b|0?;i7_|=bGIOvh!qx*Nfx0(NP!d* zCE`gx#gzxwh$`~X9}r9cHNc?bAr>(AE1U{=2{Hla10q808)7C{Q6Uvn&LcE*VTBoK zD!(F%KsHJ_U>_p~WT+@3f=DkdE?7h&@Ob*r4SjP;Ac@2fXxky6b-WcN4#Mwi z=3y}F~P6jv{bHT&?!f!N4K zHu9UZDB>fkK?+Hhq$J8vhmM_co4)H=trqC5HJh4TSF^;&>RH5>cPAm@u%kW-^(x}2 z_E7`pP86rLF;RGe8Uicgcn_74D8o8r_vkMD<g%P<%@cDUrrF=qA zMV@942*+mc&v61y-x&!{yzXDLSBLdA{xZ#`wBnB2h;3(Zi3KyCqUea+$FROM21MbVn3vv3~#QXFl4r9@qCLd})>jmr07# z(S)C?y~HE)7rt^23YFnQ#9K@2J5rM&(S#U?HV!P>Y#fE(mgTjPjr=29#*!yy2L6Bc z-YmwlB)#wZ#dfy4P%Mxu0gh|V=O;`rOvG_m>v$4CYy1IH_X1Z(1%*wpmStG&^aqf~? znN{6A(^Hw*_bZ%=yyxC~?m2PdM122m`F~z7fDyZ}-z&n-A2W3KUN0VBENtqK zR^0M=f%Kw1XWfQ@i$kEag+qEPIG_JWx1DBl2;9s~c)6q|z8-@;V0zQYfZHjO7CVf3T>Fxdpvd zv<0-Emv|)3`&sBUPT>S7XPI%Gdx=8@rCzjoUS8tb@2CUTfB*vKfwdCHEhTZI zkevNq0e6Vf>)Lqz1rY~v!1)8lx;yy$cTK@|3tp6kKJ^?DrX@e)w7banwFDDOS;|s= z1hU7-q4ur`QJCk8$%IbYrEsAJ!*0HdQK6Wn$4xWZX5XBL-^e}uAv0xOgz4U+TZ?;} zq$|wA88kCB%e5tul@AcdV`kt%`djBf;bp5(PZeu-z)CW;+KU#(G;IKo!?)J`yef!= zArhJ!*EU((SS2rVM$LpX-80m-LOHO);l0BNIm-~2LQ)q6S{MX^?WwV>{&-t)0+hFd3eU?=05+!foR)?{ zlnd`mX7m(de@v`d=);BNXyNt(nEh6Ju?TGLL}&HM?uq;~6QlpEo`TyPPb^;Beyk)9 z08gI=+%07(OIgaNH&5)5(m@PoPo3rF);3}-LSd+E!)n@LQia+^VxQ+>8pkiEc?@Fy z{>=N}TLoSyWEpc$y+CiE^M_@Jfg&A4uzFQEgPP7pGfstVzxaJNwf%V+{s6n%)cfEG z{kET>VffF&_TZA-tA20OtQCt>o@1gXc z;7%{)3#P4$Tc7g7jUhk6bwn&4Rn7uhX1h}f(lMHh`FFqeHFm`WnM7gQvLI#qq|RdM z7p|iXsdmt=Gp>!(cL*ojnXLU^R3Q{ew3O7;h<0xELgEQwt%pCWLHxF+JD4 z;33j6li?U41l?|zq9_nrQq~0~jlo$4ArH&ZZ-w*J&Jrn&G@2?eh_jS@G$!qKuvL9z&tE!?DGf0RzP1<>>H?Hi zxlj*aI!DV-rXPOh$^Q^)&-VSgwjg8v+@JkfqFCV_NGWNW=73`!qU;@d4*Qhf#m^r0 z-l6-a$<&LlS*Q=OZ*{sQ2Vt*QLP{BU!gYkRp2=jw#>QzzqY-soa^cx$_~@hWGZ>8U z9@3(bJ{pp;;7=!Z`Yb{D@ zto3M>9tq9c?^{a6o>kW!s4KdKakM|{C{R9zh21Zq#fcWNIH$A_0PyffmI%d4IT%7=X2Ogjw-`7?KkF#!$>hWc>m(} z7pS^}$Ka4)<3;eW@Aqe>FtMNTwau$oNGx|^&WzcK-H8wXlNz)Xi6ha7gcXvtC^vIsOa+1iW zbfOMgni)XQTH~B+ldkTXPii)P;yA__#sB)-|2y4o7l6TFK)>I=m6!XtEx)%|?iRp< z2)x%*PH`#q{O{J4{u}@F*ZCj+@&CYI{7Zk0U;evarz$MQm{~f7pB`_|qP3W_;91J& zJ3m0+j~5Gz+4lDK5jn$sO3^2HCJ*|4h`OFz250Sb|FS)CZSbH@jUMtqUxWG-B&45S z7C>$r8!z@Dn;M731&jD>{;RPv)LamPg(_3G%MqLt!TLR~5BuDm_8ks_C zyTf@mhrI8^ov+*7A$QUr^85Za=iA(|pZ8zyVV?&lT3TH(uO~4J>D?Dh;g`VS_<)Bg zaH#8grbtgg#J~96e}Ps07VFn>k|~az)Dw&`eEsWR=jVRz=Xl|T7ciLHFc=>N)m0)J zuyv^RI~tAXcDpF0@ZKK*05Kmw({r23^lu@K`7|I7+M(ulyY?PFYUDrfWbk~6cFjJnRC<^h6Qev$oilUiC_XMbxdq&gZe&<45?(|x% zt57N;P87fT4}Xn6|5N`ur%!eGxBvRT$*=$8f5fl+=l>N^oB;}L81DK z^Ac+bsbJyv1s!>YUKoO3iygVuUxO`h%-$9Mot6>RT4J3Bl4u`mBIuD*X2jYg{w{&Tc} zkE5{`rPS?eZV-)DzDmgu&=($^l^D>3@c&?O7;BcbB1I%6Z zQw1>3bDVQzS%wtHdjL#EIawzKCsf|j7npA?atcc^l*b&8=Z~VjmhQIt*{vtv)SSqqO z;}^d6^ZeSc{dauhzy0q4gLl)uleb!G_IMtai|6My!D>C5|FqWBb&U|>NCET%fxrR- z${m%oeb(oYFzrDs0mMm`X>|U)B7(d#vT$baObF-8a4<4qVVd{BU zOd|I7VDgpYB3YKw6c!yT@Nn+obNu?dzfP8=`1&?=z>dP?FF>fkhNZQ}T8or2P@o=> zoClcaJqRIY=OcueDP<=LI4mmmfNjHt<2a_VB}#cNU3!Jlc$c60bAO&u^&wI@q=J`T z_zJ&!&o}v<|LwQ=D}VWC5mJ4^Np?9Af360G$po$SEnbHG9<{p;8pM=+$t|!Py1iDu zc0!Y4aRj@CImKgT(~@AQ<;_3Q;KAYAe1>Vdy_{ApxKn285y)I!%=eMV+4(QqvM%6A-87k}exBlAC@?Zb`U*#|S)L%ub1gQ@y*0z)%mo!a7uh-ji52xe!C;^8# z*Gu@{&nnfj7d%X^0-rSyb!xPBn5L2>mgg*ddJ4 zQ(Dn!#be>;MjN$kk5wCt70Ws1#Da$@aDcf7V$Y%}4z_?Dn^r+pS41YFswPR^RCBZGiRw;WL4Uqe1Cjpp>(Mb2d;RFmnWsQ#aK8_$Ccd=be4euZ89Hh? zI#UI(_7zene&XNwGdN|j-r|Hqs5xi|I9JS+E-xJJAh)rEKl7J3j<|4XERaXv&!K^mug;~U@L7k}~Z z22-C8VFQzKa{y>q0*9sSl}@LF!=t3eVcFc>=G5s^TpeCVA`sDB>9Z|p5FT9XdGLD@ ztC#H;tCegHH(BYe@XmX0Q`#IOJ9BTa5(mt8Ki+vqwEv`({EffjU4=#!7} z-h1z{lC8{u@KTPKIN`9`ktHd*i5PE=xqsz;EEXD16q#kT?nwp@w^~GxS1W`^D~)v_ zam*OSPyEDBFdmPO!TB#I%_9jQ7S>#AJwgOVtg0@MQXrKiOZx}}-ofwu_W#8%{_Xz+ z+qke_kXn$WF(W%}JqsXw%cvt3 za~?Q2bZIFkf9CQEmBdJ6ID7BCL@Exdx;E6K9Meq~=9_t~V71qJ_@j$0Il%iMLMc@0 zvf`ir^WWjx@CLnJhmQtV+30W3G|irKT(-xj^};OxfOIeIF$$%4x=I-efV6M7rmb?vP)UYXAz|Y-aD*yL?$6G#%PryfTAo&;tVBY zCgVU2tmeh3(Rw=enk8^p$|3WYBrypg2%y0=mT^8IUCkKRldwVvKUe|8ZX*h z|D}B4#CeAjlIz>osBA?|iFTlfF1EoCX6 zad~Dm8qw``QA#nHOvthxMNuH7B#FC}d9kPPVp%pVlNmI&z(kt8yod+Yd05I9cJ8Vj z+88QdV?;!nWOT9~2v21zv@r|Bt!_rqI#bSsTXHIWVUedq*{1 zS+p>l?K4~a7*K?7C%Pm_$g+${Jz+2y(CPPBOIH}%JW!T54|8R$)4Kkvsv^s}c;D8& zSQuAIDWnqQlY%sBtG5e>Q3_ff_C3qC=b+rjrF;R$o>CGV*s?*ThH_F;6*bn^L?)T> z`1{$2bhDA<1+x-iOZfs~2cYqmIE}Hi%AB?MyhJ4(WD?ynquny^ect95=cq(QUDtT; zNz)V~6~l5&?P{XLEOXzFaceL%O+z9hq9~e$p=q@YTRQpR;h2lF7TLy%Grhn{ zd6|>+6D*!?+NGonfVc(1%l7!RQ)7m64ynT^Xk1MoFrStyT!@edn%U!%}(NyX{&09d%tptH4htli9nrc606H zvu;xbOzi)8xo0ybo;wTFeDeYt>sVXcpsDQwXQ2cX&Pwp6-Smu!>6TgZ3miJ@%4SAH z<;n(Mw;J#*_i9=+ZSTf04%+d6N>#fGG-O7FFcccBcUT88DRLxuaqT5uTzx6D_rHXg z7_>_eD5|O6b$C01pQcaA_5G_o@EL?7K4v{e{1wrEI6aCt*2 zVssA__rFh8QWn)PIo|x-arV??t|J=1atbgif82iUi+SGBSh{ zL>M9r3WY|`Y7N-Rl98esO=@HOF7#NzI88!~tOY%~hz5ic7$Tgt7&IC~l~-)Aj;O#F zj*JxFcw#h-ZAj@*HkR7gM8w2IRKtRx)+;QYlmwG&URr&L$i>7Y2q#bu6069(A!)xY z8c=8&K%j{+WZs}^&`#p=hC~>Y6bSF2bi^32Z9;t(<7ES)nU+IB`vrwVI9i_6A94`O z`Ml;20#_c1V0(85uO%|lR9Gq;HIAlzlI;m?K{Cq6L?j3#ld`}NwZQmzU!TRJP&7@0 z_ZI7GgmIL94AeMZ-Ll4sJ*)fDYr6D29EF9rt$;kOc&xRay%s{uHV9!ROF15*RG6IR zRktllDV%dCE%863?ilDUU0dlC{C+&|7e9OOxZB;`MM{bHU>l1zVSGuYe(3W%$s#<+ zNQVO7wV(Zs0N*%-mM0!y&kJ`g1SU=E7J7*<9bZ28BGiBZdI|=XFW>h(mo{HV=>#1G zJGZieUeu?eA|H>rw{w>5e48e%h`qv9j-HQ+O~RzA80`*;(g;sYqEb+f2m^6OF)mo? z^eKy)v;DJd?rd{vb%U+yCc}C_ztf|^vZA|8b|;)#S;bOwefI`Y8qtdqin>4u$-SM^ zjK^avp7l_g2v;M)`;=O7PaPs`~8gjJbF9K6d>z@C{5P zkM$nqdcK2;JgG8NgMydNel?8mfkSi^iAk}xKs!k_DUn&iq?(|0gloX)gcw6HxJgGE zR(f4ZUz4UCwkNwGF&a>Q!3rXRS0*SJt^dNw13Y>^!nzOs_8!7cr-M?8B+3{!6FPB+ zQ8grs;#)mxCuxpD&`o>fln4Z;45 z03ZNKL_t&{qI3nB%)%Jh7aG4@5|`lNNCAf_IG83#`!;+;DMek^vr4nm&pPLhT(#My z+&VQ$$sQ1>ltN07aT`d^TKA2Cu#GElwpVw(>-gV54(}Q`v)%02O?Hc!izem@nOb0R+7K{;Q}o zMmWcXGtWT=SKfY&7w&sDbc})5uU%rC=e&6CE6{-_?t79eJC_-iBdW6EOm>DB9{KX@ zxw?4cRiu#UFp}Prv}a{r0zc@`)#BF|rz?<7|urt_U zt-s1sYv;o`Ui%{qQJ`$DH5cyx5|p7|-v0i(*g;KCWk~OMVk7kLhua_U;MzkoZ<;RP z)XFL^oOvE1`0n-Zk)|o#DB*#P$HQ=5hwr}fUAnz4JFcL%7601#KMq5G&#-JHZCe*fKrMHTRJWXAl==rT~>JXmQlvGv4P!Cy) z*Qjj8nptB~Pmb^04U}b$>8`Mntuxr(LAbzr8OfNcu8GXjP`d;VM_8JsnRyeWl$2#j z9LKYLQ{Vv8`1NS!p;*e%m+5_Mn!se_TwvHzO5GBh{HfQz1BSs=dGq@g#DhE!P19g~ zgEk859YTnfVF~Ofa65d_Df(q1@i=s*X_~6_7`9$Qe=wjtQMM~L1*n1=Xk^R9??Mba z4d_0+|M5rcGeJiGB6ukBo7Tue}25=R*i^&bv>=>mXxZsP*4-MGw3l44^AgK&Od zdG;&8ljFm=Jh}D+-+uo)Va(;BFJcnbk`0(Ucp*totwMcJbmADkOBp;2`}FFA{Vc{MjRQ0 z_b?2<_0+x3&C;ioGBiiwS-4I9gi!{G#9K&BhuYO>-KWTNP>`vNlUxrWNi!NMCgTac ztV7rIxq9;>y4^n3*2nz%A?YUU40lnHVy(MIQ+gUKnkZD4UKRjcf`=pBiCW`aTZMIj zo^^M3mpG0|l4NGNUdr(k?>%K*VT@^=@bl21A7<&493B;O(0+fwYh^TELFH?dP$8$r zH*-(Pom>xJ;34U8I6UKWNEUaI8Z0iv(t3qD)FUKMMz{IBe>%X5Ie1kbL<-FgZ13zq zVsO&aILmw2-o{rAUV3WVJ_R-8lZK6rvy6ttOzBPHJ|fk@E6@^veeZ+slB6BHYe8BZ z6#Gk8FJY9%)s835o(B)_Tzdy&43oOxsr#Sc`Li$Zt@pk~FIx%UO~P?6fAkiUV#rGu zz6@ii;}~keQ)eFs1s{!WFvCfvxw^(!Z+oaL3xS3)?WRCJ;)=lYL_4ou?#~ z1m3#wCPu_Oyz&r8=y!Tp)yx$0;pT{L+?|6f0lu+lsW`v!G{lm3-g=iwGa~6^JbwC7 z9)IFtUj6VA3PI!AK271``)^@oNk=6--gyjZByZh#hg?()#|1Aw@MSRY{rBEsP?q#o z`aIaXpXcsqSmxWZ>FI}(S)i?D@i(%{Eoc&@Fk zu$_;Q+TiO76UFS_+(n=2vAJ_|1`492%Vb<)yb4Nv4hYR))SA>ST)FW&A~n=?!(?29 zTT%ptS{jX!Y8Epux`K0O&dpb=B!HBDcLjllu7KS0^1E*$jA6BVX69Y+O5vOcN^}7` z`G~4%xU%y;qtS@kT4L2Ioe4~eakvf#X_|85`c=wNIMzmbicLGfs0d#-B*w5i*a=?c zXwG=>{(JAEoaWsR-{aAH9|7QO?;frWKAs)>^=q$D*(!8>>#1m}8kFPm=0%=fe~xD# zc!rO!U*q15v!Fr`H_1#7@A{Hx2~!^ak-6;)kA z5?GdMS>Z&3l5sfq0v=dD7rYPCN2CH*IZpM~LmyS}?%*wQ8ia4i%K{l6;dRVQgn+^D zCaF&NPygfpjJye9SVBvX9&gMt8h$VP9dRFO~I@bb+DX7@m+G1;KiBTMW7o8;B z2_JGoq@c_zgcGcGS1@RP^Pl`Cy-t6Ar~CNEwv_R^lE+K>-#zivr6io=dX@NnJmuO*O?7>5%C9%;AM#I_TT;>I_Oqd$Sg?04OjK(%}k`!B4 zRGJVH+3V+elnhrD1)j!u}pcQ`xx&H-o;7B_dos+`oInplaf>m zA|1CBL-78`AAok@*cPHJMxz<+j%MLr-ENob#nn)7v~@`~Mau-Hf)Qg<6$mLpC|II# z<0ga?DPZIvflg{rSlDer&svv8h1jg&=;jOrO!8g2>#G#Gg|!H-SK&TX%yK+%u-;qc zt@q!W0j#_#u|}Yb0V#2Ns@LBo1J8W+M(hjqY#PT}Z;jvjXTOC|0wH~&Lkc;>Ek0(N~)?vMQ!y;S5s6u|KvCR zC+fJy%FnidN-t+DOR&hHz863^G38+wbBo&S+~zqqQc8xyA^m=zJkRO%LN)5890L3W zs7Ny$4q5B3qP^kf^&Nik-~U^5JH5kGp-+k%TJlX`#iL+ZMws0-FMRvDE;^139R7Wi_|&oYMN0m3!25U4~ev}_gO z5>jKxCu5$z?>rc|^3i1)Li&tT*9I>X^49IJ-sA9{*Q@4i7N$#`V#K@jjr z?@?aedYK3Ay+0`N8lF1$B=5fe9uJ+pcg6*|erk=<6*HY@Tn%ZOhF-cd(|T`?ZX#1j zlEl37@%MOs<;y(uPzY&y`{Q@WqamqD7?vZ5zzrI%Z(pZifQ%L6NrTBWd9fP`|Fs~Y zE-NZgA&q0LzY=mSfc3RCMsN`xQwxuk=!(I10Oj(u|0mNi7 z;q2M7yz|aGdzh7`z+swjyOiT`kK@R+HX28yBCNG|4UMX4)MvN838xpl4sKrPY8tj7 z1hutjDe+F=tR+jkjPnUm6k+QU6)7wh=N#Ea#?EMmZokV;v4hgfF?KttT#3pQlX`-* zlI}`IQ5Ws9B=4xW9B0+T6TDi}+#3TZ2f{n7@L275?b>CYIrTJD@cg~c?5Q>Q`sS-N zbsnl2w1DcV^@qWO=}789;PKBQ&B*4nPE)=?;}Fz1p=PUj+>LQq#?6?zaJ)Tym&f{# z^6)(m1`EAr7XSb9wO6QYJ<|f}YD64~U|lW3#r5Kts;as2?nR!u_c`XBN9*)Q?v=|@1o`N#+wWyxtUDhgp&b*Kj3qs;C|lNyi6qIj9tlKKnRq9YFvSXqzjMqLLSJ=o3Hb| zYnS=*si%41?4#kl?OemUc=L4z>mk36-oUMM*({!;y3oZss@f zvHu~??TfKB%3@`Mm9D*~ZbnzXsFa-K;qBT#1i|wlX$ufau*&o5wTp8zQ;RZQx%Nj` z<E5?v-$`D7^pem%mN43Md#%cBotlD`CaCxwFkZ$tm(`f{t4B(ucz4OzJU} zFInxaaAUB^Yg@0+W2#y$;o|12m_*@ZGYbux*qmC{lpIHx#zuRC1bY z+gG`~eHk{G{m#3)@6lQ9aAUBE)brRdDFmCtExMiFd<8bNc{dKUm;(Y0!)h0$HHnHT znhNVJuf2UK?aj*FmlRbXs#P}8uUt#Q4$K}RHa_303wR*9Jvl#{m>mph@GXs=O8)js2b zhaY?doM3zNCU}ryp&y(G+i|$I7BDDe8=Q3;V~#jj`Ca0RrRU*D$Rb*oQnIqL!n4ml z%ZDF+$b%0)NRlKoy3eVXVi~@46tKaZzki=uBr*xZV#vjtuP~X6 zDP2h#Cp1_-o_tJyWreaVcy04Cu}WyDDT)bBS%#A#y{ylr!RzFCj_f3i+!%}HJ2$^e z(^PbHk8wHXCOJh_@a-GlrJr`$DFzHgi9r%aT|T~X0|Z1}Ni}jHBzaXLL_-k?5+!+e z`x4b?M5R2Ym*B7zzQkI~4R?cVrNdw{ zhNe~wqk<~3T({f2H+h>IgDtLBn}|dpHMq<&_63)BUZYMu6*U6E?qr)alk(cN?_$yn zDHU~HQP_gggH9zEKl~0_3T&jfnqOr#UFBxIO~-WZ?wWgut;g@TKKomZLATd7Pl!$; z3E?}_ls*UDUWabC%bRb$$yZmu+UhF-uu3)W5NG|K*GF;j7KaT0v9y{mJr75{0~eJ4 zX}*KCcIH{QaNz>4yz&Zl9fD1rb9nDbl4O}QeI!(;+q~XaaA@jv@Pw++)BFVAG8%pM z&9=vOc$yYG%uOu2%`T~oFZQKmiW z;s5+{!wJ{2`#AgzINaG2b+WXK7OaYS(mw47*&S}vxSFV+l5|rlUvqQ3gB6Y}?Q^5r zVY?VosnCzIqqtsd;WMaH$7Z!fC2OK6qfwr%azHO$C6gUgqN!a)lBJkfQ4_5BCNo$X zOdK)HM{JL`s9jCz3d*M9bask~9b=`%MS|=3CR(P9T~0{_TC-Jevl6efJ=r16Qk-$@ z+96guR^oN)Hre;|>IT$M?K)n&`Z~R=N7m^OSW;_l7CYpkK(9pTo*}1Tv%EniDiWQL z$%Mu=^m`q~)r67~A9;La5fS9R2n;vE;t|9qrKUz2Md?aL^(c5IW+pwws2PwmMs*dL zNf_rj0?p8kL3$b*3ZGM{5|=cnuE2=~gbPN6;u@xBh*QnjO{l4mQZRBOtghLdT%)33 z%#hRB231o~`jV28t;rUHa)3%SRyZnOA=}W%+Sl~cJ{1KkrhoK?@p4hSb;|OdrnWQv z1K@=hUf|6)-wZ3861UXK2>AlXv^ST7UNKY@puL@q9|fG9Pat- zQjY08ZxfjX@-uF?&U5>jtUIJ6$`E15M9MH9AZoz_r|(BO&Guvq2P9F(Fdx&QN0xQT zeTkpNJ{-P@FYpF(2A~i=I0A92!!g z*4E@y)Dp6Eg~mXM=SI1UO%#=ZMmh@B&;Vmfbd+M^4nqpARohfeiIEyhL*C?+zCbBS z?J9DYlh+fXG$Kk2S}KGPWKqhs;woBc$~s5jSWj0N+AX>|1soj`Vq@5GTXeG&jRNP1 zRYasUo7FW$)6f(-kDY#CA@@Kqss?P2ws2UStvQ{nbF&;VpkzYDpc=6rpQiSfv74}4 z?xK`JpwN-Rs{j}ZUm~=`3de3Wp!N-oYnT)hgx4XrA(Ax8BV~ldATek(PC0z+X>`qd z!}sZ@E0n$>kufMujYD@NURC794qg=0jHnpUk(y4T@e~wp$USO>L30Dkgr3nDV_D5I zG$HihYI&6`O+k9J)aW$AWO2w-K~W1&;~mO`!GOmvAvL|&KeFUUjN zFZMRSvr|vfq80vdon_H;bBvu0%xz!*aBb@vQJMgOVa%Y&Oo}mzVYN%95-Lgrf{(^OAjY8Z2=5q_yJ)4T>Vg<*+6rBF0Tbd)l113IEhBx9u1 zBr;)Gk6Q0Yg^3J_jM=RQNEBJr!3cwqG2Nt3BqB!R2`Crp4j^b;02cy9=_;IXRMhl) zeJmbZIeM&7RTW#KO|*^xK{x3l5Xcq`Z{^!K8YGa)lJp2ee4!2_`xbMFE zsH%#xEN8h6aU3t%mX7pIz1v<5~A@J07fe>I!#L$;i0#ahU%&BcjRa#DE8w{E;)D^}k1eT&4vlg$A+X)?& zkYmZDri&q#F-GNpWtfl1(v)7@qoBl5Q8zV4MhFDk<83xNrx-UmYinzGJmY$dF$Rkz zFH4kCbfXSqHzJmXhK9AyN_c)`6jCZ9kM}-MciI9kVB`kG(z9!?QbYn11)vZ`5g(2} zpx@~sn+Aixii`;*k(YEtkJ?pO?=dPy8N;X=5l0D5DKeQcumdK3OcX_U9HV+nViJ^d zjEgZV*(zC_Q8g7R3hO{3JME+0Ae5${1SFOB#3E)jUSqS|VkKUoj%rFO>at-yKFy8E z0IwZU)Z=t|AC{7$tQpyY`#a~@;u^1VZJyz0%O4JMaY*RzPv}(XfYn2IrQmW88 z+aQ%hX~~yf`V!kaTSOg0C+>vYueLt|pipgH!=rh9d+z4}OSik7mHZ^oP&^28iUwY7w1G<8F5 z8+2l5ToXJSZ57o|I%oPr`fJbF7j9OYLOHo7Y<4kE(FunO2CdoW7T=p5TORPEi@)JT zxR3)Eh0oCcw|0V@0m8leL#a` zW$cW%+32m1yAlZu>k%t)m%>f3wjooJv7L~ql&Y?9)CeJInuaV*D4Ge8PO#QuRD{ri zjFfRRW~I|-Tn|xF;;h3+gVvH%bjV#!6sK5cX{bZK85VG8A_|)$y(H2xO_nb>9^!VmP~iJ!5Bk?5>PZHecd5%a`HN-V^S*FTKmzCRyjf`q=E*EMq-`C35OKHQ=?ktemedOUl1EZO^I!v zv@Gs$eR6|dwgGsCZkwSTPz`I=dh0}Vd28owHda^hDB@I8c}v|i2ra05MK9{%U4@f^ z+E#ca8M`4XNsj?J2{A%JUR3m>6|8YobxCH@8LR7lfIS^OGd;bX9K;?)|3~CLyUp?B z?Y{E`5P@J)PUys)nXz*!Kl3v`L$A{#jROFzZB4A=P#Z#s6Hx%k)Q}ImyY4C7q^D@)|?F1L@c?N2D z~@CtF3;DupQj>#~b-#9;8>|ecc38dh{ z*=NAQll1#zk4enE zN(&0gLaBq}y}ZuCHfU4z9la>SGzyg{DqGG4ktY1MP|%QrfPxYs zC6++V+5ozpiv@~?x_vEh)W`^G@({-j6j&sl3eZu4MUW7+=V9IoEAuT}mo3k$$I=iyfkd+H@c`K@p|bRJT(#z?1)$x8?+M3Z zz-viEoM|d{TThEb;7NOif-w#_wb~^>l!nsO!Du2J0*4lYf)XX6p+=}+)Cl)7CvAVl z0lK3ZGj3z&6^;f&jIA5AiG$&+wFC#V%=}z62YCqm4?liy0Sc@7pyEq-M2B!Fc}ve9PUy803ZNKL_t&}nGQc$ z!Q0zc@R4SFxXT;6@A2g7BfPbFg&R9JS?Try=lck#EGmvrLe8qnszxCqGmF%DY&`%6 z8d!;YL90{n)VZf&94=Khkm#6)vIn3ep>a^bWBmtt{rWrPE=LI;w4DOZtvm)PFbT(c z{@nAt`u-&vJho~$|I~$f5h@QC&OFO&o0r2r1Br;qcP4Z?op7EBT>I!M58ih_H`(F; zXYb8pZMp7x&(B(`#yy>VhCA5TLp;Y*=J!Y*JR%_^Bv3$fcN7I0I&)$>A^d@!`fvV< z1pM{XdWZ%B$Ph&+yugD73F-A9Xh@U9iG6Kf&vrcB;S77Oajn&V)LwOJpL^}=_&TxA zaeb}hb@$%2t5(&n;rsoKJM$g--5wn;qDsRRulxA#7b?9}#@*#?R!5^xX);fVyAf%c z6GS040lg>*yaibtV`mb%jtbfUQ${*_ZK`4AC=@j89gj}je4M>R<<+5nQ zzQeC6Al?uMgm_&a9av7b;~^Zc;M8c*iiZ|0jtIo1BQ%c>kMq)t&sBsxtrA6(JgquU z7a5Pf_z0%7Yz{X_=8H-ISO~okgsKwrmmPKEAZ9O3D}Iqw>wo-($54Tf3FLm0r~)24 z_ZV>;qqXL`jcY)_V~;&rg@BYLx173}cb>SB$LCK`mPNJQ<=y(Jr=P$>aQ$^RLju0< zljRv7yyd+xgQuQ9L$}-G*Fk-Qr(O>Uj0bl!k;$xp6=!Ycb0xk72l1r4*apKGQO#EK35v%voTqoSIc?uoipEIFj!+}vP0wtwJ5ml#@niSIOmIm>2ylB7gfTefR`rEljk{T zQ+YfFkf%vy!Cr1RiUP{A;Hj4%rwBD(=rP-y)$27zS98g$f1lggp|jp0CT7NzvMh-F zkdTnVxm8-cF6i9QSqqs>=fs1U$!x-Z{Xf2e_NuBwMpX&aW_b>{yp$@;OQK9$^x^G$ z|1yXO@(*84H{}=gGPg zE@C3p>p3{!Xo3iObmdrx4`$LwUix*$=AV??O^X0?i;Gz^Idh9+m9K% z*CQcZ69=xh1O%eZ#9T@iYwmY-4dv+CaaeB2jVm{dgl>K{Dzp?Qj8};SLxYGvKOqV} z!X_yrZXZFiMe{F%p>5?9hG^1EDnl9RuvxfwpHle{^-}}``Firpm*Ao;O#>At1Qj)& zFwx((eAHw52S~BiLafb`EF}ixxs@UWImqJI2gyoPG@*+IaU+(VOd`qQg2zfE)o=(y z7-XXo>0@S_B-zS2X88o~R6$lMNhr^GDEf`NdE`(PKqoY4B9?3^Igrap9fse0n=cim z0cxWm8(x|g;o+j zj4LoFduL{ZHoNRDG@mNfSHKQ> z8hU@nwxv5EK^7l0s#Frl(s2En%MGWUeKRxFzt#z+<2Cfrq(w{4Q|xS!X&do++@D_q zzv{2~_Otxz+ZD7Nv6tQp*~2lD3cVBJ5g<;qf{irMZZ8=;;fJE_Y&i~7K1`gm`F1pm zOZxT0qE>LDthMHpx^XFCAwWlaZDSd&UfFYLjBaE7$Xz|df;T?zP!7Y(E01OrpP;A~nGE#ocUV*R$_1Iq zr5b&@7H<@S8p4mRWB7}I=fZf6(Pfm)=CyY!F;j&0#oOf;7UD5YmCgia~BO8fM= zhd^!9?4|>`(P{m+zC{64h_BkrtBeJKW7pzg#pX`VlWD$n%H7LRqMi=JF+JtA?qoLeY#sgegDbUsh`7 zJSf$S* zpqCd3t8L?uQld!v3XYr!#Eu#)N^N&b&c5#re+ETqAIoeyaHTN+9ygI0M&YsO=s`6s ze*J{K!}lpNAGd2Me~@XrZsPMaU}ZM&;1^F*I_j8gUg_k;g5b5ncb*qUwgYG}q!3lq z3$**ITA);i*V!_d^hP7%I73xr1(h8dY%MF2wiiTL< z8~!B9Uv#tGZ!#qfjT~2Nu?De^XZMBr$?bs1;aOO82pZUN>IxG>RSA)&Rexi#FuGJ1 z*G9umIKK3IkS*1#gG1YEx6bk#5QMdt-7wJs|E( zG}kWwcd)#(5NlYyw43vGl=DH;fx8TDdAs|iOho0q(jZaeJ7yErRh?X63Y9qPdu9(t zaowNs1@p`gP66kxzfG1;;1&BsgDP~5ZRV_!^K-w^7BMrZ<6bzhtIsu8H0iSrN=m() z%{dxr4E(~zlZ&GYk%^~U^IK>yPql`k`h_E4=pO(k;X}4x*$~GF)#m(EkEEduQp)R$ zZ`Eg?98Rpu{lyelDzEabuvS10xZgY`%sRFejS~>pI#9VQSw*A$@*L%N z2>7vU`ajLgCENQo8;zW*j5MEPKonjI$dk4CJIcqW)|_X4-%U#&pNz@LNyeesztrM8 z{tbJcd?cJ1ld02?7hp{p_izlUsiR{x8jS7L*rgvi18vk`V66Xbf$vq6A4YrVw(ugO2zv4C}we>;VV@rXJId8}0obn)Zo=Q8d zr%9K|FJr7U&!-#TIHm}K3jl?Dp*ZfkSu4&yuQ)3N&3VQ=^CvJ7P1bSw0miXs$}Y^H zWV|r7ie|rU*E~5yyc}&^reOXi!~NV{&`(|-a5=<%^bcqAqY@D(Ql8W0?`CCOupute z$si40y*iBj9!I1E23q6SU~3p-f_&>yh;i@p=DUB_>zU(C9=e~ElortYva;ihZD|=dt<{=2a${u5!T=0#``GPb*KK?3cnX$IuC~zwQXTzoGCr)i zP7BFM^3CL$;75h}{g}~G<^DpO{%^GkoMMd#KWimwnK4j(C60pe#pV!%=^-~V*)`F! z=R2v&HzMI!ql{j5}P8)$I2`0pufn9mxVugzc4l$#k9EnlA^PHXb{MD5p~Rl8Hr> z_A1Re3z{WK*LmB?BP8Gra_rfNXKPQavA#1l5QL)1I35o)WZj$9@wkl+qZhV9BiSlh@KT=b$h1d&jkNlOa}q`p1bA@S?g87o9Q zN*uv`o?3k4hQSA4MKmSO&)9u@zdI-p3gvW7kA4Or(?mH-J9b9F!FNKv&%a-)1p3RW zvL=JM4!%<)j^D^uWRgzaRFTHM{Vw`MO^JmWbY5eFWl3>9d}`;&1>&*G80cK6em8%7 zQhNQPbS2n*BbX`Z8G}uynA_+uC=tbkjc!a3PlF_eF>~?25DBb7Qk9S9aQD@V`qIB2 zb^HA47d1Ht6GtZdOiZT$?m~8N8FP+7o z+38f~t?qjG0=3^z<^+0c3{{)t{i_BdII&n@f5a0&{m`Jd#b_GS{;da(HT}&W`Ag%g zGTL&+8OLGec0uZth21TWTqOUE?+?fmP@)UJ64XZ58iv{+^>>*)ZN~&8eXZ)%O2nmC zBmH8{rl{wb&2+!z=oOCXNzIHQMM=oO7))``K1LxS#*o~!TXc+_`givm?U60(xkzWg z>quLMvGdlAN$Ve`{R$G)Z}pQ=?hNr+hKk%|=Gqc?nyb}KDm{_t<09e(FE;#lwAG9E~hWjSfYa7@1Z{9JrZUv}Jvlf)J{bX3o| zpDflPC7TQ3AVC8|1UCWLLS!mT?Y zgBU&;(%Xe57h^%~gpsgu{VX1QP`#aqK(~AfV+`9?J(iKO}He(T6nDaYP4P#yoHQ8Xgf3J#Im_S+4@-XkJ-hCu4Wsn2F&D}gT31$H=ojj5& zp;Y#rDTI`6=ViHH`W_#f;2D_z;@}AM_ft=D$uqBei7HO{a+ue185u-}`{mGN?1XS| zU>3NfET808ViUssIQ&(d?C^(<&C;q;8|8VgNfP;sgFNUcAsv;0l1){>KejNF+D>jM z_QdUFZjZhc<5B&Wp7Et`tQ3doRn=BoF(R-aZC{Kgw=Q+AA98OWw!4Yq?Wc zO3^C|;aFO@(3uB@s0w6P25la%3RWC-&l-NO0$UW)4%``Ts|~0Ak1uDNZ)Z|^MN&~q zw7^r`s~i!LPETlhH;DX&qWdYMd-US{?P3@Bv`-V3$7Nr$6icQ!zzXn#(&AP1!HcnG zrea8Yb8E+Pv0(m^`J>C6_lNh7)hGHm*c&@eJ&0d$7^Ukm`=nQ0Q;*?s1K3-xapGULhLL`mJFhVO-^k1>+a?$5RM6f~@$Boa(j5+0$qZ?59s)Bb4SkVKXGsd)JF>qz0tVs!*g{50)78dQHP5ab2#taEM6f#5{ko&MN7+f_|7OA- z$27b8T3sQ0{x4p{`T+Zg&Ju&B=N?{O)fV|*cl5PH?Y#TlAF!_JzSHfNDw*#k2!enC zjD#Rmvq?;y0mYO>I~i+$G7i7CzP{gR*_>u5v5ckJM=Q>zM%c^@5!gOQbbWoV&Ab)z zCPg)mN!9poal13yMS{TFieesK$(`_)XGLL(gRMy=&ZsuEZbN_gSNuMaHB2xsMaDEz z8?^aHN)Ae)A@g3Ec|_WXK;Z=Iq1>f@39c`el4avHt8{Ffk$UqN4mIt|<^}a)V}W*Y zl!AdrUQ_@63K$<^V{kGI-3r=%H{r;@l+mwHm!vYvRur>yt!wTLgtcx%{MXUonf=o^ z=j`YUkZ~4wCW|gVs7+nHewWIwA+zI9kO8b_7!*?Pit#jj!pn(Vf-JM!73*$_-vsP0RY z?iuNn1}mVx7eJYQT{oKE7k=zA)YNB;4E(QOgB9!PeAtMBfNA8eL-!N4KF;AkKGJB5 zW5Bz$>(7BC5C%CpY6iE13L9vNx8W1)A~hLj0&DP1*l`333cP=={jx}W_P>2K4n;11 znm%Aq;g#O1Z5RA>>UsFAKV`}0oZmib!2d~^gSeL?evX|yrJ_2EhGBRhTS>)i;s%p6 zfRyc06y8jGsHS`BOfzf8aN0MF9kq40jkugUh=kx<*tM>bh-^&J1e^-aHn!8`-=C)k zKCoRDJ{~{r-jG;NPir_x>J|+lRcgF9J@rcQgp=%l%?vV4^&ECrSbv=E)(`1un%qVI zeEU9Y770OT|68(jqFRP(&t)QFVc9Tz;Dk*cf-Ho$f@%x$u9GNXBb>xq^w!NJwZG{- zxd;@)zcl6y{4k~Gm40NB@%9(P80T*w`Iq2d%y_OFp2uj}%RX`6=uS`1oPA#jT3LRH zn|>XoAfx&*VfHdmihjB7itaM6zI43~QA)5RRF(5K$Z-~srk87;H_o1p2&(A}*6pC| zgDL|}SfFjs{tj90L!sm!q6F237g<_6y-1K7$BI#}08t zb(w0rl(?K6iRLz3nnF#n`vsZ23ggGWL2!ipL?V%x^!Wyoii(BM(J02)%>A51yYesh z+fphv-s|Beaugu856qS__{$_@rVhjO;-7YdjeeQB17b-!{Y0}OQLuV7Fz#DCf(^Z5 zZt0TkACPtA1?_daOQ{M)=zB66#@EGR=2;tr>Q{Kl5fa7<+n+n$dc;rFDAimqm&fK* z(cKIBVawxap<-uR5em25*RM%duo66J5UawOkB>guIBlkf<@s*{LcO^35A_){PD=vY z#o^h!YDHjZWlsu3qxrFVd+nTmafvrg!N~8-Te^UwRdqlGsD)|=@d^EETfGltLJAmO zz-+HJ(FXWMI-CEUxjl*@o6saAHj<^_2<=r7Uz~pK7tJJJqyJ~Np9Y2Gq%hl;HtwR>A4urY)ao;Q^nj_9!kkp;5jx&RMP<`cLyn+3~l5WTkRf=C-sB&TvCP zMJc`D6Slhv``Mkj;$}RSjWO71f<)Dn2}1z1?CSM9H6`C&@;_U81ct{)0WX^i^|8mF zhrg_QP;j+%!1!&>_~@}mZe#cN9_|U18Rd<;#za}rBO?+0sWfQ-=v!|l=5S-4dhgFO zaqRW2sv4T%BVIqv3T>qLB7(&AL=6Y1_ug#kx%vrRa^n-Rt!B{GVK8R1qrv3*l0koM zuk(iI4w|Cmk}B(#(D39mbl+4%&w20?V53DWA3t11AizA5G)~NdN-5_rr7A zC#0^AX>6S5eEyN>dY)XK4q5r+j&-u!o)zmu=T;LeukQZGLKnuog!3QU=(krwTTE|gf~I~+8C>QOzYBTl2QXc<9m8AH2Uj-k`W{Z9 zJN*lR&^J=tNSdX`(dv8oYwSa}(WNTbRc+f~A1x zzc>K>UL}Wq`Rl^VLpcyBxUhb^!*`&T^AATZ{_>}zZ;*fYG@bBO1k)6lU5C1e3Kb@r zWABp;IFbU9&;J@0G6|MfNs4b=_5gjOW}f3$S*FIKWK4AHKy${J$0TKTI?As+2siU3 zD#Wrkrs^o{mwG&p!)pSJdmLX4Bh>!PW%{368t*gy1;nwHGs96><-x2l$+dWp99g5HBfR zZMD*YmnL~{4p->Xrb~Rc4$v=W>XoQzjNm-=U9ka3Nn2Ka!}VGxJH2D#enWdBVAAKQ zcM7hGm~8ilWlj%^Ma=HKZI#<-W?d;^&!)CHm#IaF7&F8(9eBv4dM+{J<%kc3-?s0_RDRN;+XygT>~`dpo;S`LoHLUk(N0 z@me2%{$0)NC~t0!)m1pUh=(U-WRC}Z_%D@)=Z9DO-<4Zcwmxk5R8LUtGL3x=f@V{` za}`ifi>K*@$9o{3i3zj8A&F|D=ZL2Bsd(UF2aCmhgT%YM3bHbOYHD(geXLO@1qB{$uWmQi?)HEd zrwT#v@9{PGOf-1o<>C{@tuWiv0fE?yEE)OU zkQ-_;?_;oopu1h`yHKjdURtPP%BUN$E!?BN1HZ?|RPDRlkBoED)e
;lze1;qOH zo@mAd)Jeuw5FGC@i;k%^9o3ATW?W|-y*%eBoiEvt0cX9a(EsQKp!tvpaAk_jzo*y( zD`LR9L##b-Za~$FWp8_QBBMs^TY!}kuu&s^^YQ2A?-b9hSvK5Vu=ReOUG!np-)AWG zCs|sW?7Q5bAB7s|-FkaYe#{(dE7F}}qU3z2wi)u2bEZIVU>00cR#jouu2U^@n0VZ} znO3tIeRk+dx)8o6=t~ww!mGgD15fFcpd1A%$^@oejf_vvAHkn08WhhT<&DD~j^%3~ zlh88|7VM*n{7xsa&nY$ZR1^R9YbC=c9R0x10!X92PqwS3TC!Dp|$CQ za9y9Tc0s=P2n4!V@cIry&e&~<6rHq`oXm5C;qr++zs&IFqN4FWPRa=_`mMp3#-c2@&aD2e7!#r5dg2^WXQIs1TQLDF~7BDoRe+tNmP1SITy0Ua4T>OeOnyg z59&uk_PlD@vtpnXc}ft8SWN$KjdtII-+3z}`(L1TZI#}q?U}^3YhfIs{V(Dog@qNt zk(j?#r)>wE|KArtomXGio!McypDVDJsGlmsS^XWh;ED_<*{v&={)-7)SBo48!ZQ>( z928|rY#>&>-L+*1RGg;qorm;j=Fg4qG@}$S_MpDpardClTIBI5gl@27^{ zh&CqFeDHgS0(;7d2#Hc@xddt{mI$+IzQkKoiR?_NHD7nS#=1TzTx|WIQ#6f+gHd5- z*Z6_E=6uYjq_+&8hlz!^5>|NoS9tB&2)^Ho)P^QSw^)*nG8KG9@Zv!o5xzDG@zN@2;I? zsy|W}EX8T=y4=s$imFS56=6l#1}vnC5Pj zcpMN4Kd9k>z_V&|tiVU9AnmF;_KoR6$Q|F(!(iw35OV{3`px|XH&gh5d%Ek9o?b!& zPZmy}P#iWS?fTE2xr0tSGBfD2(6~Z|=2hQRg3(9#ekZ?#LRn*|SN9x*>?gbnpcTUE z_ssE$e^~csTJ^C6+qCuH^()Nuv`tGuvU`v}l0}yQZojwQFl59+{q}T@Tem3aSBFut zPS1CqeJxuPhX@_6CjtVtc$|}h%~iYGHzHfNPcp5$1D|K04lef&;Vh0&4;aK`@)cru z(kW1xUA=xl; zMkw>RjqNw>WOb{!ME670`K;G3fZN^&8aZ(sDJJ~13;nLda#qwL7Np(Wbfs_hb&eo5j&{$fr{XoEk?;UH{V#L&M`yu4c7d#PnxQBCmsnmTEQ%_ z=b(s%h1Vl}y7RpW1NAa@K|z`3`AYdls&YyH@>t)&A`5b8TNV|Zg}&bPY25~|c5y@% zL-fxjSAM}5zI)W<+yAjpNP*v{{qO5PJ080UILZ<}1DDq83&5i+K=&cRK&+h{c+$AtYwNBr8_IJPPfbUO2rjh@)t!n%F*~JAgmVGP_c&y%2k)HKP6;Awx zC%|dp*!JbrU8Sgy{PvMt}vlMrg>f5jfy;3cq)x8k>o!$Od0)oebes=SwtapjVH2Ny1eIQ#zaKAWHcqKfFUAh)!( zF+vcHlBYND6n55L*B)L4ECl7Sf-xMmuxIdC(As+x=M#ZinyE+$Yxs7Za&+hYpGPj; zI44jN$@+?9Zhp#!Is#ozGdIw5Cb{EC0gRb$hDAN0GszNuUvIDg1MUAfz9JH zOjts_qZr%w$;oq z`6!P8y!GPA@%Or?HEh&P9D|V=4mfHT&-A{E zslNhjcUE3v{_5Fcbv?7Gj}P(m&Eu)12!MLMT#>(XEb9CRtt6^4J)!^C3YoE?K43WG zQtBB<%|f7*C)!SmnI$bj1&P%p zOcI7Jaq<#YylEN_63=d)SNcwz4!)F5-tFg;G0#EEC+e-JZAq;f){8UQg1?+B5lC*7qd zT^A-kc5P}D+FUh-?sA%IFG`v9u@?d#ZE3VbI@LgA5Ju>gN#N4e z3SW~{$&$HEu@;oa6NV$urs_bI${mdfODR*qnSl)kgH>}c*#vlF^v;8{-tx+^4O0KH zSPKal=U_=>TVGbc|J6R6E02^8|sVyP$)P>TQy;}&(i{bS_>Xk$$7o!(QGL^1CA#4&Z8JJ=Ec+8i|G*8f&^xn?R*D#2aU#G7Ur`M+9RGH=cr=%Sd z(y~ov>1jvDqWx#6E#-9%NXYFtm=5T1cYMf%F;|b!hM$K=*`vqw#iwO-rTl04|LulI zQdLT(nIG*O7nTxz*cl@szntofIgyc%SOoUrtvfXHU^V(7>U6Ac_dS88%bD0(ZHI8f zF~u(d(@n_a-_b}mC#^s1Q^@>l zy*S~?i{Q!SRb+R0z*#MchaNA-%LeG@#`Vi=IchjPOXe~gcU3=ri>J}HuABSjG5N1u zJY4g&%64(*-~h3Kqqqv^&sPuYs?`NcVLp+EzxKnQLy-DwHZBf+HyX$lTkH7OF_*Il zi&RN-PGVIkME&VSm?#3_RZTf_9XXhD70F?1xh zMq`QA7YUEFLfl{{kRp>%d$PY3@T7WE!@!e9;{#?3mzyMab%YQ zmHaYj%gup$C8F>OB^oAlS?P%Qg|6fx%G;NH|8ql{zCc`V*unjatn+LZ$pu}>hM!kD z4O-g*F--ru3~w4OsP!3WbDq~AA6nkuo-xJ$kcC^2BT^2?Zw!>{+os^6D~KO`+6~X3 zep1NSPo}j_pF6p`1jTYI0ADah%@c_@8)6(?>Z!+|j)K~(Sm|z0>w!=zx0664#-KhJ zXdsTkEoV_Lprl69l6(rx&2bmeBMW3H3W<1r$WRzt6CfeXQ7mC9+FiR}_XGyQ2wYVT zqiq*4hn+iFc{eTW-rWR>fUGm#j&079v7j!#=9^VBQip2GB8Krt=wl|mv#V=&4tB6H zK@|;oJ6O;d6IQGf-Jwe+NJ?Xf(`T!*$W7-{9P)z=|G6hwlgWGDa!i4wPo1-iX7kS}W^%ua z?yA}82D|%~s_jwDWi7be4Dz7|#}2DUdQSOWw8Z7{p)-#w$Xxo8xghz=iF7KHyl1{JaY*MHA^sI4f& zmmMj1O-uH!OykG8o!&S*TYCi>eFl0>q>@sDO!vQWe?H9$X+-xm(#Qo~JTvVzS}S)c%DI5R~Hz; zB3}d6GvGzRz4`|f&DSoreR@(nY`JK8$XIlH(5K6f=3u%xe0aVi$vANh9Q-`%>`>O( zDYUq>q}hQl&+sV$>D9kmc;h^E!1-&*{PxS!4Xjwr4zi#ZYfCE++_XxsRNh(jr!tmC zrsyqAGH*DUP-5WXZNG%SgJFY z8B0>7FVbSh0|JAUUWF{Koy@e)tldWmuQE#sZUy#WaLtcpqvva%drO*ftDRtG_lOiiS z&i0a&Z`6^sKyt3`&uyNf%G%M+Ve|cmGEqk;8-=XCV5WPDf@YjiP#SV;EJ+XwfEO+c z>Y9L2vd!+KN$u~>CKiKzoVhI|sko#)DY0pEOjULRVF+7gi^5s2eXIj;Yz6qb4!kls zfbQ<`&hXv6j(L~uZHLVUY8&;vx)FWAd@u+bl@+s}Kn;7vqA{b*LHK#JLcTQV7m=mD zqXoGAI!%$@s?zpCl&h+f`3rC?`-`tZ)lxyg0UVf0h-1ShC$05xa`nvbLBfTcIVFKJ zMV)~YIKa>{Y9?MXU;5=ckttv;+_<&8vQqlKe&%5dbr92Q#IAMK!fiUf#xYeFUB_&@ zo!5A9TwZMf3={%}(QV)K<7s3WY&mFxe-9>LlLJqJ4T9#(=Z}5t6|p7bmd?X105^st zWXm!fOI|Heu;C%^Kd570GahCvNY-_g%fmjEu_tUeluWL7`8!yDxD(CXqGoaC==Le> z{T`h_J)-=WZv_T#=T#Zo8TNE2gaOe^RQ21&siWVC?tdNAOUnC;VX}z(YVYI1ua#&~ zNknEWsW?kXF+C)Nam=%cjr_rF(F8T}39h#nh)C?k^M6m9VFI;>A5Nj~O!pveDM_x4 z01(;y#e-&_Rc6Q_RU-y zYuK4Zi==h3u3`fa$Nl#&iRY!=Y)OXPWb!EmV$)1zY;~Zr=Ir!^pvW>Dd9(vl7J(GM zA1np3@*9hR(sle5Q7oS34y4bg#_~6{YI%UxjE7bz$B#!8|xlfsm|MmlbdssCq{wI*i4g`4b8-oyUujUNKN^EkEHU; z=}m~im`rBNf6{v^-n!g}t-&+|4IFr-Wqizr>JPI$C=5Rhyz$mBZ4%jp#l_1ekUM4& z^a(BBa^ByRUhW;=dAbnGH(T669b=QqR8kRzWr<1VQc1i7!IcL#vpXz-?5MWFOF*{j zTW?(S{WqU8M9{wkj2Ql<-hTX79%A41>1s>1oVsYT14;(8UYI`6Qnj!ip5`guN6W~| zvd3yS5`xxB>K43!>D$bjVzgdSwby~eYBokn-|XK^K1H-iGX$how_{f@+Igo%rhXx`$q(p7RG6=)RkdC~p=L?@!navBbTE8y zrN5H4PXg;r6wh?hlG{dydr}Q5Y#Z#pdbPVc1m|K)qMr-{ZPE#67DqkI_BPO5wHl}6 zac5i>XGzbMRD2Z1q?VM8D9@(JibdY*_XrHrm2bq{>-OV!E=?aqagXIdneSZ*L z4GB=-$LszH8WR9QgA;eb>F67~7JhE*p7m#kRYhg)FCML%CE%Bg;fkkr(qOe(VD?%s zPnAwtf>;x~G2^eA8+$0znW1E|_r2|rbb6ZcPo;SaK5GX8IgfF5&7k;6*@Sa{z zY?6%Fnz>ktHE;NWp%fz%Ek7w`IE^s0JpZ+6# z*#e%%Q`R?dJySh2{I;mBkGHO&1hUYEQUNWVoaFk0-rINGX6oxH(-}Qsg?Vq?7!WUU zI)8OAli+c%T)oRLYMn{)+!d5Q^$dY!9JZL0ff5X=I$sdk|anJeM zObZfC1hT4b?VYkSf)-Nsj{X#Xw@$XQe_J(Q6>J%Bp`!=NlT?uHF(gKbtHV|x3v2jF zYF`f>_q4pL;xP^*SS5JM^;_&NUr*`NjY+&G0J zImM;Wi)?kj8@|(tyx)i@5g?3PMh-owGhrCmH&nBJW%Juf9qQKIm5#!z##dlHxi*7( zJ8*m}<{2?mbRzl6|F~fIy3m$7Q=YWbZE{eOSk{TG5Y?99R)3X2y*w$o%8q(+T@VA? zp8c`PMD3=re!#PRy-h?+O_}ec4Vz`^bA5AjGnPkTqlKSe7HFC+&FO65*D76#)sDAT z3%JexbNf}RJD(Uk&^Of1oHm?YW9vJ*Cx&RNERtg6)1NUQ|Tj*O;3r2CoSr|b1E9$BQ^@qY|DoF#vYjJ43ZJyh;1ci zC{RMU$5Uhf8eZ)Z`=N|dQ72-ayt>~HQJc{tMWjYs!iqf>Pn}MdEkQyzouF>4V6~+wHRU@=TEco8R?6p%m-1-dcc}Br8 z{{iu_AL}=-%tC+-_M*j9iGX(=sZIlCOyr$9=6){fG&MK#dz>yyfy=9dEq?nqukP=s z7#c*d|BH)2kO@Z*?QFpymq{c&a{RR3R+DZ~&u@DsrNF2+e#))D#<*}SUs7x>pI+>q z9ayf@(Ap}ef>Tjly|gX(A9r+m%APZQ^zhus+Y@(dQM&YL+cT>^3!$Guxa3mr?l)*! z6NEp>UTT3`dVoX`Oc6;{Ja5gCy5^ZcQz|Igj<(^DJvBaKXSYOiH(66MXri*T;n6p- zAHXe_9mKY{AsV+FFqQUE>kWA-o|*}Z;+_nMW6cd0`4yh^-KQ!-!6v;0>J%h|uyomQ>eyc-%ssbGhJF{ZH{Cv&D%h0k23j7jn&BqTI?;H(je zfdai%(Db7;R&g^K#l__TQ<6ONj@KDf4Go!6$^72JCy|~!>@a0JGtrgp><>0X(qm?v zav_IQR539zCOjFqW=2=13CyUK*0owVjCut&!N4~3uzeT8u&}TYNcz`Lvo?+KV>n2E z7Z*cJhkS0%6)h}g9-FBVZt3D+eyd4ZvV(xqSN8SeM^w{rW&C5cXw5*ZV+18-h<3+e zXi#jkcL82)#gI#F_>~#Ky1$73F0Vgzy5OYNkSg4u@ME`S3S_qIGj%>uR7-f&K9x<9 z{L6sIBf?d{%fLHXz!BRETTxui_Jx$5Brvfd8`*Fb)27N|qw;e+>gM+XFj+1dAXN>_q*<)_gm6U%!Tm7Q_x?w*qB(80LN}gx}`MP zWt60y&GNI;IVXDE6$d+XY(*H6jEK6@AGVK;f6Mr4YM}E+U^Uws1EF@jLc2vIs zpLyMb&i@f1;BeNz%5_V_norLMcmJK0ng=*(3651H_C;znR@o^TyiT+>r9fB~m{u3b zR=vJ^z$(M*LH{|q^Zw!E?(d(Sk3oY6bDl>l1~^=IP{6T0g6>dUoP=_w6NbsyKi-Y1 z$1~g?jLq_Vzs~$XEaflr{oan}i?n3>I;*5SyK1ib!pYq&iIyK~Wzr_`|IY&O)s=O5 zaHb6a0pTY4$uv5L<0B{{q7<=4AWNXU$GEIBm|AebPQq^Yo7+C;vZu!&#YSg zOtyTTsBq7X=a-$h?dEwap@oF&>m4eaJMW3jQhb+-jn2m%NH@XzvEgfZ_)YlVo6MQF zfw&v0E^ZKxSlehyMm;U!sdZ!A0+YE+?gE>60}U@@sg z3=W#Fwcdqq=x9rya(kNi^Y|p@&{=A%XnajT<}%hl|LWdZbS2K5TbFcp^jVA6$dOCS zWno@nD2&6V)4;H_u61bg_Ko-(S@Z|dqF&nE%(9Vn2i{K!a-29@i_JQfu)jFCe>;D; zggnqdw+Bs4O~t2U7`QVE!9-RH1Cd9TTDHTuB7_M4syY2Z)&0ZL)os9NJ&|rB%#w;S z&A+3glqO?cQlq+kHMec66S+_ zzl9lDNf#_w@-?EK?C|cqxzg{XXPvy{1C|&saPDnR2cDkHUkcvO$OkQjZvuvxsym3r z&G$=1Ho0CO>WGqlOAS!#|C28w8y}bY#)Mg^!G$-Tg1FUD$hsS~!d%v<1Iy@hacVs& zUBFGUAyHoS*xu%l!16H^h|a-%jpsKB4eeR}%rbk~$k}GjnY0LT9eoHq z`^9Txwx9FhIqO7nU`dpC{6h9Y3L+H9@S^whdi}8PZS|*XL-n!TKRc&AB_#z3W{+TG z=~3TU+R4xVLVY>nVP)~1A8mxgt_szLWb6V8Qa*s5=g0H~9%Q9kGeV#Vpt9SRh>1yNt1(uR)?KG%yWl+1I_ zrW%d!bN+kv7lT7`r+E`e`>N_TkT4V)#3Gv=A?!ll)CDuzrNmdifvYzCp zG#quLuqkuah4>UACT+Bsjo)RqugFcAMtKqcfa?uObO|n8c%Yu19*wm&svupAAu*^j zLbL-?Gl=lwS%3HY_Qmn_-f^(g=V2$z;CWkSR~tNx$O1Lx^ZaaXAG^vnedxuSe1UUX zA@o)OzNJ?y`LDYW1Yj^ED^HTq3$l$!5{N6JuDXCQZdQ5+Rzgw~M z8=#Mqw1-Feu8rDphPcmFzrw8YlSBF7<_XsqW>SD^jz3}-*Ww4$zrO6>3pQ}5{Wl*D zoc{bk;akP96sv$|N1od90d6!2IeE#m!l#6R8BrFj1!*VvX}GD{9(jXQyj)a`vIU!2 zhvtO%qO7PbntxMuPg7@wvG#u+U2mt||B)LB0p*ALIt-m0ujg~>3;~KqbP`=FLh7Fw zBS>qYv6DEl;VeSc|Izf-VNo{U-@9}pAuO;oN=i$&NGKo(B1)GaB8`BwNSBm!D=8pd zOGzWJ0xI3HAh~q&&OYDw_m|ftvfg{o%sJ;1=gi|ehwH#_84udXhiM5&r5fja>s>gO z;bC15UXUVR@=pm#N%gj$vR%})`L1gRUTFqy5yVA8ManD=vrS1-Obet>xY1BWnXdII^~lZ)qe?9L%B!(!<}I1SOvO|uSe&9h1- zuL{T1Z#btcY`(Sp{O#V<&=A(_v3s|d`|7W~7;(UDvn|AMm`Cy0%($MNU&y~N7Z4QN z{Hn(nWYj(AJ`BgKC4-+-Z0hfg+Vq1+d3pKR>3T=nDE!F30WEyyre*rNb2e@BPug5t zxlSx(Jo#@j{pah>@XHIBQ+qoXol5CPb;X%nO8Wx3Og!*>Jv{2QM?8g7sUupvmPFHs z){owUvV<}^gb-?L#785<6iY0e54&s7;)VzmC+rWHde@vOMnMzlif=!1?sylE2`egK z(w-)$g9UUzmYffo9ba4luL1;pt*WXTtQjjsyo{E3NZcpHLb>#vuByyFM#KKD3}vO* zBSAi+Ph^kj_F@sw!G#1`g}Q1?9=9E$nAs%9HblX~{kzGCw=SV;&$fEIvux$e<)~j# z#cH?7{D+rBOpKCt-J6bV_~v^4#v5@w^#+Y;0mH@S!B+zl&MAa;TrysTfa4xW)J3TQl-G$=&hq z7MV_B7Z>eBhuElhS%Z(6nHd?4x$pXTdZrA!z!8G?T`FWk5-%)`Z@e8~;$HSScLU#Q zAlI5eF@}$i@9g6PFDxt!zSN%JDKNBzQQqtKcbqyYI76-DTE<6S$W-@WGe+9bmeQ~g z5A~UIEBvz;Qg}^~tz6Rk5QFSOEJ6YI@V4TPGJAbS{ur z!*fm&d>onw%^+zbq?gB9^%UpTwmMoj@IUZSC$B?tKwiEM6m7XQ!B= zz!Q^Kia3*Yx_2mCYEU_{dYe$zp~Xbt?I$?}A+<2Qy=I4chUVsGuw%;Ym$GK~l>S+- zguY`UtQ<$Wi7V9^9K+)K)`ao*2oNNAU6Ye9d=B%OquY+huU`slo8l49f*PPHTDF^v zbsQ#KIOEp)_R$?{?{m`k)dz6C`(9pNsgSxq^k{@MEksH%CD){)x4&OqSj<^UxNz{( z_x#}z#{fYxku@gNebjAaAXSo$1gI0uCVMDtBqr9kw!SUsx#O@d8J|avW4q_bT`rPy z3U1!lX$yJEOq~V4Wr>rz2z|HVCKc?XWpJ+%jD#j|Tlx9(Cr(x4ZoxHkY%li|M3a$( zr~oTlLNzGEaF;NDgbQ2@USY=A-qstU_NiDiO296KrtXFKjm-00JIg4!w?3}-mUE}K zdqzfd-s|Y#Wclqru5Yj8zrRhdAez$ZSW{Eh&qgNR47 z-eET4RrQO7V^X{zUYYCnEmyy8|D6x?iRe=qkH2Pk=)8k1x zwe;VLeb_cHU@!cUw^4vN&3j1**+L{E?F;UdB>wmKklc;uE)A=~U4#1RXp@TMsCW=N z=UTwRr`^&p%j1<%t)JGs+6|UUABxA_;UaM7OJVq&bSLk}#Kc%H+?i{f$OIhidrmUq zw6wI`X~CoVSu7`P;!&cGcF`*AXt|&Ib)%jJG{;yFju9Jg+_$2M6k(`*Xcn5!Ln@QQ zG3#-JYq=2f%QF2R%x17*@)T+x)vUfpJJ`djsK+j17xeoSTlY|d1u@i+Q8KmVT)(#L z;VG~L;JjfXPu9C(1>MY?wiU7#;Ef_@mgD1+Ki9a6`jN=CEP0NXft>(Fm^sbwo=}Yi z9Q5N6={bLgA!At=S3Li2)Lr9?-045^5X8cJl0Tw0K{~*Yjm|Q&u>vn5At8Y`{O=&6 zU>-Xy%;UR(=jXQvNZ0$~Ygu(h*R?K8;B1UNo_a&RP+RW`juj}uM+2&yJ99ZD0WLAB zoB%ldktbW%I4H*5IUp+49&X#IDUNMd?*K*eMLqmkbP{TXgNB=lkc}A>Etqci+e+3j z_K&#)0+J+n$X$@IF#kp1L$|)&! z4B;~;tjdCoZ2i(Cxn9{9${cA_CDyD`qK3fHd3|*OQvCAzI+rZ6Gn9NxX|2V(#l+lx z-BP!7k3iy|LKl8e%$uA#NfdU|Oyt~zt=5w##0;_d?wBw+lTowYq-1(F@O-J%^vbS- z09nC1eJ}zsTaj3pF~m(FwFTWV^{*AQ-HgZyZ8+N*Scqs`hVQl^iF@i^mK{dvGcFk+ zUw39)nI(_dChiToG)B$N&VG1wXMs7u2Y|z<02y?u2QDAz35}NUpjN>i-!oqLj!(`+ zozca?eQ<4hb3Q(HfMGO9{(#+D+isR1$R9t~k1F;S*4N;BL^5npF# z=U}Xl_i_E_S>II}lQ_7uI)S zslEY=s*{f3{@%d^hkyCbt3#GYW3T1;EaTFioRXo2s$tPm6oylN-FEVxCpr{mv&&xp%MGskQbL~2yS=iw z1+Oed)RWx!4pqb_A}yWu7JV8ECdKp)h3`}}=VBC8{@GBu6!t<+XBzf1ho-1`?A|Xz zBzPpA{ip2>?Ze#O2aPA)-48*a=S*S)N2sc~*)Ys@&#~xXz^Y8ep9wsp_6EmI|Hmht zeE}^WD3VZWqvC_OY>80`NzEzb$}u^r6h}*w+GMrZ?1dp^Y5s#csy_RTSA+EAr8K2y z-iUUOLl5%FD|rUI zU5ox&L>Aue*7q`3>iy{HQER|aV2V9)`*t}3Pe)FdY0G$qRHUm&1G-@I?A4R!Oi6(5 zG5Pzdy*o{T=Ug6OH8}HGpDGcG#3lJ%RpR#KTQy%-{coj7D?h#!bgc9@M9H3!9@||Y zmNM95V`qpXKdcyZ<666RCfam*sr;z<6Ak%{h_yD&%y`53^_hPi-QSFSh$r?ll=)gM zZw`r~BWGdYh1Bzp9xkH2q=?VsB7)EQDUYVlnZMPRgkb3jj*IT470yT9bGali86tg= z$Sw48rguZrRvpKpo6JCVw&wKyeOeUv4=W8T7yK>BoC*-@o>Ee);1b6LKbDr0)6%(p zl1lF2EuJBWZ16uwpVzoKF7N`s)5`n^HuJ=>s1bdJ5c~T%5-L3ZnEP*4(p&GJu1o-U z_^k4phQDiO1l0jubp0Nw@+T6+EV)rXsj^)OFmuSzOTk3oql zb9*a0^2PvtnSbw^H(JXHG)A}THt$iqEd8^z*cplj5;@I2w_u_Rid7;2X9c83Wi$QT zF{^y@lauQ0>6;SyUMAA+jcpgS=J2Rn`wZk`ENJ<$0`6D4M5i+LWW9I zs4f4tgb<5PSj|+zn@22r3F9eKhu70<%&<2e9^zkdC7jP2fgLM-NU2hk91&PTWv(p? zk*MN==jFkJqLm+}IM5A{XYo;-`p_wbVk` zYS`!fhTps2+-JYbaTQiS7ys4s4!kl|tB{)(M~bHBv-lHLj;ZZ;k1~Fwu<8+IMtu|s zW#?84+A2v%u&aH^!`2JSvFld0xn5{lkX&@GG7HmiVkVJ$T>m0|+|tT-mv&dOtnlU`x`$aQtS0b_&FG-O>AAB@)^PR`15=U6P#l;3~0U{T^>3r_Ao zq%a3q=Fk~xP#z};C!r$irtVeB@$5GCaMSzqz9R+F$Hv4bY{2 z1vA_4cVB$YewxO_0&hPqHv1DTzUWY!wio*eLef%FJbgiiCCSwpUU5H<=miC6B0u;P zx)Qsz%G)qqdL_C_Y-&q%orTa-nAm6JX2iXFvF#);jJd8$shi-A* z*UVU|^xSTIUO2}6dvyN*EkfKIV55O;VgGF{{6XTQSqIKZ{cG~a zxEZ3U8brJHsNyyx=#dzm%qKF;vEyZ*mVdY5z9^OrjnBJC$3);3(E{?aA&8H?O!}Ig=F(olT#{hAm_ZB;qBuIjOCg2iZgVF|+Tk#d! z08FneW%$%aJna#YaGuO)wyUKF(IvRsb{VqswfBPz&d&jWvp)ze@g#eCf3n?llfrdu zw-x2_G*z?Dd*XUdW7%xPpD?oF=k#m`)lymBdj6-PNB)fShQrHJAN>lHvQ=ex$(IZ< zm*RjNIIVNMsQY0vm>|IY7#Zu_H@_8madEK`Rlik!;}r8kC_Y2z8q7OO;GC;5K>QJH z=NyV*gnZkydSQ?ERav1R(7DBA{=MvJw~S{-(&e-s(|FB3Qt<8;7p^$kNLj{7#-hed z)WCP(KFL0gDUNm@LkA&|_mA=Y7s~|j&hd?#jHkh9b5-cBtFtpjrWU6;X~wWJS&B65 z@g*}hQRm|6>1l+n=j?@Jy8irecY`KQPEPfbKPsA~e;!d~r7IlZqYE25C`Z*y@cI{T{HpJx8Zc>eZ0 znsGjEZewL-CD^kKfOd7UAjom{{8{FF`0n-2u1UI^t<;;ztXSDm8*ZkpMW>VuqhB6j z6KtbPQfkLVmM{hA8WW8DonKn$oL%jx*V_^}tj8=Kfiu?;Ad(zr>>(SY-KACZwfjOF z7~FW~{3dR}$i0j?C_mrR*(}O9c<%grs=Z2RaYprvn-C<*m5amXQ3EMSfOyJV!yEQ& zyTN~b!F1#jwr5ejIeT0-<&$V zse_r;%T$upGtWY+d8 z&M!z$1^S5S49oHr`^hJ<(!Y(R;nB`HbpaxLwibnCr@f6yJ)9Y(`Wr${v+rajgFheO z^g6{F);oMX_;bW!ruNBjy$MfF`uXkPqsgFkLSLLQY|eX>Uu3eWvN{x39*q_nEpu2z zbS(+GTfH*Ad0=d#)t=~tYfF4?favK_QReu1cbT$hzyN0urR2If=RbX!-x_kk3~wp< zzA9oZV_=ey{3Cuq_Kzf2ty_V7FGsaI| zlvap@JHPkUg5{IjL>LHtYfI$6AunY_*^FQlHJI@==tiV3zu!Kmzp&S5gmW9o?V5^d z|7#BipU>N?Z$Crv!>(G|PEMAPm#Ol)6YLYq`v;}=&cRHC>n;>k&#Fe4amq%$oV1e% zH$6<)F76ub8%?F#h_#4S7+P~{#+yynYYshB?^OxNG!(NfBY6EPB${9>=`1xfO0JnA zrZV5*&x<(D^q|JRTqoZGAC1O&kVI=(+OkQ*;pD5EgDP}76r9zrYiOSZ0aVt6?V+R{ zd)SwKxc3SfQs#Mwjc`d$kMWsbrB=((QHqO9?LT^A2m6QrU8(>WE)jliE5=L zVEh6C%Z2{uh0CDh)6?f?z0YIwAd3gwn=;hmhO|^QiLR3-b89lP?HwL|D38xQs~3W; z6OMbM@e@RS(7t;#ksLMXF6f{%gh?<}*Do`>-v}11!u|Z$2QKB#T=W8ZetP z@lue$yI;dDal{|-I2*H<=jKcnXIM=;kM6qA*D)M`3r^{7bvijO9nLm;JTK9;&=#B* zOxf~LQSZMBS8PA~X+vRyu08?kiEilC)2w@6(c0jf|9O>_AGv+i?0>Smbb2ZwcRmtZ zAQN-Bz%Blr>v!;Lv2@&7G$s6Vv?NvwJ6n8>N26bPy*ynJ1MC_Mc`O$v-+9U5CMD56ydW z>71{p13CqrYI@?>UC46oCU5}NTo)~c638jCwj-zJScCrNzlk}3vd4RLlihzH=k8YmeLy3hI`rE}_T#=j1E97)a^;pMfAWcNecSc;&HMd^qxUV! zv@B7k4*LQgmSvEaDVz!YE5)uM*~zb1#&=Ja)8{W=&9wSTGs*eDwiVE2g9aN4OI8*%!37=0T9=Vav_F0!5)4<`)CpqrL&T9EfJ05Z#%xZ8x`?@1U*@K-#T<$O{o^E7!qlz+TQ z+ZD@<_~=sdDE~{pH>leuW@qndo2v)Bno-LWhz_kvDzks`hxgy7d-&4=SEB;AJ+m9P z3@6#Vj;@#eFJt?OSACdhd3g*c_t~7Ry&dsjjilcyF>y5-(+3{|CXi*Hc5zZ}cPd;3 zIkigs2=hUK)5KuHY9gixzDWpgS?Qms%iT0ElaW6j0wM@F zGQn&XYZDB&u%~*LohhGpI61W<0e>CQ^iVlBfWCWT|BBLv#>?yQ4HGFE_S>%Zkk4n% z@}X83QoIM^We~Bc^vA-nzOvh!B6ranVAt~~c1yLfQB@;g%wO&Z!q)+`@RO@z`P&%T z0P(Ud`%hDbJo>5B?SZmNKq$Q@?Y|#tPgsAkchK>Qa5lNcy?J(J+vv8IfZ?RX;p?xD zCcWqL!+f3|(bhIIpT#kUo1O-nhGm}@XE*&YzEOZgtvu!~vSy|Er;zgt8@7sC+m$Zt z>{&At)HX;C#rWDE5)JqWv~$xarDdI6YqB-Mhh|z9>3h$;?s#g ztv_i48&~`Fhqkur>V$uwg&`8ifc>!j6H3yB^BG>GdwI`x-n#&gVM)qAXY$Jg4JWP9 zR;8{l_A}&Z4;aZpi~GJ^{BXs6{p|6d`srPUe`h=MZOlNLAq>E-Li4k)ZWIx;fA&qBSA4+c z7!>vZh*s~Kjk)ap$--VgE#)zXEsRtE!4)hH2tafk%jkyhv6eFuu|aGN#{pDl3*MJ9 zGngL%4g2tYOQOc`u2&CWDu6I2ik|oTqC!5FY&tLg4&v!{Cufog1BzhV z@3_HHPe6KQS-8rQ@mfqIIP^~;_OuBdc%Da<)ifqu>DGlQDe=siKvZ4_I6A_xev`3` zd_Fn?y?1PEY?!wJD$Hl z04aS=T+6X;1xrAba$8fEFMH@ORGGg=4QD3%nQ}cD2em1oIOiH5i-@_??)(;d1G?<=HI$|%j3`RQX zLBA|jT01ru*KSztT>5$WrM%%6JPvrU+Yv)8A(@Q474DSzaprMMRB2L1&dmaA{mD#s zH{7`W!7fqvjxO(G==#;57Cp-Km*bW%>cyuPW9tct5{pkUI=Hg~_wTIR=tZgN)td+E ze5m0=cFxep_6D>0o}GAS9Keakb^2C6I#1Qu+Ec930Fdj|HVdFQ{%Fk-p6SO>x)EhMR?4HtmW= zvA05AWu`JX8~=&rE{z)dcPQV*YsudoX1BoK7fT%h7z-Y)NRP+a%`I_O9LPCNtjARKMteDtXVz(k- zafnX>#?JHMgM$NJHnwtkMP@d_W)MX8=}u4V#Ug=TwysZ2+Lgm1?BeVkw?>>OX6qo} zZPhG_DF``d_J2q_g~i6kj)nLGF;!_~?;(ceNZR&t`UEKlkQ8yYmaYTnRm|`ZU|sA5 z7m&XAB-QQR%x{yCc@rKyIma z7_^@FtUm1JhyXCDRs!K7=PreLo~iv8M9pUF%sJ*8kMGGj=j6=XqCjIf&?x@{$7{_g zA9O@Yf+6_cW%fwBpa{Z=AmnuqgJT!CFoV3O;`(1j52jj@8j;((1t>R$@NZ3W*rfMa zgVulvL$3UreY-j-vD`S2*;ZCKfagYW#1{AmT4mxw#>U1zG>v-7XerF=(b_2izL=vs z8rtsFA(FfGafveIRt}AVhJ^?k*JSBsKDB%T=C zE#Q{=S_H-Itgpg5(i|2Zcuuhu^;McF#@toJ%luT3r4720%X;H z(y{C}9vo3GVMDJ(=w<_s#`Uk7`hs8Mp@ zfg2`Q&W7$Pc@bKEHK|YqI}MP8iG9%>UEWhg%67MVP6zg-@&TlaJ9!R=Q zP2l`SOgp!Ma+>S0)>fSxcTeP-RE5S|Q=^0ryZKcIU_+UCgCz>Xc!JNF@-|>5fI9^c zYt$qDamVFC^J@$f`BL@%w~&v^Q73F3AI?;ACCfp_S*pe;y!4M9_dmt!E>D>lV5<3K z`n3&Xrr8CdA`7})2)qd(YM=N`z9C3j{{p`6k1WZ@XPMdAy_jxOFdXKnq9^<2z+djp z8`kCCn|pKy|Nq=nSAAk+@eG^yT#g385Zx`{Cj`M2Vgul`Bdofa94b+j`zy~9#1)&j1A&_Ex{P=U>D14sc_#+ zz0y_pjRd&m%EQx3|M9Fn*;$R=Wu|Kx%fXhgg1rNuYtQReN6;6B+yIFKq&Mc9(_TzO zd$#@aPBkWHmc>0V`-4L>s@acgf(m#eN{`{;PbaglCQnxZCIXaVBq(_As$hbK_bUb# z9MzB{*S$Fh5vd99o9p?T|C|V5R>M=0(9YA)n?2^az5@!c2LBsBAn{Yn^p@|F1mM68 z6?-oPWjx{$Wlce$4BgDF(=2ea-4bMg>G`0JwXT~)0har`l>R9C$2_NPm!8`;y*Aoyp1fmS8zvBc6RT$|1|Qn7%Up znB=`I({-Bb-@vTptXuyn&w2*b8NxAPM)&EXzi6!3e$MFuPEb;-*u&~oX8#$_*L%@qP_+A`8Mke!NcG8x(%pVXOK+?sU2IhWm zAtyo-EF&Qzml7(Qm=1}O$3AV`S`tAF(JBKdmb4CO7#xKc2jxNfy0}mRZRI)9V5&ox zP2Yn`4*sW=={xc;l2HkeA`=NTnMcKyMIoz)u?I$d-2m&VM|?)Bd@TXS$Iie@g0&Q0 zd+CiVq_XmRV5%(_3LN}4p9+tB-@*hO8yIJgD^^eiSXeL1f5{iaA*;*640R^aYchl) zb;pb30Lmfls#`@FDmuHLG*zZv{t&oS^4YBSdvn>{c1o-JgBD*GQ{`33Mw0T&qvTl5 zfjtV1;i0D9UsvpFs48Eswp}JWDswWwAF>sV0G7po%o7hpT@l)e@pjSny|woY@C?Rs z&32>^A9&-7b7lIxbXs61fz>%Dp@;|7)(4_^*&X0XeJEp;LLz9}o`GUvX;1OLU(M9uDQG5WXd3_w7{@Di{OiGdFjTEuIeNef@g@r_W0C zewBpjD=RnQtFI0lI&*}hB*4-{gufCoD9DVMkg3im2d>BH#@ki4!(|xipoqrz^LUI) z+ymNd>tThC_weKHS`Bi;4yF}y%8wvX?G{c-WADb}9w>6iI^O`P$}v*@!sf=wj7RPPrriq0yb2xJ}%Q6 z#9!(bY_r?f%PETi6@v$1ne!#U~ zn`zE6*pKUOQmaWof-9zdlana6Rt#^R+R=_K;u)6N=ZIsd=uX23?#)b!Ya(G6l}5F^TdDt zIlrDZjK=2^*c6w>($W8MZ@PMB@BL(_lb@f7wvXrNJTS~IPq$r7>k?4LK4*%!_donF zsjQ2y#k4s>*uS#MG%9;%+Jp8j3*es3StXbFshF3~eaYNT zm@+KiDYxqre#x{}jh#libeiGH2h>Zft(g;0T#dK_so!V&jcKH`$IcgeB^Uu%^I57- z>Q5!9@3w!ZY9@7ocF$j~iBsLf>j?+?hRD%<5*MNUTa$`seQhAG7yI>ebSRbtnx{@^ zp7aKhquTUKAA+K~hXC)k0$f$1G1MqIHu$wJLR=^6*#XY|lIrSeH+f|8<;|gh4pkJM z3!R`Ih_1pP*J+9PV|tgBTDyQ}3m`VYbq>*y&@tQ_f6*3eEpv;1DKZt2s1K;3tks^o z_L^vN;g=!xeW4jQ#{Vk^TspM{73$5MGOxx7djoQN@57yjQ=p3$P7wF!s%!L~Ys1_D z=hSF^*)BVkA}Q$bAhY;UUsb7(xY?v|e#{K4L8>u{3%mUg_}7XhW&!O1o)jYhD=Whp z8NU{(D+^JihQ%?qOMK)^P|p>^H?ccU>eK3Kex%}Ae>Eo~pOpK01#ho)$F+x?J&7Rn zKwE5fUbqSNPMNm71mZRq*D3>+&)3bxCB7%Yh2{h0*AxA-=59vT!29{pA4(V->N>I--OsM-vZ zS6lxoIW{JCLs4@Scy@unT+fjdvA7`l@R}`ni%YN9M&?OTVC6vE#)(^=n96NDDiw-o zpA6tIA|WIZMYRS@W)5B(Z0YXNSH6F1m-H0ifwy?cUav`EsS|_SH4| zM}2*_)L)+%?Dc}yi=fla<`q}z`K_#i=f9<9_l(i6yb@~bBif#CysaKF=@ncta|wQ4 zzUsKMX@lM!_oY24Y&(dklhZz^L`$E~9{7EK86}Tw`KIfz?N(B5g1UO%!fd&c@#RFi z&Bs5Mb^OBSa(b@mndLHSQq*s{9A9tE(%r|$$2xQMkGlXrKT+D{bvfb*G)r{cd`h(S zEN$<;XUVp57dk$6qz>(Rdj;Mu=YV~A;8?^z=#D5u1fdQsD#L(Gs*K%#whnpBppkL( zJ8&U0I*R$5XmwurE;_u4dC7 zAVG|S{e@>7d&(mHCqDY9O}d`&d8!x>C1y~P1%if}0EgaO^2p(Q9 z%+i0vRy*|vOeMe?KTz@)M@prGB1B9uvjZwyes8 z7VA%+hswUHG~hTNwH1Ao$jfkQ)SI?sHJjQt@Z=APd zWoL&DR|Y-I8>H5aIT(|8oa2kn-+c#r?ryX3@(n(tbhq}dq&L@SNG97|#`VuK%$n{h zh|0aJVgF=*2rv1j3V~+b=?T<+yE7|tr_;^_&VneE$A&zloe2oWdQ_C{v<(O(B!p$> zT{EU-paQY~2wJoNb*s8tgQsvOI1FIDj^%-l6@n;5&KXl%T!<328vMFmDf;5}t;&t7 zdk5;-FMY5VupKAoUXW?f8e(yrw!)_d`@t5nVpDg3litxiy#Xe7;3Mq?e=M1a+_)Nhc}Ivx3#eC%5x{R}B2kr~ zBZdSP0K4j$F%tKCa()@a9K&k$mCn2Bt=VXy4D)8H*Mk-a3isQTM;Ji^3+(;H?^?4N zAyKdu%o#H?GN_~OIpLf^dgv~*(db$MUUqXD#16zBctN=L{A6u8cSBj){6BE$g{DaEG0znQA- zCQ6NNejMJ}=P{6%Aj^2%ag9eB<@*7S7p3cjv&sA9uSybccI1{imu{H_uF$x>Xw#C% zYZ)2q-9k=(a4G^qs#+RIpTxR1zNvk=Z{Na|hjpe>{V4YQHJ!MLM;`>73Tn#fiBCEm zX3OP&>^9o#e7*$c%4+n{KfR)^crr|ghe%cFFi)dB?Eq~>kr%Fz#Ul?T_!Rn`9*Ei> zMkC0Ty+6A?f$fI%j!;AA(;tK(UE4Hw$!j}5Fi2W=`dE46Yd$n9r-KNotm#tWDny4= zR#z@}(na8$ukQ#npwfF{ZC-e^6hobsz}H`_7JDDQPa4_@YOdlN@D9MrsVaYI%j6@O z@X&&eWNI#_tKLcxKcscZn%gy?g(Xdc^CuQX!({+@NmN4teMPokz2Qa={5?Z26d3UC z=Ex@>sN7AwSOZkV#_Ofl2hai31>ly5YUvGZ0?bjBh+Ut3$HKRmE|(yTLSiWU@^+5?YfEEA4lYF3^{ZMI$c>I=Mr0s!mca|;ZL*WALNDzypa)d;; zg74(U4KbPh^k5S<$EAfR185c=5ui}ggvBTMUDC?SRF~E0us=kpyfkaG{J}Q32T3kb zX0YH5B&WAJJ0);a(G2InJUgFgVW&e$yHxr!jlLsEVLz=5~s^H z#Pt{HXPI&FXh#z$twMO=G}B9l@0bQHu9+sZ_b49D2vxktnN|-F%I{br+hOeKa>6;5 zLz3A+7ufbgqU{YY0jsxrGB#)H&PYN`!nX!xdb1|%b{it{fkE$fPm0wQXmr-Wg$zW$Dd9}yMm_bCR}7DsUnBwEG<5|yb_Rm;SSZTx*u<}H`}$Dm_ft8? zaP#x_tAW#(t;wySt=8DnmQkHQTO>o$ zwW&%wM0M7Q{le$yqJuT)KP~RCbU0uarVFEAN$wI6A zge)su7MF;40e9OmG^311skIl>55VF2g~8R>z0I}7Bo;J6fkqi)^7TxOyTNdN-GbAz zx|7g4S0GfL&H&dI==Y#Htr}UAV<$nfg6=^~%Z8UX)C6>50j{4a3DS;K42J@sPn<|W zd-TJ#fv4VP?DTDO>(~YdO9&?=Iqxn>@9aORL#hQP0f~bS6+%4X6KgraY_aHyXziZg zzPnz8PNKNIhb`{QCtujfGdlmy+iY=fSt~|j6vYN$Fyq}%&zP3HKW6zRqN-&9Loax$zS?V?1$s{m3FnQPOSg{MO6#!*U# zX57;C9EKt<=cuLT%*U==={YTXYxU1wu5N%ai5TM(dtW22*CCE2KKqo)Dvyy`BGNnD z+Nponj4w4PhTyx6L|XqdbZ=d_bq3%*|{+a@$DII$pDv5$cC zF-mq^V6`8c%K);$M6px?`o+_qS+OU#N|A>6lql;!5!>(!G=AP<1=fLR(3Yzt zEG;!x@cfTmt>@l?B9waK(~$c($n1d@ifQ}q z$o%!SU!E|C*(;Lw`yh!DBN<1wogEM!{Ak@2sRCS-)PxI zedljWey_fJp6TfoaFr;G_;{?X0OiY@I($THqHKIKyviyG-b(&@#0U;aOHFbUWbqkl zx;A(8*!hsqtSQ^I@O1|}WRvH6^kPWml5Zla-IiV0UX|e@>!kMC3Ccz-)*_&BE)-hF zZSh;FFVm-pcuh~8O$>qEhWrzMDbh;SIeVx)CY_qR#SJQ8&<98Cu7qe440XbCGCilp z#(h~>9Bncd`=AV%FBl-P1x}z5cID6M9Pm_(dU|%G-_MfH)bc@|_&n(dI^g4?oK18l zIrReWw&jb~-3x~=ePhdF>$IL&lAm15g|o5Mnp0vFIdaI!`5@T;pbMldy)Z+8IZ5d8 zu%$i4z{yGTH9pfDTB)VxJuOs{9%%?Xu6;R$Hi~VFtS{u>(yhj5DlU?MCy1Ttx$Fn@ z3!ppKbRq44(d$T;p-fVI+}qA1H@PqFY#QRoaHN0BbvP|SuPmj`;j-Md1^$Reh{79MT`?u(w4JEE|f~NtQo-u)7{`f_pQEPnhNMIQBe8&}4B(yO5e?u|j+^~btpd505)wV;E_xx>?S zP$s-DBq$a=U$^NcU&?5nB1QN2K32wQ7Ph&!=mCNxUQ;u4Lag=M?KUb=J_a?subv_; zc;nIYnu9vSV`xt!NR*dpdgnH}y@QJ4dE&RNKgPADjW=(%USLg9Q?`v=BG72JWGSun*i#QsC~p&NkP+b0a1Or(d_R`!tG1gHw21tH$Q$uI z@<*@v#>eZ$ZzG9A#p5W+XlzN3KeEf(1@yBL-0qyyA`3;dXCxVJxx2JM+KqJEh10mw z7o1(qIT(bv)KXO}&Ehv>43jULM((fNMtes0E`LyUn!TWksdp1Uh@*N%9wqph8=HVlbyfk{H!vV`Da#%IbRb>pkFQ@TZ zEE4_|FVrQL`}T&msu)z zd7Hl=HQs!Sb(qpml_NPrgv3^vTP^0*TZKF9X*Jc=x<$31S79`3D6MPn4punao@w&v zy&n+YvG%l7>g`6Fq}a~p)a5N8F_5C#o#}etfbX+<(H3cfBBbto8LD1O`pzo%`LZlwEN}b0czAa7utKBVQBhp!4o-L z+F6xb0j^@{Z?9VNg@90jF+X8?EqAeJD$8Xf2Kb4>5S`n$upac0-QI<<>9vFyx!zH2j}~SbA~TD8|SGc-vS3pG9JDKPc6I zX2$lM`!ESv;MXHd5Qh)o+C6~Bd%m5#1Z}dTmZ%mN*>_}`N(<%B%viQI!OV)=K$|J1 z7huw&HLPOA+75Z}lkk|M4nvr5s|I>>J$PNwO6BSLq{Y40OF+i%V^5|C)G_6Ii~D7n z6z7{8Awwrmf^*xnJ)Cw%#e?D6`&a-zsMg8Kx(Cm$wR8?I~) z=>`RYTT4Q^kd#gJi--^w!;J@7*NUG<2p5Zdx3{-%7qK6Pqk@Xb(|g7To`B&ho`dGEBhu<nvh)591D#kD#hTWqx4H})?{0zDydS1HT zK7Mx4t>V=@tL2+E)@N_K?9_id?o-e^H%H?+R&Sbp1b}+7*`#@(lmFiTj^CT~+G(hZ z(~LYXITI;BRHG?RK+QOLmwZUT@tO=4sxGxI*;dMef$kNFsMldkA4PZ z!J+3wg6?3LgIxVvKx>hQ=OxShL66lHdBk;+i|gjOjDjTKR@1cdqI@i zr*zk2YltVy>>;>NTex#c0-&Jd3s|r$ARpX0ha!|t!+d0K`}T;py$Ut}6=3qaDuU+7 z2}Q1+pe+FDdWIDqN-tO6{OQjt!0(e^AdrWn!xN=cY4C!88ZO+LuI;+%t<1-L;t6<@ zazwxWXuwIJU?%@#`hHwPFQBo1d2lfk&YCoWt)YxZtPHd$e2hm`2^b`J7{VxBvvJuj zJ?@vt=*WAz*QPkF>7iv8`&<^!s8GA>sDlH}AIUVX`Nk4{)>UF6(tXL$;dBXDC;WUb z&V@W{b-8ejC1JguSwhE|8_r{G#DquSvCeb2rV5=V7RD7sF?g99rfb!bGvK+*$ z49XDS3v#I?JTW_^$&K2S`RHH&*mO1oWy>n~*GrpzLYbX0#GO~SQs}moqR#xp z69xjN#NTOEAHyqAzrVZ$9y}rLaN`l!pVbKaq3b z7CGA0@AN-|i<48mia5y1r3To=gYFg;@VEkwW8cOB3QTp!t)GI~y1Ez>&-w4QhZ{+3 zt+8tse-iHAg2HHV_=&HdPPcx@B;1-8#-MxD`USG-F9^!Q?Xv7{`P=DU3fKRH z24nwQv=BBVS+fmMlBZg7jLULDQG8v|;5%(2d5X`8jIK`{$g?CfDre_mN)~6C_eUlJv6~M zt2E~!!*UH=YMaPvegTT&dFoR1?^p51ju#%kDNWNWfQI-2b8!~*!ZtGq)_ewP2=W-d-oZ>Y|D$=3?0&uuT0ZmX{L~~U z2Cx3~QlYo!NTFcnCX6HW*3v1R_&4}{+m-AW>GK7kjM-tlXe;~!-1HAz_G7=;nTx-j zQ(8ib{mv6Ub_O0oB^QY(r8-PMmz_l~bz8dn)n)#&bIFgnidg*%J5)m&(bS!-WJav@ z0Z7{?{rLM)eaDseKj(n!4c7k-t>Y=Vn<*ZX~R&AsN*w9|w6m-)VrGVXf<0eeIv^V@uwqF#IDJZ4A%c zRAIf$gy$k!X$xdaV>fBd?=La3()s=`jfO2P2IBp<-Um4yfqxsK+ zy@Ht&&h=N8D+1U3ctq*G(1G3J4HXD5Yu*V7)XW78i&Z83fc1$wFgmcupITCF4AY6d z`P&1*W2N*_ZeydB=(1Djmss3W30GhjAtm_HDr}%uYf>9uyCU}1eGLmiY~`4-Vo-h` zgIdw?2f^fT@NctUeMvGHLzZN-KJuyljPvaO!UEstW66#zmBdzqHsZzCqk^`h)(wNU z4A&vKSEkr(NUZZ>ZnBHMY(w#1CCswWj$EbH&CTzt6Ajwpv$)$QNe%iz?rf__G%{PK zvwq{@&j~9@d0fS*WFJE=Zsat5`QD~44mheU8}u?@=4Hicc2`juL6A0YrvP2?V}{e_ zaq7TO`bFBu{tqE80#CmlKG)|AF23#rEaihW$1-NaSP!rUds)0;a<6tzcAMjb;m=`$ ziIqI$+8!{9U^(QIB91Vs0^`z7BlmRCW&jl<+ao%zt(h^%;dWXc`Uo=h{J!9NRm(54 z@OU>9{ml`WjgE-L#D_si3NTF{3ugZO%89Iy3GeZtRft{8!w>V3ps{#UdoC1*wT4VC z2=CaojSj08>S4<=dJ?pz7?zm>Q;FsHRNN@Y56q%dAYXKFWq4Q44z5C3rSZbMP(4!b ztKB%=6EpUn&xL-*Bwzi8eWqtI!_;428#VAFtiHZQqC7?YA4sZK)tS%u0yg!b^WRJa zf+8W{M|<(7cMj};-B-CWZ?78O#@_kwcmweHnK3QTeC7}tzkAXkjc7$p5b<`Yzf!Rx z4~sS}*j-(vlme^DNoqZS)glGO0iA=rufccm$xLVrrH(=aiV5)xJ=ULruAHQf zsFHu2yvsY1WX;iC09YScfFo1T)o100Zo;O3PSTgHX@wgGV3@8^Im|*e#T4k5pf+)*-=WpF@0$ourWG zla-T#-lEpBQMGH2l(}wB%*2GSUV*vb9;)?@uZ4mZckgYYR=*KLxw4TXoUefI1nls1 z>`cC*rlj_84#QDsQhQJ`JMSI*X-#;JV<#ei7u=FWkZ(8Te1L_$w^&kX>yb$*Xls`&{0IM?tgP>eb>Vw=|*XeuYPjH=2XP=%qgnTMUh{tYya~^pY6j84MKm3z)@D!O>n8^M6 zc~GeSTlYT<E-vI1uTTDnU8B`wWOARz#gkm3=fT(ok#sVz)1Rd zDb|#6RcP^2NjeOeo}yh^SRC?2uk!I01|UBp_68}s;9nctfo`j@28L)eZ3>T^0lpVyLlLL1 zDCB&y%GPqWe}okgM>33Upf*P1_g`JZZYq;YZ0r=kW_kAa0O5&5#pJP< z{#!dPsO?ba%mhwO6e{21jdQvn0{;qV2XfjqM>ByAfo@1^!JWGg*xhKq06+NmD`yv3 zf?p6-hI-&HMQ7~bH~oP3hAzg#tqI{vcN)dxE0$FG=y%q~gl;5O=b_= zbeDk<|6N5{X5Q1|vC=~$9MQxA-E_XM14ZQ6owT1!TDvlXbkK9?F{tTXu#_h0m)^!B z*UoCPP_5be_Z9NLuYa>y2UL_skXCTqxvdYJLX3ktfQ-Qa%>55i3udd7E$PewpKM9c zIDQ6n&hAQdAjAexvhUb55rp(A#{e@0I7Rw^PoMIan8a~~L9{`F5bLn*c>Q^I==nMkuH!qXI?mp7+|T`YjhsS|{X27GdiWL$^@&TCl97_q zfNkK0k1o4MK}#;ivZeI^D&!j9k8G1%W~|}R%`j>g9dpRqAH%m=z5Q7hQS7lOs|0Bg zN_o;Of7yTe6oK5#b5(30syj2?qc<7!#~Um_amzWh&Unu!zs|$Y?*Sl1sIT=5){Yl7 ztpG8Yn5L$r*LU|iL5rR~(tilq(?P(55wj`ZWjUsBbx9MvuA^M^l809QV}VNWE2lI! zvEB_p`Z4^h{WkFI&!!$w<&cBxw!xg*B`_A@Kf<9LG~W(GGin;*`@5s?1#bts&zsq%Y5H6ZUcDDy6n;I zg+ZL)yKUgtV7*JT7GUv74BWR;fAh`t0Ek7T2}vru?~L#V9mn2|9}Dt@XP`MfC3629p&-2TaX|XhdNN6=J{&PJrCSyqN~DR zIN89YbXsESswqjN|Ljh>^f!g7uK!y9tUwO<&P(od*!q{w0;lLH`6b}dEj0!1RXifb zoKet@GVPFZb6met1^HUupFsIXGoG)ocF_3bn+;#3J<9rJ0WYA_*=xUfpZa48Tpka! z_GV=F!Y(K%rS1%*_t=`t!tLW!XVTF$rp)Q#&aDf@-=F~3Rru0x3T6KYdWUFxa;6-| zH@mRoF)8Kk5$d_=$L5ROqCbnq0PizSxIwYI6U`;KnkI=}cEblS+3Bb{W0^%t^b?=G4p66Zbd$th8>L{W_GYP1=jB%LF}Wsj@v z&Wr-v&z@p&*)ICWtaXZtQC8r(P|#z6a-OZMB}oKIu_V$Q3{Hz+$-wL^l!S!YQo}XN z<=oUvkXhd?aUoSUaLG@MDAwd6pch^^QJR$4?VlNT7_N(iU=>J&WJq5>(^>UO9m%6X z$;tQOEs`3z-v{xMS|&}*jtG{DT?8~5h0t_o^hglzH^>4gq}Six#{*D++%Vs$k_;$d zJtzJt=uY5VP+Qf;3a#OUd_w(-A(tyjY=Sq4{JP1xuz8+oUTr8avm=d?J0Dr3{F#sR ztvmE%qTFYs$CZz34M_ky;c8Uuqu-;&D3#r6JvS_n#jaehb^+Lb& z&{6f+^Vu$`{2`Kd`SYDoIB~T3+e7Hf zJ&03iHLj)DLDVO0F{Vk_36}4I`U8-?mCWal`9TY?EhHS(uD7pd&f# zw$3<46Mpc=lLL0|(!%*?lE24t+k`K!@+dg!MA0mvPacN87Kj+RqJk_B$$xn~#=(hS zXpm{ehgBC~SS9hBVKaGLKa$;3`T91l9z!*YEm(TGFm%;Tbh;G#dlg*Lqe9w;*Yf|p z0P$C8zU$xZVB+%Cm=8I<_%ap?3D}rQ8N_W?=#3A!U5Kj{e;{Qb{z4x;!M5b-$e_gS zUJ<2977LYADS^!PM5MiPbnLx|dB^T!zI#>Xt&oV4Z#VhLn8 zf?ptoeeOBZd~0vEsd`9?J!3(z*j(w6P;WSU+>bV=fJU z9dk@j0R2k*qsBdx&9fIL?2gx<&^S|C%c-ly5O*_5WTtLm|EKLG@5P&3YhX8|V4LjR zd?zRjUFBYQVyp15{%@=JBeMB>5T_%qWgzOKu)v3D%|H%X5(REZNo|Jn`ilEg8)Bz> z!qEUb42bvILppe1*H$i+D3HhuP2=y?Dd&M(H`i~!*6{fkp6K~RNj3qoLXEx+`ITah z9M!1S9pv81r`myCs!OCl06Dxvu;ZSsts8*KmqZWLzSNA5?()N>%%*dpAdFGGK02X^+AF2P8c~ z8&0!UO^TwBItNo%6N z4sH&X*y{#Z*3N)|ACuRQa)GQGSjXtR&U< zn&k!&yQQE!$8Iq;iD}ZyYTSf1J|@k&35F1-6JT@=w527p4@}UZBkiuTVgXuCH8|Z6 zBW^l&tau1+54jgpw036O^IR};;r^rVwT~Njq5)hl&OtmG3l_O2C+2$bXrSB!Xpqs8 zCTdB+S#aaH_*&iu$ja!1%us@=k7izGZV0maeZ3Q#f75 zTHAFNDHL7&G04Y}-%K+w?uYXI;C=I^Bo`<)eDSf*e^i%*==RG!qT`=;)|Pt`P9c77a>(8@!Iz)Uw*CQXh0!->>=1a|TWKcckD z0zf-&S|n9C+1pLIyV6;lI!Of|-0QRtiJBGFuUJTvek)LXF#n61Zey(8kDQW9#Azs1 z$7y@#8& zBUED&v7DwQ!T&u+$JewxmY*e-MjwBGFK!t8^EdcLqk%mQCI6e^XtWJnneeommDXt& zGDhE*CC&LKQ~mtTgxb5rS_EIks}!!{;fI)URs2(kW3`xOQN?X9nZKKe((U^ztApYx z_T~M&gmdW|Qtb>yEq1yyF0FxbQronZ?O z4KKe>Ts+b~_l&Tgy0?mBwSU~=G%H<=M>Gedk8wEPy~@VoUBRl#R&CHC$dSxKIX%iN zgr}-%?B~Nh+F*j0gHY_ah_ZmwECCOS8fO--Wgo^2Z{CT2yYXzG8Lbng*nP z`mY#0`vIFm`iYD$Rgb=i6+PY~hs~jbfW~;LVU?8VB}cK8@8z*e$F0w(w>1`(ZA@E! zQ{hREGO*gI0iBDjnzb{oI`z{5e3mi1&06e^%&NxFG1*lRuVGeW57mP3-WYy0I_y^) zD{<(mpkXFr-YhxOQ*q@;c0~0B7QaRjTef>e=>ByYHmS(do*Q zteR}KKWBO`{4BT0Tj7)4dH2Kei=UZ=gd?>;wF*?aEjU5Pd=QDX9Uf;H-FKeStHG|2K?wA{9FuD-z;`1Q2Xz^&j}Ux z-u$O;60;aHy$R7jv?_ZYTwO>v^H#Mud7Hvq5|~dzV3`-I;0{nO20SfE-51j2tePWM zNJ3f;{4SX}B5~mj4`==mxmrHqeJv<9I}z&5LV7A3lEi!cGOQCyu~>y%J~~k>4fC(J*HRJ z6q<8`Cza2kA|`8Q55K~J5COsQ^kSTaxqIUqpD>c!^+Qzb1tq$9a~q#1u?qx8S}_Y~ zU=qj6O6r;4#e0Icx)<-vjECloq8onKw{#ZG;-cyfZZtX18aDM-Q{O!mMrzUY)SR6q z___E6zp8HPsC|g{P%< z225g(HdVkK?^A(fXOV)JOSd#1r`)TlQW_q*|9Z9X^2qmFJlUkA1Q=a!v6QFS4Z;N( zQDovqD-B%h$3Qbm$X3Oc2Ts3%fpBMLH=>zFHV>TP+!+Iu=T1vuT5Eky&NysJXIk!X;K!PGg~8kp&|qD>bR?1IDtvq#b&V z2NT62{WI(|2VkZoBqX>Q`ispgTUf?5JJ#3E&#)Q+)55v7U0AUVHtpaC=-BO$ZFH68 z++S~CmLFTPy2ltA1qhAW+S)JSDZw2(*KMt>ad#4dH?SyPZCz-W&;SzGR=I1=#+nLe zTt~Jlj((Cbk74M#iz?9^JsAJl5YgE<6?-Q?^7BeIx(NUk0GM3BhyaZD+L46nw3+K@ z#{qeDQV?>?V&66RMU-<3+-j%5nT1IeK1aidtI7?fM>{TF)gsbSr-BW_e{Zs-y{iac z`mnmb1}cpE)=A=Rau7V?2UMh}LSwVo|7U*BL&pA~a^ZmlH zs`q=gjRywZd>&A)K@pzM6tC1exR!gg2C7-g&sh``e!IH2WA=l+`bo}a;6N(2eC>`&2mx1}UoPY&Te8@XhfI&Q zh+oo?xssDaaja|vJPyG%e>MBiP3W;)3m~+o)nF6j3(a8OdIq*fUR-!62d)8C-F4lm#;z^8FtF&>t zct&c&^#dIo@^Fu@`hMN+wdYtt;rkKDjQq2r7qlbSzPxz(k=D?$>o#N7g!jjweG=WR zeL~^;pF7B^(6!d!!zE}6JNNl5jU^`zlHI)msekglPi(IWlVuy^$A{H-icKzy;J(@R z95A-IoNC5c$sO0%(WfZY81bzGamI*dI?4J_&!O~snDbu8f0h(**29GNHE(NBO}d5C}_B5d13#^qK8ETkBg0Z=BUVLrB;sw45bOK zL9b^t#?C4aLTiYlvAGR|uz0JfGyNx8iKL)>Z%NNtjBS?#yHVI|puFqM=K!F|m0w-+ z+~lf#&tuE?eN-%j`8}7+F$ikNXQ+fNf<=tRjC2WQ79l^T^rC|>0pWG;5+0*5#sba~ zYyntXIl)mUkTeqiD4EBnN>$j-_Y1FE-1X_j{5oTHWW%~vi5cqGzoK&Ye!R&az?-P} zMD8+^17@m&T8?z3GHFUCiQ1hA|6Og+v)2(P;KRp3ZCyQheN+Ybh~IL`Wcn)xG9Vx9 z-)bJtJBnrUJi%cT(k(G3oJD6dM4|t6vlOLITLSH?sF7*r>ES`QP#YFiiIiv9tllZ#G)qefr)*b{F4++JtUfF6g zCK{wp|1!WQJ@btkSwWPLx@DpT(ZZ@`zxGd>-D46#i(|hr%70fSRFaT zQcfgjzAqh=dm!QC{569?PDy%u%sR7R9fmfSklupKugMsGH$UH8HL@-oLT<}^v#@6M$g11ci z8x}*qi-k38XE_w|jMM4(?B4pf!P~A*z>UorX+76La$eVYPuncyWkSetSAgTw+xO$k zX=U0d5pYU&>eCc#XYdLz5?j&?*mHQP9nlx9-Dt0&s%2+nYD;XR(IWw&wXOxD?9um_ z2R}jNQI4rr*7ZJC0l-)ez&rUwuRw_X9d685y1<}q9cPnBj24qm$*)RAz^8&f=KHiu zm`3lQYR97{q#qT1;@tQGaQ>vlFGjotEG2D0H_ZjR_gJaP+?dSyu0dfN5@9x5lTP>{>k%Ypb!pu+w#mbc zDXBs&`Hz}ap?`Sb z`^aV0y5&Ey8b&%|eMw;GtuE4F_>h%WXc~UtJJN0-m34g$gf>w;Ikq%PpZ^9qmbmshxPwjJePDY1pxhVJtkKYgWI zi@PuK*NlHhLua`|INQdBq1=_k*!jTE_#hYU#qv;P&ux;GZX>&*`^9ia)PdcD8NCeqyGx(YPL{z;a;EnmLcw6y369&tJ^S2vqO$2{~6tPR~(l zMc(cfEC@-(Jsc8cA9PT6JAaH(=$w$8{nS2En$bK9FpY!%VS^GB+HPmJFSEN2VqSo~vt8AZ^~KLRa-+{P)cq0!#YeR&zZMU&%GP04806(E5`3fY zp;9dHH+J6=ZvC~tpSJs!@u*NNcl4)-b}NFu%y@0c69}+M2T4%yGbm5_=w*NydV>ay ztu=Yyz2dX!pVJ(|YY(t|+7+#bil2HJm^JGj_L(dcVL|3KZSDh|-ShNABecu~ zR15WNIJQ=3?fq)K-E=c1dy{~v?`5-lHj=_65m2r=s)Q!tAZ72YzQ!R+r0eTa&18QX zE7QN=;HwO<^29szyFwt4p23tD>IZ?Ol)1L6mY9sDSm$rBtX5{u7>IRBeLdM^w2%+t z4P+suPx)-qLj+kn8XeUFF!CO&Ps{hCC0k9zW?@Cb9rKPSrtkx=G%37UbDto$Ty7~# zS`)HJ@8ozY+kPgoy;S=|k6+K{hceU2q5y+la+r;o@YbN72E9g#x}>V;TETi=%tP-~Puz|GRgtl-!10Nzv5KCg12QsY4yJ+-x&a^*DuFSYT3MU(M#X zgBsn<4^=m>FqlePrY7&i`aMd}5>ADs^&nASQhqNZKORnntCA(3sF+ubn_|nd^O#*K zZP!b&uWSTk0gRolo6x1|VQ#s3Jd~XEA(Zu;a>fg^a^{yEMqD%(yP|hamgU{IV$3qb zl;G{}|7OQnk@?d+U4`73(IuSFh;kZ2;5;LnfS$g|xa<+_y2X+Zx(Vu-JX;RcwGH{T z=manU(~5rpkDsIqHp)EJ0eXGz{lA9~dPcorBf>gws%9RZ`tr*uWV)Jf;hml$30&nd zKaC1j@-tE@I!bRoPIo(<);|tguXE1wfrzShN+Dg+q`&%*(36AhT@R^IJ$mb9F!@qS z_I>tqb9pxggL3@@uu+YM8Z(}$EqoF{tcNDFMY<2-xiIBBb04-pcw26hG# zc#|I43FhBU?rqu0KV+vz1u$wE-X3_xhuf8`RZ`p$QGttI34E>gR2r>l_K9S#s=68t z_SGcFaf~bT$&t=|W6M&=ikoPw(wvL3`mR{Hh{BYuppZ!G2gDhKuhsZmBpFEEX(t?X zlnXC9wipKefV+Oo(i2DqS@yt#jb6xF_OEUlQ;X?|EPYNPTTj**u2)ZnMyNj&i=wp1 zxQkePpCx9qmMn$R<*;gBTirc<){aKYl$S#{DoIuikID&3e zb8`JPrl+ZCm0u5rOj{}SR0Hsl{^)jGhQW$tzyU-sFjU|#^Z@QMWIHC^XIoWOR&-5S&=3B`D+|Lk|9?J&0ru=cpOLxW4lx7%X0IO;T_T zWQ5dzclm-ZY_(?2j})@567=1_{Y z@V-y97|DfPyRw)I%n6JZL5`VIXb3(M_LUn}*Aa}q*r4xAcG%^KMs!Vl&l>>Cn|m-3 zC@c5~R=PQJq|o=0@F!OR9k!`P#~`(NDoze7#mlU#D3$OBpMA@V@lt!!i%;dt>ns6G z^GR%fvF0YsftIszoP5B!arl&hPI>w%Ulag$nRFB@r%jOFQ10O_QRW#ClKK96-hCPm zcVeDLJVVI4j_--bFAE9Kd*T#*Q;n);B9f#pZEf0>qmD{C(eh7YqtmkA%BqH!^K}LS zFM@4vs|eXhS17Ov!0L}w!rjK&TtTEvOo*UrS3-^Z0`$iKXb6;#{(G?uG=JyqY{MWA zn>fA!EX)p=vZvNmZD{D)1|Jr&wDu^(d4^Rr{2*lB2lH2mg_rxcBq8rXr0{lg zThuq&1-FM5y(oq#fb4pU0S<+I^D$}jAIuM*4tus}zZZF+|NXmLxSPq-5yf+gW&waT zZY*qutMV(_dlP|pyh1YDDR{%j{MzO^r@3Rx-FUFi&B+DcI>@M2SD}m{dh9McU7_(r zU?q6}mYL1t_-CdQ`#q(Q$i2-K9cH<#D0G~*HDFF zZ~r<|K4uP;VM(0d^CD0^q_JYQ4O4ut$}lSW=xo=HS*~B8fF5fWAcQ0bUG9`c#ABD^Rrronl6cgUSH_rSJfI&oiSAEGfz&hX+EBq!sj|T(l53| zgS7gWm}HIF5Z}ZTE&_52of3pjt{_rJVtKBem2Y6Cx296)C9B58O5Fz;^%6I-2|L0P zt?)U_RiM{*N!c-CCPrAc)@Mvk!M~2%v+6X_(2KFY527q$PCpNv2rd538`%gWmIY=P z&UENZS0%iu;q+34MSFLF-_NSZcm_%HOp8LX(EnA66dG|HDaENx7y^85DsKb{ z`i{ssWpIIk9HQPt_6i9k5fxKmtK@~PEH5o>{#&GqtXhY<0>1&1cC#Vn7(NvOI0b+} z%kzu=8#-4+#@AnXfWz<`3~Ar7V*5U%KBeL&8dAerQ#`-Zvlc}rFZ@%8ruTBK+Xj>f zs1>kR_>6#E{`sRW|IPqe7-m}~#vmIAg+|cr3#6XH_xAQcSe}T8EAK#D|7#y`)yPfM zVd96pVwxy>sOfux&E4H605TaU@=r_^D(-2pG0pxKu+)!oT@*xByB{n1BCYoQ^Ho7~_!vHuu@sQ#@Nn6{fYKWBDj+G46s1SA}e` z-iOfk_Nws$5Rr$to=4BJb#JRLD9Jsvu>dDnz+joMe}bu8wZ@{JGKJ-R*RQzjcyEbH zhQO*`wq56C*PP7UVW9WTJDP3UIR=xYOSm^(brY0p|4P~OMfShCVw|vH)0cD!FLg5A zgpf=nf9l*u@aR{is2y;-cT8ka{x@IZ2;Mf5C}=&*mw;Ir48`S4h4ycIx;;W4zSthg z9NT=ry%&82m0?-`J2Jb1sFp_ul^;2qOTL= z#2S00q7{Qhl$^222O=^%rGH(+MdEdTSQy2R^y+b!5D2);a-(ZD_f@mOMQmL+9q zSL#HVx^{hN=X_!ubq!88Y`vmbUTGxXjUAHu29(~&)-VTa>U4DLiZyI-x`ky>MrBUP zH1=K?RuqHP^eTEk^j?N0iI>;P51Hcic^0$=W81nR?ddO+NSPxa zHbiF|#KlGo))4V!PPDS``Q(TaiRWC-8bcPWucOSD1tkXww#iFH?vdVy0R+6y+8V1p z6-oVvxwYNqH7}X0khKWuL#4CnV-EDu$83U<{1F(R=yxspuF_wQTr3{*tG&m^FTNe#Z%;#;6z6;=p&<(C=Un9c_`}k7=HbA0QHhgGXYf|Zc znjiOI!fB4gd479DrC zwe13>aS+G6>aIU&GCG_kJ4(-8V$Ebl9Ycf2kOf9XIA6;w#BSYW-M~Z8H&31&2LXFW z`i!pm*UV|-gp9n%OyKI4Zm%8ZlNF#A7)^b?1?IH4@YAf!OaN`(Qn8l!F-E4!gxid?& z@9JaXmhXCCQgF**FWym=r*CP8^8AOsv2y0;sg3&riuCTsO&B!-!HUC8EK)0=jIvsn zG@wg)GXXnUHCNR-*m4niZ1dHF!0Z~F9Vn~nd*)}Zq58F-9|QgL3G~aks{n!oBqq)M#$h~myk(@f7|7$V^iRA8dMRxz--Y&aU)1C0>3?<2 zl6@ZKMEA5n$;Nu~l|+;nIfJ3N1G|mMgD7~GAUryN>df`Lzd@*U6`0|CI;A70A7kT0 zc|&M%NcH^vS~wDgbnbyJjbyPPAl5?Zxz^=F?-fk@zs_VtaZscc@Dc zwO3kwQ|wKq`z4f4o~o-)dHjDbz&LfT;=I-!W%0OafBs!qyotym{l?FIxlKMc?U??- zc#2mV8GVu0UW{4m_2eP)oF8X4+ri`8Ah0{xhF44FbbwJFXOUd054dCaLffl`G+YwW z!vF{+nzKAivfsYM`ryvKei@m8G4;=QiZnhVm){`@*y{8l?P?@@sD{Y8@_3*Y*QO%W93yy^+n2zHOasUbRL8#@Xv1OeF|{2*u275W(@*u} zaGz`io|ZIe_nk{3gnyatOR1c)R91&mW5rOr#50MHw)=sx9#9SHa_mddHH^$(%2Lex6nd+jDBoBy8T5lW-381dh1E z?TT%Oh9Ov{l#-CMu1P+Es)9ExW{X89K0mX+J(O+Rb8}G8d^wk!a@5QPe z#Jo8P;J%#>^LK1=`wpH30F9}7Ap*`Qma5&7eU78cv%LTqgQXa?96m#Z!HMhT?5-4i zgg&-cMg#EJsR5G%CQmEk?1Z@ZFdur--nBsDQSGx8Vd4*89hB<0dcS1~HhAJ@Jvy17 ze5>V_=d;9wnVrmNR4%ILqkEMXMC=fe`St17VW7OML%*{TzZJV7)WeZBV8G|DG7ej| z(i;+5>?BYlTeyJ0=sV~oIIPo0c>0fg613ZdbzRGbP12&qbZWuI9B{3i#Fb^C^%zT} zpcPBHs%1mfs=DH@@L z{hlH#<>g2wJa&=JtUSU@c8{zF=VGsR0uq;`nHRE;EoB%;@r^&voXR1d{zG17E4)jP zZlNMXK0LzGrKz)ibnZlOweJk2G$Dq3A=su>RUF(VOm+@A0vcKXk+*LXq3R`*=?`E z28r3Z1HX0zbYadeF1#{kKDJJz55aoxU6(wFklDwT#h!k~k6^F>6g2{d0P?=M z`6qFvrC<25@9AwH9pHy8^#E74Cu8)eJPeDtrstGqR&*T|XkKma@Jc$MPtJQ8ZY?x8 z;fFyUNp%OUTFqY+T4aq-oe@biR)q@wNyf^vcLOmw{4BhZ5UqOdVK8#Vl4>F(B!P8L z)7APQ>k?(X&xLJSYa}j|jYgpXRiP-8dvvmB?@D*e z`8uSvK?UDdu|O`nXMzJ^KhXOc?VBu_1L--soz7Edvk;UY$n$fP$qq}_U8ETF33Tfg ze2~EZSSa@8=q5+Ogw<;NMgs863faUTqr6%q<8^4s^}hh{x}d9rM$=S3?fD^y|Pn>1dYyG~D8|u3Udqd^`=sCD) zn%v~SY~Goz?vg(Cq!e2p=F84*DDl`ei?ZG^tL{k5UWtgShybj~z?$OoTy$utn_3mk zlnfaNZMb%eJ_stqa~aC@QA$D|Fqi&g{gIIU=_T_>-+CjtL(mdQgdoEAq)KA0 z&;L%t1FCINL9czj>KHvu#Dgb1V=9aSt_H*X-D>8Q20M4JUU!9h@y*LOU8p&xJXW+X zLKZV98xA?B;7WLkO-WD>dJUl<9Me(x$QE-y-IPR8C4XeVC$TOhj%h?H2_g7M={KaV zlJag%gseGlOq$>3N=C+>-B!dI?gUT{y8WKuZy<{)(e+9)<)gbl^t;5hov-Lq=sNrX zD=s^an90pjH2D{@M#nkH&s!fQ;y5OUtU2=vaknCRg~wJcPo*g`hOe+lBY)0U zRuGjJU8|D!DiK?;xPO;>dh0Jl>>Ho41EWora~7FUUR9&J7p#wX)^vAz(Gn8%_7GKu zhVVZ-{HeJC7+Ier$Y#*T8Bc%oNnoKT{V8O%sadmQX37=HKyTSXPRQc~k9|3q0P6@J zc$Odw>mwH$qsH&ZCWbMJ|0_u7?Zz3$8f?u_{EdECiu-ijKP3C513{9GZE#Uy(w~+A zALB<6q#wyJb$TGAN%idf+UmC?h)saNc>c@eQLmYAXW@IU7DL2|#j!%(ZgE6OHC~_f z!wPnSxb};RH(pNt?g&m@HIkqRO>}1&F?-K(A>3PoKs7gEU_rU4CiNH45Fg8+gkuM; z_l=7-X`e3wZq@yW^YWd^>{X5A=#(o2xg7)KJ>~EBjZvC4G7mm0W8qs>_5{Lja4fTp zPPaTMiR|09u*V?`S%}QVQg+@x#BYhOQoDf8E1S+@m7$3kcZZI^NNvLxnCZz*ZVQBA z*Q& zuwE@Hr|EQuO&0Ou6p3|;?5&;CRN{VDVhYwES_Rf@5nGWlc$M|>M3K2Tx<~OR!K4@Qb*|~9Y zoSGopf*xt>qVROoSQ2%^l6!(Q74F|e0_yzP)y+_r$LJqPn?~R?AIbvS>-HiKw%pi1 zT<|#1;jV!Lrns5dp~i3K>$|9^Ak3AwUEPOvrQ*U&YH*{hZy4{t75XWy+ZiiPo>VXD zj~i`vG&9zP;XY8+u@|Xv&qtUVNDN?-oU{!WCQSsY8(AmTDL-pBt0p?ZvqHSxg3(7t z6Fs|+B?4x0ZNWx%fo(P`tA2C z9Xo<<5y4#s0g;@^45UBp!;QRDndjiQd|V%T!bh3m!mpq8^=MB>mKnpDXOWZ*Kf#st z3}fMbOM*kgWI5i;AHuJ=Qr*7>vXyaRXmY)#a)oLfH%r{Cy#M7NjMiQZhM= zRM+l@7t1I9gTkw3?{4}#y&_8;cL)8gHZn22q3j6o2doSYM5({9B!paR$Mh`~Dwdos z^;f90Zp%!Bqo~|Q`aR`VRsSHj`0_tL3Y3wul4C)>%kDh}Ia7XZV-51we+KPNMl=>Y z2iXbx*|VZhIIc4kLuFwxC2i^^TS5 zpA8uH7YbYxOpl1>$18t^bdB1s$(#80CDX9;U9)~trTa2y{c<9c3#W_yx%KH?sZ50c zjRv!ELj%kqPK!SZr z*!z0Z#di+9QRb`(45XMBsG_p}&$WW1h&++26rW+=klKBL4vk(9zr z3kpySFVKR_Y(b_*x1U2p_n~_YUD&*EPwCKNns=q|nuK$G5a6jZKeItiLDx7LqtME;=2$ScENRa>ot=J;jdO%MV_ULChBDumlA+IueTB z*GDX$>QZ*Sy9zi6;T~qMi81c=^VYqe03HyaSpi}qpg|#?XV(H)ueVb`Ul9;n+I-Q) zimJfSFMBYHA-kBkxcGfsQYAM)C(e735v&gp4T3w+-hlt_Y zjQ_vJzB`cW{(WEe-m(cPDzf6(iYQ4&3E6uk9D9$<4pNj&WJQF^UdbLOqa>R+_Dsk2 zz0c=)KHu-}&)@S;>A^YY^?tqX*L`2tbzir-*DFF{$EoTIi_cV+T&dM_t9z*x{sb`Q z7*T4*lVDHG1HI#U3+=Bp1DHfWv#Rz}NI0kJcS(jAJ~a?T+mqYJ+Cp)y_$8nsGAdy>1)N$Sn$21tezr@Zy5cc9yaLAlbc%LFJkmj3>gRHGYs{Wro#CS%Y{q%-yBH|lgxn=67&Ptm>mf~D8ge$fqMR1`!U zMj01#&7&Ke=lZ212<}TU|Bz--Gt4afoMk-v;JZ5aW|)x2VieX)q)>&bFE&WscJgSx zb>=z00l)#Co*HR094zIHCX;kOh$y{seg_t$6szox-*;%5Du4@wTqw+I%UdoV`Y-1F zPV_nbevq+ibjt0>T|qCR%S-)xcT*0?VxM9&r%72kcVK?7g&J&h!(KHF_eMrt#iFT;zRs5gOp=+;_q+JOuE6#qZxZpMoXStP=D>yjJ0!_|w_< zUB~yTHi}@y=l87Y&g(3=8I6N~SzKhkn1OHFKi8MFA0ry0OErOSpt^k4yWpqXOrS5^5Gy(GqTk`TBiGC8T@`4n8x4x;tJNSLUBQ*Wb=0dPe*f|ymQxEcjiqp`2QS_&2%KV zzuH({en)S1&aQp@!nrd-qaL@du8`6uX{J?XAyB2CyjKsk=u;vYV}|^n2e8Ow*xwny z>`3N_s(U|lFXEHALe|6KEcHii68G9^J`?S{xW=CPDJ;5IyY!`3@WxBJ^45(5iL$JO z8XC+@o0_Um$a~%|J#D=6x9|DVE#34+T|ogw1dXfpv=z523TY>Hh!Gi@Lr_9NBv;vqJU3b?eSREn&>Sh29AAA5t#t)v(f7j7&dZ$Fi`@}<8J#8qT+@%2mBFTa_)jNaqP@Ifg_I{xn5>ofku`Jh8dkPjnJPA9Ve zbEWlX>*m}fw@&wrG5=0?jVPW$aTM`OdCvxtge^GFX?6w{udV@Yp)7+XRNrGAu&Eg3 zdZJ)Su$mWEez`8VE;;iM91E6kQ#ajg+C!kT+~vF|sz|pyhEsy~j-?-sx#>mawv&4e zgy<1unw_F1xj|h=BhB%~_u_{sOj_?wT@`zoN6spl&ly(`m|i;Xs<8MbGYi2RD4dBL zK4WMxsv6Wq?jmIOUa!X;12)$HiXm;nFsfBP9LP!$T+F=nLCgF~GIOVe)q_{?nb{2z ze6e>{qezx?D4p1c>YHErR5r?gViG(asP0Omepak|niQS87>u@OVpLn>pcDVpp-sW& z3m3!c&t!tG1v>|ZoBjRyN<3RO8#klz?_04?Nc2+hV&f|#%9|TxYONYY1-CFPrz#dA zp4k@F`U;yOiviaq#@Z3+EITfC=Kjx829!jDdy=3C0SS0}{ zAJO~%Cj0Uj$?r+W@u9OoSE+O7Lz4j*ljmiwmv8Ju8m9Hx=oTH%=+{jM-@Wj%+kZB_ zgv8`x`oI_0`JG+^5=y}e&&?Tk8S8?O{Y8^Y)Mp3ZXY9Uc_(2X+poGBB@K06K@p~P< z@OsD5x$~)=0VWa_qzXX`A+JLy2`SQ;UDBU^cSwT5EMHs6&teWKD#1>h$o)if^1kuV zw5s7Nm!}S2ZIAFRtM`0sE}SJMuQGaRrra_ZKHpAsb!T^FB#BpO$&lFyM~rH<89Hnn~PElHGDh}{Ku z0m(o~Gp|^ovZeL)(i@{Q$dQo|Y4I=h^Xd8GTby1xpSxrEQdxRXFYB<|C%Kjz`5q{e zf%|dK%AZc3aU2Jf*rZD(aB(-IN6a@)Da2jM79IOSva8&Pv|px8Jl`4LHu?%HI;Q59 z%Ih32(_$u{Wbs#dpH?rdq>A^Hw)z!`@W%$^y(PL^Fa)9d(+|crf z0a2@p=ofRF1}71hNGGDDXLJ0EmE`{(yD55}W+4r{ruc&DW^yw~MsCjN&#mev_hvp> zdPs5CC8Iyvm9t;6-=?y%1<&@vcv%;=S7Bwvi=jaYL`;%9&0pGkHVPA@_FkB-<=i!) zF19s8Yz}VoCSA?UrK->V;ih)*emq@7>Bovk;F59iOedx4Yl?I4KWZ(PuurC=AD>JL z)E8Fb)gsCz#(Tn%3R#%g(eQ*oy?nmC@skv0eiWJ7t)Hlpx_I*ie4kPRf&{zsQ+d-P z)NjPkD;~^t9*?C6We_*1xnn=?=u2u{;naKbLy}skZq>&91a<9T!m1nDFHxj3o3w%K z%YUD2`q*GrtZwE)SXEWkzOnEKGkLXZW(l4pU#qI!C~beh9l3m!Ljz>?W8e3)l^~QH zp-ObC%2Qc_`z^kWZ5|VS{a*fCCl<`&#p{IZullX%@AKf_`JI~OGyeD+&>gF0E=@+o z_OhAm=2(%xaeVS9ECyfJ@?o1V#SF;maJK3^|)_UZhK)$^Ge8M zu<1Q>PvRV1^~II}`gESN^yF00i-;Q} z-&>6^qfW1aHloBwnFgzW)JATDUB;zxtqMt}#nQA*k4)XMO>bzfUOo3_X^ryRmbV62 zyzE#7XmH5dN*P_=;tRXmhOE24w=Fw;5Q?nb{6?suJGOz9X0X+-I)W?g^sWS@OiqSQ zg+qEPJ~>1btaON5N4@!E?Wp1CN^|V8KX>6ty7-Om2*Y(xC(AuckJV!*JXZNa#q}<; z+lyj|9i989( zk$vi7+<=j|<*KFpcLsi1Qo=7jdpFJ*w(&k;!q4eha5VIdv$&yl)IATlcT>NV$k!`)3N{?0CPB&!+o?^tU9&(W76n-r65<$N_R_|n1((XP(0F?6$_Dn3>4B_RU&+l^p9A9h16W1X+(Wj)+oN;wi5P67 zuaS8ax?LqF#1C=dYQ&FvB^zU-z(wcQ^9jby$F$s)(nHdSE(ozM3n*w`(^;~ja~iK! zis|cLa>xl{S$8U2Uw7b(E)-_}oHkhf>|L&h^+oHP6_$>567#^z5wDZfs!b@#b!np{ z=e%1&i1Ht$Z1is-(BHp5;O|2d_aV31!6mDr7_JYXC&wphSARcllxQbvz!Q;JRXJHS zxEu23Lz+eg#j($%o@0w>bGfJo zHKbSa0wPud<7H1#`QrYsKqCNN0^L;fJ~R`q`wI&TCftef1La-}(j@qxe%rV>JB@YDsJNmYxeLh3d5OkzdSn3ndyyy|n~+bDYC^n-?vNCL8=- zpZ58)NfPvphKfl(orrA1OrAk2u_DHSH_vbUd0l?BPW|u+N|E_OeqzP_ zZ1l5=E=!pmt5==X(!8jhrE_797Ebzg%`bnEUUnZ^12lm{)mRd-LH>9BORV!R z-PX2c`}~FYl@(PwGA+{%Jmk1=tbt^&0a9*if1<-=N>^rIFwY$<;0{+4uL+vaRI5_D zN#R{_bmUm_;_<18lgmS*571oK`^YVq8s&PKE2u!z*Ry0uos3q=N>MsT+u!=IU*W^v zBXv|?OGH_0SK`SxSt&I(hv!mOLzj)T?tJWvH3m?9-E5_^N=h_qXp~gaLQ)mwj55Yv z6!{bx#hXGQY5zovIq*?NnAlvHZ%OJUnLL?dm#$yUkTn*kb_Og{*}K!#N4j6XvzYm}s!8#WHbdE8PV!4J8Jon#3` zXL%HktiUFm7>ZNNq-5ffq|UJv5TChE`=AZ4ZSUrVSgJqej1p;t?Fhv=HdxX)ql%ie zxDeOJ1W{CVph0e!*Ks9$$DsWXWxAra;}@eIJy@fZN;OX00l;KdiY;0K=7{R~>^-%k)~B)aLW71S8n--RAhfZ)#wFG0a;YXR!f0cEe;Pqj4R11xt~ z*7S~B^xJODcmup-u}QmosZP4C-31c^UF*`BlF_nz~8@E0_@o6wYPtEMl-WLfPw@$Y81Y`*(6eHUG5lfPX z&+;Zm9V7Rk_DT{kR7p$JzKwJ#uq6u8NO7eenpq8?H|QIEV4w`JrhUG zX*DXw{e3-hP(Fg$@@yc`ytq*~5(&$CBwdmHD$7Is`VR$sIw+aTX1<9|e0+ZG-TmGi zn{cO848@r@U}WW}kZ%5=z6#T^<=xwjTyK0#A_Uhw@6INZS?pXSVp&hxEfLkk*}@&) zfsLcdzK|4aQcqVM@=H3yHV}QShUKG*kK##F24zsy@0rZQ(lkeT3C|P7k#4j)m#pGN zH`9}&@h$E_l<=o2H0K77$E$7I`3>#^POR;Gf!2-N`x!j5n&%tePWdRLenx7(JRYy~ zTg(ttoI4bf>rpfDZN4CR_R~Enh!?1c#qiYnTv_I01 zB0CCuW#}Jwbe_-!S2p|mt&hViKze{5((FaT{KBFHIznRxPNZkz+P+!Cs2xeqH#Fv( zv(x&bJsu)MOMmVO+Pf;q(rIyKt?ZeNo0^#D*@fh9YTXNtdCv4TQ_QFcJ#DzOeVp#6 zVuTmjuK7cmXk&io_ELNa-{4^5#s+J?(krnkv`-+M8rpv4bF_P4DV^U>r7yOBgx(+D9wKMLg0dcOVT%`@#gFA9kelvlBg*&uc1?y*G zC-m;CSE(gZnL4lN^^#UNG+`P7581I=IswWEo``~5k9Ws703-L zwSV)PCsrvO;$I^8WkG61@cgNV=TiVo5~-IXTY02PWJm5zbCl@48uVj(ILa_1h-rQC z;m_^s27U76ItR*2 zt3hVv_e6M_IAOrKP30NrDXXbN{NYyHZhE@o;^p<4eXoXZ+pR_eUKCa!hAwgj<;#+# zM$CBew{$;EgEpekkt|br#Z~RGtm3fsx0+-}=c=*MtJBkR^32w{5?W{D z6eSeawJk*>uFe<*KHf~Hj#Qqfad7?Lm3|XU7o+VBuSgu$l9jXOPuYFJBu=ao${{B<;S5kQSKUGZZ}-w<~u_ z@BHM8I`%_ZN!>w4I>=D(AjwnFtZVLOS!hhrg!98v3MN7FH^zJ+8pTX6s!iD>+=K)~ z_iMnS{^O|ArDKC}?-x-r4VD_uZlo+hSG28}$lHC5CH;dvYvbU`8_q|aM`k9XL4^i0 zDch7sC_z<>zfoGeu}<-xaS_XW|8Iq>*M#yc9m$NvWVJSrs1bExmZ>`LtXvuitDSWT zdVIJ^2~Upv=DpH`6fb_DO^LiGvS&S%HR1evzja25Fwn}Z+Q`VrDo&1=D&vVF@yc%P zpaIM60rjW9PbY7q)YZx!mjDMB^QQYtjH^Ry%+1fxu#&SS@o)?t5{%_d6|UWp4X?Y^ zpo6%Ju~i!pB^JEjUg)k2C7WNFD3>Y>NYnsPj&7lU1NSzE{n?Ic_}ubW}Dsw@JH@*reY& zFf^+dZ$ucf43(^*u4UQAX}=zHt{MWiJ@b)!D|klN3}n{HBKs?RE>N%AR2ErzjsJPR zkI^{0lWKdXEFNQ(dBn+44VRN#qi0}pmSCRI$CH|(5H7#TYo%RnQz1&z=+@Cq=-w#$ zSTYxH{kqj>@79Mx%X;wYP{;h5P9lbdOCDa?b^2iL9au8gEW4oDmj8p6%IiGS&0P4k zkUA#CE`w#F#@Ld(%zm8}p4MMz^%_-jkDPC_&<4Dg!NrMGU|Qp+_mfYC-~ju(9RBxy z?KrY!m;t30IJtqXbgdnATDQLJWM=sl`TpMfClZawjF7{to2+p?h}mzOC6KQ-Za~6Y zCZ2bgunN5o?A-%fGI`hlc`)$+pA8?BXtgWL-l}hdCY0!k_q@E@MgGcf1q{FWX;h=S zV6d;@&kc2t4=Q6GNHb~2o#z9ws~8E2QJL+`V2on=?4qLbUU?eOaPULV`eM9grxTDJMvhYD^U~Ft`&3{go7j_JLPJLbH z>sc2dAM1ZwsL+7lolJ%pk!`vDTlmPJ?1$lKuwwI#Wb3J5a4BXSF0cZL12JMw?_})K zZRl75Y9|KS0%SQfk^OR#tXZsvZ$DL>Pw&I*NN`XiC6k;bPE_rTiudVw{ z`i+ATEbUx)+gS{uW$cFGQXzN_1L_XglH@H{mpy7ax1FUd%kiD#!A+RzAx+-r3RAf~ zgR4t1cyn|P^q3UQf}{&BEPn9efoTDW>}6Gfx&EDIyNEBtYo0I$sMno`y#tSrlY}PH z98zu%=E&aIbr(0NG~hwipo!7ubrTDApV?>RZ3F8(a|i6+0@G@*-h0pYiW1GN&s_4a z(euluWh2NRU+Heh&h?l2pfbh1M7}^95-_8;0hdkk=`i{;mA-NZK~0EvMWRS2}{G3ueDOVU+(+)X%2B6^nfV(Y>;azVxk8z8$3OX1j=tUUP6sb6P)ya3 zrc*`Ux@JjO_9O9vtV|& z+J`#P2kcz8j??UfsGi+gg~s`E}kBV zCX{RghDNFdP2A`AcRR z$`@OBf^Q5%)OA7hMhLpoqJm1fEvd-Kv0yTQWb}tsgO~&Y1#rBVI(9+4eOP9a2dy?u z8+OvFSBE)rmW*CMa~1V~}k$LaR-;2%2B>IPZt(D)@g3jyr7Bj`vi z?+4G{5vA!?S4~Fz)PgV<&{q*RGgsze;K2oV4b?TuHrU3F%%ph98}eCbv zPmcIRotxJ&u(C5Q`q6(5$NgWgD&N-T*sPT9N#`kT8(XUl&w4bNU}i1WAH$Z#y|Q?rV9|GnQRx|W+7 zbz6c-IwEfRl%k}4%pGPxKG}<*h^*`042+^Nc1QH#$X$2{2Y<(Bc>=kTW)Tl>p( z_l>)pH}jRD!x~PKGP?P|1Ht7y{19%={;14KNA6>1N>iw2=y)%GOArZ`OuKt?zq9|$ zz}VGK!H+aOYmD@Uk(md_9dR)5L>*#2dy?sm&>__#PX3$;(`_~dVk57rG2FS7HNm96 zr16MZdp@n?|E^H+)5SlJ&+TYkV!ghCG|pPlgZ!Ch!TT#M6m1(!-yB@n3gvGt#oJxb zex<{@cxSWrJ>f89?NG?;!r2(uDF{3jL=D05h9iQ*zPPxtdVAy8d!ok*{a<3*bZ4B^P!3xE%RQr}@fobVZ(Nqw5YZYilgeUZ(AZYViFi2>&+FeLJ6(S&;Z86hYBHJ!H z;C>zuBBLT1bwZMb@BHCb7DMWXnfqmW#Sklz+K3I^b2v3JoQ6hOv)@V&D+ZQN`9{>y zXN%7U2!HDuA^HYUT#CeR8JqRR1%d;Upm9Gok8!RfLS?NLDJvJWOLd=m+@iem^yL0A z2{6@g$0n8jMxhJvcCrq$Uy~UK2U6#uY7^Hy58K3$|NGf;KA5AFKa8!pePy5fr9^8yY<}SyrtbQv$`rJ=3^p%E=t8>`lJEh_Ap|b-~-~~ zO9n~Z*f#0?{hGty(tG;+{u%j}uBNvZwq^TG2Ro`SDmp42MmE~AK2YfJ-a^LBtQ7d9 z#m^yMHwYAJOWP*aDL&1(pvc@lJI>-}gl(PPYvi6A-;u)xaS+HdS}|wl9&-J6hdtp! zP<;~+Q3Y!Z$xx`>`w_IFd7`Xh$?nDTQ^RUd9=(OD7;O0J>)mO(a_%sku6S= zp{ro1jBn4s$)wEIm$ZEpzQ=i7^(iy|c}kV)MaV;KNg$PK`!J^~Uc1{Y)3?l6koVHDAbW>)Qm6A+--dLe15D5fCY^OQQ-IO) z{*=T=P(@|&ST48QgNAe))yZfC>1mcY@p@+8hIbs|T_CaZ9+c=}eVy`*$uA+}Q6yNr z4mx~XGyfOHCTK=AIDU4(=tZNLp=lr(jluOhK~oTd2LMsy72WUF5L&ot2Fzt>N$d5Y z#95UvYZiXp*IouUt-As5lFEiTq^*B1~eM8 z1D|dX0>H?<#uu__ z;0?Ni6rxzQFM-Lkud`+#|A@P&Nk7r=I@>AfvSHK%^)^=}7(h#N8x(=;D2r(hgv7eV z-_=2xuH%2o?_db`6*jt44)zrDGf0a0KC^_e1mu6)l$E7`D#=48BR%QdFUoMDR1I~( zAmKbk-d&bFD*}$)HUZDXtW!%Ti`DHazI~2ofeb9qL1kl$uhlrS^JB4tc74|ulDq;C zxj+I9+eCUhUKt6kNbxh}Uqz)eG^JZ-UFX?E|3U!)jL?26RLeKZyI9HE+0?$Ox)@OQ zH?8@b3rMlW!oe2jFD{Xq-oJi*R_0ZYHS{9)s!Fu=TfIytYvGwal%rVagf;?8^Nwa> zxj6iGS+`~*OE`POcF=7PQ)e$xQ^aY24?phq=7*JsQ$pVN?ycFDJV)=A_tDMpGXVdA zybwy2yHHN*@qXUy60H^$)~z-5*ErAC(LC_;*|TTq2Fw)6+U##MhKY?-Fhtx3kn-biy*F%O#%xOg8(e^B@THuPq&!~gBp5SI< z`jOQPvZhAb%W#yu%YSZQvBN=5KP`uK3Pe~aD|j?MvdmHBHaazfgRR@nRm6JXHG?hE zj%nEI$fIa0n#fk1uhu6Tqi2Fr-%24i_xmehS_;2ve=*Pg;3>yd0J3xF{ydTE@4$gT zCh#4?{_CD~qf0Fx;A}IIzj#(A+Ao!M*OSmGYR(Cs-0EAUG1mAF`vw!+j+T$Y3eOm( zOZwpHkF58PWdmO&gEw+cMAILBw=MY?w7B5f!QEXCPowOs zKz$lfu6=PLj}fiqG+yu(u@F6Q;&6Ks$18poA!BvMNTPou>I0Ix@mYDixOHEU7#qj4 zTk;ZFCS_h_e_PRK)cWR@orp(T_VD65kT>;S`$-sg-|V(}E0XEsY(-||B?|RO2sW_k z9?VsT=#`$)5>+rHHnoe~)~_iI-XZaw4kGThZ%dMA88I@d~#z5^Xcd}>2!FG(6e zp8D|C2f%#)!!ytj4cmy^cw8u>?#wq#_b`z9F(EN+_fcsRfoXYP{l(S!xS_Bf#P zppeW4CR1|ZP0Dj2mmk4dJ5ueJPN$qC_m8xq;EGUCjO{8^PS&^}jc+0;TMYc{CqwHw z2E!iMH!OMcQ)zwq^zv6XLM&k{jMIH;=(-qna@%rM7nB;jvlQR%t+)P$8s9_k{F4mx zkWwpUX5SI8hM~`cn=}4(S=b4q6~l9}Jail2dzGVCPA7@$Pk%ng_&!E~hl@LK_0ZC2 zxhN_b+v{L>G>PQRQ!F$@L<}pRBa%()+iu8}v&JM)KIJ#_Y5(K&!Hp^9qV1Pe-~zKl z;i8bpLRTK>81w>o3|dWGLVypvFMU_I!|V-R=IvPl@crc2=f9LO$jx{bWk`9KBPsFS zi}Y{T_k<-FMkK#Aqh<{`h)d&t1t;owdOA_kQ(Y}m8Hbr(T^)0vKrGeCo$34oKpA+Y zxUC(Pt`eE&U0jyiyV5bf<_YPQ)&4K&rnCRnVf$Q*U-qf)ti}x>E8D&sJu3d*jq%Wx zvy&dbc%#ICA9w7TvbN9Zb1wto<+I(M>aB1&I~o z^AN*?t8aRcg}FeR8tXljH>F3+CsE<0%O4EiuQOHFF0#&@ZH?zO7USUv0+@@}45f;) zArE=~^ml)&d&TD%TFg_i`+voPxtolHb%CsKXBHEJ+167u2At`^O-J)raRPr^8n}BT z6VKdi6;}B?T*4Fz&`G|yD@QwfF7q;#)F-!9! zgQxn>aSQ`M6*8>2vvs5+bpGrcERR{%pj++fFFH$<0j1f_K|-id?)Or`W<>kX+-&An zrn&E&aUi{1|E=MAIWG8+Ks5Cs7akr>?QNCo_sx#mc`XX6K1$_ppCJQnxFvHOm{Q-$L7sF869+x{?JJ}rD#Ta~dd3W81oO=v_HnTO0XwLLy-(- zrBnRWcQ+ShJkL7@KMPu})x~rCcM?GY@nG@VtF5oJaFI$|touGoJXuVP6`u)p=KU*- zkZg!@tWus+{FbXFU(wBwLSQOR=i$H!XE9%Ai&fweOKV>FTIdGc&wxyLN<`Q0loVCs z`jw#71kzkZaJ~|o=wOuYpPOX;V~^m9$F%~-D^ATc!YS#e1V|6m8rxW-$XUt(P=FcG zqPel(HjiI&ez`s^?HX4h4QLGM(;c`|14)yoCRTPYwKJ>ow%6J7=#hld#GP4?!AIHV z{PxehrGP15`PDYOFv;M0fsMK#!@@RaaM&8*5IYwt>Lh5;7`bKm!>}5!w*EBnBzw-x zj@|=f!kJX19jC3X+TNu0`BiyHMA%&L4$&u)$XvZ*7{v0ZYu%;6-8DZu9kZHAmQJzE zLOl(AUsgiZUJhrg6*)wTg=%bar#5WKSq#|7zjm2rtaSE$O6Bs<{(CAx_ zI3uI{>{0Zb1)HytxvezlbYcgAgSUT77QV-6mW|wDW@fHQW=XoJwl7*Dw4r`Xp#3Dq zqwlb4NH>ltk%|1d>)YykwimPiO#3T|S8Uz!e9FbHGXH*1<&3v_(D3y=F5^S9{gLV4 zIJUVeT0eszq`Akq`J_xW*!K*|b|_rrIfSnty%)(T-bWW=Z7Ol}!l<|Lm9sUZsZDRV z&3hqvHM;M#e@Bb~(yBq@pLEkWi>n%KR%%k}E<1^LDy22h-($RlKqWj5%W}=Os3egKH^RB8O!(SJk0GOOIpD26GU$eIbVd_b}GxAX)n?h8y^tcXWiwALpkW}q=ln)RHd zLAH>G+=h%iO;#U>H2}#j4T5E(1n^vX2aiNDq}5GID=joF#JM(89Vd zgxV>-cn3KO8uq6b!5t`R!EQ>5`L;SpAb%pcE}LSf8G z5!3v{*?AkC{Se9&oH$GG>qn6hNf-Z8c@Es(+LNS9!HFs?MBxg5tOQguG+NU4wI>&B z;J5n}RiUR4v@FL0^WOxh*q*PDiMU0#=aztd-OWA(A=EzX`-jITP7C-2p==cC^yI}| zpTQ%+Ux7Ki&U<{6#O_Ysi};xw%b1D;w>(T3C-d}{Q-c6H<#ViC7@ zjF0F1!E98T^V1oe?jy35!?=nexN@!?dBk-oo-+jC2!53s=31$-l;)ZWzL1X>u`S#c zSFDs*znzPA{B-`U!TTR7r&MBW{#hFBI1>O5W~e+z0)Lj{?)87G%`OoDG6I{>vFJss z^ufbLY4TevAODE!1Ab6_;XpIeRE*YTe?p7O_c;~PmeJ)x_SQGMRp8z)i;m7@KU7xV zI3xvbt~SAxpB~4|DTaW%jU#up>A{uclghEROAVLy8lJszWrs%Hc(j}n9U?Za!RMtu$6psHjHP1 zohgNC1A7g?EJj)iT=B*1;Rm7s>!c5CdFxVAb!&DZtj75aSlL?ljU-xk^m(x{4D@&V zVTq}McwO8v%q1+n0>>1 z^Tx63!};xBzz>5?wx$#>_XPCA06=iENfnMcNsgwtgh*(gK&j42$Cx2-!E5IuEEw*( zQpJt&6_2lU?@V_Ntb9RJs)ejfkLNKkLE8NWO6x%_;1uQC62HWziA~GW@S8!eR{LvXat>yAW;`tnFsw#1}=6BrA`v-K-Bvh4o2YKT~ z05lfbAD6lYlPgDBQhIVcgEP&48|O7o96J%fcLG+j$mZLK;$hs?n^+dtZ$KLKB}hj#5{ zhFvxz?vZwB=&M#2obT-egKwyWW>F9ZMAE-FW%6`P?@yD~nv!JU_R;_@NB#F4J1Md9 zUTQEY8v<=T{HWm>4vL)b5U(MeI+4EKr2>!{hPn8u3Sn-%V=7gQK-33SFk4A#>3^Zk zXI5#NLPscGQXM9O?y*(8Z;AcOYKTk2X3tqaxG{wPHlj(PLphVb0+dr$~Fh-W83CR&MQ{J*zj(5&wzWzAMyGxNyad&m;6;EXT*HAVnaYs5dIZ{E)! zRdjpD(&(wQ#~F8~BhnY=*8yM`D01E8d^M+U>Ay${vK)Ttcb`?9Ly9{MMK#JEPc~2Mb96YqVJz~vdZ^NMednm;zS*VI$8+^^o}=cYO~^>wz=xjg z#LlS?O-P!M=ci8pZtWkAW7pnhgsq77XAF%z;97Zu#-$Mu$i#5qBBZ*w1BsIv{`=Q| zV(owa_212p`-Xqh;(z}7k0A2jpZ-s!|KFd+0hZJAp>f@ii{Tg#6PhDg2;9c2*u(K7 z7cd-{ZWYzTKiMzK*6k0wA;lT-=;f4avKYSR8WkkNn}i96s` zu!|aOBL4eM_f~%b#YJKcY5@ScfZ!jcB;cpr^IhEam1aP2Q176-SpEf$l%}7}Lcmp> zI~MaqaOglC-2|A*^;jU%c(X6hAnN_F!VSK=mp+ZHv7{?a6Y+gwei5k6yhI&< z+TftTj`}#^Z0Uj@QicM=T1R~eV9!Jy-`(X0kPv}ZE8LQswBGDrOdlr~cyjvp$x_qF zN)t|u236XKEDUeyt)eExH|?ka4#gfYfsPYU?!iTOv;m}pFDZCM%ekBZoEqGOR3NeNOg{wn z7Qm$XtbfD7KM!}>PmNIn^4otO7p{{3f1licx4{3$Zt$PlJB^u`>mFafyom?@-M*=* KQhLKI^nU;pjXntg diff --git a/flexiblepower.api/src/javax/measure/unit/doc-files/unit.png b/flexiblepower.api/src/javax/measure/unit/doc-files/unit.png deleted file mode 100755 index 072dd8ee567474369edc42cea90d6c23487d87d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215249 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�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 + + + + + + \ No newline at end of file diff --git a/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/index.html b/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/index.html index 443452d..4cccb3c 100755 --- a/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/index.html +++ b/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/index.html @@ -1,3 +1,69 @@ + +

diff --git a/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/menu.png b/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/menu.png new file mode 100755 index 0000000000000000000000000000000000000000..9195b5eb80683e057a202e0748e4507f23999bea GIT binary patch literal 1795 zcmV+e2mJVnP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000JZNklvPIB5Hz9?rjR;z7BdlPt#TE+|DOXk@phY?(BBW7cA;d?KGRPLeO1CjK%iS1>qnt0#fe?J)5%3d8(qK$`LD>rA zZd~a~kmj1z856#mjW0g}AAEqVBBZ;hYz1;RX$c=2NUmysMK_@1^1jz4z z1zh*L7Knk(5t*%SQtDU3^PZLx~;kdTM&ZW2?1MJxI<39q_7EaG7O5xp(|`` zY+Qxoe}H=dJiooTxcIi$XK;8Xm$%T{8hYw2g-wB@vm6%?%nh`HLLiO@p&)R55xUu| zEs)A87cqSyg>8Vtf7&4GK#+eaIXD`!$$O-*DG26)2&6Hvvomy)_efzA;P`DHNDEF7 z{NS@ng%rlZ!A=Ad;D*II;EIjQ)31O^H^KOERoNc{DU1cqmouzq$;pj3UbRnWc^%|*;ncCprw#B;&MFNDA#Fi9 z7C8L3FwDSIz#a~aIbB--2q4>Y0NX}xH$|l!*B_ZQr6An`b+dq)0wZeT!$S!ltl}Nu zb#DdR9Sh(KlctK~h%XDMDd@953!@z2xhbiFwqyqv0rcBXgYAc+061z3qvSeJK?e%` zpLqLi;Q*)Xdr(l_x&VQZf4yNYhTz2axPBbiz_ zL5;kp?2dsHwgJuV8x>qEsGSd#-Jy}fwxn-{e|&Hj)Ha_N(x3qD;@Kb@pH)a<6X5s) z`c>folJ9i{#_=Hm!QBYYI0!+e))Fj;QNKTs!dN)a!0E6nyz9>ks^DORV9WLhZlaK0 zR(gFSg|Q$29$f{evt8jPK(Fj9;6Cjuoj#GmSWt^R7uZf6ZtW~|s}4XvS2}$mg-u~W zw5fdyy99zQD}?Q?_REmMI_L}?R?oVEV83(0C!mEKvY?et7o@NbHg~`y>T5$31Xh}y z!4)=Kkl$U<>+Z1>R^dkePJO=$zA9l`b_vKo4ry@D(+3n@o zj!_j-SO%Qna&l^)%OU?m8zk;u!!KJ1c@%J0I(r`Ds}vGWYmotWR+5bcT;DXtYrn!C z0_2+wzIao-f!`3kC7WKu=h}6J6uN;<@uAWil603R1%4TE< zc4apft^lgG-?I;;L9_o05GZkR5)70w

' + pkgName + '

' + epName + '

' + epId + '

'); - for(key in style) { - node.style[key] = style[key]; +// node.hover(function() { +// for(ix in endpoint.properties) { +// var prop = endpoint.properties[ix]; +// node.appendChild(_createTextNode(prop, true)); +// } +// }); + if(endpoint.properties) { + for(ix in endpoint.properties) { + prop = endpoint.properties[ix]; + $('

' + prop + "

").appendTo(node); + } + } + + for(key in endpoint.style) { + node.css(key, endpoint.style[key]); } // Add the node to the document - document.getElementById("main").appendChild(node); + node.appendTo($("#main")); // Make it draggable instance.draggable(node); // Now create the ports - for(portId in ports) { - var ep = instance.addEndpoint(endpointId, { + for(ix in endpoint.ports) { + port = endpoint.ports[ix]; + var ep = instance.addEndpoint(endpoint.id, { endpoint: "Dot", isSource: true, isTarget: true, connector: [ "Bezier", { curviness: 50, gap: 10 }], // [ "Flowchart", { stub: 20, gap: 10, cornerRadius: 5} ], paintStyle: { - strokeStyle: "#216477", - fillStyle: "#216477", - radius: 10, - lineWidth: 3, - }, - hoverPaintStyle: { - fillStyle: "#216477", + strokeStyle: "rgb(122,193,3)", + fillStyle: "rgb(122,193,3)", + radius: 15, lineWidth: 3, }, connectorStyle: { - strokeStyle: "#216477", + strokeStyle: "rgb(122,193,3)", + lineWidth: 3, }, anchor: ["Continuous", { faces:[ "bottom", "top" ] } ], - uuid: endpointId + ":" + portId, - label: portId, - parameters: { potentialTargets: ports[portId] }, + uuid: endpoint.id + ":" + port.id, + label: port.id, + parameters: { potentialTargets: port.potentialConnections }, }); } } - instance.batch(function() { - _addEndpoint("net.powermatcher.fpai.controller.PowerMatcherController.auctioneer", { - timeshifter: ["org.flexblepower.manager.dishwasher.DishwasherManager.1:controller"], - buffer: [], - unconstrained: [], - uncontrolled: [] - }, { - left: "50px", - top: "30px", - width: "320px", - }); - _addEndpoint("org.flexblepower.manager.dishwasher.DishwasherManager.1", { - controller: ["net.powermatcher.fpai.controller.PowerMatcherController.auctioneer:timeshifter"], - driver: ["org.flexiblepower.driver.dishwasher.DishwasherDriver.1:manager"] - }, { - left: "50px", - top: "230px", - }); - _addEndpoint("org.flexiblepower.driver.dishwasher.DishwasherDriver.1", { - manager: ["org.flexblepower.manager.dishwasher.DishwasherManager.1:driver"] - }, { - left: "50px", - top: "430px", - }); - - instance.bind("beforeDrag", function(params) { + $.ajax("currentState", { + success: function(data) { instance.batch(function() { - instance.selectEndpoints().setEnabled(false); - instance.selectEndpoints().setType("disabled"); + for(ix in data.endpoints) { + _addEndpoint(data.endpoints[ix]); + } - params.endpoint.clearTypes(); + instance.bind("beforeDrag", function(params) { + instance.batch(function() { + instance.selectEndpoints().setEnabled(false); + instance.selectEndpoints().setType("disabled"); + + params.endpoint.clearTypes(); + + var targets = params.endpoint.potentialTargets; + for(ix in targets) { + var target = instance.getEndpoint(targets[ix]); + target.setEnabled(true); + target.clearTypes(); + } + }); + }); - var targets = params.endpoint.getParameter("potentialTargets"); - for(ix in targets) { - var target = instance.getEndpoint(targets[ix]); - target.setEnabled(true); - target.clearTypes(); - } + instance.bind("connectionDragStop", function(params) { + instance.selectEndpoints().setEnabled(true); + instance.selectEndpoints().each(function(ep) {ep.clearTypes();}); + }); }); - }); - - instance.bind("connectionDragStop", function(params) { - instance.selectEndpoints().setEnabled(true); - instance.selectEndpoints().each(function(ep) {ep.clearTypes();}); - }); + } }); }); \ No newline at end of file diff --git a/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/style.css b/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/style.css deleted file mode 100755 index f43f3e2..0000000 --- a/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/style.css +++ /dev/null @@ -1,70 +0,0 @@ -#main { - width: 100%; - height: 100%; - user-select: none; - -moz-user-select: none; - -khtml-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; -} - -.node { - border: 1px solid #346789; - box-shadow: 2px 2px 19px #aaa; - -o-box-shadow: 2px 2px 19px #aaa; - -webkit-box-shadow: 2px 2px 19px #aaa; - -moz-box-shadow: 2px 2px 19px #aaa; - -moz-border-radius: 0.5em; - border-radius: 0.5em; - opacity: 0.8; - filter: alpha(opacity=80); - width: 160px; - height: 60px; - line-height: 1.1em; - cursor: pointer; - text-align: center; - z-index: 20; - position: absolute; - background-color: #eeeeef; - color: black; - font-family: helvetica; - padding: 1.5em 0.5em; - font-size: 0.9em; - -webkit-transition: -webkit-box-shadow 0.15s ease-in; - -moz-transition: -moz-box-shadow 0.15s ease-in; - -o-transition: -o-box-shadow 0.15s ease-in; - transition: box-shadow 0.15s ease-in; - overflow: auto; -} - -.node p { - width: 100%; - overflow: hidden; - padding: 0; - margin: 0; -} - -.node p.small { - font-size: 70%; -} - -#main ._jsPlumb_connector { - z-index: 4; -} - -#main ._jsPlumb_endpoint { - z-index: 22; - cursor: pointer; - opacity: 0.5; -} - -#main ._jsPlumb_overlay { - z-index: 21; -} - -.connectionLabel { - z-index: 23; - background: white; - padding: .5em; - border: 1px solid #346789; -} \ No newline at end of file diff --git a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerPage.java b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerPage.java index ed71100..d155c77 100755 --- a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerPage.java +++ b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerPage.java @@ -1,21 +1,260 @@ package org.flexiblepower.runtime.ui.connectionspage; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; -import java.util.TreeMap; +import java.util.TreeSet; +import org.flexiblepower.messaging.Cardinality; import org.flexiblepower.messaging.ConnectionManager; import org.flexiblepower.messaging.ConnectionManager.EndpointPort; import org.flexiblepower.messaging.ConnectionManager.ManagedEndpoint; +import org.flexiblepower.messaging.ConnectionManager.PotentialConnection; +import org.flexiblepower.messaging.Endpoint; import org.flexiblepower.ui.Widget; +import org.osgi.framework.BundleContext; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; +import aQute.bnd.annotation.component.Activate; import aQute.bnd.annotation.component.Component; import aQute.bnd.annotation.component.Reference; @Component(properties = { "widget.type=full", "widget.name=connection-manager" }) public class ConnectionManagerPage implements Widget { + public static final int SMALL_WIDTH = 160, BIG_WIDTH = 320; + public static final int HEIGHT = 80; + public static final int MARGIN_HOR = 80, MARGIN_VER = 120; + + public static final Set BANNED_KEYS = Collections.unmodifiableSet(new HashSet(Arrays.asList("component.id", + "component.name", + "objectClass", + "service.factoryPid", + "service.pid", + "service.id"))); + + public static class PortState implements Comparable { + private final String id; + private final Set potentialConnections; + private final boolean isMultiple; + + public PortState(EndpointPort port) { + id = port.getName(); + potentialConnections = new TreeSet(); + for (PotentialConnection conn : port.getPotentialConnections().values()) { + potentialConnections.add(conn.getOtherEnd(port).toString()); + } + isMultiple = port.getCardinality() == Cardinality.MULTIPLE; + } + + @Override + public int compareTo(PortState o) { + return id.compareTo(o.id); + } + + public String getId() { + return id; + } + + public Set getPotentialConnections() { + return potentialConnections; + } + + public boolean isMultiple() { + return isMultiple; + } + } + + public static class EndpointState implements Comparable { + private final String id; + private final Set ports; + private final Set properties; + private final Map style; + + public EndpointState(BundleContext context, ManagedEndpoint endpoint) { + id = endpoint.getPid(); + ports = new TreeSet(); + for (EndpointPort port : endpoint.getPorts().values()) { + ports.add(new PortState(port)); + } + properties = new TreeSet(); + + try { + Collection> references = context.getServiceReferences(org.flexiblepower.messaging.Endpoint.class, + "(service.pid=" + id + + ")"); + if (references != null && references.size() > 0) { + ServiceReference serviceReference = references.iterator().next(); + for (String key : serviceReference.getPropertyKeys()) { + if (!BANNED_KEYS.contains(key)) { + properties.add(key + " = " + serviceReference.getProperty(key)); + } + } + } + } catch (InvalidSyntaxException e) { + } + + style = new HashMap(); + style.put("width", getWidth() + "px"); + style.put("height", HEIGHT + "px"); + } + + int getWidth() { + return ports.size() > 2 ? BIG_WIDTH : SMALL_WIDTH; + } + + public String getId() { + return id; + } + + public Set getPorts() { + return ports; + } + + public Set getProperties() { + return properties; + } + + public Map getStyle() { + return style; + } + + @Override + public int compareTo(EndpointState o) { + return id.compareTo(o.id); + } + + void setStyle(String key, String value) { + style.put(key, value); + } + } + + public static class State { + private final Set endpoints; + private final List activeConnections; + + public State(ConnectionManager connectionManager, BundleContext context) { + endpoints = new TreeSet(); + for (ManagedEndpoint ep : connectionManager.getEndpoints().values()) { + endpoints.add(new EndpointState(context, ep)); + } + + activeConnections = new ArrayList(); + } + + private Set nextLayer(Set lastLayer, Set toLayout) { + Set nextLayer = new TreeSet(); + + for (EndpointState eps : lastLayer) { + for (PortState ps : eps.getPorts()) { + for (String conn : ps.getPotentialConnections()) { + String endpointId = conn.substring(0, conn.lastIndexOf(':')); + + for (Iterator it = toLayout.iterator(); it.hasNext();) { + EndpointState otherEps = it.next(); + if (otherEps.getId().equals(endpointId)) { + nextLayer.add(otherEps); + it.remove(); + break; + } + } + } + } + } + + return nextLayer; + } + + private int[] determineWidths(List> layout) { + int[] result = new int[layout.size()]; + int ix = 0; + for (Set set : layout) { + int width = -MARGIN_HOR; // Subtract 1 margin + for (EndpointState eps : set) { + width += eps.getWidth() + MARGIN_HOR; + } + result[ix++] = width; + } + return result; + } + + public void performLayout() { + Set toLayout = new TreeSet(endpoints); + + int leftSide = 50; + while (!toLayout.isEmpty()) { + List> layout = new ArrayList>(); + + // First find a starting point by the one with the most ports + int max = -1; + EndpointState start = null; + for (EndpointState eps : toLayout) { + int total = eps.getPorts().size(); + if (total > max) { + max = total; + start = eps; + } + } + + // Determine the first layer by only this node + Set firstLayer = Collections.singleton(start); + toLayout.remove(start); + layout.add(firstLayer); + Set lastLayer = firstLayer; + + // Now determine the next layers + while (true) { + Set nextLayer = nextLayer(lastLayer, toLayout); + if (nextLayer.isEmpty()) { + break; + } + layout.add(nextLayer); + lastLayer = nextLayer; + } + + // Determine the maximum width and width of each layer + int maxWidth = 0; + int[] widths = determineWidths(layout); + for (int x : widths) { + if (x > maxWidth) { + maxWidth = x; + } + } + + // Now perform the real layout + for (int ix = 0; ix < layout.size(); ix++) { + Set layer = layout.get(ix); + int top = MARGIN_VER / 2 + ix * (MARGIN_VER + HEIGHT); + int left = leftSide + (maxWidth - widths[ix]) / 2; + + for (EndpointState endpointState : layer) { + endpointState.setStyle("top", top + "px"); + endpointState.setStyle("left", left + "px"); + + left += endpointState.getWidth() + MARGIN_HOR; + } + } + + leftSide += maxWidth + MARGIN_HOR; + } + } + + public Set getEndpoints() { + return endpoints; + } + + public List getActiveConnections() { + return activeConnections; + } + } private ConnectionManager connectionManager; @@ -24,20 +263,17 @@ public void setConnectionManager(ConnectionManager connectionManager) { this.connectionManager = connectionManager; } - public Map>> currentState() { - Map>> result = new TreeMap>>(); - for (ManagedEndpoint endpoint : connectionManager.getEndpoints().values()) { - result.put(endpoint.getPid(), parsePorts(endpoint.getPorts().values())); - } - return result; + private BundleContext bunleContext; + + @Activate + public void activate(BundleContext bundleContext) { + bunleContext = bundleContext; } - private Map> parsePorts(Collection values) { - Map> result = new TreeMap>(); - for (EndpointPort port : values) { - result.put(port.getName(), port.getPotentialConnections().keySet()); - } - return result; + public State currentState() { + State state = new State(connectionManager, bunleContext); + state.performLayout(); + return state; } @Override diff --git a/flexiblepower.ui.connectionspage/test.bndrun b/flexiblepower.ui.connectionspage/test.bndrun new file mode 100755 index 0000000..7850b7b --- /dev/null +++ b/flexiblepower.ui.connectionspage/test.bndrun @@ -0,0 +1,55 @@ +-runfw: org.apache.felix.framework +-runee: JavaSE-1.7 +-resolve: auto +-runvm: -Dlogback.configurationFile=logback.xml + +-runrequires: \ + osgi.identity;filter:='(osgi.identity=flexiblepower.manager.uncontrolled)',\ + osgi.identity;filter:='(osgi.identity=flexiblepower.simulation.pvpanel)',\ + osgi.identity;filter:='(osgi.identity=flexiblepower.ral)',\ + osgi.identity;filter:='(osgi.identity=flexiblepower.ral.efi)',\ + osgi.identity;filter:='(osgi.identity=flexiblepower.runtime)',\ + osgi.identity;filter:='(osgi.identity=flexiblepower.ui.connectionspage)',\ + osgi.identity;filter:='(osgi.identity=net.powermatcher.core)',\ + osgi.identity;filter:='(osgi.identity=net.powermatcher.fpai.controller)',\ + osgi.identity;filter:='(osgi.identity=net.powermatcher.runtime)',\ + osgi.identity;filter:='(osgi.identity=org.apache.felix.configadmin)',\ + osgi.identity;filter:='(osgi.identity=org.apache.felix.eventadmin)',\ + osgi.identity;filter:='(osgi.identity=org.apache.felix.http.jetty)',\ + osgi.identity;filter:='(osgi.identity=org.apache.felix.http.whiteboard)',\ + osgi.identity;filter:='(osgi.identity=org.apache.felix.metatype)',\ + osgi.identity;filter:='(osgi.identity=org.apache.felix.scr)',\ + osgi.identity;filter:='(osgi.identity=org.apache.felix.webconsole)',\ + osgi.identity;filter:='(osgi.identity=org.apache.felix.webconsole.plugins.ds)' + +-runbundles: \ + biz.aQute.bnd.annotation;version='[2.4.0,2.4.1)',\ + ch.qos.logback.classic;version='[1.1.2,1.1.3)',\ + ch.qos.logback.core;version='[1.1.2,1.1.3)',\ + com.google.gson;version='[2.2.4,2.2.5)',\ + flexiblepower.api;version='[3.0.0,3.0.1)',\ + flexiblepower.manager.uncontrolled;version='[2.1.0,2.1.1)',\ + flexiblepower.ral;version=latest,\ + flexiblepower.ral.efi;version=latest,\ + flexiblepower.ral.efi.utils;version=latest,\ + flexiblepower.ral.ext;version=latest,\ + flexiblepower.runtime;version=latest,\ + flexiblepower.simulation.pvpanel;version='[2.1.0,2.1.1)',\ + flexiblepower.ui;version=latest,\ + flexiblepower.ui.connectionspage;version=latest,\ + net.powermatcher.api;version='[2.0.0,2.0.1)',\ + net.powermatcher.core;version='[2.0.0,2.0.1)',\ + net.powermatcher.fpai.controller;version='[2.0.0,2.0.1)',\ + net.powermatcher.runtime;version='[2.0.0,2.0.1)',\ + org.apache.felix.configadmin;version='[1.8.0,1.8.1)',\ + org.apache.felix.eventadmin;version='[1.3.2,1.3.3)',\ + org.apache.felix.http.api;version='[2.3.2,2.3.3)',\ + org.apache.felix.http.jetty;version='[3.0.2,3.0.3)',\ + org.apache.felix.http.servlet-api;version='[1.1.0,1.1.1)',\ + org.apache.felix.http.whiteboard;version='[2.3.2,2.3.3)',\ + org.apache.felix.metatype;version='[1.0.10,1.0.11)',\ + org.apache.felix.scr;version='[1.8.2,1.8.3)',\ + org.apache.felix.webconsole;version='[4.2.2,4.2.3)',\ + org.apache.felix.webconsole.plugins.ds;version='[1.0.0,1.0.1)',\ + org.slf4j.osgi-over-slf4j;version='[1.7.7,1.7.8)',\ + slf4j.api;version='[1.7.7,1.7.8)' From d24be2380c20140c733d55a40b37280aaef3294f Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Fri, 24 Apr 2015 16:41:08 +0200 Subject: [PATCH 080/105] Added autoconnect method and now handling existing connections --- .../widgets/ConnectionManagerPage/script.js | 12 ++++++++++++ .../ConnectionManagerPage.java | 19 ++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/script.js b/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/script.js index d841f4b..d9df513 100755 --- a/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/script.js +++ b/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/script.js @@ -88,6 +88,7 @@ jsPlumb.ready(function() { uuid: endpoint.id + ":" + port.id, label: port.id, parameters: { potentialTargets: port.potentialConnections }, + maxConnections: port.isMultiple ? -1 : 1, }); } } @@ -99,6 +100,17 @@ jsPlumb.ready(function() { _addEndpoint(data.endpoints[ix]); } + // Now create the connections that already are active + for(ix in data.activeConnections) { + var connection = data.activeConnections[ix]; + + var match = connection.match(/^(.*:[a-z]*)-(.*:[a-z]*)$/); + instance.connect({ + source: instance.getEndpoint(match[1]), + target: instance.getEndpoint(match[2]), + }); + } + instance.bind("beforeDrag", function(params) { instance.batch(function() { instance.selectEndpoints().setEnabled(false); diff --git a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerPage.java b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerPage.java index d155c77..323d4a0 100755 --- a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerPage.java +++ b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerPage.java @@ -139,7 +139,7 @@ void setStyle(String key, String value) { public static class State { private final Set endpoints; - private final List activeConnections; + private final Set activeConnections; public State(ConnectionManager connectionManager, BundleContext context) { endpoints = new TreeSet(); @@ -147,7 +147,16 @@ public State(ConnectionManager connectionManager, BundleContext context) { endpoints.add(new EndpointState(context, ep)); } - activeConnections = new ArrayList(); + activeConnections = new TreeSet(); + for (ManagedEndpoint ep : connectionManager.getEndpoints().values()) { + for (EndpointPort port : ep.getPorts().values()) { + for (PotentialConnection conn : port.getPotentialConnections().values()) { + if (conn.isConnected()) { + activeConnections.add(conn.toString()); + } + } + } + } } private Set nextLayer(Set lastLayer, Set toLayout) { @@ -251,7 +260,7 @@ public Set getEndpoints() { return endpoints; } - public List getActiveConnections() { + public Set getActiveConnections() { return activeConnections; } } @@ -276,6 +285,10 @@ public State currentState() { return state; } + public void autoconnect() { + connectionManager.autoConnect(); + } + @Override public String getTitle(Locale locale) { return "Connection Manager"; From cdc55d0f13100cae083fb754cee68acef2ade209 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Fri, 24 Apr 2015 17:43:16 +0200 Subject: [PATCH 081/105] Implementing first version of the connect & disconnect functionality --- .../widgets/ConnectionManagerPage/script.js | 44 +++++++++--- .../ConnectionManagerPage.java | 68 +++++++++++++++++++ 2 files changed, 102 insertions(+), 10 deletions(-) diff --git a/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/script.js b/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/script.js index d9df513..5cb3377 100755 --- a/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/script.js +++ b/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/script.js @@ -43,18 +43,20 @@ jsPlumb.ready(function() { // Now create the node var node = $('

' + pkgName + '

' + epName + '

' + epId + '

'); -// node.hover(function() { +// var propertiesNode = $('
') +// if(endpoint.properties) { // for(ix in endpoint.properties) { -// var prop = endpoint.properties[ix]; -// node.appendChild(_createTextNode(prop, true)); +// prop = endpoint.properties[ix]; +// $('

' + prop + "

").appendTo(propertiesNode); // } +// } + +// node.bind("mouseenter", function(event) { +// propertiesNode.css({left:event.clientX,top: event.clientY}).show(); +// }); +// node.bind("mouseexit", function(event) { +// propertiesNode.hide(); // }); - if(endpoint.properties) { - for(ix in endpoint.properties) { - prop = endpoint.properties[ix]; - $('

' + prop + "

").appendTo(node); - } - } for(key in endpoint.style) { node.css(key, endpoint.style[key]); @@ -118,7 +120,7 @@ jsPlumb.ready(function() { params.endpoint.clearTypes(); - var targets = params.endpoint.potentialTargets; + var targets = params.endpoint.getParameter("potentialTargets"); for(ix in targets) { var target = instance.getEndpoint(targets[ix]); target.setEnabled(true); @@ -131,6 +133,28 @@ jsPlumb.ready(function() { instance.selectEndpoints().setEnabled(true); instance.selectEndpoints().each(function(ep) {ep.clearTypes();}); }); + + instance.bind("connection", function(params) { + $.ajax({ + type: "POST", + contentType: 'application/json', + processData: false, + url: "connect", + data: JSON.stringify({ source: params.sourceEndpoint.getUuid(), target: params.targetEndpoint.getUuid() }), + }); + }); + + instance.bind("connectionDetached", function(params) { + if(params.targetEndpoint) { + $.ajax({ + type: "POST", + contentType: 'application/json', + processData: false, + url: "disconnect", + data: JSON.stringify({ source: params.sourceEndpoint.getUuid(), target: params.targetEndpoint.getUuid() }), + }); + } + }); }); } }); diff --git a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerPage.java b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerPage.java index 323d4a0..9695745 100755 --- a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerPage.java +++ b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerPage.java @@ -289,6 +289,74 @@ public void autoconnect() { connectionManager.autoConnect(); } + public static class ConnectionInfo { + private String source, target; + + public void setSource(String source) { + this.source = source; + } + + public void setTarget(String target) { + this.target = target; + } + + public String getSourceEndpoint() { + return source.substring(0, source.lastIndexOf(':')); + } + + public String getSourcePort() { + return source.substring(source.lastIndexOf(':') + 1); + } + + public String getTargetEndpoint() { + return target.substring(0, target.lastIndexOf(':')); + } + + public String getTargetPort() { + return target.substring(target.lastIndexOf(':') + 1); + } + } + + public boolean connect(ConnectionInfo info) { + ManagedEndpoint sourceEndpoint = connectionManager.getEndpoint(info.getSourceEndpoint()); + ManagedEndpoint targetEndpoint = connectionManager.getEndpoint(info.getTargetEndpoint()); + + if (sourceEndpoint != null && targetEndpoint != null) { + EndpointPort sourcePort = sourceEndpoint.getPort(info.getSourcePort()); + EndpointPort targetPort = targetEndpoint.getPort(info.getTargetPort()); + + if (sourcePort != null && targetPort != null) { + PotentialConnection connection = sourcePort.getPotentialConnection(targetPort); + if (connection != null && connection.isConnectable()) { + connection.connect(); + return true; + } + } + } + + return false; + } + + public boolean disconnect(ConnectionInfo info) { + ManagedEndpoint sourceEndpoint = connectionManager.getEndpoint(info.getSourceEndpoint()); + ManagedEndpoint targetEndpoint = connectionManager.getEndpoint(info.getTargetEndpoint()); + + if (sourceEndpoint != null && targetEndpoint != null) { + EndpointPort sourcePort = sourceEndpoint.getPort(info.getSourcePort()); + EndpointPort targetPort = targetEndpoint.getPort(info.getTargetPort()); + + if (sourcePort != null && targetPort != null) { + PotentialConnection connection = sourcePort.getPotentialConnection(targetPort); + if (connection != null && connection.isConnected()) { + connection.disconnect(); + return true; + } + } + } + + return false; + } + @Override public String getTitle(Locale locale) { return "Connection Manager"; From 57444d1484307be99d1aae0f8684516a816bd915 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 28 Apr 2015 10:18:17 +0200 Subject: [PATCH 082/105] Added properties panel and autoconnect button --- .../widgets/ConnectionManagerPage/index.html | 39 ++++++++++++++++++- .../widgets/ConnectionManagerPage/script.js | 36 ++++++++++------- 2 files changed, 58 insertions(+), 17 deletions(-) diff --git a/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/index.html b/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/index.html index 4cccb3c..a0ab4d4 100755 --- a/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/index.html +++ b/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/index.html @@ -6,14 +6,45 @@ -webkit-user-select: none; -ms-user-select: none; position: absolute; - left: 1em; - right: 1em; + left: 0; + width: 80%; top: 150px; bottom: 130px; + padding: 1em; overflow: auto; background: white; } +#properties { + position: absolute; + top: 150px; + bottom: 130px; + right: 0; + padding: 1em; + width: 20%; + overflow: auto; + background: white; + border-left: 2px solid #33333; + z-index: 30; +} + +#properties input { + width: 100%; +} + +#properties h1 { + width: 100%; + font-size: 150%; + padding-top: 1em; + padding-bottom: .5em; + margin-bottom: .5em; + border-bottom: 1px dotted black; +} + +#properties p { + line-height: 1.3em; +} + .node { position: absolute; padding: 1em 0.5em; @@ -66,5 +97,9 @@
+
+ +

Properties of <no selection>

+
diff --git a/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/script.js b/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/script.js index 5cb3377..6697700 100755 --- a/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/script.js +++ b/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/script.js @@ -43,20 +43,19 @@ jsPlumb.ready(function() { // Now create the node var node = $('

' + pkgName + '

' + epName + '

' + epId + '

'); -// var propertiesNode = $('
') -// if(endpoint.properties) { -// for(ix in endpoint.properties) { -// prop = endpoint.properties[ix]; -// $('

' + prop + "

").appendTo(propertiesNode); -// } -// } - -// node.bind("mouseenter", function(event) { -// propertiesNode.css({left:event.clientX,top: event.clientY}).show(); -// }); -// node.bind("mouseexit", function(event) { -// propertiesNode.hide(); -// }); + node.bind("mouseenter", function(event){ + $('#properties p, #properties br').detach(); + $('#componentname').html(epName); + var container = $('#properties'); + + $('

Package: ' + pkgName + '

').appendTo(container); + $('

Unique ID: ' + epId + '

').appendTo(container); + $('
').appendTo(container); + for(ix in endpoint.properties) { + $('

' + endpoint.properties[ix] + '

').appendTo(container); + } + + }); for(key in endpoint.style) { node.css(key, endpoint.style[key]); @@ -67,7 +66,7 @@ jsPlumb.ready(function() { // Make it draggable instance.draggable(node); - + // Now create the ports for(ix in endpoint.ports) { port = endpoint.ports[ix]; @@ -159,4 +158,11 @@ jsPlumb.ready(function() { } }); + $('#autoconnect').click(function() { + $.ajax("autoconnect", { + success: function(data) { + window.location.reload(); + } + }); + }); }); \ No newline at end of file From 2a71584e7d7a8c1935e82c3f82c82bd00f22c26e Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 28 Apr 2015 10:19:04 +0200 Subject: [PATCH 083/105] Removed old code --- .../.checkstyle | 10 - .../.classpath | 7 - .../.gitignore | 3 - .../.project | 29 -- .../.settings/bndtools.core.prefs | 3 - .../org.eclipse.core.resources.prefs | 2 - .../.settings/org.eclipse.jdt.core.prefs | 292 ------------------ .../.settings/org.eclipse.jdt.ui.prefs | 62 ---- .../bnd.bnd | 11 - .../demo.bndrun | 33 -- .../res/OSGI-INF/permissions.perm | 2 - .../res/connectionManager.js | 226 -------------- .../res/cytoscape.min.js | 24 -- .../res/index.html | 44 --- .../src/.gitignore | 0 .../plugins/ConnectionManagerPlugin.java | 266 ---------------- .../webconsole/plugins/TestEndpoint.java | 43 --- .../ConnectionsPage/connectionManager.js | 223 ------------- .../widgets/ConnectionsPage/cytoscape.min.js | 24 -- .../res/widgets/ConnectionsPage/index.html | 66 ---- .../res/widgets/ConnectionsPage/menu.png | Bin 1795 -> 0 bytes .../res/widgets/ConnectionsPage/script.js | 3 - .../ConnectionsImageServlet.java | 94 ------ .../ui/connectionspage/ConnectionsPage.java | 15 - 24 files changed, 1482 deletions(-) delete mode 100644 flexiblepower.felix.webconsole.plugins/.checkstyle delete mode 100644 flexiblepower.felix.webconsole.plugins/.classpath delete mode 100644 flexiblepower.felix.webconsole.plugins/.gitignore delete mode 100644 flexiblepower.felix.webconsole.plugins/.project delete mode 100644 flexiblepower.felix.webconsole.plugins/.settings/bndtools.core.prefs delete mode 100644 flexiblepower.felix.webconsole.plugins/.settings/org.eclipse.core.resources.prefs delete mode 100644 flexiblepower.felix.webconsole.plugins/.settings/org.eclipse.jdt.core.prefs delete mode 100644 flexiblepower.felix.webconsole.plugins/.settings/org.eclipse.jdt.ui.prefs delete mode 100644 flexiblepower.felix.webconsole.plugins/bnd.bnd delete mode 100644 flexiblepower.felix.webconsole.plugins/demo.bndrun delete mode 100644 flexiblepower.felix.webconsole.plugins/res/OSGI-INF/permissions.perm delete mode 100644 flexiblepower.felix.webconsole.plugins/res/connectionManager.js delete mode 100644 flexiblepower.felix.webconsole.plugins/res/cytoscape.min.js delete mode 100644 flexiblepower.felix.webconsole.plugins/res/index.html delete mode 100644 flexiblepower.felix.webconsole.plugins/src/.gitignore delete mode 100644 flexiblepower.felix.webconsole.plugins/src/org/flexiblepower/felix/webconsole/plugins/ConnectionManagerPlugin.java delete mode 100644 flexiblepower.felix.webconsole.plugins/src/org/flexiblepower/felix/webconsole/plugins/TestEndpoint.java delete mode 100644 flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/connectionManager.js delete mode 100644 flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/cytoscape.min.js delete mode 100644 flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/index.html delete mode 100644 flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/menu.png delete mode 100644 flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/script.js delete mode 100644 flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionsImageServlet.java delete mode 100644 flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionsPage.java diff --git a/flexiblepower.felix.webconsole.plugins/.checkstyle b/flexiblepower.felix.webconsole.plugins/.checkstyle deleted file mode 100644 index c2c11f5..0000000 --- a/flexiblepower.felix.webconsole.plugins/.checkstyle +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/flexiblepower.felix.webconsole.plugins/.classpath b/flexiblepower.felix.webconsole.plugins/.classpath deleted file mode 100644 index 1b35e9d..0000000 --- a/flexiblepower.felix.webconsole.plugins/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/flexiblepower.felix.webconsole.plugins/.gitignore b/flexiblepower.felix.webconsole.plugins/.gitignore deleted file mode 100644 index 90dde36..0000000 --- a/flexiblepower.felix.webconsole.plugins/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/bin/ -/bin_test/ -/generated/ diff --git a/flexiblepower.felix.webconsole.plugins/.project b/flexiblepower.felix.webconsole.plugins/.project deleted file mode 100644 index a530cc9..0000000 --- a/flexiblepower.felix.webconsole.plugins/.project +++ /dev/null @@ -1,29 +0,0 @@ - - - flexiblepower.felix.webconsole.plugins - - - - - - org.eclipse.jdt.core.javabuilder - - - - - bndtools.core.bndbuilder - - - - - net.sf.eclipsecs.core.CheckstyleBuilder - - - - - - org.eclipse.jdt.core.javanature - bndtools.core.bndnature - net.sf.eclipsecs.core.CheckstyleNature - - diff --git a/flexiblepower.felix.webconsole.plugins/.settings/bndtools.core.prefs b/flexiblepower.felix.webconsole.plugins/.settings/bndtools.core.prefs deleted file mode 100644 index cfd70fe..0000000 --- a/flexiblepower.felix.webconsole.plugins/.settings/bndtools.core.prefs +++ /dev/null @@ -1,3 +0,0 @@ -compileErrorAction=skip -eclipse.preferences.version=1 -eclipseClasspath=expose diff --git a/flexiblepower.felix.webconsole.plugins/.settings/org.eclipse.core.resources.prefs b/flexiblepower.felix.webconsole.plugins/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c0..0000000 --- a/flexiblepower.felix.webconsole.plugins/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/flexiblepower.felix.webconsole.plugins/.settings/org.eclipse.jdt.core.prefs b/flexiblepower.felix.webconsole.plugins/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 7a9b0a6..0000000 --- a/flexiblepower.felix.webconsole.plugins/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,292 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.6 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=82 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=82 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=82 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=82 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=82 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=82 -org.eclipse.jdt.core.formatter.alignment_for_assignment=82 -org.eclipse.jdt.core.formatter.alignment_for_binary_expression=82 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=82 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=82 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=82 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=82 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=82 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=82 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=82 -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=82 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=82 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=82 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=82 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=82 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=82 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=82 -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=82 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true -org.eclipse.jdt.core.formatter.comment.indent_root_tags=true -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert -org.eclipse.jdt.core.formatter.comment.line_length=120 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=2 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=false -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.lineSplit=120 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=space -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=true -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false -org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/flexiblepower.felix.webconsole.plugins/.settings/org.eclipse.jdt.ui.prefs b/flexiblepower.felix.webconsole.plugins/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index fdf3387..0000000 --- a/flexiblepower.felix.webconsole.plugins/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,62 +0,0 @@ -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_FlexiblePowerSuite -formatter_settings_version=12 -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=true -sp_cleanup.always_use_parentheses_in_expressions=true -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_functional_interfaces=false -sp_cleanup.convert_to_enhanced_for_loop=true -sp_cleanup.correct_indentation=false -sp_cleanup.format_source_code=true -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.insert_inferred_type_arguments=false -sp_cleanup.make_local_variable_final=false -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=true -sp_cleanup.never_use_blocks=false -sp_cleanup.never_use_parentheses_in_expressions=false -sp_cleanup.on_save_use_additional_actions=true -sp_cleanup.organize_imports=true -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=true -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_redundant_type_arguments=false -sp_cleanup.remove_trailing_whitespaces=true -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true -sp_cleanup.remove_unnecessary_nls_tags=false -sp_cleanup.remove_unused_imports=true -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_anonymous_class_creation=false -sp_cleanup.use_blocks=true -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_lambda=false -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=true -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=true -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true -sp_cleanup.use_type_arguments=false diff --git a/flexiblepower.felix.webconsole.plugins/bnd.bnd b/flexiblepower.felix.webconsole.plugins/bnd.bnd deleted file mode 100644 index 073185b..0000000 --- a/flexiblepower.felix.webconsole.plugins/bnd.bnd +++ /dev/null @@ -1,11 +0,0 @@ --buildpath: \ - ${default-buildpath},\ - org.apache.felix.http.servlet-api,\ - org.apache.commons.io,\ - flexiblepower.runtime;version=project,\ - junit.osgi;version='[3.8,4)',\ - com.google.gson - -Bundle-Version: 1.0.1.${qualifier} -Private-Package: org.flexiblepower.felix.webconsole.plugins -Service-Component: org.flexiblepower.felix.webconsole.plugins.* diff --git a/flexiblepower.felix.webconsole.plugins/demo.bndrun b/flexiblepower.felix.webconsole.plugins/demo.bndrun deleted file mode 100644 index a17ad55..0000000 --- a/flexiblepower.felix.webconsole.plugins/demo.bndrun +++ /dev/null @@ -1,33 +0,0 @@ --runfw: org.apache.felix.framework;version='[4.4.0,4.4.0]' --runee: JavaSE-1.6 --runvm: -Dlogback.configurationFile=../cnf/logback.xml - --runrequires: \ - osgi.identity;filter:='(osgi.identity=org.apache.felix.webconsole)',\ - osgi.identity;filter:='(osgi.identity=flexiblepower.felix.webconsole.plugins)',\ - osgi.identity;filter:='(osgi.identity=org.apache.felix.http.jetty)',\ - osgi.identity;filter:='(osgi.identity=flexiblepower.runtime)',\ - osgi.identity;filter:='(osgi.identity=flexiblepower.api)',\ - osgi.identity;filter:='(osgi.identity=flexiblepower.ui)' --runbundles: \ - biz.aQute.bnd.annotation;version='[2.4.0,2.4.1)',\ - ch.qos.logback.classic;version='[1.1.2,1.1.3)',\ - ch.qos.logback.core;version='[1.1.2,1.1.3)',\ - com.google.gson;version='[2.2.4,2.2.5)',\ - flexiblepower.api;version=latest,\ - flexiblepower.felix.webconsole.plugins;version=latest,\ - flexiblepower.runtime;version=latest,\ - flexiblepower.ui;version=latest,\ - org.apache.commons.io;version='[2.4.0,2.4.1)',\ - org.apache.felix.configadmin;version='[1.8.0,1.8.1)',\ - org.apache.felix.eventadmin;version='[1.3.2,1.3.3)',\ - org.apache.felix.http.api;version='[2.3.0,2.3.1)',\ - org.apache.felix.http.jetty;version='[2.3.0,2.3.1)',\ - org.apache.felix.http.servlet-api;version='[1.0.0,1.0.1)',\ - org.apache.felix.metatype;version='[1.0.10,1.0.11)',\ - org.apache.felix.scr;version='[1.8.2,1.8.3)',\ - org.apache.felix.webconsole;version='[4.2.2,4.2.3)',\ - org.apache.felix.webconsole.plugins.ds;version='[1.0.0,1.0.1)',\ - org.slf4j.osgi-over-slf4j;version='[1.7.7,1.7.8)',\ - osgi.cmpn;version='[4.3.1,4.3.2)',\ - slf4j.api;version='[1.7.7,1.7.8)' \ No newline at end of file diff --git a/flexiblepower.felix.webconsole.plugins/res/OSGI-INF/permissions.perm b/flexiblepower.felix.webconsole.plugins/res/OSGI-INF/permissions.perm deleted file mode 100644 index 0302abd..0000000 --- a/flexiblepower.felix.webconsole.plugins/res/OSGI-INF/permissions.perm +++ /dev/null @@ -1,2 +0,0 @@ -(org.osgi.framework.ServicePermission "*" "get,register") -(org.osgi.framework.PackagePermission "*" "import,exportonly") diff --git a/flexiblepower.felix.webconsole.plugins/res/connectionManager.js b/flexiblepower.felix.webconsole.plugins/res/connectionManager.js deleted file mode 100644 index e0f1355..0000000 --- a/flexiblepower.felix.webconsole.plugins/res/connectionManager.js +++ /dev/null @@ -1,226 +0,0 @@ -cy = cytoscape({ - container : document.getElementById('cy'), - selectionType : 'single', // (isTouchDevice ? 'additive' : 'single'), - // layout: { - // name: 'circle', - // padding: 10 - // }, - layout : { - name : 'cose', - animate : false, - fit : true, - randomize : true - }, - zoom : 1, - minZoom : 0, - maxZoom : 100, - zoomingEnabled : true, - userZoomingEnabled : false, - pan : { - x : 0, - y : 0 - }, - panningEnabled : true, - userPanningEnabled : true, - autoungrabifyNodes : false, - hideEdgesOnViewport : false, - hideLabelsOnViewport : false, - textureOnViewport : false, - - style : [ { - selector : ':parent', - css : { - 'content' : 'data(name)', - 'font-family' : 'helvetica', - 'font-size' : 14, - 'text-outline-width' : 2, - 'text-outline-color' : '#000', - 'text-valign' : 'center', - 'color' : '#fff', - 'background-color' : '#0680C1', - 'background-color' : '#041B50', - 'line-color' : '#000', - 'text-outline-color' : '#000' - } - }, { - selector : ':child', - css : { - 'content' : 'data(name)', - 'font-family' : 'helvetica', - 'font-size' : 14, - 'text-outline-width' : 2, - 'text-outline-color' : '#000', - 'text-valign' : 'center', - 'color' : '#fff', - 'background-color' : '#0680C1', - 'background-color' : '#041B50', - 'line-color' : '#000', - 'text-outline-color' : '#000' - } - }, { - selector : 'edge', - css : { - 'opacity' : 0.9, - 'target-arrow-shape' : 'none' - - } - }, { - selector : '.faded', - css : { - 'opacity' : 0.85, - 'text-opacity' : 0.9 - } - }, { - selector : '.isconnected', - css : { - 'width' : 3, - 'line-color' : '#3F3', - 'line-style' : 'solid' - } - }, { - selector : '.notconnected', - css : { - 'width' : 3, - 'line-color' : '#AA0', - 'line-style' : 'dashed' - } - }, { - selector : '.unconnectable', - css : { - 'width' : 3, - 'opacity' : 0.3, - 'line-color' : '#A00', - 'line-style' : 'dotted' - } - } ], - - ready : function() { - $("#cy div").css("z-index", "-1"); // fixes the menu - } -}); -function refresh() { - $.get("/system/console/fpai-connection-manager/getGraph.json", - function(json) { - console.log(json); - cy.load(json); - console.log("connected:"); - console.log(cy.edges("[isconnected]")); - }).fail(function(jqXHR, textStatus, errorThrown) { - console.log("error: " + textStatus + ": " + errorThrown); - }); - $("#connect").prop("disabled", true); - $("#disconnect").prop("disabled", true); - selectedEdgeId = null; -} -refresh(); - -function autoconnect() { - console.log("Autoconnecting.."); - $.post("/system/console/fpai-connection-manager/autoconnect.json", - function(result) { - $("#status").text(result.status); - $("#status").attr("class", result.class); - }).fail(function(jqXHR, textStatus, errorThrown) { - console.log("error: " + textStatus + ": " + errorThrown); - }); - - refresh(); -} - -var selectedEdgeId; -function connect() { - console.log("Connecting " + selectedEdgeId); - var postdata = { - "id" : selectedEdgeId - }; - $.post("/system/console/fpai-connection-manager/connect.json", postdata, - function(result) { - $("#status").text(result.status); - $("#status").attr("class", result.class); - }).fail(function(jqXHR, textStatus, errorThrown) { - console.log("error: " + textStatus + ": " + errorThrown); - }).always(refresh()); -} - -function disconnect() { - console.log("Disconnecting " + selectedEdgeId); - var postdata = { - "id" : selectedEdgeId - }; - $.post("/system/console/fpai-connection-manager/disconnect.json", postdata, - function(result) { - $("#status").text(result.status); - $("#status").attr("class", result.class); - }).fail(function(jqXHR, textStatus, errorThrown) { - console.log("error: " + textStatus + ": " + errorThrown); - }).always(refresh()); -} - -cy.on('tap', 'node', function(e) { - var node = e.cyTarget; - var neighborhood = node.neighborhood().add(node); - cy.elements().addClass('faded'); - neighborhood.removeClass('faded'); - - $("#connect").prop("disabled", true); - $("#disconnect").prop("disabled", true); - - onNodeSelected(node.id()); -}); - -cy.on('tap', 'edge', function(e) { - var edge = e.cyTarget; - var neighborhood = edge.connectedNodes().add(edge); - cy.elements().addClass('faded'); - neighborhood.removeClass('faded'); - - onEdgeSelected(edge.id()); -}); - -cy.on('tap', function(e) { - if (e.cyTarget === cy) { - cy.elements().removeClass('faded'); - onNothingSelected(); - } -}); - -function onNothingSelected() { - selectedEdgeId = null; - $(".infotable").text(""); - $("#1a").text("Nothing selected"); -} - -function onEdgeSelected(elemid) { - selectedEdgeId = elemid; - var elem = cy.$('#' + elemid); // select element - $(".infotable").text(""); - $("#1a").text("Possible connection"); - $("#2a").text("connects: "); - $("#2b").text(elem.data("source")); - $("#3a").text("with: "); - $("#3b").text(elem.data("target")); - $("#4a").text("Connected: "); - $("#4b").text(elem.data("isconnected")); - $("#5a").text("elemid: "); - $("#5b").text(elemid); - - if (elem.data("isconnected") || elem.data("unconnectable")) { - $("#connect").prop("disabled", true); - $("#disconnect").prop("disabled", false); - } else { - $("#connect").prop("disabled", false); - $("#disconnect").prop("disabled", true); - } -} - -function onNodeSelected(elemid) { - selectedEdgeId = null; - var elem = cy.$('#' + elemid); // select element - $(".infotable").text(""); - $("#1a").text("node"); - console.log(elem.data()); -} - -function updateInfo(elemid) { - -} diff --git a/flexiblepower.felix.webconsole.plugins/res/cytoscape.min.js b/flexiblepower.felix.webconsole.plugins/res/cytoscape.min.js deleted file mode 100644 index cedc7ce..0000000 --- a/flexiblepower.felix.webconsole.plugins/res/cytoscape.min.js +++ /dev/null @@ -1,24 +0,0 @@ -/*! - * This file is part of Cytoscape.js 2.3.1. - * - * Cytoscape.js is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) any - * later version. - * - * Cytoscape.js is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * - * You should have received a copy of the GNU Lesser General Public License along with - * Cytoscape.js. If not, see . - */ -var cytoscape;!function(e){"use strict";var t=cytoscape=function(){return cytoscape.init.apply(cytoscape,arguments)};t.version="2.3.1",t.init=function(e){return void 0===e&&(e={}),t.is.plainObject(e)?new t.Core(e):t.is.string(e)?t.extension.apply(t.extension,arguments):void 0},t.fn={},"undefined"!=typeof module&&module.exports&&(module.exports=cytoscape),"undefined"!=typeof define&&define.amd&&define("cytoscape",function(){return cytoscape}),e&&(e.cytoscape=cytoscape)}("undefined"==typeof window?null:window),function(e,t){"use strict";e.is={defined:function(e){return null!=e},string:function(e){return null!=e&&"string"==typeof e},fn:function(e){return null!=e&&"function"==typeof e},array:function(e){return Array.isArray?Array.isArray(e):null!=e&&e instanceof Array},plainObject:function(t){return null!=t&&typeof t==typeof{}&&!e.is.array(t)&&t.constructor===Object},number:function(e){return null!=e&&"number"==typeof e&&!isNaN(e)},integer:function(t){return e.is.number(t)&&Math.floor(t)===t},color:function(e){return null!=e&&"string"==typeof e&&""!==$.Color(e).toString()},bool:function(e){return null!=e&&typeof e==typeof!0},elementOrCollection:function(t){return e.is.element(t)||e.is.collection(t)},element:function(t){return t instanceof e.Element&&t._private.single},collection:function(t){return t instanceof e.Collection&&!t._private.single},core:function(t){return t instanceof e.Core},style:function(t){return t instanceof e.Style},stylesheet:function(t){return t instanceof e.Stylesheet},event:function(t){return t instanceof e.Event},emptyString:function(t){return t?e.is.string(t)&&(""===t||t.match(/^\s+$/))?!0:!1:!0},nonemptyString:function(t){return t&&e.is.string(t)&&""!==t&&!t.match(/^\s+$/)?!0:!1},domElement:function(e){return"undefined"==typeof HTMLElement?!1:e instanceof HTMLElement},touch:function(){return t&&("ontouchstart"in t||t.DocumentTouch&&document instanceof DocumentTouch)},boundingBox:function(t){return e.is.plainObject(t)&&e.is.number(t.x1)&&e.is.number(t.x2)&&e.is.number(t.y1)&&e.is.number(t.y2)}}}(cytoscape,"undefined"==typeof window?null:window),function(e,t){"use strict";e.util={extend:function(){var t,i,r,n,a,o,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||e.is.fn(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(t=arguments[l]))for(i in t)r=s[i],n=t[i],s!==n&&(c&&n&&(e.is.plainObject(n)||(a=e.is.array(n)))?(a?(a=!1,o=r&&e.is.array(r)?r:[]):o=r&&e.is.plainObject(r)?r:{},s[i]=e.util.extend(c,o,n)):void 0!==n&&(s[i]=n));return s},require:function(i,r,n){var a;n=e.util.extend({msgIfNotFound:!0},n);var o=!1,s=function(e){o=!0,r(e)},l=function(e){t&&(a=t[i]),void 0!==a&&s(a),e&&e()},u=function(){o||c(d)},c=function(e){"undefined"!=typeof module&&module.exports&&require&&(a=require(i)),void 0!==a&&s(a),e&&e()},d=function(){o||p(h)},p=function(e){"undefined"!=typeof define&&define.amd&&require&&require([i],function(t){a=t,void 0!==a&&s(a),e&&e()})},h=function(){!o&&n.msgIfNotFound&&e.util.error("Cytoscape.js tried to pull in dependency `"+i+"` but no module (i.e. CommonJS, AMD, or window) was found")};l(u)},requires:function(t,i){for(var r=[],n=[],a=function(){for(var e=0;e=r){a&&clearTimeout(a);var p=c;a=u=c=void 0,p&&(d=e.util.now(),o=t.apply(l,n),u||a||(n=l=null))}else u=setTimeout(f,r)},g=function(){u&&clearTimeout(u),a=u=c=void 0,(h||p!==i)&&(d=e.util.now(),o=t.apply(l,n),u||a||(n=l=null))};return function(){if(n=arguments,s=e.util.now(),l=this,c=h&&(u||!v),p===!1)var r=v&&!u;else{a||v||(d=s);var y=p-(s-d),m=0>=y;m?(a&&(a=clearTimeout(a)),d=s,o=t.apply(l,n)):a||(a=setTimeout(g,y))}return m&&u?u=clearTimeout(u):u||i===p||(u=setTimeout(f,i)),r&&(m=!0,o=t.apply(l,n)),!m||u||a||(n=l=null),o}}},error:function(e){if(!console)throw e;if(console.error)console.error.apply(console,arguments);else{if(!console.log)throw e;console.log.apply(console,arguments)}},clone:function(e){var t={};for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t},copy:function(t){return null==t?t:e.is.array(t)?t.slice():e.is.plainObject(t)?e.util.clone(t):t},makeBoundingBox:function(e){if(null!=e.x1&&null!=e.y1){if(null!=e.x2&&null!=e.y2&&e.x2>=e.x1&&e.y2>=e.y1)return{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,w:e.x2-e.x1,h:e.y2-e.y1};if(null!=e.w&&null!=e.h&&e.w>=0&&e.h>=0)return{x1:e.x1,y1:e.y1,x2:e.x1+e.w,y2:e.y1+e.h,w:e.w,h:e.h}}},mapEmpty:function(e){var t=!0;if(null!=e)for(var i in e){t=!1;break}return t},pushMap:function(t){var i=e.util.getMap(t);null==i?e.util.setMap($.extend({},t,{value:[t.value]})):i.push(t.value)},setMap:function(t){for(var i,r=t.map,n=t.keys,a=n.length,o=0;a>o;o++){var i=n[o];e.is.plainObject(i)&&e.util.error("Tried to set map with object key"),oa;a++){var o=r[a];if(e.is.plainObject(o)&&e.util.error("Tried to get map with object key"),i=i[o],null==i)return i}return i},deleteMap:function(t){for(var i=t.map,r=t.keys,n=r.length,a=t.keepChildren,o=0;n>o;o++){var s=r[o];e.is.plainObject(s)&&e.util.error("Tried to delete map with object key");var l=o===t.keys.length-1;if(l)if(a)for(var u in i)a[u]||(i[u]=void 0);else i[s]=void 0;else i=i[s]}},capitalize:function(t){return e.is.emptyString(t)?t:t.charAt(0).toUpperCase()+t.substring(1)},camel2dash:function(e){for(var t=[],i=0;it&&" "===e[i];i--);return e.substring(t,i+1)},hex2tuple:function(e){if((4===e.length||7===e.length)&&"#"===e[0]){var t,i,r,n=4===e.length,a=16;return n?(t=parseInt(e[1]+e[1],a),i=parseInt(e[2]+e[2],a),r=parseInt(e[3]+e[3],a)):(t=parseInt(e[1]+e[2],a),i=parseInt(e[3]+e[4],a),r=parseInt(e[5]+e[6],a)),[t,i,r]}},hsl2tuple:function(t){function i(e,t,i){return 0>i&&(i+=1),i>1&&(i-=1),1/6>i?e+6*(t-e)*i:.5>i?t:2/3>i?e+(t-e)*(2/3-i)*6:e}var r,n,a,o,s,l,u,c,d=new RegExp("^"+e.util.regex.hsla+"$").exec(t);if(d){if(n=parseInt(d[1]),0>n?n=(360- -1*n%360)%360:n>360&&(n%=360),n/=360,a=parseFloat(d[2]),0>a||a>100)return;if(a/=100,o=parseFloat(d[3]),0>o||o>100)return;if(o/=100,s=d[4],void 0!==s&&(s=parseFloat(s),0>s||s>1))return;if(0===a)l=u=c=Math.round(255*o);else{var p=.5>o?o*(1+a):o+a-o*a,h=2*o-p;l=Math.round(255*i(h,p,n+1/3)),u=Math.round(255*i(h,p,n)),c=Math.round(255*i(h,p,n-1/3))}r=[l,u,c,s]}return r},rgb2tuple:function(t){var i,r=new RegExp("^"+e.util.regex.rgba+"$").exec(t);if(r){i=[];for(var n=[],a=1;3>=a;a++){var o=r[a];if("%"===o[o.length-1]&&(n[a]=!0),o=parseFloat(o),n[a]&&(o=o/100*255),0>o||o>255)return;i.push(Math.floor(o))}var s=n[1]||n[2]||n[3],l=n[1]&&n[2]&&n[3];if(s&&!l)return;var u=r[4];if(void 0!==u){if(u=parseFloat(u),0>u||u>1)return;i.push(u)}}return i},colorname2tuple:function(t){return e.util.colors[t.toLowerCase()]},color2tuple:function(t){return(e.is.array(t)?t:null)||e.util.colorname2tuple(t)||e.util.hex2tuple(t)||e.util.rgb2tuple(t)||e.util.hsl2tuple(t)},tuple2hex:function(e){function t(e){var t=e.toString(16);return 1===t.length&&(t="0"+t),t}var i=e[0],r=e[1],n=e[2];return"#"+t(i)+t(r)+t(n)},colors:{transparent:[0,0,0,0],aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},e.util.regex={},e.util.regex.number="(?:[-]?\\d*\\.\\d+|[-]?\\d+|[-]?\\d*\\.\\d+[eE]\\d+)",e.util.regex.rgba="rgb[a]?\\(("+e.util.regex.number+"[%]?)\\s*,\\s*("+e.util.regex.number+"[%]?)\\s*,\\s*("+e.util.regex.number+"[%]?)(?:\\s*,\\s*("+e.util.regex.number+"))?\\)",e.util.regex.rgbaNoBackRefs="rgb[a]?\\((?:"+e.util.regex.number+"[%]?)\\s*,\\s*(?:"+e.util.regex.number+"[%]?)\\s*,\\s*(?:"+e.util.regex.number+"[%]?)(?:\\s*,\\s*(?:"+e.util.regex.number+"))?\\)",e.util.regex.hsla="hsl[a]?\\(("+e.util.regex.number+")\\s*,\\s*("+e.util.regex.number+"[%])\\s*,\\s*("+e.util.regex.number+"[%])(?:\\s*,\\s*("+e.util.regex.number+"))?\\)",e.util.regex.hslaNoBackRefs="hsl[a]?\\((?:"+e.util.regex.number+")\\s*,\\s*(?:"+e.util.regex.number+"[%])\\s*,\\s*(?:"+e.util.regex.number+"[%])(?:\\s*,\\s*(?:"+e.util.regex.number+"))?\\)",e.util.regex.hex3="\\#[0-9a-fA-F]{3}",e.util.regex.hex6="\\#[0-9a-fA-F]{6}";var i=t?t.requestAnimationFrame||t.mozRequestAnimationFrame||t.webkitRequestAnimationFrame||t.msRequestAnimationFrame:null;i=i||function(e){e&&setTimeout(e,1e3/60)},e.util.requestAnimationFrame=function(e){i(e)}}(cytoscape,"undefined"==typeof window?null:window),function(e){"use strict";e.math={},e.math.signum=function(e){return e>0?1:0>e?-1:0},e.math.distance=function(e,t){var i=t.x-e.x,r=t.y-e.y;return Math.sqrt(i*i+r*r)},e.math.qbezierAt=function(e,t,i,r){return(1-r)*(1-r)*e+2*(1-r)*r*t+r*r*i},e.math.qbezierPtAt=function(t,i,r,n){return{x:e.math.qbezierAt(t.x,i.x,r.x,n),y:e.math.qbezierAt(t.y,i.y,r.y,n)}},e.math.boundingBoxesIntersect=function(e,t){return e.x1>t.x2?!1:t.x1>e.x2?!1:e.x2t.y2?!1:t.y1>e.y2?!1:!0},e.math.inBoundingBox=function(e,t,i){return e.x1<=t&&t<=e.x2&&e.y1<=i&&i<=e.y2},e.math.pointInBoundingBox=function(e,t){return this.inBoundingBox(e,t.x,t.y)},e.math.roundRectangleIntersectLine=function(e,t,i,r,n,a,o){var s,l=this.getRoundRectangleRadius(n,a),u=n/2,c=a/2,d=i-u+l-o,p=r-c-o,h=i+u-l+o,v=p;if(s=this.finiteLinesIntersect(e,t,i,r,d,p,h,v,!1),s.length>0)return s;var f=i+u+o,g=r-c+l-o,y=f,m=r+c-l+o;if(s=this.finiteLinesIntersect(e,t,i,r,f,g,y,m,!1),s.length>0)return s;var x=i-u+l-o,b=r+c+o,w=i+u-l+o,_=b;if(s=this.finiteLinesIntersect(e,t,i,r,x,b,w,_,!1),s.length>0)return s;var E=i-u-o,S=r-c+l-o,P=E,k=r+c-l+o;if(s=this.finiteLinesIntersect(e,t,i,r,E,S,P,k,!1),s.length>0)return s;var C,D=i-u+l,N=r-c+l;if(C=this.intersectLineCircle(e,t,i,r,D,N,l+o),C.length>0&&C[0]<=D&&C[1]<=N)return[C[0],C[1]];var T=i+u-l,M=r-c+l;if(C=this.intersectLineCircle(e,t,i,r,T,M,l+o),C.length>0&&C[0]>=T&&C[1]<=M)return[C[0],C[1]];var B=i+u-l,I=r+c-l;if(C=this.intersectLineCircle(e,t,i,r,B,I,l+o),C.length>0&&C[0]>=B&&C[1]>=I)return[C[0],C[1]];var z=i-u+l,L=r+c-l;return C=this.intersectLineCircle(e,t,i,r,z,L,l+o),C.length>0&&C[0]<=z&&C[1]>=L?[C[0],C[1]]:[]},e.math.roundRectangleIntersectBox=function(e,t,i,r,n,a,o,s,l){var u=this.getRoundRectangleRadius(n,a),c=o-n/2-l,d=s-a/2+u-l,p=o+n/2+l,h=s+a/2-u+l,v=o-n/2+u-l,f=s-a/2-l,g=o+n/2-u+l,y=s+a/2+l,m=Math.min(e,i),x=Math.max(e,i),b=Math.min(t,r),w=Math.max(t,r);return c>x?!1:m>p?!1:f>w?!1:b>y?!1:c>=m&&x>=c&&d>=b&&w>=d?!0:p>=m&&x>=p&&d>=b&&w>=d?!0:p>=m&&x>=p&&h>=b&&w>=h?!0:c>=m&&x>=c&&h>=b&&w>=h?!0:m>=c&&p>=m&&b>=d&&h>=b?!0:x>=c&&p>=x&&b>=d&&h>=b?!0:x>=c&&p>=x&&w>=d&&h>=w?!0:m>=c&&p>=m&&w>=d&&h>=w?!0:v>=m&&x>=v&&f>=b&&w>=f?!0:g>=m&&x>=g&&f>=b&&w>=f?!0:g>=m&&x>=g&&y>=b&&w>=y?!0:v>=m&&x>=v&&y>=b&&w>=y?!0:m>=v&&g>=m&&b>=f&&y>=b?!0:x>=v&&g>=x&&b>=f&&y>=b?!0:x>=v&&g>=x&&w>=f&&y>=w?!0:m>=v&&g>=m&&w>=f&&y>=w?!0:this.boxIntersectEllipse(m,b,x,w,l,2*u,2*u,v+l,d+l)?!0:this.boxIntersectEllipse(m,b,x,w,l,2*u,2*u,g-l,d+l)?!0:this.boxIntersectEllipse(m,b,x,w,l,2*u,2*u,g-l,h-l)?!0:this.boxIntersectEllipse(m,b,x,w,l,2*u,2*u,v+l,h-l)?!0:!1},e.math.checkInBoundingCircle=function(e,t,i,r,n,a,o,s){return e=(e-o)/(n+r),t=(t-s)/(a+r),i>=e*e+t*t},e.math.boxInBezierVicinity=function(e,t,i,r,n,a,o,s,l,u,c){var d=.25*n+.5*o+.25*l,p=.25*a+.5*s+.25*u,h=Math.min(e,i)-c,v=Math.min(t,r)-c,f=Math.max(e,i)+c,g=Math.max(t,r)+c;if(n>=h&&f>=n&&a>=v&&g>=a)return 1;if(l>=h&&f>=l&&u>=v&&g>=u)return 1;if(d>=h&&f>=d&&p>=v&&g>=p)return 1;if(o>=h&&f>=o&&s>=v&&g>=s)return 1;var y=Math.min(n,d,l),m=Math.min(a,p,u),x=Math.max(n,d,l),b=Math.max(a,p,u);return y>f||h>x||m>g||v>b?0:1},e.math.checkBezierInBox=function(t,i,r,n,a,o,s,l,u,c){function d(d){var p=e.math.qbezierAt(a,s,u,d),h=e.math.qbezierAt(o,l,c,d);return p>=t&&r>=p&&h>=i&&n>=h}for(var p=0;1>=p;p+=.25)if(!d(p))return!1;return!0},e.math.checkStraightEdgeInBox=function(e,t,i,r,n,a,o,s){return n>=e&&i>=n&&o>=e&&i>=o&&a>=t&&r>=a&&s>=t&&r>=s},e.math.checkStraightEdgeCrossesBox=function(e,t,i,r,n,a,o,s,l){var u,c,d=Math.min(e,i)-l,p=Math.min(t,r)-l,h=Math.max(e,i)+l,v=Math.max(t,r)+l,f=o-n,g=n,y=s-a,m=a;if(Math.abs(f)<1e-4)return n>=d&&h>=n&&Math.min(a,s)<=p&&Math.max(a,s)>=v;var x=(d-g)/f;if(x>0&&1>=x&&(u=y*x+m,u>=p&&v>=u))return!0;var b=(h-g)/f;if(b>0&&1>=b&&(u=y*b+m,u>=p&&v>=u))return!0;var w=(p-m)/y;if(w>0&&1>=w&&(c=f*w+g,c>=d&&h>=c))return!0;var _=(v-m)/y;return _>0&&1>=_&&(c=f*_+g,c>=d&&h>=c)?!0:!1},e.math.checkBezierCrossesBox=function(e,t,i,r,n,a,o,s,l,u,c){var d=Math.min(e,i)-c,p=Math.min(t,r)-c,h=Math.max(e,i)+c,v=Math.max(t,r)+c;if(n>=d&&h>=n&&a>=p&&v>=a)return!0;if(l>=d&&h>=l&&u>=p&&v>=u)return!0;var f=n-2*o+l,g=-2*n+2*o,y=n,m=[];if(Math.abs(f)<1e-4){var x=(d-n)/g,b=(h-n)/g;m.push(x,b)}else{var w,_,E=g*g-4*f*(y-d);if(E>0){var S=Math.sqrt(E);w=(-g+S)/(2*f),_=(-g-S)/(2*f),m.push(w,_)}var P,k,C=g*g-4*f*(y-h);if(C>0){var S=Math.sqrt(C);P=(-g+S)/(2*f),k=(-g-S)/(2*f),m.push(P,k)}}m.sort(function(e,t){return e-t});var D=a-2*s+u,N=-2*a+2*s,T=a,M=[];if(Math.abs(D)<1e-4){var B=(p-a)/N,I=(v-a)/N;M.push(B,I)}else{var z,L,O=N*N-4*D*(T-p);if(O>0){var S=Math.sqrt(O);z=(-N+S)/(2*D),L=(-N-S)/(2*D),M.push(z,L)}var R,X,V=N*N-4*D*(T-v);if(V>0){var S=Math.sqrt(V);R=(-N+S)/(2*D),X=(-N-S)/(2*D),M.push(R,X)}}M.sort(function(e,t){return e-t});for(var Y=0;Y=0&&m[Y]<=1&&m[Y+1]>M[A-1]&&M[A-1]<=1&&m[Y+1]>=0)return!0;return!1},e.math.inLineVicinity=function(e,t,i,r,n,a,o){var s=o,l=Math.min(i,n),u=Math.max(i,n),c=Math.min(r,a),d=Math.max(r,a);return e>=l-s&&u+s>=e&&t>=c-s&&d+s>=t},e.math.inBezierVicinity=function(e,t,i,r,n,a,o,s){var l={x1:Math.min(i,o,n),x2:Math.max(i,o,n),y1:Math.min(r,s,a),y2:Math.max(r,s,a)};return el.x2||tl.y2?!1:!0},e.math.solveCubic=function(e,t,i,r,n){t/=e,i/=e,r/=e;var a,o,s,l,u,c,d,p;return o=(3*i-t*t)/9,s=-(27*r)+t*(9*i-2*t*t),s/=54,a=o*o*o+s*s,n[1]=0,d=t/3,a>0?(u=s+Math.sqrt(a),u=0>u?-Math.pow(-u,1/3):Math.pow(u,1/3),c=s-Math.sqrt(a),c=0>c?-Math.pow(-c,1/3):Math.pow(c,1/3),n[0]=-d+u+c,d+=(u+c)/2,n[4]=n[2]=-d,d=Math.sqrt(3)*(-c+u)/2,n[3]=d,void(n[5]=-d)):(n[5]=n[3]=0,0===a?(p=0>s?-Math.pow(-s,1/3):Math.pow(s,1/3),n[0]=-d+2*p,void(n[4]=n[2]=-(p+d))):(o=-o,l=o*o*o,l=Math.acos(s/Math.sqrt(l)),p=2*Math.sqrt(o),n[0]=-d+p*Math.cos(l/3),n[2]=-d+p*Math.cos((l+2*Math.PI)/3),void(n[4]=-d+p*Math.cos((l+4*Math.PI)/3))))},e.math.sqDistanceToQuadraticBezier=function(e,t,i,r,n,a,o,s){var l=1*i*i-4*i*n+2*i*o+4*n*n-4*n*o+o*o+r*r-4*r*a+2*r*s+4*a*a-4*a*s+s*s,u=9*i*n-3*i*i-3*i*o-6*n*n+3*n*o+9*r*a-3*r*r-3*r*s-6*a*a+3*a*s,c=3*i*i-6*i*n+i*o-i*e+2*n*n+2*n*e-o*e+3*r*r-6*r*a+r*s-r*t+2*a*a+2*a*t-s*t,d=1*i*n-i*i+i*e-n*e+r*a-r*r+r*t-a*t,p=[];this.solveCubic(l,u,c,d,p);for(var h=1e-7,v=[],f=0;6>f;f+=2)Math.abs(p[f+1])=0&&p[f]<=1&&v.push(p[f]);v.push(1),v.push(0);for(var g,y,m,x,b=-1,w=0;w=0?b>x&&(b=x,g=v[w]):(b=x,g=v[w]);return b},e.math.sqDistanceToFiniteLine=function(e,t,i,r,n,a){var o=[e-i,t-r],s=[n-i,a-r],l=s[0]*s[0]+s[1]*s[1],u=o[0]*o[0]+o[1]*o[1],c=o[0]*s[0]+o[1]*s[1],d=c*c/l;return 0>c?u:d>l?(e-n)*(e-n)+(t-a)*(t-a):u-d},e.math.pointInsidePolygon=function(e,t,i,r,n,a,o,s,l){var u=new Array(i.length),c=Math.asin(s[1]/Math.sqrt(s[0]*s[0]+s[1]*s[1]));s[0]<0?c+=Math.PI/2:c=-c-Math.PI/2;for(var d=Math.cos(-c),p=Math.sin(-c),h=0;h0){var f=this.expandPolygon(u,-l);v=this.joinLines(f)}else v=u;for(var g,y,m,x,b,w=0,_=0,h=0;h=e&&e>=m||e>=g&&m>=e))continue;b=(e-g)/(m-g)*(x-y)+y,b>t&&w++,t>b&&_++}return w%2===0?!1:!0},e.math.joinLines=function(e){for(var t,i,r,n,a,o,s,l,u=new Array(e.length/2),c=0;cu)return[];var c=u/l;return[(i-e)*c+e,(r-t)*c+t]},e.math.dotProduct=function(e,t){if(2!=e.length||2!=t.length)throw"dot product: arguments are not vectors";return e[0]*t[0]+e[1]*t[1]},e.math.intersectLineCircle=function(e,t,i,r,n,a,o){var s=[i-e,r-t],l=[n,a],u=[e-n,t-a],c=s[0]*s[0]+s[1]*s[1],d=2*(u[0]*s[0]+u[1]*s[1]),l=u[0]*u[0]+u[1]*u[1]-o*o,p=d*d-4*c*l;if(0>p)return[];var h=(-d+Math.sqrt(p))/(2*c),v=(-d-Math.sqrt(p))/(2*c),f=Math.min(h,v),g=Math.max(h,v),y=[];if(f>=0&&1>=f&&y.push(f),g>=0&&1>=g&&y.push(g),0===y.length)return[];var m=y[0]*s[0]+e,x=y[0]*s[1]+t;if(y.length>1){if(y[0]==y[1])return[m,x];var b=y[1]*s[0]+e,w=y[1]*s[1]+t;return[m,x,b,w]}return[m,x]},e.math.findCircleNearPoint=function(e,t,i,r,n){var a=r-e,o=n-t,s=Math.sqrt(a*a+o*o),l=a/s,u=o/s;return[e+l*i,t+u*i]},e.math.findMaxSqDistanceToOrigin=function(e){for(var t,i=1e-6,r=0;ri&&(i=t);return i},e.math.finiteLinesIntersect=function(e,t,i,r,n,a,o,s,l){var u=(o-n)*(t-a)-(s-a)*(e-n),c=(i-e)*(t-a)-(r-t)*(e-n),d=(s-a)*(i-e)-(o-n)*(r-t);if(0!==d){var p=u/d,h=c/d;return p>=0&&1>=p&&h>=0&&1>=h?[e+p*(i-e),t+p*(r-t)]:l?[e+p*(i-e),t+p*(r-t)]:[]}return 0===u||0===c?[e,i,o].sort()[1]===o?[o,s]:[e,i,n].sort()[1]===n?[n,a]:[n,o,i].sort()[1]===i?[i,r]:[]:[]},e.math.boxIntersectEllipse=function(e,t,i,r,n,a,o,s,l){if(e>i){var u=e;e=i,i=u}if(t>r){var c=t;t=r,r=c}var d=[s-a/2-n,l],p=[s+a/2+n,l],h=[s,l-o/2-n],v=[s,l+o/2+n];return ip[0]?!1:t>v[1]?!1:r=e*e+t*t?!0:1>=i*i+t*t?!0:1>=i*i+r*r?!0:1>=e*e+r*r?!0:!1)},e.math.boxIntersectPolygon=function(t,i,r,n,a,o,s,l,u,c,d){if(t>r){var p=t;t=r,r=p}if(i>n){var h=i;i=n,n=h}var v=new Array(a.length),f=Math.asin(c[1]/Math.sqrt(c[0]*c[0]+c[1]*c[1]));c[0]<0?f+=Math.PI/2:f=-f-Math.PI/2;for(var g=Math.cos(-f),y=Math.sin(-f),m=0;mb&&(b=v[2*m]),v[2*m]_&&(_=v[2*m+1]),v[2*m+1]r)return!1;if(t>b+d)return!1;if(w-d>n)return!1;if(i>_+d)return!1;var E;if(d>0){var S=e.math.expandPolygon(v,-d);E=e.math.joinLines(S)}else E=v;for(var m=0;m0)return!0;if(e.math.finiteLinesIntersect(C,D,P,k,t,n,r,n,!1).length>0)return!0;if(e.math.finiteLinesIntersect(C,D,P,k,t,i,t,n,!1).length>0)return!0;if(e.math.finiteLinesIntersect(C,D,P,k,r,i,r,n,!1).length>0)return!0}return!1},e.math.polygonIntersectLine=function(t,i,r,n,a,o,s,l){for(var u,c=[],d=new Array(r.length),p=0;p0){var v=e.math.expandPolygon(d,-l);h=e.math.joinLines(v)}else h=d;for(var f,g,y,m,p=0;pa&&(a=1e-5),[t[0]+a*r[0],t[1]+a*r[1]]},e.math.generateUnitNgonPointsFitToSquare=function(t,i){var r=e.math.generateUnitNgonPoints(t,i);return r=e.math.fitPolygonToSquare(r)},e.math.fitPolygonToSquare=function(e){for(var t,i,r=e.length/2,n=1/0,a=1/0,o=-1/0,s=-1/0,l=0;r>l;l++)t=e[2*l],i=e[2*l+1],n=Math.min(n,t),o=Math.max(o,t),a=Math.min(a,i),s=Math.max(s,i);for(var u=2/(o-n),c=2/(s-a),l=0;r>l;l++)t=e[2*l]=e[2*l]*u,i=e[2*l+1]=e[2*l+1]*c,n=Math.min(n,t),o=Math.max(o,t),a=Math.min(a,i),s=Math.max(s,i);if(-1>a)for(var l=0;r>l;l++)i=e[2*l+1]=e[2*l+1]+(-1-a);return e},e.math.generateUnitNgonPoints=function(e,t){var i=1/e*2*Math.PI,r=e%2===0?Math.PI/2+i/2:Math.PI/2;r+=t;for(var n,a,o,s=new Array(2*e),l=0;e>l;l++)n=l*i+r,a=s[2*l]=Math.cos(n),o=s[2*l+1]=Math.sin(-n);return s},e.math.getRoundRectangleRadius=function(e,t){return Math.min(e/4,t/4,8)}}(cytoscape),function(e){"use strict";function t(t,i,r){var n={};switch(n[i]=r,t){case"core":case"collection":e.fn[t](n)}if("layout"===t){for(var o=r.prototype,s=["stop"],l=0;ld;d++)n.canSet(s[d])&&(s[d]._private[n.field][i]=r);n.updateStyle&&a.updateStyle(),n.onSet(a),n.settingTriggersEvent&&a[n.triggerFnName](n.settingEvent)}}}else if(n.allowSetting&&e.is.plainObject(i)){var h,v,f=i;for(h in f){v=f[h];var c=!n.immutableKeys[h];if(c)for(var d=0,p=s.length;p>d;d++)n.canSet(s[d])&&(s[d]._private[n.field][h]=v)}n.updateStyle&&a.updateStyle(),n.onSet(a),n.settingTriggersEvent&&a[n.triggerFnName](n.settingEvent)}else if(n.allowBinding&&e.is.fn(i)){var g=i;a.bind(n.bindingEvent,g)}else if(n.allowGetting&&void 0===i){var u;return l&&(u=l._private[n.field]),u}return a}},removeData:function(t){var i={field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!1,immutableKeys:{}};return t=e.util.extend({},i,t),function(i){var r=t,n=this,a=void 0!==n.length,o=a?n:[n];if(e.is.string(i)){for(var s=i.split(/\s+/),l=s.length,u=0;l>u;u++){var c=s[u];if(!e.is.emptyString(c)){var d=!r.immutableKeys[c];if(d)for(var p=0,h=o.length;h>p;p++)o[p]._private[r.field][c]=void 0}}r.triggerEvent&&n[r.triggerFnName](r.event)}else if(void 0===i){for(var p=0,h=o.length;h>p;p++){var v=o[p]._private[r.field];for(var c in v){var f=!r.immutableKeys[c];f&&(v[c]=void 0)}}r.triggerEvent&&n[r.triggerFnName](r.event)}return n}},event:{regex:/(\w+)(\.\w+)?/,optionalTypeRegex:/(\w+)?(\.\w+)?/,falseCallback:function(){return!1}},on:function(t){var i={unbindSelfOnTrigger:!1,unbindAllBindersOnTrigger:!1};return t=e.util.extend({},i,t),function(i,r,n,a){var o=this,s=void 0!==o.length,l=s?o:[o],u=e.is.string(i),c=t;if(e.is.plainObject(r)?(a=n,n=r,r=void 0):(e.is.fn(r)||r===!1)&&(a=r,n=void 0,r=void 0),(e.is.fn(n)||n===!1)&&(a=n,n=void 0),!e.is.fn(a)&&a!==!1&&u)return o;if(u){var d={};d[i]=a,i=d}for(var p in i)if(a=i[p],a===!1&&(a=e.define.event.falseCallback),e.is.fn(a)){p=p.split(/\s+/);for(var h=0;h0:void 0}},clearQueue:function(t){var i={};return t=e.util.extend({},i,t),function(){var e=this,t=void 0!==e.length,i=t?e:[e],r=this._private.cy||this;if(!r.styleEnabled())return this;for(var n=0;n\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:'"(?:\\\\"|[^"])+"|'+"'(?:\\\\'|[^'])+'",number:e.util.regex.number,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$"};s.variable="(?:[\\w-]|(?:\\\\"+s.metaChar+"))+",s.value=s.string+"|"+s.number,s.className=s.variable,s.id=s.variable;for(var l=function(e){return e.replace(new RegExp("\\\\("+s.metaChar+")","g"),function(e,t){return t})},u=s.comparatorOp.split("|"),c=0;c=0||"="!==d&&(s.comparatorOp+="|\\!"+d)}var p={group:{query:!0,regex:"(node|edge|\\*)",populate:function(e){this.group="*"==e?e:e+"s"}},state:{query:!0,regex:"(:selected|:unselected|:locked|:unlocked|:visible|:hidden|:transparent|:grabbed|:free|:removed|:inside|:grabbable|:ungrabbable|:animated|:unanimated|:selectable|:unselectable|:orphan|:nonorphan|:parent|:child|:loop|:simple|:active|:inactive|:touch)",populate:function(e){this.colonSelectors.push(e)}},id:{query:!0,regex:"\\#("+s.id+")",populate:function(e){this.ids.push(l(e))}},className:{query:!0,regex:"\\.("+s.className+")",populate:function(e){this.classes.push(l(e))}},dataExists:{query:!0,regex:"\\[\\s*("+s.variable+")\\s*\\]",populate:function(e){this.data.push({field:l(e)})}},dataCompare:{query:!0,regex:"\\[\\s*("+s.variable+")\\s*("+s.comparatorOp+")\\s*("+s.value+")\\s*\\]",populate:function(e,t,i){var r=null!=new RegExp("^"+s.string+"$").exec(i);i=r?i.substring(1,i.length-1):parseFloat(i),this.data.push({field:l(e),operator:t,value:i})}},dataBool:{query:!0,regex:"\\[\\s*("+s.boolOp+")\\s*("+s.variable+")\\s*\\]",populate:function(e,t){this.data.push({field:l(t),operator:e})}},metaCompare:{query:!0,regex:"\\[\\[\\s*("+s.meta+")\\s*("+s.comparatorOp+")\\s*("+s.number+")\\s*\\]\\]",populate:function(e,t,i){this.meta.push({field:l(e),operator:t,value:parseFloat(i)})}},nextQuery:{separator:!0,regex:s.separator,populate:function(){r[++c]=o(),a=null}},child:{separator:!0,regex:s.child,populate:function(){var e=o();e.parent=this,e.subject=a,r[c]=e}},descendant:{separator:!0,regex:s.descendant,populate:function(){var e=o();e.ancestor=this,e.subject=a,r[c]=e}},subject:{modifier:!0,regex:s.subject,populate:function(){return null!=a&&this.subject!=this?(e.util.error("Redefinition of subject in selector `"+i+"`"),!1):(a=this,void(this.subject=this))}}},h=0;for(var v in p)p[h]=p[v],p[h].name=v,h++;p.length=h,r._private.selectorText=i;var f=i,c=0,g=function(t){for(var i,r,n,a=0;a=0&&(d=d.toLowerCase(),p=p.toLowerCase(),s=s.replace("@",""),h=!0);var v=!1,f=!1;switch(s.indexOf("!")>=0&&(s=s.replace("!",""),v=!0),h&&(l=p.toLowerCase(),c=d.toLowerCase()),s){case"*=":a=d.search(p)>=0;break;case"$=":a=null!=new RegExp(p+"$").exec(d);break;case"^=":a=null!=new RegExp("^"+p).exec(d);break;case"=":a=c===l;break;case"!=":a=c!==l;break;case">":a=v?l>=c:c>l,f=!0;break;case">=":a=v?l>c:c>=l,f=!0;break;case"<":a=v?c>=l:l>c,f=!0;break;case"<=":a=v?c>l:l>=c,f=!0;break;default:a=!1}}else if(null!=s)switch(s){case"?":a=t.fieldTruthy(u);break;case"!":a=!t.fieldTruthy(u);break;case"^":a=t.fieldUndefined(u)}else a=!t.fieldUndefined(u);if(v&&!f&&(a=!a,f=!0),!a){r=!1;break}}return r},v=h({name:"data",fieldValue:function(e){return r._private.data[e]},fieldRef:function(e){return"element._private.data."+e},fieldUndefined:function(e){return void 0===r._private.data[e]},fieldTruthy:function(e){return r._private.data[e]?!0:!1}});if(!v)return!1;var f=h({name:"meta",fieldValue:function(e){return r[e]()},fieldRef:function(e){return"element."+e+"()"},fieldUndefined:function(e){return null==r[e]()},fieldTruthy:function(e){return r[e]()?!0:!1}});if(!f)return!1;if(null!=i.collection){var g=null!=i.collection._private.ids[r.id()];if(!g)return!1}if(null!=i.filter&&0===r.collection().filter(i.filter).size())return!1;var y=function(e,i){if(null!=e){var r=!1;if(!n.hasCompoundNodes())return!1;i=i();for(var a=0;a "+t),null!=e.ancestor&&(t=r(e.ancestor)+" "+t),null!=e.child&&(t+=" > "+r(e.child)),null!=e.descendant&&(t+=" "+r(e.descendant)),t},n=0;n1&&n node").css({width:"auto",height:"auto",shape:"rectangle","background-opacity":.5,"padding-top":10,"padding-right":10,"padding-left":10,"padding-bottom":10}).selector("edge").css({width:1}).selector(":active").css({"overlay-color":"black","overlay-padding":10,"overlay-opacity":.25}).selector("core").css({"selection-box-color":"#ddd","selection-box-opacity":.65,"selection-box-border-color":"#aaa","selection-box-border-width":1,"active-bg-color":"black","active-bg-opacity":.15,"active-bg-size":e.is.touch()?40:15,"outside-texture-bg-color":"#000","outside-texture-bg-opacity":.125})},e.styfn.clear=function(){for(var e=0;el.max)return null;var P={name:t,value:i,strValue:""+i+(x?x:""),units:x,bypass:r,hasPie:t.match(/pie-(\d+)-background-size/)&&null!=i&&0!==i&&""!==i};return l.unitless||"px"!==x&&"em"!==x||(P.pxValue="px"!==x&&x?this.getEmSizeInPixels()*i:i),("ms"===x||"s"===x)&&(P.msValue="ms"===x?i:1e3*i),P}if(l.propList){var k=[],C=""+i;if("none"===C);else{for(var D=C.split(","),E=0;E0){a=!0;break}}i.hasPie=a;var l=n["text-transform"].strValue,u=n.content.strValue,c=n["font-style"].strValue,s=n["font-size"].pxValue+"px",d=n["font-family"].strValue,p=n["font-weight"].strValue,h=n["text-valign"].strValue,v=n["text-valign"].strValue,f=n["text-outline-width"].pxValue;i.labelKey=c+"$"+s+"$"+d+"$"+p+"$"+u+"$"+l+"$"+h+"$"+v+"$"+f,i.fontKey=c+"$"+p+"$"+s+"$"+d;var g=n.width.pxValue,y=n.height.pxValue,m=n["border-width"].pxValue;if(i.boundingBoxKey=g+"$"+y+"$"+m,"edges"===t._private.group){var x=n["control-point-step-size"].pxValue,b=n["control-point-distance"]?n["control-point-distance"].pxValue:void 0,w=n["control-point-weight"].value,_=n["curve-style"].strValue;i.boundingBoxKey+="$"+x+"$"+b+"$"+w+"$"+_}i.styleKey=Date.now()},e.styfn.applyParsedProperty=function(t,i){var r,n,a=i,o=t._private.style,s=e.style.properties[a.name].type,l=a.bypass,u=o[a.name],c=u&&u.bypass;if(("height"===i.name||"width"===i.name)&&"auto"===i.value&&t.isNode()&&!t.isParent())return!1;if(l&&a.deleteBypass){var d=o[a.name];return d?d.bypass&&d.bypassed?(o[a.name]=d.bypassed,!0):!1:!0}switch(a.mapped){case e.style.types.mapData:case e.style.types.mapLayoutData:for(var p=a.mapped===e.style.types.mapLayoutData,h=a.field.split("."),r=p?t._private.layoutData:t._private.data,v=0;vg?g=0:g>1&&(g=1),s.color){var y=a.valueMin[0],m=a.valueMax[0],x=a.valueMin[1],b=a.valueMax[1],w=a.valueMin[2],_=a.valueMax[2],E=null==a.valueMin[3]?1:a.valueMin[3],S=null==a.valueMax[3]?1:a.valueMax[3],P=[Math.round(y+(m-y)*g),Math.round(x+(b-x)*g),Math.round(w+(_-w)*g),Math.round(E+(S-E)*g)];n={bypass:a.bypass,name:a.name,value:P,strValue:"rgb("+P[0]+", "+P[1]+", "+P[2]+")"}}else{if(!s.number)return!1;var k=a.valueMin+(a.valueMax-a.valueMin)*g;n=this.parse(a.name,k,a.bypass,!0)}n||(n=this.parse(a.name,u.strValue,a.bypass,!0)),n.mapping=a,a=n;break;case e.style.types.data:case e.style.types.layoutData:for(var p=a.mapped===e.style.types.layoutData,h=a.field.split("."),r=p?t._private.layoutData:t._private.data,v=0;v0&&s>0){for(var c=!1,d=0;d0&&t.delay(l),t.animate({css:u},{duration:s,queue:!1,complete:function(){r||n.removeBypasses(t,o),t._private.transitioning=!1}})}else t._private.transitioning&&(t.stop(),this.removeBypasses(t,o),t._private.transitioning=!1)}}(cytoscape),function(e){"use strict";e.styfn.applyBypass=function(t,i,r,n){var a=[],o=!0;if("*"===i||"**"===i){if(void 0!==r)for(var s=0;sa.length?l.substr(a.length):""}function n(){o=o.length>s.length?o.substr(s.length):""}var a,o,s,l=""+i;for(l=l.replace(/[/][*](\s|.)+?[*][/]/g,"");;){var u=l.match(/^\s*$/);if(u)break;var c=l.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!c){e.util.error("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+l);break}a=c[0];var d=c[1],p=new e.Selector(d);if(p._private.invalid)e.util.error("Skipping parsing of block: Invalid selector found in string stylesheet: "+d),r();else{var h=c[2],v=!1;o=h;for(var f=[];;){var u=o.match(/^\s*$/);if(u)break;var g=o.match(/^\s*(.+?)\s*:\s*(.+?)\s*;/);if(!g){e.util.error("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+h),v=!0;break}s=g[0];var y=g[1],m=g[2],x=e.style.properties[y];if(x){var b=t.parse(y,m);b?(f.push({name:y,val:m}),n()):(e.util.error("Skipping property: Invalid property definition in: "+s),n())}else e.util.error("Skipping property: Invalid property name in: "+s),n()}if(v){r();break}t.selector(d);for(var w=0;w0?c.wheelSensitivity:1,motionBlur:c.motionBlur,pixelRatio:e.is.number(c.pixelRatio)&&c.pixelRatio>0?c.pixelRatio:void 0},c.renderer)),c.initrender&&(a.on("initrender",c.initrender),a.on("initrender",function(){a._private.initrender=!0})),a.load(c.elements,function(){a.startAnimationLoop(),a._private.ready=!0,e.is.fn(c.ready)&&a.on("ready",c.ready);for(var t=0;t0;)r.shift()();i.deferredTimeout=null},0))}})}(cytoscape,"undefined"==typeof window?null:window),function(e,t){"use strict";function i(e){var t=!document||"interactive"!==document.readyState&&"complete"!==document.readyState?i:e;setTimeout(t,9,e)}e.fn.core({add:function(t){var i,r=this;if(e.is.elementOrCollection(t)){var n=t;if(n._private.cy===r)i=n.restore();else{for(var a=[],o=0;oo;o++){var d=u[o],p=l[d];if(e.is.array(p))for(var h=0,v=p.length;v>h;h++){var f=p[h];f.group=d,a.push(f)}}i=new e.Collection(r,a)}else{var f=t;i=new e.Element(r,f).collection()}return i},remove:function(t){if(e.is.elementOrCollection(t))t=t;else if(e.is.string(t)){var i=t;t=this.$(i)}return t.remove()},load:function(r,n,a){function o(){s.one("layoutready",function(e){s.notifications(!0),s.trigger(e),s.notify({type:"load",collection:s.elements()}),s.one("load",n),s.trigger("load")}).one("layoutstop",function(){s.one("done",a),s.trigger("done")});var t=e.util.extend({},s._private.options.layout);t.eles=s.$(),s.layout(t)}var s=this,l=s.elements();return l.length>0&&l.remove(),s.notifications(!1),null!=r&&(e.is.plainObject(r)||e.is.array(r))&&s.add(r),t?i(o):o(),this}})}(cytoscape,"undefined"==typeof window?null:window),function(e,t){"use strict";e.fn.core({animated:e.define.animated(),clearQueue:e.define.clearQueue(),delay:e.define.delay(),animate:e.define.animate(),stop:e.define.stop(),addToAnimationPool:function(e){var t=this;t.styleEnabled()&&t._private.aniEles.merge(e)},startAnimationLoop:function(){function i(){e.util.requestAnimationFrame(function(e){r(e),i()})}function r(t){function i(i,r){var s=i._private.animation.current,l=i._private.animation.queue,u=!1;if(0===s.length){var c=l.length>0?l.shift():null;c&&(c.callTime=t,s.push(c))}for(var d=[],p=s.length-1;p>=0;p--){var h=s[p];h.started||n(i,h),a(i,h,t,r),h.done&&(d.push(h),s.splice(p,1)),u=!0}for(var p=0;p0||c){var d;if(r.length>0){var p=r.updateCompoundBounds();d=p.length>0?r.add(p):r}l.notify({type:"draw",collection:d})}r.unmerge(o)}function n(t,i){var r=e.is.core(t),n=!r,a=t,o=l._private.style;if(n)var s=a._private.position,u={x:s.x,y:s.y},c=o.getValueStyle(a);if(r)var d=l._private.pan,p={x:d.x,y:d.y},h=l._private.zoom;i.started=!0,i.startTime=Date.now(),i.startPosition=u,i.startStyle=c,i.startPan=p,i.startZoom=h}function a(t,i,r,n){var a,u=l._private.style,c=i.properties,d=i.params,p=i.startTime,h=!n;if(a=0===i.duration?1:Math.min(1,(r-p)/i.duration),0>a?a=0:a>1&&(a=1),null==c.delay){var v=i.startPosition,f=c.position,g=t._private.position;f&&h&&(o(v.x,f.x)&&(g.x=s(v.x,f.x,a)),o(v.y,f.y)&&(g.y=s(v.y,f.y,a)));var y=i.startPan,m=c.pan,x=t._private.pan,b=null!=m&&n;b&&(o(y.x,m.x)&&(x.x=s(y.x,m.x,a)),o(y.y,m.y)&&(x.y=s(y.y,m.y,a)),t.trigger("pan"));var w=i.startZoom,_=c.zoom,E=null!=_&&n;if(E&&(o(w,_)&&(t._private.zoom=s(w,_,a)),t.trigger("zoom")),(b||E)&&t.trigger("viewport"),c.css&&h)for(var S=c.css,P=0;P=1&&(i.done=!0),a}function o(t,i){return null==t||null==i?!1:e.is.number(t)&&e.is.number(i)?!0:t&&i?!0:!1}function s(t,i,r){0>r?r=0:r>1&&(r=1);var n,a;if(n=null!=t.pxValue||null!=t.value?null!=t.pxValue?t.pxValue:t.value:t,a=null!=i.pxValue||null!=i.value?null!=i.pxValue?i.pxValue:i.value:i,e.is.number(n)&&e.is.number(a))return n+(a-n)*r;if(e.is.number(n[0])&&e.is.number(a[0])){var o=n,s=a,l=function(e,t){var i=t-e,n=e;return Math.round(r*i+n)},u=l(o[0],s[0]),c=l(o[1],s[1]),d=l(o[2],s[2]);return[u,c,d]}return void 0}var l=this;l.styleEnabled()&&t&&i()}})}(cytoscape,"undefined"==typeof window?null:window),function(e){"use strict";e.fn.core({data:e.define.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0}),removeData:e.define.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0}),scratch:e.define.data({field:"scratch",allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!0}),removeScratch:e.define.removeData({field:"scratch",triggerEvent:!1})})}(cytoscape),function(e){"use strict";e.fn.core({on:e.define.on(),one:e.define.on({unbindSelfOnTrigger:!0}),once:e.define.on({unbindAllBindersOnTrigger:!0}),off:e.define.off(),trigger:e.define.trigger()}),e.corefn.bind=e.corefn.on,e.corefn.unbind=e.corefn.off}(cytoscape),function(e){"use strict";e.fn.core({png:function(e){var t=this._private.renderer;return e=e||{},t.png(e)}})}(cytoscape),function(e){"use strict";e.fn.core({layout:function(e){var t=this._private.prevLayout=null==e?this._private.prevLayout:this.initLayout(e);return t.run(),this},makeLayout:function(e){return this.initLayout(e)},initLayout:function(t){if(null==t)return void e.util.error("Layout options must be specified to make a layout");if(null==t.name)return void e.util.error("A `name` must be specified to make a layout");var i=t.name,r=e.extension("layout",i);if(null==r)return void e.util.error("Can not apply layout: No such layout `"+i+"` found; did you include its JS file?");t.eles=null!=t.eles?t.eles:this.$(),e.is.string(t.eles)&&(t.eles=this.$(t.eles));var n=new r(e.util.extend({},t,{cy:this}));return e.is.plainObject(n._private)||(n._private={}),n._private.cy=this,n._private.listeners=[],n}})}(cytoscape),function(e){"use strict";e.fn.core({notify:function(e){if(this._private.batchingNotify){var t=this._private.batchNotifyEles,i=this._private.batchNotifyTypes;if(e.collection)for(var r=0;r0&&l>0&&!isNaN(r.w)&&!isNaN(r.h)&&r.w>0&&r.h>0){o=Math.min((s-2*i)/r.w,(l-2*i)/r.h),o=o>this._private.maxZoom?this._private.maxZoom:o,o=othis._private.maxZoom?this._private.maxZoom:r,r=ri.maxZoom||!i.zoomingEnabled?o=!0:(i.zoom=l,a.push("zoom"))}if(n&&(!o||!t.cancelOnFailedZoom)&&i.panningEnabled){var u=t.pan;e.is.number(u.x)&&(i.pan.x=u.x,s=!1),e.is.number(u.y)&&(i.pan.y=u.y,s=!1),s||a.push("pan")}return a.length>0&&(a.push("viewport"),this.trigger(a.join(" ")),this.notify({type:"viewport"})),this},center:function(e){var t=this.getCenterPan(e);return t&&(this._private.pan=t,this.trigger("pan viewport"),this.notify({type:"viewport"})),this},getCenterPan:function(t){if(this._private.panningEnabled){if(e.is.string(t)){var i=t;t=this.elements(i)}else e.is.elementOrCollection(t)||(t=this.elements());var r=t.boundingBox(),n=this.width(),a=this.height(),o=this._private.zoom,s={x:(n-o*(r.x1+r.x2))/2,y:(a-o*(r.y1+r.y2))/2};return s}},reset:function(){return this._private.panningEnabled&&this._private.zoomingEnabled?(this.viewport({pan:{x:0,y:0},zoom:1}),this):this},width:function(){var e=this._private.container;return e?e.clientWidth:1},height:function(){var e=this._private.container;return e?e.clientHeight:1},extent:function(){var e=this._private.pan,t=this._private.zoom,i=this.renderedExtent(),r={x1:(i.x1-e.x)/t,x2:(i.x2-e.x)/t,y1:(i.y1-e.y)/t,y2:(i.y2-e.y)/t};return r.w=r.x2-r.x1,r.h=r.y2-r.y1,r},renderedExtent:function(){var e=this.width(),t=this.height();return{x1:0,y1:0,x2:e,y2:t,w:e,h:t}}}),e.corefn.centre=e.corefn.center,e.corefn.autolockNodes=e.corefn.autolock,e.corefn.autoungrabifyNodes=e.corefn.autoungrabifyNodes}(cytoscape),function(e){"use strict";e.fn.collection=e.fn.eles=function(t){for(var i in t){var r=t[i];e.Collection.prototype[i]=r}};var t={prefix:{nodes:"n",edges:"e"},id:{nodes:0,edges:0},generate:function(t,i,r){var n=e.is.element(i)?i._private:i,a=n.group,o=null!=r?r:this.prefix[a]+this.id[a];if(t.getElementById(o).empty())this.id[a]++;else for(;!t.getElementById(o).empty();)o=this.prefix[a]+ ++this.id[a];return o}};e.Element=function(t,i,r){if(!(this instanceof e.Element))return new e.Element(t,i,r);var n=this;if(r=void 0===r||r?!0:!1,void 0===t||void 0===i||!e.is.core(t))return void e.util.error("An element must have a core reference and parameters set");if("nodes"!==i.group&&"edges"!==i.group)return void e.util.error("An element must be of type `nodes` or `edges`; you specified `"+i.group+"`");if(this.length=1,this[0]=this,this._private={cy:t,single:!0,data:i.data||{},layoutData:{},position:i.position||{},autoWidth:void 0,autoHeight:void 0,listeners:[],group:i.group,style:{},rstyle:{},styleCxts:[],removed:!0,selected:i.selected?!0:!1,selectable:void 0===i.selectable?!0:i.selectable?!0:!1,locked:i.locked?!0:!1,grabbed:!1,grabbable:void 0===i.grabbable?!0:i.grabbable?!0:!1,active:!1,classes:{},animation:{current:[],queue:[]},rscratch:{},scratch:{},edges:[],children:[]},i.renderedPosition){var a=i.renderedPosition,o=t.pan(),s=t.zoom();this._private.position={x:(a.x-o.x)/s,y:(a.y-o.y)/s}}if(e.is.string(i.classes))for(var l=i.classes.split(/\s+/),u=0,c=l.length;c>u;u++){var d=l[u];d&&""!==d&&(n._private.classes[d]=!0)}i.css&&t.style().applyBypass(this,i.css),(void 0===r||r)&&this.restore()},e.Collection=function(i,r,n){if(!(this instanceof e.Collection))return new e.Collection(i,r);if(void 0===i||!e.is.core(i))return void e.util.error("A collection must have a reference to the core");var a={},o={},s=!1;if(r){if(r.length>0&&e.is.plainObject(r[0])&&!e.is.element(r[0])){s=!0;for(var l=[],u={},c=0,d=r.length;d>c;c++){var p=r[c];null==p.data&&(p.data={});var h=p.data;if(null==h.id)h.id=t.generate(i,p);else if(0!==i.getElementById(h.id).length||u[h.id])continue;var v=new e.Element(i,p,!1);l.push(v),u[h.id]=!0}r=l}}else r=[];this.length=0;for(var c=0,d=r.length;d>c;c++){var f=r[c];if(f){var g=f._private.data.id;(!n||n.unique&&!a[g])&&(a[g]=f,o[g]=this.length,this[this.length]=f,this.length++)}}this._private={cy:i,ids:a,indexes:o},s&&this.restore()},e.elefn=e.elesfn=e.Element.prototype=e.Collection.prototype,e.elesfn.cy=function(){return this._private.cy},e.elesfn.element=function(){return this[0]},e.elesfn.collection=function(){return e.is.collection(this)?this:new e.Collection(this._private.cy,[this])},e.elesfn.unique=function(){return new e.Collection(this._private.cy,this,{unique:!0})},e.elesfn.getElementById=function(t){var i=this._private.cy,r=this._private.ids[t];return r?r:e.Collection(i)},e.elesfn.json=function(){var t=this.element();if(null==t)return void 0;var i=t._private,r=e.util.copy({data:i.data,position:i.position,group:i.group,bypass:i.bypass,removed:i.removed,selected:i.selected,selectable:i.selectable,locked:i.locked,grabbed:i.grabbed,grabbable:i.grabbable,classes:""}),n=[];for(var a in i.classes)n.push(a);for(var o=0;od;d++){var h=r[d];h.isNode()?(s.push(h),u++):(l.push(h),c++)}o=s.concat(l);for(var d=0,p=o.length;p>d;d++){var h=o[d];if(h.removed()){var v=h._private,f=v.data;if(void 0===f.id)f.id=t.generate(a,h);else{if(e.is.emptyString(f.id)||!e.is.string(f.id)){e.util.error("Can not create element with invalid string ID `"+f.id+"`");continue}if(0!==a.getElementById(f.id).length){e.util.error("Can not create second element with ID `"+f.id+"`");continue}}var g=f.id;if(h.isEdge()){for(var y=h,m=["source","target"],x=m.length,b=!1,w=0;x>w;w++){var _=m[w],E=f[_];null==E||""===E?(e.util.error("Can not create edge `"+g+"` with unspecified "+_),b=!0):a.getElementById(E).empty()&&(e.util.error("Can not create edge `"+g+"` with nonexistant "+_+" `"+E+"`"),b=!0)}if(b)continue;var S=a.getElementById(f.source),P=a.getElementById(f.target);S._private.edges.push(y),P._private.edges.push(y),y._private.source=S,y._private.target=P}v.ids={},v.ids[g]=h,v.removed=!1,a.addToPool(h),n.push(h)}}for(var d=0;u>d;d++){var k=o[d],f=k._private.data,C=k._private.data.parent,D=null!=C;if(D){var N=a.getElementById(C);if(N.empty())f.parent=void 0;else{for(var T=!1,M=N;!M.empty();){if(k.same(M)){T=!0,f.parent=void 0;break}M=M.parent()}T||(N[0]._private.children.push(k),k._private.parent=N[0],a._private.hasCompoundNodes=!0)}}}if(n=new e.Collection(a,n),n.length>0){var B=n.add(n.connectedNodes()).add(n.parent());B.updateStyle(i),i?n.rtrigger("add"):n.trigger("add")}return r},e.elesfn.removed=function(){var e=this[0];return e&&e._private.removed},e.elesfn.inside=function(){var e=this[0];return e&&!e._private.removed},e.elesfn.remove=function(t){function i(e){for(var t=e._private.edges,i=0;ip;p++){var v=s[p];n(v)}for(var p=0;p0&&(t&&this.cy().notify({type:"remove",collection:x}),x.trigger("remove"));for(var b={},p=0;p0,a=t.getElementById(r).length>0;if(n||a){var o=this.jsons();this.remove();for(var s=0;s0;if(c){var o=this.jsons();this.remove();for(var s=0;su||!n)&&(o=u,n=l)}return{edge:n,dist:o}};f.size()>0;){var y=f.pop(),m=y.value,x=y.id,b=a.getElementById(x);if(u[x]=m,m===Math.Infinite)break;for(var w=b.neighborhood().intersect(d),h=0;h0)for(r.unshift(i);l[n.id()];){var o=l[n.id()];r.unshift(o.edge),r.unshift(o.node),n=o.node}return new e.Collection(a,r)}}}}),e.elesfn.bfs=e.elesfn.breadthFirstSearch,e.elesfn.dfs=e.elesfn.depthFirstSearch,e.elesfn.stdBfs=e.elesfn.stdBreadthFirstSearch,e.elesfn.stdDfs=e.elesfn.stdDepthFirstSearch}(cytoscape),function(e){"use strict";e.fn.eles({aStar:function(t){t=t||{};var i=function(){a&&console.log.apply(console,arguments)},r=function(e,t,i,n){if(e==t)return n.push(o.getElementById(t)),n;if(t in i){var a=i[t],s=f[t];return n.push(o.getElementById(t)),n.push(o.getElementById(s)),r(e,a,i,n)}return void 0},n=function(e,t){if(0===e.length)return void 0;for(var i=0,r=t[e[0]],n=1;na&&(r=a,i=n)}return i};if(null!=t.debug)var a=t.debug;else var a=!1;i("Starting aStar...");var o=this._private.cy;if(null==t||null==t.root)return void 0;var s=e.is.string(t.root)?this.filter(t.root)[0]:t.root[0];if(i("Source node: %s",s.id()),null==t.goal)return void 0;var l=e.is.string(t.goal)?this.filter(t.goal)[0]:t.goal[0];if(i("Target node: %s",l.id()),null!=t.heuristic&&e.is.fn(t.heuristic))var u=t.heuristic;else var u=function(){return 0};if(null!=t.weight&&e.is.fn(t.weight))var c=t.weight;else var c=function(){return 1};if(null!=t.directed)var d=t.directed;else var d=!1;var p=[],h=[s.id()],v={},f={},g={},y={};g[s.id()]=0,y[s.id()]=u(s);for(var m=this.edges().not(":loop"),x=this.nodes(),b=0;h.length>0;){var w=n(h,y),_=this.filter("#"+h[w])[0];if(b++,i("\nStep: %s",b),i("Processing node: %s, fScore = %s",_.id(),y[_.id()]),_.id()==l.id()){i("Found goal node!");var E=r(s.id(),l.id(),v,[]);return E.reverse(),i("Path: %s",E),{found:!0,distance:g[_.id()],path:new e.Collection(o,E),steps:b}}p.push(_.id()),h.splice(w,1),i("Added node to closedSet, removed from openSet."),i("Processing neighbors...");for(var S=_.connectedEdges(d?'[source = "'+_.id()+'"]':void 0).intersect(m),P=0;Pd;d++)c[l[d].id()]=d;for(var p=[],d=0;u>d;d++){for(var h=new Array(u),v=0;u>v;v++)h[v]=d==v?0:1/0;p.push(h)}var f=[],g=[],y=function(e){for(var t=0;u>t;t++){for(var i=new Array(u),r=0;u>r;r++)i[r]=void 0;e.push(i)}};y(f),y(g);for(var d=0;db&&(p[m][x]=b,f[m][x]=x,g[m][x]=s[d])}if(!o)for(var d=0;db&&(p[m][x]=b,f[m][x]=x,g[m][x]=s[d])}for(var w=0;u>w;w++)for(var d=0;u>d;d++)for(var v=0;u>v;v++)p[d][w]+p[w][v]d;d++)_.push(l[d].id());var E={distance:function(t,i){if(e.is.string(t))var r=n.filter(t)[0].id();else var r=t.id();if(e.is.string(i))var a=n.filter(i)[0].id();else var a=i.id();return p[c[r]][c[a]]},path:function(t,i){var r=function(e,t,i,r,a){if(e===t)return n.getElementById(r[e]);if(void 0===i[e][t])return void 0;for(var o=[n.getElementById(r[e])],s=e;e!==t;){s=e,e=i[e][t];var l=a[s][e];o.push(l),o.push(n.getElementById(r[e]))}return o};if(e.is.string(t))var a=n.filter(t)[0].id();else var a=t.id();if(e.is.string(i))var o=n.filter(i)[0].id();else var o=i.id();var s=r(c[a],c[o],f,_,g);return new e.Collection(n,s)}};return E},bellmanFord:function(t){t=t||{};var i=function(){r&&console.log.apply(console,arguments)};if(null!=t.debug)var r=t.debug;else var r=!1;if(i("Starting bellmanFord..."),null!=t.weight&&e.is.fn(t.weight))var n=t.weight;else var n=function(){return 1};if(null!=t.directed)var a=t.directed;else var a=!1;if(null==t.root)return void e.util.error("options.root required");if(e.is.string(t.root))var o=this.filter(t.root)[0];else var o=t.root[0];i("Source node: %s",o.id());for(var s=this._private.cy,l=this.edges().not(":loop"),u=this.nodes(),c=u.length,d={},p=0;c>p;p++)d[u[p].id()]=p;for(var h=[],v=[],f=[],p=0;c>p;p++)h[p]=u[p].id()===o.id()?0:1/0,v[p]=void 0;for(var g=!1,p=1;c>p;p++){g=!1;for(var y=0;yp;p++)_.push(u[p].id());var E={distanceTo:function(t){if(e.is.string(t))var i=s.filter(t)[0].id();else var i=t.id();return h[d[i]]},pathTo:function(t){var i=function(e,t,i,r,n,a){for(;;){if(n.push(s.getElementById(r[i])),n.push(a[i]),t===i)return n;var o=e[i];if("undefined"==typeof o)return void 0;i=o}};if(e.is.string(t))var r=s.filter(t)[0].id();else var r=t.id();var n=[],a=i(v,d[o.id()],d[r],_,n,f);return null!=a&&a.reverse(),new e.Collection(s,a)},hasNegativeWeightCycle:!1};return E},kargerStein:function(t){t=t||{};var i=function(){a&&console.log.apply(console,arguments)},r=function(e,t,i){for(var r=i[e],n=r[1],a=r[2],o=t[n],s=t[a],l=i.filter(function(e){return t[e[1]]===o&&t[e[2]]===s?!1:t[e[1]]===s&&t[e[2]]===o?!1:!0}),u=0;u=i)return t;var o=Math.floor(Math.random()*t.length),s=r(o,e,t);return n(e,s,i-1,a)};if(null!=t&&null!=t.debug)var a=t.debug;else var a=!1;i("Starting kargerStein...");var o=this._private.cy,s=this.edges().not(":loop"),l=this.nodes(),u=l.length,c=s.length,d=Math.ceil(Math.pow(Math.log(u)/Math.LN2,2)),p=Math.floor(u/Math.sqrt(2));if(2>u)return void e.util.error("At least 2 nodes are required for KargerSteing algorithm!");for(var h={},v=0;u>v;v++)h[l[v].id()]=v;for(var f=[],v=0;c>v;v++){var g=s[v];f.push([v,h[g.source().id()],h[g.target().id()]])}for(var y,m=1/0,x=[],v=0;u>v;v++)x.push(v);for(var b=0;d>=b;b++){var w=x.slice(0),_=n(w,f,u,p),E=w.slice(0),S=n(w,_,p,2),P=n(E,_,p,2);S.length<=P.length&&S.lengthr;r++)i+=e[r];for(var r=0;t>r;r++)e[r]=e[r]/i},r=function(){n&&console.log.apply(console,arguments)};if(null!=t&&null!=t.debug)var n=t.debug;else var n=!1;if(r("Starting pageRank..."),null!=t&&null!=t.dampingfactor)var a=t.dampingFactor;else var a=.8;if(null!=t&&null!=t.precision)var o=t.precision;else var o=1e-6;if(null!=t&&null!=t.iterations)var s=t.iterations;else var s=200;if(null!=t&&null!=t.weight&&e.is.fn(t.weight))var l=t.weight;else var l=function(){return 1};for(var u=this._private.cy,c=this.edges().not(":loop"),d=this.nodes(),p=d.length,h=c.length,v={},f=0;p>f;f++)v[d[f].id()]=f;for(var g=[],y=[],m=(1-a)/p,f=0;p>f;f++){for(var x=[],b=0;p>b;b++)x.push(0);g.push(x),y.push(0)}for(var f=0;h>f;f++){var w=c[f],_=v[w.source().id()],E=v[w.target().id()],S=l.apply(w,[w]);g[E][_]+=S,y[_]+=S}for(var P=1/p+m,b=0;p>b;b++)if(0===y[b])for(var f=0;p>f;f++)g[f][b]=P;else for(var f=0;p>f;f++)g[f][b]=g[f][b]/y[b]+m;for(var k,C=[],D=[],f=0;p>f;f++)C.push(1),D.push(0);for(var N=0;s>N;N++){for(var T=D.slice(0),f=0;p>f;f++)for(var b=0;p>b;b++)T[f]+=g[f][b]*C[b];i(T),k=C,C=T;for(var M=0,f=0;p>f;f++)M+=Math.pow(k[f]-C[f],2);if(o>M){r("Stoped at iteration %s",N);break}}r("Result:\n"+C);var B={rank:function(t){if(e.is.string(t))var i=u.filter(t)[0].id();else var i=t.id();return C[v[i]]}};return B}})}(cytoscape),function(e){"use strict";e.fn.eles({animated:e.define.animated(),clearQueue:e.define.clearQueue(),delay:e.define.delay(),animate:e.define.animate(),stop:e.define.stop()})}(cytoscape),function(e){"use strict";e.fn.eles({classes:function(t){var i,r=this,n=[];if(e.is.fn(t))i=t;else if(!e.is.plainObject(t))return this;for(var a=0;a0&&new e.Collection(this.cy(),n).updateStyle().trigger("class"),this},addClass:function(t){t=t.split(/\s+/);for(var i=this,r=[],n=0;n0&&new e.Collection(this._private.cy,r).updateStyle().trigger("class"),i},hasClass:function(e){var t=this[0];return null!=t&&t._private.classes[e]?!0:!1},toggleClass:function(t,i){for(var r=t.split(/\s+/),n=this,a=[],o=0,s=n.length;s>o;o++)for(var l=n[o],u=0;u0&&new e.Collection(this._private.cy,a).updateStyle().trigger("class"),n},removeClass:function(t){t=t.split(/\s+/);for(var i=this,r=[],n=0;n0&&new e.Collection(i._private.cy,r).updateStyle(),i.trigger("class"),i},flashClass:function(e,t){var i=this;if(null==t)t=250;else if(0===t)return i;return i.addClass(e),setTimeout(function(){i.removeClass(e)},t),i}})}(cytoscape),function(e){"use strict";e.fn.eles({allAre:function(e){return this.filter(e).length===this.length},is:function(e){return this.filter(e).length>0},some:function(e,t){for(var i=0;i0},allAreNeighbors:function(e){return e=this.cy().collection(e),this.neighborhood().intersect(e).length===e.length}})}(cytoscape),function(e){"use strict";e.fn.eles({parent:function(t){for(var i=[],r=this._private.cy,n=0;n0&&i.push(o)}return new e.Collection(r,i,{unique:!0}).filter(t)},parents:function(t){for(var i=[],r=this.parent();r.nonempty();){for(var n=0;n0?this.add(s):this;i?l.trigger("position"):l.rtrigger("position")}return this},silentPositions:function(e){return this.positions(e,!0)},updateCompoundBounds:function(){function t(e){var t=e.children(),i=e._private.style,n=t.boundingBox({includeLabels:!1,includeEdges:!1}),a={top:i["padding-top"].pxValue,bottom:i["padding-bottom"].pxValue,left:i["padding-left"].pxValue,right:i["padding-right"].pxValue},o=e._private.position,s=!1;"auto"===i.width.value&&(e._private.autoWidth=n.w+a.left+a.right,o.x=(n.x1+n.x2-a.left+a.right)/2,s=!0),"auto"===i.height.value&&(e._private.autoHeight=n.h+a.top+a.bottom,o.y=(n.y1+n.y2-a.top+a.bottom)/2,s=!0),s&&r.push(e)}var i=this.cy();if(!i.styleEnabled()||!i.hasCompoundNodes())return i.collection();for(var r=[],n=this.parent();n.nonempty();){for(var a=0;a0,d=c;c&&(u=u[0]);var p=d?u._private.position:{x:0,y:0};return a={x:l.x-p.x,y:l.y-p.y},void 0===t?a:a[t]}for(var h=0;h0,d=c;c&&(u=u[0]);var p=d?u._private.position:{x:0,y:0};void 0!==i?r._private.position[t]=i+p[t]:void 0!==a&&(r._private.position={x:a.x+p.x,y:a.y+p.y})}this.rtrigger("position")}else if(!o)return void 0;return this},width:function(){var e=this[0],t=e._private.cy,i=t._private.styleEnabled;if(e){if(i){var r=e._private.style.width;return"auto"===r.strValue?e._private.autoWidth:r.pxValue}return 1}},outerWidth:function(){var e=this[0],r=e._private.cy,n=r._private.styleEnabled;if(e){if(n){var a=e._private.style,o="auto"===a.width.strValue?e._private.autoWidth:a.width.pxValue,s=a["border-width"]?a["border-width"].pxValue*t+i:0;return o+s}return 1}},renderedWidth:function(){var e=this[0];if(e){var t=e.width();return t*this.cy().zoom()}},renderedOuterWidth:function(){var e=this[0];if(e){var t=e.outerWidth();return t*this.cy().zoom()}},height:function(){var e=this[0],t=e._private.cy,i=t._private.styleEnabled;if(e&&"nodes"===e._private.group){if(i){var r=e._private.style.height;return"auto"===r.strValue?e._private.autoHeight:r.pxValue}return 1}},outerHeight:function(){var e=this[0],r=e._private.cy,n=r._private.styleEnabled;if(e&&"nodes"===e._private.group){if(!n)return 1;var a=e._private.style,o="auto"===a.height.strValue?e._private.autoHeight:a.height.pxValue,s=a["border-width"]?a["border-width"].pxValue*t+i:0;return o+s}},renderedHeight:function(){var e=this[0];if(e&&"nodes"===e._private.group){var t=e.height();return t*this.cy().zoom()}},renderedOuterHeight:function(){var e=this[0];if(e&&"nodes"===e._private.group){var t=e.outerHeight();return t*this.cy().zoom()}},renderedBoundingBox:function(e){var t=this.boundingBox(e),i=this.cy(),r=i.zoom(),n=i.pan(),a=t.x1*r+n.x,o=t.x2*r+n.x,s=t.y1*r+n.y,l=t.y2*r+n.y;return{x1:a,x2:o,y1:s,y2:l,w:o-a,h:l-s}},boundingBox:function(e){var t=this,i=t._private.cy,r=i._private,n=r.styleEnabled;e=e||{};var a=void 0===e.includeNodes?!0:e.includeNodes,o=void 0===e.includeEdges?!0:e.includeEdges,s=void 0===e.includeLabels?!0:e.includeLabels;n&&r.renderer.recalculateRenderedStyle(this);for(var l=1/0,u=-1/0,c=1/0,d=-1/0,p=0;ph?h:l,u=v>u?v:u,c=c>f?f:c,d=g>d?g:d}else if(x.isEdge()&&o){E=!0;var N=x._private.source._private.position,T=x._private.target._private.position,M=x._private.rstyle||{};if(h=N.x,v=T.x,f=N.y,g=T.y,h>v){var B=h;h=v,v=B}if(f>g){var B=f;f=g,g=B}if(l=l>h?h:l,u=v>u?v:u,c=c>f?f:c,d=g>d?g:d,n)for(var I=M.bezierPts||[],P=x._private.style.width.pxValue,z=P/2,L=0;Lh?h:l,u=v>u?v:u,c=c>f?f:c,d=g>d?g:d}}if(n){var R=x._private.style,M=x._private.rstyle,X=R.content.strValue,V=R["font-size"],Y=R["text-halign"],A=R["text-valign"],q=M.labelWidth,F=M.labelHeight,j=M.labelX,W=M.labelY;if(E&&s&&X&&V&&null!=F&&null!=q&&null!=j&&null!=W&&Y&&A){var H,$,Z,U,G=F,K=q;if(x.isEdge())H=j-K/2,$=j+K/2,Z=W-G/2,U=W+G/2;else{switch(Y.value){case"left":H=j-K,$=j;break;case"center":H=j-K/2,$=j+K/2;break;case"right":H=j,$=j+K}switch(A.value){case"top":Z=W-G,U=W;break;case"center":Z=W-G/2,U=W+G/2;break;case"bottom":Z=W,U=W+G}}l=l>H?H:l,u=$>u?$:u,c=c>Z?Z:c,d=U>d?U:d}}}}return{x1:l,x2:u,y1:c,y2:d,w:u-l,h:d-c}}}),e.elesfn.modelPosition=e.elesfn.position,e.elesfn.modelPositions=e.elesfn.positions}(cytoscape),function(e){"use strict";function t(e){return function(t){var i=this;if(void 0===t&&(t=!0),0!==i.length&&i.isNode()&&!i.removed()){for(var r=0,n=i[0],a=n._private.edges,o=0;oe}),maxDegree:i("degree",function(e,t){return e>t}),minIndegree:i("indegree",function(e,t){return t>e}),maxIndegree:i("indegree",function(e,t){return e>t}),minOutdegree:i("outdegree",function(e,t){return t>e}),maxOutdegree:i("outdegree",function(e,t){return e>t})}),e.fn.eles({totalDegree:function(e){for(var t=0,i=this.nodes(),r=0;r1&&!n){var a=this.length-1,o=this[a];this[a]=void 0,this[r]=o,t.indexes[o.id()]=r}return this.length--,this},unmerge:function(t){var i=this._private.cy;if(!t)return this;if(e.is.string(t)){var r=t;t=i.elements(r)}for(var n=0;nr&&(r=s,i=o)}return{value:r,ele:i}},min:function(e,t){for(var i,r=1/0,n=this,a=0;as&&(r=s,i=o)}return{value:r,ele:i}}})}(cytoscape),function(e){"use strict";e.fn.eles({isNode:function(){return"nodes"===this.group()},isEdge:function(){return"edges"===this.group()},isLoop:function(){return this.isEdge()&&this.source().id()===this.target().id()},isSimple:function(){return this.isEdge()&&this.source().id()!==this.target().id()},group:function(){var e=this[0];return e?e._private.group:void 0}})}(cytoscape),function(e){"use strict";e.fn.eles({each:function(t){if(e.is.fn(t))for(var i=0;it&&(t=n+t),0>i&&(i=n+i);for(var a=t;a>=0&&i>a&&n>a;a++)r.push(this[a]);return new e.Collection(this.cy(),r)},size:function(){return this.length},eq:function(t){return this[t]||new e.Collection(this.cy())},first:function(){return this[0]||new e.Collection(this.cy())},last:function(){return this[this.length-1]||new e.Collection(this.cy())},empty:function(){return 0===this.length},nonempty:function(){return!this.empty()},sort:function(t){if(!e.is.fn(t))return this;var i=this.cy(),r=this.toArray().sort(t);return new e.Collection(i,r)},sortByZIndex:function(){return this.sort(e.Collection.zIndexSort)},zDepth:function(){var e=this[0];if(!e)return void 0;var t=e._private,i=t.group;if("nodes"===i)return t.data.parent?e.parents().size():0;var r=t.source,n=t.target,a=r._private.data.parent?r.parents().size():0,o=n._private.data.parent?n.parents().size():0;return Math.max(a-1,o-1,0)+.5}}),e.Collection.zIndexSort=function(e,t){var i=e.cy(),r=e._private,n=t._private,a=r.style["z-index"].value-n.style["z-index"].value,o=0,s=0,l=i.hasCompoundNodes(),u="nodes"===r.group,c="edges"===r.group,d="nodes"===n.group,p="edges"===n.group;l&&(o=e.zDepth(),s=t.zDepth());var h=o-s,v=0===h;return v?u&&p?1:c&&d?-1:0===a?r.index-n.index:a:h}}(cytoscape),function(e){"use strict";e.fn.eles({layoutPositions:function(t,i,r){var n=this.nodes(),a=this.cy();if(t.trigger({type:"layoutstart",layout:t}),i.animate)for(var o=0;o0?this.add(o):this;return e?s.rtrigger("style"):s.trigger("style"),this},updateMappers:function(e){var t=this._private.cy,i=t.style();if(e=e||void 0===e?!0:!1,!t.styleEnabled())return this;i.updateMappers(this);var r=this.updateCompoundBounds(),n=r.length>0?this.add(r):this;return e?n.rtrigger("style"):n.trigger("style"),this},renderedCss:function(e){var t=this.cy();if(!t.styleEnabled())return this;var i=this[0];if(i){var r=i.cy().style().getRenderedStyle(i);return void 0===e?r:r[e]}},css:function(t,i){var r=this.cy();if(!r.styleEnabled())return this;var n=!1,a=r.style();if(e.is.plainObject(t)){var o=t;a.applyBypass(this,o,n); -var s=this.updateCompoundBounds(),l=s.length>0?this.add(s):this;l.rtrigger("style")}else if(e.is.string(t)){if(void 0===i){var u=this[0];return u?u._private.style[t].strValue:void 0}a.applyBypass(this,t,i,n);var s=this.updateCompoundBounds(),l=s.length>0?this.add(s):this;l.rtrigger("style")}else if(void 0===t){var u=this[0];return u?a.getRawStyle(u):void 0}return this},removeCss:function(e){var t=this.cy();if(!t.styleEnabled())return this;var i=!1,r=t.style(),n=this;if(void 0===e)for(var a=0;a0?this.add(s):this;return l.rtrigger("style"),this},show:function(){return this.css("display","element"),this},hide:function(){return this.css("display","none"),this},visible:function(){var e=this.cy();if(!e.styleEnabled())return!0;var t=this[0],i=e.hasCompoundNodes();if(t){var r=t._private.style;if("visible"!==r.visibility.value||"element"!==r.display.value)return!1;if("nodes"===t._private.group){if(!i)return!0;var n=t._private.data.parent?t.parents():null;if(n)for(var a=0;a0;o||r.push(a)}}return new e.Collection(this._private.cy,r,{unique:!0}).filter(t)},leaves:function(t){for(var i=this,r=[],n=0;n0;o||r.push(a)}}return new e.Collection(this._private.cy,r,{unique:!0}).filter(t)},outgoers:function(t){for(var i=this,r=[],n=0;n0&&i.push(c[0]),i.push(u[0])}return new e.Collection(r,i,{unique:!0}).filter(t)},closedNeighborhood:function(e){return this.neighborhood().add(this).filter(e)},openNeighborhood:function(e){return this.neighborhood(e)}}),e.fn.eles({source:function(e){var t,i=this[0];return i&&(t=i._private.source),t&&e?t.filter(e):t},target:function(e){var t,i=this[0];return i&&(t=i._private.target),t&&e?t.filter(e):t},sources:t({attr:"source"}),targets:t({attr:"target"})}),e.fn.eles({edgesWith:i(),edgesTo:i({thisIs:"source"})}),e.fn.eles({connectedEdges:function(t){for(var i=[],r=this._private.cy,n=this,a=0;ad;d+=1){if(l.push(n.call(t,i[d],d,i)),a=i[d].id(),u.hasOwnProperty(a))throw"ERROR: Multiple items with the same id found: "+a;u[a]=d,c.push(a)}for(this._private={cy:t,heap:l,pointers:u,elements:c,comparator:r,extractor:n,length:s},d=Math.floor(s/2);d>=0;d-=1)o=this.heapify(d);return o}},e.Heap.idFn=function(e){return e.id()},e.Heap.minHeapComparator=function(e,t){return e>=t},e.Heap.maxHeapComparator=function(e,t){return t>=e},e.fn.heap=function(t){for(var i in t){var r=t[i];e.Heap.prototype[i]=r}},e.heapfn=e.Heap.prototype,e.heapfn.size=function(){return this._private.length},e.heapfn.getArgumentAsCollection=function(t,i){var r;if("undefined"==typeof i&&(i=this._private.cy),e.is.elementOrCollection(t))r=t;else{for(var n=[],a=[].concat.apply([],[t]),o=0;o0&&n.push(l)}r=new e.Collection(i,n)}return r},e.heapfn.isHeap=function(){var e,t,i,r,n,a=this._private.heap,o=a.length,s=this._private.comparator;for(e=0;o>e;e+=1)if(t=2*e+1,i=t+1,r=o>t?s(a[t],a[e]):!0,n=o>i?s(a[i],a[e]):!0,!r||!n)return!1;return!0},e.heapfn.heapSwap=function(e,t){var i=this._private.heap,r=this._private.pointers,n=this._private.elements,a=i[e],o=n[e],s=n[e],l=n[t];i[e]=i[t],n[e]=n[t],r[s]=t,r[l]=e,i[t]=a,n[t]=o},e.heapfn.heapify=function(e,t){var i,r,n,a,o,s,l,u=0,c=!1;for("undefined"==typeof t&&(t=!0),i=this._private.heap,u=i.length,s=this._private.comparator,r=e;!c;)t?(n=2*r+1,a=n+1,o=r,u>n&&!s(i[n],i[o])&&(o=n),u>a&&!s(i[a],i[o])&&(o=a),c=o===r,c||(this.heapSwap(o,r),r=o)):(l=Math.floor((r-1)/2),o=r,c=0>l||s(i[o],i[l]),c||(this.heapSwap(o,l),r=l))},e.heapfn.insert=function(e){var t,i,r,n,a,o=this.getArgumentAsCollection(e),s=o.length;for(a=0;s>a;a+=1){if(t=o[a],i=this._private.heap.length,r=this._private.extractor(t),n=t.id(),this._private.pointers.hasOwnProperty(n))throw"ERROR: Multiple items with the same id found: "+n;this._private.heap.push(r),this._private.elements.push(n),this._private.pointers[n]=i,this.heapify(i,!1)}this._private.length=this._private.heap.length},e.heapfn.getValueById=function(e){if(this._private.pointers.hasOwnProperty(e)){var t=this._private.pointers[e];return this._private.heap[t]}},e.heapfn.contains=function(e){for(var t=this.getArgumentAsCollection(e),i=0;i0?{value:this._private.heap[0],id:this._private.elements[0]}:void 0},e.heapfn.pop=function(){if(this._private.length>0){var e,t,i,r=this.top(),n=this._private.length-1;return this.heapSwap(0,n),e=this._private.elements[n],t=this._private.heap[n],i=e,this._private.heap.pop(),this._private.elements.pop(),this._private.length=this._private.heap.length,this._private.pointers[i]=void 0,this.heapify(0),r}},e.heapfn.findDirectionHeapify=function(e){var t=Math.floor((e-1)/2),i=this._private.heap,r=0>t||this._private.comparator(i[e],i[t]);this.heapify(e,r)},e.heapfn.edit=function(t,i){for(var r=this.getArgumentAsCollection(t),n=0;n=o&&s>=e&&t>=l&&u>=t},a=function(e,t,i,r,n){r=-r;var a=e*Math.cos(r)-t*Math.sin(r),o=e*Math.sin(r)+t*Math.cos(r),s=a*i,l=o*i,u=s+n.x,c=l+n.y;return{x:u,y:c}};r.arrow={_points:[-.15,-.3,0,0,.15,-.3],collide:function(t,i,n,a,o,s,l,u){var c=r.arrow._points;return e.math.pointInsidePolygon(t,i,c,n,a,o,s,l,u)},roughCollide:n,draw:function(e,t,i,n){for(var o=r.arrow._points,s=0;se.math.sqDistanceToQuadraticBezier(i,r,c.startX,c.startY,c.cp2ax,c.cp2ay,c.selfEdgeMidX,c.selfEdgeMidY)||(x=e.math.inBezierVicinity(i,r,c.selfEdgeMidX,c.selfEdgeMidY,c.cp2cx,c.cp2cy,c.endX,c.endY,f))&&b()&&f+h>e.math.sqDistanceToQuadraticBezier(i,r,c.selfEdgeMidX,c.selfEdgeMidY,c.cp2cx,c.cp2cy,c.endX,c.endY))&&u.push(o);else if("haystack"===c.edgeType){var w=d["haystack-radius"].value,_=w/2,E=m._private.position,S=m.width(),P=m.height(),k=y._private.position,C=y.width(),D=y.height(),N=k.x+c.source.x*C*_,T=k.y+c.source.y*D*_,M=E.x+c.target.x*S*_,B=E.y+c.target.y*P*_;(x=e.math.inLineVicinity(i,r,N,T,M,B,g))&&b()&&f+h>e.math.sqDistanceToFiniteLine(i,r,N,T,M,B)&&u.push(o)}else"straight"===c.edgeType?(x=e.math.inLineVicinity(i,r,c.startX,c.startY,c.endX,c.endY,g))&&b()&&f+h>e.math.sqDistanceToFiniteLine(i,r,c.startX,c.startY,c.endX,c.endY)&&u.push(o):"bezier"===c.edgeType&&(x=e.math.inBezierVicinity(i,r,c.startX,c.startY,c.cp2x,c.cp2y,c.endX,c.endY,f))&&b()&&f+h>e.math.sqDistanceToQuadraticBezier(i,r,c.startX,c.startY,c.cp2x,c.cp2y,c.endX,c.endY)&&u.push(o);if(x&&b()&&0===u.length||u[u.length-1]!==o){var I=t.arrowShapes[d["source-arrow-shape"].value],z=t.arrowShapes[d["target-arrow-shape"].value],y=y||o._private.source,m=m||o._private.target,E=m._private.position,k=y._private.position,L=s.getArrowWidth(d.width.pxValue),O=s.getArrowHeight(d.width.pxValue),R=L,X=O;(I.roughCollide(i,r,c.arrowStartX,c.arrowStartY,L,O,[c.arrowStartX-k.x,c.arrowStartY-k.y],0)&&I.collide(i,r,c.arrowStartX,c.arrowStartY,L,O,[c.arrowStartX-k.x,c.arrowStartY-k.y],0)||z.roughCollide(i,r,c.arrowEndX,c.arrowEndY,R,X,[c.arrowEndX-E.x,c.arrowEndY-E.y],0)&&z.collide(i,r,c.arrowEndX,c.arrowEndY,R,X,[c.arrowEndX-E.x,c.arrowEndY-E.y],0))&&u.push(o)}p&&u.length>0&&u[u.length-1]===o&&(a(y),a(m))}for(var s=this,l=this.getCachedZSortedEles(),u=[],c=t.isTouch,d=this.data.cy.zoom(),p=this.data.cy.hasCompoundNodes(),h=(c?256:32)/d,v=(c?16:0)/d,f=l.length-1;f>=0;f--){var g=l[f];if(u.length>0)break;"nodes"===g._private.group?a(l[f]):o(l[f])}return u.length>0?u[u.length-1]:null},t.prototype.getAllInBox=function(i,r,n,a){var o=this.getCachedNodes(),s=this.getCachedEdges(),l=[],u=Math.min(i,n),c=Math.max(i,n),d=Math.min(r,a),p=Math.max(r,a);i=u,n=c,r=d,a=p;for(var h,v=0;v=i&&n>=k&&C>=r&&a>=C,M=D>=i&&n>=D&&N>=r&&a>=N;T&&M&&l.push(s[v])}}return l},t.prototype.getNodeWidth=function(e){return e.width()},t.prototype.getNodeHeight=function(e){return e.height()},t.prototype.getNodeShape=function(e){var t=e._private.style.shape.value;return e.isParent()?"rectangle"===t||"roundrectangle"===t?t:"rectangle":t},t.prototype.getNodePadding=function(e){var t=e._private.style["padding-left"].pxValue,i=e._private.style["padding-right"].pxValue,r=e._private.style["padding-top"].pxValue,n=e._private.style["padding-bottom"].pxValue;return isNaN(t)&&(t=0),isNaN(i)&&(i=0),isNaN(r)&&(r=0),isNaN(n)&&(n=0),{left:t,right:i,top:r,bottom:n}},t.prototype.zOrderSort=e.Collection.zIndexSort,t.prototype.updateCachedZSortedEles=function(){this.getCachedZSortedEles(!0)},t.prototype.getCachedZSortedEles=function(e){var t=this.lastZOrderCachedNodes,i=this.lastZOrderCachedEdges,r=this.getCachedNodes(),n=this.getCachedEdges(),a=[];if(!e&&t&&i&&t===r&&i===n)a=this.cachedZSortedEles;else{for(var o=0;op?p+"-"+d:d+"-"+p,c&&(r="unbundled"+l._private.data.id),null==n[r]&&(n[r]=[],a.push(r)),n[r].push(l),c&&(n[r].hasUnbundled=!0)}else o.push(l)}for(var h,v,f,g,y,m,x,b,w,_,E,S,P,k,C=0;Cv._private.data.id){var N=h;h=v,v=N}if(f=h._private.position,g=v._private.position,y=this.getNodeWidth(h),m=this.getNodeHeight(h),x=this.getNodeWidth(v),b=this.getNodeHeight(v),w=t.nodeShapes[this.getNodeShape(h)],_=t.nodeShapes[this.getNodeShape(v)],E=h._private.style["border-width"].pxValue,S=v._private.style["border-width"].pxValue,k=!1,D.length>1&&h!==v||D.hasUnbundled){var T=w.intersectLine(f.x,f.y,y,m,g.x,g.y,E/2),M=_.intersectLine(g.x,g.y,x,b,f.x,f.y,S/2),B={x1:T[0],x2:M[0],y1:T[1],y2:M[1]},I=M[1]-T[1],z=M[0]-T[0],L=Math.sqrt(z*z+I*I),O={x:z,y:I},R={x:O.x/L,y:O.y/L}; -P={x:-R.y,y:R.x},(_.checkPoint(T[0],T[1],S/2,x,b,g.x,g.y)||w.checkPoint(M[0],M[1],E/2,y,m,f.x,f.y))&&(P={},k=!0)}for(var l,X,s=0;skt,Dt=e.math.distance({x:X.cp2x,y:X.cp2y},{x:X.endX,y:X.endY}),Nt=Pt>Dt;if("bezier"===X.edgeType){var Tt=!1;if(xt||bt||Ct){Tt=!0;var Mt={x:X.cp2x-f.x,y:X.cp2y-f.y},Bt=Math.sqrt(Mt.x*Mt.x+Mt.y*Mt.y),It={x:Mt.x/Bt,y:Mt.y/Bt},zt=Math.max(y,m),Lt={x:X.cp2x+2*It.x*zt,y:X.cp2y+2*It.y*zt},Ot=w.intersectLine(f.x,f.y,y,m,Lt.x,Lt.y,E/2);Ct?(X.cp2x=X.cp2x+It.x*(Pt-kt),X.cp2y=X.cp2y+It.y*(Pt-kt)):(X.cp2x=Ot[0]+It.x*Pt,X.cp2y=Ot[1]+It.y*Pt)}if(wt||_t||Nt){Tt=!0;var Mt={x:X.cp2x-g.x,y:X.cp2y-g.y},Bt=Math.sqrt(Mt.x*Mt.x+Mt.y*Mt.y),It={x:Mt.x/Bt,y:Mt.y/Bt},zt=Math.max(y,m),Lt={x:X.cp2x+2*It.x*zt,y:X.cp2y+2*It.y*zt},Rt=_.intersectLine(g.x,g.y,x,b,Lt.x,Lt.y,S/2);Nt?(X.cp2x=X.cp2x+It.x*(Pt-Dt),X.cp2y=X.cp2y+It.y*(Pt-Dt)):(X.cp2x=Rt[0]+It.x*Pt,X.cp2y=Rt[1]+It.y*Pt)}Tt&&this.findEndpoints(l)}else"straight"===X.edgeType&&(X.midX=(Z+it)/2,X.midY=(G+nt)/2);this.projectBezier(l)}}}for(var s=0;sC*N+D*T)n.straightEdgeTooShort=!0;else{var P=n;this.drawStyledEdge(i,e,[P.startX,P.startY,P.endX,P.endY],_,w),n.straightEdgeTooShort=!1}}else{var P=n;this.drawStyledEdge(i,e,[P.startX,P.startY,P.cp2x,P.cp2y,P.endX,P.endY],_,w)}"haystack"===n.edgeType?this.drawArrowheads(e,i,r):n.noArrowPlacement!==!0&&void 0!==n.startX&&this.drawArrowheads(e,i,r)}}},t.prototype.drawStyledEdge=function(e,i,r,n){var a,o=e._private.rscratch,s=i,l=!1,u=t.usePaths();if(u){for(var c=r,d=o.pathCacheKey&&c.length===o.pathCacheKey.length,p=d,h=0;p&&hu?y+=Math.PI/2:y=-(Math.PI/2+y);var m=this.getArrowWidth(a),x=t.arrowShapes[o];if(p){var b=m+"$"+o+"$"+y+"$"+s+"$"+l;h.arrowPathCacheKey=h.arrowPathCacheKey||{},h.arrowPathCache=h.arrowPathCache||{};var w=h.arrowPathCacheKey[i]===b;w?(d=r=h.arrowPathCache[i],v=!0):(d=r=new Path2D,h.arrowPathCacheKey[i]=b,h.arrowPathCache[i]=d)}r.beginPath&&r.beginPath(),v||x.draw(r,m,y,g),!x.leavePathOpen&&r.closePath&&r.closePath(),r=f,("filled"===n||"both"===n)&&(p?r.fill(d):r.fill()),("hollow"===n||"both"===n)&&(r.lineWidth=x.matchEdgeWidth?a:1,r.lineJoin="miter",p?r.stroke(d):r.stroke())}}(cytoscape),function(e){"use strict";var t=e("renderer","canvas");t.prototype.getCachedImage=function(e,t){var i=this,r=i.imageCache=i.imageCache||{};if(r[e]&&r[e].image)return r[e].image;var n=r[e]=r[e]||{},a=n.image=new Image;return a.addEventListener("load",t),a.src=e,a},t.prototype.drawInscribedImage=function(e,i,r){var n=this,a=r._private.position.x,o=r._private.position.y,s=r._private.style,l=s["background-fit"].value,u=s["background-position-x"],c=s["background-position-y"],d=s["background-repeat"].value,p=r.width(),h=r.height(),v=r._private.rscratch,f=s["background-clip"].value,g="node"===f,y=s["background-image-opacity"].value,m=i.width,x=i.height;if("contain"===l){var b=Math.min(p/m,h/x);m*=b,x*=b}else if("cover"===l){var b=Math.max(p/m,h/x);m*=b,x*=b}var w=a-p/2;w+="%"===u.units?(p-m)*u.value/100:u.pxValue;var _=o-h/2;_+="%"===c.units?(h-x)*c.value/100:c.pxValue,v.pathCache&&(w-=a,_-=o,a=0,o=0);var E=e.globalAlpha;if(e.globalAlpha=y,"no-repeat"===d)g&&(e.save(),v.pathCache?e.clip(v.pathCache):(t.nodeShapes[n.getNodeShape(r)].drawPath(e,a,o,p,h),e.clip())),e.drawImage(i,0,0,i.width,i.height,w,_,m,x),g&&e.restore();else{var S=e.createPattern(i,d);e.fillStyle=S,t.nodeShapes[n.getNodeShape(r)].drawPath(e,a,o,p,h),e.translate(w,_),e.fill(),e.translate(-w,-_)}e.globalAlpha=E}}(cytoscape),function(e){"use strict";var t=e("renderer","canvas");t.prototype.drawEdgeText=function(e,t){var i=t._private.style.content.strValue;if(!(!i||i.match(/^\s+$/)||this.hideEdgesOnViewport&&(this.dragData.didDrag||this.pinching||this.hoverData.dragging||this.data.wheel||this.swipePanning))){var r=t._private.style["font-size"].pxValue*t.cy().zoom(),n=t._private.style["min-zoomed-font-size"].pxValue;if(!(n>r)){e.textAlign="center",e.textBaseline="middle";var a=t._private.rscratch;this.drawText(e,t,a.labelX,a.labelY)}}},t.prototype.drawNodeText=function(e,t){var i=t._private.style.content.strValue;if(i&&!i.match(/^\s+$/)){var r=t._private.style["font-size"].pxValue*t.cy().zoom(),n=t._private.style["min-zoomed-font-size"].pxValue;if(!(n>r)){var a=t._private.style["text-halign"].strValue,o=t._private.style["text-valign"].strValue,s=t._private.rscratch;switch(a){case"left":e.textAlign="right";break;case"right":e.textAlign="left";break;default:e.textAlign="center"}switch(o){case"top":e.textBaseline="bottom";break;case"bottom":e.textBaseline="top";break;default:e.textBaseline="middle"}this.drawText(e,t,s.labelX,s.labelY)}}},t.prototype.getFontCache=function(e){var t;this.fontCaches=this.fontCaches||[];for(var i=0;i0&&(e.lineWidth=s,e.strokeText(o,i,r)),e.fillText(o,i,r)}}}}(cytoscape),function(e){"use strict";var t=e("renderer","canvas");t.prototype.drawNode=function(e,i,r){var n,a,o,s=this,l=i._private.style,u=i._private.rscratch,c=t.usePaths(),d=e,p=!1,h=l["overlay-padding"].pxValue,v=l["overlay-opacity"].value,f=l["overlay-color"].value;if(!r||0!==v){var g=i.effectiveOpacity();if(0!==g)if(n=this.getNodeWidth(i),a=this.getNodeHeight(i),e.lineWidth=l["border-width"].pxValue,void 0!==r&&r)v>0&&(this.fillStyle(e,f[0],f[1],f[2],v),t.nodeShapes.roundrectangle.drawPath(e,i._private.position.x,i._private.position.y,n+2*h,a+2*h),e.fill());else{var y=l["background-color"].value,m=l["border-color"].value,x=l["border-style"].value;switch(this.fillStyle(e,y[0],y[1],y[2],l["background-opacity"].value*l.opacity.value*g),this.strokeStyle(e,m[0],m[1],m[2],l["border-opacity"].value*l.opacity.value*g),e.lineJoin="miter",x){case"dotted":e.setLineDash([1,1]);break;case"dashed":e.setLineDash([4,2]);break;case"solid":case"double":e.setLineDash([])}var b=l["background-image"].value[2]||l["background-image"].value[1],w=l.shape.strValue,_=i._private.position;if(c){var E=w+"$"+n+"$"+a;e.translate(_.x,_.y),u.pathCacheKey===E?(o=e=u.pathCache,p=!0):(o=e=new Path2D,u.pathCacheKey=E,u.pathCache=o)}if(!p){var S=_;c&&(S={x:0,y:0}),t.nodeShapes[this.getNodeShape(i)].drawPath(e,S.x,S.y,n,a)}if(e=d,c?e.fill(o):e.fill(),void 0!==b){var P=this.getCachedImage(b,function(){s.data.canvasNeedsRedraw[t.NODE]=!0,s.data.canvasNeedsRedraw[t.DRAG]=!0,s.redraw()});P.complete&&this.drawInscribedImage(e,P,i)}var k=l["background-blacken"].value,C=l["border-width"].pxValue;if(this.hasPie(i)&&(this.drawPie(e,i),(0!==k||0!==C)&&(c||t.nodeShapes[this.getNodeShape(i)].drawPath(e,_.x,_.y,n,a))),k>0?(this.fillStyle(e,0,0,0,k),c?e.fill(o):e.fill()):0>k&&(this.fillStyle(e,255,255,255,-k),c?e.fill(o):e.fill()),C>0&&(c?e.stroke(o):e.stroke(),"double"===x)){e.lineWidth=l["border-width"].pxValue/3;var D=e.globalCompositeOperation;e.globalCompositeOperation="destination-out",c?e.stroke(o):e.stroke(),e.globalCompositeOperation=D}c&&e.translate(-_.x,-_.y),e.setLineDash([])}}},t.prototype.hasPie=function(e){return e=e[0],e._private.hasPie},t.prototype.drawPie=function(i,r){r=r[0];var n=r._private.style["pie-size"],a=this.getNodeWidth(r),o=this.getNodeHeight(r),s=r._private.position.x,l=r._private.position.y,u=Math.min(a,o)/2,c=0,d=t.usePaths();d&&(s=0,l=0),"%"===n.units?u=u*n.value/100:void 0!==n.pxValue&&(u=n.pxValue/2);for(var p=1;p<=e.style.pieBackgroundN;p++){var h=r._private.style["pie-"+p+"-background-size"].value,v=r._private.style["pie-"+p+"-background-color"].value,f=r._private.style["pie-"+p+"-background-opacity"].value,g=h/100,y=1.5*Math.PI+2*Math.PI*c,m=2*Math.PI*g,x=y+m;0===h||c>=1||c+g>1||(i.beginPath(),i.moveTo(s,l),i.arc(s,l,u,y,x),i.closePath(),this.fillStyle(i,v[0],v[1],v[2],f),i.fill(),c+=g)}}}(cytoscape),function(e){"use strict";var t=e("renderer","canvas");t.prototype.getPixelRatio=function(){var e=this.data.contexts[0];if(null!=this.forcedPixelRatio)return this.forcedPixelRatio;var t=e.backingStorePixelRatio||e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1;return(window.devicePixelRatio||1)/t},t.prototype.paintCache=function(e){for(var t,i=this.paintCaches=this.paintCaches||[],r=!0,n=0;n=o&&(i=r.bufferCanvases[t.TEXTURE_BUFFER],this.textureMult=2,i.width=s*this.textureMult,i.height=l*this.textureMult),this.canvasWidth=s,this.canvasHeight=l}},t.prototype.renderTo=function(e,t,i,r){this.redraw({forcedContext:e,forcedZoom:t,forcedPan:i,drawAllLayers:!0,forcedPxRatio:r})},t.prototype.timeToRender=function(){return this.redrawTotalTime/this.redrawCount},t.minRedrawLimit=1e3/60,t.maxRedrawLimit=1e3,t.motionBlurDelay=100,t.prototype.redraw=function(i){function r(){function i(e,t){if(e.setTransform(1,0,0,1,0,0),"motionBlur"===t){var i=e.globalCompositeOperation;e.globalCompositeOperation="destination-out",u.fillStyle(e,255,255,255,.666),e.fillRect(0,0,u.canvasWidth,u.canvasHeight),e.globalCompositeOperation=i}else n||void 0!==t&&!t||e.clearRect(0,0,u.canvasWidth,u.canvasHeight);a||(e.translate(b.x,b.y),e.scale(m,m)),l&&e.translate(l.x,l.y),s&&e.scale(s,s)}function r(e,t){for(var i=e.eles,r=0;r0&&(C.strokeStyle="rgba("+g["selection-box-border-color"].value[0]+","+g["selection-box-border-color"].value[1]+","+g["selection-box-border-color"].value[2]+","+g["selection-box-opacity"].value+")",C.strokeRect(p.select[0],p.select[1],p.select[2]-p.select[0],p.select[3]-p.select[1]))}if(p.bgActivePosistion){var y=p.cy.zoom(),q=p.bgActivePosistion;C.fillStyle="rgba("+g["active-bg-color"].value[0]+","+g["active-bg-color"].value[1]+","+g["active-bg-color"].value[2]+","+g["active-bg-opacity"].value+")",C.beginPath(),C.arc(q.x,q.y,g["active-bg-size"].pxValue/y,0,2*Math.PI),C.fill()}var F=u.averageRedrawTime;if(u.showFps&&F){F=Math.round(F);var j=Math.round(1e3/F);C.setTransform(1,0,0,1,0,0),C.fillStyle="rgba(255, 0, 0, 0.75)",C.strokeStyle="rgba(255, 0, 0, 0.75)",C.lineWidth=1,C.fillText("1 frame = "+F+" ms = "+j+" fps",0,20);var W=60;C.strokeRect(0,30,250,20),C.fillRect(0,30,250*Math.min(j/W,1),20)}a||(h[t.SELECT_BOX]=!1)}var H=+new Date;void 0===u.averageRedrawTime&&(u.averageRedrawTime=H-w),void 0===u.redrawCount&&(u.redrawCount=0),u.redrawCount++,void 0===u.redrawTotalTime&&(u.redrawTotalTime=0),u.redrawTotalTime+=H-w,u.lastRedrawTime=H-w,u.averageRedrawTime=u.averageRedrawTime/2+(H-w)/2,u.currentlyDrawing=!1,u.clearingMotionBlur&&(u.clearingMotionBlur=!1,u.motionBlurCleared=!0,u.motionBlur=!0),v&&(u.motionBlurTimeout=setTimeout(function(){u.motionBlurTimeout=null,u.clearedNodeLayerForMotionBlur=!1,u.motionBlur=!1,u.clearingMotionBlur=!0,h[t.NODE]=!0,h[t.DRAG]=!0,u.redraw()},t.motionBlurDelay))}i=i||{};var n=i.forcedContext,a=i.drawAllLayers,o=i.drawOnlyNodeLayer,s=i.forcedZoom,l=i.forcedPan,u=this,c=void 0===i.forcedPxRatio?this.getPixelRatio():i.forcedPxRatio,d=u.data.cy,p=u.data,h=p.canvasNeedsRedraw,v=void 0!==i.motionBlur?i.motionBlur:u.motionBlur;v=v&&!n&&u.motionBlurEnabled,u.motionBlurTimeout&&clearTimeout(u.motionBlurTimeout),this.redrawTimeout&&clearTimeout(this.redrawTimeout),this.redrawTimeout=null,void 0===this.averageRedrawTime&&(this.averageRedrawTime=0);var f=t.minRedrawLimit,g=t.maxRedrawLimit,y=this.averageRedrawTime;y=f>y?f:y,y=g>y?y:g,void 0===this.lastDrawTime&&(this.lastDrawTime=0);var m=+new Date,x=m-this.lastDrawTime,b=x>=y;if(!n){if(!b||this.currentlyDrawing)return void(this.redrawTimeout=setTimeout(function(){u.redraw()},y));this.lastDrawTime=m,this.currentlyDrawing=!0}var w=+new Date;n?r():e.util.requestAnimationFrame(r),n||u.initrender||(u.initrender=!0,d.trigger("initrender"))}}(cytoscape),function(e){"use strict";var t=e("renderer","canvas");t.prototype.drawPolygonPath=function(e,t,i,r,n,a){var o=r/2,s=n/2;e.beginPath&&e.beginPath(),e.moveTo(t+o*a[0],i+s*a[1]);for(var l=1;l0&&a>0)if(l.clearRect(0,0,n,a),e.bg&&(l.fillStyle=e.bg,l.rect(0,0,n,a),l.fill()),l.globalCompositeOperation="source-over",e.full)this.redraw({forcedContext:l,drawAllLayers:!0,forcedZoom:o,forcedPan:{x:-r.x1*o,y:-r.y1*o},forcedPxRatio:1});else{var u=i.pan(),c={x:u.x*o,y:u.y*o},d=i.zoom()*o;this.redraw({forcedContext:l,drawAllLayers:!0,forcedZoom:d,forcedPan:c,forcedPxRatio:1})}return s},t.prototype.png=function(e){return this.bufferCanvasImage(e).toDataURL("image/png")}}(cytoscape),function(e){"use strict";var t=e("renderer","canvas");t.prototype.registerBinding=function(e,t,i,r){this.bindings.push({target:e,event:t,handler:i,useCapture:r}),e.addEventListener(t,i,r)},t.prototype.nodeIsDraggable=function(e){return 0!==e._private.style.opacity.value&&"visible"==e._private.style.visibility.value&&"element"==e._private.style.display.value&&!e.locked()&&e.grabbable()?!0:!1},t.prototype.load=function(){var i=this,r=function(e){var t;if(e.addToList&&i.data.cy.hasCompoundNodes()){if(!e.addToList.hasId){e.addToList.hasId={};for(var r=0;rs[0]&&r.clientXs[1]&&r.clientY=t.panOrBoxSelectDelay)&&Math.abs(v[3]-v[1])+Math.abs(v[2]-v[0])<4&&p.panningEnabled()&&p.userPanningEnabled())i.hoverData.dragging=!0,v[4]=0;else{if(p.boxSelectionEnabled()&&Math.pow(v[2]-v[0],2)+Math.pow(v[3]-v[1],2)>7&&v[4]&&(clearTimeout(i.bgActiveTimeout),i.data.bgActivePosistion=void 0,i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0,i.redraw()),y&&y.isEdge()&&y.active()&&y.unactivate(),f!=g&&(g&&(g.trigger(new e.Event(r,{type:"mouseout",cyPosition:{x:h[0],y:h[1]}})),g.trigger(new e.Event(r,{type:"tapdragout",cyPosition:{x:h[0],y:h[1]}}))),f&&(f.trigger(new e.Event(r,{type:"mouseover",cyPosition:{x:h[0],y:h[1]}})),f.trigger(new e.Event(r,{type:"tapdragover",cyPosition:{x:h[0],y:h[1]}}))),i.hoverData.last=f),y&&y.isNode()&&i.nodeIsDraggable(y)){i.dragData.didDrag||(i.data.canvasNeedsRedraw[t.NODE]=!0),i.dragData.didDrag=!0;for(var _=[],E=0;E7&&l[4]||i.hoverData.dragging||(a.$(function(){return this.selected()}).unselect(),c.length>0&&(i.data.canvasNeedsRedraw[t.NODE]=!0),i.dragData.possibleDragElements=c=[]),null!=u?u.trigger(new e.Event(r,{type:"mouseup",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"tapend",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"vmouseup",cyPosition:{x:s[0],y:s[1]}})):null==u&&a.trigger(new e.Event(r,{type:"mouseup",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"tapend",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"vmouseup",cyPosition:{x:s[0],y:s[1]}})),Math.pow(l[2]-l[0],2)+Math.pow(l[3]-l[1],2)===0&&(null!=u?u.trigger(new e.Event(r,{type:"click",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"tap",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"vclick",cyPosition:{x:s[0],y:s[1]}})):null==u&&a.trigger(new e.Event(r,{type:"click",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"tap",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"vclick",cyPosition:{x:s[0],y:s[1]}}))),u!=d||i.dragData.didDrag||null!=u&&u._private.selectable&&("additive"===a.selectionType()||p?u.selected()?u.unselect():u.select():p||(a.$(":selected").not(u).unselect(),u.select()),i.data.canvasNeedsRedraw[t.NODE]=!0),a.boxSelectionEnabled()&&Math.pow(l[2]-l[0],2)+Math.pow(l[3]-l[1],2)>7&&l[4]){var f=[],g=i.getAllInBox(l[0],l[1],l[2],l[3]);i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0,g.length>0&&(i.data.canvasNeedsRedraw[t.NODE]=!0);for(var y=0;y=0&&b>=d&&h>=0&&b>=h&&p>=0&&w>=p&&v>=0&&w>=v;var k=n.pan(),C=n.zoom();if(f=E(d,p,h,v),g=[(d+h)/2,(p+v)/2],y=[(g[0]-k.x)/C,(g[1]-k.y)/C],200>f&&!r.touches[2]){var D=i.findNearestElement(l[0],l[1],!0),N=i.findNearestElement(l[2],l[3],!0);return D&&D.isNode()?(D.activate().trigger(new e.Event(r,{type:"cxttapstart",cyPosition:{x:l[0],y:l[1]}})),i.touchData.start=D):N&&N.isNode()?(N.activate().trigger(new e.Event(r,{type:"cxttapstart",cyPosition:{x:l[0],y:l[1]}})),i.touchData.start=N):(n.trigger(new e.Event(r,{type:"cxttapstart",cyPosition:{x:l[0],y:l[1]}})),i.touchData.start=null),i.touchData.start&&(i.touchData.start._private.grabbed=!1),i.touchData.cxt=!0,i.touchData.cxtDragged=!1,i.data.bgActivePosistion=void 0,void i.redraw()}}if(r.touches[2]);else if(r.touches[1]);else if(r.touches[0]){var T=i.findNearestElement(l[0],l[1],!0);if(null!=T){if(T.activate(),i.touchData.start=T,T.isNode()&&i.nodeIsDraggable(T)){var M=i.dragData.touchDragEles=[];if(i.data.canvasNeedsRedraw[t.NODE]=!0,i.data.canvasNeedsRedraw[t.DRAG]=!0,T.selected())for(var B=n.$(function(){return this.isNode()&&this.selected()}),I=0;I250&&(i.touchData.start?i.touchData.start.trigger(new e.Event(r,{type:"taphold",cyPosition:{x:l[0],y:l[1]}})):(i.data.cy.trigger(new e.Event(r,{type:"taphold",cyPosition:{x:l[0],y:l[1]}})),n.$(":selected").unselect()))},1e3)}},!1),i.registerBinding(window,"touchmove",e.util.throttle(function(r){var n=i.data.select,o=i.touchData.capture;o&&r.preventDefault();var s=i.data.cy,l=i.touchData.now,u=i.touchData.earlier;if(r.touches[0]){var c=i.projectIntoViewport(r.touches[0].clientX,r.touches[0].clientY);l[0]=c[0],l[1]=c[1]}if(r.touches[1]){var c=i.projectIntoViewport(r.touches[1].clientX,r.touches[1].clientY);l[2]=c[0],l[3]=c[1]}if(r.touches[2]){var c=i.projectIntoViewport(r.touches[2].clientX,r.touches[2].clientY);l[4]=c[0],l[5]=c[1]}for(var g=[],b=0;b=1.5||C>=150){i.touchData.cxt=!1,i.touchData.start&&(i.touchData.start.unactivate(),i.touchData.start=null),i.data.bgActivePosistion=void 0,i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0;var N=new e.Event(r,{type:"cxttapend",cyPosition:{x:l[0],y:l[1]}});i.touchData.start?i.touchData.start.trigger(N):s.trigger(N)}}if(o&&i.touchData.cxt){var N=new e.Event(r,{type:"cxtdrag",cyPosition:{x:l[0],y:l[1]}});i.data.bgActivePosistion=void 0,i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0,i.touchData.start?i.touchData.start.trigger(N):s.trigger(N),i.touchData.start&&(i.touchData.start._private.grabbed=!1),i.touchData.cxtDragged=!0;var T=i.findNearestElement(l[0],l[1],!0);i.touchData.cxtOver&&T===i.touchData.cxtOver||(i.touchData.cxtOver&&i.touchData.cxtOver.trigger(new e.Event(r,{type:"cxtdragout",cyPosition:{x:l[0],y:l[1]}})),i.touchData.cxtOver=T,T&&T.trigger(new e.Event(r,{type:"cxtdragover",cyPosition:{x:l[0],y:l[1]}})))}else if(o&&r.touches[2]&&s.boxSelectionEnabled())i.data.bgActivePosistion=void 0,clearTimeout(this.threeFingerSelectTimeout),this.lastThreeTouch=+new Date,i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0,n&&0!==n.length&&void 0!==n[0]?(n[2]=(l[0]+l[2]+l[4])/3,n[3]=(l[1]+l[3]+l[5])/3):(n[0]=(l[0]+l[2]+l[4])/3,n[1]=(l[1]+l[3]+l[5])/3,n[2]=(l[0]+l[2]+l[4])/3+1,n[3]=(l[1]+l[3]+l[5])/3+1),n[4]=1,i.redraw();else if(o&&r.touches[1]&&s.zoomingEnabled()&&s.panningEnabled()&&s.userZoomingEnabled()&&s.userPanningEnabled()){i.data.bgActivePosistion=void 0,i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0;var M=i.dragData.touchDragEles;if(M){i.data.canvasNeedsRedraw[t.DRAG]=!0;for(var B=0;B4&&(i.touchData.singleTouchMoved=!0);if(o&&(null==W||W.isEdge())&&s.panningEnabled()&&s.userPanningEnabled()){W&&(W.unactivate(),i.data.bgActivePosistion||(i.data.bgActivePosistion={x:l[0],y:l[1]}),i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0,i.touchData.start=null),s.panBy({x:g[0]*s.zoom(),y:g[1]*s.zoom()}),i.swipePanning=!0;var c=i.projectIntoViewport(r.touches[0].clientX,r.touches[0].clientY);l[0]=c[0],l[1]=c[1]}}for(var b=0;b0?i.data.canvasNeedsRedraw[t.NODE]=!0:i.redraw()}r.touches.length<2&&(i.pinching=!1,i.data.canvasNeedsRedraw[t.NODE]=!0,i.redraw());var m=!1;if(null!=n&&(n._private.active=!1,m=!0,n.unactivate()),r.touches[2])i.data.bgActivePosistion=void 0,i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0;else if(r.touches[1]);else if(r.touches[0]);else if(!r.touches[0]){if(i.data.bgActivePosistion=void 0,i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0,null!=n){n._private.grabbed&&(n._private.grabbed=!1,n.trigger("free"),n._private.rscratch.inDragLayer=!1);for(var x=n._private.edges,b=0;bc;c++)d[4*c]=p[2*c],d[4*c+1]=p[2*c+1],d[4*c+2]=h[2*c],d[4*c+3]=h[2*c+1];d=e.math.fitPolygonToSquare(d),n.star5=n.star={points:d,draw:function(e,t,r,a,o){i.drawPolygon(e,t,r,a,o,n.star5.points)},drawPath:function(e,t,r,a,o){i.drawPolygonPath(e,t,r,a,o,n.star5.points)},intersectLine:function(e,t,r,a,o,s,l){return i.polygonIntersectLine(o,s,n.star5.points,e,t,r/2,a/2,l)},intersectBox:function(e,t,r,a,o,s,l,u,c){var d=n.star5.points;return i.boxIntersectPolygon(e,t,r,a,d,o,s,l,u,[0,-1],c)},checkPoint:function(t,i,r,a,o,s,l){return e.math.pointInsidePolygon(t,i,n.star5.points,s,l,a,o,[0,-1],r)}}}(cytoscape),function(e){"use strict";function t(t){this._private={},this._private.options=e.util.extend({},i,t)}var i={animate:!0,maxSimulationTime:4e3,fit:!0,padding:30,boundingBox:void 0,ungrabifyWhileSimulating:!1,ready:void 0,stop:void 0,repulsion:void 0,stiffness:void 0,friction:void 0,gravity:!0,fps:void 0,precision:void 0,nodeMass:void 0,edgeLength:void 0,stepSize:.1,stableEnergy:function(e){var t=e;return t.max<=.5||t.mean<=.3},infinite:!1};t.prototype.run=function(){var t=this,i=this._private.options;return e.util.require("arbor",function(r){function n(e,t){return null==t?void 0:"function"==typeof t?t.apply(e,[e._private.data,{nodes:u.length,edges:c.length,element:e}]):t}function a(e){if(!e.isFullAutoParent()){var t=e._private.data.id,r=n(e,i.nodeMass),a=e._private.locked,o=e.position(),s=h.fromScreen({x:o.x,y:o.y});e.scratch().arbor=h.addNode(t,{element:e,mass:r,fixed:a,x:a?s.x:void 0,y:a?s.y:void 0})}}function o(e){var t=e.source().id(),r=e.target().id(),a=n(e,i.edgeLength);e.scratch().arbor=h.addEdge(t,r,{length:a})}var s=i.cy,l=i.eles,u=l.nodes().not(":parent"),c=l.edges(),d=e.util.makeBoundingBox(i.boundingBox?i.boundingBox:{x1:0,y1:0,w:s.width(),h:s.height()}),p=!1;if(t.trigger({type:"layoutstart",layout:t}),void 0!==i.liveUpdate&&(i.animate=i.liveUpdate),s.nodes().size()<=1)return i.fit&&s.reset(),s.nodes().position({x:Math.round((d.x1+d.x2)/2),y:Math.round((d.y1+d.y2)/2)}),t.one("layoutready",i.ready),t.trigger({type:"layoutready",layout:t}),t.one("layoutstop",i.stop),void t.trigger({type:"layoutstop",layout:t});var h=t._private.system=r.ParticleSystem();h.parameters({repulsion:i.repulsion,stiffness:i.stiffness,friction:i.friction,gravity:i.gravity,fps:i.fps,dt:i.dt,precision:i.precision}),i.animate&&i.fit&&s.fit(d,i.padding);var v,f=250,g=!1,y=+new Date,m={init:function(){},redraw:function(){var e=h.energy();if(!i.infinite&&null!=i.stableEnergy&&null!=e&&e.n>0&&i.stableEnergy(e))return void t.stop();i.infinite||1/0==f||(clearTimeout(v),v=setTimeout(P,f));var r=s.collection();h.eachNode(function(e,t){var i=e.data,n=i.element;null!=n&&(n.locked()||n.grabbed()||(n.silentPosition({x:d.x1+t.x,y:d.y1+t.y}),r.merge(n)))}),i.animate&&r.length>0&&(p=!0,r.rtrigger("position"),i.fit&&s.fit(i.padding),y=+new Date,p=!1),g||(g=!0,t.one("layoutready",i.ready),t.trigger({type:"layoutready",layout:t}))}};h.renderer=m,h.screenSize(d.w,d.h),h.screenPadding(i.padding,i.padding,i.padding,i.padding),h.screenStep(i.stepSize);var x;u.on("grab free position",x=function(e){if(!p){var t=this.position(),n=h.fromScreen(t);if(n){var a=r.Point(n.x,n.y),o=i.padding;switch(d.x1+o<=t.x&&t.x<=d.x2-o&&d.y1+o<=t.y&&t.y<=d.y2-o&&(this.scratch().arbor.p=a),e.type){case"grab":this.scratch().arbor.fixed=!0;break;case"free":this.scratch().arbor.fixed=!1}}}});var b;u.on("lock unlock",b=function(){node.scratch().arbor.fixed=node.locked()});var w;l.on("remove",w=function(){});var _;s.on("add","*",_=function(){});var E;s.on("resize",E=function(){if(null==i.boundingBox&&null!=t._private.system){var e=s.width(),r=s.height();h.screenSize(e,r)}}),u.each(function(e,t){a(t)}),c.each(function(e,t){o(t)});var S=u.filter(":grabbable");i.ungrabifyWhileSimulating&&S.ungrabify();var P=t._private.doneHandler=function(){t._private.doneHandler=null,i.animate||(i.fit&&s.reset(),u.rtrigger("position")),u.off("grab free position",x),u.off("lock unlock",b),l.off("remove",w),s.off("add","*",_),s.off("resize",E),i.ungrabifyWhileSimulating&&S.grabify(),t.one("layoutstop",i.stop),t.trigger({type:"layoutstop",layout:t})};h.start(),!i.infinite&&null!=i.maxSimulationTime&&i.maxSimulationTime>0&&1/0!==i.maxSimulationTime&&setTimeout(function(){t.stop()},i.maxSimulationTime)}),this},t.prototype.stop=function(){return null!=this._private.system&&this._private.system.stop(),this._private.doneHandler&&this._private.doneHandler(),this},e("layout","arbor",t)}(cytoscape),function(e){"use strict";function t(t){this.options=e.util.extend({},i,t)}var i={fit:!0,directed:!1,padding:30,circle:!1,boundingBox:void 0,avoidOverlap:!0,roots:void 0,maximalAdjustments:0,animate:!1,animationDuration:500,ready:void 0,stop:void 0};t.prototype.run=function(){var t,i=this.options,r=i,n=i.cy,a=r.eles,o=a.nodes().not(":parent"),s=a,l=e.util.makeBoundingBox(r.boundingBox?r.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()});if(e.is.elementOrCollection(r.roots))t=r.roots;else if(e.is.array(r.roots)){for(var u=[],c=0;c0;){var f=n.collection();a.bfs({roots:v[0],visit:function(e,t,i){f=f.add(i)},directed:!1}),v=v.not(f),h.push(f)}t=n.collection();for(var c=0;cC;){for(var D=P.shift(),N=D.neighborhood().nodes(),T=!1,c=0;cc;c++)for(var M=x[c],R=M.length,X=0;R>X;X++){var p=M[X],V=p._private.scratch.breadthfirst,Y=I(p);Y&&(V.intEle=Y,O.push(p))}for(var c=0;cx.length-1;)x.push([]);x[q].push(p),V.depth=q,V.index=x[q].length-1}B()}var F=0;if(r.avoidOverlap){for(var c=0;cl||0===t)&&(r+=s/u,n++)}return n=Math.max(1,n),r/=n,0===n&&(r=void 0),H[e.id()]=r,r},Z=function(e,t){var i=$(e),r=$(t);return i-r},U=0;3>U;U++){for(var c=0;c0&&x[0].length<=3?c/2:0),g=2*Math.PI/x[n].length*a;return 0===n&&1===x[0].length&&(f=1),{x:K.x+f*Math.cos(g),y:K.y+f*Math.sin(g)}}return{x:K.x+(a+1-(o+1)/2)*s,y:(n+1)*u}},Q={},c=x.length-1;c>=0;c--)for(var M=x[c],X=0;X1&&r.avoidOverlap){d*=1.75;var c=2*Math.PI/o.length,f=Math.cos(c)-Math.cos(0),g=Math.sin(c)-Math.sin(0),y=Math.sqrt(d*d/(f*f+g*g));t=Math.max(y,t)}var m=function(){var e=t*Math.cos(u),i=t*Math.sin(u),n={x:l.x+e,y:l.y+i};return u=r.counterclockwise?u-c:u+c,n};return o.layoutPositions(this,r,m),this},e("layout","circle",t)}(cytoscape),function(e){"use strict";function t(t){this.options=e.util.extend(!0,{},i,t)}var i={animate:!0,refresh:1,maxSimulationTime:4e3,ungrabifyWhileSimulating:!1,fit:!0,padding:30,boundingBox:void 0,ready:function(){},stop:function(){},randomize:!1,avoidOverlap:!0,handleDisconnected:!0,nodeSpacing:function(){return 10},flow:void 0,alignment:void 0,edgeLength:void 0,edgeSymDiffLength:void 0,edgeJaccardLength:void 0,unconstrIter:void 0,userConstIter:void 0,allConstIter:void 0,infinite:!1};t.prototype.run=function(){var t=this,i=this.options;return e.util.require("cola",function(r){var n=i.cy,a=i.eles,o=a.nodes(),s=a.edges(),l=!1,u=e.util.makeBoundingBox(i.boundingBox?i.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()}),c=function(t,i){if(e.is.fn(t)){var r=t;return r.apply(i,[i])}return t},d=function(){for(var e={min:1/0,max:-1/0},t={min:1/0,max:-1/0},r=0;ri&&!e;i++)e=e||n();return e};if(i.animate){var o=function(){a()||e.util.requestAnimationFrame(o)};e.util.requestAnimationFrame(o)}else for(;!n(););},on:function(){},drag:function(){}});t.adaptor=g;var y=o.filter(":grabbable");i.ungrabifyWhileSimulating&&y.ungrabify();var m;o.on("grab free position",m=function(t){var i=this,r=i._private.scratch.cola,n=i._private.position;switch(i.grabbed()?(r.x=n.x-u.x1,r.y=n.y-u.y1,g.dragstart(r)):e.is.number(r.x)&&e.is.number(r.y)&&(n.x=r.x+u.x1,n.y=r.y+u.y1),t.type){case"grab":g.dragstart(r),g.resume();break;case"free":g.dragend(r)}});var x;o.on("lock unlock",x=function(){var e=this,t=e._private.scratch.cola;e.locked()?g.dragstart(t):g.dragend(t)});var b=o.stdFilter(function(e){return!e.isParent()});if(g.nodes(b.map(function(e,t){var r=c(i.nodeSpacing,e),n=e.position(),a=e._private.scratch.cola={x:i.randomize?Math.round(Math.random()*u.w):n.x,y:i.randomize?Math.round(Math.random()*u.h):n.y,width:e.outerWidth()+2*r,height:e.outerHeight()+2*r,index:t};return a})),i.alignment){var w=[],_=[];b.forEach(function(e){var t=c(i.alignment,e),r=e._private.scratch.cola,n=r.index;t&&(null!=t.x&&w.push({node:n,offset:t.x}),null!=t.y&&_.push({node:n,offset:t.y}))});var E=[];w.length>0&&E.push({type:"alignment",axis:"x",offsets:w}),_.length>0&&E.push({type:"alignment",axis:"y",offsets:_}),g.constraints(E)}g.groups(o.stdFilter(function(e){return e.isParent()}).map(function(e,t){return e._private.scratch.cola={index:t,leaves:e.children().stdFilter(function(e){return!e.isParent()}).map(function(e){return e[0]._private.scratch.cola.index})},e}).map(function(e){return e._private.scratch.cola.groups=e.children().stdFilter(function(e){return e.isParent()}).map(function(e){return e._private.scratch.cola.index}),e._private.scratch.cola}));var S,P;null!=i.edgeLength?(S=i.edgeLength,P="linkDistance"):null!=i.edgeSymDiffLength?(S=i.edgeSymDiffLength,P="symmetricDiffLinkLengths"):null!=i.edgeJaccardLength?(S=i.edgeJaccardLength,P="jaccardLinkLengths"):(S=100,P="linkDistance");var k=function(e){return e.calcLength};if(g.links(s.stdFilter(function(e){return!e.source().isParent()&&!e.target().isParent()}).map(function(e){var t=e._private.scratch.cola={source:e.source()[0]._private.scratch.cola.index,target:e.target()[0]._private.scratch.cola.index};return null!=S&&(t.calcLength=c(S,e)),t})),g.size([u.w,u.h]),null!=S&&g[P](k),i.flow){var C,D="y",N=50;e.is.string(i.flow)?C={axis:i.flow,minSeparation:N}:e.is.number(i.flow)?C={axis:D,minSeparation:i.flow}:e.is.plainObject(i.flow)?(C=i.flow,C.axis=C.axis||D,C.minSeparation=null!=C.minSeparation?C.minSeparation:N):C={axis:D,minSeparation:N},g.flowLayout(C.axis,C.minSeparation)}g.avoidOverlaps(i.avoidOverlap).handleDisconnected(i.handleDisconnected).start(i.unconstrIter,i.userConstIter,i.allConstIter),t.trigger({type:"layoutstart",layout:t}),i.infinite||setTimeout(function(){g.stop()},i.maxSimulationTime)}),this},t.prototype.stop=function(){return this.adaptor&&(this.manuallyStopped=!0,this.adaptor.stop()),this},e("layout","cola",t)}(cytoscape),function(e){"use strict";function t(t){this.options=e.util.extend({},i,t)}var i={fit:!0,padding:30,startAngle:1.5*Math.PI,counterclockwise:!1,minNodeSpacing:10,boundingBox:void 0,avoidOverlap:!0,height:void 0,width:void 0,concentric:function(){return this.degree()},levelWidth:function(e){return e.maxDegree()/4},animate:!1,animationDuration:500,ready:void 0,stop:void 0};t.prototype.run=function(){for(var t=this.options,i=t,r=t.cy,n=i.eles,a=n.nodes().not(":parent"),o=e.util.makeBoundingBox(i.boundingBox?i.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()}),s={x:o.x1+o.w/2,y:o.y1+o.h/2},l=[],u=i.startAngle,c=0,d=0;d0){var m=Math.abs(g[0].value-y.value);m>=v&&(g=[],f.push(g))}g.push(y)}var x={},b=0,w=c+i.minNodeSpacing;if(!i.avoidOverlap){var _=f.length>0&&f[0].length>1,E=Math.min(o.w,o.h)/2-w,S=E/(f.length+_?1:0);w=Math.min(w,S)}for(var d=0;d1&&i.avoidOverlap){var C=Math.cos(k)-Math.cos(0),D=Math.sin(k)-Math.sin(0),N=Math.sqrt(w*w/(C*C+D*D));b=Math.max(N,b)}for(var T=0;T=d;){var g=c[d++],y=s.idToIndex[g],m=s.layoutNodes[y],x=m.children;if(x.length>0){s.graphSet.push(x);for(var l=0;lr.count?0:r.graph},o=function(e,t,i,r){var n=r.graphSet[i];if(-1<$.inArray(e,n)&&-1<$.inArray(t,n))return{count:2,graph:i};for(var a=0,s=0;ss;s++)for(var l=e.layoutNodes[e.idToIndex[a[s]]],u=s+1;o>u;u++){var c=e.layoutNodes[e.idToIndex[a[u]]];p(l,c,e,t,i)}}},p=function(e,t,i,r,n){var a="Node repulsion. Node1: "+e.id+" Node2: "+t.id,o=t.positionX-e.positionX,s=t.positionY-e.positionY;if(a+="\ndirectionX: "+o+", directionY: "+s,0===o&&0===s)return void(a+="\nNodes have the same position.");var l=v(e,t,o,s);if(l>0){a+="\nNodes DO overlap.",a+="\nOverlap: "+l;var u=n.nodeOverlap*l,c=Math.sqrt(o*o+s*s);a+="\nDistance: "+c;var d=u*o/c,p=u*s/c}else{a+="\nNodes do NOT overlap.";var f=h(e,o,s),g=h(t,-1*o,-1*s),y=g.x-f.x,m=g.y-f.y,x=y*y+m*m,c=Math.sqrt(x);a+="\nDistance: "+c;var u=n.nodeRepulsion/x,d=u*y/c,p=u*m/c}e.offsetX-=d,e.offsetY-=p,t.offsetX+=d,t.offsetY+=p,a+="\nForceX: "+d+" ForceY: "+p,w(a)},h=function(e,t,i){var r=e.positionX,n=e.positionY,a=e.height,o=e.width,s=i/t,l=a/o,u="Computing clipping point of node "+e.id+" . Height: "+a+", Width: "+o+"\nDirection "+t+", "+i,c={};do{if(0===t&&i>0){c.x=r,u+="\nUp direction",c.y=n+a/2;break}if(0===t&&0>i){c.x=r,c.y=n+a/2,u+="\nDown direction";break}if(t>0&&s>=-1*l&&l>=s){c.x=r+o/2,c.y=n+o*i/2/t,u+="\nRightborder";break}if(0>t&&s>=-1*l&&l>=s){c.x=r-o/2,c.y=n-o*i/2/t,u+="\nLeftborder";break}if(i>0&&(-1*l>=s||s>=l)){c.x=r+a*t/2/i,c.y=n+a/2,u+="\nTop border";break}if(0>i&&(-1*l>=s||s>=l)){c.x=r-a*t/2/i,c.y=n-a/2,u+="\nBottom border";break}}while(!1);return u+="\nClipping point found at "+c.x+", "+c.y,w(u),c},v=function(e,t,i,r){if(i>0)var n=e.maxX-t.minX;else var n=t.maxX-e.minX;if(r>0)var a=e.maxY-t.minY;else var a=t.maxY-e.minY;return n>=0&&a>=0?Math.sqrt(n*n+a*a):0},f=function(e,t,i){for(var r=0;rd;d++){var p=e.layoutNodes[e.idToIndex[a[d]]];r="Node: "+p.id;var h=s-p.positionX,v=l-p.positionY,f=Math.sqrt(h*h+v*v);if(f>1){var g=i.gravity*h/f,y=i.gravity*v/f;p.offsetX+=g,p.offsetY+=y,r+=": Applied force: "+g+", "+y}else r+=": skypped since it's too close to center";w(r)}}},y=function(e){var t=[],i=0,r=-1;for(w("propagateForces"),t.push.apply(t,e.graphSet[0]),r+=e.graphSet[0].length;r>=i;){var n=t[i++],a=e.idToIndex[n],o=e.layoutNodes[a],s=o.children;if(0i)var a={x:i*e/n,y:i*t/n};else var a={x:e,y:t};return r+=".\nResult: ("+a.x+", "+a.y+")",w(r),a},b=function(e,t){var i="Propagating new position/size of node "+e.id,r=e.parentId;if(null==r)return i+=". No parent node.",void w(i);var n=t.layoutNodes[t.idToIndex[r]],a=!1;return(null==n.maxX||e.maxX+n.padRight>n.maxX)&&(n.maxX=e.maxX+n.padRight,a=!0,i+="\nNew maxX for parent node "+n.id+": "+n.maxX),(null==n.minX||e.minX-n.padLeftn.maxY)&&(n.maxY=e.maxY+n.padBottom,a=!0,i+="\nNew maxY for parent node "+n.id+": "+n.maxY),(null==n.minY||e.minY-n.padTops){var h=d(),v=p();(h-1)*v>=s?d(h-1):(v-1)*h>=s&&p(v-1)}else for(;s>c*u;){var h=d(),v=p();(v+1)*h>=s?p(v+1):d(h+1)}var f=o.w/c,g=o.h/u;if(i.avoidOverlap)for(var y=0;y=c&&(P=0,S++)},C={},y=0;y0&&r.animate&&(s=!0,m.rtrigger("position"),r.fit&&l.fit(r.padding),m=l.collection(),s=!1)},function(){},function(e,i){var n=g(i),a=e.data.element;a.locked()||a.grabbed()||(a._private.position={x:n.x,y:n.y},m.merge(a)),b==x&&(t.one("layoutready",r.ready),t.trigger({type:"layoutready",layout:t})),b++});c.each(function(e,t){r.random||a(t)});var _;c.on("position",_=function(){s||a(this)});var E=c.filter(":grabbable");i.stopSystem=function(){h.filterNodes(function(){return!1}),r.ungrabifyWhileSimulating&&E.grabify(),r.fit&&l.fit(r.padding),c.off("drag position",_),t.one("layoutstop",r.stop),t.trigger({type:"layoutstop",layout:t}),i.stopSystem=null},o(),r.infinite||setTimeout(function(){i.stop()},r.maxSimulationTime)}),this},t.prototype.stop=function(){return null!=this.stopSystem&&this.stopSystem(),this},e("layout","springy",t)}(cytoscape),function(e){"use strict";function t(e){this.options=e}t.prototype.recalculateRenderedStyle=function(){},t.prototype.notify=function(){},e("renderer","null",t)}(cytoscape); \ No newline at end of file diff --git a/flexiblepower.felix.webconsole.plugins/res/index.html b/flexiblepower.felix.webconsole.plugins/res/index.html deleted file mode 100644 index 6f32241..0000000 --- a/flexiblepower.felix.webconsole.plugins/res/index.html +++ /dev/null @@ -1,44 +0,0 @@ -
- Status:   -
- -
- - - - -
- -
-
- - - - - - - - - - - - - - - - - - - - - -
Nothing selected
-
- - - - - diff --git a/flexiblepower.felix.webconsole.plugins/src/.gitignore b/flexiblepower.felix.webconsole.plugins/src/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/flexiblepower.felix.webconsole.plugins/src/org/flexiblepower/felix/webconsole/plugins/ConnectionManagerPlugin.java b/flexiblepower.felix.webconsole.plugins/src/org/flexiblepower/felix/webconsole/plugins/ConnectionManagerPlugin.java deleted file mode 100644 index cb8f1fd..0000000 --- a/flexiblepower.felix.webconsole.plugins/src/org/flexiblepower/felix/webconsole/plugins/ConnectionManagerPlugin.java +++ /dev/null @@ -1,266 +0,0 @@ -package org.flexiblepower.felix.webconsole.plugins; - -import java.io.IOException; -import java.io.InputStream; -import java.io.PrintWriter; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; - -import javax.servlet.Servlet; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.io.IOUtils; -import org.flexiblepower.messaging.ConnectionManager; -import org.flexiblepower.messaging.ConnectionManager.EndpointPort; -import org.flexiblepower.messaging.ConnectionManager.ManagedEndpoint; -import org.flexiblepower.messaging.ConnectionManager.PotentialConnection; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import aQute.bnd.annotation.component.Component; -import aQute.bnd.annotation.component.Reference; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; - -@Component(provide = Servlet.class, properties = { "felix.webconsole.title=ConnectionManager", - "felix.webconsole.label=fpai-connection-manager", - "felix.webconsole.category=FPAI" }) -public class ConnectionManagerPlugin extends HttpServlet { - private static final long serialVersionUID = 7146852312931261310L; - private static final Logger logger = LoggerFactory - .getLogger(ConnectionManagerPlugin.class); - - private static final String[] SERVED_FILES = new String[] { "connectionManager.js", - "cytoscape.min.js", - "index.html" }; - - private ConnectionManager connectionManager; - private HashMap connectionCache; - - @Reference - public void setConnectionManager(ConnectionManager connectionManager) { - this.connectionManager = connectionManager; - } - - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) - throws ServletException, IOException { - String path = req.getPathInfo(); - if (path.startsWith("/fpai-connection-manager")) { - path = path.substring(24); - if (!path.isEmpty() && path.charAt(0) == '/') { - path = path.substring(1); - } - } - - if (Arrays.binarySearch(SERVED_FILES, path, null) >= 0) { - serveFile(resp, path); - } else if (path.equals("")) { - resp.sendRedirect("fpai-connection-manager/index.html"); - } else if (path.equals("getGraph.json")) { - sendJson(resp, createGraphJson(connectionManager.getEndpoints().values())); - } else { - resp.getWriter().print("GET Not yet implemented: " + path); - resp.getWriter().close(); - } - } - - @Override - protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - PrintWriter w = resp.getWriter(); - - String path = req.getPathInfo(); - if (path.startsWith("/fpai-connection-manager")) { - path = path.substring(24); - if (!path.isEmpty() && path.charAt(0) == '/') { - path = path.substring(1); - } - } - logger.debug("path: " + path); - if (path.endsWith(".json")) { - resp.setContentType("application/json"); - } - if (path.equals("autoconnect.json")) { - autoconnect(w); - } else if (path.equals("connect.json")) { - connect(req, w); - } else if (path.equals("disconnect.json")) { - disconnect(req, w); - } else { - w.print("POST Not yet implemented: " + path); - } - w.close(); - } - - private void serveFile(HttpServletResponse resp, String path) throws IOException { - if (path.endsWith(".js")) { - resp.setContentType("application/x-javascript"); - } else if (path.endsWith(".html")) { - resp.setContentType("text/html"); - } - - InputStream input = getClass().getClassLoader() - .getResourceAsStream(path); - if (input == null) { - logger.debug("Could not find file {}", path); - resp.sendError(404); - } else { - logger.debug("Serving file {}", path); - IOUtils.copy(input, resp.getWriter()); - } - } - - private void autoconnect(PrintWriter w) { - logger.debug("autoconnect called"); - connectionManager.autoConnect(); - w.print("{\"autoconnected\": true, \"class\": \"\"}"); - } - - private void connect(HttpServletRequest req, PrintWriter w) { - final String id = req.getParameter("id"); - if (connectionCache.containsKey(id)) { - PotentialConnection connection = connectionCache.get(id); - if (!connection.isConnected()) { - logger.debug("Calling connect for " + id); - try { - connection.connect(); - w.print("{\"status\": \"Connected " + id + "\", \"class\": \"\"}"); - } catch (IllegalStateException e) { - logger.error(e.getMessage()); - e.printStackTrace(); - w.print("{\"status\": \"Connect was called for " + id - + ", but " + e.getMessage() + "\", \"class\": \"ui-state-error\"}"); - } - - } else { - logger.error("Connect was called for " + id + ", but it was already connected"); - w.print("{\"status\": \"Connect was called for " + id - + ", but it was already connected\", \"class\": \"ui-state-error\"}"); - } - } else { - logger.error("Connect was called for " + id + ", but it was not found in the cache"); - w.print("{\"status\": \"Connect was called for " + id - + ", but it was not found in the cache\", \"class\": \"ui-state-error\"}"); - } - } - - private void disconnect(HttpServletRequest req, PrintWriter w) { - final String id = req.getParameter("id"); - if (connectionCache.containsKey(id)) { - PotentialConnection connection = connectionCache.get(id); - if (connection.isConnected()) { - logger.debug("Calling disconnect for " + id); - connection.disconnect(); - w.print("{\"status\": \"Disconnected " + id + "\", \"class\": \"\"}"); - } else { - w.print("{\"status\": \"Disconnect was called for " + id - + ", but it was already disconnected\", \"class\": \"ui-state-error\"}"); - logger.error("Disconnect was called for " + id + ", but it was already disconnected"); - } - } else { - w.print("{\"status\": \"Disonnect was called for " + id - + ", but it was not found in the cache\", \"class\": \"ui-state-error\"}"); - logger.error("Disonnect was called for " + id + ", but it was not found in the cache"); - } - } - - private void sendJson(HttpServletResponse resp, String graphJson) { - logger.debug("Sending nodes and edges as JSON"); - resp.setContentType("application/json"); - try { - PrintWriter w = resp.getWriter(); - w.print(graphJson); - w.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - private String createGraphJson(Collection values) { - if (connectionCache == null) { - connectionCache = new HashMap(); - } - - JsonArray elements = new JsonArray(); - - generateNodes(values, elements); - generateEdges(values, elements); - - return elements.toString(); - } - - private void generateNodes(Collection values, JsonArray elements) { - for (ManagedEndpoint me : values) { - JsonObject endpoint = new JsonObject(); - endpoint.addProperty("group", "nodes"); - - String pid = me.getPid(); - String[] split = pid.split("\\."); - logger.trace("length " + split.length); - String name = split[split.length - 2]; - - logger.debug("Adding {} {}", pid, name); - - JsonObject endpointdata = new JsonObject(); - endpointdata.addProperty("id", pid); - endpointdata.addProperty("name", name); - endpoint.add("data", endpointdata); - - elements.add(endpoint); - - for (EndpointPort ep : me.getPorts().values()) { - // add endpoint port - JsonObject endpointport = new JsonObject(); - endpointport.addProperty("group", "nodes"); - JsonObject data = new JsonObject(); - data.addProperty("id", me.getPid() + "-" + ep.getName()); - data.addProperty("name", ep.getName()); - data.addProperty("parent", me.getPid()); - endpointport.add("data", data); - elements.add(endpointport); - } - } - } - - private void generateEdges(Collection values, JsonArray elements) { - int i = 0; - for (ManagedEndpoint me : values) { - for (EndpointPort ep : me.getPorts().values()) { - for (PotentialConnection pc : ep.getPotentialConnections().values()) { - JsonObject connection = new JsonObject(); - connection.addProperty("group", "edges"); - EndpointPort either = pc.getEitherEnd(); - if (either == ep) { - EndpointPort other = pc.getOtherEnd(either); - String eitherend = either.getEndpoint().getPid() + "-" + either.getName(); - String otherend = other.getEndpoint().getPid() + "-" + other.getName(); - - String id = "connection-" + i++ + "-" + (eitherend + "-" + otherend).hashCode(); - connectionCache.put(id, pc); - - JsonObject connectiondata = new JsonObject(); - connectiondata.addProperty("id", id); - connectiondata.addProperty("source", eitherend); - connectiondata.addProperty("target", otherend); - connectiondata.addProperty("isconnected", pc.isConnected()); // pc.isConnected()); - connectiondata.addProperty("unconnectable", !pc.isConnectable()); - connection.add("data", connectiondata); - if (pc.isConnected()) { - connection.addProperty("classes", "isconnected"); - } else if (!pc.isConnectable()) { - connection.addProperty("classes", "unconnectable"); - } else { - connection.addProperty("classes", "notconnected"); - } - elements.add(connection); - } - } - } - } - } -} diff --git a/flexiblepower.felix.webconsole.plugins/src/org/flexiblepower/felix/webconsole/plugins/TestEndpoint.java b/flexiblepower.felix.webconsole.plugins/src/org/flexiblepower/felix/webconsole/plugins/TestEndpoint.java deleted file mode 100644 index 7a73ed5..0000000 --- a/flexiblepower.felix.webconsole.plugins/src/org/flexiblepower/felix/webconsole/plugins/TestEndpoint.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.flexiblepower.felix.webconsole.plugins; - -import org.flexiblepower.felix.webconsole.plugins.TestEndpoint.Config; -import org.flexiblepower.messaging.Connection; -import org.flexiblepower.messaging.Endpoint; -import org.flexiblepower.messaging.MessageHandler; -import org.flexiblepower.messaging.Port; -import org.flexiblepower.messaging.Ports; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import aQute.bnd.annotation.component.Component; -import aQute.bnd.annotation.metatype.Meta; - -@Component(immediate = false, designateFactory = Config.class) -@Ports({ @Port(name = "foo", sends = String.class, accepts = String.class), - @Port(name = "bar", sends = String.class, accepts = String.class), - @Port(name = "baz", sends = String.class, accepts = String.class) }) -public class TestEndpoint implements Endpoint { - public interface Config { - @Meta.AD - String message(); - } - - private static final Logger logger = LoggerFactory.getLogger(TestEndpoint.class); - - @Override - public MessageHandler onConnect(Connection connection) { - connection.sendMessage("Test"); - return new MessageHandler() { - - @Override - public void handleMessage(Object message) { - logger.info("got a message {}", message); - } - - @Override - public void disconnected() { - logger.trace("Disconnected TestEndpoint"); - } - }; - } -} diff --git a/flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/connectionManager.js b/flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/connectionManager.js deleted file mode 100644 index 6d61a7b..0000000 --- a/flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/connectionManager.js +++ /dev/null @@ -1,223 +0,0 @@ -cy = cytoscape({ - container : document.getElementById('cy'), - selectionType : 'single', // (isTouchDevice ? 'additive' : 'single'), - // layout: { - // name: 'circle', - // padding: 10 - // }, - layout : { - name : 'cose', - animate : false, - fit : true, - randomize : true - }, - zoom : 1, - minZoom : 0, - maxZoom : 100, - zoomingEnabled : true, - userZoomingEnabled : false, - pan : { - x : 0, - y : 0 - }, - panningEnabled : true, - userPanningEnabled : true, - autoungrabifyNodes : false, - hideEdgesOnViewport : false, - hideLabelsOnViewport : false, - textureOnViewport : false, - - style : [ { - selector : ':parent', - css : { - 'content' : 'data(name)', - 'font-family' : 'helvetica', - 'font-size' : 14, - 'text-outline-width' : 2, - 'text-outline-color' : '#000', - 'text-valign' : 'center', - 'color' : '#fff', - 'background-color' : '#0680C1', - 'background-color' : '#041B50', - 'line-color' : '#000', - 'text-outline-color' : '#000' - } - }, { - selector : ':child', - css : { - 'content' : 'data(name)', - 'font-family' : 'helvetica', - 'font-size' : 14, - 'text-outline-width' : 2, - 'text-outline-color' : '#000', - 'text-valign' : 'center', - 'color' : '#fff', - 'background-color' : '#0680C1', - 'background-color' : '#041B50', - 'line-color' : '#000', - 'text-outline-color' : '#000' - } - }, { - selector : 'edge', - css : { - 'opacity' : 0.9, - 'target-arrow-shape' : 'none' - - } - }, { - selector : '.faded', - css : { - 'opacity' : 0.85, - 'text-opacity' : 0.9 - } - }, { - selector : '.isconnected', - css : { - 'width' : 3, - 'line-color' : '#3F3', - 'line-style' : 'solid' - } - }, { - selector : '.notconnected', - css : { - 'width' : 3, - 'line-color' : '#AA0', - 'line-style' : 'dashed' - } - }, { - selector : '.unconnectable', - css : { - 'width' : 3, - 'opacity' : 0.3, - 'line-color' : '#A00', - 'line-style' : 'dotted' - } - } ], - // NOTE: in felix there is a hack here which changes the z-index. It should NOT do that here (or the whole plugin is hidden) -}); -function refresh() { - $.get("/system/console/fpai-connection-manager/getGraph.json", - function(json) { - console.log(json); - cy.load(json); - console.log("connected:"); - console.log(cy.edges("[isconnected]")); - }).fail(function(jqXHR, textStatus, errorThrown) { - console.log("error: " + textStatus + ": " + errorThrown); - }); - $("#connect").prop("disabled", true); - $("#disconnect").prop("disabled", true); - selectedEdgeId = null; -} -refresh(); - -function autoconnect() { - console.log("Autoconnecting.."); - $.post("/system/console/fpai-connection-manager/autoconnect.json", - function(result) { - $("#status").text(result.status); - $("#status").attr("class", result.class); - }).fail(function(jqXHR, textStatus, errorThrown) { - console.log("error: " + textStatus + ": " + errorThrown); - }); - - refresh(); -} - -var selectedEdgeId; -function connect() { - console.log("Connecting " + selectedEdgeId); - var postdata = { - "id" : selectedEdgeId - }; - $.post("/system/console/fpai-connection-manager/connect.json", postdata, - function(result) { - $("#status").text(result.status); - $("#status").attr("class", result.class); - }).fail(function(jqXHR, textStatus, errorThrown) { - console.log("error: " + textStatus + ": " + errorThrown); - }).always(refresh()); -} - -function disconnect() { - console.log("Disconnecting " + selectedEdgeId); - var postdata = { - "id" : selectedEdgeId - }; - $.post("/system/console/fpai-connection-manager/disconnect.json", postdata, - function(result) { - $("#status").text(result.status); - $("#status").attr("class", result.class); - }).fail(function(jqXHR, textStatus, errorThrown) { - console.log("error: " + textStatus + ": " + errorThrown); - }).always(refresh()); -} - -cy.on('tap', 'node', function(e) { - var node = e.cyTarget; - var neighborhood = node.neighborhood().add(node); - cy.elements().addClass('faded'); - neighborhood.removeClass('faded'); - - $("#connect").prop("disabled", true); - $("#disconnect").prop("disabled", true); - - onNodeSelected(node.id()); -}); - -cy.on('tap', 'edge', function(e) { - var edge = e.cyTarget; - var neighborhood = edge.connectedNodes().add(edge); - cy.elements().addClass('faded'); - neighborhood.removeClass('faded'); - - onEdgeSelected(edge.id()); -}); - -cy.on('tap', function(e) { - if (e.cyTarget === cy) { - cy.elements().removeClass('faded'); - onNothingSelected(); - } -}); - -function onNothingSelected() { - selectedEdgeId = null; - $(".infotable").text(""); - $("#1a").text("Nothing selected"); -} - -function onEdgeSelected(elemid) { - selectedEdgeId = elemid; - var elem = cy.$('#' + elemid); // select element - $(".infotable").text(""); - $("#1a").text("Possible connection"); - $("#2a").text("connects: "); - $("#2b").text(elem.data("source")); - $("#3a").text("with: "); - $("#3b").text(elem.data("target")); - $("#4a").text("Connected: "); - $("#4b").text(elem.data("isconnected")); - $("#5a").text("elemid: "); - $("#5b").text(elemid); - - if (elem.data("isconnected") || elem.data("unconnectable")) { - $("#connect").prop("disabled", true); - $("#disconnect").prop("disabled", false); - } else { - $("#connect").prop("disabled", false); - $("#disconnect").prop("disabled", true); - } -} - -function onNodeSelected(elemid) { - selectedEdgeId = null; - var elem = cy.$('#' + elemid); // select element - $(".infotable").text(""); - $("#1a").text("node"); - console.log(elem.data()); -} - -function updateInfo(elemid) { - -} diff --git a/flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/cytoscape.min.js b/flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/cytoscape.min.js deleted file mode 100644 index cedc7ce..0000000 --- a/flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/cytoscape.min.js +++ /dev/null @@ -1,24 +0,0 @@ -/*! - * This file is part of Cytoscape.js 2.3.1. - * - * Cytoscape.js is free software: you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) any - * later version. - * - * Cytoscape.js is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * - * You should have received a copy of the GNU Lesser General Public License along with - * Cytoscape.js. If not, see . - */ -var cytoscape;!function(e){"use strict";var t=cytoscape=function(){return cytoscape.init.apply(cytoscape,arguments)};t.version="2.3.1",t.init=function(e){return void 0===e&&(e={}),t.is.plainObject(e)?new t.Core(e):t.is.string(e)?t.extension.apply(t.extension,arguments):void 0},t.fn={},"undefined"!=typeof module&&module.exports&&(module.exports=cytoscape),"undefined"!=typeof define&&define.amd&&define("cytoscape",function(){return cytoscape}),e&&(e.cytoscape=cytoscape)}("undefined"==typeof window?null:window),function(e,t){"use strict";e.is={defined:function(e){return null!=e},string:function(e){return null!=e&&"string"==typeof e},fn:function(e){return null!=e&&"function"==typeof e},array:function(e){return Array.isArray?Array.isArray(e):null!=e&&e instanceof Array},plainObject:function(t){return null!=t&&typeof t==typeof{}&&!e.is.array(t)&&t.constructor===Object},number:function(e){return null!=e&&"number"==typeof e&&!isNaN(e)},integer:function(t){return e.is.number(t)&&Math.floor(t)===t},color:function(e){return null!=e&&"string"==typeof e&&""!==$.Color(e).toString()},bool:function(e){return null!=e&&typeof e==typeof!0},elementOrCollection:function(t){return e.is.element(t)||e.is.collection(t)},element:function(t){return t instanceof e.Element&&t._private.single},collection:function(t){return t instanceof e.Collection&&!t._private.single},core:function(t){return t instanceof e.Core},style:function(t){return t instanceof e.Style},stylesheet:function(t){return t instanceof e.Stylesheet},event:function(t){return t instanceof e.Event},emptyString:function(t){return t?e.is.string(t)&&(""===t||t.match(/^\s+$/))?!0:!1:!0},nonemptyString:function(t){return t&&e.is.string(t)&&""!==t&&!t.match(/^\s+$/)?!0:!1},domElement:function(e){return"undefined"==typeof HTMLElement?!1:e instanceof HTMLElement},touch:function(){return t&&("ontouchstart"in t||t.DocumentTouch&&document instanceof DocumentTouch)},boundingBox:function(t){return e.is.plainObject(t)&&e.is.number(t.x1)&&e.is.number(t.x2)&&e.is.number(t.y1)&&e.is.number(t.y2)}}}(cytoscape,"undefined"==typeof window?null:window),function(e,t){"use strict";e.util={extend:function(){var t,i,r,n,a,o,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||e.is.fn(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(t=arguments[l]))for(i in t)r=s[i],n=t[i],s!==n&&(c&&n&&(e.is.plainObject(n)||(a=e.is.array(n)))?(a?(a=!1,o=r&&e.is.array(r)?r:[]):o=r&&e.is.plainObject(r)?r:{},s[i]=e.util.extend(c,o,n)):void 0!==n&&(s[i]=n));return s},require:function(i,r,n){var a;n=e.util.extend({msgIfNotFound:!0},n);var o=!1,s=function(e){o=!0,r(e)},l=function(e){t&&(a=t[i]),void 0!==a&&s(a),e&&e()},u=function(){o||c(d)},c=function(e){"undefined"!=typeof module&&module.exports&&require&&(a=require(i)),void 0!==a&&s(a),e&&e()},d=function(){o||p(h)},p=function(e){"undefined"!=typeof define&&define.amd&&require&&require([i],function(t){a=t,void 0!==a&&s(a),e&&e()})},h=function(){!o&&n.msgIfNotFound&&e.util.error("Cytoscape.js tried to pull in dependency `"+i+"` but no module (i.e. CommonJS, AMD, or window) was found")};l(u)},requires:function(t,i){for(var r=[],n=[],a=function(){for(var e=0;e=r){a&&clearTimeout(a);var p=c;a=u=c=void 0,p&&(d=e.util.now(),o=t.apply(l,n),u||a||(n=l=null))}else u=setTimeout(f,r)},g=function(){u&&clearTimeout(u),a=u=c=void 0,(h||p!==i)&&(d=e.util.now(),o=t.apply(l,n),u||a||(n=l=null))};return function(){if(n=arguments,s=e.util.now(),l=this,c=h&&(u||!v),p===!1)var r=v&&!u;else{a||v||(d=s);var y=p-(s-d),m=0>=y;m?(a&&(a=clearTimeout(a)),d=s,o=t.apply(l,n)):a||(a=setTimeout(g,y))}return m&&u?u=clearTimeout(u):u||i===p||(u=setTimeout(f,i)),r&&(m=!0,o=t.apply(l,n)),!m||u||a||(n=l=null),o}}},error:function(e){if(!console)throw e;if(console.error)console.error.apply(console,arguments);else{if(!console.log)throw e;console.log.apply(console,arguments)}},clone:function(e){var t={};for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t},copy:function(t){return null==t?t:e.is.array(t)?t.slice():e.is.plainObject(t)?e.util.clone(t):t},makeBoundingBox:function(e){if(null!=e.x1&&null!=e.y1){if(null!=e.x2&&null!=e.y2&&e.x2>=e.x1&&e.y2>=e.y1)return{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,w:e.x2-e.x1,h:e.y2-e.y1};if(null!=e.w&&null!=e.h&&e.w>=0&&e.h>=0)return{x1:e.x1,y1:e.y1,x2:e.x1+e.w,y2:e.y1+e.h,w:e.w,h:e.h}}},mapEmpty:function(e){var t=!0;if(null!=e)for(var i in e){t=!1;break}return t},pushMap:function(t){var i=e.util.getMap(t);null==i?e.util.setMap($.extend({},t,{value:[t.value]})):i.push(t.value)},setMap:function(t){for(var i,r=t.map,n=t.keys,a=n.length,o=0;a>o;o++){var i=n[o];e.is.plainObject(i)&&e.util.error("Tried to set map with object key"),oa;a++){var o=r[a];if(e.is.plainObject(o)&&e.util.error("Tried to get map with object key"),i=i[o],null==i)return i}return i},deleteMap:function(t){for(var i=t.map,r=t.keys,n=r.length,a=t.keepChildren,o=0;n>o;o++){var s=r[o];e.is.plainObject(s)&&e.util.error("Tried to delete map with object key");var l=o===t.keys.length-1;if(l)if(a)for(var u in i)a[u]||(i[u]=void 0);else i[s]=void 0;else i=i[s]}},capitalize:function(t){return e.is.emptyString(t)?t:t.charAt(0).toUpperCase()+t.substring(1)},camel2dash:function(e){for(var t=[],i=0;it&&" "===e[i];i--);return e.substring(t,i+1)},hex2tuple:function(e){if((4===e.length||7===e.length)&&"#"===e[0]){var t,i,r,n=4===e.length,a=16;return n?(t=parseInt(e[1]+e[1],a),i=parseInt(e[2]+e[2],a),r=parseInt(e[3]+e[3],a)):(t=parseInt(e[1]+e[2],a),i=parseInt(e[3]+e[4],a),r=parseInt(e[5]+e[6],a)),[t,i,r]}},hsl2tuple:function(t){function i(e,t,i){return 0>i&&(i+=1),i>1&&(i-=1),1/6>i?e+6*(t-e)*i:.5>i?t:2/3>i?e+(t-e)*(2/3-i)*6:e}var r,n,a,o,s,l,u,c,d=new RegExp("^"+e.util.regex.hsla+"$").exec(t);if(d){if(n=parseInt(d[1]),0>n?n=(360- -1*n%360)%360:n>360&&(n%=360),n/=360,a=parseFloat(d[2]),0>a||a>100)return;if(a/=100,o=parseFloat(d[3]),0>o||o>100)return;if(o/=100,s=d[4],void 0!==s&&(s=parseFloat(s),0>s||s>1))return;if(0===a)l=u=c=Math.round(255*o);else{var p=.5>o?o*(1+a):o+a-o*a,h=2*o-p;l=Math.round(255*i(h,p,n+1/3)),u=Math.round(255*i(h,p,n)),c=Math.round(255*i(h,p,n-1/3))}r=[l,u,c,s]}return r},rgb2tuple:function(t){var i,r=new RegExp("^"+e.util.regex.rgba+"$").exec(t);if(r){i=[];for(var n=[],a=1;3>=a;a++){var o=r[a];if("%"===o[o.length-1]&&(n[a]=!0),o=parseFloat(o),n[a]&&(o=o/100*255),0>o||o>255)return;i.push(Math.floor(o))}var s=n[1]||n[2]||n[3],l=n[1]&&n[2]&&n[3];if(s&&!l)return;var u=r[4];if(void 0!==u){if(u=parseFloat(u),0>u||u>1)return;i.push(u)}}return i},colorname2tuple:function(t){return e.util.colors[t.toLowerCase()]},color2tuple:function(t){return(e.is.array(t)?t:null)||e.util.colorname2tuple(t)||e.util.hex2tuple(t)||e.util.rgb2tuple(t)||e.util.hsl2tuple(t)},tuple2hex:function(e){function t(e){var t=e.toString(16);return 1===t.length&&(t="0"+t),t}var i=e[0],r=e[1],n=e[2];return"#"+t(i)+t(r)+t(n)},colors:{transparent:[0,0,0,0],aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},e.util.regex={},e.util.regex.number="(?:[-]?\\d*\\.\\d+|[-]?\\d+|[-]?\\d*\\.\\d+[eE]\\d+)",e.util.regex.rgba="rgb[a]?\\(("+e.util.regex.number+"[%]?)\\s*,\\s*("+e.util.regex.number+"[%]?)\\s*,\\s*("+e.util.regex.number+"[%]?)(?:\\s*,\\s*("+e.util.regex.number+"))?\\)",e.util.regex.rgbaNoBackRefs="rgb[a]?\\((?:"+e.util.regex.number+"[%]?)\\s*,\\s*(?:"+e.util.regex.number+"[%]?)\\s*,\\s*(?:"+e.util.regex.number+"[%]?)(?:\\s*,\\s*(?:"+e.util.regex.number+"))?\\)",e.util.regex.hsla="hsl[a]?\\(("+e.util.regex.number+")\\s*,\\s*("+e.util.regex.number+"[%])\\s*,\\s*("+e.util.regex.number+"[%])(?:\\s*,\\s*("+e.util.regex.number+"))?\\)",e.util.regex.hslaNoBackRefs="hsl[a]?\\((?:"+e.util.regex.number+")\\s*,\\s*(?:"+e.util.regex.number+"[%])\\s*,\\s*(?:"+e.util.regex.number+"[%])(?:\\s*,\\s*(?:"+e.util.regex.number+"))?\\)",e.util.regex.hex3="\\#[0-9a-fA-F]{3}",e.util.regex.hex6="\\#[0-9a-fA-F]{6}";var i=t?t.requestAnimationFrame||t.mozRequestAnimationFrame||t.webkitRequestAnimationFrame||t.msRequestAnimationFrame:null;i=i||function(e){e&&setTimeout(e,1e3/60)},e.util.requestAnimationFrame=function(e){i(e)}}(cytoscape,"undefined"==typeof window?null:window),function(e){"use strict";e.math={},e.math.signum=function(e){return e>0?1:0>e?-1:0},e.math.distance=function(e,t){var i=t.x-e.x,r=t.y-e.y;return Math.sqrt(i*i+r*r)},e.math.qbezierAt=function(e,t,i,r){return(1-r)*(1-r)*e+2*(1-r)*r*t+r*r*i},e.math.qbezierPtAt=function(t,i,r,n){return{x:e.math.qbezierAt(t.x,i.x,r.x,n),y:e.math.qbezierAt(t.y,i.y,r.y,n)}},e.math.boundingBoxesIntersect=function(e,t){return e.x1>t.x2?!1:t.x1>e.x2?!1:e.x2t.y2?!1:t.y1>e.y2?!1:!0},e.math.inBoundingBox=function(e,t,i){return e.x1<=t&&t<=e.x2&&e.y1<=i&&i<=e.y2},e.math.pointInBoundingBox=function(e,t){return this.inBoundingBox(e,t.x,t.y)},e.math.roundRectangleIntersectLine=function(e,t,i,r,n,a,o){var s,l=this.getRoundRectangleRadius(n,a),u=n/2,c=a/2,d=i-u+l-o,p=r-c-o,h=i+u-l+o,v=p;if(s=this.finiteLinesIntersect(e,t,i,r,d,p,h,v,!1),s.length>0)return s;var f=i+u+o,g=r-c+l-o,y=f,m=r+c-l+o;if(s=this.finiteLinesIntersect(e,t,i,r,f,g,y,m,!1),s.length>0)return s;var x=i-u+l-o,b=r+c+o,w=i+u-l+o,_=b;if(s=this.finiteLinesIntersect(e,t,i,r,x,b,w,_,!1),s.length>0)return s;var E=i-u-o,S=r-c+l-o,P=E,k=r+c-l+o;if(s=this.finiteLinesIntersect(e,t,i,r,E,S,P,k,!1),s.length>0)return s;var C,D=i-u+l,N=r-c+l;if(C=this.intersectLineCircle(e,t,i,r,D,N,l+o),C.length>0&&C[0]<=D&&C[1]<=N)return[C[0],C[1]];var T=i+u-l,M=r-c+l;if(C=this.intersectLineCircle(e,t,i,r,T,M,l+o),C.length>0&&C[0]>=T&&C[1]<=M)return[C[0],C[1]];var B=i+u-l,I=r+c-l;if(C=this.intersectLineCircle(e,t,i,r,B,I,l+o),C.length>0&&C[0]>=B&&C[1]>=I)return[C[0],C[1]];var z=i-u+l,L=r+c-l;return C=this.intersectLineCircle(e,t,i,r,z,L,l+o),C.length>0&&C[0]<=z&&C[1]>=L?[C[0],C[1]]:[]},e.math.roundRectangleIntersectBox=function(e,t,i,r,n,a,o,s,l){var u=this.getRoundRectangleRadius(n,a),c=o-n/2-l,d=s-a/2+u-l,p=o+n/2+l,h=s+a/2-u+l,v=o-n/2+u-l,f=s-a/2-l,g=o+n/2-u+l,y=s+a/2+l,m=Math.min(e,i),x=Math.max(e,i),b=Math.min(t,r),w=Math.max(t,r);return c>x?!1:m>p?!1:f>w?!1:b>y?!1:c>=m&&x>=c&&d>=b&&w>=d?!0:p>=m&&x>=p&&d>=b&&w>=d?!0:p>=m&&x>=p&&h>=b&&w>=h?!0:c>=m&&x>=c&&h>=b&&w>=h?!0:m>=c&&p>=m&&b>=d&&h>=b?!0:x>=c&&p>=x&&b>=d&&h>=b?!0:x>=c&&p>=x&&w>=d&&h>=w?!0:m>=c&&p>=m&&w>=d&&h>=w?!0:v>=m&&x>=v&&f>=b&&w>=f?!0:g>=m&&x>=g&&f>=b&&w>=f?!0:g>=m&&x>=g&&y>=b&&w>=y?!0:v>=m&&x>=v&&y>=b&&w>=y?!0:m>=v&&g>=m&&b>=f&&y>=b?!0:x>=v&&g>=x&&b>=f&&y>=b?!0:x>=v&&g>=x&&w>=f&&y>=w?!0:m>=v&&g>=m&&w>=f&&y>=w?!0:this.boxIntersectEllipse(m,b,x,w,l,2*u,2*u,v+l,d+l)?!0:this.boxIntersectEllipse(m,b,x,w,l,2*u,2*u,g-l,d+l)?!0:this.boxIntersectEllipse(m,b,x,w,l,2*u,2*u,g-l,h-l)?!0:this.boxIntersectEllipse(m,b,x,w,l,2*u,2*u,v+l,h-l)?!0:!1},e.math.checkInBoundingCircle=function(e,t,i,r,n,a,o,s){return e=(e-o)/(n+r),t=(t-s)/(a+r),i>=e*e+t*t},e.math.boxInBezierVicinity=function(e,t,i,r,n,a,o,s,l,u,c){var d=.25*n+.5*o+.25*l,p=.25*a+.5*s+.25*u,h=Math.min(e,i)-c,v=Math.min(t,r)-c,f=Math.max(e,i)+c,g=Math.max(t,r)+c;if(n>=h&&f>=n&&a>=v&&g>=a)return 1;if(l>=h&&f>=l&&u>=v&&g>=u)return 1;if(d>=h&&f>=d&&p>=v&&g>=p)return 1;if(o>=h&&f>=o&&s>=v&&g>=s)return 1;var y=Math.min(n,d,l),m=Math.min(a,p,u),x=Math.max(n,d,l),b=Math.max(a,p,u);return y>f||h>x||m>g||v>b?0:1},e.math.checkBezierInBox=function(t,i,r,n,a,o,s,l,u,c){function d(d){var p=e.math.qbezierAt(a,s,u,d),h=e.math.qbezierAt(o,l,c,d);return p>=t&&r>=p&&h>=i&&n>=h}for(var p=0;1>=p;p+=.25)if(!d(p))return!1;return!0},e.math.checkStraightEdgeInBox=function(e,t,i,r,n,a,o,s){return n>=e&&i>=n&&o>=e&&i>=o&&a>=t&&r>=a&&s>=t&&r>=s},e.math.checkStraightEdgeCrossesBox=function(e,t,i,r,n,a,o,s,l){var u,c,d=Math.min(e,i)-l,p=Math.min(t,r)-l,h=Math.max(e,i)+l,v=Math.max(t,r)+l,f=o-n,g=n,y=s-a,m=a;if(Math.abs(f)<1e-4)return n>=d&&h>=n&&Math.min(a,s)<=p&&Math.max(a,s)>=v;var x=(d-g)/f;if(x>0&&1>=x&&(u=y*x+m,u>=p&&v>=u))return!0;var b=(h-g)/f;if(b>0&&1>=b&&(u=y*b+m,u>=p&&v>=u))return!0;var w=(p-m)/y;if(w>0&&1>=w&&(c=f*w+g,c>=d&&h>=c))return!0;var _=(v-m)/y;return _>0&&1>=_&&(c=f*_+g,c>=d&&h>=c)?!0:!1},e.math.checkBezierCrossesBox=function(e,t,i,r,n,a,o,s,l,u,c){var d=Math.min(e,i)-c,p=Math.min(t,r)-c,h=Math.max(e,i)+c,v=Math.max(t,r)+c;if(n>=d&&h>=n&&a>=p&&v>=a)return!0;if(l>=d&&h>=l&&u>=p&&v>=u)return!0;var f=n-2*o+l,g=-2*n+2*o,y=n,m=[];if(Math.abs(f)<1e-4){var x=(d-n)/g,b=(h-n)/g;m.push(x,b)}else{var w,_,E=g*g-4*f*(y-d);if(E>0){var S=Math.sqrt(E);w=(-g+S)/(2*f),_=(-g-S)/(2*f),m.push(w,_)}var P,k,C=g*g-4*f*(y-h);if(C>0){var S=Math.sqrt(C);P=(-g+S)/(2*f),k=(-g-S)/(2*f),m.push(P,k)}}m.sort(function(e,t){return e-t});var D=a-2*s+u,N=-2*a+2*s,T=a,M=[];if(Math.abs(D)<1e-4){var B=(p-a)/N,I=(v-a)/N;M.push(B,I)}else{var z,L,O=N*N-4*D*(T-p);if(O>0){var S=Math.sqrt(O);z=(-N+S)/(2*D),L=(-N-S)/(2*D),M.push(z,L)}var R,X,V=N*N-4*D*(T-v);if(V>0){var S=Math.sqrt(V);R=(-N+S)/(2*D),X=(-N-S)/(2*D),M.push(R,X)}}M.sort(function(e,t){return e-t});for(var Y=0;Y=0&&m[Y]<=1&&m[Y+1]>M[A-1]&&M[A-1]<=1&&m[Y+1]>=0)return!0;return!1},e.math.inLineVicinity=function(e,t,i,r,n,a,o){var s=o,l=Math.min(i,n),u=Math.max(i,n),c=Math.min(r,a),d=Math.max(r,a);return e>=l-s&&u+s>=e&&t>=c-s&&d+s>=t},e.math.inBezierVicinity=function(e,t,i,r,n,a,o,s){var l={x1:Math.min(i,o,n),x2:Math.max(i,o,n),y1:Math.min(r,s,a),y2:Math.max(r,s,a)};return el.x2||tl.y2?!1:!0},e.math.solveCubic=function(e,t,i,r,n){t/=e,i/=e,r/=e;var a,o,s,l,u,c,d,p;return o=(3*i-t*t)/9,s=-(27*r)+t*(9*i-2*t*t),s/=54,a=o*o*o+s*s,n[1]=0,d=t/3,a>0?(u=s+Math.sqrt(a),u=0>u?-Math.pow(-u,1/3):Math.pow(u,1/3),c=s-Math.sqrt(a),c=0>c?-Math.pow(-c,1/3):Math.pow(c,1/3),n[0]=-d+u+c,d+=(u+c)/2,n[4]=n[2]=-d,d=Math.sqrt(3)*(-c+u)/2,n[3]=d,void(n[5]=-d)):(n[5]=n[3]=0,0===a?(p=0>s?-Math.pow(-s,1/3):Math.pow(s,1/3),n[0]=-d+2*p,void(n[4]=n[2]=-(p+d))):(o=-o,l=o*o*o,l=Math.acos(s/Math.sqrt(l)),p=2*Math.sqrt(o),n[0]=-d+p*Math.cos(l/3),n[2]=-d+p*Math.cos((l+2*Math.PI)/3),void(n[4]=-d+p*Math.cos((l+4*Math.PI)/3))))},e.math.sqDistanceToQuadraticBezier=function(e,t,i,r,n,a,o,s){var l=1*i*i-4*i*n+2*i*o+4*n*n-4*n*o+o*o+r*r-4*r*a+2*r*s+4*a*a-4*a*s+s*s,u=9*i*n-3*i*i-3*i*o-6*n*n+3*n*o+9*r*a-3*r*r-3*r*s-6*a*a+3*a*s,c=3*i*i-6*i*n+i*o-i*e+2*n*n+2*n*e-o*e+3*r*r-6*r*a+r*s-r*t+2*a*a+2*a*t-s*t,d=1*i*n-i*i+i*e-n*e+r*a-r*r+r*t-a*t,p=[];this.solveCubic(l,u,c,d,p);for(var h=1e-7,v=[],f=0;6>f;f+=2)Math.abs(p[f+1])=0&&p[f]<=1&&v.push(p[f]);v.push(1),v.push(0);for(var g,y,m,x,b=-1,w=0;w=0?b>x&&(b=x,g=v[w]):(b=x,g=v[w]);return b},e.math.sqDistanceToFiniteLine=function(e,t,i,r,n,a){var o=[e-i,t-r],s=[n-i,a-r],l=s[0]*s[0]+s[1]*s[1],u=o[0]*o[0]+o[1]*o[1],c=o[0]*s[0]+o[1]*s[1],d=c*c/l;return 0>c?u:d>l?(e-n)*(e-n)+(t-a)*(t-a):u-d},e.math.pointInsidePolygon=function(e,t,i,r,n,a,o,s,l){var u=new Array(i.length),c=Math.asin(s[1]/Math.sqrt(s[0]*s[0]+s[1]*s[1]));s[0]<0?c+=Math.PI/2:c=-c-Math.PI/2;for(var d=Math.cos(-c),p=Math.sin(-c),h=0;h0){var f=this.expandPolygon(u,-l);v=this.joinLines(f)}else v=u;for(var g,y,m,x,b,w=0,_=0,h=0;h=e&&e>=m||e>=g&&m>=e))continue;b=(e-g)/(m-g)*(x-y)+y,b>t&&w++,t>b&&_++}return w%2===0?!1:!0},e.math.joinLines=function(e){for(var t,i,r,n,a,o,s,l,u=new Array(e.length/2),c=0;cu)return[];var c=u/l;return[(i-e)*c+e,(r-t)*c+t]},e.math.dotProduct=function(e,t){if(2!=e.length||2!=t.length)throw"dot product: arguments are not vectors";return e[0]*t[0]+e[1]*t[1]},e.math.intersectLineCircle=function(e,t,i,r,n,a,o){var s=[i-e,r-t],l=[n,a],u=[e-n,t-a],c=s[0]*s[0]+s[1]*s[1],d=2*(u[0]*s[0]+u[1]*s[1]),l=u[0]*u[0]+u[1]*u[1]-o*o,p=d*d-4*c*l;if(0>p)return[];var h=(-d+Math.sqrt(p))/(2*c),v=(-d-Math.sqrt(p))/(2*c),f=Math.min(h,v),g=Math.max(h,v),y=[];if(f>=0&&1>=f&&y.push(f),g>=0&&1>=g&&y.push(g),0===y.length)return[];var m=y[0]*s[0]+e,x=y[0]*s[1]+t;if(y.length>1){if(y[0]==y[1])return[m,x];var b=y[1]*s[0]+e,w=y[1]*s[1]+t;return[m,x,b,w]}return[m,x]},e.math.findCircleNearPoint=function(e,t,i,r,n){var a=r-e,o=n-t,s=Math.sqrt(a*a+o*o),l=a/s,u=o/s;return[e+l*i,t+u*i]},e.math.findMaxSqDistanceToOrigin=function(e){for(var t,i=1e-6,r=0;ri&&(i=t);return i},e.math.finiteLinesIntersect=function(e,t,i,r,n,a,o,s,l){var u=(o-n)*(t-a)-(s-a)*(e-n),c=(i-e)*(t-a)-(r-t)*(e-n),d=(s-a)*(i-e)-(o-n)*(r-t);if(0!==d){var p=u/d,h=c/d;return p>=0&&1>=p&&h>=0&&1>=h?[e+p*(i-e),t+p*(r-t)]:l?[e+p*(i-e),t+p*(r-t)]:[]}return 0===u||0===c?[e,i,o].sort()[1]===o?[o,s]:[e,i,n].sort()[1]===n?[n,a]:[n,o,i].sort()[1]===i?[i,r]:[]:[]},e.math.boxIntersectEllipse=function(e,t,i,r,n,a,o,s,l){if(e>i){var u=e;e=i,i=u}if(t>r){var c=t;t=r,r=c}var d=[s-a/2-n,l],p=[s+a/2+n,l],h=[s,l-o/2-n],v=[s,l+o/2+n];return ip[0]?!1:t>v[1]?!1:r=e*e+t*t?!0:1>=i*i+t*t?!0:1>=i*i+r*r?!0:1>=e*e+r*r?!0:!1)},e.math.boxIntersectPolygon=function(t,i,r,n,a,o,s,l,u,c,d){if(t>r){var p=t;t=r,r=p}if(i>n){var h=i;i=n,n=h}var v=new Array(a.length),f=Math.asin(c[1]/Math.sqrt(c[0]*c[0]+c[1]*c[1]));c[0]<0?f+=Math.PI/2:f=-f-Math.PI/2;for(var g=Math.cos(-f),y=Math.sin(-f),m=0;mb&&(b=v[2*m]),v[2*m]_&&(_=v[2*m+1]),v[2*m+1]r)return!1;if(t>b+d)return!1;if(w-d>n)return!1;if(i>_+d)return!1;var E;if(d>0){var S=e.math.expandPolygon(v,-d);E=e.math.joinLines(S)}else E=v;for(var m=0;m0)return!0;if(e.math.finiteLinesIntersect(C,D,P,k,t,n,r,n,!1).length>0)return!0;if(e.math.finiteLinesIntersect(C,D,P,k,t,i,t,n,!1).length>0)return!0;if(e.math.finiteLinesIntersect(C,D,P,k,r,i,r,n,!1).length>0)return!0}return!1},e.math.polygonIntersectLine=function(t,i,r,n,a,o,s,l){for(var u,c=[],d=new Array(r.length),p=0;p0){var v=e.math.expandPolygon(d,-l);h=e.math.joinLines(v)}else h=d;for(var f,g,y,m,p=0;pa&&(a=1e-5),[t[0]+a*r[0],t[1]+a*r[1]]},e.math.generateUnitNgonPointsFitToSquare=function(t,i){var r=e.math.generateUnitNgonPoints(t,i);return r=e.math.fitPolygonToSquare(r)},e.math.fitPolygonToSquare=function(e){for(var t,i,r=e.length/2,n=1/0,a=1/0,o=-1/0,s=-1/0,l=0;r>l;l++)t=e[2*l],i=e[2*l+1],n=Math.min(n,t),o=Math.max(o,t),a=Math.min(a,i),s=Math.max(s,i);for(var u=2/(o-n),c=2/(s-a),l=0;r>l;l++)t=e[2*l]=e[2*l]*u,i=e[2*l+1]=e[2*l+1]*c,n=Math.min(n,t),o=Math.max(o,t),a=Math.min(a,i),s=Math.max(s,i);if(-1>a)for(var l=0;r>l;l++)i=e[2*l+1]=e[2*l+1]+(-1-a);return e},e.math.generateUnitNgonPoints=function(e,t){var i=1/e*2*Math.PI,r=e%2===0?Math.PI/2+i/2:Math.PI/2;r+=t;for(var n,a,o,s=new Array(2*e),l=0;e>l;l++)n=l*i+r,a=s[2*l]=Math.cos(n),o=s[2*l+1]=Math.sin(-n);return s},e.math.getRoundRectangleRadius=function(e,t){return Math.min(e/4,t/4,8)}}(cytoscape),function(e){"use strict";function t(t,i,r){var n={};switch(n[i]=r,t){case"core":case"collection":e.fn[t](n)}if("layout"===t){for(var o=r.prototype,s=["stop"],l=0;ld;d++)n.canSet(s[d])&&(s[d]._private[n.field][i]=r);n.updateStyle&&a.updateStyle(),n.onSet(a),n.settingTriggersEvent&&a[n.triggerFnName](n.settingEvent)}}}else if(n.allowSetting&&e.is.plainObject(i)){var h,v,f=i;for(h in f){v=f[h];var c=!n.immutableKeys[h];if(c)for(var d=0,p=s.length;p>d;d++)n.canSet(s[d])&&(s[d]._private[n.field][h]=v)}n.updateStyle&&a.updateStyle(),n.onSet(a),n.settingTriggersEvent&&a[n.triggerFnName](n.settingEvent)}else if(n.allowBinding&&e.is.fn(i)){var g=i;a.bind(n.bindingEvent,g)}else if(n.allowGetting&&void 0===i){var u;return l&&(u=l._private[n.field]),u}return a}},removeData:function(t){var i={field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!1,immutableKeys:{}};return t=e.util.extend({},i,t),function(i){var r=t,n=this,a=void 0!==n.length,o=a?n:[n];if(e.is.string(i)){for(var s=i.split(/\s+/),l=s.length,u=0;l>u;u++){var c=s[u];if(!e.is.emptyString(c)){var d=!r.immutableKeys[c];if(d)for(var p=0,h=o.length;h>p;p++)o[p]._private[r.field][c]=void 0}}r.triggerEvent&&n[r.triggerFnName](r.event)}else if(void 0===i){for(var p=0,h=o.length;h>p;p++){var v=o[p]._private[r.field];for(var c in v){var f=!r.immutableKeys[c];f&&(v[c]=void 0)}}r.triggerEvent&&n[r.triggerFnName](r.event)}return n}},event:{regex:/(\w+)(\.\w+)?/,optionalTypeRegex:/(\w+)?(\.\w+)?/,falseCallback:function(){return!1}},on:function(t){var i={unbindSelfOnTrigger:!1,unbindAllBindersOnTrigger:!1};return t=e.util.extend({},i,t),function(i,r,n,a){var o=this,s=void 0!==o.length,l=s?o:[o],u=e.is.string(i),c=t;if(e.is.plainObject(r)?(a=n,n=r,r=void 0):(e.is.fn(r)||r===!1)&&(a=r,n=void 0,r=void 0),(e.is.fn(n)||n===!1)&&(a=n,n=void 0),!e.is.fn(a)&&a!==!1&&u)return o;if(u){var d={};d[i]=a,i=d}for(var p in i)if(a=i[p],a===!1&&(a=e.define.event.falseCallback),e.is.fn(a)){p=p.split(/\s+/);for(var h=0;h0:void 0}},clearQueue:function(t){var i={};return t=e.util.extend({},i,t),function(){var e=this,t=void 0!==e.length,i=t?e:[e],r=this._private.cy||this;if(!r.styleEnabled())return this;for(var n=0;n\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:'"(?:\\\\"|[^"])+"|'+"'(?:\\\\'|[^'])+'",number:e.util.regex.number,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$"};s.variable="(?:[\\w-]|(?:\\\\"+s.metaChar+"))+",s.value=s.string+"|"+s.number,s.className=s.variable,s.id=s.variable;for(var l=function(e){return e.replace(new RegExp("\\\\("+s.metaChar+")","g"),function(e,t){return t})},u=s.comparatorOp.split("|"),c=0;c=0||"="!==d&&(s.comparatorOp+="|\\!"+d)}var p={group:{query:!0,regex:"(node|edge|\\*)",populate:function(e){this.group="*"==e?e:e+"s"}},state:{query:!0,regex:"(:selected|:unselected|:locked|:unlocked|:visible|:hidden|:transparent|:grabbed|:free|:removed|:inside|:grabbable|:ungrabbable|:animated|:unanimated|:selectable|:unselectable|:orphan|:nonorphan|:parent|:child|:loop|:simple|:active|:inactive|:touch)",populate:function(e){this.colonSelectors.push(e)}},id:{query:!0,regex:"\\#("+s.id+")",populate:function(e){this.ids.push(l(e))}},className:{query:!0,regex:"\\.("+s.className+")",populate:function(e){this.classes.push(l(e))}},dataExists:{query:!0,regex:"\\[\\s*("+s.variable+")\\s*\\]",populate:function(e){this.data.push({field:l(e)})}},dataCompare:{query:!0,regex:"\\[\\s*("+s.variable+")\\s*("+s.comparatorOp+")\\s*("+s.value+")\\s*\\]",populate:function(e,t,i){var r=null!=new RegExp("^"+s.string+"$").exec(i);i=r?i.substring(1,i.length-1):parseFloat(i),this.data.push({field:l(e),operator:t,value:i})}},dataBool:{query:!0,regex:"\\[\\s*("+s.boolOp+")\\s*("+s.variable+")\\s*\\]",populate:function(e,t){this.data.push({field:l(t),operator:e})}},metaCompare:{query:!0,regex:"\\[\\[\\s*("+s.meta+")\\s*("+s.comparatorOp+")\\s*("+s.number+")\\s*\\]\\]",populate:function(e,t,i){this.meta.push({field:l(e),operator:t,value:parseFloat(i)})}},nextQuery:{separator:!0,regex:s.separator,populate:function(){r[++c]=o(),a=null}},child:{separator:!0,regex:s.child,populate:function(){var e=o();e.parent=this,e.subject=a,r[c]=e}},descendant:{separator:!0,regex:s.descendant,populate:function(){var e=o();e.ancestor=this,e.subject=a,r[c]=e}},subject:{modifier:!0,regex:s.subject,populate:function(){return null!=a&&this.subject!=this?(e.util.error("Redefinition of subject in selector `"+i+"`"),!1):(a=this,void(this.subject=this))}}},h=0;for(var v in p)p[h]=p[v],p[h].name=v,h++;p.length=h,r._private.selectorText=i;var f=i,c=0,g=function(t){for(var i,r,n,a=0;a=0&&(d=d.toLowerCase(),p=p.toLowerCase(),s=s.replace("@",""),h=!0);var v=!1,f=!1;switch(s.indexOf("!")>=0&&(s=s.replace("!",""),v=!0),h&&(l=p.toLowerCase(),c=d.toLowerCase()),s){case"*=":a=d.search(p)>=0;break;case"$=":a=null!=new RegExp(p+"$").exec(d);break;case"^=":a=null!=new RegExp("^"+p).exec(d);break;case"=":a=c===l;break;case"!=":a=c!==l;break;case">":a=v?l>=c:c>l,f=!0;break;case">=":a=v?l>c:c>=l,f=!0;break;case"<":a=v?c>=l:l>c,f=!0;break;case"<=":a=v?c>l:l>=c,f=!0;break;default:a=!1}}else if(null!=s)switch(s){case"?":a=t.fieldTruthy(u);break;case"!":a=!t.fieldTruthy(u);break;case"^":a=t.fieldUndefined(u)}else a=!t.fieldUndefined(u);if(v&&!f&&(a=!a,f=!0),!a){r=!1;break}}return r},v=h({name:"data",fieldValue:function(e){return r._private.data[e]},fieldRef:function(e){return"element._private.data."+e},fieldUndefined:function(e){return void 0===r._private.data[e]},fieldTruthy:function(e){return r._private.data[e]?!0:!1}});if(!v)return!1;var f=h({name:"meta",fieldValue:function(e){return r[e]()},fieldRef:function(e){return"element."+e+"()"},fieldUndefined:function(e){return null==r[e]()},fieldTruthy:function(e){return r[e]()?!0:!1}});if(!f)return!1;if(null!=i.collection){var g=null!=i.collection._private.ids[r.id()];if(!g)return!1}if(null!=i.filter&&0===r.collection().filter(i.filter).size())return!1;var y=function(e,i){if(null!=e){var r=!1;if(!n.hasCompoundNodes())return!1;i=i();for(var a=0;a "+t),null!=e.ancestor&&(t=r(e.ancestor)+" "+t),null!=e.child&&(t+=" > "+r(e.child)),null!=e.descendant&&(t+=" "+r(e.descendant)),t},n=0;n1&&n node").css({width:"auto",height:"auto",shape:"rectangle","background-opacity":.5,"padding-top":10,"padding-right":10,"padding-left":10,"padding-bottom":10}).selector("edge").css({width:1}).selector(":active").css({"overlay-color":"black","overlay-padding":10,"overlay-opacity":.25}).selector("core").css({"selection-box-color":"#ddd","selection-box-opacity":.65,"selection-box-border-color":"#aaa","selection-box-border-width":1,"active-bg-color":"black","active-bg-opacity":.15,"active-bg-size":e.is.touch()?40:15,"outside-texture-bg-color":"#000","outside-texture-bg-opacity":.125})},e.styfn.clear=function(){for(var e=0;el.max)return null;var P={name:t,value:i,strValue:""+i+(x?x:""),units:x,bypass:r,hasPie:t.match(/pie-(\d+)-background-size/)&&null!=i&&0!==i&&""!==i};return l.unitless||"px"!==x&&"em"!==x||(P.pxValue="px"!==x&&x?this.getEmSizeInPixels()*i:i),("ms"===x||"s"===x)&&(P.msValue="ms"===x?i:1e3*i),P}if(l.propList){var k=[],C=""+i;if("none"===C);else{for(var D=C.split(","),E=0;E0){a=!0;break}}i.hasPie=a;var l=n["text-transform"].strValue,u=n.content.strValue,c=n["font-style"].strValue,s=n["font-size"].pxValue+"px",d=n["font-family"].strValue,p=n["font-weight"].strValue,h=n["text-valign"].strValue,v=n["text-valign"].strValue,f=n["text-outline-width"].pxValue;i.labelKey=c+"$"+s+"$"+d+"$"+p+"$"+u+"$"+l+"$"+h+"$"+v+"$"+f,i.fontKey=c+"$"+p+"$"+s+"$"+d;var g=n.width.pxValue,y=n.height.pxValue,m=n["border-width"].pxValue;if(i.boundingBoxKey=g+"$"+y+"$"+m,"edges"===t._private.group){var x=n["control-point-step-size"].pxValue,b=n["control-point-distance"]?n["control-point-distance"].pxValue:void 0,w=n["control-point-weight"].value,_=n["curve-style"].strValue;i.boundingBoxKey+="$"+x+"$"+b+"$"+w+"$"+_}i.styleKey=Date.now()},e.styfn.applyParsedProperty=function(t,i){var r,n,a=i,o=t._private.style,s=e.style.properties[a.name].type,l=a.bypass,u=o[a.name],c=u&&u.bypass;if(("height"===i.name||"width"===i.name)&&"auto"===i.value&&t.isNode()&&!t.isParent())return!1;if(l&&a.deleteBypass){var d=o[a.name];return d?d.bypass&&d.bypassed?(o[a.name]=d.bypassed,!0):!1:!0}switch(a.mapped){case e.style.types.mapData:case e.style.types.mapLayoutData:for(var p=a.mapped===e.style.types.mapLayoutData,h=a.field.split("."),r=p?t._private.layoutData:t._private.data,v=0;vg?g=0:g>1&&(g=1),s.color){var y=a.valueMin[0],m=a.valueMax[0],x=a.valueMin[1],b=a.valueMax[1],w=a.valueMin[2],_=a.valueMax[2],E=null==a.valueMin[3]?1:a.valueMin[3],S=null==a.valueMax[3]?1:a.valueMax[3],P=[Math.round(y+(m-y)*g),Math.round(x+(b-x)*g),Math.round(w+(_-w)*g),Math.round(E+(S-E)*g)];n={bypass:a.bypass,name:a.name,value:P,strValue:"rgb("+P[0]+", "+P[1]+", "+P[2]+")"}}else{if(!s.number)return!1;var k=a.valueMin+(a.valueMax-a.valueMin)*g;n=this.parse(a.name,k,a.bypass,!0)}n||(n=this.parse(a.name,u.strValue,a.bypass,!0)),n.mapping=a,a=n;break;case e.style.types.data:case e.style.types.layoutData:for(var p=a.mapped===e.style.types.layoutData,h=a.field.split("."),r=p?t._private.layoutData:t._private.data,v=0;v0&&s>0){for(var c=!1,d=0;d0&&t.delay(l),t.animate({css:u},{duration:s,queue:!1,complete:function(){r||n.removeBypasses(t,o),t._private.transitioning=!1}})}else t._private.transitioning&&(t.stop(),this.removeBypasses(t,o),t._private.transitioning=!1)}}(cytoscape),function(e){"use strict";e.styfn.applyBypass=function(t,i,r,n){var a=[],o=!0;if("*"===i||"**"===i){if(void 0!==r)for(var s=0;sa.length?l.substr(a.length):""}function n(){o=o.length>s.length?o.substr(s.length):""}var a,o,s,l=""+i;for(l=l.replace(/[/][*](\s|.)+?[*][/]/g,"");;){var u=l.match(/^\s*$/);if(u)break;var c=l.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!c){e.util.error("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+l);break}a=c[0];var d=c[1],p=new e.Selector(d);if(p._private.invalid)e.util.error("Skipping parsing of block: Invalid selector found in string stylesheet: "+d),r();else{var h=c[2],v=!1;o=h;for(var f=[];;){var u=o.match(/^\s*$/);if(u)break;var g=o.match(/^\s*(.+?)\s*:\s*(.+?)\s*;/);if(!g){e.util.error("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+h),v=!0;break}s=g[0];var y=g[1],m=g[2],x=e.style.properties[y];if(x){var b=t.parse(y,m);b?(f.push({name:y,val:m}),n()):(e.util.error("Skipping property: Invalid property definition in: "+s),n())}else e.util.error("Skipping property: Invalid property name in: "+s),n()}if(v){r();break}t.selector(d);for(var w=0;w0?c.wheelSensitivity:1,motionBlur:c.motionBlur,pixelRatio:e.is.number(c.pixelRatio)&&c.pixelRatio>0?c.pixelRatio:void 0},c.renderer)),c.initrender&&(a.on("initrender",c.initrender),a.on("initrender",function(){a._private.initrender=!0})),a.load(c.elements,function(){a.startAnimationLoop(),a._private.ready=!0,e.is.fn(c.ready)&&a.on("ready",c.ready);for(var t=0;t0;)r.shift()();i.deferredTimeout=null},0))}})}(cytoscape,"undefined"==typeof window?null:window),function(e,t){"use strict";function i(e){var t=!document||"interactive"!==document.readyState&&"complete"!==document.readyState?i:e;setTimeout(t,9,e)}e.fn.core({add:function(t){var i,r=this;if(e.is.elementOrCollection(t)){var n=t;if(n._private.cy===r)i=n.restore();else{for(var a=[],o=0;oo;o++){var d=u[o],p=l[d];if(e.is.array(p))for(var h=0,v=p.length;v>h;h++){var f=p[h];f.group=d,a.push(f)}}i=new e.Collection(r,a)}else{var f=t;i=new e.Element(r,f).collection()}return i},remove:function(t){if(e.is.elementOrCollection(t))t=t;else if(e.is.string(t)){var i=t;t=this.$(i)}return t.remove()},load:function(r,n,a){function o(){s.one("layoutready",function(e){s.notifications(!0),s.trigger(e),s.notify({type:"load",collection:s.elements()}),s.one("load",n),s.trigger("load")}).one("layoutstop",function(){s.one("done",a),s.trigger("done")});var t=e.util.extend({},s._private.options.layout);t.eles=s.$(),s.layout(t)}var s=this,l=s.elements();return l.length>0&&l.remove(),s.notifications(!1),null!=r&&(e.is.plainObject(r)||e.is.array(r))&&s.add(r),t?i(o):o(),this}})}(cytoscape,"undefined"==typeof window?null:window),function(e,t){"use strict";e.fn.core({animated:e.define.animated(),clearQueue:e.define.clearQueue(),delay:e.define.delay(),animate:e.define.animate(),stop:e.define.stop(),addToAnimationPool:function(e){var t=this;t.styleEnabled()&&t._private.aniEles.merge(e)},startAnimationLoop:function(){function i(){e.util.requestAnimationFrame(function(e){r(e),i()})}function r(t){function i(i,r){var s=i._private.animation.current,l=i._private.animation.queue,u=!1;if(0===s.length){var c=l.length>0?l.shift():null;c&&(c.callTime=t,s.push(c))}for(var d=[],p=s.length-1;p>=0;p--){var h=s[p];h.started||n(i,h),a(i,h,t,r),h.done&&(d.push(h),s.splice(p,1)),u=!0}for(var p=0;p0||c){var d;if(r.length>0){var p=r.updateCompoundBounds();d=p.length>0?r.add(p):r}l.notify({type:"draw",collection:d})}r.unmerge(o)}function n(t,i){var r=e.is.core(t),n=!r,a=t,o=l._private.style;if(n)var s=a._private.position,u={x:s.x,y:s.y},c=o.getValueStyle(a);if(r)var d=l._private.pan,p={x:d.x,y:d.y},h=l._private.zoom;i.started=!0,i.startTime=Date.now(),i.startPosition=u,i.startStyle=c,i.startPan=p,i.startZoom=h}function a(t,i,r,n){var a,u=l._private.style,c=i.properties,d=i.params,p=i.startTime,h=!n;if(a=0===i.duration?1:Math.min(1,(r-p)/i.duration),0>a?a=0:a>1&&(a=1),null==c.delay){var v=i.startPosition,f=c.position,g=t._private.position;f&&h&&(o(v.x,f.x)&&(g.x=s(v.x,f.x,a)),o(v.y,f.y)&&(g.y=s(v.y,f.y,a)));var y=i.startPan,m=c.pan,x=t._private.pan,b=null!=m&&n;b&&(o(y.x,m.x)&&(x.x=s(y.x,m.x,a)),o(y.y,m.y)&&(x.y=s(y.y,m.y,a)),t.trigger("pan"));var w=i.startZoom,_=c.zoom,E=null!=_&&n;if(E&&(o(w,_)&&(t._private.zoom=s(w,_,a)),t.trigger("zoom")),(b||E)&&t.trigger("viewport"),c.css&&h)for(var S=c.css,P=0;P=1&&(i.done=!0),a}function o(t,i){return null==t||null==i?!1:e.is.number(t)&&e.is.number(i)?!0:t&&i?!0:!1}function s(t,i,r){0>r?r=0:r>1&&(r=1);var n,a;if(n=null!=t.pxValue||null!=t.value?null!=t.pxValue?t.pxValue:t.value:t,a=null!=i.pxValue||null!=i.value?null!=i.pxValue?i.pxValue:i.value:i,e.is.number(n)&&e.is.number(a))return n+(a-n)*r;if(e.is.number(n[0])&&e.is.number(a[0])){var o=n,s=a,l=function(e,t){var i=t-e,n=e;return Math.round(r*i+n)},u=l(o[0],s[0]),c=l(o[1],s[1]),d=l(o[2],s[2]);return[u,c,d]}return void 0}var l=this;l.styleEnabled()&&t&&i()}})}(cytoscape,"undefined"==typeof window?null:window),function(e){"use strict";e.fn.core({data:e.define.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0}),removeData:e.define.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0}),scratch:e.define.data({field:"scratch",allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!0}),removeScratch:e.define.removeData({field:"scratch",triggerEvent:!1})})}(cytoscape),function(e){"use strict";e.fn.core({on:e.define.on(),one:e.define.on({unbindSelfOnTrigger:!0}),once:e.define.on({unbindAllBindersOnTrigger:!0}),off:e.define.off(),trigger:e.define.trigger()}),e.corefn.bind=e.corefn.on,e.corefn.unbind=e.corefn.off}(cytoscape),function(e){"use strict";e.fn.core({png:function(e){var t=this._private.renderer;return e=e||{},t.png(e)}})}(cytoscape),function(e){"use strict";e.fn.core({layout:function(e){var t=this._private.prevLayout=null==e?this._private.prevLayout:this.initLayout(e);return t.run(),this},makeLayout:function(e){return this.initLayout(e)},initLayout:function(t){if(null==t)return void e.util.error("Layout options must be specified to make a layout");if(null==t.name)return void e.util.error("A `name` must be specified to make a layout");var i=t.name,r=e.extension("layout",i);if(null==r)return void e.util.error("Can not apply layout: No such layout `"+i+"` found; did you include its JS file?");t.eles=null!=t.eles?t.eles:this.$(),e.is.string(t.eles)&&(t.eles=this.$(t.eles));var n=new r(e.util.extend({},t,{cy:this}));return e.is.plainObject(n._private)||(n._private={}),n._private.cy=this,n._private.listeners=[],n}})}(cytoscape),function(e){"use strict";e.fn.core({notify:function(e){if(this._private.batchingNotify){var t=this._private.batchNotifyEles,i=this._private.batchNotifyTypes;if(e.collection)for(var r=0;r0&&l>0&&!isNaN(r.w)&&!isNaN(r.h)&&r.w>0&&r.h>0){o=Math.min((s-2*i)/r.w,(l-2*i)/r.h),o=o>this._private.maxZoom?this._private.maxZoom:o,o=othis._private.maxZoom?this._private.maxZoom:r,r=ri.maxZoom||!i.zoomingEnabled?o=!0:(i.zoom=l,a.push("zoom"))}if(n&&(!o||!t.cancelOnFailedZoom)&&i.panningEnabled){var u=t.pan;e.is.number(u.x)&&(i.pan.x=u.x,s=!1),e.is.number(u.y)&&(i.pan.y=u.y,s=!1),s||a.push("pan")}return a.length>0&&(a.push("viewport"),this.trigger(a.join(" ")),this.notify({type:"viewport"})),this},center:function(e){var t=this.getCenterPan(e);return t&&(this._private.pan=t,this.trigger("pan viewport"),this.notify({type:"viewport"})),this},getCenterPan:function(t){if(this._private.panningEnabled){if(e.is.string(t)){var i=t;t=this.elements(i)}else e.is.elementOrCollection(t)||(t=this.elements());var r=t.boundingBox(),n=this.width(),a=this.height(),o=this._private.zoom,s={x:(n-o*(r.x1+r.x2))/2,y:(a-o*(r.y1+r.y2))/2};return s}},reset:function(){return this._private.panningEnabled&&this._private.zoomingEnabled?(this.viewport({pan:{x:0,y:0},zoom:1}),this):this},width:function(){var e=this._private.container;return e?e.clientWidth:1},height:function(){var e=this._private.container;return e?e.clientHeight:1},extent:function(){var e=this._private.pan,t=this._private.zoom,i=this.renderedExtent(),r={x1:(i.x1-e.x)/t,x2:(i.x2-e.x)/t,y1:(i.y1-e.y)/t,y2:(i.y2-e.y)/t};return r.w=r.x2-r.x1,r.h=r.y2-r.y1,r},renderedExtent:function(){var e=this.width(),t=this.height();return{x1:0,y1:0,x2:e,y2:t,w:e,h:t}}}),e.corefn.centre=e.corefn.center,e.corefn.autolockNodes=e.corefn.autolock,e.corefn.autoungrabifyNodes=e.corefn.autoungrabifyNodes}(cytoscape),function(e){"use strict";e.fn.collection=e.fn.eles=function(t){for(var i in t){var r=t[i];e.Collection.prototype[i]=r}};var t={prefix:{nodes:"n",edges:"e"},id:{nodes:0,edges:0},generate:function(t,i,r){var n=e.is.element(i)?i._private:i,a=n.group,o=null!=r?r:this.prefix[a]+this.id[a];if(t.getElementById(o).empty())this.id[a]++;else for(;!t.getElementById(o).empty();)o=this.prefix[a]+ ++this.id[a];return o}};e.Element=function(t,i,r){if(!(this instanceof e.Element))return new e.Element(t,i,r);var n=this;if(r=void 0===r||r?!0:!1,void 0===t||void 0===i||!e.is.core(t))return void e.util.error("An element must have a core reference and parameters set");if("nodes"!==i.group&&"edges"!==i.group)return void e.util.error("An element must be of type `nodes` or `edges`; you specified `"+i.group+"`");if(this.length=1,this[0]=this,this._private={cy:t,single:!0,data:i.data||{},layoutData:{},position:i.position||{},autoWidth:void 0,autoHeight:void 0,listeners:[],group:i.group,style:{},rstyle:{},styleCxts:[],removed:!0,selected:i.selected?!0:!1,selectable:void 0===i.selectable?!0:i.selectable?!0:!1,locked:i.locked?!0:!1,grabbed:!1,grabbable:void 0===i.grabbable?!0:i.grabbable?!0:!1,active:!1,classes:{},animation:{current:[],queue:[]},rscratch:{},scratch:{},edges:[],children:[]},i.renderedPosition){var a=i.renderedPosition,o=t.pan(),s=t.zoom();this._private.position={x:(a.x-o.x)/s,y:(a.y-o.y)/s}}if(e.is.string(i.classes))for(var l=i.classes.split(/\s+/),u=0,c=l.length;c>u;u++){var d=l[u];d&&""!==d&&(n._private.classes[d]=!0)}i.css&&t.style().applyBypass(this,i.css),(void 0===r||r)&&this.restore()},e.Collection=function(i,r,n){if(!(this instanceof e.Collection))return new e.Collection(i,r);if(void 0===i||!e.is.core(i))return void e.util.error("A collection must have a reference to the core");var a={},o={},s=!1;if(r){if(r.length>0&&e.is.plainObject(r[0])&&!e.is.element(r[0])){s=!0;for(var l=[],u={},c=0,d=r.length;d>c;c++){var p=r[c];null==p.data&&(p.data={});var h=p.data;if(null==h.id)h.id=t.generate(i,p);else if(0!==i.getElementById(h.id).length||u[h.id])continue;var v=new e.Element(i,p,!1);l.push(v),u[h.id]=!0}r=l}}else r=[];this.length=0;for(var c=0,d=r.length;d>c;c++){var f=r[c];if(f){var g=f._private.data.id;(!n||n.unique&&!a[g])&&(a[g]=f,o[g]=this.length,this[this.length]=f,this.length++)}}this._private={cy:i,ids:a,indexes:o},s&&this.restore()},e.elefn=e.elesfn=e.Element.prototype=e.Collection.prototype,e.elesfn.cy=function(){return this._private.cy},e.elesfn.element=function(){return this[0]},e.elesfn.collection=function(){return e.is.collection(this)?this:new e.Collection(this._private.cy,[this])},e.elesfn.unique=function(){return new e.Collection(this._private.cy,this,{unique:!0})},e.elesfn.getElementById=function(t){var i=this._private.cy,r=this._private.ids[t];return r?r:e.Collection(i)},e.elesfn.json=function(){var t=this.element();if(null==t)return void 0;var i=t._private,r=e.util.copy({data:i.data,position:i.position,group:i.group,bypass:i.bypass,removed:i.removed,selected:i.selected,selectable:i.selectable,locked:i.locked,grabbed:i.grabbed,grabbable:i.grabbable,classes:""}),n=[];for(var a in i.classes)n.push(a);for(var o=0;od;d++){var h=r[d];h.isNode()?(s.push(h),u++):(l.push(h),c++)}o=s.concat(l);for(var d=0,p=o.length;p>d;d++){var h=o[d];if(h.removed()){var v=h._private,f=v.data;if(void 0===f.id)f.id=t.generate(a,h);else{if(e.is.emptyString(f.id)||!e.is.string(f.id)){e.util.error("Can not create element with invalid string ID `"+f.id+"`");continue}if(0!==a.getElementById(f.id).length){e.util.error("Can not create second element with ID `"+f.id+"`");continue}}var g=f.id;if(h.isEdge()){for(var y=h,m=["source","target"],x=m.length,b=!1,w=0;x>w;w++){var _=m[w],E=f[_];null==E||""===E?(e.util.error("Can not create edge `"+g+"` with unspecified "+_),b=!0):a.getElementById(E).empty()&&(e.util.error("Can not create edge `"+g+"` with nonexistant "+_+" `"+E+"`"),b=!0)}if(b)continue;var S=a.getElementById(f.source),P=a.getElementById(f.target);S._private.edges.push(y),P._private.edges.push(y),y._private.source=S,y._private.target=P}v.ids={},v.ids[g]=h,v.removed=!1,a.addToPool(h),n.push(h)}}for(var d=0;u>d;d++){var k=o[d],f=k._private.data,C=k._private.data.parent,D=null!=C;if(D){var N=a.getElementById(C);if(N.empty())f.parent=void 0;else{for(var T=!1,M=N;!M.empty();){if(k.same(M)){T=!0,f.parent=void 0;break}M=M.parent()}T||(N[0]._private.children.push(k),k._private.parent=N[0],a._private.hasCompoundNodes=!0)}}}if(n=new e.Collection(a,n),n.length>0){var B=n.add(n.connectedNodes()).add(n.parent());B.updateStyle(i),i?n.rtrigger("add"):n.trigger("add")}return r},e.elesfn.removed=function(){var e=this[0];return e&&e._private.removed},e.elesfn.inside=function(){var e=this[0];return e&&!e._private.removed},e.elesfn.remove=function(t){function i(e){for(var t=e._private.edges,i=0;ip;p++){var v=s[p];n(v)}for(var p=0;p0&&(t&&this.cy().notify({type:"remove",collection:x}),x.trigger("remove"));for(var b={},p=0;p0,a=t.getElementById(r).length>0;if(n||a){var o=this.jsons();this.remove();for(var s=0;s0;if(c){var o=this.jsons();this.remove();for(var s=0;su||!n)&&(o=u,n=l)}return{edge:n,dist:o}};f.size()>0;){var y=f.pop(),m=y.value,x=y.id,b=a.getElementById(x);if(u[x]=m,m===Math.Infinite)break;for(var w=b.neighborhood().intersect(d),h=0;h0)for(r.unshift(i);l[n.id()];){var o=l[n.id()];r.unshift(o.edge),r.unshift(o.node),n=o.node}return new e.Collection(a,r)}}}}),e.elesfn.bfs=e.elesfn.breadthFirstSearch,e.elesfn.dfs=e.elesfn.depthFirstSearch,e.elesfn.stdBfs=e.elesfn.stdBreadthFirstSearch,e.elesfn.stdDfs=e.elesfn.stdDepthFirstSearch}(cytoscape),function(e){"use strict";e.fn.eles({aStar:function(t){t=t||{};var i=function(){a&&console.log.apply(console,arguments)},r=function(e,t,i,n){if(e==t)return n.push(o.getElementById(t)),n;if(t in i){var a=i[t],s=f[t];return n.push(o.getElementById(t)),n.push(o.getElementById(s)),r(e,a,i,n)}return void 0},n=function(e,t){if(0===e.length)return void 0;for(var i=0,r=t[e[0]],n=1;na&&(r=a,i=n)}return i};if(null!=t.debug)var a=t.debug;else var a=!1;i("Starting aStar...");var o=this._private.cy;if(null==t||null==t.root)return void 0;var s=e.is.string(t.root)?this.filter(t.root)[0]:t.root[0];if(i("Source node: %s",s.id()),null==t.goal)return void 0;var l=e.is.string(t.goal)?this.filter(t.goal)[0]:t.goal[0];if(i("Target node: %s",l.id()),null!=t.heuristic&&e.is.fn(t.heuristic))var u=t.heuristic;else var u=function(){return 0};if(null!=t.weight&&e.is.fn(t.weight))var c=t.weight;else var c=function(){return 1};if(null!=t.directed)var d=t.directed;else var d=!1;var p=[],h=[s.id()],v={},f={},g={},y={};g[s.id()]=0,y[s.id()]=u(s);for(var m=this.edges().not(":loop"),x=this.nodes(),b=0;h.length>0;){var w=n(h,y),_=this.filter("#"+h[w])[0];if(b++,i("\nStep: %s",b),i("Processing node: %s, fScore = %s",_.id(),y[_.id()]),_.id()==l.id()){i("Found goal node!");var E=r(s.id(),l.id(),v,[]);return E.reverse(),i("Path: %s",E),{found:!0,distance:g[_.id()],path:new e.Collection(o,E),steps:b}}p.push(_.id()),h.splice(w,1),i("Added node to closedSet, removed from openSet."),i("Processing neighbors...");for(var S=_.connectedEdges(d?'[source = "'+_.id()+'"]':void 0).intersect(m),P=0;Pd;d++)c[l[d].id()]=d;for(var p=[],d=0;u>d;d++){for(var h=new Array(u),v=0;u>v;v++)h[v]=d==v?0:1/0;p.push(h)}var f=[],g=[],y=function(e){for(var t=0;u>t;t++){for(var i=new Array(u),r=0;u>r;r++)i[r]=void 0;e.push(i)}};y(f),y(g);for(var d=0;db&&(p[m][x]=b,f[m][x]=x,g[m][x]=s[d])}if(!o)for(var d=0;db&&(p[m][x]=b,f[m][x]=x,g[m][x]=s[d])}for(var w=0;u>w;w++)for(var d=0;u>d;d++)for(var v=0;u>v;v++)p[d][w]+p[w][v]d;d++)_.push(l[d].id());var E={distance:function(t,i){if(e.is.string(t))var r=n.filter(t)[0].id();else var r=t.id();if(e.is.string(i))var a=n.filter(i)[0].id();else var a=i.id();return p[c[r]][c[a]]},path:function(t,i){var r=function(e,t,i,r,a){if(e===t)return n.getElementById(r[e]);if(void 0===i[e][t])return void 0;for(var o=[n.getElementById(r[e])],s=e;e!==t;){s=e,e=i[e][t];var l=a[s][e];o.push(l),o.push(n.getElementById(r[e]))}return o};if(e.is.string(t))var a=n.filter(t)[0].id();else var a=t.id();if(e.is.string(i))var o=n.filter(i)[0].id();else var o=i.id();var s=r(c[a],c[o],f,_,g);return new e.Collection(n,s)}};return E},bellmanFord:function(t){t=t||{};var i=function(){r&&console.log.apply(console,arguments)};if(null!=t.debug)var r=t.debug;else var r=!1;if(i("Starting bellmanFord..."),null!=t.weight&&e.is.fn(t.weight))var n=t.weight;else var n=function(){return 1};if(null!=t.directed)var a=t.directed;else var a=!1;if(null==t.root)return void e.util.error("options.root required");if(e.is.string(t.root))var o=this.filter(t.root)[0];else var o=t.root[0];i("Source node: %s",o.id());for(var s=this._private.cy,l=this.edges().not(":loop"),u=this.nodes(),c=u.length,d={},p=0;c>p;p++)d[u[p].id()]=p;for(var h=[],v=[],f=[],p=0;c>p;p++)h[p]=u[p].id()===o.id()?0:1/0,v[p]=void 0;for(var g=!1,p=1;c>p;p++){g=!1;for(var y=0;yp;p++)_.push(u[p].id());var E={distanceTo:function(t){if(e.is.string(t))var i=s.filter(t)[0].id();else var i=t.id();return h[d[i]]},pathTo:function(t){var i=function(e,t,i,r,n,a){for(;;){if(n.push(s.getElementById(r[i])),n.push(a[i]),t===i)return n;var o=e[i];if("undefined"==typeof o)return void 0;i=o}};if(e.is.string(t))var r=s.filter(t)[0].id();else var r=t.id();var n=[],a=i(v,d[o.id()],d[r],_,n,f);return null!=a&&a.reverse(),new e.Collection(s,a)},hasNegativeWeightCycle:!1};return E},kargerStein:function(t){t=t||{};var i=function(){a&&console.log.apply(console,arguments)},r=function(e,t,i){for(var r=i[e],n=r[1],a=r[2],o=t[n],s=t[a],l=i.filter(function(e){return t[e[1]]===o&&t[e[2]]===s?!1:t[e[1]]===s&&t[e[2]]===o?!1:!0}),u=0;u=i)return t;var o=Math.floor(Math.random()*t.length),s=r(o,e,t);return n(e,s,i-1,a)};if(null!=t&&null!=t.debug)var a=t.debug;else var a=!1;i("Starting kargerStein...");var o=this._private.cy,s=this.edges().not(":loop"),l=this.nodes(),u=l.length,c=s.length,d=Math.ceil(Math.pow(Math.log(u)/Math.LN2,2)),p=Math.floor(u/Math.sqrt(2));if(2>u)return void e.util.error("At least 2 nodes are required for KargerSteing algorithm!");for(var h={},v=0;u>v;v++)h[l[v].id()]=v;for(var f=[],v=0;c>v;v++){var g=s[v];f.push([v,h[g.source().id()],h[g.target().id()]])}for(var y,m=1/0,x=[],v=0;u>v;v++)x.push(v);for(var b=0;d>=b;b++){var w=x.slice(0),_=n(w,f,u,p),E=w.slice(0),S=n(w,_,p,2),P=n(E,_,p,2);S.length<=P.length&&S.lengthr;r++)i+=e[r];for(var r=0;t>r;r++)e[r]=e[r]/i},r=function(){n&&console.log.apply(console,arguments)};if(null!=t&&null!=t.debug)var n=t.debug;else var n=!1;if(r("Starting pageRank..."),null!=t&&null!=t.dampingfactor)var a=t.dampingFactor;else var a=.8;if(null!=t&&null!=t.precision)var o=t.precision;else var o=1e-6;if(null!=t&&null!=t.iterations)var s=t.iterations;else var s=200;if(null!=t&&null!=t.weight&&e.is.fn(t.weight))var l=t.weight;else var l=function(){return 1};for(var u=this._private.cy,c=this.edges().not(":loop"),d=this.nodes(),p=d.length,h=c.length,v={},f=0;p>f;f++)v[d[f].id()]=f;for(var g=[],y=[],m=(1-a)/p,f=0;p>f;f++){for(var x=[],b=0;p>b;b++)x.push(0);g.push(x),y.push(0)}for(var f=0;h>f;f++){var w=c[f],_=v[w.source().id()],E=v[w.target().id()],S=l.apply(w,[w]);g[E][_]+=S,y[_]+=S}for(var P=1/p+m,b=0;p>b;b++)if(0===y[b])for(var f=0;p>f;f++)g[f][b]=P;else for(var f=0;p>f;f++)g[f][b]=g[f][b]/y[b]+m;for(var k,C=[],D=[],f=0;p>f;f++)C.push(1),D.push(0);for(var N=0;s>N;N++){for(var T=D.slice(0),f=0;p>f;f++)for(var b=0;p>b;b++)T[f]+=g[f][b]*C[b];i(T),k=C,C=T;for(var M=0,f=0;p>f;f++)M+=Math.pow(k[f]-C[f],2);if(o>M){r("Stoped at iteration %s",N);break}}r("Result:\n"+C);var B={rank:function(t){if(e.is.string(t))var i=u.filter(t)[0].id();else var i=t.id();return C[v[i]]}};return B}})}(cytoscape),function(e){"use strict";e.fn.eles({animated:e.define.animated(),clearQueue:e.define.clearQueue(),delay:e.define.delay(),animate:e.define.animate(),stop:e.define.stop()})}(cytoscape),function(e){"use strict";e.fn.eles({classes:function(t){var i,r=this,n=[];if(e.is.fn(t))i=t;else if(!e.is.plainObject(t))return this;for(var a=0;a0&&new e.Collection(this.cy(),n).updateStyle().trigger("class"),this},addClass:function(t){t=t.split(/\s+/);for(var i=this,r=[],n=0;n0&&new e.Collection(this._private.cy,r).updateStyle().trigger("class"),i},hasClass:function(e){var t=this[0];return null!=t&&t._private.classes[e]?!0:!1},toggleClass:function(t,i){for(var r=t.split(/\s+/),n=this,a=[],o=0,s=n.length;s>o;o++)for(var l=n[o],u=0;u0&&new e.Collection(this._private.cy,a).updateStyle().trigger("class"),n},removeClass:function(t){t=t.split(/\s+/);for(var i=this,r=[],n=0;n0&&new e.Collection(i._private.cy,r).updateStyle(),i.trigger("class"),i},flashClass:function(e,t){var i=this;if(null==t)t=250;else if(0===t)return i;return i.addClass(e),setTimeout(function(){i.removeClass(e)},t),i}})}(cytoscape),function(e){"use strict";e.fn.eles({allAre:function(e){return this.filter(e).length===this.length},is:function(e){return this.filter(e).length>0},some:function(e,t){for(var i=0;i0},allAreNeighbors:function(e){return e=this.cy().collection(e),this.neighborhood().intersect(e).length===e.length}})}(cytoscape),function(e){"use strict";e.fn.eles({parent:function(t){for(var i=[],r=this._private.cy,n=0;n0&&i.push(o)}return new e.Collection(r,i,{unique:!0}).filter(t)},parents:function(t){for(var i=[],r=this.parent();r.nonempty();){for(var n=0;n0?this.add(s):this;i?l.trigger("position"):l.rtrigger("position")}return this},silentPositions:function(e){return this.positions(e,!0)},updateCompoundBounds:function(){function t(e){var t=e.children(),i=e._private.style,n=t.boundingBox({includeLabels:!1,includeEdges:!1}),a={top:i["padding-top"].pxValue,bottom:i["padding-bottom"].pxValue,left:i["padding-left"].pxValue,right:i["padding-right"].pxValue},o=e._private.position,s=!1;"auto"===i.width.value&&(e._private.autoWidth=n.w+a.left+a.right,o.x=(n.x1+n.x2-a.left+a.right)/2,s=!0),"auto"===i.height.value&&(e._private.autoHeight=n.h+a.top+a.bottom,o.y=(n.y1+n.y2-a.top+a.bottom)/2,s=!0),s&&r.push(e)}var i=this.cy();if(!i.styleEnabled()||!i.hasCompoundNodes())return i.collection();for(var r=[],n=this.parent();n.nonempty();){for(var a=0;a0,d=c;c&&(u=u[0]);var p=d?u._private.position:{x:0,y:0};return a={x:l.x-p.x,y:l.y-p.y},void 0===t?a:a[t]}for(var h=0;h0,d=c;c&&(u=u[0]);var p=d?u._private.position:{x:0,y:0};void 0!==i?r._private.position[t]=i+p[t]:void 0!==a&&(r._private.position={x:a.x+p.x,y:a.y+p.y})}this.rtrigger("position")}else if(!o)return void 0;return this},width:function(){var e=this[0],t=e._private.cy,i=t._private.styleEnabled;if(e){if(i){var r=e._private.style.width;return"auto"===r.strValue?e._private.autoWidth:r.pxValue}return 1}},outerWidth:function(){var e=this[0],r=e._private.cy,n=r._private.styleEnabled;if(e){if(n){var a=e._private.style,o="auto"===a.width.strValue?e._private.autoWidth:a.width.pxValue,s=a["border-width"]?a["border-width"].pxValue*t+i:0;return o+s}return 1}},renderedWidth:function(){var e=this[0];if(e){var t=e.width();return t*this.cy().zoom()}},renderedOuterWidth:function(){var e=this[0];if(e){var t=e.outerWidth();return t*this.cy().zoom()}},height:function(){var e=this[0],t=e._private.cy,i=t._private.styleEnabled;if(e&&"nodes"===e._private.group){if(i){var r=e._private.style.height;return"auto"===r.strValue?e._private.autoHeight:r.pxValue}return 1}},outerHeight:function(){var e=this[0],r=e._private.cy,n=r._private.styleEnabled;if(e&&"nodes"===e._private.group){if(!n)return 1;var a=e._private.style,o="auto"===a.height.strValue?e._private.autoHeight:a.height.pxValue,s=a["border-width"]?a["border-width"].pxValue*t+i:0;return o+s}},renderedHeight:function(){var e=this[0];if(e&&"nodes"===e._private.group){var t=e.height();return t*this.cy().zoom()}},renderedOuterHeight:function(){var e=this[0];if(e&&"nodes"===e._private.group){var t=e.outerHeight();return t*this.cy().zoom()}},renderedBoundingBox:function(e){var t=this.boundingBox(e),i=this.cy(),r=i.zoom(),n=i.pan(),a=t.x1*r+n.x,o=t.x2*r+n.x,s=t.y1*r+n.y,l=t.y2*r+n.y;return{x1:a,x2:o,y1:s,y2:l,w:o-a,h:l-s}},boundingBox:function(e){var t=this,i=t._private.cy,r=i._private,n=r.styleEnabled;e=e||{};var a=void 0===e.includeNodes?!0:e.includeNodes,o=void 0===e.includeEdges?!0:e.includeEdges,s=void 0===e.includeLabels?!0:e.includeLabels;n&&r.renderer.recalculateRenderedStyle(this);for(var l=1/0,u=-1/0,c=1/0,d=-1/0,p=0;ph?h:l,u=v>u?v:u,c=c>f?f:c,d=g>d?g:d}else if(x.isEdge()&&o){E=!0;var N=x._private.source._private.position,T=x._private.target._private.position,M=x._private.rstyle||{};if(h=N.x,v=T.x,f=N.y,g=T.y,h>v){var B=h;h=v,v=B}if(f>g){var B=f;f=g,g=B}if(l=l>h?h:l,u=v>u?v:u,c=c>f?f:c,d=g>d?g:d,n)for(var I=M.bezierPts||[],P=x._private.style.width.pxValue,z=P/2,L=0;Lh?h:l,u=v>u?v:u,c=c>f?f:c,d=g>d?g:d}}if(n){var R=x._private.style,M=x._private.rstyle,X=R.content.strValue,V=R["font-size"],Y=R["text-halign"],A=R["text-valign"],q=M.labelWidth,F=M.labelHeight,j=M.labelX,W=M.labelY;if(E&&s&&X&&V&&null!=F&&null!=q&&null!=j&&null!=W&&Y&&A){var H,$,Z,U,G=F,K=q;if(x.isEdge())H=j-K/2,$=j+K/2,Z=W-G/2,U=W+G/2;else{switch(Y.value){case"left":H=j-K,$=j;break;case"center":H=j-K/2,$=j+K/2;break;case"right":H=j,$=j+K}switch(A.value){case"top":Z=W-G,U=W;break;case"center":Z=W-G/2,U=W+G/2;break;case"bottom":Z=W,U=W+G}}l=l>H?H:l,u=$>u?$:u,c=c>Z?Z:c,d=U>d?U:d}}}}return{x1:l,x2:u,y1:c,y2:d,w:u-l,h:d-c}}}),e.elesfn.modelPosition=e.elesfn.position,e.elesfn.modelPositions=e.elesfn.positions}(cytoscape),function(e){"use strict";function t(e){return function(t){var i=this;if(void 0===t&&(t=!0),0!==i.length&&i.isNode()&&!i.removed()){for(var r=0,n=i[0],a=n._private.edges,o=0;oe}),maxDegree:i("degree",function(e,t){return e>t}),minIndegree:i("indegree",function(e,t){return t>e}),maxIndegree:i("indegree",function(e,t){return e>t}),minOutdegree:i("outdegree",function(e,t){return t>e}),maxOutdegree:i("outdegree",function(e,t){return e>t})}),e.fn.eles({totalDegree:function(e){for(var t=0,i=this.nodes(),r=0;r1&&!n){var a=this.length-1,o=this[a];this[a]=void 0,this[r]=o,t.indexes[o.id()]=r}return this.length--,this},unmerge:function(t){var i=this._private.cy;if(!t)return this;if(e.is.string(t)){var r=t;t=i.elements(r)}for(var n=0;nr&&(r=s,i=o)}return{value:r,ele:i}},min:function(e,t){for(var i,r=1/0,n=this,a=0;as&&(r=s,i=o)}return{value:r,ele:i}}})}(cytoscape),function(e){"use strict";e.fn.eles({isNode:function(){return"nodes"===this.group()},isEdge:function(){return"edges"===this.group()},isLoop:function(){return this.isEdge()&&this.source().id()===this.target().id()},isSimple:function(){return this.isEdge()&&this.source().id()!==this.target().id()},group:function(){var e=this[0];return e?e._private.group:void 0}})}(cytoscape),function(e){"use strict";e.fn.eles({each:function(t){if(e.is.fn(t))for(var i=0;it&&(t=n+t),0>i&&(i=n+i);for(var a=t;a>=0&&i>a&&n>a;a++)r.push(this[a]);return new e.Collection(this.cy(),r)},size:function(){return this.length},eq:function(t){return this[t]||new e.Collection(this.cy())},first:function(){return this[0]||new e.Collection(this.cy())},last:function(){return this[this.length-1]||new e.Collection(this.cy())},empty:function(){return 0===this.length},nonempty:function(){return!this.empty()},sort:function(t){if(!e.is.fn(t))return this;var i=this.cy(),r=this.toArray().sort(t);return new e.Collection(i,r)},sortByZIndex:function(){return this.sort(e.Collection.zIndexSort)},zDepth:function(){var e=this[0];if(!e)return void 0;var t=e._private,i=t.group;if("nodes"===i)return t.data.parent?e.parents().size():0;var r=t.source,n=t.target,a=r._private.data.parent?r.parents().size():0,o=n._private.data.parent?n.parents().size():0;return Math.max(a-1,o-1,0)+.5}}),e.Collection.zIndexSort=function(e,t){var i=e.cy(),r=e._private,n=t._private,a=r.style["z-index"].value-n.style["z-index"].value,o=0,s=0,l=i.hasCompoundNodes(),u="nodes"===r.group,c="edges"===r.group,d="nodes"===n.group,p="edges"===n.group;l&&(o=e.zDepth(),s=t.zDepth());var h=o-s,v=0===h;return v?u&&p?1:c&&d?-1:0===a?r.index-n.index:a:h}}(cytoscape),function(e){"use strict";e.fn.eles({layoutPositions:function(t,i,r){var n=this.nodes(),a=this.cy();if(t.trigger({type:"layoutstart",layout:t}),i.animate)for(var o=0;o0?this.add(o):this;return e?s.rtrigger("style"):s.trigger("style"),this},updateMappers:function(e){var t=this._private.cy,i=t.style();if(e=e||void 0===e?!0:!1,!t.styleEnabled())return this;i.updateMappers(this);var r=this.updateCompoundBounds(),n=r.length>0?this.add(r):this;return e?n.rtrigger("style"):n.trigger("style"),this},renderedCss:function(e){var t=this.cy();if(!t.styleEnabled())return this;var i=this[0];if(i){var r=i.cy().style().getRenderedStyle(i);return void 0===e?r:r[e]}},css:function(t,i){var r=this.cy();if(!r.styleEnabled())return this;var n=!1,a=r.style();if(e.is.plainObject(t)){var o=t;a.applyBypass(this,o,n); -var s=this.updateCompoundBounds(),l=s.length>0?this.add(s):this;l.rtrigger("style")}else if(e.is.string(t)){if(void 0===i){var u=this[0];return u?u._private.style[t].strValue:void 0}a.applyBypass(this,t,i,n);var s=this.updateCompoundBounds(),l=s.length>0?this.add(s):this;l.rtrigger("style")}else if(void 0===t){var u=this[0];return u?a.getRawStyle(u):void 0}return this},removeCss:function(e){var t=this.cy();if(!t.styleEnabled())return this;var i=!1,r=t.style(),n=this;if(void 0===e)for(var a=0;a0?this.add(s):this;return l.rtrigger("style"),this},show:function(){return this.css("display","element"),this},hide:function(){return this.css("display","none"),this},visible:function(){var e=this.cy();if(!e.styleEnabled())return!0;var t=this[0],i=e.hasCompoundNodes();if(t){var r=t._private.style;if("visible"!==r.visibility.value||"element"!==r.display.value)return!1;if("nodes"===t._private.group){if(!i)return!0;var n=t._private.data.parent?t.parents():null;if(n)for(var a=0;a0;o||r.push(a)}}return new e.Collection(this._private.cy,r,{unique:!0}).filter(t)},leaves:function(t){for(var i=this,r=[],n=0;n0;o||r.push(a)}}return new e.Collection(this._private.cy,r,{unique:!0}).filter(t)},outgoers:function(t){for(var i=this,r=[],n=0;n0&&i.push(c[0]),i.push(u[0])}return new e.Collection(r,i,{unique:!0}).filter(t)},closedNeighborhood:function(e){return this.neighborhood().add(this).filter(e)},openNeighborhood:function(e){return this.neighborhood(e)}}),e.fn.eles({source:function(e){var t,i=this[0];return i&&(t=i._private.source),t&&e?t.filter(e):t},target:function(e){var t,i=this[0];return i&&(t=i._private.target),t&&e?t.filter(e):t},sources:t({attr:"source"}),targets:t({attr:"target"})}),e.fn.eles({edgesWith:i(),edgesTo:i({thisIs:"source"})}),e.fn.eles({connectedEdges:function(t){for(var i=[],r=this._private.cy,n=this,a=0;ad;d+=1){if(l.push(n.call(t,i[d],d,i)),a=i[d].id(),u.hasOwnProperty(a))throw"ERROR: Multiple items with the same id found: "+a;u[a]=d,c.push(a)}for(this._private={cy:t,heap:l,pointers:u,elements:c,comparator:r,extractor:n,length:s},d=Math.floor(s/2);d>=0;d-=1)o=this.heapify(d);return o}},e.Heap.idFn=function(e){return e.id()},e.Heap.minHeapComparator=function(e,t){return e>=t},e.Heap.maxHeapComparator=function(e,t){return t>=e},e.fn.heap=function(t){for(var i in t){var r=t[i];e.Heap.prototype[i]=r}},e.heapfn=e.Heap.prototype,e.heapfn.size=function(){return this._private.length},e.heapfn.getArgumentAsCollection=function(t,i){var r;if("undefined"==typeof i&&(i=this._private.cy),e.is.elementOrCollection(t))r=t;else{for(var n=[],a=[].concat.apply([],[t]),o=0;o0&&n.push(l)}r=new e.Collection(i,n)}return r},e.heapfn.isHeap=function(){var e,t,i,r,n,a=this._private.heap,o=a.length,s=this._private.comparator;for(e=0;o>e;e+=1)if(t=2*e+1,i=t+1,r=o>t?s(a[t],a[e]):!0,n=o>i?s(a[i],a[e]):!0,!r||!n)return!1;return!0},e.heapfn.heapSwap=function(e,t){var i=this._private.heap,r=this._private.pointers,n=this._private.elements,a=i[e],o=n[e],s=n[e],l=n[t];i[e]=i[t],n[e]=n[t],r[s]=t,r[l]=e,i[t]=a,n[t]=o},e.heapfn.heapify=function(e,t){var i,r,n,a,o,s,l,u=0,c=!1;for("undefined"==typeof t&&(t=!0),i=this._private.heap,u=i.length,s=this._private.comparator,r=e;!c;)t?(n=2*r+1,a=n+1,o=r,u>n&&!s(i[n],i[o])&&(o=n),u>a&&!s(i[a],i[o])&&(o=a),c=o===r,c||(this.heapSwap(o,r),r=o)):(l=Math.floor((r-1)/2),o=r,c=0>l||s(i[o],i[l]),c||(this.heapSwap(o,l),r=l))},e.heapfn.insert=function(e){var t,i,r,n,a,o=this.getArgumentAsCollection(e),s=o.length;for(a=0;s>a;a+=1){if(t=o[a],i=this._private.heap.length,r=this._private.extractor(t),n=t.id(),this._private.pointers.hasOwnProperty(n))throw"ERROR: Multiple items with the same id found: "+n;this._private.heap.push(r),this._private.elements.push(n),this._private.pointers[n]=i,this.heapify(i,!1)}this._private.length=this._private.heap.length},e.heapfn.getValueById=function(e){if(this._private.pointers.hasOwnProperty(e)){var t=this._private.pointers[e];return this._private.heap[t]}},e.heapfn.contains=function(e){for(var t=this.getArgumentAsCollection(e),i=0;i0?{value:this._private.heap[0],id:this._private.elements[0]}:void 0},e.heapfn.pop=function(){if(this._private.length>0){var e,t,i,r=this.top(),n=this._private.length-1;return this.heapSwap(0,n),e=this._private.elements[n],t=this._private.heap[n],i=e,this._private.heap.pop(),this._private.elements.pop(),this._private.length=this._private.heap.length,this._private.pointers[i]=void 0,this.heapify(0),r}},e.heapfn.findDirectionHeapify=function(e){var t=Math.floor((e-1)/2),i=this._private.heap,r=0>t||this._private.comparator(i[e],i[t]);this.heapify(e,r)},e.heapfn.edit=function(t,i){for(var r=this.getArgumentAsCollection(t),n=0;n=o&&s>=e&&t>=l&&u>=t},a=function(e,t,i,r,n){r=-r;var a=e*Math.cos(r)-t*Math.sin(r),o=e*Math.sin(r)+t*Math.cos(r),s=a*i,l=o*i,u=s+n.x,c=l+n.y;return{x:u,y:c}};r.arrow={_points:[-.15,-.3,0,0,.15,-.3],collide:function(t,i,n,a,o,s,l,u){var c=r.arrow._points;return e.math.pointInsidePolygon(t,i,c,n,a,o,s,l,u)},roughCollide:n,draw:function(e,t,i,n){for(var o=r.arrow._points,s=0;se.math.sqDistanceToQuadraticBezier(i,r,c.startX,c.startY,c.cp2ax,c.cp2ay,c.selfEdgeMidX,c.selfEdgeMidY)||(x=e.math.inBezierVicinity(i,r,c.selfEdgeMidX,c.selfEdgeMidY,c.cp2cx,c.cp2cy,c.endX,c.endY,f))&&b()&&f+h>e.math.sqDistanceToQuadraticBezier(i,r,c.selfEdgeMidX,c.selfEdgeMidY,c.cp2cx,c.cp2cy,c.endX,c.endY))&&u.push(o);else if("haystack"===c.edgeType){var w=d["haystack-radius"].value,_=w/2,E=m._private.position,S=m.width(),P=m.height(),k=y._private.position,C=y.width(),D=y.height(),N=k.x+c.source.x*C*_,T=k.y+c.source.y*D*_,M=E.x+c.target.x*S*_,B=E.y+c.target.y*P*_;(x=e.math.inLineVicinity(i,r,N,T,M,B,g))&&b()&&f+h>e.math.sqDistanceToFiniteLine(i,r,N,T,M,B)&&u.push(o)}else"straight"===c.edgeType?(x=e.math.inLineVicinity(i,r,c.startX,c.startY,c.endX,c.endY,g))&&b()&&f+h>e.math.sqDistanceToFiniteLine(i,r,c.startX,c.startY,c.endX,c.endY)&&u.push(o):"bezier"===c.edgeType&&(x=e.math.inBezierVicinity(i,r,c.startX,c.startY,c.cp2x,c.cp2y,c.endX,c.endY,f))&&b()&&f+h>e.math.sqDistanceToQuadraticBezier(i,r,c.startX,c.startY,c.cp2x,c.cp2y,c.endX,c.endY)&&u.push(o);if(x&&b()&&0===u.length||u[u.length-1]!==o){var I=t.arrowShapes[d["source-arrow-shape"].value],z=t.arrowShapes[d["target-arrow-shape"].value],y=y||o._private.source,m=m||o._private.target,E=m._private.position,k=y._private.position,L=s.getArrowWidth(d.width.pxValue),O=s.getArrowHeight(d.width.pxValue),R=L,X=O;(I.roughCollide(i,r,c.arrowStartX,c.arrowStartY,L,O,[c.arrowStartX-k.x,c.arrowStartY-k.y],0)&&I.collide(i,r,c.arrowStartX,c.arrowStartY,L,O,[c.arrowStartX-k.x,c.arrowStartY-k.y],0)||z.roughCollide(i,r,c.arrowEndX,c.arrowEndY,R,X,[c.arrowEndX-E.x,c.arrowEndY-E.y],0)&&z.collide(i,r,c.arrowEndX,c.arrowEndY,R,X,[c.arrowEndX-E.x,c.arrowEndY-E.y],0))&&u.push(o)}p&&u.length>0&&u[u.length-1]===o&&(a(y),a(m))}for(var s=this,l=this.getCachedZSortedEles(),u=[],c=t.isTouch,d=this.data.cy.zoom(),p=this.data.cy.hasCompoundNodes(),h=(c?256:32)/d,v=(c?16:0)/d,f=l.length-1;f>=0;f--){var g=l[f];if(u.length>0)break;"nodes"===g._private.group?a(l[f]):o(l[f])}return u.length>0?u[u.length-1]:null},t.prototype.getAllInBox=function(i,r,n,a){var o=this.getCachedNodes(),s=this.getCachedEdges(),l=[],u=Math.min(i,n),c=Math.max(i,n),d=Math.min(r,a),p=Math.max(r,a);i=u,n=c,r=d,a=p;for(var h,v=0;v=i&&n>=k&&C>=r&&a>=C,M=D>=i&&n>=D&&N>=r&&a>=N;T&&M&&l.push(s[v])}}return l},t.prototype.getNodeWidth=function(e){return e.width()},t.prototype.getNodeHeight=function(e){return e.height()},t.prototype.getNodeShape=function(e){var t=e._private.style.shape.value;return e.isParent()?"rectangle"===t||"roundrectangle"===t?t:"rectangle":t},t.prototype.getNodePadding=function(e){var t=e._private.style["padding-left"].pxValue,i=e._private.style["padding-right"].pxValue,r=e._private.style["padding-top"].pxValue,n=e._private.style["padding-bottom"].pxValue;return isNaN(t)&&(t=0),isNaN(i)&&(i=0),isNaN(r)&&(r=0),isNaN(n)&&(n=0),{left:t,right:i,top:r,bottom:n}},t.prototype.zOrderSort=e.Collection.zIndexSort,t.prototype.updateCachedZSortedEles=function(){this.getCachedZSortedEles(!0)},t.prototype.getCachedZSortedEles=function(e){var t=this.lastZOrderCachedNodes,i=this.lastZOrderCachedEdges,r=this.getCachedNodes(),n=this.getCachedEdges(),a=[];if(!e&&t&&i&&t===r&&i===n)a=this.cachedZSortedEles;else{for(var o=0;op?p+"-"+d:d+"-"+p,c&&(r="unbundled"+l._private.data.id),null==n[r]&&(n[r]=[],a.push(r)),n[r].push(l),c&&(n[r].hasUnbundled=!0)}else o.push(l)}for(var h,v,f,g,y,m,x,b,w,_,E,S,P,k,C=0;Cv._private.data.id){var N=h;h=v,v=N}if(f=h._private.position,g=v._private.position,y=this.getNodeWidth(h),m=this.getNodeHeight(h),x=this.getNodeWidth(v),b=this.getNodeHeight(v),w=t.nodeShapes[this.getNodeShape(h)],_=t.nodeShapes[this.getNodeShape(v)],E=h._private.style["border-width"].pxValue,S=v._private.style["border-width"].pxValue,k=!1,D.length>1&&h!==v||D.hasUnbundled){var T=w.intersectLine(f.x,f.y,y,m,g.x,g.y,E/2),M=_.intersectLine(g.x,g.y,x,b,f.x,f.y,S/2),B={x1:T[0],x2:M[0],y1:T[1],y2:M[1]},I=M[1]-T[1],z=M[0]-T[0],L=Math.sqrt(z*z+I*I),O={x:z,y:I},R={x:O.x/L,y:O.y/L}; -P={x:-R.y,y:R.x},(_.checkPoint(T[0],T[1],S/2,x,b,g.x,g.y)||w.checkPoint(M[0],M[1],E/2,y,m,f.x,f.y))&&(P={},k=!0)}for(var l,X,s=0;skt,Dt=e.math.distance({x:X.cp2x,y:X.cp2y},{x:X.endX,y:X.endY}),Nt=Pt>Dt;if("bezier"===X.edgeType){var Tt=!1;if(xt||bt||Ct){Tt=!0;var Mt={x:X.cp2x-f.x,y:X.cp2y-f.y},Bt=Math.sqrt(Mt.x*Mt.x+Mt.y*Mt.y),It={x:Mt.x/Bt,y:Mt.y/Bt},zt=Math.max(y,m),Lt={x:X.cp2x+2*It.x*zt,y:X.cp2y+2*It.y*zt},Ot=w.intersectLine(f.x,f.y,y,m,Lt.x,Lt.y,E/2);Ct?(X.cp2x=X.cp2x+It.x*(Pt-kt),X.cp2y=X.cp2y+It.y*(Pt-kt)):(X.cp2x=Ot[0]+It.x*Pt,X.cp2y=Ot[1]+It.y*Pt)}if(wt||_t||Nt){Tt=!0;var Mt={x:X.cp2x-g.x,y:X.cp2y-g.y},Bt=Math.sqrt(Mt.x*Mt.x+Mt.y*Mt.y),It={x:Mt.x/Bt,y:Mt.y/Bt},zt=Math.max(y,m),Lt={x:X.cp2x+2*It.x*zt,y:X.cp2y+2*It.y*zt},Rt=_.intersectLine(g.x,g.y,x,b,Lt.x,Lt.y,S/2);Nt?(X.cp2x=X.cp2x+It.x*(Pt-Dt),X.cp2y=X.cp2y+It.y*(Pt-Dt)):(X.cp2x=Rt[0]+It.x*Pt,X.cp2y=Rt[1]+It.y*Pt)}Tt&&this.findEndpoints(l)}else"straight"===X.edgeType&&(X.midX=(Z+it)/2,X.midY=(G+nt)/2);this.projectBezier(l)}}}for(var s=0;sC*N+D*T)n.straightEdgeTooShort=!0;else{var P=n;this.drawStyledEdge(i,e,[P.startX,P.startY,P.endX,P.endY],_,w),n.straightEdgeTooShort=!1}}else{var P=n;this.drawStyledEdge(i,e,[P.startX,P.startY,P.cp2x,P.cp2y,P.endX,P.endY],_,w)}"haystack"===n.edgeType?this.drawArrowheads(e,i,r):n.noArrowPlacement!==!0&&void 0!==n.startX&&this.drawArrowheads(e,i,r)}}},t.prototype.drawStyledEdge=function(e,i,r,n){var a,o=e._private.rscratch,s=i,l=!1,u=t.usePaths();if(u){for(var c=r,d=o.pathCacheKey&&c.length===o.pathCacheKey.length,p=d,h=0;p&&hu?y+=Math.PI/2:y=-(Math.PI/2+y);var m=this.getArrowWidth(a),x=t.arrowShapes[o];if(p){var b=m+"$"+o+"$"+y+"$"+s+"$"+l;h.arrowPathCacheKey=h.arrowPathCacheKey||{},h.arrowPathCache=h.arrowPathCache||{};var w=h.arrowPathCacheKey[i]===b;w?(d=r=h.arrowPathCache[i],v=!0):(d=r=new Path2D,h.arrowPathCacheKey[i]=b,h.arrowPathCache[i]=d)}r.beginPath&&r.beginPath(),v||x.draw(r,m,y,g),!x.leavePathOpen&&r.closePath&&r.closePath(),r=f,("filled"===n||"both"===n)&&(p?r.fill(d):r.fill()),("hollow"===n||"both"===n)&&(r.lineWidth=x.matchEdgeWidth?a:1,r.lineJoin="miter",p?r.stroke(d):r.stroke())}}(cytoscape),function(e){"use strict";var t=e("renderer","canvas");t.prototype.getCachedImage=function(e,t){var i=this,r=i.imageCache=i.imageCache||{};if(r[e]&&r[e].image)return r[e].image;var n=r[e]=r[e]||{},a=n.image=new Image;return a.addEventListener("load",t),a.src=e,a},t.prototype.drawInscribedImage=function(e,i,r){var n=this,a=r._private.position.x,o=r._private.position.y,s=r._private.style,l=s["background-fit"].value,u=s["background-position-x"],c=s["background-position-y"],d=s["background-repeat"].value,p=r.width(),h=r.height(),v=r._private.rscratch,f=s["background-clip"].value,g="node"===f,y=s["background-image-opacity"].value,m=i.width,x=i.height;if("contain"===l){var b=Math.min(p/m,h/x);m*=b,x*=b}else if("cover"===l){var b=Math.max(p/m,h/x);m*=b,x*=b}var w=a-p/2;w+="%"===u.units?(p-m)*u.value/100:u.pxValue;var _=o-h/2;_+="%"===c.units?(h-x)*c.value/100:c.pxValue,v.pathCache&&(w-=a,_-=o,a=0,o=0);var E=e.globalAlpha;if(e.globalAlpha=y,"no-repeat"===d)g&&(e.save(),v.pathCache?e.clip(v.pathCache):(t.nodeShapes[n.getNodeShape(r)].drawPath(e,a,o,p,h),e.clip())),e.drawImage(i,0,0,i.width,i.height,w,_,m,x),g&&e.restore();else{var S=e.createPattern(i,d);e.fillStyle=S,t.nodeShapes[n.getNodeShape(r)].drawPath(e,a,o,p,h),e.translate(w,_),e.fill(),e.translate(-w,-_)}e.globalAlpha=E}}(cytoscape),function(e){"use strict";var t=e("renderer","canvas");t.prototype.drawEdgeText=function(e,t){var i=t._private.style.content.strValue;if(!(!i||i.match(/^\s+$/)||this.hideEdgesOnViewport&&(this.dragData.didDrag||this.pinching||this.hoverData.dragging||this.data.wheel||this.swipePanning))){var r=t._private.style["font-size"].pxValue*t.cy().zoom(),n=t._private.style["min-zoomed-font-size"].pxValue;if(!(n>r)){e.textAlign="center",e.textBaseline="middle";var a=t._private.rscratch;this.drawText(e,t,a.labelX,a.labelY)}}},t.prototype.drawNodeText=function(e,t){var i=t._private.style.content.strValue;if(i&&!i.match(/^\s+$/)){var r=t._private.style["font-size"].pxValue*t.cy().zoom(),n=t._private.style["min-zoomed-font-size"].pxValue;if(!(n>r)){var a=t._private.style["text-halign"].strValue,o=t._private.style["text-valign"].strValue,s=t._private.rscratch;switch(a){case"left":e.textAlign="right";break;case"right":e.textAlign="left";break;default:e.textAlign="center"}switch(o){case"top":e.textBaseline="bottom";break;case"bottom":e.textBaseline="top";break;default:e.textBaseline="middle"}this.drawText(e,t,s.labelX,s.labelY)}}},t.prototype.getFontCache=function(e){var t;this.fontCaches=this.fontCaches||[];for(var i=0;i0&&(e.lineWidth=s,e.strokeText(o,i,r)),e.fillText(o,i,r)}}}}(cytoscape),function(e){"use strict";var t=e("renderer","canvas");t.prototype.drawNode=function(e,i,r){var n,a,o,s=this,l=i._private.style,u=i._private.rscratch,c=t.usePaths(),d=e,p=!1,h=l["overlay-padding"].pxValue,v=l["overlay-opacity"].value,f=l["overlay-color"].value;if(!r||0!==v){var g=i.effectiveOpacity();if(0!==g)if(n=this.getNodeWidth(i),a=this.getNodeHeight(i),e.lineWidth=l["border-width"].pxValue,void 0!==r&&r)v>0&&(this.fillStyle(e,f[0],f[1],f[2],v),t.nodeShapes.roundrectangle.drawPath(e,i._private.position.x,i._private.position.y,n+2*h,a+2*h),e.fill());else{var y=l["background-color"].value,m=l["border-color"].value,x=l["border-style"].value;switch(this.fillStyle(e,y[0],y[1],y[2],l["background-opacity"].value*l.opacity.value*g),this.strokeStyle(e,m[0],m[1],m[2],l["border-opacity"].value*l.opacity.value*g),e.lineJoin="miter",x){case"dotted":e.setLineDash([1,1]);break;case"dashed":e.setLineDash([4,2]);break;case"solid":case"double":e.setLineDash([])}var b=l["background-image"].value[2]||l["background-image"].value[1],w=l.shape.strValue,_=i._private.position;if(c){var E=w+"$"+n+"$"+a;e.translate(_.x,_.y),u.pathCacheKey===E?(o=e=u.pathCache,p=!0):(o=e=new Path2D,u.pathCacheKey=E,u.pathCache=o)}if(!p){var S=_;c&&(S={x:0,y:0}),t.nodeShapes[this.getNodeShape(i)].drawPath(e,S.x,S.y,n,a)}if(e=d,c?e.fill(o):e.fill(),void 0!==b){var P=this.getCachedImage(b,function(){s.data.canvasNeedsRedraw[t.NODE]=!0,s.data.canvasNeedsRedraw[t.DRAG]=!0,s.redraw()});P.complete&&this.drawInscribedImage(e,P,i)}var k=l["background-blacken"].value,C=l["border-width"].pxValue;if(this.hasPie(i)&&(this.drawPie(e,i),(0!==k||0!==C)&&(c||t.nodeShapes[this.getNodeShape(i)].drawPath(e,_.x,_.y,n,a))),k>0?(this.fillStyle(e,0,0,0,k),c?e.fill(o):e.fill()):0>k&&(this.fillStyle(e,255,255,255,-k),c?e.fill(o):e.fill()),C>0&&(c?e.stroke(o):e.stroke(),"double"===x)){e.lineWidth=l["border-width"].pxValue/3;var D=e.globalCompositeOperation;e.globalCompositeOperation="destination-out",c?e.stroke(o):e.stroke(),e.globalCompositeOperation=D}c&&e.translate(-_.x,-_.y),e.setLineDash([])}}},t.prototype.hasPie=function(e){return e=e[0],e._private.hasPie},t.prototype.drawPie=function(i,r){r=r[0];var n=r._private.style["pie-size"],a=this.getNodeWidth(r),o=this.getNodeHeight(r),s=r._private.position.x,l=r._private.position.y,u=Math.min(a,o)/2,c=0,d=t.usePaths();d&&(s=0,l=0),"%"===n.units?u=u*n.value/100:void 0!==n.pxValue&&(u=n.pxValue/2);for(var p=1;p<=e.style.pieBackgroundN;p++){var h=r._private.style["pie-"+p+"-background-size"].value,v=r._private.style["pie-"+p+"-background-color"].value,f=r._private.style["pie-"+p+"-background-opacity"].value,g=h/100,y=1.5*Math.PI+2*Math.PI*c,m=2*Math.PI*g,x=y+m;0===h||c>=1||c+g>1||(i.beginPath(),i.moveTo(s,l),i.arc(s,l,u,y,x),i.closePath(),this.fillStyle(i,v[0],v[1],v[2],f),i.fill(),c+=g)}}}(cytoscape),function(e){"use strict";var t=e("renderer","canvas");t.prototype.getPixelRatio=function(){var e=this.data.contexts[0];if(null!=this.forcedPixelRatio)return this.forcedPixelRatio;var t=e.backingStorePixelRatio||e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1;return(window.devicePixelRatio||1)/t},t.prototype.paintCache=function(e){for(var t,i=this.paintCaches=this.paintCaches||[],r=!0,n=0;n=o&&(i=r.bufferCanvases[t.TEXTURE_BUFFER],this.textureMult=2,i.width=s*this.textureMult,i.height=l*this.textureMult),this.canvasWidth=s,this.canvasHeight=l}},t.prototype.renderTo=function(e,t,i,r){this.redraw({forcedContext:e,forcedZoom:t,forcedPan:i,drawAllLayers:!0,forcedPxRatio:r})},t.prototype.timeToRender=function(){return this.redrawTotalTime/this.redrawCount},t.minRedrawLimit=1e3/60,t.maxRedrawLimit=1e3,t.motionBlurDelay=100,t.prototype.redraw=function(i){function r(){function i(e,t){if(e.setTransform(1,0,0,1,0,0),"motionBlur"===t){var i=e.globalCompositeOperation;e.globalCompositeOperation="destination-out",u.fillStyle(e,255,255,255,.666),e.fillRect(0,0,u.canvasWidth,u.canvasHeight),e.globalCompositeOperation=i}else n||void 0!==t&&!t||e.clearRect(0,0,u.canvasWidth,u.canvasHeight);a||(e.translate(b.x,b.y),e.scale(m,m)),l&&e.translate(l.x,l.y),s&&e.scale(s,s)}function r(e,t){for(var i=e.eles,r=0;r0&&(C.strokeStyle="rgba("+g["selection-box-border-color"].value[0]+","+g["selection-box-border-color"].value[1]+","+g["selection-box-border-color"].value[2]+","+g["selection-box-opacity"].value+")",C.strokeRect(p.select[0],p.select[1],p.select[2]-p.select[0],p.select[3]-p.select[1]))}if(p.bgActivePosistion){var y=p.cy.zoom(),q=p.bgActivePosistion;C.fillStyle="rgba("+g["active-bg-color"].value[0]+","+g["active-bg-color"].value[1]+","+g["active-bg-color"].value[2]+","+g["active-bg-opacity"].value+")",C.beginPath(),C.arc(q.x,q.y,g["active-bg-size"].pxValue/y,0,2*Math.PI),C.fill()}var F=u.averageRedrawTime;if(u.showFps&&F){F=Math.round(F);var j=Math.round(1e3/F);C.setTransform(1,0,0,1,0,0),C.fillStyle="rgba(255, 0, 0, 0.75)",C.strokeStyle="rgba(255, 0, 0, 0.75)",C.lineWidth=1,C.fillText("1 frame = "+F+" ms = "+j+" fps",0,20);var W=60;C.strokeRect(0,30,250,20),C.fillRect(0,30,250*Math.min(j/W,1),20)}a||(h[t.SELECT_BOX]=!1)}var H=+new Date;void 0===u.averageRedrawTime&&(u.averageRedrawTime=H-w),void 0===u.redrawCount&&(u.redrawCount=0),u.redrawCount++,void 0===u.redrawTotalTime&&(u.redrawTotalTime=0),u.redrawTotalTime+=H-w,u.lastRedrawTime=H-w,u.averageRedrawTime=u.averageRedrawTime/2+(H-w)/2,u.currentlyDrawing=!1,u.clearingMotionBlur&&(u.clearingMotionBlur=!1,u.motionBlurCleared=!0,u.motionBlur=!0),v&&(u.motionBlurTimeout=setTimeout(function(){u.motionBlurTimeout=null,u.clearedNodeLayerForMotionBlur=!1,u.motionBlur=!1,u.clearingMotionBlur=!0,h[t.NODE]=!0,h[t.DRAG]=!0,u.redraw()},t.motionBlurDelay))}i=i||{};var n=i.forcedContext,a=i.drawAllLayers,o=i.drawOnlyNodeLayer,s=i.forcedZoom,l=i.forcedPan,u=this,c=void 0===i.forcedPxRatio?this.getPixelRatio():i.forcedPxRatio,d=u.data.cy,p=u.data,h=p.canvasNeedsRedraw,v=void 0!==i.motionBlur?i.motionBlur:u.motionBlur;v=v&&!n&&u.motionBlurEnabled,u.motionBlurTimeout&&clearTimeout(u.motionBlurTimeout),this.redrawTimeout&&clearTimeout(this.redrawTimeout),this.redrawTimeout=null,void 0===this.averageRedrawTime&&(this.averageRedrawTime=0);var f=t.minRedrawLimit,g=t.maxRedrawLimit,y=this.averageRedrawTime;y=f>y?f:y,y=g>y?y:g,void 0===this.lastDrawTime&&(this.lastDrawTime=0);var m=+new Date,x=m-this.lastDrawTime,b=x>=y;if(!n){if(!b||this.currentlyDrawing)return void(this.redrawTimeout=setTimeout(function(){u.redraw()},y));this.lastDrawTime=m,this.currentlyDrawing=!0}var w=+new Date;n?r():e.util.requestAnimationFrame(r),n||u.initrender||(u.initrender=!0,d.trigger("initrender"))}}(cytoscape),function(e){"use strict";var t=e("renderer","canvas");t.prototype.drawPolygonPath=function(e,t,i,r,n,a){var o=r/2,s=n/2;e.beginPath&&e.beginPath(),e.moveTo(t+o*a[0],i+s*a[1]);for(var l=1;l0&&a>0)if(l.clearRect(0,0,n,a),e.bg&&(l.fillStyle=e.bg,l.rect(0,0,n,a),l.fill()),l.globalCompositeOperation="source-over",e.full)this.redraw({forcedContext:l,drawAllLayers:!0,forcedZoom:o,forcedPan:{x:-r.x1*o,y:-r.y1*o},forcedPxRatio:1});else{var u=i.pan(),c={x:u.x*o,y:u.y*o},d=i.zoom()*o;this.redraw({forcedContext:l,drawAllLayers:!0,forcedZoom:d,forcedPan:c,forcedPxRatio:1})}return s},t.prototype.png=function(e){return this.bufferCanvasImage(e).toDataURL("image/png")}}(cytoscape),function(e){"use strict";var t=e("renderer","canvas");t.prototype.registerBinding=function(e,t,i,r){this.bindings.push({target:e,event:t,handler:i,useCapture:r}),e.addEventListener(t,i,r)},t.prototype.nodeIsDraggable=function(e){return 0!==e._private.style.opacity.value&&"visible"==e._private.style.visibility.value&&"element"==e._private.style.display.value&&!e.locked()&&e.grabbable()?!0:!1},t.prototype.load=function(){var i=this,r=function(e){var t;if(e.addToList&&i.data.cy.hasCompoundNodes()){if(!e.addToList.hasId){e.addToList.hasId={};for(var r=0;rs[0]&&r.clientXs[1]&&r.clientY=t.panOrBoxSelectDelay)&&Math.abs(v[3]-v[1])+Math.abs(v[2]-v[0])<4&&p.panningEnabled()&&p.userPanningEnabled())i.hoverData.dragging=!0,v[4]=0;else{if(p.boxSelectionEnabled()&&Math.pow(v[2]-v[0],2)+Math.pow(v[3]-v[1],2)>7&&v[4]&&(clearTimeout(i.bgActiveTimeout),i.data.bgActivePosistion=void 0,i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0,i.redraw()),y&&y.isEdge()&&y.active()&&y.unactivate(),f!=g&&(g&&(g.trigger(new e.Event(r,{type:"mouseout",cyPosition:{x:h[0],y:h[1]}})),g.trigger(new e.Event(r,{type:"tapdragout",cyPosition:{x:h[0],y:h[1]}}))),f&&(f.trigger(new e.Event(r,{type:"mouseover",cyPosition:{x:h[0],y:h[1]}})),f.trigger(new e.Event(r,{type:"tapdragover",cyPosition:{x:h[0],y:h[1]}}))),i.hoverData.last=f),y&&y.isNode()&&i.nodeIsDraggable(y)){i.dragData.didDrag||(i.data.canvasNeedsRedraw[t.NODE]=!0),i.dragData.didDrag=!0;for(var _=[],E=0;E7&&l[4]||i.hoverData.dragging||(a.$(function(){return this.selected()}).unselect(),c.length>0&&(i.data.canvasNeedsRedraw[t.NODE]=!0),i.dragData.possibleDragElements=c=[]),null!=u?u.trigger(new e.Event(r,{type:"mouseup",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"tapend",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"vmouseup",cyPosition:{x:s[0],y:s[1]}})):null==u&&a.trigger(new e.Event(r,{type:"mouseup",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"tapend",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"vmouseup",cyPosition:{x:s[0],y:s[1]}})),Math.pow(l[2]-l[0],2)+Math.pow(l[3]-l[1],2)===0&&(null!=u?u.trigger(new e.Event(r,{type:"click",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"tap",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"vclick",cyPosition:{x:s[0],y:s[1]}})):null==u&&a.trigger(new e.Event(r,{type:"click",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"tap",cyPosition:{x:s[0],y:s[1]}})).trigger(new e.Event(r,{type:"vclick",cyPosition:{x:s[0],y:s[1]}}))),u!=d||i.dragData.didDrag||null!=u&&u._private.selectable&&("additive"===a.selectionType()||p?u.selected()?u.unselect():u.select():p||(a.$(":selected").not(u).unselect(),u.select()),i.data.canvasNeedsRedraw[t.NODE]=!0),a.boxSelectionEnabled()&&Math.pow(l[2]-l[0],2)+Math.pow(l[3]-l[1],2)>7&&l[4]){var f=[],g=i.getAllInBox(l[0],l[1],l[2],l[3]);i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0,g.length>0&&(i.data.canvasNeedsRedraw[t.NODE]=!0);for(var y=0;y=0&&b>=d&&h>=0&&b>=h&&p>=0&&w>=p&&v>=0&&w>=v;var k=n.pan(),C=n.zoom();if(f=E(d,p,h,v),g=[(d+h)/2,(p+v)/2],y=[(g[0]-k.x)/C,(g[1]-k.y)/C],200>f&&!r.touches[2]){var D=i.findNearestElement(l[0],l[1],!0),N=i.findNearestElement(l[2],l[3],!0);return D&&D.isNode()?(D.activate().trigger(new e.Event(r,{type:"cxttapstart",cyPosition:{x:l[0],y:l[1]}})),i.touchData.start=D):N&&N.isNode()?(N.activate().trigger(new e.Event(r,{type:"cxttapstart",cyPosition:{x:l[0],y:l[1]}})),i.touchData.start=N):(n.trigger(new e.Event(r,{type:"cxttapstart",cyPosition:{x:l[0],y:l[1]}})),i.touchData.start=null),i.touchData.start&&(i.touchData.start._private.grabbed=!1),i.touchData.cxt=!0,i.touchData.cxtDragged=!1,i.data.bgActivePosistion=void 0,void i.redraw()}}if(r.touches[2]);else if(r.touches[1]);else if(r.touches[0]){var T=i.findNearestElement(l[0],l[1],!0);if(null!=T){if(T.activate(),i.touchData.start=T,T.isNode()&&i.nodeIsDraggable(T)){var M=i.dragData.touchDragEles=[];if(i.data.canvasNeedsRedraw[t.NODE]=!0,i.data.canvasNeedsRedraw[t.DRAG]=!0,T.selected())for(var B=n.$(function(){return this.isNode()&&this.selected()}),I=0;I250&&(i.touchData.start?i.touchData.start.trigger(new e.Event(r,{type:"taphold",cyPosition:{x:l[0],y:l[1]}})):(i.data.cy.trigger(new e.Event(r,{type:"taphold",cyPosition:{x:l[0],y:l[1]}})),n.$(":selected").unselect()))},1e3)}},!1),i.registerBinding(window,"touchmove",e.util.throttle(function(r){var n=i.data.select,o=i.touchData.capture;o&&r.preventDefault();var s=i.data.cy,l=i.touchData.now,u=i.touchData.earlier;if(r.touches[0]){var c=i.projectIntoViewport(r.touches[0].clientX,r.touches[0].clientY);l[0]=c[0],l[1]=c[1]}if(r.touches[1]){var c=i.projectIntoViewport(r.touches[1].clientX,r.touches[1].clientY);l[2]=c[0],l[3]=c[1]}if(r.touches[2]){var c=i.projectIntoViewport(r.touches[2].clientX,r.touches[2].clientY);l[4]=c[0],l[5]=c[1]}for(var g=[],b=0;b=1.5||C>=150){i.touchData.cxt=!1,i.touchData.start&&(i.touchData.start.unactivate(),i.touchData.start=null),i.data.bgActivePosistion=void 0,i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0;var N=new e.Event(r,{type:"cxttapend",cyPosition:{x:l[0],y:l[1]}});i.touchData.start?i.touchData.start.trigger(N):s.trigger(N)}}if(o&&i.touchData.cxt){var N=new e.Event(r,{type:"cxtdrag",cyPosition:{x:l[0],y:l[1]}});i.data.bgActivePosistion=void 0,i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0,i.touchData.start?i.touchData.start.trigger(N):s.trigger(N),i.touchData.start&&(i.touchData.start._private.grabbed=!1),i.touchData.cxtDragged=!0;var T=i.findNearestElement(l[0],l[1],!0);i.touchData.cxtOver&&T===i.touchData.cxtOver||(i.touchData.cxtOver&&i.touchData.cxtOver.trigger(new e.Event(r,{type:"cxtdragout",cyPosition:{x:l[0],y:l[1]}})),i.touchData.cxtOver=T,T&&T.trigger(new e.Event(r,{type:"cxtdragover",cyPosition:{x:l[0],y:l[1]}})))}else if(o&&r.touches[2]&&s.boxSelectionEnabled())i.data.bgActivePosistion=void 0,clearTimeout(this.threeFingerSelectTimeout),this.lastThreeTouch=+new Date,i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0,n&&0!==n.length&&void 0!==n[0]?(n[2]=(l[0]+l[2]+l[4])/3,n[3]=(l[1]+l[3]+l[5])/3):(n[0]=(l[0]+l[2]+l[4])/3,n[1]=(l[1]+l[3]+l[5])/3,n[2]=(l[0]+l[2]+l[4])/3+1,n[3]=(l[1]+l[3]+l[5])/3+1),n[4]=1,i.redraw();else if(o&&r.touches[1]&&s.zoomingEnabled()&&s.panningEnabled()&&s.userZoomingEnabled()&&s.userPanningEnabled()){i.data.bgActivePosistion=void 0,i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0;var M=i.dragData.touchDragEles;if(M){i.data.canvasNeedsRedraw[t.DRAG]=!0;for(var B=0;B4&&(i.touchData.singleTouchMoved=!0);if(o&&(null==W||W.isEdge())&&s.panningEnabled()&&s.userPanningEnabled()){W&&(W.unactivate(),i.data.bgActivePosistion||(i.data.bgActivePosistion={x:l[0],y:l[1]}),i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0,i.touchData.start=null),s.panBy({x:g[0]*s.zoom(),y:g[1]*s.zoom()}),i.swipePanning=!0;var c=i.projectIntoViewport(r.touches[0].clientX,r.touches[0].clientY);l[0]=c[0],l[1]=c[1]}}for(var b=0;b0?i.data.canvasNeedsRedraw[t.NODE]=!0:i.redraw()}r.touches.length<2&&(i.pinching=!1,i.data.canvasNeedsRedraw[t.NODE]=!0,i.redraw());var m=!1;if(null!=n&&(n._private.active=!1,m=!0,n.unactivate()),r.touches[2])i.data.bgActivePosistion=void 0,i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0;else if(r.touches[1]);else if(r.touches[0]);else if(!r.touches[0]){if(i.data.bgActivePosistion=void 0,i.data.canvasNeedsRedraw[t.SELECT_BOX]=!0,null!=n){n._private.grabbed&&(n._private.grabbed=!1,n.trigger("free"),n._private.rscratch.inDragLayer=!1);for(var x=n._private.edges,b=0;bc;c++)d[4*c]=p[2*c],d[4*c+1]=p[2*c+1],d[4*c+2]=h[2*c],d[4*c+3]=h[2*c+1];d=e.math.fitPolygonToSquare(d),n.star5=n.star={points:d,draw:function(e,t,r,a,o){i.drawPolygon(e,t,r,a,o,n.star5.points)},drawPath:function(e,t,r,a,o){i.drawPolygonPath(e,t,r,a,o,n.star5.points)},intersectLine:function(e,t,r,a,o,s,l){return i.polygonIntersectLine(o,s,n.star5.points,e,t,r/2,a/2,l)},intersectBox:function(e,t,r,a,o,s,l,u,c){var d=n.star5.points;return i.boxIntersectPolygon(e,t,r,a,d,o,s,l,u,[0,-1],c)},checkPoint:function(t,i,r,a,o,s,l){return e.math.pointInsidePolygon(t,i,n.star5.points,s,l,a,o,[0,-1],r)}}}(cytoscape),function(e){"use strict";function t(t){this._private={},this._private.options=e.util.extend({},i,t)}var i={animate:!0,maxSimulationTime:4e3,fit:!0,padding:30,boundingBox:void 0,ungrabifyWhileSimulating:!1,ready:void 0,stop:void 0,repulsion:void 0,stiffness:void 0,friction:void 0,gravity:!0,fps:void 0,precision:void 0,nodeMass:void 0,edgeLength:void 0,stepSize:.1,stableEnergy:function(e){var t=e;return t.max<=.5||t.mean<=.3},infinite:!1};t.prototype.run=function(){var t=this,i=this._private.options;return e.util.require("arbor",function(r){function n(e,t){return null==t?void 0:"function"==typeof t?t.apply(e,[e._private.data,{nodes:u.length,edges:c.length,element:e}]):t}function a(e){if(!e.isFullAutoParent()){var t=e._private.data.id,r=n(e,i.nodeMass),a=e._private.locked,o=e.position(),s=h.fromScreen({x:o.x,y:o.y});e.scratch().arbor=h.addNode(t,{element:e,mass:r,fixed:a,x:a?s.x:void 0,y:a?s.y:void 0})}}function o(e){var t=e.source().id(),r=e.target().id(),a=n(e,i.edgeLength);e.scratch().arbor=h.addEdge(t,r,{length:a})}var s=i.cy,l=i.eles,u=l.nodes().not(":parent"),c=l.edges(),d=e.util.makeBoundingBox(i.boundingBox?i.boundingBox:{x1:0,y1:0,w:s.width(),h:s.height()}),p=!1;if(t.trigger({type:"layoutstart",layout:t}),void 0!==i.liveUpdate&&(i.animate=i.liveUpdate),s.nodes().size()<=1)return i.fit&&s.reset(),s.nodes().position({x:Math.round((d.x1+d.x2)/2),y:Math.round((d.y1+d.y2)/2)}),t.one("layoutready",i.ready),t.trigger({type:"layoutready",layout:t}),t.one("layoutstop",i.stop),void t.trigger({type:"layoutstop",layout:t});var h=t._private.system=r.ParticleSystem();h.parameters({repulsion:i.repulsion,stiffness:i.stiffness,friction:i.friction,gravity:i.gravity,fps:i.fps,dt:i.dt,precision:i.precision}),i.animate&&i.fit&&s.fit(d,i.padding);var v,f=250,g=!1,y=+new Date,m={init:function(){},redraw:function(){var e=h.energy();if(!i.infinite&&null!=i.stableEnergy&&null!=e&&e.n>0&&i.stableEnergy(e))return void t.stop();i.infinite||1/0==f||(clearTimeout(v),v=setTimeout(P,f));var r=s.collection();h.eachNode(function(e,t){var i=e.data,n=i.element;null!=n&&(n.locked()||n.grabbed()||(n.silentPosition({x:d.x1+t.x,y:d.y1+t.y}),r.merge(n)))}),i.animate&&r.length>0&&(p=!0,r.rtrigger("position"),i.fit&&s.fit(i.padding),y=+new Date,p=!1),g||(g=!0,t.one("layoutready",i.ready),t.trigger({type:"layoutready",layout:t}))}};h.renderer=m,h.screenSize(d.w,d.h),h.screenPadding(i.padding,i.padding,i.padding,i.padding),h.screenStep(i.stepSize);var x;u.on("grab free position",x=function(e){if(!p){var t=this.position(),n=h.fromScreen(t);if(n){var a=r.Point(n.x,n.y),o=i.padding;switch(d.x1+o<=t.x&&t.x<=d.x2-o&&d.y1+o<=t.y&&t.y<=d.y2-o&&(this.scratch().arbor.p=a),e.type){case"grab":this.scratch().arbor.fixed=!0;break;case"free":this.scratch().arbor.fixed=!1}}}});var b;u.on("lock unlock",b=function(){node.scratch().arbor.fixed=node.locked()});var w;l.on("remove",w=function(){});var _;s.on("add","*",_=function(){});var E;s.on("resize",E=function(){if(null==i.boundingBox&&null!=t._private.system){var e=s.width(),r=s.height();h.screenSize(e,r)}}),u.each(function(e,t){a(t)}),c.each(function(e,t){o(t)});var S=u.filter(":grabbable");i.ungrabifyWhileSimulating&&S.ungrabify();var P=t._private.doneHandler=function(){t._private.doneHandler=null,i.animate||(i.fit&&s.reset(),u.rtrigger("position")),u.off("grab free position",x),u.off("lock unlock",b),l.off("remove",w),s.off("add","*",_),s.off("resize",E),i.ungrabifyWhileSimulating&&S.grabify(),t.one("layoutstop",i.stop),t.trigger({type:"layoutstop",layout:t})};h.start(),!i.infinite&&null!=i.maxSimulationTime&&i.maxSimulationTime>0&&1/0!==i.maxSimulationTime&&setTimeout(function(){t.stop()},i.maxSimulationTime)}),this},t.prototype.stop=function(){return null!=this._private.system&&this._private.system.stop(),this._private.doneHandler&&this._private.doneHandler(),this},e("layout","arbor",t)}(cytoscape),function(e){"use strict";function t(t){this.options=e.util.extend({},i,t)}var i={fit:!0,directed:!1,padding:30,circle:!1,boundingBox:void 0,avoidOverlap:!0,roots:void 0,maximalAdjustments:0,animate:!1,animationDuration:500,ready:void 0,stop:void 0};t.prototype.run=function(){var t,i=this.options,r=i,n=i.cy,a=r.eles,o=a.nodes().not(":parent"),s=a,l=e.util.makeBoundingBox(r.boundingBox?r.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()});if(e.is.elementOrCollection(r.roots))t=r.roots;else if(e.is.array(r.roots)){for(var u=[],c=0;c0;){var f=n.collection();a.bfs({roots:v[0],visit:function(e,t,i){f=f.add(i)},directed:!1}),v=v.not(f),h.push(f)}t=n.collection();for(var c=0;cC;){for(var D=P.shift(),N=D.neighborhood().nodes(),T=!1,c=0;cc;c++)for(var M=x[c],R=M.length,X=0;R>X;X++){var p=M[X],V=p._private.scratch.breadthfirst,Y=I(p);Y&&(V.intEle=Y,O.push(p))}for(var c=0;cx.length-1;)x.push([]);x[q].push(p),V.depth=q,V.index=x[q].length-1}B()}var F=0;if(r.avoidOverlap){for(var c=0;cl||0===t)&&(r+=s/u,n++)}return n=Math.max(1,n),r/=n,0===n&&(r=void 0),H[e.id()]=r,r},Z=function(e,t){var i=$(e),r=$(t);return i-r},U=0;3>U;U++){for(var c=0;c0&&x[0].length<=3?c/2:0),g=2*Math.PI/x[n].length*a;return 0===n&&1===x[0].length&&(f=1),{x:K.x+f*Math.cos(g),y:K.y+f*Math.sin(g)}}return{x:K.x+(a+1-(o+1)/2)*s,y:(n+1)*u}},Q={},c=x.length-1;c>=0;c--)for(var M=x[c],X=0;X1&&r.avoidOverlap){d*=1.75;var c=2*Math.PI/o.length,f=Math.cos(c)-Math.cos(0),g=Math.sin(c)-Math.sin(0),y=Math.sqrt(d*d/(f*f+g*g));t=Math.max(y,t)}var m=function(){var e=t*Math.cos(u),i=t*Math.sin(u),n={x:l.x+e,y:l.y+i};return u=r.counterclockwise?u-c:u+c,n};return o.layoutPositions(this,r,m),this},e("layout","circle",t)}(cytoscape),function(e){"use strict";function t(t){this.options=e.util.extend(!0,{},i,t)}var i={animate:!0,refresh:1,maxSimulationTime:4e3,ungrabifyWhileSimulating:!1,fit:!0,padding:30,boundingBox:void 0,ready:function(){},stop:function(){},randomize:!1,avoidOverlap:!0,handleDisconnected:!0,nodeSpacing:function(){return 10},flow:void 0,alignment:void 0,edgeLength:void 0,edgeSymDiffLength:void 0,edgeJaccardLength:void 0,unconstrIter:void 0,userConstIter:void 0,allConstIter:void 0,infinite:!1};t.prototype.run=function(){var t=this,i=this.options;return e.util.require("cola",function(r){var n=i.cy,a=i.eles,o=a.nodes(),s=a.edges(),l=!1,u=e.util.makeBoundingBox(i.boundingBox?i.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()}),c=function(t,i){if(e.is.fn(t)){var r=t;return r.apply(i,[i])}return t},d=function(){for(var e={min:1/0,max:-1/0},t={min:1/0,max:-1/0},r=0;ri&&!e;i++)e=e||n();return e};if(i.animate){var o=function(){a()||e.util.requestAnimationFrame(o)};e.util.requestAnimationFrame(o)}else for(;!n(););},on:function(){},drag:function(){}});t.adaptor=g;var y=o.filter(":grabbable");i.ungrabifyWhileSimulating&&y.ungrabify();var m;o.on("grab free position",m=function(t){var i=this,r=i._private.scratch.cola,n=i._private.position;switch(i.grabbed()?(r.x=n.x-u.x1,r.y=n.y-u.y1,g.dragstart(r)):e.is.number(r.x)&&e.is.number(r.y)&&(n.x=r.x+u.x1,n.y=r.y+u.y1),t.type){case"grab":g.dragstart(r),g.resume();break;case"free":g.dragend(r)}});var x;o.on("lock unlock",x=function(){var e=this,t=e._private.scratch.cola;e.locked()?g.dragstart(t):g.dragend(t)});var b=o.stdFilter(function(e){return!e.isParent()});if(g.nodes(b.map(function(e,t){var r=c(i.nodeSpacing,e),n=e.position(),a=e._private.scratch.cola={x:i.randomize?Math.round(Math.random()*u.w):n.x,y:i.randomize?Math.round(Math.random()*u.h):n.y,width:e.outerWidth()+2*r,height:e.outerHeight()+2*r,index:t};return a})),i.alignment){var w=[],_=[];b.forEach(function(e){var t=c(i.alignment,e),r=e._private.scratch.cola,n=r.index;t&&(null!=t.x&&w.push({node:n,offset:t.x}),null!=t.y&&_.push({node:n,offset:t.y}))});var E=[];w.length>0&&E.push({type:"alignment",axis:"x",offsets:w}),_.length>0&&E.push({type:"alignment",axis:"y",offsets:_}),g.constraints(E)}g.groups(o.stdFilter(function(e){return e.isParent()}).map(function(e,t){return e._private.scratch.cola={index:t,leaves:e.children().stdFilter(function(e){return!e.isParent()}).map(function(e){return e[0]._private.scratch.cola.index})},e}).map(function(e){return e._private.scratch.cola.groups=e.children().stdFilter(function(e){return e.isParent()}).map(function(e){return e._private.scratch.cola.index}),e._private.scratch.cola}));var S,P;null!=i.edgeLength?(S=i.edgeLength,P="linkDistance"):null!=i.edgeSymDiffLength?(S=i.edgeSymDiffLength,P="symmetricDiffLinkLengths"):null!=i.edgeJaccardLength?(S=i.edgeJaccardLength,P="jaccardLinkLengths"):(S=100,P="linkDistance");var k=function(e){return e.calcLength};if(g.links(s.stdFilter(function(e){return!e.source().isParent()&&!e.target().isParent()}).map(function(e){var t=e._private.scratch.cola={source:e.source()[0]._private.scratch.cola.index,target:e.target()[0]._private.scratch.cola.index};return null!=S&&(t.calcLength=c(S,e)),t})),g.size([u.w,u.h]),null!=S&&g[P](k),i.flow){var C,D="y",N=50;e.is.string(i.flow)?C={axis:i.flow,minSeparation:N}:e.is.number(i.flow)?C={axis:D,minSeparation:i.flow}:e.is.plainObject(i.flow)?(C=i.flow,C.axis=C.axis||D,C.minSeparation=null!=C.minSeparation?C.minSeparation:N):C={axis:D,minSeparation:N},g.flowLayout(C.axis,C.minSeparation)}g.avoidOverlaps(i.avoidOverlap).handleDisconnected(i.handleDisconnected).start(i.unconstrIter,i.userConstIter,i.allConstIter),t.trigger({type:"layoutstart",layout:t}),i.infinite||setTimeout(function(){g.stop()},i.maxSimulationTime)}),this},t.prototype.stop=function(){return this.adaptor&&(this.manuallyStopped=!0,this.adaptor.stop()),this},e("layout","cola",t)}(cytoscape),function(e){"use strict";function t(t){this.options=e.util.extend({},i,t)}var i={fit:!0,padding:30,startAngle:1.5*Math.PI,counterclockwise:!1,minNodeSpacing:10,boundingBox:void 0,avoidOverlap:!0,height:void 0,width:void 0,concentric:function(){return this.degree()},levelWidth:function(e){return e.maxDegree()/4},animate:!1,animationDuration:500,ready:void 0,stop:void 0};t.prototype.run=function(){for(var t=this.options,i=t,r=t.cy,n=i.eles,a=n.nodes().not(":parent"),o=e.util.makeBoundingBox(i.boundingBox?i.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()}),s={x:o.x1+o.w/2,y:o.y1+o.h/2},l=[],u=i.startAngle,c=0,d=0;d0){var m=Math.abs(g[0].value-y.value);m>=v&&(g=[],f.push(g))}g.push(y)}var x={},b=0,w=c+i.minNodeSpacing;if(!i.avoidOverlap){var _=f.length>0&&f[0].length>1,E=Math.min(o.w,o.h)/2-w,S=E/(f.length+_?1:0);w=Math.min(w,S)}for(var d=0;d1&&i.avoidOverlap){var C=Math.cos(k)-Math.cos(0),D=Math.sin(k)-Math.sin(0),N=Math.sqrt(w*w/(C*C+D*D));b=Math.max(N,b)}for(var T=0;T=d;){var g=c[d++],y=s.idToIndex[g],m=s.layoutNodes[y],x=m.children;if(x.length>0){s.graphSet.push(x);for(var l=0;lr.count?0:r.graph},o=function(e,t,i,r){var n=r.graphSet[i];if(-1<$.inArray(e,n)&&-1<$.inArray(t,n))return{count:2,graph:i};for(var a=0,s=0;ss;s++)for(var l=e.layoutNodes[e.idToIndex[a[s]]],u=s+1;o>u;u++){var c=e.layoutNodes[e.idToIndex[a[u]]];p(l,c,e,t,i)}}},p=function(e,t,i,r,n){var a="Node repulsion. Node1: "+e.id+" Node2: "+t.id,o=t.positionX-e.positionX,s=t.positionY-e.positionY;if(a+="\ndirectionX: "+o+", directionY: "+s,0===o&&0===s)return void(a+="\nNodes have the same position.");var l=v(e,t,o,s);if(l>0){a+="\nNodes DO overlap.",a+="\nOverlap: "+l;var u=n.nodeOverlap*l,c=Math.sqrt(o*o+s*s);a+="\nDistance: "+c;var d=u*o/c,p=u*s/c}else{a+="\nNodes do NOT overlap.";var f=h(e,o,s),g=h(t,-1*o,-1*s),y=g.x-f.x,m=g.y-f.y,x=y*y+m*m,c=Math.sqrt(x);a+="\nDistance: "+c;var u=n.nodeRepulsion/x,d=u*y/c,p=u*m/c}e.offsetX-=d,e.offsetY-=p,t.offsetX+=d,t.offsetY+=p,a+="\nForceX: "+d+" ForceY: "+p,w(a)},h=function(e,t,i){var r=e.positionX,n=e.positionY,a=e.height,o=e.width,s=i/t,l=a/o,u="Computing clipping point of node "+e.id+" . Height: "+a+", Width: "+o+"\nDirection "+t+", "+i,c={};do{if(0===t&&i>0){c.x=r,u+="\nUp direction",c.y=n+a/2;break}if(0===t&&0>i){c.x=r,c.y=n+a/2,u+="\nDown direction";break}if(t>0&&s>=-1*l&&l>=s){c.x=r+o/2,c.y=n+o*i/2/t,u+="\nRightborder";break}if(0>t&&s>=-1*l&&l>=s){c.x=r-o/2,c.y=n-o*i/2/t,u+="\nLeftborder";break}if(i>0&&(-1*l>=s||s>=l)){c.x=r+a*t/2/i,c.y=n+a/2,u+="\nTop border";break}if(0>i&&(-1*l>=s||s>=l)){c.x=r-a*t/2/i,c.y=n-a/2,u+="\nBottom border";break}}while(!1);return u+="\nClipping point found at "+c.x+", "+c.y,w(u),c},v=function(e,t,i,r){if(i>0)var n=e.maxX-t.minX;else var n=t.maxX-e.minX;if(r>0)var a=e.maxY-t.minY;else var a=t.maxY-e.minY;return n>=0&&a>=0?Math.sqrt(n*n+a*a):0},f=function(e,t,i){for(var r=0;rd;d++){var p=e.layoutNodes[e.idToIndex[a[d]]];r="Node: "+p.id;var h=s-p.positionX,v=l-p.positionY,f=Math.sqrt(h*h+v*v);if(f>1){var g=i.gravity*h/f,y=i.gravity*v/f;p.offsetX+=g,p.offsetY+=y,r+=": Applied force: "+g+", "+y}else r+=": skypped since it's too close to center";w(r)}}},y=function(e){var t=[],i=0,r=-1;for(w("propagateForces"),t.push.apply(t,e.graphSet[0]),r+=e.graphSet[0].length;r>=i;){var n=t[i++],a=e.idToIndex[n],o=e.layoutNodes[a],s=o.children;if(0i)var a={x:i*e/n,y:i*t/n};else var a={x:e,y:t};return r+=".\nResult: ("+a.x+", "+a.y+")",w(r),a},b=function(e,t){var i="Propagating new position/size of node "+e.id,r=e.parentId;if(null==r)return i+=". No parent node.",void w(i);var n=t.layoutNodes[t.idToIndex[r]],a=!1;return(null==n.maxX||e.maxX+n.padRight>n.maxX)&&(n.maxX=e.maxX+n.padRight,a=!0,i+="\nNew maxX for parent node "+n.id+": "+n.maxX),(null==n.minX||e.minX-n.padLeftn.maxY)&&(n.maxY=e.maxY+n.padBottom,a=!0,i+="\nNew maxY for parent node "+n.id+": "+n.maxY),(null==n.minY||e.minY-n.padTops){var h=d(),v=p();(h-1)*v>=s?d(h-1):(v-1)*h>=s&&p(v-1)}else for(;s>c*u;){var h=d(),v=p();(v+1)*h>=s?p(v+1):d(h+1)}var f=o.w/c,g=o.h/u;if(i.avoidOverlap)for(var y=0;y=c&&(P=0,S++)},C={},y=0;y0&&r.animate&&(s=!0,m.rtrigger("position"),r.fit&&l.fit(r.padding),m=l.collection(),s=!1)},function(){},function(e,i){var n=g(i),a=e.data.element;a.locked()||a.grabbed()||(a._private.position={x:n.x,y:n.y},m.merge(a)),b==x&&(t.one("layoutready",r.ready),t.trigger({type:"layoutready",layout:t})),b++});c.each(function(e,t){r.random||a(t)});var _;c.on("position",_=function(){s||a(this)});var E=c.filter(":grabbable");i.stopSystem=function(){h.filterNodes(function(){return!1}),r.ungrabifyWhileSimulating&&E.grabify(),r.fit&&l.fit(r.padding),c.off("drag position",_),t.one("layoutstop",r.stop),t.trigger({type:"layoutstop",layout:t}),i.stopSystem=null},o(),r.infinite||setTimeout(function(){i.stop()},r.maxSimulationTime)}),this},t.prototype.stop=function(){return null!=this.stopSystem&&this.stopSystem(),this},e("layout","springy",t)}(cytoscape),function(e){"use strict";function t(e){this.options=e}t.prototype.recalculateRenderedStyle=function(){},t.prototype.notify=function(){},e("renderer","null",t)}(cytoscape); \ No newline at end of file diff --git a/flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/index.html b/flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/index.html deleted file mode 100644 index a79d759..0000000 --- a/flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/index.html +++ /dev/null @@ -1,66 +0,0 @@ - - -
-
-
- Status:   -
- -
- - - - -
- -
-
- - - - - - - - - - - - - - - - - - - - - -
Nothing selected
-
-
-
- - - - - - diff --git a/flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/menu.png b/flexiblepower.ui.connectionspage/res/widgets/ConnectionsPage/menu.png deleted file mode 100644 index 9195b5eb80683e057a202e0748e4507f23999bea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1795 zcmV+e2mJVnP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000JZNklvPIB5Hz9?rjR;z7BdlPt#TE+|DOXk@phY?(BBW7cA;d?KGRPLeO1CjK%iS1>qnt0#fe?J)5%3d8(qK$`LD>rA zZd~a~kmj1z856#mjW0g}AAEqVBBZ;hYz1;RX$c=2NUmysMK_@1^1jz4z z1zh*L7Knk(5t*%SQtDU3^PZLx~;kdTM&ZW2?1MJxI<39q_7EaG7O5xp(|`` zY+Qxoe}H=dJiooTxcIi$XK;8Xm$%T{8hYw2g-wB@vm6%?%nh`HLLiO@p&)R55xUu| zEs)A87cqSyg>8Vtf7&4GK#+eaIXD`!$$O-*DG26)2&6Hvvomy)_efzA;P`DHNDEF7 z{NS@ng%rlZ!A=Ad;D*II;EIjQ)31O^H^KOERoNc{DU1cqmouzq$;pj3UbRnWc^%|*;ncCprw#B;&MFNDA#Fi9 z7C8L3FwDSIz#a~aIbB--2q4>Y0NX}xH$|l!*B_ZQr6An`b+dq)0wZeT!$S!ltl}Nu zb#DdR9Sh(KlctK~h%XDMDd@953!@z2xhbiFwqyqv0rcBXgYAc+061z3qvSeJK?e%` zpLqLi;Q*)Xdr(l_x&VQZf4yNYhTz2axPBbiz_ zL5;kp?2dsHwgJuV8x>qEsGSd#-Jy}fwxn-{e|&Hj)Ha_N(x3qD;@Kb@pH)a<6X5s) z`c>folJ9i{#_=Hm!QBYYI0!+e))Fj;QNKTs!dN)a!0E6nyz9>ks^DORV9WLhZlaK0 zR(gFSg|Q$29$f{evt8jPK(Fj9;6Cjuoj#GmSWt^R7uZf6ZtW~|s}4XvS2}$mg-u~W zw5fdyy99zQD}?Q?_REmMI_L}?R?oVEV83(0C!mEKvY?et7o@NbHg~`y>T5$31Xh}y z!4)=Kkl$U<>+Z1>R^dkePJO=$zA9l`b_vKo4ry@D(+3n@o zj!_j-SO%Qna&l^)%OU?m8zk;u!!KJ1c@%J0I(r`Ds}vGWYmotWR+5bcT;DXtYrn!C z0_2+wzIao-f!`3kC7WKu=h}6J6uN;<@uAWil603R1%4TE< zc4apft^lgG-?I;;L9_o05GZkR5)70w clazz) { - Bundle bundle = FrameworkUtil.getBundle(clazz); - Enumeration entries = bundle.findEntries("img", "appliance.png", true); - if (entries.hasMoreElements()) { - return entries.nextElement(); - } else { - return null; - } - } - - private final URL defaultImage; - - public ConnectionsImageServlet() { - defaultImage = findImage(getClass()); - } - - private BundleContext context; - - @Activate - public void activate(BundleContext context) { - this.context = context; - } - - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - if (req.getPathInfo() != null && req.getPathInfo().endsWith(".png")) { - try { - Collection> references; - String id = req.getPathInfo().substring(0, req.getPathInfo().length() - 4); - references = context.getServiceReferences(ResourceDriver.class, "(applianceid=" + id + ")"); - if (!references.isEmpty()) { - ResourceDriver resourceDriver = context.getService(references.iterator().next()); - - URL image = findImage(resourceDriver.getClass()); - if (image == null) { - image = defaultImage; - } - - writeImage(image, resp); - return; - } - } catch (InvalidSyntaxException e) { - } - } - - resp.sendError(404); - } - - private void writeImage(URL image, HttpServletResponse resp) throws IOException { - resp.setContentType("image/png"); - InputStream is = image.openStream(); - OutputStream os = resp.getOutputStream(); - - try { - byte[] buffer = new byte[16 * 1024]; - int read = 0; - while ((read = is.read(buffer)) >= 0) { - os.write(buffer, 0, read); - } - } finally { - os.close(); - is.close(); - } - } -} diff --git a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionsPage.java b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionsPage.java deleted file mode 100644 index badd4b9..0000000 --- a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionsPage.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.flexiblepower.runtime.ui.connectionspage; - -import java.util.Locale; - -import org.flexiblepower.ui.Widget; - -import aQute.bnd.annotation.component.Component; - -@Component(properties = { "widget.type=full", "widget.name=connectionspage" }) -public class ConnectionsPage implements Widget { - @Override - public String getTitle(Locale locale) { - return "Connections"; - } -} From 60b09e9ab04bdd5c898c077171a58e0866b20bfd Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 28 Apr 2015 10:20:57 +0200 Subject: [PATCH 084/105] Made sure that incomplete calls to (dis)connect are ignored --- .../runtime/ui/connectionspage/ConnectionManagerPage.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerPage.java b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerPage.java index 9695745..c6637b7 100755 --- a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerPage.java +++ b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerPage.java @@ -318,6 +318,10 @@ public String getTargetPort() { } public boolean connect(ConnectionInfo info) { + if (info.getSourceEndpoint() == null || info.getTargetEndpoint() == null) { + return false; + } + ManagedEndpoint sourceEndpoint = connectionManager.getEndpoint(info.getSourceEndpoint()); ManagedEndpoint targetEndpoint = connectionManager.getEndpoint(info.getTargetEndpoint()); @@ -338,6 +342,10 @@ public boolean connect(ConnectionInfo info) { } public boolean disconnect(ConnectionInfo info) { + if (info.getSourceEndpoint() == null || info.getTargetEndpoint() == null) { + return false; + } + ManagedEndpoint sourceEndpoint = connectionManager.getEndpoint(info.getSourceEndpoint()); ManagedEndpoint targetEndpoint = connectionManager.getEndpoint(info.getTargetEndpoint()); From 86c38b47e00c48310211c4d0644880dafbb0b510 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 28 Apr 2015 12:06:17 +0200 Subject: [PATCH 085/105] Refactored the connection page such that it also works in the Felix WebConsole --- flexiblepower.ui.connectionspage/bnd.bnd | 6 +- flexiblepower.ui.connectionspage/logback.xml | 2 +- .../jsplumb-1.7.5-min.js | 6 - .../dom.jsPlumb-1.7.5.js | 0 .../index.html | 39 +- .../menu.png | Bin .../script.js | 14 +- .../res/widgets/DashboardWidget/style.css | 113 ++++++ .../ui/connectionspage/BaseWidget.java | 76 ++++ .../ui/connectionspage/ConnectionInfo.java | 29 ++ .../ConnectionManagerPage.java | 373 ------------------ .../ConnectionManagerState.java | 146 +++++++ .../ui/connectionspage/ConnectionsPage.java | 86 ++++ .../ui/connectionspage/DashboardWidget.java | 18 + .../ui/connectionspage/EndpointState.java | 88 +++++ .../ui/connectionspage/FelixPlugin.java | 97 +++++ .../runtime/ui/connectionspage/PortState.java | 40 ++ 17 files changed, 736 insertions(+), 397 deletions(-) delete mode 100755 flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/jsplumb-1.7.5-min.js rename flexiblepower.ui.connectionspage/res/widgets/{ConnectionManagerPage => DashboardWidget}/dom.jsPlumb-1.7.5.js (100%) rename flexiblepower.ui.connectionspage/res/widgets/{ConnectionManagerPage => DashboardWidget}/index.html (76%) rename flexiblepower.ui.connectionspage/res/widgets/{ConnectionManagerPage => DashboardWidget}/menu.png (100%) rename flexiblepower.ui.connectionspage/res/widgets/{ConnectionManagerPage => DashboardWidget}/script.js (94%) create mode 100755 flexiblepower.ui.connectionspage/res/widgets/DashboardWidget/style.css create mode 100755 flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/BaseWidget.java create mode 100755 flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionInfo.java delete mode 100755 flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerPage.java create mode 100755 flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerState.java create mode 100755 flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionsPage.java create mode 100755 flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/DashboardWidget.java create mode 100755 flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/EndpointState.java create mode 100755 flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/FelixPlugin.java create mode 100755 flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/PortState.java diff --git a/flexiblepower.ui.connectionspage/bnd.bnd b/flexiblepower.ui.connectionspage/bnd.bnd index 78ad6c4..1f1e981 100644 --- a/flexiblepower.ui.connectionspage/bnd.bnd +++ b/flexiblepower.ui.connectionspage/bnd.bnd @@ -1,5 +1,7 @@ -buildpath: ${default-buildpath},\ org.apache.felix.http.servlet-api,\ + org.apache.felix.webconsole,\ + com.google.gson,\ flexiblepower.ral;version=latest,\ flexiblepower.runtime;version=latest,\ flexiblepower.ui;version=latest @@ -7,5 +9,7 @@ Bundle-Version: 1.0.0.${qualifier} Private-Package: org.flexiblepower.runtime.ui.connectionspage Service-Component: org.flexiblepower.runtime.ui.connectionspage.* -Import-Package: \ +Import-Package: \ + org.apache.felix.webconsole;resolution:=optional,\ + org.flexiblepower.ui;resolution:=optional,\ * diff --git a/flexiblepower.ui.connectionspage/logback.xml b/flexiblepower.ui.connectionspage/logback.xml index 6102746..7c18049 100755 --- a/flexiblepower.ui.connectionspage/logback.xml +++ b/flexiblepower.ui.connectionspage/logback.xml @@ -6,7 +6,7 @@ - + diff --git a/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/jsplumb-1.7.5-min.js b/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/jsplumb-1.7.5-min.js deleted file mode 100755 index 852dc59..0000000 --- a/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/jsplumb-1.7.5-min.js +++ /dev/null @@ -1,6 +0,0 @@ -(function(){"undefined"==typeof Math.sgn&&(Math.sgn=function(a){return 0==a?0:a>0?1:-1});var a={subtract:function(a,b){return{x:a.x-b.x,y:a.y-b.y}},dotProduct:function(a,b){return a.x*b.x+a.y*b.y},square:function(a){return Math.sqrt(a.x*a.x+a.y*a.y)},scale:function(a,b){return{x:a.x*b,y:a.y*b}}},b=64,c=Math.pow(2,-b-1),d=function(b,c){for(var d=[],e=f(b,c),h=c.length-1,i=2*h-1,j=g(e,i,d,0),k=a.subtract(b,c[0]),m=a.square(k),n=0,o=0;j>o;o++){k=a.subtract(b,l(c,h,d[o],null,null));var p=a.square(k);m>p&&(m=p,n=d[o])}return k=a.subtract(b,c[h]),p=a.square(k),m>p&&(m=p,n=1),{location:n,distance:m}},e=function(a,b){var c=d(a,b);return{point:l(b,b.length-1,c.location,null,null),location:c.location}},f=function(b,c){for(var d=c.length-1,e=2*d-1,f=[],g=[],h=[],i=[],k=[[1,.6,.3,.1],[.4,.6,.6,.4],[.1,.3,.6,1]],l=0;d>=l;l++)f[l]=a.subtract(c[l],b);for(var l=0;d-1>=l;l++)g[l]=a.subtract(c[l+1],c[l]),g[l]=a.scale(g[l],3);for(var m=0;d-1>=m;m++)for(var n=0;d>=n;n++)h[m]||(h[m]=[]),h[m][n]=a.dotProduct(g[m],f[n]);for(l=0;e>=l;l++)i[l]||(i[l]=[]),i[l].y=0,i[l].x=parseFloat(l)/e;for(var o=d,p=d-1,q=0;o+p>=q;q++){var r=Math.max(0,q-p),s=Math.min(q,o);for(l=r;s>=l;l++)j=q-l,i[l+j].y+=h[j][l]*k[j][l]}return i},g=function(a,c,d,e){var f,j,m=[],n=[],o=[],p=[];switch(h(a,c)){case 0:return 0;case 1:if(e>=b)return d[0]=(a[0].x+a[c].x)/2,1;if(i(a,c))return d[0]=k(a,c),1}l(a,c,.5,m,n),f=g(m,c,o,e+1),j=g(n,c,p,e+1);for(var q=0;f>q;q++)d[q]=o[q];for(var q=0;j>q;q++)d[q+f]=p[q];return f+j},h=function(a,b){var c,d,e=0;c=d=Math.sgn(a[0].y);for(var f=1;b>=f;f++)c=Math.sgn(a[f].y),c!=d&&e++,d=c;return e},i=function(a,b){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s;i=a[0].y-a[b].y,j=a[b].x-a[0].x,k=a[0].x*a[b].y-a[b].x*a[0].y;for(var t=max_distance_below=0,u=1;b>u;u++){var v=i*a[u].x+j*a[u].y+k;v>t?t=v:max_distance_below>v&&(max_distance_below=v)}return n=0,o=1,p=0,q=i,r=j,s=k-t,l=n*r-q*o,m=1/l,e=(o*s-r*p)*m,q=i,r=j,s=k-max_distance_below,l=n*r-q*o,m=1/l,f=(o*s-r*p)*m,g=Math.min(e,f),h=Math.max(e,f),d=h-g,c>d?1:0},k=function(a,b){var c=1,d=0,e=a[b].x-a[0].x,f=a[b].y-a[0].y,g=a[0].x-0,h=a[0].y-0,i=e*d-f*c,j=1/i,k=(e*h-f*g)*j;return 0+c*k},l=function(a,b,c,d,e){for(var f=[[]],g=0;b>=g;g++)f[0][g]=a[g];for(var h=1;b>=h;h++)for(var g=0;b-h>=g;g++)f[h]||(f[h]=[]),f[h][g]||(f[h][g]={}),f[h][g].x=(1-c)*f[h-1][g].x+c*f[h-1][g+1].x,f[h][g].y=(1-c)*f[h-1][g].y+c*f[h-1][g+1].y;if(null!=d)for(g=0;b>=g;g++)d[g]=f[g][0];if(null!=e)for(g=0;b>=g;g++)e[g]=f[b-g][g];return f[b][0]},m={},n=function(a){var b=m[a];if(!b){b=[];var c=function(){return function(b){return Math.pow(b,a)}},d=function(){return function(b){return Math.pow(1-b,a)}},e=function(a){return function(){return a}},f=function(){return function(a){return a}},g=function(){return function(a){return 1-a}},h=function(a){return function(b){for(var c=1,d=0;di;i++){for(var j=[new e(a)],k=0;a-i>k;k++)j.push(new f);for(var k=0;i>k;k++)j.push(new g);b.push(new h(j))}b.push(new d),m[a]=b}return b},o=function(a,b){for(var c=n(a.length-1),d=0,e=0,f=0;f0?1:-1,h=null;ed;)d+=.005*e,f=o(a,d),c+=p(f,b),b=f;return c},t=function(a,b,c){return r(a,b,c).point},u=function(a,b,c){return r(a,b,c).location},v=function(a,b){var c=o(a,b),d=o(a.slice(0,a.length-1),b),e=d.y-c.y,f=d.x-c.x;return 0==e?1/0:Math.atan(e/f)},w=function(a,b,c){var d=r(a,b,c);return d.location>1&&(d.location=1),d.location<0&&(d.location=0),v(a,d.location)},x=function(a,b,c,d){d=null==d?0:d;var e=r(a,b,d),f=v(a,e.location),g=Math.atan(-1/f),h=c/2*Math.sin(g),i=c/2*Math.cos(g);return[{x:e.point.x+i,y:e.point.y+h},{x:e.point.x-i,y:e.point.y-h}]};this.jsBezier={distanceFromCurve:d,gradientAtPoint:v,gradientAtPointAlongCurveFrom:w,nearestPointOnCurve:e,pointOnCurve:o,pointAlongCurveFrom:t,perpendicularToCurveAt:x,locationAlongCurveFrom:u,getLength:s}}).call(this),function(){"use strict";var a=this.Biltong={},b=function(a){return"[object Array]"===Object.prototype.toString.call(a)},c=function(a,c,d){return a=b(a)?a:[a.x,a.y],c=b(c)?c:[c.x,c.y],d(a,c)},d=a.gradient=function(a,b){return c(a,b,function(a,b){return b[0]==a[0]?b[1]>a[1]?1/0:-1/0:b[1]==a[1]?b[0]>a[0]?0:-0:(b[1]-a[1])/(b[0]-a[0])})},e=(a.normal=function(a,b){return-1/d(a,b)},a.lineLength=function(a,b){return c(a,b,function(a,b){return Math.sqrt(Math.pow(b[1]-a[1],2)+Math.pow(b[0]-a[0],2))})},a.quadrant=function(a,b){return c(a,b,function(a,b){return b[0]>a[0]?b[1]>a[1]?2:1:b[0]==a[0]?b[1]>a[1]?2:1:b[1]>a[1]?3:4})}),f=(a.theta=function(a,b){return c(a,b,function(a,b){var c=d(a,b),f=Math.atan(c),g=e(a,b);return(4==g||3==g)&&(f+=Math.PI),0>f&&(f+=2*Math.PI),f})},a.intersects=function(a,b){var c=a.x,d=a.x+a.w,e=a.y,f=a.y+a.h,g=b.x,h=b.x+b.w,i=b.y,j=b.y+b.h;return g>=c&&d>=g&&i>=e&&f>=i||h>=c&&d>=h&&i>=e&&f>=i||g>=c&&d>=g&&j>=e&&f>=j||h>=c&&d>=g&&j>=e&&f>=j||c>=g&&h>=c&&e>=i&&j>=e||d>=g&&h>=d&&e>=i&&j>=e||c>=g&&h>=c&&f>=i&&j>=f||d>=g&&h>=c&&f>=i&&j>=f},a.encloses=function(a,b,c){var d=a.x,e=a.x+a.w,f=a.y,g=a.y+a.h,h=b.x,i=b.x+b.w,j=b.y,k=b.y+b.h,l=function(a,b,d,e){return c?b>=a&&d>=e:b>a&&d>e};return l(d,h,e,i)&&l(f,j,g,k)},[null,[1,-1],[1,1],[-1,1],[-1,-1]]),g=[null,[-1,-1],[-1,1],[1,1],[1,-1]];a.pointOnLine=function(a,b,c){var h=d(a,b),i=e(a,b),j=c>0?f[i]:g[i],k=Math.atan(h),l=Math.abs(c*Math.sin(k))*j[1],m=Math.abs(c*Math.cos(k))*j[0];return{x:a.x+m,y:a.y+l}},a.perpendicularLineTo=function(a,b,c){var e=d(a,b),f=Math.atan(-1/e),g=c/2*Math.sin(f),h=c/2*Math.cos(f);return[{x:b.x+h,y:b.y+g},{x:b.x-h,y:b.y-g}]}}.call(this),function(){"use strict";var a={android:navigator.userAgent.toLowerCase().indexOf("android")>-1},b=function(a,b,c){c=c||a.parentNode;for(var d=c.querySelectorAll(b),e=0;ec&&a[c]!=b;c++);c-1&&9>t,v=function(a,b){if(null==a)return[0,0];var c=A(a),d=z(c,0);return[d[b+"X"],d[b+"Y"]]},w=function(a){return null==a?[0,0]:u?[a.clientX+document.documentElement.scrollLeft,a.clientY+document.documentElement.scrollTop]:v(a,"page")},x=function(a){return v(a,"screen")},y=function(a){return v(a,"client")},z=function(a,b){return a.item?a.item(b):a[b]},A=function(a){return a.touches&&a.touches.length>0?a.touches:a.changedTouches&&a.changedTouches.length>0?a.changedTouches:a.targetTouches&&a.targetTouches.length>0?a.targetTouches:[a]},B=function(a){return A(a).length},C=function(a,b,c,d){if(g(a,b,c),d.__tauid=c.__tauid,a.addEventListener)a.addEventListener(b,c,!1);else if(a.attachEvent){var e=b+c.__tauid;a["e"+e]=c,a[e]=function(){a["e"+e]&&a["e"+e](window.event)},a.attachEvent("on"+b,a[e])}},D=function(a,b,d){null!=d&&E(a,function(){var e=c(this);if(h(e,b,d),null!=d.__tauid)if(e.removeEventListener)e.removeEventListener(b,d,!1),q&&s[b]&&e.removeEventListener(s[b],d,!1);else if(this.detachEvent){var f=b+d.__tauid;e[f]&&e.detachEvent("on"+b,e[f]),e[f]=null,e["e"+f]=null}d.__taTouchProxy&&D(a,d.__taTouchProxy[1],d.__taTouchProxy[0])})},E=function(a,b){if(null!=a){a="undefined"!=typeof Window&&"unknown"!=typeof a.top&&a==a.top?[a]:"string"!=typeof a&&null==a.tagName&&null!=a.length?a:"string"==typeof a?document.querySelectorAll(a):[a];for(var c=0;c-1&&9>c,g=function(a){if(f)return[a.clientX+document.documentElement.scrollLeft,a.clientY+document.documentElement.scrollTop];var b=i(a),c=h(b,0);return[c.pageX,c.pageY]},h=function(a,b){return a.item?a.item(b):a[b]},i=function(a){return a.touches&&a.touches.length>0?a.touches:a.changedTouches&&a.changedTouches.length>0?a.changedTouches:a.targetTouches&&a.targetTouches.length>0?a.targetTouches:[a]},j={draggable:"katavorio-draggable",droppable:"katavorio-droppable",drag:"katavorio-drag",selected:"katavorio-drag-selected",active:"katavorio-drag-active",hover:"katavorio-drag-hover",noSelect:"katavorio-drag-no-select"},k="katavorio-drag-scope",l=["stop","start","drag","drop","over","out"],m=function(){},n=function(){return!0},o=function(a,b,c){for(var d=0;d1)for(var f=0;f0},g=(this.getMatchingDroppables=function(a){for(var b=[],c={},d=0;d=f.length,i=function(){return e[g[1]]||function(){return e[g[1]]=[],e[g[1]]}()};if(h)g?i()[g[3]]=c:e[a]=c;else if(g){var j=i();e=j[g[3]]||function(){return j[g[3]]={},j[g[3]]}()}else e=e[a]||function(){return e[a]={},e[a]}()}),a}},functionChain:function(a,b,c){for(var d=0;d-1&&a.splice(c,1),-1!=c},remove:function(a,b){var c=k.indexOf(a,b);return c>-1&&a.splice(c,1),-1!=c},addWithFunction:function(a,b,c){-1==k.findWithFunction(a,c)&&a.push(b)},addToList:function(a,b,c,d){var e=a[b];return null==e&&(e=[],a[b]=e),e[d?"unshift":"push"](c),e},extend:function(b,c){var d;for(c=a(c)?c:[c],d=0;d2)for(d=2;dh&&j!==!1;){if(c[d])a[d][h].apply(this,[e,f]);else try{j=a[d][h].apply(this,[e,f])}catch(l){k.log("jsPlumb: fire failed for event "+d+" : "+l)}h++,(null==a||null==a[d])&&(i=!0)}}return this},this.unbind=function(b){return b?delete a[b]:a={},this},this.getListener=function(b){return a[b]},this.setSuspendEvents=function(a){b=a},this.isSuspendEvents=function(){return b},this.cleanupListeners=function(){for(var b in a)a[b]=null}},k.EventGenerator.prototype={cleanup:function(){this.cleanupListeners()}},Function.prototype.bind||(Function.prototype.bind=function(a){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var b=Array.prototype.slice.call(arguments,1),c=this,d=function(){},e=function(){return c.apply(this instanceof d&&a?this:a,b.concat(Array.prototype.slice.call(arguments)))};return d.prototype=this.prototype,e.prototype=new d,e})}.call(this),function(){"use strict";var a=this,b=a.jsPlumbUtil;b.ieVersion=/MSIE\s([\d.]+)/.test(navigator.userAgent)?new Number(RegExp.$1):-1,b.oldIE=b.ieVersion>-1&&b.ieVersion<9,b.matchesSelector=function(a,b,c){c=c||a.parentNode;for(var d=c.querySelectorAll(b),e=0;ef;f++)d&&d==e[f]||e[f].setHover(b,!0,c)},i=function(a){return null==a?null:a.split(" ")},j=function(a,b,c){for(var d in b)a[d]=c},k=function(a,b,c){if(a.getDefaultType){var e=a.getTypeDescriptor(),f={},g=a.getDefaultType(),h=d.merge({},g);j(f,g,"__default");for(var i=0,k=a._jsPlumb.types.length;k>i;i++){var l=a._jsPlumb.types[i]; -if("__default"!==l){var m=a._jsPlumb.instance.getType(l,e);null!=m&&(h=d.merge(h,m,["cssClass"]),j(f,m,l))}}b&&(h=d.populate(h,b)),a.applyType(h,c,f),c||a.repaint()}},l=window.jsPlumbUIComponent=function(a){jsPlumbUtil.EventGenerator.apply(this,arguments);var b=this,c=arguments,e=b.idPrefix,f=e+(new Date).getTime();this._jsPlumb={instance:a._jsPlumb,parameters:a.parameters||{},paintStyle:null,hoverPaintStyle:null,paintStyleInUse:null,hover:!1,beforeDetach:a.beforeDetach,beforeDrop:a.beforeDrop,overlayPlacements:[],hoverClass:a.hoverClass||a._jsPlumb.Defaults.HoverClass,types:[],typeCache:{}},this.cacheTypeItem=function(a,b,c){this._jsPlumb.typeCache[c]=this._jsPlumb.typeCache[c]||{},this._jsPlumb.typeCache[c][a]=b},this.getCachedTypeItem=function(a,b){return this._jsPlumb.typeCache[b]?this._jsPlumb.typeCache[b][a]:null},this.getId=function(){return f};var g=a.overlays||[],h={};if(this.defaultOverlayKeys){for(var i=0;if;f++)this.hasType(d[f])||(this._jsPlumb.types.push(d[f]),e=!0);e&&k(this,b,c)}},removeType:function(a,b){var c=i(a),e=!1,f=function(a){var b=d.indexOf(this._jsPlumb.types,a);return-1!=b?(m(this,b),this._jsPlumb.types.splice(b,1),!0):!1}.bind(this);if(null!=c){for(var g=0,h=c.length;h>g;g++)e=f(c[g])||e;e&&k(this,null,b)}},clearTypes:function(a){for(var b=this._jsPlumb.types.length,c=0;b>c;c++)m(this,0),this._jsPlumb.types.splice(0,1);k(this,{},a)},toggleType:function(a,b,c){var d=i(a);if(null!=d){for(var e=0,f=d.length;f>e;e++){var g=jsPlumbUtil.indexOf(this._jsPlumb.types,d[e]);-1!=g?(m(this,g),this._jsPlumb.types.splice(g,1)):this._jsPlumb.types.push(d[e])}k(this,b,c)}},applyType:function(a,b){if(this.setPaintStyle(a.paintStyle,b),this.setHoverPaintStyle(a.hoverPaintStyle,b),a.parameters)for(var c in a.parameters)this.setParameter(c,a.parameters[c]);this._jsPlumb.paintStyleInUse=this.getPaintStyle()},setPaintStyle:function(a,b){this._jsPlumb.paintStyle=a,this._jsPlumb.paintStyleInUse=this._jsPlumb.paintStyle,f(this),b||this.repaint()},getPaintStyle:function(){return this._jsPlumb.paintStyle},setHoverPaintStyle:function(a,b){this._jsPlumb.hoverPaintStyle=a,f(this),b||this.repaint()},getHoverPaintStyle:function(){return this._jsPlumb.hoverPaintStyle},destroy:function(a){(a||null==this.typeId)&&(this.cleanupListeners(),this.clone=null,this._jsPlumb=null)},isHover:function(){return this._jsPlumb.hover},setHover:function(a,b,c){if(this._jsPlumb&&!this._jsPlumb.instance.currentlyDragging&&!this._jsPlumb.instance.isHoverSuspended()){if(this._jsPlumb.hover=a,null!=this.canvas){if(null!=this._jsPlumb.instance.hoverClass){var d=a?"addClass":"removeClass";this._jsPlumb.instance[d](this.canvas,this._jsPlumb.instance.hoverClass)}null!=this._jsPlumb.hoverClass&&this._jsPlumb.instance[d](this.canvas,this._jsPlumb.hoverClass)}null!=this._jsPlumb.hoverPaintStyle&&(this._jsPlumb.paintStyleInUse=a?this._jsPlumb.hoverPaintStyle:this._jsPlumb.paintStyle,this._jsPlumb.instance.isSuspendDrawing()||(c=c||e(),this.repaint({timestamp:c,recalc:!1}))),this.getAttachedElements&&!b&&h(this,a,e(),this)}}});var n=0,o=function(){var a=n+1;return n++,a},p=window.jsPlumbInstance=function(b){this.Defaults={Anchor:"Bottom",Anchors:[null,null],ConnectionsDetachable:!0,ConnectionOverlays:[],Connector:"Bezier",Container:null,DoNotThrowErrors:!1,DragOptions:{},DropOptions:{},Endpoint:"Dot",EndpointOverlays:[],Endpoints:[null,null],EndpointStyle:{fillStyle:"#456"},EndpointStyles:[null,null],EndpointHoverStyle:null,EndpointHoverStyles:[null,null],HoverPaintStyle:null,LabelStyle:{color:"black"},LogEnabled:!1,Overlays:[],MaxConnections:1,PaintStyle:{lineWidth:4,strokeStyle:"#456"},ReattachConnections:!1,RenderMode:"svg",Scope:"jsPlumb_DefaultScope"},b&&q.extend(this.Defaults,b),this.logEnabled=this.Defaults.LogEnabled,this._connectionTypes={},this._endpointTypes={},jsPlumbUtil.EventGenerator.apply(this);var f=this,h=o(),i=f.bind,j={},k=1,m=function(a){if(null==a)return null;if(3==a.nodeType||8==a.nodeType)return{el:a,text:!0};var b=f.getDOMElement(a);return{el:b,id:jsPlumbUtil.isString(a)&&null==b?a:Z(b)}};this.getInstanceIndex=function(){return h},this.setZoom=function(a,b){return jsPlumbUtil.oldIE||(k=a,f.fire("zoom",k),b&&f.repaintEverything()),!jsPlumbUtil.oldIE},this.getZoom=function(){return k};for(var n in this.Defaults)j[n]=this.Defaults[n];var p,r=[];this.unbindContainer=function(){if(null!=p&&r.length>0)for(var a=0;a *",function(c){b(a,c)}),c(a,"._jsPlumb_endpoint, ._jsPlumb_endpoint > *, ._jsPlumb_endpoint svg *",function(c){b(a,c)}),c(a,"._jsPlumb_overlay, ._jsPlumb_overlay *",function(c){b(a,c)})},e=0;ei;i++)g=f.getDOMElement(a[i]),e=f.getAttribute(g,"id"),h.push(b.apply(f,[g,e]))}else c=f.getDOMElement(a),e=f.getId(c),h=b.apply(f,[c,e]);return h},M=function(a){return w[a]},N=function(a,b,c,e){if(!q.headless){var g=null==b?!1:b;if(g&&q.isDragSupported(a,f)&&!q.isAlreadyDraggable(a,f)){var h=c||f.Defaults.DragOptions;h=q.extend({},h);var i=q.dragEvents.drag,j=q.dragEvents.stop,k=q.dragEvents.start,l=f.getDOMElement(a),m=f.getDragManager().getDragAncestor(l),n={left:0,top:0},o=n,p=!1;qb(e,a),h[k]=d.wrap(h[k],function(){return o=null!=m?f.getOffset(m):n,f.setHoverSuspended(!0),f.select({source:a}).addClass(f.elementDraggingClass+" "+f.sourceElementDraggingClass,!0),f.select({target:a}).addClass(f.elementDraggingClass+" "+f.targetElementDraggingClass,!0),f.setConnectionBeingDragged(!0),h.canDrag?c.canDrag():void 0},!1),h[i]=d.wrap(h[i],function(){var b=f.getUIPosition(arguments,f.getZoom());b.left+=o.left,b.top+=o.top,K(a,b,null,!0),p&&f.addClass(a,"jsPlumb_dragged"),p=!0}),h[j]=d.wrap(h[j],function(){var b=[];b=1==arguments.length&&arguments[0].selection&&arguments[0].selection.length>0?arguments[0].selection:[[a,f.getUIPosition(arguments,f.getZoom(),!0)]];for(var c=function(a){K(a[0],a[1]),f.removeClass(a[0],"jsPlumb_dragged"),f.select({source:a[0]}).removeClass(f.elementDraggingClass+" "+f.sourceElementDraggingClass,!0),f.select({target:a[0]}).removeClass(f.elementDraggingClass+" "+f.targetElementDraggingClass,!0),f.getDragManager().dragEnded(a[0])},d=0;de;e++)c.overlays.push(c.sourceEndpoint.connectorOverlays[e])}!c["pointer-events"]&&c.sourceEndpoint&&c.sourceEndpoint.connectorPointerEvents&&(c["pointer-events"]=c.sourceEndpoint.connectorPointerEvents);var h=function(a,b){var c=q.extend({},a);for(var d in b)b[d]&&(c[d]=b[d]);return c},i=function(a,b,d){return f.addEndpoint(a,h(b,{anchor:c.anchors?c.anchors[d]:c.anchor,endpoint:c.endpoints?c.endpoints[d]:c.endpoint,paintStyle:c.endpointStyles?c.endpointStyles[d]:c.endpointStyle,hoverPaintStyle:c.endpointHoverStyles?c.endpointHoverStyles[d]:c.endpointHoverStyle}))},j=function(a,b,d){if(c[a]&&!c[a].endpoint&&!c[a+"Endpoint"]&&!c.newConnection){var e=Z(c[a]),f=d[e];if(f){if(!f.enabled)return!1;var g=null!=f.endpoint&&f.endpoint._jsPlumb?f.endpoint:i(c[a],f.def,b);if(g.isFull())return!1;c[a+"Endpoint"]=g,g._doNotDeleteOnDetach=!1,g._deleteOnDetach=!0,f.uniqueEndpoint&&(f.endpoint?g.finalEndpoint=f.endpoint:(f.endpoint=g,g._deleteOnDetach=!1,g._doNotDeleteOnDetach=!0))}}};return j("source",0,this.sourceEndpointDefinitions)!==!1&&j("target",1,this.targetEndpointDefinitions)!==!1?(c.sourceEndpoint&&c.targetEndpoint&&(O(c.sourceEndpoint,c.targetEndpoint)||(c=null)),c):void 0}.bind(f),Q=function(a){var b=f.Defaults.ConnectionType||f.getDefaultConnectionType();a._jsPlumb=f,a.newConnection=Q,a.newEndpoint=S,a.endpointsByUUID=w,a.endpointsByElement=v,a.finaliseConnection=R,a.id="con_"+I();var c=new b(a);return c.isDetachable()&&(c.endpoints[0].initDraggable(),c.endpoints[1].initDraggable()),c},R=f.finaliseConnection=function(a,b,c,d){if(b=b||{},a.suspendedEndpoint||u.push(a),a.endpoints[0].isTemporarySource=!1,(null==a.suspendedEndpoint||d)&&f.anchorManager.newConnection(a),K(a.source),!b.doNotFireConnectionEvent&&b.fireEvent!==!1){var e={connection:a,source:a.source,target:a.target,sourceId:a.sourceId,targetId:a.targetId,sourceEndpoint:a.endpoints[0],targetEndpoint:a.endpoints[1]};f.fire("connection",e,c)}},S=function(a,b){var c=f.Defaults.EndpointType||q.Endpoint,d=q.extend({},a);d._jsPlumb=f,d.newConnection=Q,d.newEndpoint=S,d.endpointsByUUID=w,d.endpointsByElement=v,d.fireDetachEvent=ab,d.elementId=b||Z(d.source);var e=new c(d);return e.id="ep_"+I(),qb(d.elementId,d.source),q.headless||f.getDragManager().endpointAdded(d.source,b),e},T=function(a,b,c){var d=v[a];if(d&&d.length)for(var e=0,f=d.length;f>e;e++){for(var g=0,h=d[e].connections.length;h>g;g++){var i=b(d[e].connections[g]);if(i)return}c&&c(d[e])}},U=function(a,b){return L(a,function(a,c){A[c]=b,this.isDragSupported(a)&&this.setElementDraggable(a,b)})},V=function(a,b,c){b="block"===b;var d=null;c&&(d=b?function(a){a.setVisible(!0,!0,!0)}:function(a){a.setVisible(!1,!0,!0)});var e=m(a);T(e.id,function(a){if(b&&c){var d=a.sourceId===e.id?1:0;a.endpoints[d].isVisible()&&a.setVisible(!0)}else a.setVisible(b)},d)},W=function(a){return L(a,function(a,b){var c=null==A[b]?!1:A[b];return c=!c,A[b]=c,this.setDraggable(a,c),c}.bind(this))},X=function(a,b){var c=null;b&&(c=function(a){var b=a.isVisible();a.setVisible(!b)}),T(a,function(a){var b=a.isVisible();a.setVisible(!b)},c)},Y=function(a){var b=y[a];return b?{o:b,s:C[a]}:rb({elId:a})},Z=function(a,b,c){if(jsPlumbUtil.isString(a))return a;if(null==a)return null;var d=f.getAttribute(a,"id");return d&&"undefined"!==d||(2==arguments.length&&void 0!==arguments[1]?d=b:(1==arguments.length||3==arguments.length&&!arguments[2])&&(d="jsPlumb_"+h+"_"+I()),c||f.setAttribute(a,"id",d)),d};this.setConnectionBeingDragged=function(a){B=a},this.isConnectionBeingDragged=function(){return B},this.connectorClass="_jsPlumb_connector",this.connectedClass="_jsPlumb_connected",this.hoverClass="_jsPlumb_hover",this.endpointClass="_jsPlumb_endpoint",this.endpointConnectedClass="_jsPlumb_endpoint_connected",this.endpointFullClass="_jsPlumb_endpoint_full",this.endpointDropAllowedClass="_jsPlumb_endpoint_drop_allowed",this.endpointDropForbiddenClass="_jsPlumb_endpoint_drop_forbidden",this.overlayClass="_jsPlumb_overlay",this.draggingClass="_jsPlumb_dragging",this.elementDraggingClass="_jsPlumb_element_dragging",this.sourceElementDraggingClass="_jsPlumb_source_element_dragging",this.targetElementDraggingClass="_jsPlumb_target_element_dragging",this.endpointAnchorClassPrefix="_jsPlumb_endpoint_anchor",this.hoverSourceClass="_jsPlumb_source_hover",this.hoverTargetClass="_jsPlumb_target_hover",this.dragSelectClass="_jsPlumb_drag_select",this.Anchors={},this.Connectors={svg:{},vml:{}},this.Endpoints={svg:{},vml:{}},this.Overlays={svg:{},vml:{}},this.ConnectorRenderers={},this.SVG="svg",this.VML="vml",this.addEndpoint=function(a,b,c){c=c||{};var e=q.extend({},c);q.extend(e,b),e.endpoint=e.endpoint||f.Defaults.Endpoint,e.paintStyle=e.paintStyle||f.Defaults.EndpointStyle;for(var g=[],h=d.isArray(a)||null!=a.length&&!d.isString(a)?a:[a],i=0,j=h.length;j>i;i++){e.source=f.getDOMElement(h[i]),ob(e.source);var k=Z(e.source),l=S(e,k),m=qb(k,e.source).info.o;d.addToList(v,k,l),D||l.paint({anchorLoc:l.anchor.compute({xy:[m.left,m.top],wh:C[k],element:l,timestamp:E}),timestamp:E}),g.push(l),l._doNotDeleteOnDetach=!0}return 1==g.length?g[0]:g},this.addEndpoints=function(a,b,c){for(var e=[],g=0,h=b.length;h>g;g++){var i=f.addEndpoint(a,b[g],c);d.isArray(i)?Array.prototype.push.apply(e,i):e.push(i)}return e},this.animate=function(a,b,c){if(!this.animationSupported)return!1;c=c||{};var e=f.getDOMElement(a),g=Z(e),h=q.animEvents.step,i=q.animEvents.complete;c[h]=d.wrap(c[h],function(){f.revalidate(g)}),c[i]=d.wrap(c[i],function(){f.revalidate(g)}),f.doAnimate(e,b,c)},this.checkCondition=function(a,b){var c=f.getListener(a),e=!0;if(c&&c.length>0)try{for(var g=0,h=c.length;h>g;g++)e=e&&c[g](b)}catch(i){d.log(f,"cannot check condition ["+a+"]"+i)}return e},this.connect=function(a,b){var c,d=P(a,b);if(d){if(null==d.source&&null==d.sourceEndpoint)return jsPlumbUtil.log("Cannot establish connection - source does not exist"),void 0;if(null==d.target&&null==d.targetEndpoint)return jsPlumbUtil.log("Cannot establish connection - target does not exist"),void 0;ob(d.source),c=Q(d),R(c,d)}return c};var $=[{el:"source",elId:"sourceId",epDefs:"sourceEndpointDefinitions"},{el:"target",elId:"targetId",epDefs:"targetEndpointDefinitions"}],_=function(a,b,c,d){var e,f,g,h=$[c],i=a[h.elId],j=(a[h.el],a.endpoints[c]),k={index:c,originalSourceId:0===c?i:a.sourceId,newSourceId:a.sourceId,originalTargetId:1==c?i:a.targetId,newTargetId:a.targetId,connection:a};if(b.constructor==q.Endpoint)e=b,e.addConnection(a);else if(f=Z(b),g=this[h.epDefs][f],f===a[h.elId])e=null;else if(g){if(!g.enabled)return;e=null!=g.endpoint&&g.endpoint._jsPlumb?g.endpoint:this.addEndpoint(b,g.def),g.uniqueEndpoint&&(g.endpoint=e),e._doNotDeleteOnDetach=!1,e._deleteOnDetach=!0,e.addConnection(a)}else e=a.makeEndpoint(0===c,b,f),e._doNotDeleteOnDetach=!1,e._deleteOnDetach=!0;return null!=e&&(j.detachFromConnection(a),a.endpoints[c]=e,a[h.el]=e.element,a[h.elId]=e.elementId,k[0===c?"newSourceId":"newTargetId"]=e.elementId,bb(k),d||a.repaint()),k}.bind(this);this.setSource=function(a,b,c){var d=_(a,b,0,c);this.anchorManager.sourceChanged(d.originalSourceId,d.newSourceId,a)},this.setTarget=function(a,b,c){var d=_(a,b,1,c);this.anchorManager.updateOtherEndpoint(d.originalSourceId,d.originalTargetId,d.newTargetId,a)},this.deleteEndpoint=function(a,b){var c="string"==typeof a?w[a]:a;return c&&f.deleteObject({endpoint:c,dontUpdateHover:b}),f},this.deleteEveryEndpoint=function(){var a=f.setSuspendDrawing(!0);for(var b in v){var c=v[b];if(c&&c.length)for(var d=0,e=c.length;e>d;d++)f.deleteEndpoint(c[d],!0)}return v={},x={},w={},f.anchorManager.reset(),f.getDragManager().reset(),a||f.setSuspendDrawing(!1),f};var ab=function(a,b,c){var d=f.Defaults.ConnectionType||f.getDefaultConnectionType(),e=a.constructor==d,g=e?{connection:a,source:a.source,target:a.target,sourceId:a.sourceId,targetId:a.targetId,sourceEndpoint:a.endpoints[0],targetEndpoint:a.endpoints[1]}:a;b&&f.fire("connectionDetached",g,c),f.anchorManager.connectionDetached(g)},bb=f.fireMoveEvent=function(a,b){f.fire("connectionMoved",a,b)};this.unregisterEndpoint=function(a){a._jsPlumb.uuid&&(w[a._jsPlumb.uuid]=null),f.anchorManager.deleteEndpoint(a);for(var b in v){var c=v[b];if(c){for(var d=[],e=0,g=c.length;g>e;e++)c[e]!=a&&d.push(c[e]);v[b]=d}v[b].length<1&&delete v[b]}},this.detach=function(){if(0!==arguments.length){var a=f.Defaults.ConnectionType||f.getDefaultConnectionType(),b=arguments[0].constructor==a,c=2==arguments.length?b?arguments[1]||{}:arguments[0]:arguments[0],d=c.fireEvent!==!1,e=c.forceDetach,g=b?arguments[0]:c.connection;if(g)(e||jsPlumbUtil.functionChain(!0,!1,[[g.endpoints[0],"isDetachAllowed",[g]],[g.endpoints[1],"isDetachAllowed",[g]],[g,"isDetachAllowed",[g]],[f,"checkCondition",["beforeDetach",g]]]))&&g.endpoints[0].detach(g,!1,!0,d);else{var h=q.extend({},c);if(h.uuids)M(h.uuids[0]).detachFrom(M(h.uuids[1]),d);else if(h.sourceEndpoint&&h.targetEndpoint)h.sourceEndpoint.detachFrom(h.targetEndpoint);else{var i=Z(f.getDOMElement(h.source)),j=Z(f.getDOMElement(h.target));T(i,function(a){(a.sourceId==i&&a.targetId==j||a.targetId==i&&a.sourceId==j)&&f.checkCondition("beforeDetach",a)&&a.endpoints[0].detach(a,!1,!0,d)})}}}},this.detachAllConnections=function(a,b){b=b||{},a=f.getDOMElement(a);var c=Z(a),d=v[c];if(d&&d.length)for(var e=0,g=d.length;g>e;e++)d[e].detachAll(b.fireEvent!==!1,b.forceDetach);return f},this.detachEveryConnection=function(a){return a=a||{},f.batch(function(){for(var b in v){var c=v[b];if(c&&c.length)for(var d=0,e=c.length;e>d;d++)c[d].detachAll(a.fireEvent!==!1,a.forceDetach)}u.length=0}),f},this.deleteObject=function(a){var b={endpoints:{},connections:{},endpointCount:0,connectionCount:0},c=a.fireEvent!==!1,d=a.deleteAttachedObjects!==!1,e=function(c){if(null!=c&&null==b.connections[c.id]&&(a.dontUpdateHover||null==c._jsPlumb||c.setHover(!1),b.connections[c.id]=c,b.connectionCount++,d))for(var e=0;ec;c++)e=m(a[c]),e.el&&N(e.el,!0,b,e.id);else e=m(a),e.el&&N(e.el,!0,b,e.id);return f};var cb=function(a,b,c,d){for(var e=0,f=a.length;f>e;e++)a[e][b].apply(a[e],c);return d(a)},db=function(a,b,c){for(var d=[],e=0,f=a.length;f>e;e++)d.push([a[e][b].apply(a[e],c),a[e]]);return d},eb=function(a,b,c){return function(){return cb(a,b,arguments,c)}},fb=function(a,b){return function(){return db(a,b,arguments)}},gb=function(a,b){var c=[];if(a)if("string"==typeof a){if("*"===a)return a;c.push(a)}else if(b)c=a;else if(a.length)for(var d=0,e=a.length;e>d;d++)c.push(m(a[d]).id);else c.push(m(a).id);return c},hb=function(a,b,c){return"*"===a?!0:a.length>0?-1!=jsPlumbUtil.indexOf(a,b):!c};this.getConnections=function(a,b){a?a.constructor==String&&(a={scope:a}):a={};for(var c=a.scope||f.getDefaultScope(),d=gb(c,!0),e=gb(a.source),g=gb(a.target),h=!b&&d.length>1?{}:[],i=function(a,c){if(!b&&d.length>1){var e=h[a];null==e&&(e=h[a]=[]),e.push(c)}else h.push(c)},j=0,k=u.length;k>j;j++){var l=u[j];hb(d,l.scope)&&hb(e,l.sourceId)&&hb(g,l.targetId)&&i(l.scope,l)}return h};var ib=function(a,b){return function(c){for(var d=0,e=a.length;e>d;d++)c(a[d]);return b(a)}},jb=function(a){return function(b){return a[b]}},kb=function(a,b){var c,d,e={length:a.length,each:ib(a,b),get:jb(a)},f=["setHover","removeAllOverlays","setLabel","addClass","addOverlay","removeOverlay","removeOverlays","showOverlay","hideOverlay","showOverlays","hideOverlays","setPaintStyle","setHoverPaintStyle","setSuspendEvents","setParameter","setParameters","setVisible","repaint","addType","toggleType","removeType","removeClass","setType","bind","unbind"],g=["getLabel","getOverlay","isHover","getParameter","getParameters","getPaintStyle","getHoverPaintStyle","isVisible","hasType","getType","isSuspendEvents"];for(c=0,d=f.length;d>c;c++)e[f[c]]=eb(a,f[c],b);for(c=0,d=g.length;d>c;c++)e[g[c]]=fb(a,g[c]);return e},lb=function(a){var b=kb(a,lb);return q.extend(b,{setDetachable:eb(a,"setDetachable",lb),setReattach:eb(a,"setReattach",lb),setConnector:eb(a,"setConnector",lb),detach:function(){for(var b=0,c=a.length;c>b;b++)f.detach(a[b])},isDetachable:fb(a,"isDetachable"),isReattach:fb(a,"isReattach")})},mb=function(a){var b=kb(a,mb);return q.extend(b,{setEnabled:eb(a,"setEnabled",mb),setAnchor:eb(a,"setAnchor",mb),isEnabled:fb(a,"isEnabled"),detachAll:function(){for(var b=0,c=a.length;c>b;b++)a[b].detachAll()},remove:function(){for(var b=0,c=a.length;c>b;b++)f.deleteObject({endpoint:a[b]})}})};this.select=function(a){return a=a||{},a.scope=a.scope||"*",lb(a.connections||f.getConnections(a,!0))},this.selectEndpoints=function(a){a=a||{},a.scope=a.scope||"*";var b=!a.element&&!a.source&&!a.target,c=b?"*":gb(a.element),d=b?"*":gb(a.source),e=b?"*":gb(a.target),f=gb(a.scope,!0),g=[];for(var h in v){var i=hb(c,h,!0),j=hb(d,h,!0),k="*"!=d,l=hb(e,h,!0),m="*"!=e;if(i||j||l)a:for(var n=0,o=v[h].length;o>n;n++){var p=v[h][n];if(hb(f,p.scope,!0)){var q=k&&d.length>0&&!p.isSource,r=m&&e.length>0&&!p.isTarget;if(q||r)continue a;g.push(p)}}}return mb(g)},this.getAllConnections=function(){return u},this.getDefaultScope=function(){return F},this.getEndpoint=M,this.getEndpoints=function(a){return v[m(a).id]},this.getDefaultEndpointType=function(){return q.Endpoint},this.getDefaultConnectionType=function(){return q.Connection},this.getId=Z,this.appendElement=J;var nb=!1;this.isHoverSuspended=function(){return nb},this.setHoverSuspended=function(a){nb=a},this.hide=function(a,b){return V(a,"none",b),f},this.idstamp=I,this.connectorsInitialized=!1,this.registerConnectorType=function(a,b){c.push([a,b])};var ob=function(a){if(!p&&a){var b=f.getDOMElement(a);b.offsetParent&&f.setContainer(b.offsetParent)}},pb=function(){f.Defaults.Container&&f.setContainer(f.Defaults.Container)},qb=f.manage=function(a,b){return x[a]||(x[a]={el:b,endpoints:[],connections:[]},x[a].info=rb({elId:a,timestamp:E})),x[a]},rb=this.updateOffset=function(a){var b,c=a.timestamp,d=a.recalc,e=a.offset,g=a.elId;return D&&!c&&(c=E),!d&&c&&c===z[g]?{o:a.offset||y[g],s:C[g]}:(d||!e&&null==y[g]?(b=x[g]?x[g].el:null,null!=b&&(C[g]=f.getSize(b),y[g]=f.getOffset(b),z[g]=c)):(y[g]=e||y[g],null==C[g]&&(b=x[g].el,null!=b&&(C[g]=f.getSize(b))),z[g]=c),y[g]&&!y[g].right&&(y[g].right=y[g].left+C[g][0],y[g].bottom=y[g].top+C[g][1],y[g].width=C[g][0],y[g].height=C[g][1],y[g].centerx=y[g].left+y[g].width/2,y[g].centery=y[g].top+y[g].height/2),{o:y[g],s:C[g]})};this.init=function(){a=q.getRenderModes();var b=function(a,b,c){q.Connectors[a][b]=function(){c.apply(this,arguments),q.ConnectorRenderers[a].apply(this,arguments)},jsPlumbUtil.extend(q.Connectors[a][b],[c,q.ConnectorRenderers[a]])};if(!q.connectorsInitialized){for(var d=0;d=4?[c[2],c[3]]:[0,0],offsets:c.length>=6?[c[4],c[5]]:[0,0],elementId:e,jsPlumbInstance:f,cssClass:7==c.length?c[6]:null};g=new q.Anchor(h),g.clone=function(){return new q.Anchor(h)}}return g.id||(g.id="anchor_"+I()),g},this.makeAnchors=function(a,b,c){for(var e=[],g=0,h=a.length;h>g;g++)"string"==typeof a[g]?e.push(q.Anchors[a[g]]({elementId:b,jsPlumbInstance:c})):d.isArray(a[g])&&e.push(f.makeAnchor(a[g],b,c));return e},this.makeDynamicAnchor=function(a,b){return new q.DynamicAnchor({anchors:a,selector:b,elementId:null,jsPlumbInstance:f})},this.targetEndpointDefinitions={};var sb=function(a,b,c){a.paintStyle=a.paintStyle||c.Defaults.EndpointStyles[b]||c.Defaults.EndpointStyle,a.hoverPaintStyle=a.hoverPaintStyle||c.Defaults.EndpointHoverStyles[b]||c.Defaults.EndpointHoverStyle,a.anchor=a.anchor||c.Defaults.Anchors[b]||c.Defaults.Anchor,a.endpoint=a.endpoint||c.Defaults.Endpoints[b]||c.Defaults.Endpoint};this.sourceEndpointDefinitions={};var tb=function(a,b,c,d,e){for(var f=a.target||a.srcElement,g=!1,h=d.getSelector(b,c),i=0;i0&&d>=e.maxConnections;return g&&b.onMaxConnections&&b.onMaxConnections({element:a.el,connection:jpc},c),g},element:a.el,elementId:a.id,isSource:e,isTarget:g,addClass:function(b){f.addClass(a.el,b)},removeClass:function(b){f.removeClass(a.el,b)},onDrop:function(a){var b=a.endpoints[0];b.anchor.locked=!1},isDropAllowed:function(){return i.isDropAllowed.apply(i,arguments)},getEndpoint:function(c){var d=a.el[h],e=d.endpoint;if((null==e||null==e._jsPlumb)&&(e=f.addEndpoint(a.el,b),e._mtNew=!0),b.uniqueEndpoint&&(d.endpoint=e),e._doNotDeleteOnDetach=!1,e._deleteOnDetach=!0,c.isDetachable()&&e.initDraggable(),null!=e.anchor.positionFinder){var g=f.getUIPosition(arguments,f.getZoom()),i=f.getOffset(a.el),j=f.getSize(a.el),k=e.anchor.positionFinder(g,i,j,e.anchor.constructorParams);e.anchor.x=k[0],e.anchor.y=k[1]}return e},maybeCleanup:function(a){a._mtNew&&0===a.connections.length?f.deleteObject({endpoint:a}):delete a._mtNew}}),k=q.dragEvents.drop;return c.scope=c.scope||b.scope||f.Defaults.Scope,c[k]=d.wrap(c[k],j,!0),g&&(c[q.dragEvents.over]=function(){return!0}),b.allowLoopback===!1&&(c.canDrop=function(b){var c=b.getDragElement()._jsPlumbRelatedElement;return c!=a.el}),f.initDroppable(a.el,c,"internal"),j};this.makeTarget=function(a,b,c){var d=q.extend({_jsPlumb:this},c);q.extend(d,b),sb(d,1,this);for(var e=(!(d.deleteEndpointsOnDetach===!1),d.maxConnections||-1),f=function(a){var b=m(a),c=b.id,f=q.extend({},d.dropOptions||{});ob(c);var g={def:d,uniqueEndpoint:d.uniqueEndpoint,maxConnections:e,enabled:!0};b.el._jsPlumbTarget=g,this.targetEndpointDefinitions[c]=g,ub(b,d,f,d.isSource===!0,!0,"_jsPlumbTarget")}.bind(this),g=a.length&&a.constructor!=String?a:[a],h=0,i=g.length;i>h;h++)f(g[h]);return this},this.unmakeTarget=function(a,b){var c=m(a);return q.destroyDroppable(c.el),b||delete this.targetEndpointDefinitions[c.id],this},this.makeSource=function(a,b,c){var e=q.extend({_jsPlumb:this},c);q.extend(e,b),sb(e,0,this);for(var g=e.maxConnections||1,h=e.onMaxConnections,i=function(a){var b=a.id,c=this.getDOMElement(a.el);ob(b);var i={def:e,uniqueEndpoint:e.uniqueEndpoint,maxConnections:g,enabled:!0};this.sourceEndpointDefinitions[b]=i,a.el._jsPlumbSource=i;var j=q.dragEvents.stop,l=q.dragEvents.drag,m=q.extend({},e.dragOptions||{}),n=m.drag,o=m.stop,p=null,r=!1;m.scope=m.scope||e.scope,m[l]=d.wrap(m[l],function(){n&&n.apply(this,arguments),r=!1}),m[j]=d.wrap(m[j],function(){if(o&&o.apply(this,arguments),this.currentlyDragging=!1,null!=p._jsPlumb){var a=e.anchor||this.Defaults.Anchor,c=p.anchor,d=p.connections[0],g=this.makeAnchor(a,b,this),h=p.element;if(null!=g.positionFinder){var i=f.getOffset(h),j=this.getSize(h),k={left:i.left+c.x*j[0],top:i.top+c.y*j[1]},l=g.positionFinder(k,i,j,g.constructorParams);g.x=l[0],g.y=l[1]}p.setAnchor(g,!0),p.repaint(),this.repaint(p.elementId),null!=d&&this.repaint(d.targetId)}}.bind(this));var s=function(d){var i=this.getOriginalEvent(d);if(3!==d.which&&2!==d.button){var j=this.sourceEndpointDefinitions[b];if(j.enabled){if(b=this.getId(this.getDOMElement(a.el)),e.filter){var l=jsPlumbUtil.isString(e.filter)?tb(i,a.el,e.filter,this,e.filterExclude):e.filter(i,a.el);if(l===!1)return}var n=this.select({source:b}).length;if(j.maxConnections>=0&&j.uniqueEndpoint&&n>=j.maxConnections)return h&&h({element:a.el,maxConnections:g},d),!1;var o=q.getPositionOnElement(i,c,k),s={}; -q.extend(s,e),s.isTemporarySource=!0,s.anchor=[o[0],o[1],0,0],s.dragOptions=m,p=this.addEndpoint(b,s),r=!0,p._doNotDeleteOnDetach=!1,p._deleteOnDetach=!0,j.uniqueEndpoint&&(j.endpoint?p.finalEndpoint=j.endpoint:(j.endpoint=p,p._deleteOnDetach=!1,p._doNotDeleteOnDetach=!0));var t=function(){f.off(p.canvas,"mouseup",t),f.off(a.el,"mouseup",t),r&&(r=!1,f.deleteEndpoint(p))};f.on(p.canvas,"mouseup",t),f.on(a.el,"mouseup",t),f.trigger(p.canvas,"mousedown",d),jsPlumbUtil.consume(d)}}}.bind(this);this.on(a.el,"mousedown",s),i.trigger=s,e.filter&&(jsPlumbUtil.isString(e.filter)||jsPlumbUtil.isFunction(e.filter))&&f.setDragFilter(a.el,e.filter);var t=q.extend({},e.dropOptions||{});ub(a,e,t,!0,e.isTarget===!0,"_jsPlumbSource")}.bind(this),j=a.length&&a.constructor!=String?a:[a],l=0,n=j.length;n>l;l++)i(m(j[l]));return this},this.unmakeSource=function(a,b){var c=m(a),d=this.sourceEndpointDefinitions[c.id].trigger;return d&&f.off(c.el,"mousedown",d),b||delete this.sourceEndpointDefinitions[c.id],this},this.unmakeEverySource=function(){for(var a in this.sourceEndpointDefinitions)f.unmakeSource(a,!0);return this.sourceEndpointDefinitions={},this};var vb=function(a,b){b=jsPlumbUtil.isArray(b)?b:[b];for(var c=Z(a),d=0;dg;g++){var i=m(b[g]);f[i.id]&&(f[i.id].enabled=e?!f[i.id].enabled:c)}else{var j=m(b).id;f[j].enabled=e?!f[j].enabled:c}return this}.bind(this),yb=function(a,b){return d.isString(a)||!a.length?b.apply(this,[a]):a.length?b.apply(this,[a[0]]):void 0}.bind(this);this.toggleSourceEnabled=function(a){return xb("source",a,null,!0),this.isSourceEnabled(a)},this.setSourceEnabled=function(a,b){return xb("source",a,b)},this.isSource=function(a){return yb(a,function(a){return null!=this.sourceEndpointDefinitions[m(a).id]}.bind(this))},this.isSourceEnabled=function(a){return yb(a,function(a){var b=this.sourceEndpointDefinitions[m(a).id];return b&&b.enabled===!0}.bind(this))},this.toggleTargetEnabled=function(a){return xb("target",a,null,!0),this.isTargetEnabled(a)},this.isTarget=function(a){return yb(a,function(a){return null!=this.targetEndpointDefinitions[m(a).id]}.bind(this))},this.isTargetEnabled=function(a){return yb(a,function(a){var b=this.targetEndpointDefinitions[m(a).id];return b&&b.enabled===!0}.bind(this))},this.setTargetEnabled=function(a,b){return xb("target",a,b)},this.ready=function(a){f.bind("ready",a)},this.repaint=function(a,b,c){if("object"==typeof a&&a.length)for(var d=0,e=a.length;e>d;d++)K(a[d],b,c);else K(a,b,c);return f},this.revalidate=function(a,b,c){var d=c?a:f.getId(a);return f.updateOffset({elId:d,recalc:!0,timestamp:b}),f.repaint(a)},this.repaintEverything=function(){var a,b=e();for(a in v)f.updateOffset({elId:a,recalc:!0,timestamp:b});for(a in v)K(a,null,b);return this},this.removeAllEndpoints=function(a,b,c){c=c||[];var d=function(a){var e,g,h=m(a),i=v[h.id];if(i)for(c.push(h),e=0,g=i.length;g>e;e++)f.deleteEndpoint(i[e]);if(delete v[h.id],b&&h.el&&3!=h.el.nodeType&&8!=h.el.nodeType)for(e=0,g=h.el.childNodes.length;g>e;e++)d(h.el.childNodes[e])};return d(a),this};var zb=function(a,b){f.removeAllEndpoints(a.id,!0,b);for(var c=function(a){f.getDragManager().elementRemoved(a.id),f.anchorManager.clearFor(a.id),f.anchorManager.removeFloatingConnection(a.id),delete f.floatingConnections[a.id],delete x[a.id],delete y[a.id],a.el&&(f.removeElement(a.el),a.el._jsPlumb=null)},d=1;d0;)d(e.el.childNodes[0]);b||zb(e,c)}};return f.batch(function(){d(a,!0)},b===!1),f},this.reset=function(){f.setSuspendEvents(!0),f.deleteEveryEndpoint(),f.unbind(),this.targetEndpointDefinitions={},this.sourceEndpointDefinitions={},u.length=0,f.setSuspendEvents(!1)};var Ab=function(a){a.canvas&&a.canvas.parentNode&&a.canvas.parentNode.removeChild(a.canvas),a.cleanup(),a.destroy()},Bb=function(a){Ab(a)};this.clear=function(){f.select().each(Bb),f.selectEndpoints().each(Bb),v={},w={}},this.setDefaultScope=function(a){return F=a,f},this.setDraggable=U,this.setId=function(a,b,c){var d;jsPlumbUtil.isString(a)?d=a:(a=this.getDOMElement(a),d=this.getId(a));var e=this.getConnections({source:d,scope:"*"},!0),f=this.getConnections({target:d,scope:"*"},!0);b=""+b,c?a=this.getDOMElement(b):(a=this.getDOMElement(d),this.setAttribute(a,"id",b)),v[b]=v[d]||[];for(var g=0,h=v[b].length;h>g;g++)v[b][g].setElementId(b),v[b][g].setReferenceElement(a);delete v[d],this.anchorManager.changeId(d,b),this.getDragManager().changeId(d,b),x[b]=x[d],delete x[d];var i=function(c,d,e){for(var f=0,g=c.length;g>f;f++)c[f].endpoints[d].setElementId(b),c[f].endpoints[d].setReferenceElement(a),c[f][e+"Id"]=b,c[f][e]=a};i(e,0,"source"),i(f,1,"target"),this.repaint(b)},this.setDebugLog=function(a){s=a},this.setSuspendDrawing=function(a,b){var c=D;return D=a,E=a?(new Date).getTime():null,b&&this.repaintEverything(),c},this.isSuspendDrawing=function(){return D},this.getSuspendedAt=function(){return E},this.batch=function(a,b){var c=this.isSuspendDrawing();c||this.setSuspendDrawing(!0);try{a()}catch(e){d.log("Function run while suspended failed",e)}c||this.setSuspendDrawing(!1,!b)},this.doWhileSuspended=this.batch,this.getCachedData=Y,this.timestamp=e,this.setRenderMode=function(a){if(a!==q.SVG&&a!==q.VML)throw new TypeError("Render mode ["+a+"] not supported");return G=this.trySetRenderMode(a)},this.getRenderMode=function(){return G},this.show=function(a,b){return V(a,"block",b),f},this.toggleVisible=X,this.toggleDraggable=W,this.addListener=this.bind};jsPlumbUtil.extend(p,jsPlumbUtil.EventGenerator,{setAttribute:function(a,b,c){this.setAttribute(a,b,c)},getAttribute:function(a,b){return this.getAttribute(q.getDOMElement(a),b)},convertToFullOverlaySpec:function(a){return jsPlumbUtil.isString(a)&&(a=[a,{}]),a[1].id=a[1].id||jsPlumbUtil.uuid(),a},registerConnectionType:function(a,b){if(this._connectionTypes[a]=q.extend({},b),b.overlays){for(var c={},d=0;d';var b=a.firstChild;null!=b&&null!=b.style?(b.style.behavior="url(#default#VML)",c.vml=b?"object"==typeof b.adj:!0):c.vml=!1,a.parentNode.removeChild(a)}return c.vml},d=function(){var a=-1;if("Microsoft Internet Explorer"==navigator.appName){var b=navigator.userAgent,c=new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})");null!=c.exec(b)&&(a=parseFloat(RegExp.$1))}return a}(),e=d>-1&&9>d,f=function(a,b){if(null==a)return[0,0];var c=k(a),d=j(c,0);return[d[b+"X"],d[b+"Y"]]},g=function(a){return null==a?[0,0]:e?[a.clientX+document.documentElement.scrollLeft,a.clientY+document.documentElement.scrollTop]:f(a,"page")},h=function(a){return f(a,"screen")},i=function(a){return f(a,"client")},j=function(a,b){return a.item?a.item(b):a[b]},k=function(a){return a.touches&&a.touches.length>0?a.touches:a.changedTouches&&a.changedTouches.length>0?a.changedTouches:a.targetTouches&&a.targetTouches.length>0?a.targetTouches:[a]},l=function(a){var b={},c=[],d={},e={},f={};this.register=function(g){var h=a.getId(g),i=a.getOffset(g);b[h]||(b[h]=g,c.push(g),d[h]={});var j=function(b){if(b)for(var c=0;c0){var l=a.getOffset(g);d[h][k]={id:k,offset:{left:l.left-i.left,top:l.top-i.top}},f[k]=h}j(b.childNodes[c])}};j(g)},this.updateOffsets=function(b){if(null!=b){var c=jsPlumb.getDOMElement(b),e=a.getId(c),g=d[e],h=a.getOffset(c);if(g)for(var i in g)if(g.hasOwnProperty(i)){var j=jsPlumb.getDOMElement(i),k=a.getOffset(j);d[e][i]={id:i,offset:{left:k.left-h.left,top:k.top-h.top}},f[i]=e}}},this.endpointAdded=function(c,g){g=g||a.getId(c);var h=document.body,i=c.parentNode;for(e[g]=e[g]?e[g]+1:1;null!=i&&i!=h;){var j=a.getId(i,null,!0);if(j&&b[j]){var k=a.getOffset(i);if(null==d[j][g]){var l=a.getOffset(c);d[j][g]={id:g,offset:{left:l.left-k.left,top:l.top-k.top}},f[g]=j}break}i=i.parentNode}},this.endpointDeleted=function(a){if(e[a.elementId]&&(e[a.elementId]--,e[a.elementId]<=0))for(var b in d)d.hasOwnProperty(b)&&d[b]&&(delete d[b][a.elementId],delete f[a.elementId])},this.changeId=function(a,b){d[b]=d[a],d[a]={},f[b]=f[a],f[a]=null},this.getElementsForDraggable=function(a){return d[a]},this.elementRemoved=function(a){var b=f[a];b&&(delete d[b][a],delete f[a])},this.reset=function(){b={},c=[],d={},e={}},this.dragEnded=function(b){var c=a.getId(b),d=f[c];d&&this.updateOffsets(d)},this.setParent=function(b,c,e,g){var h=f[c];if(h){d[g]||(d[g]={}),d[g][c]=d[h][c],delete d[h][c];var i=a.getOffset(e),j=a.getOffset(b);d[g][c].offset={left:j.left-i.left,top:j.top-i.top},f[c]=g}},this.getDragAncestor=function(b){var c=jsPlumb.getDOMElement(b),d=a.getId(c),e=f[d];return e?jsPlumb.getDOMElement(e):null}},m=function(a){return null==a?null:a.replace(/^\s\s*/,"").replace(/\s\s*$/,"")},n=function(a,b){b=m(b),"undefined"!=typeof a.className.baseVal?a.className.baseVal=b:a.className=b},o=function(a){return"undefined"==typeof a.className.baseVal?a.className:a.className.baseVal},p=function(a,b,c){b=null==b?[]:jsPlumbUtil.isArray(b)?b:b.split(/\s+/),c=null==c?[]:jsPlumbUtil.isArray(c)?c:c.split(/\s+/);var d=o(a),e=d.split(/\s+/),f=function(a,b){for(var c=0;c0||b.scrollLeft>0)){var c=this.getStyle(a,"position");"fixed"!==c&&(d.left-=b.scrollLeft,d.top-=b.scrollTop)}}.bind(this);null!=e;)d.left+=e.offsetLeft,d.top+=e.offsetTop,b||f(e),e=b?e.offsetParent:e.offsetParent==c?null:e.offsetParent;if(null!=c&&!b&&(c.scrollTop>0||c.scrollLeft>0)){var g=null!=a.offsetParent?this.getStyle(a.offsetParent,"position"):"static",h=this.getStyle(a,"position");"absolute"!==h&&"fixed"!==h&&"absolute"!==g&&"fixed"!=g&&(d.left-=c.scrollLeft,d.top-=c.scrollTop)}return d},getPositionOnElement:function(a,b,c){var d="undefined"!=typeof b.getBoundingClientRect?b.getBoundingClientRect():{left:0,top:0,width:0,height:0},e=document.body,f=document.documentElement,g=window.pageYOffset||f.scrollTop||e.scrollTop,h=window.pageXOffset||f.scrollLeft||e.scrollLeft,i=f.clientTop||e.clientTop||0,j=f.clientLeft||e.clientLeft||0,k=0,l=0,m=d.top+g-i+k*c,n=d.left+h-j+l*c,o=jsPlumb.pageLocation(a),p=d.width||b.offsetWidth*c,q=d.height||b.offsetHeight*c,r=(o[0]-n)/p,s=(o[1]-m)/q;return[r,s]},getAbsolutePosition:function(a){var b=function(b){var c=a.style[b];return c?parseFloat(c.substring(0,c.length-2)):void 0};return[b("left"),b("top")]},setAbsolutePosition:function(a,b,c,d){c?this.animate(a,{left:"+="+(b[0]-c[0]),top:"+="+(b[1]-c[1])},d):(a.style.left=b[0]+"px",a.style.top=b[1]+"px")},getSize:function(a){return[a.offsetWidth,a.offsetHeight]},getWidth:function(a){return a.offsetWidth},getHeight:function(a){return a.offsetHeight}})}.call(this),function(){"use strict";var a=this,b=a.jsPlumb,c=a.jsPlumbUtil,d="__label",e=function(a,c){var e={cssClass:c.cssClass,labelStyle:a.labelStyle,id:d,component:a,_jsPlumb:a._jsPlumb.instance},f=jsPlumb.extend(e,c);return new(b.Overlays[a._jsPlumb.instance.getRenderMode()].Label)(f)},f=function(a,d){var e=null;if(c.isArray(d)){var f=d[0],g=b.extend({component:a,_jsPlumb:a._jsPlumb.instance},d[1]);3==d.length&&b.extend(g,d[2]),e=new(b.Overlays[a._jsPlumb.instance.getRenderMode()][f])(g)}else e=d.constructor==String?new(b.Overlays[a._jsPlumb.instance.getRenderMode()][d])({component:a,_jsPlumb:a._jsPlumb.instance}):d;return e.id=e.id||c.uuid(),a.cacheTypeItem("overlay",e,e.id),a._jsPlumb.overlays[e.id]=e,e};b.OverlayCapableJsPlumbUIComponent=function(a){jsPlumbUIComponent.apply(this,arguments),this._jsPlumb.overlays={},this._jsPlumb.overlayPositions={},a.label&&(this.getDefaultType().overlays[d]=["Label",{label:a.label,location:a.labelLocation||this.defaultLabelLocation||.5,labelStyle:a.labelStyle||this._jsPlumb.instance.Defaults.LabelStyle,id:d}]),this.setListenerComponent=function(a){if(this._jsPlumb)for(var b in this._jsPlumb.overlays)this._jsPlumb.overlays[b].setListenerComponent(a)}},b.OverlayCapableJsPlumbUIComponent.applyType=function(a,b){if(b.overlays){var c,d={};for(c in b.overlays){var e=a._jsPlumb.overlays[b.overlays[c][1].id];if(e)e.updateFrom(b.overlays[c][1]),d[b.overlays[c][1].id]=!0;else{var f=a.getCachedTypeItem("overlay",b.overlays[c][1].id);null!=f?(f.reattach(a._jsPlumb.instance),f.updateFrom(b.overlays[c][1]),a._jsPlumb.overlays[f.id]=f):f=a.addOverlay(b.overlays[c],!0),d[f.id]=!0}}for(c in a._jsPlumb.overlays)null==d[a._jsPlumb.overlays[c].id]&&a.removeOverlay(a._jsPlumb.overlays[c].id)}},c.extend(b.OverlayCapableJsPlumbUIComponent,jsPlumbUIComponent,{setHover:function(a){if(this._jsPlumb&&!this._jsPlumb.instance.isConnectionBeingDragged())for(var b in this._jsPlumb.overlays)this._jsPlumb.overlays[b][a?"addClass":"removeClass"](this._jsPlumb.instance.hoverClass)},addOverlay:function(a,b){var c=f(this,a);return b||this.repaint(),c},getOverlay:function(a){return this._jsPlumb.overlays[a]},getOverlays:function(){return this._jsPlumb.overlays},hideOverlay:function(a){var b=this.getOverlay(a);b&&b.hide()},hideOverlays:function(){for(var a in this._jsPlumb.overlays)this._jsPlumb.overlays[a].hide()},showOverlay:function(a){var b=this.getOverlay(a);b&&b.show()},showOverlays:function(){for(var a in this._jsPlumb.overlays.length)this._jsPlumb.overlays[a].show()},removeAllOverlays:function(a){for(var b in this._jsPlumb.overlays)this._jsPlumb.overlays[b].cleanup&&this._jsPlumb.overlays[b].cleanup();this._jsPlumb.overlays={},this._jsPlumb.overlayPositions=null,a||this.repaint()},removeOverlay:function(a){var b=this._jsPlumb.overlays[a];b&&(b.cleanup&&b.cleanup(),delete this._jsPlumb.overlays[a],this._jsPlumb.overlayPositions&&delete this._jsPlumb.overlayPositions[a])},removeOverlays:function(){for(var a=0,b=arguments.length;b>a;a++)this.removeOverlay(arguments[a])},moveParent:function(a){this.bgCanvas&&(this.bgCanvas.parentNode.removeChild(this.bgCanvas),a.appendChild(this.bgCanvas)),this.canvas.parentNode.removeChild(this.canvas),a.appendChild(this.canvas);for(var b in this._jsPlumb.overlays)if(this._jsPlumb.overlays[b].isAppendedAtTopLevel){var c=this._jsPlumb.overlays[b].getElement();c.parentNode.removeChild(c),a.appendChild(c)}},getLabel:function(){var a=this.getOverlay(d);return null!=a?a.getLabel():null},getLabelOverlay:function(){return this.getOverlay(d)},setLabel:function(a){var b=this.getOverlay(d);if(b)a.constructor==String||a.constructor==Function?b.setLabel(a):(a.label&&b.setLabel(a.label),a.location&&b.setLocation(a.location));else{var c=a.constructor==String||a.constructor==Function?{label:a}:a;b=e(this,c),this._jsPlumb.overlays[d]=b}this._jsPlumb.instance.isSuspendDrawing()||this.repaint()},cleanup:function(a){for(var b in this._jsPlumb.overlays)this._jsPlumb.overlays[b].cleanup(a),this._jsPlumb.overlays[b].destroy(a);a&&(this._jsPlumb.overlays={},this._jsPlumb.overlayPositions=null)},setVisible:function(a){this[a?"showOverlays":"hideOverlays"]()},setAbsoluteOverlayPosition:function(a,b){this._jsPlumb.overlayPositions[a.id]=b},getAbsoluteOverlayPosition:function(a){return this._jsPlumb.overlayPositions?this._jsPlumb.overlayPositions[a.id]:null}})}.call(this),function(){"use strict";var a=this,b=a.jsPlumb,c=a.jsPlumbUtil,d=function(a,c){var d=!1;return{drag:function(){if(d)return d=!1,!0;var e=b.getUIPosition(arguments,c.getZoom());a.element&&(jsPlumb.setPosition(a.element,e),c.repaint(a.element,e))},stopDrag:function(){d=!0}}},e=function(a,b){var c=jsPlumb.createElement("div",{position:"absolute"});b.appendElement(c);var d=b.getId(c);b.manage(d,c),a.id=d,a.element=c},f=function(a,c,d,e,f,g,h,i){var j=new b.FloatingAnchor({reference:c,referenceCanvas:e,jsPlumbInstance:g});return h({paintStyle:a,endpoint:d,anchor:j,source:f,scope:i})},g=["connectorStyle","connectorHoverStyle","connectorOverlays","connector","connectionType","connectorClass","connectorHoverClass"],h=function(a,b){var c=0;if(null!=b)for(var d=0;d0)for(var b=0;b0?"add":"remove")+"Class"](j.endpointConnectedClass),this[(this.isFull()?"add":"remove")+"Class"](j.endpointFullClass)},this.detachFromConnection=function(a,b,c){b=null==b?i(a,this):b,b>=0&&(this.connections.splice(b,1),this[(this.connections.length>0?"add":"remove")+"Class"](j.endpointConnectedClass),this[(this.isFull()?"add":"remove")+"Class"](j.endpointFullClass)),!c&&this._deleteOnDetach&&0===this.connections.length&&j.deleteObject({endpoint:this,fireEvent:!1,deleteAttachedObjects:!1})},this.detach=function(a,b,c,d,e,f,g){var h=null==g?i(a,this):g,k=!1;return d=d!==!1,h>=0&&(c||a._forceDetach||a.isDetachable()&&a.isDetachAllowed(a)&&this.isDetachAllowed(a)&&j.checkCondition("beforeDetach",a))&&(j.deleteObject({connection:a,fireEvent:!b&&d,originalEvent:e,deleteAttachedObjects:!1}),k=!0),k},this.detachAll=function(a,b){for(var c=[];this.connections.length>0;){var d=this.detach(this.connections[0],!1,b===!0,a!==!1,null,this,0);d||(c.push(this.connections[0]),this.connections.splice(0,1))}return this.connections=c,this},this.detachFrom=function(a,b,c){for(var d=[],e=0;e0){var l=h(this,a.elementWithPrecedence),m=l.endpoints[0]==this?1:0,n=0===m?l.sourceId:l.targetId,o=j.getCachedData(n),p=o.o,q=o.s;k.txy=[p.left,p.top],k.twh=q,k.tElement=l.endpoints[m]}f=this.anchor.compute(k)}this.endpoint.compute(f,this.anchor.getOrientation(this),this._jsPlumb.paintStyleInUse,g||this.paintStyleInUse),this.endpoint.paint(this._jsPlumb.paintStyleInUse,this.anchor),this.timestamp=b;for(var r in this._jsPlumb.overlays)if(this._jsPlumb.overlays.hasOwnProperty(r)){var s=this._jsPlumb.overlays[r];s.isVisible()&&(this._jsPlumb.overlayPlacements[r]=s.draw(this.endpoint,this._jsPlumb.paintStyleInUse),s.paint(this._jsPlumb.overlayPlacements[r]))}}}},this.getTypeDescriptor=function(){return"endpoint"},this.isVisible=function(){return this._jsPlumb.visible},this.repaint=this.paint;var p=!1;this.initDraggable=function(){if(!p&&b.isDragSupported(this.element)){var g={id:null,element:null},h=null,i=!1,n=null,o=d(g,j),q=a.dragOptions||{},r={},s=b.dragEvents.start,t=b.dragEvents.stop,u=b.dragEvents.drag,v=function(){h=this.connectorSelector();var b=!0;this.isEnabled()||(b=!1),null!=h||this.isSource||this.isTemporarySource||(b=!1),!this.isSource||!this.isFull()||null!=h&&this.dragAllowedWhenFull||(b=!1),null==h||h.isDetachable()||(b=!1);var d=j.checkCondition("beforeDrag",{endpoint:this,source:this.element,sourceId:this.elementId});if(d===!1&&(b=!1),b===!1)return j.stopDrag&&j.stopDrag(this.canvas),o.stopDrag(),!1;for(var p=0;p0}.bind(this),j.initDraggable(this.canvas,q,"internal"),this.canvas._jsPlumbRelatedElement=this.element,p=!0}};var q=a.endpoint||this._jsPlumb.instance.Defaults.Endpoint||b.Defaults.Endpoint;this.setEndpoint(q,!0);var r=a.anchor?a.anchor:a.anchors?a.anchors:j.Defaults.Anchor||"Top";this.setAnchor(r,!0);var s=["default",a.type||""].join(" ");this.addType(s,a.data,!0),this.canvas=this.endpoint.canvas,this.canvas._jsPlumb=this,(this.isSource||this.isTarget||this.isTemporarySource)&&this.initDraggable();var t=function(d,e,f,g,h){if((this.isTarget||e)&&b.isDropSupported(this.element)){var i=a.dropOptions||j.Defaults.DropOptions||b.Defaults.DropOptions;i=b.extend({},i),i.scope=i.scope||this.scope;var k=b.dragEvents.drop,l=b.dragEvents.over,m=b.dragEvents.out,n=this,o=j.EndpointDropHandler({getEndpoint:function(){return n},jsPlumb:j,enabled:function(){return null!=g?g.isEnabled():!0},isFull:function(){return g.isFull()},element:this.element,elementId:this.elementId,isSource:this.isSource,isTarget:this.isTarget,addClass:function(a){n.addClass(a)},removeClass:function(a){n.removeClass(a)},isDropAllowed:function(){return n.isDropAllowed.apply(n,arguments)},reference:h});i[k]=c.wrap(i[k],o,!0),i[l]=c.wrap(i[l],function(){var a=b.getDragObject(arguments),c=j.getAttribute(b.getDOMElement(a),"dragId"),d=j.floatingConnections[c];if(null!=d){var e=j.getFloatingAnchorIndex(d),f=this.isTarget&&0!==e||d.suspendedEndpoint&&this.referenceEndpoint&&this.referenceEndpoint.id==d.suspendedEndpoint.id;if(f){var g=j.checkCondition("checkDropAllowed",{sourceEndpoint:d.endpoints[e],targetEndpoint:this,connection:d});this[(g?"add":"remove")+"Class"](j.endpointDropAllowedClass),this[(g?"remove":"add")+"Class"](j.endpointDropForbiddenClass),d.endpoints[e].anchor.over(this.anchor,this)}}}.bind(this)),i[m]=c.wrap(i[m],function(){var a=b.getDragObject(arguments),c=null==a?null:j.getAttribute(b.getDOMElement(a),"dragId"),d=c?j.floatingConnections[c]:null;if(null!=d){var e=j.getFloatingAnchorIndex(d),f=this.isTarget&&0!==e||d.suspendedEndpoint&&this.referenceEndpoint&&this.referenceEndpoint.id==d.suspendedEndpoint.id;f&&(this.removeClass(j.endpointDropAllowedClass),this.removeClass(j.endpointDropForbiddenClass),d.endpoints[e].anchor.out())}}.bind(this)),j.initDroppable(d,i,"internal",f)}}.bind(this);return this.anchor.isFloating||t(this.canvas,!0,!(a._transient||this.anchor.isFloating),this,a.reference),this},c.extend(b.Endpoint,b.OverlayCapableJsPlumbUIComponent,{setVisible:function(a,b,c){if(this._jsPlumb.visible=a,this.canvas&&(this.canvas.style.display=a?"block":"none"),this[a?"showOverlays":"hideOverlays"](),!b)for(var d=0;db.dist?1:0});for(var o=k[0].source,p=k[0].target,q=0;qc[0][0],d===!1?-1:1}},r=function(a,b){var c=a[0][0]<0?-Math.PI-a[0][0]:Math.PI-a[0][0],d=b[0][0]<0?-Math.PI-b[0][0]:Math.PI-b[0][0];return c>d?1:a[0][1]>b[0][1]?1:-1},s={top:function(a,b){return a[0]>b[0]?1:-1},right:q(!0),bottom:q(!0),left:r},t=function(a,b){return a.sort(b)},u=function(a,b){var c=m.getCachedData(a),d=c.s,f=c.o,h=function(b,c,d,f,h,i,j){if(f.length>0)for(var k=t(f,s[b]),l="right"===b||"top"===b,m=p(b,c,d,k,h,i,l),n=function(a,b){e[a.id]=[b[0],b[1],b[2],b[3]],g[a.id]=j},o=0;o-1&&(j[d].splice(h,1),b.addToList(j,e,[f,f.endpoints[0],f.endpoints[0].anchor.constructor==c.DynamicAnchor])),f.updateConnectedClass()},this.sourceChanged=function(a,d,e){if(a!==d){b.removeWithFunction(j[a],function(a){return a[0].id===e.id});var f=b.findWithFunction(j[e.targetId],function(a){return a[0].id===e.id});f>-1&&(j[e.targetId][f][0]=e,j[e.targetId][f][1]=e.endpoints[0],j[e.targetId][f][2]=e.endpoints[0].anchor.constructor==c.DynamicAnchor),b.addToList(j,d,[e,e.endpoints[1],e.endpoints[1].anchor.constructor==c.DynamicAnchor]),e.updateConnectedClass()}},this.rehomeEndpoint=function(a,c,e){var f=d[c]||[],g=m.getId(e);if(g!==c){var h=b.indexOf(f,a);if(h>-1){var i=f.splice(h,1)[0];k.add(i,g)}}for(var j=0;j0?this.anchors[0]:null,f=e,g=this,h=function(a,b,c,d,e){var f=d[0]+a.x*e[0],g=d[1]+a.y*e[1],h=d[0]+e[0]/2,i=d[1]+e[1]/2;return Math.sqrt(Math.pow(b-f,2)+Math.pow(c-g,2))+Math.sqrt(Math.pow(h-f,2)+Math.pow(i-g,2))},i=a.selector||function(a,b,c,d,e){for(var f=c[0]+d[0]/2,g=c[1]+d[1]/2,i=-1,j=1/0,k=0;kl&&(i=k+0,j=l)}return e[i]};this.compute=function(a){var b=a.xy,c=a.wh,d=a.txy,h=a.twh;this.timestamp=a.timestamp;var j=g.getUserDefinedLocation();return null!=j?j:this.locked||null==d||null==h?e.compute(a):(a.timestamp=null,e=i(b,c,d,h,this.anchors),this.x=e.x,this.y=e.y,e!=f&&this.fire("anchorChanged",e),f=e,e.compute(a))},this.getCurrentLocation=function(a){return this.getUserDefinedLocation()||(null!=e?e.getCurrentLocation(a):null)},this.getOrientation=function(a){return null!=e?e.getOrientation(a):[0,0]},this.over=function(a,b){null!=e&&e.over(a,b)},this.out=function(){null!=e&&e.out()},this.getCssClass=function(){return e&&e.getCssClass()||""}},b.extend(c.DynamicAnchor,c.Anchor);var e=function(a,b,d,e,f,g){c.Anchors[f]=function(c){var h=c.jsPlumbInstance.makeAnchor([a,b,d,e,0,0],c.elementId,c.jsPlumbInstance);return h.type=f,g&&g(h,c),h}};e(.5,0,0,-1,"TopCenter"),e(.5,1,0,1,"BottomCenter"),e(0,.5,-1,0,"LeftMiddle"),e(1,.5,1,0,"RightMiddle"),e(.5,0,0,-1,"Top"),e(.5,1,0,1,"Bottom"),e(0,.5,-1,0,"Left"),e(1,.5,1,0,"Right"),e(.5,.5,0,0,"Center"),e(1,0,0,-1,"TopRight"),e(1,1,0,1,"BottomRight"),e(0,0,0,-1,"TopLeft"),e(0,1,0,1,"BottomLeft"),c.Defaults.DynamicAnchors=function(a){return a.jsPlumbInstance.makeAnchors(["TopCenter","RightMiddle","BottomCenter","LeftMiddle"],a.elementId,a.jsPlumbInstance)},c.Anchors.AutoDefault=function(a){var b=a.jsPlumbInstance.makeDynamicAnchor(c.Defaults.DynamicAnchors(a));return b.type="AutoDefault",b};var f=function(a,b){c.Anchors[a]=function(c){var d=c.jsPlumbInstance.makeAnchor(["Continuous",{faces:b}],c.elementId,c.jsPlumbInstance);return d.type=a,d}};c.Anchors.Continuous=function(a){return a.jsPlumbInstance.continuousAnchorFactory.get(a)},f("ContinuousLeft",["left"]),f("ContinuousTop",["top"]),f("ContinuousBottom",["bottom"]),f("ContinuousRight",["right"]),e(0,0,0,0,"Assign",function(a,b){var c=b.position||"Fixed";a.positionFinder=c.constructor==String?b.jsPlumbInstance.AnchorPositionFinders[c]:c,a.constructorParams=b}),jsPlumbInstance.prototype.AnchorPositionFinders={Fixed:function(a,b,c){return[(a.left-b.left)/c[0],(a.top-b.top)/c[1]]},Grid:function(a,b,c,d){var e=a.left-b.left,f=a.top-b.top,g=c[0]/d.grid[0],h=c[1]/d.grid[1],i=Math.floor(e/g),j=Math.floor(f/h);return[(i*g+g/2)/c[0],(j*h+h/2)/c[1]]}},c.Anchors.Perimeter=function(a){a=a||{};var b=a.anchorCount||60,c=a.shape;if(!c)throw new Error("no shape supplied to Perimeter Anchor type");var d=function(){for(var a=.5,c=2*Math.PI/b,d=0,e=[],f=0;b>f;f++){var g=a+a*Math.sin(d),h=a+a*Math.cos(d);e.push([g,h,0,0]),d+=c}return e},e=function(a){for(var c=b/a.length,d=[],e=function(a,e,f,g,h){c=b*h;for(var i=(f-a)/c,j=(g-e)/c,k=0;c>k;k++)d.push([a+i*k,e+j*k,0,0])},f=0;f0?a:c+a:a*c;return d.pointOnLine({x:g,y:i},{x:h,y:j},e)}return{x:h,y:j}}return{x:g,y:i}},this.gradientAtPoint=function(){return e},this.pointAlongPathFrom=function(a,b,c){var e=this.pointOnPath(a,c),f=0>=b?{x:g,y:i}:{x:h,y:j};return 0>=b&&Math.abs(b)>1&&(b*=-1),d.pointOnLine(e,f,b)};var l=function(a,b,c){return c>=Math.min(a,b)&&c<=Math.max(a,b)},m=function(a,b,c){return Math.abs(c-a)a-b?b:k>c-a?c:a};this.pointOnPath=function(b,c){if(0===b)return{x:this.x1,y:this.y1,theta:this.startAngle};if(1==b)return{x:this.x2,y:this.y2,theta:this.endAngle};c&&(b/=j);var d=e(this,b),f=a.cx+a.r*Math.cos(d),g=a.cy+a.r*Math.sin(d);return{x:l(f),y:l(g),theta:d}},this.gradientAtPoint=function(b,c){var e=this.pointOnPath(b,c),f=d.normal([a.cx,a.cy],[e.x,e.y]);return this.anticlockwise||1/0!=f&&f!=-1/0||(f*=-1),f},this.pointAlongPathFrom=function(b,c,d){var e=this.pointOnPath(b,d),f=2*(c/h)*Math.PI,g=this.anticlockwise?-1:1,i=e.theta+g*f,j=a.cx+this.radius*Math.cos(i),k=a.cy+this.radius*Math.sin(i);return{x:j,y:k}}},Bezier:function(c){this.curve=[{x:c.x1,y:c.y1},{x:c.cp1x,y:c.cp1y},{x:c.cp2x,y:c.cp2y},{x:c.x2,y:c.y2}],b.Segments.AbstractSegment.apply(this,arguments),this.bounds={minX:Math.min(c.x1,c.x2,c.cp1x,c.cp2x),minY:Math.min(c.y1,c.y2,c.cp1y,c.cp2y),maxX:Math.max(c.x1,c.x2,c.cp1x,c.cp2x),maxY:Math.max(c.y1,c.y2,c.cp1y,c.cp2y)},this.type="Bezier";var d=function(b,c,d){return d&&(c=a.jsBezier.locationAlongCurveFrom(b,c>0?0:1,c)),c};this.pointOnPath=function(b,c){return b=d(this.curve,b,c),a.jsBezier.pointOnCurve(this.curve,b)},this.gradientAtPoint=function(b,c){return b=d(this.curve,b,c),a.jsBezier.gradientAtPoint(this.curve,b)},this.pointAlongPathFrom=function(b,c,e){return b=d(this.curve,b,e),a.jsBezier.pointAlongCurveFrom(this.curve,b,c)},this.getLength=function(){return a.jsBezier.getLength(this.curve)},this.getBounds=function(){return this.bounds}}};var e=function(){this.resetBounds=function(){this.bounds={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}},this.resetBounds()};b.Connectors.AbstractConnector=function(a){e.apply(this,arguments);var f=[],g=0,h=[],i=[],j=a.stub||0,k=c.isArray(j)?j[0]:j,l=c.isArray(j)?j[1]:j,m=a.gap||0,n=c.isArray(m)?m[0]:m,o=c.isArray(m)?m[1]:m,p=null,q=!1,r=null;this.getPath=function(){},this.setPath=function(){},this.findSegmentForPoint=function(a,b){for(var c={d:1/0,s:null,x:null,y:null,l:null},d=0;d0?a/g:(g+a)/g);for(var c=h.length-1,d=1,e=0;e=a){c=e,d=1==a?1:0===a?0:(a-h[e][0])/i[e];break}return{segment:f[c],proportion:d,index:c}},u=function(a,c,d){if(d.x1!=d.x2||d.y1!=d.y2){var e=new b.Segments[c](d);f.push(e),g+=e.getLength(),a.updateBounds(e)}},v=function(){g=f.length=h.length=i.length=0};this.setSegments=function(a){p=[],g=0;for(var b=0;bp?0:1,r=[1,0][q];g=[],h=[],g[q]=a.sourcePos[q]>a.targetPos[q]?-1:1,h[q]=a.sourcePos[q]>a.targetPos[q]?1:-1,g[r]=0,h[r]=0}var s=c?m+n*g[0]:n*g[0],t=e?p+n*g[1]:n*g[1],u=c?o*h[0]:m+o*h[0],v=e?o*h[1]:p+o*h[1],w=g[0]*h[0]+g[1]*h[1],x={sx:s,sy:t,tx:u,ty:v,lw:f,xSpan:Math.abs(u-s),ySpan:Math.abs(v-t),mx:(s+u)/2,my:(t+v)/2,so:g,to:h,x:i,y:j,w:m,h:p,segment:b,startStubX:s+g[0]*k,startStubY:t+g[1]*k,endStubX:u+h[0]*l,endStubY:v+h[1]*l,isXGreaterThanStubTimes2:Math.abs(s-u)>k+l,isYGreaterThanStubTimes2:Math.abs(t-v)>k+l,opposite:-1==w,perpendicular:0===w,orthogonal:1==w,sourceAxis:0===g[0]?"y":"x",points:[i,j,m,p,s,t,u,v]};return x.anchorOrientation=x.opposite?"opposite":x.orthogonal?"orthogonal":"perpendicular",x};return this.getSegments=function(){return f},this.updateBounds=function(a){var b=a.getBounds();this.bounds.minX=Math.min(this.bounds.minX,b.minX),this.bounds.maxX=Math.max(this.bounds.maxX,b.maxX),this.bounds.minY=Math.min(this.bounds.minY,b.minY),this.bounds.maxY=Math.max(this.bounds.maxY,b.maxY)},this.pointOnPath=function(a,b){var c=t(a,b);return c.segment&&c.segment.pointOnPath(c.proportion,!1)||[0,0]},this.gradientAtPoint=function(a,b){var c=t(a,b);return c.segment&&c.segment.gradientAtPoint(c.proportion,!1)||0},this.pointAlongPathFrom=function(a,b,c){var d=t(a,c);return d.segment&&d.segment.pointAlongPathFrom(d.proportion,b,!1)||[0,0]},this.compute=function(a){q||(r=w.call(this,a)),v(),this._compute(r,a),this.x=r.points[0],this.y=r.points[1],this.w=r.points[2],this.h=r.points[3],this.segment=r.segment,s()},{addSegment:u,prepareCompute:w,sourceStub:k,targetStub:l,maxStub:Math.max(k,l),sourceGap:n,targetGap:o,maxGap:Math.max(n,o)}},c.extend(b.Connectors.AbstractConnector,e);var f=b.Connectors.Straight=function(){this.type="Straight";var a=b.Connectors.AbstractConnector.apply(this,arguments);this._compute=function(b){a.addSegment(this,"Straight",{x1:b.sx,y1:b.sy,x2:b.startStubX,y2:b.startStubY}),a.addSegment(this,"Straight",{x1:b.startStubX,y1:b.startStubY,x2:b.endStubX,y2:b.endStubY}),a.addSegment(this,"Straight",{x1:b.endStubX,y1:b.endStubY,x2:b.tx,y2:b.ty})}};c.extend(b.Connectors.Straight,b.Connectors.AbstractConnector),b.registerConnectorType(f,"Straight"),b.Endpoints.AbstractEndpoint=function(a){e.apply(this,arguments);var b=this.compute=function(){var a=this._compute.apply(this,arguments);return this.x=a[0],this.y=a[1],this.w=a[2],this.h=a[3],this.bounds.minX=this.x,this.bounds.minY=this.y,this.bounds.maxX=this.x+this.w,this.bounds.maxY=this.y+this.h,a};return{compute:b,cssClass:a.cssClass}},c.extend(b.Endpoints.AbstractEndpoint,e),b.Endpoints.Dot=function(a){this.type="Dot",b.Endpoints.AbstractEndpoint.apply(this,arguments),a=a||{},this.radius=a.radius||10,this.defaultOffset=.5*this.radius,this.defaultInnerRadius=this.radius/3,this._compute=function(a,b,c){this.radius=c.radius||this.radius;var d=a[0]-this.radius,e=a[1]-this.radius,f=2*this.radius,g=2*this.radius;if(c.strokeStyle){var h=c.lineWidth||1;d-=h,e-=h,f+=2*h,g+=2*h}return[d,e,f,g,this.radius]}},c.extend(b.Endpoints.Dot,b.Endpoints.AbstractEndpoint),b.Endpoints.Rectangle=function(a){this.type="Rectangle",b.Endpoints.AbstractEndpoint.apply(this,arguments),a=a||{},this.width=a.width||20,this.height=a.height||20,this._compute=function(a,b,c){var d=c.width||this.width,e=c.height||this.height,f=a[0]-d/2,g=a[1]-e/2;return[f,g,d,e]}},c.extend(b.Endpoints.Rectangle,b.Endpoints.AbstractEndpoint);var g=function(){b.jsPlumbUIComponent.apply(this,arguments),this._jsPlumb.displayElements=[]};c.extend(g,b.jsPlumbUIComponent,{getDisplayElements:function(){return this._jsPlumb.displayElements},appendDisplayElement:function(a){this._jsPlumb.displayElements.push(a)}}),b.Endpoints.Image=function(d){this.type="Image",g.apply(this,arguments),b.Endpoints.AbstractEndpoint.apply(this,arguments);var e=d.onload,f=d.src||d.url,h=d.cssClass?" "+d.cssClass:"";this._jsPlumb.img=new Image,this._jsPlumb.ready=!1,this._jsPlumb.initialized=!1,this._jsPlumb.deleted=!1,this._jsPlumb.widthToUse=d.width,this._jsPlumb.heightToUse=d.height,this._jsPlumb.endpoint=d.endpoint,this._jsPlumb.img.onload=function(){null!=this._jsPlumb&&(this._jsPlumb.ready=!0,this._jsPlumb.widthToUse=this._jsPlumb.widthToUse||this._jsPlumb.img.width,this._jsPlumb.heightToUse=this._jsPlumb.heightToUse||this._jsPlumb.img.height,e&&e(this))}.bind(this),this._jsPlumb.endpoint.setImage=function(a,b){var c=a.constructor==String?a:a.src;e=b,this._jsPlumb.img.src=c,null!=this.canvas&&this.canvas.setAttribute("src",this._jsPlumb.img.src)}.bind(this),this._jsPlumb.endpoint.setImage(f,e),this._compute=function(a){return this.anchorPoint=a,this._jsPlumb.ready?[a[0]-this._jsPlumb.widthToUse/2,a[1]-this._jsPlumb.heightToUse/2,this._jsPlumb.widthToUse,this._jsPlumb.heightToUse]:[0,0,0,0]},this.canvas=jsPlumb.createElement("img",{position:"absolute",margin:0,padding:0,outline:0},this._jsPlumb.instance.endpointClass+h),this._jsPlumb.widthToUse&&this.canvas.setAttribute("width",this._jsPlumb.widthToUse),this._jsPlumb.heightToUse&&this.canvas.setAttribute("height",this._jsPlumb.heightToUse),this._jsPlumb.instance.appendElement(this.canvas),this.actuallyPaint=function(){if(!this._jsPlumb.deleted){this._jsPlumb.initialized||(this.canvas.setAttribute("src",this._jsPlumb.img.src),this.appendDisplayElement(this.canvas),this._jsPlumb.initialized=!0);var a=this.anchorPoint[0]-this._jsPlumb.widthToUse/2,b=this.anchorPoint[1]-this._jsPlumb.heightToUse/2;c.sizeElement(this.canvas,a,b,this._jsPlumb.widthToUse,this._jsPlumb.heightToUse)}},this.paint=function(b,c){null!=this._jsPlumb&&(this._jsPlumb.ready?this.actuallyPaint(b,c):a.setTimeout(function(){this.paint(b,c)}.bind(this),200))}},c.extend(b.Endpoints.Image,[g,b.Endpoints.AbstractEndpoint],{cleanup:function(a){a&&(this._jsPlumb.deleted=!0,this.canvas&&this.canvas.parentNode.removeChild(this.canvas),this.canvas=null)}}),b.Endpoints.Blank=function(a){b.Endpoints.AbstractEndpoint.apply(this,arguments),this.type="Blank",g.apply(this,arguments),this._compute=function(a){return[a[0],a[1],10,0]};var d=a.cssClass?" "+a.cssClass:"";this.canvas=jsPlumb.createElement("div",{display:"block",width:"1px",height:"1px",background:"transparent",position:"absolute"},this._jsPlumb.instance.endpointClass+d),this._jsPlumb.instance.appendElement(this.canvas),this.paint=function(){c.sizeElement(this.canvas,this.x,this.y,this.w,this.h)}},c.extend(b.Endpoints.Blank,[b.Endpoints.AbstractEndpoint,g],{cleanup:function(){this.canvas&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas)}}),b.Endpoints.Triangle=function(a){this.type="Triangle",b.Endpoints.AbstractEndpoint.apply(this,arguments),a=a||{},a.width=a.width||55,a.height=a.height||55,this.width=a.width,this.height=a.height,this._compute=function(a,b,c){var d=c.width||self.width,e=c.height||self.height,f=a[0]-d/2,g=a[1]-e/2;return[f,g,d,e]}};var h=b.Overlays.AbstractOverlay=function(a){this.visible=!0,this.isAppendedAtTopLevel=!0,this.component=a.component,this.loc=null==a.location?.5:a.location,this.endpointLoc=null==a.endpointLocation?[.5,.5]:a.endpointLocation};h.prototype={cleanup:function(a){a&&(this.component=null,this.canvas=null,this.endpointLoc=null)},reattach:function(){},setVisible:function(a){this.visible=a,this.component.repaint()},isVisible:function(){return this.visible},hide:function(){this.setVisible(!1)},show:function(){this.setVisible(!0)},incrementLocation:function(a){this.loc+=a,this.component.repaint()},setLocation:function(a){this.loc=a,this.component.repaint()},getLocation:function(){return this.loc},updateFrom:function(){}},b.Overlays.Arrow=function(a){this.type="Arrow",h.apply(this,arguments),this.isAppendedAtTopLevel=!1,a=a||{},this.length=a.length||20,this.width=a.width||20,this.id=a.id;var b=(a.direction||1)<0?-1:1,e=a.paintStyle||{lineWidth:1},f=a.foldback||.623;this.computeMaxSize=function(){return 1.5*self.width},this.draw=function(a,g){var h,i,j,k,l;if(a.pointAlongPathFrom){if(c.isString(this.loc)||this.loc>1||this.loc<0){var m=parseInt(this.loc,10),n=this.loc<0?1:0;h=a.pointAlongPathFrom(n,m,!1),i=a.pointAlongPathFrom(n,m-b*this.length/2,!1),j=d.pointOnLine(h,i,this.length)}else if(1==this.loc){if(h=a.pointOnPath(this.loc),i=a.pointAlongPathFrom(this.loc,-this.length),j=d.pointOnLine(h,i,this.length),-1==b){var o=j;j=h,h=o}}else if(0===this.loc){if(j=a.pointOnPath(this.loc),i=a.pointAlongPathFrom(this.loc,this.length),h=d.pointOnLine(j,i,this.length),-1==b){var p=j;j=h,h=p}}else h=a.pointAlongPathFrom(this.loc,b*this.length/2),i=a.pointOnPath(this.loc),j=d.pointOnLine(h,i,this.length);k=d.perpendicularLineTo(h,j,this.width),l=d.pointOnLine(h,j,f*this.length);var q={hxy:h,tail:k,cxy:l},r=e.strokeStyle||g.strokeStyle,s=e.fillStyle||g.strokeStyle,t=e.lineWidth||g.lineWidth;return{component:a,d:q,lineWidth:t,strokeStyle:r,fillStyle:s,minX:Math.min(h.x,k[0].x,k[1].x),maxX:Math.max(h.x,k[0].x,k[1].x),minY:Math.min(h.y,k[0].y,k[1].y),maxY:Math.max(h.y,k[0].y,k[1].y)}}return{component:a,minX:0,maxX:0,minY:0,maxY:0}}},c.extend(b.Overlays.Arrow,h,{updateFrom:function(a){this.length=a.length||this.length,this.width=a.width||this.width,this.direction=null!=a.direction?a.direction:this.direction,this.foldback=a.foldback||this.foldback}}),b.Overlays.PlainArrow=function(a){a=a||{};var c=b.extend(a,{foldback:1});b.Overlays.Arrow.call(this,c),this.type="PlainArrow"},c.extend(b.Overlays.PlainArrow,b.Overlays.Arrow),b.Overlays.Diamond=function(a){a=a||{};var c=a.length||40,d=jsPlumb.extend(a,{length:c/2,foldback:2});b.Overlays.Arrow.call(this,d),this.type="Diamond"},c.extend(b.Overlays.Diamond,b.Overlays.Arrow);var i=function(a,b){return(null==a._jsPlumb.cachedDimensions||b)&&(a._jsPlumb.cachedDimensions=a.getDimensions()),a._jsPlumb.cachedDimensions},j=function(a){b.jsPlumbUIComponent.apply(this,arguments),h.apply(this,arguments);var d=this.fire;this.fire=function(){d.apply(this,arguments),this.component&&this.component.fire.apply(this.component,arguments)},this.detached=!1,this.id=a.id,this._jsPlumb.div=null,this._jsPlumb.initialised=!1,this._jsPlumb.component=a.component,this._jsPlumb.cachedDimensions=null,this._jsPlumb.create=a.create,this._jsPlumb.initiallyInvisible=a.visible===!1,this.getElement=function(){if(null==this._jsPlumb.div){var b=this._jsPlumb.div=jsPlumb.getDOMElement(this._jsPlumb.create(this._jsPlumb.component));b.style.position="absolute",b.className=this._jsPlumb.instance.overlayClass+" "+(this.cssClass?this.cssClass:a.cssClass?a.cssClass:""),this._jsPlumb.instance.appendElement(b),this._jsPlumb.instance.getId(b),this.canvas=b;var c="translate(-50%, -50%)";b.style.webkitTransform=c,b.style.mozTransform=c,b.style.msTransform=c,b.style.oTransform=c,b.style.transform=c,b._jsPlumb=this,a.visible===!1&&(b.style.display="none")}return this._jsPlumb.div},this.draw=function(a,b,d){var e=i(this);if(null!=e&&2==e.length){var f={x:0,y:0};if(d)f={x:d[0],y:d[1]};else if(a.pointOnPath){var g=this.loc,h=!1;(c.isString(this.loc)||this.loc<0||this.loc>1)&&(g=parseInt(this.loc,10),h=!0),f=a.pointOnPath(g,h)}else{var j=this.loc.constructor==Array?this.loc:this.endpointLoc;f={x:j[0]*a.w,y:j[1]*a.h}}var k=f.x-e[0]/2,l=f.y-e[1]/2;return{component:a,d:{minx:k,miny:l,td:e,cxy:f},minX:k,maxX:k+e[0],minY:l,maxY:l+e[1]}}return{minX:0,maxX:0,minY:0,maxY:0}}};c.extend(j,[b.jsPlumbUIComponent,h],{getDimensions:function(){return c.oldIE?b.getSize(this.getElement()):[1,1]},setVisible:function(a){this._jsPlumb.div&&(this._jsPlumb.div.style.display=a?"block":"none",a&&this._jsPlumb.initiallyInvisible&&(i(this,!0),this.component.repaint(),this._jsPlumb.initiallyInvisible=!1))},clearCachedDimensions:function(){this._jsPlumb.cachedDimensions=null},cleanup:function(a){a?null!=this._jsPlumb.div&&(this._jsPlumb.div._jsPlumb=null,this._jsPlumb.instance.removeElement(this._jsPlumb.div)):(this._jsPlumb&&this._jsPlumb.div&&this._jsPlumb.div.parentNode&&this._jsPlumb.div.parentNode.removeChild(this._jsPlumb.div),this.detached=!0)},reattach:function(a){null!=this._jsPlumb.div&&a.getContainer().appendChild(this._jsPlumb.div),this.detached=!1},computeMaxSize:function(){var a=i(this);return Math.max(a[0],a[1])},paint:function(a){this._jsPlumb.initialised||(this.getElement(),a.component.appendDisplayElement(this._jsPlumb.div),this._jsPlumb.initialised=!0,this.detached&&this._jsPlumb.div.parentNode.removeChild(this._jsPlumb.div)),this._jsPlumb.div.style.left=a.component.x+a.d.minx+"px",this._jsPlumb.div.style.top=a.component.y+a.d.miny+"px"}}),b.Overlays.Custom=function(){this.type="Custom",j.apply(this,arguments)},c.extend(b.Overlays.Custom,j),b.Overlays.GuideLines=function(){var a=this;a.length=50,a.lineWidth=5,this.type="GuideLines",h.apply(this,arguments),b.jsPlumbUIComponent.apply(this,arguments),this.draw=function(b){var c=b.pointAlongPathFrom(a.loc,a.length/2),e=b.pointOnPath(a.loc),f=d.pointOnLine(c,e,a.length),g=d.perpendicularLineTo(c,f,40),h=d.perpendicularLineTo(f,c,20);return{connector:b,head:c,tail:f,headLine:h,tailLine:g,minX:Math.min(c.x,f.x,h[0].x,h[1].x),minY:Math.min(c.y,f.y,h[0].y,h[1].y),maxX:Math.max(c.x,f.x,h[0].x,h[1].x),maxY:Math.max(c.y,f.y,h[0].y,h[1].y)}}},b.Overlays.Label=function(a){this.labelStyle=a.labelStyle,this.cssClass=null!=this.labelStyle?this.labelStyle.cssClass:null;var c=b.extend({create:function(){return jsPlumb.createElement("div")}},a);if(b.Overlays.Custom.call(this,c),this.type="Label",this.label=a.label||"",this.labelText=null,this.labelStyle){var d=this.getElement();if(this.labelStyle.font=this.labelStyle.font||"12px sans-serif",d.style.font=this.labelStyle.font,d.style.color=this.labelStyle.color||"black",this.labelStyle.fillStyle&&(d.style.background=this.labelStyle.fillStyle),this.labelStyle.borderWidth>0){var e=this.labelStyle.borderStyle?this.labelStyle.borderStyle:"black";d.style.border=this.labelStyle.borderWidth+"px solid "+e}this.labelStyle.padding&&(d.style.padding=this.labelStyle.padding)}},c.extend(b.Overlays.Label,b.Overlays.Custom,{cleanup:function(a){a&&(this.div=null,this.label=null,this.labelText=null,this.cssClass=null,this.labelStyle=null)},getLabel:function(){return this.label},setLabel:function(a){this.label=a,this.labelText=null,this.clearCachedDimensions(),this.update(),this.component.repaint()},getDimensions:function(){return this.update(),j.prototype.getDimensions.apply(this,arguments)},update:function(){if("function"==typeof this.label){var a=this.label(this);this.getElement().innerHTML=a.replace(/\r\n/g,"
")}else null==this.labelText&&(this.labelText=this.label,this.getElement().innerHTML=this.labelText.replace(/\r\n/g,"
"))},updateFrom:function(a){a.label&&this.setLabel(a.label)}})}.call(this),function(){"use strict";var a=this,b=a.jsPlumb,c=function(b){var c=b._mottle;return c||(c=b._mottle=new a.Mottle),c};b.extend(a.jsPlumbInstance.prototype,{getEventManager:function(){return c(this)},on:function(){this.getEventManager().on.apply(this,arguments)},off:function(){this.getEventManager().off.apply(this,arguments)}})}.call(this),function(){"use strict";var a=this,b=a.jsPlumb,c=a.jsPlumbUtil,d=function(a){this.type="Flowchart",a=a||{},a.stub=null==a.stub?30:a.stub;var c,d,e=b.Connectors.AbstractConnector.apply(this,arguments),f=null==a.midpoint?.5:a.midpoint,g=a.alwaysRespectStubs===!0,h=null,i=null,j=null,k=null!=a.cornerRadius?a.cornerRadius:0,l=function(a){return 0>a?-1:0===a?0:1},m=function(a,b,c,d){if(i!=b||j!=c){var e=null==i?d.sx:i,f=null==j?d.sy:j,g=e==b?"v":"h",h=l(b-e),k=l(c-f);i=b,j=c,a.push([e,f,b,c,g,h,k])}},n=function(a){return Math.sqrt(Math.pow(a[0]-a[2],2)+Math.pow(a[1]-a[3],2))},o=function(a){var b=[];return b.push.apply(b,a),b},p=function(a,b,c){for(var d,f=null,g=0;g0&&f[4]!=d[4]){var h=Math.min(k,n(f),n(d));f[2]-=f[5]*h,f[3]-=f[6]*h,d[0]+=d[5]*h,d[1]+=d[6]*h;var i=f[6]==d[5]&&1==d[5]||f[6]==d[5]&&0===d[5]&&f[5]!=d[6]||f[6]==d[5]&&-1==d[5],j=d[1]>f[3]?1:-1,l=d[0]>f[2]?1:-1,m=j==l,p=m&&i||!m&&!i?d[0]:f[2],q=m&&i||!m&&!i?f[3]:d[1];e.addSegment(a,"Straight",{x1:f[0],y1:f[1],x2:f[2],y2:f[3]}),e.addSegment(a,"Arc",{r:h,x1:f[2],y1:f[3],x2:d[0],y2:d[1],cx:p,cy:q,ac:i})}else{var r=f[2]==f[0]?0:f[2]>f[0]?c.lw/2:-(c.lw/2),s=f[3]==f[1]?0:f[3]>f[1]?c.lw/2:-(c.lw/2);e.addSegment(a,"Straight",{x1:f[0]-r,y1:f[1]-s,x2:f[2]+r,y2:f[3]+s})}f=d}null!=d&&e.addSegment(a,"Straight",{x1:d[0],y1:d[1],x2:d[2],y2:d[3]})};this.setSegments=function(a){h=a},this.isEditable=function(){return!0},this.getOriginalSegments=function(){return h||c},this._compute=function(a,b){if(b.clearEdits&&(h=null),null!=h)return p(this,h,a),void 0;c=[],i=null,j=null,d=null;var k=a.startStubX+(a.endStubX-a.startStubX)*f,l=a.startStubY+(a.endStubY-a.startStubY)*f,n={x:[0,1],y:[1,0]},o=function(){return[a.startStubX,a.startStubY,a.endStubX,a.endStubY]},q={perpendicular:o,orthogonal:o,opposite:function(b){var c=a,d="x"==b?0:1,e={x:function(){return 1==c.so[d]&&(c.startStubX>c.endStubX&&c.tx>c.startStubX||c.sx>c.endStubX&&c.tx>c.sx)||-1==c.so[d]&&(c.startStubXc.endStubY&&c.ty>c.startStubY||c.sy>c.endStubY&&c.ty>c.sy)||-1==c.so[d]&&(c.startStubYj[b][0],s=e[b][p][0],t=e[b][p][1],u=d[b][p][q];return c.segment==u[3]||c.segment==u[2]&&r?f[b]:c.segment==u[2]&&s>t?g[b]:c.segment==u[2]&&t>=s||c.segment==u[1]&&!r?i[b]:c.segment==u[0]||c.segment==u[1]&&r?h[b]:void 0},orthogonal:function(b,c,d,e,f){var g=a,h={x:-1==g.so[0]?Math.min(c,e):Math.max(c,e),y:-1==g.so[1]?Math.min(c,e):Math.max(c,e)}[b];return{x:[[h,d],[h,f],[e,f]],y:[[d,h],[f,h],[f,e]]}[b]},opposite:function(c,d,f,g){var h=a,i={x:"y",y:"x"}[c],j={x:"height",y:"width"}[c],m=h["is"+c.toUpperCase()+"GreaterThanStubTimes2"];if(b.sourceEndpoint.elementId==b.targetEndpoint.elementId){var n=f+(1-b.sourceEndpoint.anchor[i])*b.sourceInfo[j]+e.maxStub;return{x:[[d,n],[g,n]],y:[[n,d],[n,g]]}[c]}return!m||1==h.so[t]&&d>g||-1==h.so[t]&&g>d?{x:[[d,l],[g,l]],y:[[k,d],[k,g]]}[c]:1==h.so[t]&&g>d||-1==h.so[t]&&d>g?{x:[[k,h.sy],[k,h.ty]],y:[[h.sx,l],[h.tx,l]]}[c]:void 0}},s=q[a.anchorOrientation](a.sourceAxis),t="x"==a.sourceAxis?0:1,u="x"==a.sourceAxis?1:0,v=s[t],w=s[u],x=s[t+2],y=s[u+2];m(c,s[0],s[1],a);var z=r[a.anchorOrientation](a.sourceAxis,v,w,x,y);if(z)for(var A=0;A=a&&b>=d?1:c>=a&&d>=b?2:a>=c&&d>=b?3:4},e=function(a,b,c,d,e,f,g,h,i){return i>=h?[a,b]:1===c?d[3]<=0&&e[3]>=1?[a+(d[2]<.5?-1*f:f),b]:d[2]>=1&&e[2]<=0?[a,b+(d[3]<.5?-1*g:g)]:[a+-1*f,b+-1*g]:2===c?d[3]>=1&&e[3]<=0?[a+(d[2]<.5?-1*f:f),b]:d[2]>=1&&e[2]<=0?[a,b+(d[3]<.5?-1*g:g)]:[a+f,b+-1*g]:3===c?d[3]>=1&&e[3]<=0?[a+(d[2]<.5?-1*f:f),b]:d[2]<=0&&e[2]>=1?[a,b+(d[3]<.5?-1*g:g)]:[a+-1*f,b+-1*g]:4===c?d[3]<=0&&e[3]>=1?[a+(d[2]<.5?-1*f:f),b]:d[2]<=0&&e[2]>=1?[a,b+(d[3]<.5?-1*g:g)]:[a+f,b+-1*g]:void 0},f=function(a){a=a||{},this.type="StateMachine";var c=b.Connectors.AbstractConnector.apply(this,arguments),f=a.curviness||10,g=a.margin||5,h=a.proximityLimit||80,i=a.orientation&&"clockwise"===a.orientation,j=a.loopbackRadius||25,k=a.showLoopback!==!1;this._compute=function(a,b){var l=Math.abs(b.sourcePos[0]-b.targetPos[0]),m=Math.abs(b.sourcePos[1]-b.targetPos[1]);if(k&&b.sourceEndpoint.elementId===b.targetEndpoint.elementId){var n=b.sourcePos[0],o=b.sourcePos[1]-g,p=n,q=o-j,r=2*j,s=2*j,t=p-j,u=q-j;a.points[0]=t,a.points[1]=u,a.points[2]=r,a.points[3]=s,c.addSegment(this,"Arc",{loopback:!0,x1:n-t+4,y1:o-u,startAngle:0,endAngle:2*Math.PI,r:j,ac:!i,x2:n-t-4,y2:o-u,cx:p-t,cy:q-u}) -}else{var v=b.sourcePos[0]c?a.insertBefore(b,a.childNodes[c]):a.appendChild(b)};c.svg={node:t,attr:s,pos:u};var z=function(a){var d=a.pointerEventsSpec||"all",e={};b.jsPlumbUIComponent.apply(this,a.originalArgs),this.canvas=null,this.path=null,this.svg=null,this.bgCanvas=null;var f=a.cssClass+" "+(a.originalArgs[0].cssClass||""),g={style:"",width:0,height:0,"pointer-events":d,position:"absolute"};this.svg=t("svg",g),a.useDivWrapper?(this.canvas=jsPlumb.createElement("div",{position:"absolute"}),c.sizeElement(this.canvas,0,0,1,1),this.canvas.className=f):(s(this.svg,{"class":f}),this.canvas=this.svg),a._jsPlumb.appendElement(this.canvas,a.originalArgs[0].parent),a.useDivWrapper&&this.canvas.appendChild(this.svg);var h=[this.canvas];return this.getDisplayElements=function(){return h},this.appendDisplayElement=function(a){h.push(a)},this.paint=function(b,d,f){if(null!=b){var g,h=[this.x,this.y],i=[this.w,this.h];null!=f&&(f.xmin<0&&(h[0]+=f.xmin),f.ymin<0&&(h[1]+=f.ymin),i[0]=f.xmax+(f.xmin<0?-f.xmin:0),i[1]=f.ymax+(f.ymin<0?-f.ymin:0)),a.useDivWrapper?(c.sizeElement(this.canvas,h[0],h[1],i[0],i[1]),h[0]=0,h[1]=0,g=u([0,0])):g=u([h[0],h[1]]),e.paint.apply(this,arguments),s(this.svg,{style:g,width:i[0]||0,height:i[1]||0})}},{renderer:e}};c.extend(z,b.jsPlumbUIComponent,{cleanup:function(a){a||null==this.typeId?(this.canvas&&(this.canvas._jsPlumb=null),this.svg&&(this.svg._jsPlumb=null),this.bgCanvas&&(this.bgCanvas._jsPlumb=null),this.canvas&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.bgCanvas&&this.bgCanvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.svg=null,this.canvas=null,this.path=null,this.group=null):(this.canvas&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.bgCanvas&&this.bgCanvas.parentNode&&this.bgCanvas.parentNode.removeChild(this.bgCanvas))},reattach:function(a){var b=a.getContainer();this.canvas&&null==this.canvas.parentNode&&b.appendChild(this.canvas),this.bgCanvas&&null==this.bgCanvas.parentNode&&b.appendChild(this.bgCanvas)},setVisible:function(a){this.canvas&&(this.canvas.style.display=a?"block":"none")}}),b.ConnectorRenderers.svg=function(a){var d=this,e=z.apply(this,[{cssClass:a._jsPlumb.connectorClass,originalArgs:arguments,pointerEventsSpec:"none",_jsPlumb:a._jsPlumb}]);e.renderer.paint=function(e,f,g){var h=d.getSegments(),i="",j=[0,0];if(g.xmin<0&&(j[0]=-g.xmin),g.ymin<0&&(j[1]=-g.ymin),h.length>0){for(var k=0;kMath.PI?1:0,d=a.anticlockwise?0:1;return"M"+a.x1+" "+a.y1+" A "+a.radius+" "+b.r+" 0 "+c+","+d+" "+a.x2+" "+a.y2}}[a.type]()}}};var A=b.SvgEndpoint=function(a){var d=z.apply(this,[{cssClass:a._jsPlumb.endpointClass,originalArgs:arguments,pointerEventsSpec:"all",useDivWrapper:!0,_jsPlumb:a._jsPlumb}]);d.renderer.paint=function(a){var d=b.extend({},a);d.outlineColor&&(d.strokeWidth=d.outlineWidth,d.strokeStyle=c.convertStyle(d.outlineColor,!0)),null==this.node?(this.node=this.makeNode(d),this.svg.appendChild(this.node)):null!=this.updateNode&&this.updateNode(this.node),x(this.svg,this.node,d,[this.x,this.y,this.w,this.h],this),u(this.node,[this.x,this.y])}.bind(this)};c.extend(A,z),b.Endpoints.svg.Dot=function(){b.Endpoints.Dot.apply(this,arguments),A.apply(this,arguments),this.makeNode=function(){return t("circle",{cx:this.w/2,cy:this.h/2,r:this.radius})},this.updateNode=function(a){s(a,{cx:this.w/2,cy:this.h/2,r:this.radius})}},c.extend(b.Endpoints.svg.Dot,[b.Endpoints.Dot,A]),b.Endpoints.svg.Rectangle=function(){b.Endpoints.Rectangle.apply(this,arguments),A.apply(this,arguments),this.makeNode=function(){return t("rect",{width:this.w,height:this.h})},this.updateNode=function(a){s(a,{width:this.w,height:this.h})}},c.extend(b.Endpoints.svg.Rectangle,[b.Endpoints.Rectangle,A]),b.Endpoints.svg.Image=b.Endpoints.Image,b.Endpoints.svg.Blank=b.Endpoints.Blank,b.Overlays.svg.Label=b.Overlays.Label,b.Overlays.svg.Custom=b.Overlays.Custom;var B=function(a,c){a.apply(this,c),b.jsPlumbUIComponent.apply(this,c),this.isAppendedAtTopLevel=!1,this.path=null,this.paint=function(a,b){if(a.component.svg&&b){null==this.path&&(this.path=t("path",{"pointer-events":"all"}),a.component.svg.appendChild(this.path),this.canvas=a.component.svg);var e=c&&1==c.length?c[0].cssClass||"":"",f=[0,0];b.xmin<0&&(f[0]=-b.xmin),b.ymin<0&&(f[1]=-b.ymin),s(this.path,{d:d(a.d),"class":e,stroke:a.strokeStyle?a.strokeStyle:null,fill:a.fillStyle?a.fillStyle:null,transform:"translate("+f[0]+","+f[1]+")"})}};var d=function(a){return isNaN(a.cxy.x)||isNaN(a.cxy.y)?"":"M"+a.hxy.x+","+a.hxy.y+" L"+a.tail[0].x+","+a.tail[0].y+" L"+a.cxy.x+","+a.cxy.y+" L"+a.tail[1].x+","+a.tail[1].y+" L"+a.hxy.x+","+a.hxy.y};this.transfer=function(a){a.canvas&&this.path&&this.path.parentNode&&(this.path.parentNode.removeChild(this.path),a.canvas.appendChild(this.path))}};c.extend(B,[b.jsPlumbUIComponent,b.Overlays.AbstractOverlay],{cleanup:function(a){null!=this.path&&(a?this._jsPlumb.instance.removeElement(this.path):this.path.parentNode&&this.path.parentNode.removeChild(this.path))},reattach:function(){this.path&&this.canvas&&null==this.path.parentNode&&this.canvas.appendChild(this.path)},setVisible:function(a){null!=this.path&&(this.path.style.display=a?"block":"none")}}),b.Overlays.svg.Arrow=function(){B.apply(this,[b.Overlays.Arrow,arguments])},c.extend(b.Overlays.svg.Arrow,[b.Overlays.Arrow,B]),b.Overlays.svg.PlainArrow=function(){B.apply(this,[b.Overlays.PlainArrow,arguments])},c.extend(b.Overlays.svg.PlainArrow,[b.Overlays.PlainArrow,B]),b.Overlays.svg.Diamond=function(){B.apply(this,[b.Overlays.Diamond,arguments])},c.extend(b.Overlays.svg.Diamond,[b.Overlays.Diamond,B]),b.Overlays.svg.GuideLines=function(){var a,c,d=null,e=this;b.Overlays.GuideLines.apply(this,arguments),this.paint=function(b,g){null==d&&(d=t("path"),b.connector.svg.appendChild(d),e.attachListeners(d,b.connector),e.attachListeners(d,e),a=t("path"),b.connector.svg.appendChild(a),e.attachListeners(a,b.connector),e.attachListeners(a,e),c=t("path"),b.connector.svg.appendChild(c),e.attachListeners(c,b.connector),e.attachListeners(c,e));var h=[0,0];g.xmin<0&&(h[0]=-g.xmin),g.ymin<0&&(h[1]=-g.ymin),s(d,{d:f(b.head,b.tail),stroke:"red",fill:null,transform:"translate("+h[0]+","+h[1]+")"}),s(a,{d:f(b.tailLine[0],b.tailLine[1]),stroke:"blue",fill:null,transform:"translate("+h[0]+","+h[1]+")"}),s(c,{d:f(b.headLine[0],b.headLine[1]),stroke:"green",fill:null,transform:"translate("+h[0]+","+h[1]+")"})};var f=function(a,b){return"M "+a.x+","+a.y+" L"+b.x+","+b.y}},c.extend(b.Overlays.svg.GuideLines,b.Overlays.GuideLines)}.call(this),function(){"use strict";var a=this,b=a.jsPlumb,c=a.jsPlumbUtil,d={"stroke-linejoin":"joinstyle",joinstyle:"joinstyle",endcap:"endcap",miterlimit:"miterlimit"},e=null;if(document.createStyleSheet&&document.namespaces){var f=[".jsplumb_vml","jsplumb\\:textbox","jsplumb\\:oval","jsplumb\\:rect","jsplumb\\:stroke","jsplumb\\:shape","jsplumb\\:group"],g="behavior:url(#default#VML);position:absolute;";e=document.createStyleSheet();for(var h=0;h=k&&(window.clearInterval(o),null!=c.complete&&c.complete())},j)},destroyDraggable:function(a,b){f(this,b).destroyDraggable(a)},destroyDroppable:function(a,b){f(this,b).destroyDroppable(a)},initDraggable:function(a,b,c){f(this,c).draggable(a,b)},initDroppable:function(a,b,c){f(this,c).droppable(a,b)},isAlreadyDraggable:function(a){return null!=a._katavorioDrag},isDragSupported:function(){return!0},isDropSupported:function(){return!0},getDragObject:function(a){return a[0].drag.getDragElement()},getDragScope:function(a){return a._katavorioDrag&&a._katavorioDrag.scopes.join(" ")||""},getDropEvent:function(a){return a[0].e},getDropScope:function(a){return a._katavorioDrop&&a._katavorioDrop.scopes.join(" ")||""},getUIPosition:function(a){return{left:a[0].pos[0],top:a[0].pos[1]}},setDragFilter:function(a,b,c){a._katavorioDrag&&a._katavorioDrag.setFilter(b,c)},setElementDraggable:function(a,b){a=jsPlumb.getDOMElement(a),a._katavorioDrag&&a._katavorioDrag.setEnabled(b)},setDragScope:function(a,b){a._katavorioDrag&&a._katavorioDrag.k.setDragScope(a,b)},dragEvents:{start:"start",stop:"stop",drag:"drag",step:"step",over:"over",out:"out",drop:"drop",complete:"complete"},animEvents:{step:"step",complete:"complete"},stopDrag:function(a){a._katavorioDrag&&a._katavorioDrag.abort()},addToDragSelection:function(a){f(this).select(a)},removeFromDragSelection:function(a){f(this).deselect(a)},clearDragSelection:function(){f(this).deselectAll()},getOriginalEvent:function(a){return a},trigger:function(a,b,c){this.getEventManager().trigger(a,b,c)}});var h=function(a){var b=function(){/complete|loaded|interactive/.test(document.readyState)&&"undefined"!=typeof document.body&&null!=document.body?a():setTimeout(b,9)};b()};h(b.init)}.call(this); \ No newline at end of file diff --git a/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/dom.jsPlumb-1.7.5.js b/flexiblepower.ui.connectionspage/res/widgets/DashboardWidget/dom.jsPlumb-1.7.5.js similarity index 100% rename from flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/dom.jsPlumb-1.7.5.js rename to flexiblepower.ui.connectionspage/res/widgets/DashboardWidget/dom.jsPlumb-1.7.5.js diff --git a/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/index.html b/flexiblepower.ui.connectionspage/res/widgets/DashboardWidget/index.html similarity index 76% rename from flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/index.html rename to flexiblepower.ui.connectionspage/res/widgets/DashboardWidget/index.html index a0ab4d4..9c8c7ad 100755 --- a/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/index.html +++ b/flexiblepower.ui.connectionspage/res/widgets/DashboardWidget/index.html @@ -1,15 +1,15 @@ -
+
diff --git a/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/menu.png b/flexiblepower.ui.connectionspage/res/widgets/DashboardWidget/menu.png similarity index 100% rename from flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/menu.png rename to flexiblepower.ui.connectionspage/res/widgets/DashboardWidget/menu.png diff --git a/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/script.js b/flexiblepower.ui.connectionspage/res/widgets/DashboardWidget/script.js similarity index 94% rename from flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/script.js rename to flexiblepower.ui.connectionspage/res/widgets/DashboardWidget/script.js index 6697700..2a95f6f 100755 --- a/flexiblepower.ui.connectionspage/res/widgets/ConnectionManagerPage/script.js +++ b/flexiblepower.ui.connectionspage/res/widgets/DashboardWidget/script.js @@ -1,9 +1,11 @@ jsPlumb.ready(function() { + var prefix = window.location.pathname.search(/console/) > 0 ? "connection-manager/" : ""; + var instance = jsPlumb.getInstance({ // ConnectionOverlays: [ // [ "Label", { label: "FOO", id: "label", cssClass: "connectionLabel", enabled: false } ] // ], - Container: "main" + Container: "graph" }); instance.registerEndpointType("disabled", { paintStyle: { strokeStyle: "red" } }); @@ -62,7 +64,7 @@ jsPlumb.ready(function() { } // Add the node to the document - node.appendTo($("#main")); + node.appendTo($("#graph")); // Make it draggable instance.draggable(node); @@ -94,7 +96,7 @@ jsPlumb.ready(function() { } } - $.ajax("currentState", { + $.ajax(prefix + "currentState", { success: function(data) { instance.batch(function() { for(ix in data.endpoints) { @@ -138,7 +140,7 @@ jsPlumb.ready(function() { type: "POST", contentType: 'application/json', processData: false, - url: "connect", + url: prefix + "connect", data: JSON.stringify({ source: params.sourceEndpoint.getUuid(), target: params.targetEndpoint.getUuid() }), }); }); @@ -149,7 +151,7 @@ jsPlumb.ready(function() { type: "POST", contentType: 'application/json', processData: false, - url: "disconnect", + url: prefix + "disconnect", data: JSON.stringify({ source: params.sourceEndpoint.getUuid(), target: params.targetEndpoint.getUuid() }), }); } @@ -159,7 +161,7 @@ jsPlumb.ready(function() { }); $('#autoconnect').click(function() { - $.ajax("autoconnect", { + $.ajax(prefix + "autoconnect", { success: function(data) { window.location.reload(); } diff --git a/flexiblepower.ui.connectionspage/res/widgets/DashboardWidget/style.css b/flexiblepower.ui.connectionspage/res/widgets/DashboardWidget/style.css new file mode 100755 index 0000000..9820074 --- /dev/null +++ b/flexiblepower.ui.connectionspage/res/widgets/DashboardWidget/style.css @@ -0,0 +1,113 @@ +#graph { + user-select: none; + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + position: absolute; + top: 150px; + bottom: 130px; + left: 0px; + right: 320px; + padding: 1em; + overflow: auto; + background: white; +} + +#properties { + position: absolute; + top: 150px; + bottom: 130px; + right: 0; + padding: 1em; + width: 300px; + overflow: auto; + background: white; + border-left: 2px solid #33333; + z-index: 30; +} + +#properties input { + width: 100%; +} + +#properties h1 { + width: 100%; + font-size: 150%; + padding-top: 1em; + padding-bottom: .5em; + margin-bottom: .5em; + border-bottom: 1px dotted black; +} + +#properties p { + line-height: 1.3em; +} + +.node { + position: absolute; + padding: 1em 0.5em; + z-index: 20; + cursor: pointer; + + text-align: center; + color: white; + line-height: 1.1em; + overflow: auto; + + background-color: rgb(68,79,85); + opacity: 0.8; + + border: 5px solid rgb(161,168,171); + -moz-border-radius: 1em; + border-radius: 1em; +} + +.node p { + width: 100%; + overflow: hidden; + padding: 0; + margin: 0; +} + +.node p.small { + font-size: 70%; +} + +#graph ._jsPlumb_connector { + z-index: 4; +} + +#graph ._jsPlumb_endpoint { + z-index: 22; + cursor: pointer; + opacity: 0.5; +} + +#graph ._jsPlumb_endpoint._jsPlumb_hover { + opacity: 0.7; +} + +#graph ._jsPlumb_overlay { + z-index: 21; + font-weight: bold !important; +} + +/* Specific stuff for the felix webconsole layout */ +.ui-widget #graph { + top: 120px; + left: 96px; + right: 416px; + bottom: 0; +} + +.ui-widget #properties { + top: 120px; + right: 96px; + width: 300px; + bottom: 0; +} + +#navmenu li ul { + z-index: 30; +} \ No newline at end of file diff --git a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/BaseWidget.java b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/BaseWidget.java new file mode 100755 index 0000000..1451d3a --- /dev/null +++ b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/BaseWidget.java @@ -0,0 +1,76 @@ +package org.flexiblepower.runtime.ui.connectionspage; + +import org.flexiblepower.messaging.ConnectionManager; +import org.flexiblepower.messaging.ConnectionManager.EndpointPort; +import org.flexiblepower.messaging.ConnectionManager.ManagedEndpoint; +import org.flexiblepower.messaging.ConnectionManager.PotentialConnection; +import org.osgi.framework.BundleContext; + +public class BaseWidget { + + private final ConnectionManager connectionManager; + private final BundleContext bunleContext; + + public BaseWidget(ConnectionManager connectionManager, BundleContext bunleContext) { + this.connectionManager = connectionManager; + this.bunleContext = bunleContext; + } + + public ConnectionManagerState currentState() { + ConnectionManagerState state = new ConnectionManagerState(connectionManager, bunleContext); + state.performLayout(); + return state; + } + + public void autoconnect() { + connectionManager.autoConnect(); + } + + public boolean connect(ConnectionInfo info) { + if (info.getSourceEndpoint() == null || info.getTargetEndpoint() == null) { + return false; + } + + ManagedEndpoint sourceEndpoint = connectionManager.getEndpoint(info.getSourceEndpoint()); + ManagedEndpoint targetEndpoint = connectionManager.getEndpoint(info.getTargetEndpoint()); + + if (sourceEndpoint != null && targetEndpoint != null) { + EndpointPort sourcePort = sourceEndpoint.getPort(info.getSourcePort()); + EndpointPort targetPort = targetEndpoint.getPort(info.getTargetPort()); + + if (sourcePort != null && targetPort != null) { + PotentialConnection connection = sourcePort.getPotentialConnection(targetPort); + if (connection != null && connection.isConnectable()) { + connection.connect(); + return true; + } + } + } + + return false; + } + + public boolean disconnect(ConnectionInfo info) { + if (info.getSourceEndpoint() == null || info.getTargetEndpoint() == null) { + return false; + } + + ManagedEndpoint sourceEndpoint = connectionManager.getEndpoint(info.getSourceEndpoint()); + ManagedEndpoint targetEndpoint = connectionManager.getEndpoint(info.getTargetEndpoint()); + + if (sourceEndpoint != null && targetEndpoint != null) { + EndpointPort sourcePort = sourceEndpoint.getPort(info.getSourcePort()); + EndpointPort targetPort = targetEndpoint.getPort(info.getTargetPort()); + + if (sourcePort != null && targetPort != null) { + PotentialConnection connection = sourcePort.getPotentialConnection(targetPort); + if (connection != null && connection.isConnected()) { + connection.disconnect(); + return true; + } + } + } + + return false; + } +} diff --git a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionInfo.java b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionInfo.java new file mode 100755 index 0000000..6533735 --- /dev/null +++ b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionInfo.java @@ -0,0 +1,29 @@ +package org.flexiblepower.runtime.ui.connectionspage; + +public class ConnectionInfo { + private String source, target; + + public void setSource(String source) { + this.source = source; + } + + public void setTarget(String target) { + this.target = target; + } + + public String getSourceEndpoint() { + return source.substring(0, source.lastIndexOf(':')); + } + + public String getSourcePort() { + return source.substring(source.lastIndexOf(':') + 1); + } + + public String getTargetEndpoint() { + return target.substring(0, target.lastIndexOf(':')); + } + + public String getTargetPort() { + return target.substring(target.lastIndexOf(':') + 1); + } +} \ No newline at end of file diff --git a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerPage.java b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerPage.java deleted file mode 100755 index c6637b7..0000000 --- a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerPage.java +++ /dev/null @@ -1,373 +0,0 @@ -package org.flexiblepower.runtime.ui.connectionspage; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; - -import org.flexiblepower.messaging.Cardinality; -import org.flexiblepower.messaging.ConnectionManager; -import org.flexiblepower.messaging.ConnectionManager.EndpointPort; -import org.flexiblepower.messaging.ConnectionManager.ManagedEndpoint; -import org.flexiblepower.messaging.ConnectionManager.PotentialConnection; -import org.flexiblepower.messaging.Endpoint; -import org.flexiblepower.ui.Widget; -import org.osgi.framework.BundleContext; -import org.osgi.framework.InvalidSyntaxException; -import org.osgi.framework.ServiceReference; - -import aQute.bnd.annotation.component.Activate; -import aQute.bnd.annotation.component.Component; -import aQute.bnd.annotation.component.Reference; - -@Component(properties = { "widget.type=full", "widget.name=connection-manager" }) -public class ConnectionManagerPage implements Widget { - public static final int SMALL_WIDTH = 160, BIG_WIDTH = 320; - public static final int HEIGHT = 80; - public static final int MARGIN_HOR = 80, MARGIN_VER = 120; - - public static final Set BANNED_KEYS = Collections.unmodifiableSet(new HashSet(Arrays.asList("component.id", - "component.name", - "objectClass", - "service.factoryPid", - "service.pid", - "service.id"))); - - public static class PortState implements Comparable { - private final String id; - private final Set potentialConnections; - private final boolean isMultiple; - - public PortState(EndpointPort port) { - id = port.getName(); - potentialConnections = new TreeSet(); - for (PotentialConnection conn : port.getPotentialConnections().values()) { - potentialConnections.add(conn.getOtherEnd(port).toString()); - } - isMultiple = port.getCardinality() == Cardinality.MULTIPLE; - } - - @Override - public int compareTo(PortState o) { - return id.compareTo(o.id); - } - - public String getId() { - return id; - } - - public Set getPotentialConnections() { - return potentialConnections; - } - - public boolean isMultiple() { - return isMultiple; - } - } - - public static class EndpointState implements Comparable { - private final String id; - private final Set ports; - private final Set properties; - private final Map style; - - public EndpointState(BundleContext context, ManagedEndpoint endpoint) { - id = endpoint.getPid(); - ports = new TreeSet(); - for (EndpointPort port : endpoint.getPorts().values()) { - ports.add(new PortState(port)); - } - properties = new TreeSet(); - - try { - Collection> references = context.getServiceReferences(org.flexiblepower.messaging.Endpoint.class, - "(service.pid=" + id - + ")"); - if (references != null && references.size() > 0) { - ServiceReference serviceReference = references.iterator().next(); - for (String key : serviceReference.getPropertyKeys()) { - if (!BANNED_KEYS.contains(key)) { - properties.add(key + " = " + serviceReference.getProperty(key)); - } - } - } - } catch (InvalidSyntaxException e) { - } - - style = new HashMap(); - style.put("width", getWidth() + "px"); - style.put("height", HEIGHT + "px"); - } - - int getWidth() { - return ports.size() > 2 ? BIG_WIDTH : SMALL_WIDTH; - } - - public String getId() { - return id; - } - - public Set getPorts() { - return ports; - } - - public Set getProperties() { - return properties; - } - - public Map getStyle() { - return style; - } - - @Override - public int compareTo(EndpointState o) { - return id.compareTo(o.id); - } - - void setStyle(String key, String value) { - style.put(key, value); - } - } - - public static class State { - private final Set endpoints; - private final Set activeConnections; - - public State(ConnectionManager connectionManager, BundleContext context) { - endpoints = new TreeSet(); - for (ManagedEndpoint ep : connectionManager.getEndpoints().values()) { - endpoints.add(new EndpointState(context, ep)); - } - - activeConnections = new TreeSet(); - for (ManagedEndpoint ep : connectionManager.getEndpoints().values()) { - for (EndpointPort port : ep.getPorts().values()) { - for (PotentialConnection conn : port.getPotentialConnections().values()) { - if (conn.isConnected()) { - activeConnections.add(conn.toString()); - } - } - } - } - } - - private Set nextLayer(Set lastLayer, Set toLayout) { - Set nextLayer = new TreeSet(); - - for (EndpointState eps : lastLayer) { - for (PortState ps : eps.getPorts()) { - for (String conn : ps.getPotentialConnections()) { - String endpointId = conn.substring(0, conn.lastIndexOf(':')); - - for (Iterator it = toLayout.iterator(); it.hasNext();) { - EndpointState otherEps = it.next(); - if (otherEps.getId().equals(endpointId)) { - nextLayer.add(otherEps); - it.remove(); - break; - } - } - } - } - } - - return nextLayer; - } - - private int[] determineWidths(List> layout) { - int[] result = new int[layout.size()]; - int ix = 0; - for (Set set : layout) { - int width = -MARGIN_HOR; // Subtract 1 margin - for (EndpointState eps : set) { - width += eps.getWidth() + MARGIN_HOR; - } - result[ix++] = width; - } - return result; - } - - public void performLayout() { - Set toLayout = new TreeSet(endpoints); - - int leftSide = 50; - while (!toLayout.isEmpty()) { - List> layout = new ArrayList>(); - - // First find a starting point by the one with the most ports - int max = -1; - EndpointState start = null; - for (EndpointState eps : toLayout) { - int total = eps.getPorts().size(); - if (total > max) { - max = total; - start = eps; - } - } - - // Determine the first layer by only this node - Set firstLayer = Collections.singleton(start); - toLayout.remove(start); - layout.add(firstLayer); - Set lastLayer = firstLayer; - - // Now determine the next layers - while (true) { - Set nextLayer = nextLayer(lastLayer, toLayout); - if (nextLayer.isEmpty()) { - break; - } - layout.add(nextLayer); - lastLayer = nextLayer; - } - - // Determine the maximum width and width of each layer - int maxWidth = 0; - int[] widths = determineWidths(layout); - for (int x : widths) { - if (x > maxWidth) { - maxWidth = x; - } - } - - // Now perform the real layout - for (int ix = 0; ix < layout.size(); ix++) { - Set layer = layout.get(ix); - int top = MARGIN_VER / 2 + ix * (MARGIN_VER + HEIGHT); - int left = leftSide + (maxWidth - widths[ix]) / 2; - - for (EndpointState endpointState : layer) { - endpointState.setStyle("top", top + "px"); - endpointState.setStyle("left", left + "px"); - - left += endpointState.getWidth() + MARGIN_HOR; - } - } - - leftSide += maxWidth + MARGIN_HOR; - } - } - - public Set getEndpoints() { - return endpoints; - } - - public Set getActiveConnections() { - return activeConnections; - } - } - - private ConnectionManager connectionManager; - - @Reference - public void setConnectionManager(ConnectionManager connectionManager) { - this.connectionManager = connectionManager; - } - - private BundleContext bunleContext; - - @Activate - public void activate(BundleContext bundleContext) { - bunleContext = bundleContext; - } - - public State currentState() { - State state = new State(connectionManager, bunleContext); - state.performLayout(); - return state; - } - - public void autoconnect() { - connectionManager.autoConnect(); - } - - public static class ConnectionInfo { - private String source, target; - - public void setSource(String source) { - this.source = source; - } - - public void setTarget(String target) { - this.target = target; - } - - public String getSourceEndpoint() { - return source.substring(0, source.lastIndexOf(':')); - } - - public String getSourcePort() { - return source.substring(source.lastIndexOf(':') + 1); - } - - public String getTargetEndpoint() { - return target.substring(0, target.lastIndexOf(':')); - } - - public String getTargetPort() { - return target.substring(target.lastIndexOf(':') + 1); - } - } - - public boolean connect(ConnectionInfo info) { - if (info.getSourceEndpoint() == null || info.getTargetEndpoint() == null) { - return false; - } - - ManagedEndpoint sourceEndpoint = connectionManager.getEndpoint(info.getSourceEndpoint()); - ManagedEndpoint targetEndpoint = connectionManager.getEndpoint(info.getTargetEndpoint()); - - if (sourceEndpoint != null && targetEndpoint != null) { - EndpointPort sourcePort = sourceEndpoint.getPort(info.getSourcePort()); - EndpointPort targetPort = targetEndpoint.getPort(info.getTargetPort()); - - if (sourcePort != null && targetPort != null) { - PotentialConnection connection = sourcePort.getPotentialConnection(targetPort); - if (connection != null && connection.isConnectable()) { - connection.connect(); - return true; - } - } - } - - return false; - } - - public boolean disconnect(ConnectionInfo info) { - if (info.getSourceEndpoint() == null || info.getTargetEndpoint() == null) { - return false; - } - - ManagedEndpoint sourceEndpoint = connectionManager.getEndpoint(info.getSourceEndpoint()); - ManagedEndpoint targetEndpoint = connectionManager.getEndpoint(info.getTargetEndpoint()); - - if (sourceEndpoint != null && targetEndpoint != null) { - EndpointPort sourcePort = sourceEndpoint.getPort(info.getSourcePort()); - EndpointPort targetPort = targetEndpoint.getPort(info.getTargetPort()); - - if (sourcePort != null && targetPort != null) { - PotentialConnection connection = sourcePort.getPotentialConnection(targetPort); - if (connection != null && connection.isConnected()) { - connection.disconnect(); - return true; - } - } - } - - return false; - } - - @Override - public String getTitle(Locale locale) { - return "Connection Manager"; - } - -} diff --git a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerState.java b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerState.java new file mode 100755 index 0000000..3ac6bd5 --- /dev/null +++ b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionManagerState.java @@ -0,0 +1,146 @@ +package org.flexiblepower.runtime.ui.connectionspage; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +import org.flexiblepower.messaging.ConnectionManager; +import org.flexiblepower.messaging.ConnectionManager.EndpointPort; +import org.flexiblepower.messaging.ConnectionManager.ManagedEndpoint; +import org.flexiblepower.messaging.ConnectionManager.PotentialConnection; +import org.osgi.framework.BundleContext; + +public class ConnectionManagerState { + public static final int SMALL_WIDTH = 160, BIG_WIDTH = 320; + public static final int HEIGHT = 80; + public static final int MARGIN_HOR = 80, MARGIN_VER = 120; + + private final Set endpoints; + private final Set activeConnections; + + public ConnectionManagerState(ConnectionManager connectionManager, BundleContext context) { + endpoints = new TreeSet(); + for (ManagedEndpoint ep : connectionManager.getEndpoints().values()) { + endpoints.add(new EndpointState(context, ep)); + } + + activeConnections = new TreeSet(); + for (ManagedEndpoint ep : connectionManager.getEndpoints().values()) { + for (EndpointPort port : ep.getPorts().values()) { + for (PotentialConnection conn : port.getPotentialConnections().values()) { + if (conn.isConnected()) { + activeConnections.add(conn.toString()); + } + } + } + } + } + + private Set nextLayer(Set lastLayer, Set toLayout) { + Set nextLayer = new TreeSet(); + + for (EndpointState eps : lastLayer) { + for (PortState ps : eps.getPorts()) { + for (String conn : ps.getPotentialConnections()) { + String endpointId = conn.substring(0, conn.lastIndexOf(':')); + + for (Iterator it = toLayout.iterator(); it.hasNext();) { + EndpointState otherEps = it.next(); + if (otherEps.getId().equals(endpointId)) { + nextLayer.add(otherEps); + it.remove(); + break; + } + } + } + } + } + + return nextLayer; + } + + private int[] determineWidths(List> layout) { + int[] result = new int[layout.size()]; + int ix = 0; + for (Set set : layout) { + int width = -MARGIN_HOR; // Subtract 1 margin + for (EndpointState eps : set) { + width += eps.getWidth() + MARGIN_HOR; + } + result[ix++] = width; + } + return result; + } + + public void performLayout() { + Set toLayout = new TreeSet(endpoints); + + int leftSide = 50; + while (!toLayout.isEmpty()) { + List> layout = new ArrayList>(); + + // First find a starting point by the one with the most ports + int max = -1; + EndpointState start = null; + for (EndpointState eps : toLayout) { + int total = eps.getPorts().size(); + if (total > max) { + max = total; + start = eps; + } + } + + // Determine the first layer by only this node + Set firstLayer = Collections.singleton(start); + toLayout.remove(start); + layout.add(firstLayer); + Set lastLayer = firstLayer; + + // Now determine the next layers + while (true) { + Set nextLayer = nextLayer(lastLayer, toLayout); + if (nextLayer.isEmpty()) { + break; + } + layout.add(nextLayer); + lastLayer = nextLayer; + } + + // Determine the maximum width and width of each layer + int maxWidth = 0; + int[] widths = determineWidths(layout); + for (int x : widths) { + if (x > maxWidth) { + maxWidth = x; + } + } + + // Now perform the real layout + for (int ix = 0; ix < layout.size(); ix++) { + Set layer = layout.get(ix); + int top = MARGIN_VER / 2 + ix * (MARGIN_VER + HEIGHT); + int left = leftSide + (maxWidth - widths[ix]) / 2; + + for (EndpointState endpointState : layer) { + endpointState.setStyle("top", top + "px"); + endpointState.setStyle("left", left + "px"); + + left += endpointState.getWidth() + MARGIN_HOR; + } + } + + leftSide += maxWidth + MARGIN_HOR; + } + } + + public Set getEndpoints() { + return endpoints; + } + + public Set getActiveConnections() { + return activeConnections; + } +} diff --git a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionsPage.java b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionsPage.java new file mode 100755 index 0000000..6cfaa86 --- /dev/null +++ b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionsPage.java @@ -0,0 +1,86 @@ +package org.flexiblepower.runtime.ui.connectionspage; + +import java.util.Hashtable; +import java.util.Map; + +import javax.servlet.Servlet; + +import org.flexiblepower.messaging.ConnectionManager; +import org.flexiblepower.ui.Widget; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; + +import aQute.bnd.annotation.component.Activate; +import aQute.bnd.annotation.component.Component; +import aQute.bnd.annotation.component.ConfigurationPolicy; +import aQute.bnd.annotation.component.Deactivate; +import aQute.bnd.annotation.component.Reference; +import aQute.bnd.annotation.metatype.Configurable; +import aQute.bnd.annotation.metatype.Meta; + +@Component(designate = ConnectionsPage.Config.class, configurationPolicy = ConfigurationPolicy.optional) +public class ConnectionsPage { + @Meta.OCD(description = "Configuration for the ConnectionManager widgets", + name = "ConnectionManager UI Configuration") + public interface Config { + @Meta.AD(deflt = "true", description = "Should the plugin be shown in the felix dashboard?", required = false) + boolean felixPluginActive(); + + @Meta.AD(deflt = "false", description = "Should the plugin be shown in the FPAI dashboard?", required = false) + boolean dashboardWidgetActive(); + } + + private ConnectionManager connectionManager; + private ServiceRegistration dashboardWidgetRegistration; + private ServiceRegistration felixPluginRegistration; + + @Reference + public void setConnectionManager(ConnectionManager connectionManager) { + this.connectionManager = connectionManager; + } + + @Activate + public void activate(BundleContext context, Map properties) { + Config config = Configurable.createConfigurable(Config.class, properties); + + if (config.dashboardWidgetActive()) { + try { + DashboardWidget dashboardWidget = new DashboardWidget(connectionManager, context); + + Hashtable widgetProperties = new Hashtable(); + widgetProperties.put("widget.type", "full"); + widgetProperties.put("widget.name", "connection-manager"); + dashboardWidgetRegistration = context.registerService(Widget.class, dashboardWidget, widgetProperties); + } catch (NoClassDefFoundError error) { + // this could happen if there is no FPAI dashboard loaded, just ignore the start then + } + } + + if (config.felixPluginActive()) { + try { + FelixPlugin felixPlugin = new FelixPlugin(connectionManager, context); + + Hashtable widgetProperties = new Hashtable(); + widgetProperties.put("felix.webconsole.category", "FPAI"); + widgetProperties.put("felix.webconsole.label", felixPlugin.getLabel()); + widgetProperties.put("felix.webconsole.title", felixPlugin.getTitle()); + felixPluginRegistration = context.registerService(Servlet.class, felixPlugin, widgetProperties); + } catch (NoClassDefFoundError error) { + // this could happen if there is no felix dashboard loaded, just ignore the start then + } + } + } + + @Deactivate + public void deactivate() { + if (dashboardWidgetRegistration != null) { + dashboardWidgetRegistration.unregister(); + dashboardWidgetRegistration = null; + } + + if (felixPluginRegistration != null) { + felixPluginRegistration.unregister(); + felixPluginRegistration = null; + } + } +} diff --git a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/DashboardWidget.java b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/DashboardWidget.java new file mode 100755 index 0000000..cf66c2c --- /dev/null +++ b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/DashboardWidget.java @@ -0,0 +1,18 @@ +package org.flexiblepower.runtime.ui.connectionspage; + +import java.util.Locale; + +import org.flexiblepower.messaging.ConnectionManager; +import org.flexiblepower.ui.Widget; +import org.osgi.framework.BundleContext; + +public class DashboardWidget extends BaseWidget implements Widget { + public DashboardWidget(ConnectionManager connectionManager, BundleContext bundleContext) { + super(connectionManager, bundleContext); + } + + @Override + public String getTitle(Locale locale) { + return "Connection Manager"; + } +} diff --git a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/EndpointState.java b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/EndpointState.java new file mode 100755 index 0000000..8650d4b --- /dev/null +++ b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/EndpointState.java @@ -0,0 +1,88 @@ +package org.flexiblepower.runtime.ui.connectionspage; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; + +import org.flexiblepower.messaging.ConnectionManager.EndpointPort; +import org.flexiblepower.messaging.ConnectionManager.ManagedEndpoint; +import org.flexiblepower.messaging.Endpoint; +import org.osgi.framework.BundleContext; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; + +public class EndpointState implements Comparable { + public static final Set BANNED_KEYS = Collections.unmodifiableSet(new HashSet(Arrays.asList("component.id", + "component.name", + "objectClass", + "service.factoryPid", + "service.pid", + "service.id"))); + + private final String id; + private final Set ports; + private final Set properties; + private final Map style; + + public EndpointState(BundleContext context, ManagedEndpoint endpoint) { + id = endpoint.getPid(); + ports = new TreeSet(); + for (EndpointPort port : endpoint.getPorts().values()) { + ports.add(new PortState(port)); + } + properties = new TreeSet(); + + try { + Collection> references = context.getServiceReferences(org.flexiblepower.messaging.Endpoint.class, + "(service.pid=" + id + + ")"); + if (references != null && references.size() > 0) { + ServiceReference serviceReference = references.iterator().next(); + for (String key : serviceReference.getPropertyKeys()) { + if (!BANNED_KEYS.contains(key)) { + properties.add(key + " = " + serviceReference.getProperty(key)); + } + } + } + } catch (InvalidSyntaxException e) { + } + + style = new HashMap(); + style.put("width", getWidth() + "px"); + style.put("height", ConnectionManagerState.HEIGHT + "px"); + } + + int getWidth() { + return ports.size() > 2 ? ConnectionManagerState.BIG_WIDTH : ConnectionManagerState.SMALL_WIDTH; + } + + public String getId() { + return id; + } + + public Set getPorts() { + return ports; + } + + public Set getProperties() { + return properties; + } + + public Map getStyle() { + return style; + } + + @Override + public int compareTo(EndpointState o) { + return id.compareTo(o.id); + } + + void setStyle(String key, String value) { + style.put(key, value); + } +} diff --git a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/FelixPlugin.java b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/FelixPlugin.java new file mode 100755 index 0000000..05e7b6a --- /dev/null +++ b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/FelixPlugin.java @@ -0,0 +1,97 @@ +package org.flexiblepower.runtime.ui.connectionspage; + +import java.io.IOException; +import java.io.PrintWriter; +import java.net.URL; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.IOUtils; +import org.apache.felix.webconsole.AbstractWebConsolePlugin; +import org.flexiblepower.messaging.ConnectionManager; +import org.osgi.framework.BundleContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.Gson; +import com.google.gson.JsonIOException; + +public class FelixPlugin extends AbstractWebConsolePlugin { + private static final long serialVersionUID = 7228578256793242058L; + private static final Logger logger = LoggerFactory.getLogger(FelixPlugin.class); + + private final BaseWidget base; + + public FelixPlugin(ConnectionManager connectionManager, BundleContext context) { + base = new DashboardWidget(connectionManager, context); + activate(context); + } + + @Override + public String getLabel() { + return "connection-manager"; + } + + @Override + public String getTitle() { + return "ConnectionManager"; + } + + @Override + protected String[] getCssReferences() { + return new String[] { getLabel() + "/style.css" }; + } + + @Override + protected void renderContent(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + PrintWriter w = resp.getWriter(); + w.println("
"); + w.println("
"); + w.println(""); + w.println("

Properties of <no selection>

"); + w.println("
"); + w.println(""); + w.println(""); + } + + @Override + protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String path = req.getPathInfo(); + if (path == null || path.length() <= getLabel().length() + 2) { + super.service(req, resp); + } else { + path = path.substring(getLabel().length() + 2); + + URL url = getBundle().getEntry("widgets/DashboardWidget/" + path); + if (url != null) { + serve(url, resp); + } else if (path.equals("autoconnect")) { + base.autoconnect(); + } else if (path.equals("connect")) { + send(base.connect(new Gson().fromJson(req.getReader(), ConnectionInfo.class)), resp); + } else if (path.equals("disconnect")) { + send(base.disconnect(new Gson().fromJson(req.getReader(), ConnectionInfo.class)), resp); + } else if (path.equals("currentState")) { + send(base.currentState(), resp); + } + } + } + + private void send(Object result, HttpServletResponse resp) throws JsonIOException, IOException { + resp.setContentType("application/json"); + new Gson().toJson(result, resp.getWriter()); + } + + private void serve(URL url, HttpServletResponse resp) throws IOException { + if (url.getFile().endsWith(".css")) { + resp.setContentType("text/css"); + } else if (url.getFile().endsWith(".js")) { + resp.setContentType("application/javascript"); + } + + IOUtils.copy(url.openStream(), resp.getWriter()); + logger.debug("Served from url: " + url); + } +} diff --git a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/PortState.java b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/PortState.java new file mode 100755 index 0000000..ee76a15 --- /dev/null +++ b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/PortState.java @@ -0,0 +1,40 @@ +package org.flexiblepower.runtime.ui.connectionspage; + +import java.util.Set; +import java.util.TreeSet; + +import org.flexiblepower.messaging.Cardinality; +import org.flexiblepower.messaging.ConnectionManager.EndpointPort; +import org.flexiblepower.messaging.ConnectionManager.PotentialConnection; + +public class PortState implements Comparable { + private final String id; + private final Set potentialConnections; + private final boolean isMultiple; + + public PortState(EndpointPort port) { + id = port.getName(); + potentialConnections = new TreeSet(); + for (PotentialConnection conn : port.getPotentialConnections().values()) { + potentialConnections.add(conn.getOtherEnd(port).toString()); + } + isMultiple = port.getCardinality() == Cardinality.MULTIPLE; + } + + @Override + public int compareTo(PortState o) { + return id.compareTo(o.id); + } + + public String getId() { + return id; + } + + public Set getPotentialConnections() { + return potentialConnections; + } + + public boolean isMultiple() { + return isMultiple; + } +} From 7bb89bec0ce14a95e4da96da9fb7a7939b01c509 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 28 Apr 2015 12:06:29 +0200 Subject: [PATCH 086/105] Copied some of the settings --- copy_settings.sh | 4 ++++ .../.settings/org.eclipse.jdt.core.prefs | 4 ---- flexiblepower.ui/.settings/org.eclipse.jdt.core.prefs | 4 ---- 3 files changed, 4 insertions(+), 8 deletions(-) create mode 100755 copy_settings.sh diff --git a/copy_settings.sh b/copy_settings.sh new file mode 100755 index 0000000..f7d0bda --- /dev/null +++ b/copy_settings.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +echo flexiblepower.* | xargs -n 1 cp flexiblepower.ral/.checkstyle 2> /dev/null +echo flexiblepower.*/.settings/ | xargs -n 1 cp flexiblepower.ral/.settings/* 2> /dev/null diff --git a/flexiblepower.runtime.test/.settings/org.eclipse.jdt.core.prefs b/flexiblepower.runtime.test/.settings/org.eclipse.jdt.core.prefs index 32c9400..7a9b0a6 100644 --- a/flexiblepower.runtime.test/.settings/org.eclipse.jdt.core.prefs +++ b/flexiblepower.runtime.test/.settings/org.eclipse.jdt.core.prefs @@ -1,11 +1,7 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning diff --git a/flexiblepower.ui/.settings/org.eclipse.jdt.core.prefs b/flexiblepower.ui/.settings/org.eclipse.jdt.core.prefs index 32c9400..7a9b0a6 100644 --- a/flexiblepower.ui/.settings/org.eclipse.jdt.core.prefs +++ b/flexiblepower.ui/.settings/org.eclipse.jdt.core.prefs @@ -1,11 +1,7 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning From 347a59c8a1b9fce0e66a9dfbfe98b8e7f43b9dff Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 28 Apr 2015 13:14:16 +0200 Subject: [PATCH 087/105] Added more checks to see if it is a valid connection --- .../flexiblepower/runtime/ui/connectionspage/BaseWidget.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/BaseWidget.java b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/BaseWidget.java index 1451d3a..fa89a65 100755 --- a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/BaseWidget.java +++ b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/BaseWidget.java @@ -27,7 +27,7 @@ public void autoconnect() { } public boolean connect(ConnectionInfo info) { - if (info.getSourceEndpoint() == null || info.getTargetEndpoint() == null) { + if (info == null || info.getSourceEndpoint() == null || info.getTargetEndpoint() == null) { return false; } @@ -51,7 +51,7 @@ public boolean connect(ConnectionInfo info) { } public boolean disconnect(ConnectionInfo info) { - if (info.getSourceEndpoint() == null || info.getTargetEndpoint() == null) { + if (info == null || info.getSourceEndpoint() == null || info.getTargetEndpoint() == null) { return false; } From 715d2766be1138e778a014e191de348c1cefcf5e Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 28 Apr 2015 13:15:42 +0200 Subject: [PATCH 088/105] Shortened the name for the connections in the menu --- .../runtime/ui/connectionspage/DashboardWidget.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/DashboardWidget.java b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/DashboardWidget.java index cf66c2c..fafe6b8 100755 --- a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/DashboardWidget.java +++ b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/DashboardWidget.java @@ -13,6 +13,6 @@ public DashboardWidget(ConnectionManager connectionManager, BundleContext bundle @Override public String getTitle(Locale locale) { - return "Connection Manager"; + return "Connections"; } } From a7c34fd218dbd768629587173275652f23d1a1fc Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 28 Apr 2015 15:44:08 +0200 Subject: [PATCH 089/105] Changed the dependancy to use the jar. Weird eclipse error when using project dependancies --- flexiblepower.runtime.simulation/bnd.bnd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flexiblepower.runtime.simulation/bnd.bnd b/flexiblepower.runtime.simulation/bnd.bnd index 1c38897..b38fbe9 100644 --- a/flexiblepower.runtime.simulation/bnd.bnd +++ b/flexiblepower.runtime.simulation/bnd.bnd @@ -1,4 +1,4 @@ --buildpath: ${default-buildpath}, flexiblepower.runtime;version=project +-buildpath: ${default-buildpath}, flexiblepower.runtime;version=latest -testpath: ${test-buildpath} Bundle-Version: 3.0.0.${qualifier} From 523b9cbd730020c0e0b8cf3263df2a74f390949d Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 28 Apr 2015 16:25:27 +0200 Subject: [PATCH 090/105] Fixed the simulation such that it will always start correctly Also made sure the testcase never runs without end --- .../simulation/context/SimulationClock.java | 10 +++++----- .../simulation/context/SimulationContext.java | 14 ++++++-------- .../simulation/test/SchedulerTest.java | 5 ++++- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/flexiblepower.runtime.simulation/src/org/flexiblepower/simulation/context/SimulationClock.java b/flexiblepower.runtime.simulation/src/org/flexiblepower/simulation/context/SimulationClock.java index 47a4f87..36d905e 100644 --- a/flexiblepower.runtime.simulation/src/org/flexiblepower/simulation/context/SimulationClock.java +++ b/flexiblepower.runtime.simulation/src/org/flexiblepower/simulation/context/SimulationClock.java @@ -11,11 +11,11 @@ public class SimulationClock { private static final Logger logger = LoggerFactory.getLogger(SimulationClock.class); - private long simulationStartTime; - private long simulationStopTime; - private long wallStartTime; - private double speedFactor; - private Simulation.State state; + private volatile long simulationStartTime; + private volatile long simulationStopTime; + private volatile long wallStartTime; + private volatile double speedFactor; + private volatile Simulation.State state; public SimulationClock() { state = Simulation.State.STOPPED; diff --git a/flexiblepower.runtime.simulation/src/org/flexiblepower/simulation/context/SimulationContext.java b/flexiblepower.runtime.simulation/src/org/flexiblepower/simulation/context/SimulationContext.java index bbcc0d9..172a045 100644 --- a/flexiblepower.runtime.simulation/src/org/flexiblepower/simulation/context/SimulationContext.java +++ b/flexiblepower.runtime.simulation/src/org/flexiblepower/simulation/context/SimulationContext.java @@ -53,8 +53,8 @@ public Date currentTime() { @Override public void run() { while (running.get()) { - if (simulationClock.isRunning() || simulationClock.isStopping()) { - synchronized (jobs) { + synchronized (jobs) { + if (simulationClock.isRunning() || simulationClock.isStopping()) { long now = simulationClock.getCurrentTimeMillis(); logger.trace("Simulation step {}", now); long waitTime = getNextJobTime() - now; @@ -82,15 +82,13 @@ public void run() { } isWaiting = false; } - } - } else { - // Wait for simulation start - try { - synchronized (jobs) { + } else { + // Wait for simulation start + try { jobs.wait(); currentTime = simulationClock.getSimulationStartTime(); + } catch (InterruptedException e) { } - } catch (InterruptedException e) { } } } diff --git a/flexiblepower.runtime.simulation/test/org/flexiblepower/simulation/test/SchedulerTest.java b/flexiblepower.runtime.simulation/test/org/flexiblepower/simulation/test/SchedulerTest.java index f74f422..7e5815c 100644 --- a/flexiblepower.runtime.simulation/test/org/flexiblepower/simulation/test/SchedulerTest.java +++ b/flexiblepower.runtime.simulation/test/org/flexiblepower/simulation/test/SchedulerTest.java @@ -35,14 +35,17 @@ public void run() { scheduler.startSimulation(startDate, endDate, 60); long startTime = System.currentTimeMillis(); - while (scheduler.getSimulationClockState() != Simulation.State.STOPPED) { + while (scheduler.getSimulationClockState() != Simulation.State.STOPPED && System.currentTimeMillis() - startTime < 10000) { Thread.sleep(10); } long duration = System.currentTimeMillis() - startTime; + assertEquals(Simulation.State.STOPPED, scheduler.getSimulationClockState()); assertEquals(60, runCounter.get()); System.out.printf("Running took %dms, expected around 1 sec%n", duration); assertTrue(duration > 950 && duration < 1150); + + scheduler.deactivate(); } public void testStopping() throws Exception { From 85adc92b2ab1bce0cea929a6277a60a32cb9cace Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 28 Apr 2015 16:41:35 +0200 Subject: [PATCH 091/105] Fixed the SimulationTimeWidget again! --- flexiblepower.runtime.simulation/bnd.bnd | 6 +- .../res/widgets/SimulatedTimeWidget/clock.png | Bin 0 -> 5286 bytes .../widgets/SimulatedTimeWidget/index.html | 29 +++-- .../res/widgets/SimulatedTimeWidget/script.js | 10 +- .../simulation/ui/SimulatedTimeWidget.java | 116 ++++++++++++++++++ flexiblepower.runtime.simulation/test.bndrun | 46 +++++-- flexiblepower.ui/run.bndrun | 38 ------ 7 files changed, 182 insertions(+), 63 deletions(-) create mode 100755 flexiblepower.runtime.simulation/res/widgets/SimulatedTimeWidget/clock.png create mode 100755 flexiblepower.runtime.simulation/src/org/flexiblepower/simulation/ui/SimulatedTimeWidget.java delete mode 100644 flexiblepower.ui/run.bndrun diff --git a/flexiblepower.runtime.simulation/bnd.bnd b/flexiblepower.runtime.simulation/bnd.bnd index b38fbe9..2f3a50d 100644 --- a/flexiblepower.runtime.simulation/bnd.bnd +++ b/flexiblepower.runtime.simulation/bnd.bnd @@ -1,13 +1,17 @@ --buildpath: ${default-buildpath}, flexiblepower.runtime;version=latest +-buildpath: ${default-buildpath}, flexiblepower.runtime;version=latest, flexiblepower.ui;version=latest -testpath: ${test-buildpath} Bundle-Version: 3.0.0.${qualifier} Bundle-SymbolicName: flexiblepower.runtime.simulation Private-Package: \ org.flexiblepower.simulation.context,\ + org.flexiblepower.simulation.ui,\ org.flexiblepower.runtime.messaging,\ org.flexiblepower.scheduling Export-Package: org.flexiblepower.simulation.api +Import-Package: \ + org.flexiblepower.ui;resolution:=optional,\ + * Service-Component: * Provide-Capability: flexiblepower.context; runtime=fpai diff --git a/flexiblepower.runtime.simulation/res/widgets/SimulatedTimeWidget/clock.png b/flexiblepower.runtime.simulation/res/widgets/SimulatedTimeWidget/clock.png new file mode 100755 index 0000000000000000000000000000000000000000..d75201ae807ca4a9f5844d924ce932874ac72d4f GIT binary patch literal 5286 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

TITl9Ui{{E~F;c!`+ekv1{Lk&_z+ng<#S z0|o8{UWMdr-r>V<$3pzhC_uKV+-P8%THpFSWnJ>8E(+Tk2+%O#`wVGh>cpygue!fl zANOZXJP=PLF_Zl%d1Qav!HP#H24rhQL|W@sty=q_Haw^XaWOIZ={r)43cu#UrPK@9 zYtteAkYwl*066u8hC%>=%q$_D`_%e@$&Y+Ndrp@cXnpckUQV`O{~Xy2Nl){zg!qM@ z6nE^{v59n0BbgveTnNd}&9SwW&ML4Z5`Wqo;FjtIjgbHWN`hKmh3~mGODtL~G0YsU z_1)4(Id)4Qu}{9rm6E8sBk^&uJH@bVeGo4^xHus`E;C2mU!`EzPJ1*>MSy7-XX8Qk z)qR3jC;F()ppYS6YZ{51p8brgCzw?9u)q7Wd{@L;4$3NJm zOP3%1I|13N2R-`eqxTl>+I1>lSXRlD@<(F?(@U2wwU5c&vgk#EmnXPHAiPKPI|$?Y z90{{>X^~yVJ}2npZ5qRmw_BOqj$R?#51w*i#bl1QgWcGm;gqj0L@j za791o8g+T@&5&%KCu``2M|XS*p2Unt@>5$^&(f0OGZQ9E_={k;_}>W;3IhiYylrQG z{?Xl%bW|!U%5AJE3Ai3VOu#C-X`(vNrI8$6B9sh3YKZX4XNUsl9)F`F^U>?m?659w zzesuoz;oKnqi|QhvfZU-+0v!+uaMz`a`6KO$BY^CCt>(xdD(8GvZu1bBuPWWsS6gs z8f=}Z$COB((qb{T(6}z85;q1I;emSt6yZIe@g3K2E%!hoRR))*)RFCZR7O9-16#V( zit;kQPDq8^CmtFW931>xAA}!2x_0dvEDh3M%FD{W0k}%lo=Q_FagP_E5Qh+Kn(zk7 zBpoBlV?9CxG6)YmgE|gSg!cf(+FZl6+=ILGqYOyJ>Lgw)PQv4X?LHyvJbh%Yg!uU6 zwr$&9Cu(2XpVMD+%{47wcwyZCl$Mm7*tfSz7I$RdUaJs_@gRaSNmm9DD3A51*8n0} z(m)X=^cDc*J)e<72qB0goapTVPO^nuT%Nfpf%~iXou@;!=n%PeYm|8G?=Cv&U1(f; z?X|%pMvNFH+5TV+zv*|Rwr0PzF6VLj0|i`_{6L+C3|yEPCW#?ZYVEavWs?P2beYTn zIk-5RFhY!14m=JJG68FgoR#ZWwQSk)+Mf)(4sow$y?XV!DKRl&N1c?px&xBj9N{TU zg}69i2o0>pD`b!-AcQahAg{!iD^DIeL{_gapGtbtiblP2f5G&{AD@d*_+ zGE@l?o;_ZZ1a?IF0NW7R-oSevq`0`~knH$gluX}_A9MTE`Nxbq@4PdpRjXE44;waY zsKjy1;lqbcA3sj3duat?3JVJkh__5`)22-~e$eGp;pZ{1gb>mC)?05KAQj*P$?SXS z^S_Wy&czBFBx$F=j*5(o8~gn8V_LUv-Kl;1_CGJ+frBi}0V|K6?zrQQK@!tbCF3WF ztJg}a`<@~ literal 0 HcmV?d00001 diff --git a/flexiblepower.runtime.simulation/res/widgets/SimulatedTimeWidget/index.html b/flexiblepower.runtime.simulation/res/widgets/SimulatedTimeWidget/index.html index db20640..087e07e 100644 --- a/flexiblepower.runtime.simulation/res/widgets/SimulatedTimeWidget/index.html +++ b/flexiblepower.runtime.simulation/res/widgets/SimulatedTimeWidget/index.html @@ -1,13 +1,13 @@ - - - - - - - Simulated Clock + + + + + + +Simulated Clock Loading... @@ -15,22 +15,25 @@ Clock

-

- +

+ +

+
+

+ Start: +

- -
+
diff --git a/flexiblepower.runtime.simulation/res/widgets/SimulatedTimeWidget/script.js b/flexiblepower.runtime.simulation/res/widgets/SimulatedTimeWidget/script.js index 975e1b4..6abbedf 100644 --- a/flexiblepower.runtime.simulation/res/widgets/SimulatedTimeWidget/script.js +++ b/flexiblepower.runtime.simulation/res/widgets/SimulatedTimeWidget/script.js @@ -9,7 +9,7 @@ $(window).load(function() { var startBtn = $("#startstop"); var pauseBtn = $("#pauseunpause"); - if(data.state == "RUNNING") { + if(data.state == "RUNNING" || data.state == "STOPPING") { startBtn.text("Stop").removeAttr('disabled'); pauseBtn.text("Pause").removeAttr('disabled'); $("#period").attr('disabled', 'disabled'); @@ -30,7 +30,11 @@ $(window).load(function() { $("#startstop").click(function() { var btn = $(this); - var startTime = 1325376000000; + var parts = $("#datepicker").val().split('-'); + if(parts.length != 3) alert("Invalid date entered. Use dd-mm-yyyy format."); + var date = new Date(parts[2], parts[1]-1, parts[0]); // months are 0-based + var startTime = date.getTime()+1000*60*60*10; + if(isNaN(startTime)) startTime = 1325376000000; var stopTime = 0; switch($("#period").val()) { case "year": stopTime = startTime + 31556926000; break; @@ -61,4 +65,4 @@ $(window).load(function() { $("#speed").change(function () { w.call("changeSpeedFactor", {"startTime":0, "stopTime":0, "speedFactor":$("#speed").val()}, w.callback); }); -}); +}); \ No newline at end of file diff --git a/flexiblepower.runtime.simulation/src/org/flexiblepower/simulation/ui/SimulatedTimeWidget.java b/flexiblepower.runtime.simulation/src/org/flexiblepower/simulation/ui/SimulatedTimeWidget.java new file mode 100755 index 0000000..4293e13 --- /dev/null +++ b/flexiblepower.runtime.simulation/src/org/flexiblepower/simulation/ui/SimulatedTimeWidget.java @@ -0,0 +1,116 @@ +package org.flexiblepower.simulation.ui; + +import java.util.Date; +import java.util.Locale; + +import org.flexiblepower.context.FlexiblePowerContext; +import org.flexiblepower.simulation.api.Simulation; +import org.flexiblepower.ui.Widget; + +import aQute.bnd.annotation.component.Component; +import aQute.bnd.annotation.component.Reference; + +@Component +public class SimulatedTimeWidget implements Widget { + public static class Parameters { + private long startTime; + private long stopTime; + private double speedFactor; + + public long getStopTime() { + return stopTime; + } + + public double getSpeedFactor() { + return speedFactor; + } + + public long getStartTime() { + return startTime; + } + + public void setStopTime(long stopTime) { + this.stopTime = stopTime; + } + + public void setSpeedFactor(double speedFactor) { + this.speedFactor = speedFactor; + } + + public void setStartTime(long startTime) { + this.startTime = startTime; + } + } + + public static class Update { + private final Date time; + private final Simulation.State state; + + public Simulation.State getState() { + return state; + } + + public Update(Date date, Simulation.State state) { + time = date; + this.state = state; + } + + public Date getTime() { + return time; + } + } + + private Simulation simulation; + + @Reference + public void setSimulation(Simulation simulation) { + this.simulation = simulation; + } + + private FlexiblePowerContext context; + + @Reference + public void setContext(FlexiblePowerContext context) { + this.context = context; + } + + @Override + public String getTitle(Locale locale) { + return "Simulation Clock"; + } + + public Update startSimulation(Parameters params) { + if (params.stopTime == 0) { + simulation.startSimulation(new Date(params.getStartTime()), params.getSpeedFactor()); + } else { + simulation.startSimulation(new Date(params.getStartTime()), + new Date(params.getStopTime()), + params.getSpeedFactor()); + } + return update(); + } + + public Update stopSimulation() { + simulation.stopSimulation(); + return update(); + } + + public Update pauseSimulation() { + simulation.pause(); + return update(); + } + + public Update unpauseSimulation() { + simulation.unpause(); + return update(); + } + + public Update changeSpeedFactor(Parameters params) { + simulation.changeSpeedFactor(params.getSpeedFactor()); + return update(); + } + + public Update update() { + return new Update(context.currentTime(), simulation.getSimulationClockState()); + } +} diff --git a/flexiblepower.runtime.simulation/test.bndrun b/flexiblepower.runtime.simulation/test.bndrun index 6c01f43..87f88a6 100644 --- a/flexiblepower.runtime.simulation/test.bndrun +++ b/flexiblepower.runtime.simulation/test.bndrun @@ -1,9 +1,39 @@ --runrequires: osgi.identity;filter:='(osgi.identity=flexiblepower.runtime.simulation.test)' --runfw: org.eclipse.osgi +-runfw: org.apache.felix.framework -runee: JavaSE-1.6 --runbundles: ch.qos.logback.classic;version='[1.0.13,1.0.14)',\ - ch.qos.logback.core;version='[1.0.13,1.0.14)',\ - flexiblepower.api.test;version=latest,\ - flexiblepower.runtime.simulation.test;version=latest,\ - junit.osgi;version='[3.8.2,3.8.3)',\ - slf4j.api;version='[1.7.5,1.7.6)' \ No newline at end of file +-resolve: auto +-runrequires: \ + osgi.identity;filter:='(osgi.identity=flexiblepower.runtime.simulation)',\ + osgi.identity;filter:='(osgi.identity=flexiblepower.ui)',\ + osgi.identity;filter:='(osgi.identity=flexiblepower.simulation.pvpanel)',\ + osgi.identity;filter:='(osgi.identity=flexiblepower.simulation.battery)',\ + osgi.identity;filter:='(osgi.identity=org.apache.felix.webconsole.plugins.ds)',\ + osgi.identity;filter:='(osgi.identity=org.apache.felix.configadmin)',\ + osgi.identity;filter:='(osgi.identity=org.apache.felix.eventadmin)',\ + osgi.identity;filter:='(osgi.identity=org.apache.felix.http.jetty)',\ + osgi.identity;filter:='(osgi.identity=org.apache.felix.metatype)',\ + osgi.identity;filter:='(osgi.identity=org.apache.felix.http.whiteboard)' + +-runbundles: \ + biz.aQute.bnd.annotation;version='[2.4.0,2.4.1)',\ + ch.qos.logback.classic;version='[1.1.2,1.1.3)',\ + ch.qos.logback.core;version='[1.1.2,1.1.3)',\ + com.google.gson;version='[2.2.4,2.2.5)',\ + flexiblepower.api;version='[3.0.0,3.0.1)',\ + flexiblepower.ral;version=latest,\ + flexiblepower.ral.ext;version=latest,\ + flexiblepower.runtime.simulation;version=latest,\ + flexiblepower.simulation.battery;version='[2.0.0,2.0.1)',\ + flexiblepower.simulation.pvpanel;version='[2.1.0,2.1.1)',\ + flexiblepower.ui;version=latest,\ + org.apache.felix.configadmin;version='[1.8.0,1.8.1)',\ + org.apache.felix.eventadmin;version='[1.3.2,1.3.3)',\ + org.apache.felix.http.api;version='[2.3.2,2.3.3)',\ + org.apache.felix.http.jetty;version='[2.3.0,2.3.1)',\ + org.apache.felix.http.servlet-api;version='[1.0.0,1.0.1)',\ + org.apache.felix.http.whiteboard;version='[2.3.2,2.3.3)',\ + org.apache.felix.metatype;version='[1.0.10,1.0.11)',\ + org.apache.felix.scr;version='[1.8.2,1.8.3)',\ + org.apache.felix.webconsole;version='[4.2.2,4.2.3)',\ + org.apache.felix.webconsole.plugins.ds;version='[1.0.0,1.0.1)',\ + org.slf4j.osgi-over-slf4j;version='[1.7.7,1.7.8)',\ + slf4j.api;version='[1.7.7,1.7.8)' diff --git a/flexiblepower.ui/run.bndrun b/flexiblepower.ui/run.bndrun deleted file mode 100644 index b89eb3d..0000000 --- a/flexiblepower.ui/run.bndrun +++ /dev/null @@ -1,38 +0,0 @@ --runfw: org.apache.felix.framework;version='[4.4.0,4.4.0]' --runee: JavaSE-1.6 --runrequires: \ - osgi.identity;filter:='(osgi.identity=flexiblepower.runtime)',\ - osgi.identity;filter:='(osgi.identity=flexiblepower.ui)',\ - osgi.identity;filter:='(osgi.identity=org.apache.felix.http.whiteboard)',\ - osgi.identity;filter:='(osgi.identity=org.apache.felix.scr)',\ - osgi.identity;filter:='(osgi.identity=org.apache.felix.metatype)',\ - osgi.identity;filter:='(osgi.identity=org.apache.felix.webconsole)',\ - osgi.identity;filter:='(osgi.identity=org.apache.felix.webconsole.plugins.ds)',\ - osgi.identity;filter:='(osgi.identity=org.apache.felix.useradmin)',\ - osgi.identity;filter:='(osgi.identity=org.apache.felix.useradmin.filestore)',\ - osgi.identity;filter:='(osgi.identity=slf4j.api)',\ - osgi.identity;filter:='(osgi.identity=org.apache.felix.http.jetty)' --runbundles: \ - biz.aQute.bnd.annotation;version='[2.4.0,2.4.1)',\ - ch.qos.logback.classic;version='[1.1.2,1.1.3)',\ - ch.qos.logback.core;version='[1.1.2,1.1.3)',\ - com.google.gson;version='[2.2.4,2.2.5)',\ - flexiblepower.api;version='[2.0.0,2.0.1)',\ - flexiblepower.runtime;version='[2.0.0,2.0.1)',\ - flexiblepower.ui;version=latest,\ - org.apache.felix.configadmin;version='[1.8.0,1.8.1)',\ - org.apache.felix.eventadmin;version='[1.3.2,1.3.3)',\ - org.apache.felix.http.api;version='[2.3.0,2.3.1)',\ - org.apache.felix.http.jetty;version='[2.3.0,2.3.1)',\ - org.apache.felix.http.servlet-api;version='[1.0.0,1.0.1)',\ - org.apache.felix.http.whiteboard;version='[2.3.0,2.3.1)',\ - org.apache.felix.metatype;version='[1.0.10,1.0.11)',\ - org.apache.felix.scr;version='[1.8.2,1.8.3)',\ - org.apache.felix.useradmin;version='[1.0.3,1.0.4)',\ - org.apache.felix.useradmin.filestore;version='[1.0.2,1.0.3)',\ - org.apache.felix.webconsole;version='[4.2.2,4.2.3)',\ - org.apache.felix.webconsole.plugins.ds;version='[1.0.0,1.0.1)',\ - org.slf4j.osgi-over-slf4j;version='[1.7.7,1.7.8)',\ - osgi.cmpn;version='[4.3.1,4.3.2)',\ - slf4j.api;version='[1.7.7,1.7.8)' --resolve: auto \ No newline at end of file From 4425cb562ce34c56ebd63b550fd41fc25e17c925 Mon Sep 17 00:00:00 2001 From: Wilco Wijbrandi Date: Wed, 29 Apr 2015 17:03:23 +0200 Subject: [PATCH 092/105] Improved the AcutatorBehaviour validator and added unit test. Fixes #38 --- .../efi/buffer/ActuatorBehaviour.java | 51 +++++++- .../efi/ActuatorBehaviourTest.java | 119 ++++++++++++++++++ 2 files changed, 167 insertions(+), 3 deletions(-) create mode 100755 flexiblepower.ral.efi/test/org/flexiblepower/efi/ActuatorBehaviourTest.java diff --git a/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/ActuatorBehaviour.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/ActuatorBehaviour.java index 07d00ab..70a6673 100755 --- a/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/ActuatorBehaviour.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/ActuatorBehaviour.java @@ -9,16 +9,29 @@ import org.flexiblepower.efi.util.FillLevelFunction; import org.flexiblepower.efi.util.RunningMode; +import org.flexiblepower.efi.util.Transition; /** * This class describes how an actuator can affect the buffer. It contains a collection of {@link RunningMode}s that use - * a {@link FillLevelFunction} to describe each one. Each {@link FillLevelFunction} contains a single double value that + * a {@link FillLevelFunction} to describe each one. Each {@link FillLevelFunction} contains for every fill level of the + * buffer a {@link RunningModeBehaviour}. The {@link RunningModeBehaviour} describes the effect on the buffer when this + * {@link RunningMode} is selected and the consumed or produced commodities. */ public class ActuatorBehaviour { + + /** + * @param id + * Identifier of this Actuator + * @return a new {@link Builder} object that can be used to easily create the {@link ActuatorBehaviour} + */ public static Builder create(int id) { return new Builder(id); } + /** + * This helper class should be used to easily define a {@link ActuatorBehaviour}. Use the + * {@link ActuatorBehaviour#create(double)} method to get a new instance of this class. + */ public static class Builder { private final int id; private final Set>> runningModes; @@ -28,11 +41,22 @@ public static class Builder { runningModes = new HashSet>>(); } + /** + * Adds a {@link RunningMode} to the {@link ActuatorBehaviour} object that we are creating. + * + * @param runningMode + * The {@link RunningMode} to add to the {@link ActuatorBehaviour} object that we are creating + * @return This {@link Builder} + */ public Builder add(RunningMode> runningMode) { runningModes.add(runningMode); return this; } + /** + * @return A new immutable {@link ActuatorBehaviour} object that contains all the elements that have been added + * until now. + */ public ActuatorBehaviour build() { return new ActuatorBehaviour(id, runningModes); } @@ -41,17 +65,38 @@ public ActuatorBehaviour build() { private final int id; private final Map>> runningModes; + /** + * Construct an ActuatorBehaviour instance. + * + * @param id + * Device unique identifier for this actuator + * @param runningModes + * Collection describing all the supported runningModes of this + * + * @throws IllegalArgumentException + * Thrown when there are multiple RunningMode with the same identifier or when a {@link Transition} has + * an unknown RunningMode as target + */ public ActuatorBehaviour(int id, Collection>> runningModes) { this.id = id; + // Test for duplicate RunningMode Id's TreeMap>> tempRunningModes = new TreeMap>>(); for (RunningMode> runningMode : runningModes) { if (tempRunningModes.containsKey(runningMode.getId())) { - throw new IllegalArgumentException(String.format("Cannot add another RunningMode with the same Id {0} to this ActuatorBehaviour instance.", - runningMode.getId())); + throw new IllegalArgumentException("Cannot add multiple RunningModes with the same Id (" + runningMode.getId() + + ") to this ActuatorBehaviour instance"); } tempRunningModes.put(runningMode.getId(), runningMode); } + // Test for Transitions with non-existing destinations + for (RunningMode> runningMode : tempRunningModes.values()) { + for (Transition transition : runningMode.getTransitions()) { + if (!tempRunningModes.containsKey(transition.getToRunningMode())) { + throw new IllegalArgumentException("There is a Transition that has a target (toRunningMode) with a RunningMode Id which does not exist: " + transition.getToRunningMode()); + } + } + } this.runningModes = Collections.unmodifiableMap(tempRunningModes); } diff --git a/flexiblepower.ral.efi/test/org/flexiblepower/efi/ActuatorBehaviourTest.java b/flexiblepower.ral.efi/test/org/flexiblepower/efi/ActuatorBehaviourTest.java new file mode 100755 index 0000000..f0d55df --- /dev/null +++ b/flexiblepower.ral.efi/test/org/flexiblepower/efi/ActuatorBehaviourTest.java @@ -0,0 +1,119 @@ +package org.flexiblepower.efi; + +import java.util.ArrayList; +import java.util.Collections; + +import javax.measure.Measure; +import javax.measure.unit.NonSI; +import javax.measure.unit.SI; + +import junit.framework.TestCase; + +import org.flexiblepower.efi.buffer.ActuatorBehaviour; +import org.flexiblepower.efi.buffer.RunningModeBehaviour; +import org.flexiblepower.efi.util.FillLevelFunction; +import org.flexiblepower.efi.util.RunningMode; +import org.flexiblepower.efi.util.Transition; +import org.flexiblepower.ral.values.CommodityMeasurables; + +public class ActuatorBehaviourTest extends TestCase { + + /** + * Test if the ActuatorBehaviour constructor throws an IllegalArgumentExecption when two RunningModes with the same + * Id are added + */ + public void testDuplicateRunningMode() { + RunningModeBehaviour rmb = new RunningModeBehaviour(1, + CommodityMeasurables.create() + .electricity(Measure.valueOf(10, + SI.WATT)) + .build(), + Measure.zero(NonSI.EUR_PER_HOUR)); + FillLevelFunction fll1 = FillLevelFunction. create(0) + .add(100, rmb) + .build(); + RunningMode> rm1 = new RunningMode>(0, + "First", + fll1, + Collections. emptySet()); + RunningMode> rm2 = new RunningMode>(0, + "Second", + fll1, + Collections. emptySet()); + + ArrayList>> runningModes = new ArrayList>>(); + runningModes.add(rm1); + runningModes.add(rm2); + + try { + new ActuatorBehaviour(0, runningModes); + fail("ActuatorBehavioun constructor should throw an exception"); + } catch (IllegalArgumentException e) { + // Expected + } + + } + + /** + * Test if the ActuatorBehaviour constructor throws an IllegalArgumentExecption when there is a Transition which has + * a non existing destination + */ + public void testTransitionWithoutDestination() { + RunningModeBehaviour rmb = new RunningModeBehaviour(1, + CommodityMeasurables.create() + .electricity(Measure.valueOf(10, + SI.WATT)) + .build(), + Measure.zero(NonSI.EUR_PER_HOUR)); + FillLevelFunction flf = FillLevelFunction. create(0) + .add(100, rmb) + .build(); + // runningmode 1 does'n exist + RunningMode> rm = new RunningMode>(0, + "First", + flf, + Collections.singleton(Transition.create(1) + .build())); + + try { + new ActuatorBehaviour(0, Collections.singleton(rm)); + fail("ActuatorBehavioun constructor should throw an exception"); + } catch (IllegalArgumentException e) { + // Expected + } + + } + + /** + * Test if the ActuatorBehaviour constructor works with transitions + */ + public void testWithTransitions() { + RunningModeBehaviour rmb = new RunningModeBehaviour(1, + CommodityMeasurables.create() + .electricity(Measure.valueOf(10, + SI.WATT)) + .build(), + Measure.zero(NonSI.EUR_PER_HOUR)); + FillLevelFunction flf = FillLevelFunction. create(0) + .add(100, rmb) + .build(); + // runningmode 1 does'n exist + RunningMode> rm1 = new RunningMode>(0, + "First", + flf, + Collections.singleton(Transition.create(1) + .build())); + + RunningMode> rm2 = new RunningMode>(1, + "Second", + flf, + Collections.singleton(Transition.create(0) + .build())); + + ArrayList>> runningModes = new ArrayList>>(); + runningModes.add(rm1); + runningModes.add(rm2); + new ActuatorBehaviour(0, runningModes); + + } +} From cd3358e806547c464957e8be76de6de722497c2f Mon Sep 17 00:00:00 2001 From: Wilco Wijbrandi Date: Wed, 29 Apr 2015 17:37:59 +0200 Subject: [PATCH 093/105] Cleaned up code, added JavaDoc --- .../efi/buffer/ActuatorBehaviour.java | 2 +- .../flexiblepower/efi/util/RunningMode.java | 23 +++++++- .../flexiblepower/efi/util/Transition.java | 59 ++++++++++++++++++- .../efi/ActuatorBehaviourTest.java | 3 +- .../efi/BufferControlSpaceTest.java | 44 -------------- 5 files changed, 79 insertions(+), 52 deletions(-) delete mode 100755 flexiblepower.ral.efi/test/org/flexiblepower/efi/BufferControlSpaceTest.java diff --git a/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/ActuatorBehaviour.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/ActuatorBehaviour.java index 70a6673..a16fc95 100755 --- a/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/ActuatorBehaviour.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/buffer/ActuatorBehaviour.java @@ -30,7 +30,7 @@ public static Builder create(int id) { /** * This helper class should be used to easily define a {@link ActuatorBehaviour}. Use the - * {@link ActuatorBehaviour#create(double)} method to get a new instance of this class. + * {@link ActuatorBehaviour#create(int)} method to get a new instance of this class. */ public static class Builder { private final int id; diff --git a/flexiblepower.ral.efi/src/org/flexiblepower/efi/util/RunningMode.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/util/RunningMode.java index 1735eb6..e67810a 100755 --- a/flexiblepower.ral.efi/src/org/flexiblepower/efi/util/RunningMode.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/util/RunningMode.java @@ -6,9 +6,14 @@ import java.util.Set; import java.util.TreeMap; +import org.flexiblepower.efi.buffer.Actuator; + /** * This class is used to describe different modes in which a device can run. This is used in both the buffer and the * unconstrained abstractions. + * + * @param + * The value stored in this {@link RunningMode} (depends on where the {@link RunningMode} is being used) */ public class RunningMode { private final int id; @@ -16,8 +21,22 @@ public class RunningMode { private final T value; private final Map possibleTransitions; - // TODO should this constructor be protected? - // There may be no transition to this RunningMode (itself). + /** + * Construct a new, immutable {@link RunningMode} object. + * + * @param id + * Device-unique identifier for this {@link RunningMode} + * @param name + * Human readable name for this {@link RunningMode} + * @param value + * Value stored in this {@link RunningMode} + * @param possibleTransitions + * Possible transitions from this {@link RunningMode} to another. This Set should not be empty, unless + * this is the only {@link RunningMode} for this {@link Actuator}. + * + * @throws NullPointerException + * Thrown when name, value or possibleTransitions is null + */ public RunningMode(int id, String name, T value, diff --git a/flexiblepower.ral.efi/src/org/flexiblepower/efi/util/Transition.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/util/Transition.java index aa71c85..387cecc 100755 --- a/flexiblepower.ral.efi/src/org/flexiblepower/efi/util/Transition.java +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/util/Transition.java @@ -12,17 +12,32 @@ import javax.measure.unit.SI; /** - * This class contains the constraints for switching from one {@link RunningMode} to another + * This class contains the constraints for switching from one {@link RunningMode} to another. */ public class Transition { + + /** + * @param toRunningMode + * Identifier the target of this {@link Transition} + * @return a new {@link Builder} object that can be used to easily create the {@link Transition} + */ public static Builder create(int toRunningMode) { return new Builder(toRunningMode); } + /** + * @param toRunningMode + * The target of this {@link Transition} + * @return a new {@link Builder} object that can be used to easily create the {@link Transition} + */ public static Builder create(RunningMode toRunningMode) { return new Builder(toRunningMode.getId()); } + /** + * This helper class should be used to easily define a {@link Transition}. Use the {@link Transition#create(int)} or + * {@link Transition#create(RunningMode))} method to get a new instance of this class. + */ public static class Builder { private final int toRunningMode; private final Set startTimers; @@ -38,42 +53,80 @@ public static class Builder { transitionTime = Measure.valueOf(0, SI.SECOND); } + /** + * @param costs + * The costs of making this transition. + * + * @return This {@link Builder} + */ public Builder setCosts(Measurable costs) { transitionCosts = costs; return this; } /** - * Set the costs in eurocents + * @param costs + * The costs of making this transition in eurocents. + * + * @return This {@link Builder} */ public Builder setCosts(double costs) { transitionCosts = Measure.valueOf(costs, NonSI.EUROCENT); return this; } + /** + * @param time + * The time it takes to make this transition. + * + * @return This {@link Builder} + */ public Builder setTime(Measurable time) { transitionTime = time; return this; } /** - * Set the time in seconds + * @param time + * The time it takes to make this transition in seconds. + * + * @return This {@link Builder} */ public Builder setTime(double time) { transitionTime = Measure.valueOf(time, SI.SECOND); return this; } + /** + * Add a {@link Timer} that can block this {@link Transition}. + * + * @param timer + * The timer that can block this {@link Transition} + * + * @return This {@link Builder} + */ public Builder isBlockedBy(Timer timer) { blockingTimers.add(timer); return this; } + /** + * Add a {@link Timer} that is started when this {@link Transition} is made. + * + * @param timer + * The timer that is started by this {@link Transition} + * + * @return This {@link Builder} + */ public Builder starts(Timer timer) { startTimers.add(timer); return this; } + /** + * @return A new immutable {@link Transition} object that contains all the elements that have been added until + * now. + */ public Transition build() { return new Transition(toRunningMode, startTimers, diff --git a/flexiblepower.ral.efi/test/org/flexiblepower/efi/ActuatorBehaviourTest.java b/flexiblepower.ral.efi/test/org/flexiblepower/efi/ActuatorBehaviourTest.java index f0d55df..045b765 100755 --- a/flexiblepower.ral.efi/test/org/flexiblepower/efi/ActuatorBehaviourTest.java +++ b/flexiblepower.ral.efi/test/org/flexiblepower/efi/ActuatorBehaviourTest.java @@ -85,7 +85,7 @@ public void testTransitionWithoutDestination() { } /** - * Test if the ActuatorBehaviour constructor works with transitions + * Test if the ActuatorBehaviour constructor works with valid transitions */ public void testWithTransitions() { RunningModeBehaviour rmb = new RunningModeBehaviour(1, @@ -97,7 +97,6 @@ public void testWithTransitions() { FillLevelFunction flf = FillLevelFunction. create(0) .add(100, rmb) .build(); - // runningmode 1 does'n exist RunningMode> rm1 = new RunningMode>(0, "First", flf, diff --git a/flexiblepower.ral.efi/test/org/flexiblepower/efi/BufferControlSpaceTest.java b/flexiblepower.ral.efi/test/org/flexiblepower/efi/BufferControlSpaceTest.java deleted file mode 100755 index 3a0a1a8..0000000 --- a/flexiblepower.ral.efi/test/org/flexiblepower/efi/BufferControlSpaceTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.flexiblepower.efi; - -import junit.framework.TestCase; - -public class BufferControlSpaceTest extends TestCase { - - public void testValidationTests() { - // create(ConstraintList.create(SI.WATT).addSingle(0).build()); - // create(ConstraintList.create(SI.WATT).addSingle(0).addSingle(POS_NR) - // .build()); - // create(ConstraintList.create(SI.WATT).addSingle(0).addSingle(NEG_NR) - // .build()); - // create(ConstraintList.create(SI.WATT).addSingle(POS_NR).build()); - // create(ConstraintList.create(SI.WATT).addSingle(NEG_NR).build()); - // create(ConstraintList.create(SI.WATT).addRange(0, POS_NR).build()); - // create(ConstraintList.create(SI.WATT).addRange(NEG_NR, 0).build()); - // - // createError(ConstraintList.create(SI.WATT).addSingle(NEG_NR) - // .addSingle(POS_NR).build()); - // createError(ConstraintList.create(SI.WATT).addRange(NEG_NR, POS_NR) - // .build()); - } - - // private void create(ConstraintList chargeSpeed) { - // Date now = new Date(); - // Date future = TimeUtil.add(now, Measure.valueOf(1, NonSI.HOUR)); - // Measurable capacity = Measure.valueOf(1, NonSI.KWH); - // Measurable selfDischarge = Measure.valueOf(1, SI.WATT); - // Measurable minute = Measure.valueOf(1, NonSI.MINUTE); - // - // // First we try to create a couple of valid ones - // new BufferControlSpace("xxx", now, future, future, capacity, 0, - // chargeSpeed, selfDischarge, minute, minute, future, 1.); - // } - // - // private void createError(ConstraintList chargeSpeed) { - // try { - // create(chargeSpeed); - // fail("Expected failure for arguments: " + chargeSpeed); - // } catch (IllegalArgumentException ex) { - // // OK - // } - // } -} From e5658346876c3d331c1e40bf1c1f8ea696aa6b23 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Thu, 30 Apr 2015 10:51:32 +0200 Subject: [PATCH 094/105] The ConnectionManager now uses the scheduling from the FlexiblePowerContext Before this, each Endpoint had its own thread to handle messages, but this resulted in a lot of threads being created. To limit this, it now reuses the scheduling thread from the FlexiblePowerContext. This creates a thread for each bundle, which is already shared with all the other scheduling stuff. This should make the system faster on small computers, such as the Raspberry Pi, which are bad at handling a lot of threads. --- .../runtime/wiring/test/EndpointTester.java | 1 - .../runtime/messaging/Command.java | 17 +++- .../messaging/ConnectionManagerImpl.java | 10 +++ .../runtime/messaging/EndpointWrapper.java | 84 +++++++++++-------- 4 files changed, 72 insertions(+), 40 deletions(-) diff --git a/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java b/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java index ace56a6..bf10f4a 100644 --- a/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java +++ b/flexiblepower.runtime.test/src/org/flexiblepower/runtime/wiring/test/EndpointTester.java @@ -64,7 +64,6 @@ public MessageHandler onConnect(Connection connection) { public void handleMessage(Object message) { System.out.println(TestEndpoint.this.getClass().getSimpleName() + " got message [" + message + "]"); assertEquals(expectedMessage, message); - assertTrue(Thread.currentThread().getName().contains(TestEndpoint.this.getClass().getSimpleName())); gotMessage = true; } diff --git a/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/Command.java b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/Command.java index 4c31d88..06cfb3c 100644 --- a/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/Command.java +++ b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/Command.java @@ -6,8 +6,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public interface Command { - void execute(); +public interface Command extends Runnable { public class HandleMessage implements Command { private static final Logger logger = LoggerFactory.getLogger(Command.HandleMessage.class); @@ -24,7 +23,7 @@ public HandleMessage(Object message, MessageHandler handler) { } @Override - public void execute() { + public void run() { try { logger.trace("Handling message {}", message); handler.handleMessage(message); @@ -32,6 +31,11 @@ public void execute() { logger.error("Error while handling message (" + message + "): " + ex.getMessage(), ex); } } + + @Override + public String toString() { + return "Handle message: " + message.toString(); + } } public class Disconnect implements Command { @@ -46,7 +50,7 @@ public Disconnect(MessageHandler handler, CountDownLatch latch) { } @Override - public void execute() { + public void run() { try { logger.trace("Disconnecting"); handler.disconnected(); @@ -56,5 +60,10 @@ public void execute() { latch.countDown(); } } + + @Override + public String toString() { + return "Disconnect command"; + } } } diff --git a/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/ConnectionManagerImpl.java b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/ConnectionManagerImpl.java index 4e50b74..11b4171 100644 --- a/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/ConnectionManagerImpl.java +++ b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/ConnectionManagerImpl.java @@ -14,6 +14,7 @@ import java.util.TreeMap; import java.util.TreeSet; +import org.flexiblepower.context.FlexiblePowerContext; import org.flexiblepower.messaging.Cardinality; import org.flexiblepower.messaging.ConnectionManager; import org.flexiblepower.messaging.Endpoint; @@ -75,6 +76,15 @@ public ConnectionManagerImpl() { autoconnect = false; } + // This reference is only needed to make sure that the EndpointWrapper + @SuppressWarnings("unused") + private FlexiblePowerContext flexiblePowerContext; + + @Reference + public void setFlexiblePowerContext(FlexiblePowerContext flexiblePowerContext) { + this.flexiblePowerContext = flexiblePowerContext; + } + private ConfigurationAdmin configurationAdmin; @Reference diff --git a/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/EndpointWrapper.java b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/EndpointWrapper.java index 4c0a93f..3c2850e 100644 --- a/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/EndpointWrapper.java +++ b/flexiblepower.runtime/src/org/flexiblepower/runtime/messaging/EndpointWrapper.java @@ -3,30 +3,45 @@ import java.io.Closeable; import java.util.SortedMap; import java.util.TreeMap; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.atomic.AtomicBoolean; +import org.flexiblepower.context.FlexiblePowerContext; import org.flexiblepower.messaging.ConnectionManager.ManagedEndpoint; import org.flexiblepower.messaging.Endpoint; import org.flexiblepower.messaging.Port; import org.flexiblepower.messaging.Ports; +import org.flexiblepower.runtime.context.RuntimeContext; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.ServiceReference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class EndpointWrapper implements Runnable, ManagedEndpoint, Closeable { +/** + * The {@link EndpointWrapper} wraps the {@link Endpoint} object and makes sure that each message is handled on a + * separate thread. + */ +public class EndpointWrapper implements ManagedEndpoint, Closeable { private static final Logger logger = LoggerFactory.getLogger(EndpointWrapper.class); private final String pid; private final Endpoint endpoint; private final ConnectionManagerImpl connectionManager; - private final Thread thread; - private final AtomicBoolean running; - private final BlockingQueue commandQueue; + private final BundleContext bundleContext; + private final ServiceReference serviceReference; + private final FlexiblePowerContext endpointContext; private final SortedMap ports; + /** + * @param pid + * The persistent identifier of the {@link Endpoint} that uniquely identifies it. + * @param endpoint + * The reference to the {@link Endpoint} object + * @param connectionManager + * The reference back to the implementation of the connection manager + */ public EndpointWrapper(String pid, Endpoint endpoint, ConnectionManagerImpl connectionManager) { this.pid = pid; this.endpoint = endpoint; @@ -35,11 +50,19 @@ public EndpointWrapper(String pid, Endpoint endpoint, ConnectionManagerImpl conn parsePorts(endpoint.getClass()); checkPorts(); - thread = new Thread(this, "Message handler thread for " + endpoint.getClass().getSimpleName()); - running = new AtomicBoolean(true); - commandQueue = new LinkedBlockingQueue(); + Bundle bundle = FrameworkUtil.getBundle(endpoint.getClass()); + if (bundle == null) { + RuntimeContext context = new RuntimeContext(); + context.start(endpoint.getClass().getName()); - thread.start(); + bundleContext = null; + serviceReference = null; + endpointContext = context; + } else { + bundleContext = bundle.getBundleContext(); + serviceReference = bundleContext.getServiceReference(FlexiblePowerContext.class); + endpointContext = bundleContext.getService(serviceReference); + } } private void parsePorts(Class clazz) { @@ -68,9 +91,9 @@ private void parsePorts(Class clazz) { } else if (storedPort.getPort().sends().length == 0 && storedPort.getPort().accepts().length == 0) { if (storedPort.getPort().cardinality() != port.cardinality()) { logger.warn("Defined cardinality {} on port {} is different from the implementation port {}", - storedPort.getCardinality(), - port.name(), - port.cardinality()); + storedPort.getCardinality(), + port.name(), + port.cardinality()); } logger.debug("Replacing port on endpoint [{}]: {}", endpoint, port.name()); this.ports.put(port.name(), endpointPort); @@ -78,13 +101,13 @@ private void parsePorts(Class clazz) { } else if (port.sends().length == 0 && port.accepts().length == 0) { if (storedPort.getPort().cardinality() != port.cardinality()) { logger.warn("Defined cardinality {} on port {} is different from the implementation port {}", - storedPort.getCardinality(), - port.name(), - port.cardinality()); + storedPort.getCardinality(), + port.name(), + port.cardinality()); } } else { logger.error("Implementation of port {} is defined multiple times! Possibly undefined behavior can be expected.", - port.name()); + port.name()); } } @@ -112,6 +135,9 @@ ConnectionManagerImpl getConnectionManager() { return connectionManager; } + /** + * @return The real object that has been wrapped. + */ public Endpoint getEndpoint() { return endpoint; } @@ -131,19 +157,8 @@ public SortedMap getPorts() { return ports; } - @Override - public void run() { - while (running.get()) { - try { - commandQueue.take().execute(); - } catch (InterruptedException ex) { - // Is expected, the thread is probably closing down - } - } - } - void addCommand(Command command) { - commandQueue.add(command); + endpointContext.submit(command); } @Override @@ -152,11 +167,10 @@ public void close() { port.close(); } - try { - running.set(false); - thread.interrupt(); - thread.join(); - } catch (InterruptedException e) { + if (serviceReference != null) { + bundleContext.ungetService(serviceReference); + } else { + ((RuntimeContext) endpointContext).stop(); } } } From e2621b2f76353c840fdb05513f03219820ae0bfd Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Thu, 30 Apr 2015 13:42:11 +0200 Subject: [PATCH 095/105] Fixed NPE during closing when there is no UserAdmin --- .../flexiblepower/runtime/ui/user/UserSessionHttpContext.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/UserSessionHttpContext.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/UserSessionHttpContext.java index 1727001..13a960d 100644 --- a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/UserSessionHttpContext.java +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/user/UserSessionHttpContext.java @@ -81,7 +81,9 @@ public void activate(BundleContext context, Map parameters) thro @Deactivate public void deactivate() { - trackedUserAdmins.close(); + if (trackedUserAdmins != null) { + trackedUserAdmins.close(); + } if (loginServlet != null) { loginServlet.close(); From 25eedcd4fd7ecbb75fa9cf509789da9a509dceef Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Thu, 30 Apr 2015 14:43:49 +0200 Subject: [PATCH 096/105] Fixed NPE when sending no targets in the connection --- .../runtime/ui/connectionspage/BaseWidget.java | 4 ++-- .../runtime/ui/connectionspage/ConnectionInfo.java | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/BaseWidget.java b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/BaseWidget.java index fa89a65..f627cdc 100755 --- a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/BaseWidget.java +++ b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/BaseWidget.java @@ -27,7 +27,7 @@ public void autoconnect() { } public boolean connect(ConnectionInfo info) { - if (info == null || info.getSourceEndpoint() == null || info.getTargetEndpoint() == null) { + if (info == null || !info.isValid()) { return false; } @@ -51,7 +51,7 @@ public boolean connect(ConnectionInfo info) { } public boolean disconnect(ConnectionInfo info) { - if (info == null || info.getSourceEndpoint() == null || info.getTargetEndpoint() == null) { + if (info == null || !info.isValid()) { return false; } diff --git a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionInfo.java b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionInfo.java index 6533735..373ff62 100755 --- a/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionInfo.java +++ b/flexiblepower.ui.connectionspage/src/org/flexiblepower/runtime/ui/connectionspage/ConnectionInfo.java @@ -26,4 +26,8 @@ public String getTargetEndpoint() { public String getTargetPort() { return target.substring(target.lastIndexOf(':') + 1); } -} \ No newline at end of file + + public boolean isValid() { + return source != null && target != null && !source.isEmpty() && !target.isEmpty(); + } +} From 172be153955ef683e7264c282436cedc89e3bc69 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Thu, 30 Apr 2015 15:20:30 +0200 Subject: [PATCH 097/105] Fixes #26, by adding a unconnectedStateUpdate method Also reduces the logging level, because this should not be a warning --- .../ral/ext/AbstractResourceManager.java | 67 ++++++++++++++----- 1 file changed, 52 insertions(+), 15 deletions(-) diff --git a/flexiblepower.ral.ext/src/org/flexiblepower/ral/ext/AbstractResourceManager.java b/flexiblepower.ral.ext/src/org/flexiblepower/ral/ext/AbstractResourceManager.java index 1233081..3b274f5 100644 --- a/flexiblepower.ral.ext/src/org/flexiblepower/ral/ext/AbstractResourceManager.java +++ b/flexiblepower.ral.ext/src/org/flexiblepower/ral/ext/AbstractResourceManager.java @@ -9,6 +9,7 @@ import org.flexiblepower.ral.ResourceDriver; import org.flexiblepower.ral.ResourceManager; import org.flexiblepower.ral.ResourceState; +import org.flexiblepower.ral.messages.Allocation; import org.flexiblepower.ral.messages.AllocationStatusUpdate; import org.flexiblepower.ral.messages.ResourceMessage; import org.slf4j.Logger; @@ -17,6 +18,11 @@ /** * Gives a basic implementation for a {@link ResourceManager} which does simple translation, possible while keeping * state information. + * + * @param + * The type of the {@link ResourceState} + * @param + * The type of the {@link ResourceControlParameters} */ public abstract class AbstractResourceManager implements ResourceManager { @@ -34,10 +40,46 @@ protected AbstractResourceManager() { private volatile boolean hasRegistered = false; + /** + * This method is called when a state update from the driver has been received, but this manager is not connected. + * + * The default implementation logs a info message to remind that it is not connected. + * + * @param state + * The state of the driver + */ + protected void unconnectedStateUpdate(RS state) { + logger.info("Message Received by Resource Manager but no controler connected"); + } + + /** + * This method is called when the first state has been received from the driver and a registration is needed. This + * method should return a list of {@link ResourceMessage}s that should at least contain a registration message. + * + * @param state + * The state of the driver + * @return A list of {@link ResourceMessage}s that will be sent to the controller. + */ protected abstract List startRegistration(RS state); + /** + * This method is called when the state is updated and the {@link #startRegistration(ResourceState)} has already + * been called previously. + * + * @param state + * The state of the driver + * @return A list of {@link ResourceMessage}s that will be sent to the controller. + */ protected abstract List updatedState(RS state); + /** + * This method is called when a message has been received from the controller. This will generally be an + * {@link Allocation} object, but could also be of another type, depending on the used message type. + * + * @param message + * The received message + * @return The {@link ResourceControlParameters} that should be sent to the driver. + */ protected abstract RCP receivedAllocation(ResourceMessage message); private volatile Connection driverConnection, controllerConnection; @@ -69,9 +111,8 @@ public void handleMessage(Object message) { } } } - } - else { - logger.warn("Message Received by Resource Manager but no controler connected"); + } else { + unconnectedStateUpdate((RS) message); } } catch (ClassCastException ex) { logger.warn("Received unknown message type {}", message.getClass().getName()); @@ -95,14 +136,12 @@ public void handleMessage(Object message) { if (control != null) { driverConnection.sendMessage(control); } - } - else { + } else { logger.warn("Message Received by Resource Manager but no driver connected"); } } catch (ClassCastException ex) { logger.warn("Received unknown message type {}", message.getClass().getName()); } - } @Override @@ -116,7 +155,7 @@ public void disconnected() { } /** - * Indicate if this {@link ResourceManager} is currently connected to a {@link ControllerManager} + * Indicate if this {@link ResourceManager} is currently connected to a {@link ControllerManager}. * * @return boolean indicating if this {@link ResourceManager} is currently connected to a {@link ControllerManager} */ @@ -125,7 +164,7 @@ protected boolean isConnectedWithResourceController() { } /** - * Indicate if this {@link ResourceManager} is currently connected to a {@link ResourceDriver} + * Indicate if this {@link ResourceManager} is currently connected to a {@link ResourceDriver}. * * @return boolean indicating if this {@link ResourceManager} is currently connected to a {@link ResourceDriver} */ @@ -134,22 +173,22 @@ protected boolean isConnectedWithResourceDriver() { } /** - * Send status update to attached controller + * Send status update to attached controller. * * @param allocationStatusUpdate + * The {@link AllocationStatusUpdate} that is to be sent to the controller. */ protected void allocationStatusUpdate(AllocationStatusUpdate allocationStatusUpdate) { if (controllerConnection != null) { controllerConnection.sendMessage(allocationStatusUpdate); - } - else { + } else { logger.warn("Allocation Status update from Resource Manager but no controller connected"); } } /** - * Send control parameters to attached driver + * Send control parameters to attached driver. * * @param controlParameters * The parameters that have to be sent to the driver @@ -157,10 +196,8 @@ protected void allocationStatusUpdate(AllocationStatusUpdate allocationStatusUpd protected void sendControlParameters(ResourceControlParameters controlParameters) { if (driverConnection != null) { driverConnection.sendMessage(controlParameters); - } - else { + } else { logger.warn("Control Parameters update from Resource Manager but no controller connected"); } } - } From b881d58de719dc4eed36b6edfa7f990e56e92894 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Thu, 30 Apr 2015 15:39:21 +0200 Subject: [PATCH 098/105] Added the AbstractUncontrolledDriver that makes it easier to implement uncontrolled drivers that connect directly to a energy app Fixes #27 --- flexiblepower.ral.efi/bnd.bnd | 1 + .../efi/AbstractUncontrolledDriver.java | 89 +++++++++++++++++++ .../flexiblepower/ral/ResourceManager.java | 3 +- 3 files changed, 91 insertions(+), 2 deletions(-) create mode 100755 flexiblepower.ral.efi/src/org/flexiblepower/efi/AbstractUncontrolledDriver.java diff --git a/flexiblepower.ral.efi/bnd.bnd b/flexiblepower.ral.efi/bnd.bnd index 21c1d8e..aec47be 100755 --- a/flexiblepower.ral.efi/bnd.bnd +++ b/flexiblepower.ral.efi/bnd.bnd @@ -2,6 +2,7 @@ osgi.cmpn;version='[4.3,5)',\ osgi.core;version='[4.3,5)',\ junit.osgi;version='[3.8,4)',\ + slf4j.api,\ biz.aQute.bnd.annotation,\ flexiblepower.api;version=latest,\ flexiblepower.ral;version=latest diff --git a/flexiblepower.ral.efi/src/org/flexiblepower/efi/AbstractUncontrolledDriver.java b/flexiblepower.ral.efi/src/org/flexiblepower/efi/AbstractUncontrolledDriver.java new file mode 100755 index 0000000..fd936c3 --- /dev/null +++ b/flexiblepower.ral.efi/src/org/flexiblepower/efi/AbstractUncontrolledDriver.java @@ -0,0 +1,89 @@ +package org.flexiblepower.efi; + +import org.flexiblepower.efi.uncontrolled.UncontrolledRegistration; +import org.flexiblepower.messaging.Connection; +import org.flexiblepower.messaging.MessageHandler; +import org.flexiblepower.ral.ControllerManager; +import org.flexiblepower.ral.ResourceState; +import org.flexiblepower.ral.messages.Allocation; +import org.flexiblepower.ral.messages.ResourceMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class AbstractUncontrolledDriver implements UncontrolledResourceManager { + /** + * The logger that should be used by any subclass. + */ + protected final Logger logger; + + /** + * Creates a new instance for the specific driver class type and the control space class. + */ + public AbstractUncontrolledDriver() { + logger = LoggerFactory.getLogger(getClass()); + } + + /** + * This method is called when it is connected to the controller and the registration object should be sent. + * + * @return The {@link UncontrolledRegistration} that will be sent to the controller. + */ + protected abstract UncontrolledRegistration startRegistration(); + + /** + * This method is called when a message has been received from the controller. This will generally be an + * {@link Allocation} object, but could also be of another type, depending on the used message type. + * + * @param message + * The received message + */ + protected abstract void receivedAllocation(ResourceMessage message); + + private volatile Connection controllerConnection; + + @Override + public MessageHandler onConnect(Connection connection) { + if (controllerConnection == null && "controller".equals(connection.getPort().name())) { + controllerConnection = connection; + controllerConnection.sendMessage(startRegistration()); + + return new MessageHandler() { + @Override + public void handleMessage(Object message) { + try { + receivedAllocation((ResourceMessage) message); + } catch (ClassCastException ex) { + logger.warn("Received unknown message type {}", message.getClass().getName()); + } + } + + @Override + public void disconnected() { + controllerConnection = null; + } + }; + } + return null; + } + + /** + * Indicate if this driver is currently connected to a {@link ControllerManager}. + * + * @return boolean indicating if this driver is currently connected to a {@link ControllerManager} + */ + protected final boolean isConnectedWithResourceController() { + return controllerConnection != null; + } + + /** + * Sends a message to the attached controller. The call is ignored when it is not connected. + * + * @param message + * The message that is to be sent to the controller. + */ + protected void sendMessage(ResourceMessage message) { + if (controllerConnection != null) { + controllerConnection.sendMessage(message); + } + } +} diff --git a/flexiblepower.ral/src/org/flexiblepower/ral/ResourceManager.java b/flexiblepower.ral/src/org/flexiblepower/ral/ResourceManager.java index 5dee228..0bf359c 100755 --- a/flexiblepower.ral/src/org/flexiblepower/ral/ResourceManager.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/ResourceManager.java @@ -2,7 +2,6 @@ import org.flexiblepower.messaging.Endpoint; import org.flexiblepower.messaging.Port; -import org.flexiblepower.messaging.Ports; import org.flexiblepower.ral.messages.Allocation; import org.flexiblepower.ral.messages.ResourceMessage; @@ -18,6 +17,6 @@ * Any {@link ResourceManager} is an {@link Endpoint} and should have (at least) 1 port, called "controller" to connect * to a {@link ControllerManager}. */ -@Ports(@Port(name = "controller")) +@Port(name = "controller") public interface ResourceManager extends Endpoint { } From 1c7c66455ce4f6416b7f77baed2b94b5c493aa1b Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Fri, 1 May 2015 12:26:11 +0200 Subject: [PATCH 099/105] Updated cnf/gradle --- cnf/gradle | 2 +- .../src/org/flexiblepower/ral/values/Commodity.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cnf/gradle b/cnf/gradle index e2e8aef..a430df7 160000 --- a/cnf/gradle +++ b/cnf/gradle @@ -1 +1 @@ -Subproject commit e2e8aef728226445a56337e82c7b6163fa80f49c +Subproject commit a430df72a0b1b5bdc6fbfec3e3b31de1c1317f0a diff --git a/flexiblepower.ral/src/org/flexiblepower/ral/values/Commodity.java b/flexiblepower.ral/src/org/flexiblepower/ral/values/Commodity.java index e389ea8..dcb19c4 100755 --- a/flexiblepower.ral/src/org/flexiblepower/ral/values/Commodity.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/values/Commodity.java @@ -25,17 +25,17 @@ */ public abstract class Commodity implements Serializable { /** - * The singleton object for {@link Gas} + * The singleton object for {@link Gas}. */ public static final Gas GAS = new Gas(); /** - * The singleton object for {@link Electricity} + * The singleton object for {@link Electricity}. */ public static final Electricity ELECTRICITY = new Electricity(); /** - * The singleton object for {@link Heat} + * The singleton object for {@link Heat}. */ public static final Heat HEAT = new Heat(); From a684d3164770148a61cd89b4261f49c4cf064d33 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Fri, 1 May 2015 15:00:57 +0200 Subject: [PATCH 100/105] Added generic stuff for tooltips --- flexiblepower.ui/res/css/tooltip.css | 53 ++++++++++++++++++++ flexiblepower.ui/res/img/info.png | Bin 4403 -> 8500 bytes flexiblepower.ui/res/tooltip-voorbeeld.html | 14 ++++++ 3 files changed, 67 insertions(+) create mode 100755 flexiblepower.ui/res/css/tooltip.css mode change 100644 => 100755 flexiblepower.ui/res/img/info.png create mode 100755 flexiblepower.ui/res/tooltip-voorbeeld.html diff --git a/flexiblepower.ui/res/css/tooltip.css b/flexiblepower.ui/res/css/tooltip.css new file mode 100755 index 0000000..c402191 --- /dev/null +++ b/flexiblepower.ui/res/css/tooltip.css @@ -0,0 +1,53 @@ +/** Tooltip CSS **/ + +a.tooltip, a.tooltip:hover { + text-decoration: none; + outline: none; +} + +a.tooltip strong { + line-height: 2em; +} + +a.tooltip span { + display:none; +} + +a.tooltip:hover span { + position: absolute; + display: inline; + border: 1px solid #DCA; + padding: .7em .4em; + z-index: 10; + + line-height:1.2em; + background: white; + color: black; + + width: 350px; + margin: 0 0 0 12px; + + border-radius: .5em; + box-shadow: .4em .4em .7em #CCC; +} + +a.tooltip:hover span img { + float: right; +} + +/** For the info button **/ + +a.tooltip.info { + position: absolute; + right: 1em; + top: .5em; +} + +a.tooltip.info img { + width: 25px; + height: 25px; +} + +a.tooltip.info:hover span { + margin-left: -370px; +} diff --git a/flexiblepower.ui/res/img/info.png b/flexiblepower.ui/res/img/info.png old mode 100644 new mode 100755 index 83de6545870d0e0af384f39f59b6a05c7277a3b9..5a2f0f3fa2e11fb87680a70faed3f035a845d031 GIT binary patch literal 8500 zcmeHt`8U+j|Nnix%rH!tu`A1vE$fI9k|F!PRkpH)q%37myvDv$DN;nqlC=;;3?ig# z6=fS0Df_;gulMKkPrT3he(pK<+~xT^&wKClaUS=F`?&FDCc4Z_hnWBX%=&s-768Bp zT^L~K4w}{ik&c4~x@n=S3Cch7{XH0<+%=3f0C<^--E~3(KnKi>thE2*1VOB@`{RzgN6RD{9gwC+cJQQ z_%(Y#0pMq0VoCe|y8z1#2GIk27=83?ZUVs4`kxAY@GiQ1Fv;VmZS802?dBKgbi)<+ zIC*&a$$Gi^5fo*KvIh|f7U)+n{$4frUN$vhT^spGzf7(|3@cp~`t2!I+DI2M7Gh}YhJMB6L@vZcr zUEPP!%nVR*#7N4t{i;GqKywmms9Y#9>2E?T?|qa4-f^QYYIezai8-u0eV)3V+6I4(^H4zV zZ@EV_-4XHY>{A@n&iYTOPFtv#hT57?Ku&Vl;gZlck_yzQ8@k01^W)0HGVM$wL|5+* z@f?j;fKaa7Awns?mLb?PDi`MqFJl%J^w(LV2QFrHMo7cgTF>usTZ@?!Vu8B4Tlnvj zlpH>$%Q(X5aFci>yoAGhZ3Db(w}l4@pq?-iBqw4GLn!DeNL&?c-m2NoNANhaYZ>^Gd#U zEiH?Fi3$oeE#zInm>!8RgGbgo6*guUtXo!e2x*|Tw`Z1jFGWF`Ll-%hagxcKw#mLK zctbYm{Nk6kcwx$T8Zl&5`N!U~2QPobpuQV(X(8i6=aM!b2M5li8nLKfIf8R>B*uXD z?55k_%Dz3C`;xfPu(!XY*nIZ0loal%437pPBNE4(`1P0RKdbJFdkRx59sH;Eqrur$ z2*smH6O-PKd?!LDCpWyd-yuIa7@ohIMhb>f{#}|>Y`mb-Gc%q%Kl^*hWvp2(!Q2)J zU;i4OA(^#R5tfp%&U<+$R_2{iZY22 zG?`I3%@@h7_Sn!DvdjA*Aws#QxUvx{qgGsS;m|H))3hNk#Pf+}p2_;7^k`|tt-iy; zlKs3A!idF&+-KPCc~))|B#JWYq&YGy`|q{n`Q80`4Sh(0fHd^mkBqbryF9ybw^M0T zUVRtM^I*RV6Y{TpLXllVo_a>)w=AN$uRH2dcD#1-I#LS^ZA8E0cZ|G(Z}xr%?$Gil-x?jY%vmeXfqbS#di$^F4yyqbO9wu>sOQLpwW{4QpY7Y zZu^7H;c!7bCv5VI-vriMR{t}jE_@6XdT0?(wdvi(hEuoCu|xwkh)dSS_;g1J7v7d!4$7yUM@?;b4O|;?Z`DQ_GsdrSI09H*_Aj z4U4b8Qa{rT`3}V77K1OHI0@8L-;Vl+lb3D{S%En9JI;2K{Eh+%AWx=p_xgFd-azA0 z^***XGw^Mz>1I!O0TfW?tO{BG3GY#-+0aYR{?HD9NhA8*FL!9X)}or8I8AH+?l7Kr zTvHPK|2o3QRD?>ZU$P-p#{J>me#cJH^IVUwVFS*|Qh(YLcgJaSZhJe6FXNIoy4ef4 zklZewz1haR$ncivoBM*WPe z>dQ6lhDQ%Hlv7`GO%5T&ddWQLrd+U}ytZ1;jyA4Wz<%LNi87|P)h(O>W%Zsa9!t-) zeJ5mOidHEjSIBkD)yv1oY_Cmd8(vKWdfyk6XsH*UR4>}zX%sC;Z|(=TAwq#QR~WOm zLCMGBbIal*EV|xUl-1cihEDAG$TwP_?Px8oi^uQATw=m4Oi}b}pn5fL>LmCwNW&>v zabyeY2;eNdh#pwd?8vr1&=L3E646ve--f zoDGOOdbqYZuuhOXUlvu_o;DigqcXjJxCTA_ns%>NytSAu2pM)VPk!*qL~&$2{NAGi zWB~J(Up@e5g#IeH1LNPr&9g$YW~$8}&Fc8MK3(x}Yf1U`cug5q99zTh62ws`jI86e zzxEhiWg><4?6M$KE)b>-e9_6y)f{L7%eDFwphI*PoW|}(C~N7ig_tIo>K&oGVQ4#F zFtRkD?#0ge%eauY?aPs(Zyy<)1Hbuh@%MGJkLXAWZB<4W*)IQOM2x4F@M?nyi&DOV z4o6t4z>j<+EAuL=o-`n&Gdwn@2JRY2)(Nqd1r<-CCU5#+dzcVqrn(Q;Ux#q`zhy$C zs%;@#nCeiq57{e0i>hR`lx$90(cD!Q4@T0CfCy?Cn(su1wb9ibWqE!c>0jw<2dAYF zBe>UAN~O4HHFV%2VxBf(`lo`%tTaW}^i%VK-GoE_I3ev&_Md0PSaL&dy0JUru;f&C z^kj>qHu8DpP670el^ipCgY2+0K@>;ske=Uuu^gKJ{bcRS8nq~kHNHhDlQbQf6JqFd zIjLXzmajtrl-qA86{j>_7@at5DcQrYq%kp6K~HVBr(S3v)X)hfp_0d^V}JDCi6N#? zk`G+#pjz#`-p3Yq;*jx)O+R?#ZM;M$?61(p=gd{CVc*yDW#Ao_c`2g># zyHWQS@Max&132Rp=FG>-y#ig^oLlK>_P|0A*HWi>U=y07QA*&lCc6lGswh4D)(cJ44dV>wSI9eC8++3^uhcfYHe#l-AkEt4BjUb zjq+jKwsjj582eTU6_z>}08HA^6EoYMX=aH~UCo|%{WHfW1OvqziD&;yEaO6S$& zaE{YtC_aQ#Y9kVk2=4UdJjQe9$Q~4zQ@@(qLS)pUlmpCv8Hj=M@DrzX|MoPq-Uom8 zQvc7+?`MzE!CE|m7xnoGQfGQO=I8{5#Q%N`@!b4~X<-YAz(qugNav+R z;GQ?LFr;6n&5=6@IIGILrOl%5G#$<(7JHbVisiD6W4AJ7krz&}upyzeXqCjC%ZQmR z@cicb2BKQp8(3@fj%vAvprSC%UvyQR6)(^)GVWqEd-1=S_kCIk+W&GqEr+5Rq)j!R zFH$k;(P-GQ{@4rgNBMEPwEO4s z5Wj}Tce1E6a~e8S6$__1F}(lCTSMOg3RrlCokpA=$WZ9N?$3Cf0D`-o?b-Ot*hM5nFG5LUl<2~6@y5U zCM$F>Zeofx#Lzmac&#BfP?6{^UkB$h9K(8H9-)t1vwNgG(o(KcNm*l-O-mV|tZ8L7 z2TYp-OfR+nxsdG3;Iiv(^m*J-u~`nLjBjh&O0GSGbDh5?+WFo3DoqMcjNB;q^-S?- zztXzKeCDi*Gcw~ryjgSt+C|bI)0Y=EW21APT`>mA)3;knZIp7rv@hi(6MQ+-5 z1Uqu0(+B#pP1ME#(Opr5O zWz0oThyF}7LFK#)iCry9J=o)$Fe53N&G7d zTWRWc%ptuV{Zq!W55UmC#E+{4{>pb=pOyKfA!^vYYIL(oZU%kp8ix^DVzK#o74<@8 zn23%NJtwX4AsDnIauT`{7H8qy!I%S|Q%=&qTnY74(eqE zgX~0hNBlH0v6S@Uw*kUZ*Kpbx`IyPr%gOE&9Q*>0 z$kWCQkdkUPDxXi4K6QCn5t41iI1h=Ocq#x*^ULYTI^9#~4s>=Sfc2egtDA?JaPF3* zFsRa{*%+xha31)d9Un3V;aNa93uJh}_Rkr8V#E-2V}L(ciic^@p|0_?Kc=^*e}LPm zhK(v&hB|eYo$^Esi4&u^W`PTxVqmXI$QUURVR!5^K&lQlb36tfXA$KNh@v7=^!RBF1}C|5}kIvVY(2AR^a1 z^Lsb8!hsf<|AF@DZ8^dyi4*`;F8vA3|7e9sj34Tf1?zUBUZP$@Lg$6lr}{!)cqBawec?R-p=X^P7+aR$D@`rDBSxstiscj^5VR6ZBj zD_=T1VgwOAt#o{aNahw;ApbC?c0b{fhR=Wpb^GZTp#wTbJ<`}){LOI|k8=_sRDmI5 z4JAViDM|{wbxWv}l&AvJ=7DaWiBjN;uW)o=;qET57rr*ZjW>90pf~Cxu;cw3FJ@m?FIGqemRe)(5r2y|l84&Vd zd&(4Jp3(ptRWyw?#f}UnIgnbD3!MVYI6I|)Tb(NkPMg3Y0*n$44EdbEq5IVz`%Rc? zdB4g*<9;=q8%SL|+Qpq)LPwmV%xC@dC)q+?LWc+cRzYwt9)pxT*&eztfbEi`$i=lO z?gknWKv>e#Rco{J&}j>60)=Q0UyM#jMZ0nWVKU;-Zm>-6m6E%d_fj8C62wUbw~D}2 z-AHV>npiOyx_L_L<~$o@f9NZr7~mLC5p3tvPx#zIxyHgbm=Hl!+U2KuAe8r9fCQls z;G#Xa?jAlb0z%%|PPjQ5K>INggtXH7^sk?B5K8+I`51aLV$S8Gt@UxJ*PrrqI>}52 zT3jK$$}kiIc`Q^urvhyqXuI?LWk!N+upB!uXYgZ{Kf@3up`im2U>*XB)u}Nw@)SX0 zh}}p6WBuysVfF(lOWz!*QN&4JC=r+6Rv;7&Ju&H6hG}SlHc{gkLd|;w$_H zqpiU%*=f=i`i>%SfST zq3j&j{IwrWQ0!qd+jIS5xd|YOH&0WWBnwf$N&NPIp_7tJFHIKyLtnrKn*O|^Yr*v5 zsE~6c+){Vf0MsckMe{33^1^)@=FT2wV$kA@v??J9#R*m35xANF%bgR3woO-_^#wh& zLQ%Y(XC;V-)Ac|XPg+-jUAD?YE3YkY&QC`{o^nlZv9UjjRN!*~y;=iM%STgzj~$=n z9m_6ei_Xb07Net}SmbN5;eAxD=*x{;_q7qW;-Yf`_Y%N@0U;6iSn?Spdz3Zs4DhH5 zPlrYYu|bQ&bGOo;7OWrdPe3}fXXJC1^4ly*l*+__{2ifmR%H~0J6FwCe&8dcEuL!2 zn2$rwLq*Jme;F6)p2moHO@t&lNXPr`GB&@Lc+gfYOsQh)Ab=5E{8-Ri=QFr_-+fO> zkU_o>;Zu-DW1NFt8P5l0@&N%-qxj51gB8&P8P>T?!6*gs29U1yS}nnS;l=qj2SS)N zAyat*jnq5!m8$tGK*DitCA_$cz?qJ8qQ?(SnB^4kxk``XMutG|Me7p#LuWbqiu~Ox z*zCYhkZ|Kuu`~!v1%5o2gmRDNp@Z_)va2@+k6{;Ii=0Uri)-i9#8&2ig02*1z6M{) zb3f*jE<;x=0e`|piokW~$`QK|zI7%vS8mXaVl2snAw~PiUQAydOjU}QFJZ(K#WaHS zF9J`xb_stg;k2XedwRRBt7rnNXVC@ECvgW{bx!>5Jl#zKexi%}tGM2TBA8-~A(6DD z`*UuzG{+gb6ZzhwIr!;6iQdcbrd{5I%XR2Fw!CkA&WQ(6Rr4EP+`-Q?NJZJ(UlycM6lxJj17} zn~@x47ED?_&E*wuZ9*A(Nd88XyUp^=6|RQLEE<3N%w#Fr(U|FwwOq$qbOX&Z_f~Le zQsQY389S@DQDMTX^UIQ0FuC!}GqkwqFyKIk&<3bs+|5>_NV}pxivoerSQm zhkQcnIF%^c)0@c$SarCvmSSv4m+|$uUdO&{`JL^%rGI@LQd$4 zHT9ns&^Cs`kK*q*E%DxV2iiOor^>jv?!KXw|C%aq6N}ok>sNU!rqzJLy~FBb$sDP( zVu-Xd8yCDc(<8YOL-MK@*+n@Xt~71EHVSF{YHF?MxXD4XrXSgb)bBxIw^$SsZg^=#*Tk{IjN4IRz2;RK-&HNGjs?;D4JT%8Z5qVE42K^LD2V8xHt6P zm9&bEyo;~EkM9O@BjYU7_jzkxUOL(w`)+%Z|Ih9QH+7CH$BNYZjXJb`&&sE9t_cc< z#u}TeER;>YBTRaa_UZP|=Acn&DGW)%(k?aV9FAAv=FT1UQDFACBWpU^mm^JSkDlpw zI4_j%N+J74wf&O&nIdQ=Ov5tfu60R!%^S!a*?qMAyfiWWSTEB-UaEPRZrI!lcHDB< z>|~pcJDsnY$5fUMo}P22H0NlxQL6m9Yu#zM=LWBw;oc^h8~1fn(di#%*V)5d%*8JM z<=>;5MBz+X!l>(=722Cm`({*IZf!2a-G!(9=wmj#Lm4wTi$xYm|QhspF3Yes>cvuI?2FBa&7iu(yZP`%-|sw#wejLofi(C)Nk=Jk!>!Zn^~Hf z#gHFYn=7@3zjK*@d!1wn=|+k|yHGB8RdrvJ-N(>Q3o@ancmE=Qc~hfS0AgKXg^v9t zJQsTK_9f9GAgNk*7VmF*%NmLaaXdL0J`!mRV~J1pNxz>ZYhoAIrD|Zau+g^C-2)N9 z?_$gB3SD2%>qJ?kzw^j*>lpRfGmW6|Icdag;$f!isqe=l0iz*#EQXKa(G)J%l3FY8 zI*@jBX9d%H4EIjg$DUzCv~%AGZg@BM#l%HkEa1aJx)JPm+4^|;jAdZw!Lf$lUsO=6 z-u;>5ax2FV_B%lyXy>OdX|cP_E5eccO#PXQuRW8N1m5de*}CQ(OQf8KIBL}Hm|Zjx zXmlP@$r&$+=tol|JI=__$D^l*w0Mrxef&1BDpU*jqxn0scliIJr%%1WhU(id3uZ?*4WqYFb`v3e_&D{b$k4~_%EUlL*-2Wl?DQPkW#cva)fYE#+iy_l0dd3jVSsc%VJe$qnoN9gGh-&-(NkeWZdrq;sj( zbmrbm*zfwH>z?ADQo)B!;8wu!++ly1diCAd-JbhKhHCKR#fH82sk}-5h(%UNd(MBc iM)$ueVpeS}jV|L;yU%GH?ciSo0Q%Y{TIHIK5&sVpyHync literal 4403 zcmV-35zOw1P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000JFNklpg*qg{3T}!CNiW2d)(Mw{L~0-jD1`@RR3%)dGRE2>0oK~$6SAJqp^yK~p;I3b z#qloSwg1-xdsj6s-|>T|p5!ytX{?3ozG2*p$p?lYhR77)XbA}|S(H?yU6-wE*Ye29 zmArB6XlvJhd+q^t&YJ_Xj9+bja81iMAAJM_WU>*1*^nRxV=cxOR&6XLvNpn4P!jI0 zb-1glitlgvI&XjQ{*Jc)eCz^0S}1_MPd&J%-r5u#;N?xt4`Ee`b60~I3cV6PO@F(TFHQW@nd^9l5?J4W7ei3w+lPEYQN=@F zTm|s*Y#~rmirtTWc{N=lektY#FvSoUro&(@9K3Xczh0ay<^>q+G+#{8xU@~-WG2tr z2foUOo$b4=wR?cL9KhyP_ukKluNe1(f?->((3UBNOvgWn{Ct^lSn`!k#d$M#h%Ey1 zd`n;6VR^$cF7@_o2Hq_P@c8njpXI_>Kwv5iGSj%RmOuaG8S1NM=I;}K=q-V^Ov_L4 z#zN;vKtp{4mwJ01p8_zI1I_8`JGc=Ud}9cVEt0{H3w&67_l)J+e;MHH;P?yxlc8ZU zG-N|VHZa@>4L2e~F0y!WL2ovUanf}F&6PQ@)Kdw(NDxE@FSf+S5*Y|hVO5c_lpoyJ zax=?(-jw|-ZmRf&UoFV%G{DkI0PZK*h|ySMLc^>rf)o{cE8e7-|IiU29ZA*-%D3Va zfWXJ190?XoynrU9!rrX_NF`8?Bq(?)s07d-MY$EKx~8ytF^3oC!=uFftJf0cN}|ae zK!0T+Y7erbIIciD0;L5~GB1e=d-KYxf?mfJ1ldu5_DTSUb0dA|ghD4IQcI)~2st<1 zw8}Z;rd+QR5}i=wM*08_SBBu=X#W+K#6C_kQOJ63kqebEvN1yGS!1sg5+|u3_8INJ z0&uX>1F^Ms&v55S+@!=!DYPq)S|B7hQMU7+)F#wS`xoBFhWQzCQVX;za8n95DH-WH zMR^&nJd9qwdcKp`%aTYb+_Xl!g>Y25_3)3MVdc`rGXR|U>9@G&&YEf0Yl(IxZd#K_ zDPk|n$hk8Bug=vE1lGj6dfJY(uH3dAsWegw0xu>GEvBr{JbQF_?u?fLDFw+?l%nPSjT>1fWL~)3s#2KGbFu9>105asnclr)Z|(m@aiQ_20RX_*Tl@bg z6RG3grf0v?d-BBB>XtQDFK%2$&5|WJ$s|&1OcW7%9@(KGMtd%E?Q+j#n7Q)a#E}DU z7(ah`L3hJhh5>wF-1zz7Yw!N<_rN=oP3xM58dfyvMRzm^?WB>)!Nj4B!dx^l))(|$ t?8tTes{@z-Mu7369y9ON>~@a-4FG!UaA7!CkSG8E002ovPDHLkV1k>#P7nY9 diff --git a/flexiblepower.ui/res/tooltip-voorbeeld.html b/flexiblepower.ui/res/tooltip-voorbeeld.html new file mode 100755 index 0000000..2f259f9 --- /dev/null +++ b/flexiblepower.ui/res/tooltip-voorbeeld.html @@ -0,0 +1,14 @@ + + + + + +
+ + + Title
+ Wat extra uitleg is hier van toepassing ofzo... +
+
+ + \ No newline at end of file From 18983c464af78c8052a5f0bb39a64ab1384cbce4 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Fri, 1 May 2015 15:01:39 +0200 Subject: [PATCH 101/105] Improved logging when method does not exist and fixed some checkstyle warnings --- .../org/flexiblepower/runtime/ui/server/HttpUtils.java | 10 +++++----- .../flexiblepower/runtime/ui/server/PageManager.java | 8 +++----- .../flexiblepower/runtime/ui/server/PageServlet.java | 3 ++- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/HttpUtils.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/HttpUtils.java index 0126119..ff28fab 100644 --- a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/HttpUtils.java +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/HttpUtils.java @@ -16,10 +16,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class HttpUtils { +public final class HttpUtils { private static final Logger logger = LoggerFactory.getLogger(HttpUtils.class); - private static final Map contentTypes = new HashMap(); + private static final Map CONTEINT_TYPES = new HashMap(); static { add("text/html", "html", "htm"); @@ -38,7 +38,7 @@ private HttpUtils() { private static void add(String contentType, String... extensions) { logger.trace("Entering add, contentType = {}, extensions = {}", contentType, extensions); for (String ext : extensions) { - contentTypes.put(ext, contentType); + CONTEINT_TYPES.put(ext, contentType); } logger.trace("Leaving add"); } @@ -48,8 +48,8 @@ public static String getContentType(String filename) { int ix = filename.lastIndexOf('.'); if (ix > 0) { String ext = filename.substring(ix + 1).toLowerCase(); - if (contentTypes.containsKey(ext)) { - return contentTypes.get(ext); + if (CONTEINT_TYPES.containsKey(ext)) { + return CONTEINT_TYPES.get(ext); } } String result = URLConnection.guessContentTypeFromName(filename); diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/PageManager.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/PageManager.java index a7de8c2..f9d9c1c 100644 --- a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/PageManager.java +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/PageManager.java @@ -62,7 +62,7 @@ public void activate(BundleContext context) throws IOException, NamespaceExcepti @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, - IOException { + IOException { if (req.getPathInfo() == null || req.getPathInfo().isEmpty() || "/".equals(req.getPathInfo())) { resp.sendRedirect("/dashboard"); } else { @@ -122,10 +122,8 @@ public String getTemplate(WidgetRegistration activeReg, Locale locale) { } @Override - @Reference(dynamic = true, multiple = true, optional = true, target = "(" + WidgetRegistry.KEY_TYPE - + "=" - + WidgetRegistry.VALUE_TYPE_FULL - + ")") + @Reference(dynamic = true, multiple = true, optional = true, + target = "(" + WidgetRegistry.KEY_TYPE + "=" + WidgetRegistry.VALUE_TYPE_FULL + ")") public void addWidget(Widget widget, Map properties) { super.addWidget(widget, properties); } diff --git a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/PageServlet.java b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/PageServlet.java index 7b91801..16e5460 100644 --- a/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/PageServlet.java +++ b/flexiblepower.ui/src/org/flexiblepower/runtime/ui/server/PageServlet.java @@ -61,7 +61,8 @@ public void service(HttpServletRequest req, HttpServletResponse resp) throws IOE } catch (NoSuchMethodException e) { resp.sendError(404, e.getMessage()); } catch (InvocationTargetException e) { - resp.sendError(500, e.getMessage()); + resp.sendError(500, e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); + logger.error("Error while invocating the method for url: " + url, e.getCause()); } } else if (path.endsWith(".html")) { logger.debug("HTML File found for {}", path); From 06c35a4d2290f008d0aed6cbcf844440bd20ee83 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Fri, 1 May 2015 15:17:14 +0200 Subject: [PATCH 102/105] Some better styling for tooltips that also work in widgets --- flexiblepower.ui/res/css/tooltip.css | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/flexiblepower.ui/res/css/tooltip.css b/flexiblepower.ui/res/css/tooltip.css index c402191..315cbc6 100755 --- a/flexiblepower.ui/res/css/tooltip.css +++ b/flexiblepower.ui/res/css/tooltip.css @@ -20,11 +20,13 @@ a.tooltip:hover span { padding: .7em .4em; z-index: 10; + text-align: justify; + font-size: 90%; line-height:1.2em; background: white; color: black; - width: 350px; + width: 240px; margin: 0 0 0 12px; border-radius: .5em; @@ -49,5 +51,5 @@ a.tooltip.info img { } a.tooltip.info:hover span { - margin-left: -370px; + margin-left: -260px; } From 9fecf60cb6c15dcf0d30e9a9e317fffbd70590df Mon Sep 17 00:00:00 2001 From: Wilco Wijbrandi Date: Mon, 4 May 2015 14:50:34 +0200 Subject: [PATCH 103/105] Fixed #40 --- .../org/flexiblepower/ral/values/CommoditySet.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/flexiblepower.ral/src/org/flexiblepower/ral/values/CommoditySet.java b/flexiblepower.ral/src/org/flexiblepower/ral/values/CommoditySet.java index 9cc58a9..7be6878 100755 --- a/flexiblepower.ral/src/org/flexiblepower/ral/values/CommoditySet.java +++ b/flexiblepower.ral/src/org/flexiblepower/ral/values/CommoditySet.java @@ -47,7 +47,7 @@ public static class Builder { /** * Adds the selected {@link Commodity} to the set. - * + * * @param commodity * The commodity that should be added. * @return This builder @@ -65,7 +65,7 @@ public Builder add(Commodity commodity) { /** * Adds {@link Commodity#ELECTRICITY} to the set. - * + * * @return this */ public Builder addElectricity() { @@ -75,7 +75,7 @@ public Builder addElectricity() { /** * Adds {@link Commodity#GAS} to the set. - * + * * @return this */ public Builder addGas() { @@ -85,7 +85,7 @@ public Builder addGas() { /** * Adds {@link Commodity#HEAT} to the set. - * + * * @return this */ public Builder addHeat() { @@ -130,7 +130,8 @@ public CommoditySet(Collection> collection) { @Override public boolean contains(Object o) { - return (hasElectricity && o == Commodity.ELECTRICITY) || (hasGas && o == Commodity.GAS); + return (hasElectricity && o == Commodity.ELECTRICITY) || (hasGas && o == Commodity.GAS) + || (hasHeat && o == Commodity.HEAT); } @Override @@ -170,7 +171,7 @@ public boolean hasNext() { @Override public int size() { - return (hasElectricity ? 1 : 0) + (hasGas ? 1 : 0); + return (hasElectricity ? 1 : 0) + (hasGas ? 1 : 0) + (hasHeat ? 1 : 0); } @Override From 13eefd5fbd029a2cd215a822a2648d0ec3b7db77 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 12 May 2015 11:16:58 +0200 Subject: [PATCH 104/105] Added CS Revoke when the driver disconnects from the AbstractResourceManager --- .../ral/ext/AbstractResourceManager.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/flexiblepower.ral.ext/src/org/flexiblepower/ral/ext/AbstractResourceManager.java b/flexiblepower.ral.ext/src/org/flexiblepower/ral/ext/AbstractResourceManager.java index 3b274f5..3654a7c 100644 --- a/flexiblepower.ral.ext/src/org/flexiblepower/ral/ext/AbstractResourceManager.java +++ b/flexiblepower.ral.ext/src/org/flexiblepower/ral/ext/AbstractResourceManager.java @@ -11,6 +11,7 @@ import org.flexiblepower.ral.ResourceState; import org.flexiblepower.ral.messages.Allocation; import org.flexiblepower.ral.messages.AllocationStatusUpdate; +import org.flexiblepower.ral.messages.ControlSpaceRevoke; import org.flexiblepower.ral.messages.ResourceMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -82,6 +83,13 @@ protected void unconnectedStateUpdate(RS state) { */ protected abstract RCP receivedAllocation(ResourceMessage message); + /** + * This method is called when a revoke message is needed (e.g. when the driver has disconnected). + * + * @return The {@link ControlSpaceRevoke} that will be sent to the controller. + */ + protected abstract ControlSpaceRevoke createRevokeMessage(); + private volatile Connection driverConnection, controllerConnection; @Override @@ -123,6 +131,10 @@ public void handleMessage(Object message) { public void disconnected() { hasRegistered = false; driverConnection = null; + + if (controllerConnection != null) { + controllerConnection.sendMessage(createRevokeMessage()); + } } }; } else if (controllerConnection == null && "controller".equals(connection.getPort().name())) { From 6f226af61f2f1f9bb83fea3af3afe7f1d63176c6 Mon Sep 17 00:00:00 2001 From: Marc de Jonge Date: Tue, 12 May 2015 14:50:44 +0200 Subject: [PATCH 105/105] Solved the sorting of jobs at the same moment in time, with tests --- ...rTest.java => SimulatedSchedulerTest.java} | 28 +----- flexiblepower.runtime/.classpath | 3 +- .../scheduling/AbstractScheduler.java | 18 ++-- .../src/org/flexiblepower/scheduling/Job.java | 25 ++++-- .../simulation/test/RuntimeSchedulerTest.java | 89 +++++++++++++++++++ 5 files changed, 122 insertions(+), 41 deletions(-) rename flexiblepower.runtime.simulation/test/org/flexiblepower/simulation/test/{SchedulerTest.java => SimulatedSchedulerTest.java} (64%) create mode 100755 flexiblepower.runtime/test/org/flexiblepower/simulation/test/RuntimeSchedulerTest.java diff --git a/flexiblepower.runtime.simulation/test/org/flexiblepower/simulation/test/SchedulerTest.java b/flexiblepower.runtime.simulation/test/org/flexiblepower/simulation/test/SimulatedSchedulerTest.java similarity index 64% rename from flexiblepower.runtime.simulation/test/org/flexiblepower/simulation/test/SchedulerTest.java rename to flexiblepower.runtime.simulation/test/org/flexiblepower/simulation/test/SimulatedSchedulerTest.java index 7e5815c..a3b03e8 100644 --- a/flexiblepower.runtime.simulation/test/org/flexiblepower/simulation/test/SchedulerTest.java +++ b/flexiblepower.runtime.simulation/test/org/flexiblepower/simulation/test/SimulatedSchedulerTest.java @@ -8,14 +8,10 @@ import junit.framework.TestCase; -import org.flexiblepower.runtime.context.RuntimeContext; import org.flexiblepower.simulation.api.Simulation; import org.flexiblepower.simulation.context.SimulationContext; -import org.mockito.Mockito; -import org.osgi.framework.Bundle; -import org.osgi.service.component.ComponentContext; -public class SchedulerTest extends TestCase { +public class SimulatedSchedulerTest extends TestCase { public void testRecurringTask() throws InterruptedException { SimulationContext scheduler = new SimulationContext(); scheduler.activate(); @@ -47,26 +43,4 @@ public void run() { scheduler.deactivate(); } - - public void testStopping() throws Exception { - Bundle bundle = Mockito.mock(Bundle.class); - ComponentContext cc = Mockito.mock(ComponentContext.class); - Mockito.when(cc.getUsingBundle()).thenReturn(bundle); - Mockito.when(bundle.getSymbolicName()).thenReturn("test.bundle"); - - final RuntimeContext context = new RuntimeContext(); - context.activate(cc); - - Thread stopThread = new Thread() { - @Override - public void run() { - context.deactivate(); - } - }; - stopThread.setDaemon(true); - stopThread.start(); - - Thread.sleep(1000); - assertFalse(stopThread.isAlive()); - } } diff --git a/flexiblepower.runtime/.classpath b/flexiblepower.runtime/.classpath index d684b37..7aac800 100644 --- a/flexiblepower.runtime/.classpath +++ b/flexiblepower.runtime/.classpath @@ -1,6 +1,7 @@ - + + diff --git a/flexiblepower.runtime/src/org/flexiblepower/scheduling/AbstractScheduler.java b/flexiblepower.runtime/src/org/flexiblepower/scheduling/AbstractScheduler.java index ef12177..0636c54 100755 --- a/flexiblepower.runtime/src/org/flexiblepower/scheduling/AbstractScheduler.java +++ b/flexiblepower.runtime/src/org/flexiblepower/scheduling/AbstractScheduler.java @@ -8,6 +8,7 @@ import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicLong; import javax.measure.Measurable; import javax.measure.quantity.Duration; @@ -42,6 +43,8 @@ public abstract class AbstractScheduler implements FlexiblePowerContext, Runnabl */ protected final AtomicBoolean running; + private final AtomicLong serialGenerator; + /** * The {@link PriorityQueue} of {@link Job}s that are scheduled. */ @@ -55,6 +58,7 @@ public abstract class AbstractScheduler implements FlexiblePowerContext, Runnabl */ public AbstractScheduler() { running = new AtomicBoolean(false); + serialGenerator = new AtomicLong(); jobs = new PriorityBlockingQueue>(); } @@ -120,13 +124,13 @@ void remove(Job job, boolean mayInterrupt) { @Override public Future submit(Callable task) { logger.trace("submit(callable: {})", task); - return addJob(Job.create(task, this, currentTimeMillis(), 0)); + return addJob(Job.create(task, this, currentTimeMillis(), 0, serialGenerator)); } @Override public Future submit(Runnable task, T result) { logger.trace("submit(runnable: {}, result: {})", task, result); - return addJob(Job.create(task, result, this, currentTimeMillis(), 0)); + return addJob(Job.create(task, result, this, currentTimeMillis(), 0, serialGenerator)); } @Override @@ -138,14 +142,14 @@ public Future submit(Runnable task) { public ScheduledFuture schedule(Runnable command, Measurable delay) { logger.trace("schedule(runnable: {}, delay: {})", command, delay); long ms = delay.longValue(MS); - return addJob(Job.create(command, null, this, currentTimeMillis() + ms, 0)); + return addJob(Job.create(command, null, this, currentTimeMillis() + ms, 0, serialGenerator)); } @Override public ScheduledFuture schedule(Callable callable, Measurable delay) { logger.trace("schedule(callable: {}, delay: {})", callable, delay); long ms = delay.longValue(MS); - return addJob(Job.create(callable, this, currentTimeMillis() + ms, 0)); + return addJob(Job.create(callable, this, currentTimeMillis() + ms, 0, serialGenerator)); } @Override @@ -157,7 +161,8 @@ public ScheduledFuture scheduleAtFixedRate(Runnable command, null, this, currentTimeMillis() + initialDelay.longValue(MS), - period.longValue(MS))); + period.longValue(MS), + serialGenerator)); } @Override @@ -169,7 +174,8 @@ public ScheduledFuture scheduleWithFixedDelay(Runnable command, null, this, currentTimeMillis() + initialDelay.longValue(MS), - -delay.longValue(MS))); + -delay.longValue(MS), + serialGenerator)); } /** diff --git a/flexiblepower.runtime/src/org/flexiblepower/scheduling/Job.java b/flexiblepower.runtime/src/org/flexiblepower/scheduling/Job.java index 7d7dc6c..da51c73 100755 --- a/flexiblepower.runtime/src/org/flexiblepower/scheduling/Job.java +++ b/flexiblepower.runtime/src/org/flexiblepower/scheduling/Job.java @@ -6,6 +6,7 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicLong; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -17,7 +18,8 @@ public static Job create(final Runnable runnable, final V result, final AbstractScheduler scheduler, long timeOfNextRun, - long timeStep) { + long timeStep, + AtomicLong serialGenerator) { return new Job(new Callable() { @Override public V call() throws Exception { @@ -29,32 +31,37 @@ public V call() throws Exception { public String toString() { return runnable.toString(); } - }, scheduler, timeOfNextRun, timeStep); + }, scheduler, timeOfNextRun, timeStep, serialGenerator.getAndIncrement()); } public static Job create(final Callable callable, final AbstractScheduler scheduler, long timeOfNextRun, - long timeStep) { - return new Job(callable, scheduler, timeOfNextRun, timeStep); + long timeStep, + AtomicLong serialGenerator) { + return new Job(callable, scheduler, timeOfNextRun, timeStep, serialGenerator.getAndIncrement()); } private final Callable callable; private final AbstractScheduler scheduler; private volatile V result; - private volatile Exception exception; + private volatile Throwable exception; + + // Serial number for the jobs to distinguish between them for sorting + private final long serial; // Both of these are is milliseconds private volatile long timeOfNextRun, timeStep; private volatile boolean cancelled; - private Job(Callable callable, AbstractScheduler scheduler, long timeOfNextRun, long timeStep) { + private Job(Callable callable, AbstractScheduler scheduler, long timeOfNextRun, long timeStep, long serial) { this.callable = callable; this.scheduler = scheduler; this.timeOfNextRun = timeOfNextRun; this.timeStep = timeStep; + this.serial = serial; result = null; exception = null; @@ -88,6 +95,10 @@ public int compareTo(Delayed o) { return -1; } else if (timeOfNextRun > job.timeOfNextRun) { return 1; + } else if (serial < job.serial) { + return -1; + } else if (serial > job.serial) { + return 1; } else { return hashCode() - job.hashCode(); } @@ -118,7 +129,7 @@ public boolean isDone() { public synchronized void run() { try { result = callable.call(); - } catch (Exception e) { + } catch (Throwable e) { logger.warn("Exception during execution of job", e); exception = e; } diff --git a/flexiblepower.runtime/test/org/flexiblepower/simulation/test/RuntimeSchedulerTest.java b/flexiblepower.runtime/test/org/flexiblepower/simulation/test/RuntimeSchedulerTest.java new file mode 100755 index 0000000..3a8c89d --- /dev/null +++ b/flexiblepower.runtime/test/org/flexiblepower/simulation/test/RuntimeSchedulerTest.java @@ -0,0 +1,89 @@ +package org.flexiblepower.simulation.test; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicInteger; + +import junit.framework.TestCase; + +import org.flexiblepower.runtime.context.RuntimeContext; +import org.mockito.Mockito; +import org.osgi.framework.Bundle; +import org.osgi.service.component.ComponentContext; + +public class RuntimeSchedulerTest extends TestCase { + private RuntimeContext context; + + @Override + protected void setUp() throws Exception { + Bundle bundle = Mockito.mock(Bundle.class); + ComponentContext cc = Mockito.mock(ComponentContext.class); + Mockito.when(cc.getUsingBundle()).thenReturn(bundle); + Mockito.when(bundle.getSymbolicName()).thenReturn("test.bundle"); + + context = new RuntimeContext(); + context.activate(cc); + } + + @Override + protected void tearDown() throws Exception { + Thread stopThread = new Thread() { + @Override + public void run() { + context.deactivate(); + } + }; + stopThread.setDaemon(true); + stopThread.start(); + + Thread.sleep(1000); + assertFalse(stopThread.isAlive()); + } + + public static class OrderTester implements Runnable { + private final AtomicInteger sharedCounter; + private final int expectedCounter; + + public OrderTester(AtomicInteger sharedCounter, int expectedCounter) { + this.sharedCounter = sharedCounter; + this.expectedCounter = expectedCounter; + } + + @Override + public void run() { + int current = sharedCounter.getAndIncrement(); + System.out.println("OrderTest, expected = " + expectedCounter + ", but is " + current); + assertEquals(expectedCounter, current); + } + } + + public void testOrderOfExecution() throws Throwable { + AtomicInteger sharedCounter = new AtomicInteger(); + + int COUNT = 10; + List testers = new ArrayList(COUNT); + List> futurers = new ArrayList>(COUNT); + + for (int ix = 0; ix < COUNT; ix++) { + testers.add(new OrderTester(sharedCounter, ix)); + } + + // Now submit them all! + for (OrderTester tester : testers) { + futurers.add(context.submit(tester)); + } + + // Now test if they all ran in the correct order + for (Future future : futurers) { + try { + future.get(); + } catch (InterruptedException e) { + fail("Got an unexpected InterruptedException"); + } catch (ExecutionException e) { + throw e.getCause(); + } + } + } +}