Commit 31f0e344 authored by Nico Mack's avatar Nico Mack

Added HtmlBox Corona.

Overhaul of TetherManager, Bootstrapping. Tethering can now be
bootstrapped as well
parent 1aff8bec
eclipse.preferences.version=1
encoding/<project>=UTF-8
......@@ -123,6 +123,7 @@ org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
org.eclipse.jdt.core.compiler.source=1.8
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
......@@ -136,8 +137,10 @@ org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
......@@ -147,6 +150,8 @@ org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
org.eclipse.jdt.core.formatter.blank_lines_after_package=1
......@@ -205,6 +210,7 @@ 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=true
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
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
......@@ -399,12 +405,24 @@ 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=3
org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=false
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_assignment_operator=false
org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
This diff is collapsed.
......@@ -72,12 +72,23 @@ TITLE_NODE=title
BEGIN_NODE=begin
END_NODE=end
TETHER_BUILDER_NAMESPACE=lu.list.itis.dkd.tui.widget.tether.builder
CONNECTIONS_NODE=connections
TETHERS_NODE=tethers
TETHER_NODE=tether
TETHERABLE_NODE=tetherable
ORIGIN_NODE=origin
ENDING_NODE=ending
DISTANCE_NODE=distance
DRAGGABLE_NODE=draggable
EXCLUSIVE_NODE=exclusive
ROTATE_WITH_TETHER_NODE=rotateWithTether
PROVIDERS_NODE=providers
PROVIDER_NODE=provider
RECEIVERS_NODE=receivers
RECEIVER_NODE=receiver
DISPLAY_TIME_NODE=displayTime
FADE_IN_TIME_NODE=fadeInTime
FADE_OUT_TIME_NODE=fadeOutTime
......@@ -154,3 +165,8 @@ MARKERS_NODE=markers
MARKER_BUILDER_NAMESPACE=lu.list.itis.dkd.tui.marker.builder
POINTING_OFFSET_NODE=pointingOffset
STYLESHEET_NODE=styleSheet
STYLERULE_NODE=rule
PATH_NODE=path
......@@ -122,7 +122,11 @@
<artifactId>svg-salamander</artifactId>
<version>0.1.19</version>
</dependency>
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-parser</artifactId>
<version>1.9</version>
</dependency>
</dependencies>
<repositories>
......@@ -130,7 +134,7 @@
<id>LIST</id>
<name>Artifacts</name>
<url>https://artefacts.list.lu/libs-release-local</url>
</repository>
</repository>
</repositories>
......
......@@ -30,6 +30,7 @@ import lu.list.itis.dkd.tui.widget.BaseWidget;
import lu.list.itis.dkd.tui.widget.builder.BaseWidgetBuilder;
import lu.list.itis.dkd.tui.widget.corona.ShapeFactory;
import lu.list.itis.dkd.tui.widget.corona.builder.ShadowBuilder;
import lu.list.itis.dkd.tui.widget.tether.Tether;
import com.google.common.base.Preconditions;
......@@ -56,6 +57,10 @@ import java.util.concurrent.ConcurrentHashMap;
*/
@NonNullByDefault
public abstract class TangibleObjectManager {
/**
* This dictionary stores all tangibles detected by reacTIVision relevant to the application.
*/
protected volatile static ConcurrentHashMap<String, Tether> tetherMap = new ConcurrentHashMap<>();
/**
* This dictionary stores all tangibles detected by reacTIVision relevant to the application.
*/
......@@ -137,6 +142,12 @@ public abstract class TangibleObjectManager {
*/
public abstract void defineWidgets() throws BuildException;
/**
* @throws BuildException
*/
public abstract void defineConnections() throws BuildException;
/**
* Method ensuring that all mapped widgets are present on the table by querying the global state
* of the application.
......@@ -359,4 +370,6 @@ public abstract class TangibleObjectManager {
break;
}
}
}
\ No newline at end of file
......@@ -59,6 +59,8 @@ public class BootstrappingUtils {
private static final Pattern BOOTSTRAP_VAR_PATTERN = Pattern.compile("\\$\\{([a-z0-9\\-_]+)\\}", Pattern.CASE_INSENSITIVE); //$NON-NLS-1$
private static final Pattern ANGLE_PATTERN = Pattern.compile("([+-]?\\d+.?\\d*)\\s*(deg|rad)??", Pattern.CASE_INSENSITIVE); //$NON-NLS-1$
private static Logger LOGGER = LoggerFactory.getLogger(BootstrappingUtils.class.getSimpleName());
// ---------------------------------------------------------------------------
......@@ -153,6 +155,9 @@ public class BootstrappingUtils {
public static String getContentAsString(Element rootElement, String childName, boolean optional, String defaultValue, BootstrapContext variables) throws BuildException {
String value;
if (rootElement == null)
return null;
String contentAsString = Strings.nullToEmpty(getContent(rootElement, childName, variables));
if (contentAsString.length() > 0) {
value = contentAsString.trim();
......@@ -621,4 +626,60 @@ public class BootstrappingUtils {
}
return colour;
}
// ---------------------------------------------------------------------------
/**
* @param rootElement
* @param childName
* @param optional
* @param defaultColour
* @return
* @throws BuildException
*/
// ---------------------------------------------------------------------------
public static double getContentAsAngle(Element rootElement, String childName, boolean optional, double defaultAngle) throws BuildException {
return getContentAsAngle(rootElement, childName, optional, defaultAngle, null);
}
// ---------------------------------------------------------------------------
/**
* @param rootElement
* @param childName
* @param optional
* @param defaultColour
* @param context
* @return
* @throws BuildException
*/
// ---------------------------------------------------------------------------
public static double getContentAsAngle(Element rootElement, String childName, boolean optional, double defaultAngle, BootstrapContext context) throws BuildException {
double value = 0;
String contentAsString = Strings.nullToEmpty(getContent(rootElement, childName, context));
if (contentAsString.length() > 0) {
Matcher angleMatcher = ANGLE_PATTERN.matcher(contentAsString);
if (angleMatcher.matches()) {
String angle = angleMatcher.group(1);
String unit = angleMatcher.group(2);
unit = (Strings.isNullOrEmpty(unit)) ? "rad" : unit.toLowerCase(); //$NON-NLS-1$
try {
value = Double.parseDouble(angle);
} catch (NumberFormatException exception) {
throw new BuildException("Value provide for " + childName + " node must be a decimal number. Specified value " + angle + " could not be interpreted as such!"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
if ("deg".equals(unit)) { //$NON-NLS-1$
value = Math.toRadians(value);
}
}
} else {
if (optional)
value = defaultAngle;
else
throw new BuildException("Node " + childName + " is mandatory and MUST be provided!"); //$NON-NLS-1$//$NON-NLS-2$
}
return value;
}
}
/**
* Copyright Luxembourg Institute of Science and Technology, 2016.
*
* This file is part of TULIP.
*
* TULIP is licensed under a dual-licensing scheme. For non-commercial purposes, the LGPL version 3,
* as stated below, is applicable. For all commercial purposes TULIP is licensed under a LIST
* proprietary license. Please contact LIST at tto@list.lu to obtain a commercial license.
*
* For all non-commercial purposes, TULIP 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, version 3 of the License.
*
* TULIP 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 TULIP. If
* not, see <http://www.gnu.org/licenses/lgpl-3.0.html>.
*/
package lu.list.itis.dkd.tui.bootstrapping;
import lu.list.itis.dkd.dbc.annotation.NonNullByDefault;
import lu.list.itis.dkd.tui.TangibleApplication;
import lu.list.itis.dkd.tui.TangibleObjectManager;
import lu.list.itis.dkd.tui.exception.BuildException;
import lu.list.itis.dkd.tui.utility.Externalization;
import lu.list.itis.dkd.tui.widget.BaseWidget;
import lu.list.itis.dkd.tui.widget.builder.BaseBuilder;
import com.google.common.base.Strings;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Properties;
/**
* @author Eric Tobias [eric.tobias@list.lu]
* @since 2.2
* @version 2.3.0
*/
@NonNullByDefault
public class ConnectionsBootstrapper extends TangibleObjectManager {
protected Document document;
private static final Logger logger = LoggerFactory.getLogger(ConnectionsBootstrapper.class.getSimpleName());
/**
* Constructor initializing all fields.
*
* @param document
* The document containing the XML definition of all objects to initialize.
* @param applicationContext
* The {@link TangibleApplication} hosting this manager.
* @param applicationLogger
* The {@link Logger} to use for all logging purposes.
* @param properties
* The properties instance from which to load the default values from.
*/
@Deprecated
public ConnectionsBootstrapper(TangibleApplication applicationContext,
Logger applicationLogger, Properties properties, Document document) {
super(applicationContext, properties);
this.document = document;
}
/**
* Constructor initializing all fields.
*
* @param applicationContext
* The {@link TangibleApplication} hosting this manager.
* @param properties
* The properties instance from which to load the default values from.
* @param fileUri
* The URI of the document containing the XML definition of all objects to initialize.
* @throws BuildException
* Thrown when the provided file URI it not valid or empty.
*/
public ConnectionsBootstrapper(TangibleApplication applicationContext,
Properties properties, String fileUri) throws BuildException {
super(applicationContext, properties);
if (Strings.isNullOrEmpty(fileUri)) {
throw new BuildException("The provided file URI may not be null or empty!"); //$NON-NLS-1$
}
SAXBuilder builder = new SAXBuilder();
File xmlFile = new File(fileUri);
try {
this.document = builder.build(xmlFile);
} catch (IOException | JDOMException e) {
logger.error("Error occured while trying to process the object bootstrapping file!", e); //$NON-NLS-1$
throw new BuildException("The document containing the bootstrapping information could not be processed!", e); //$NON-NLS-1$
}
}
public void defineConnections() throws BuildException {
Element rootNode = document.getRootElement();
List<Element> connectionsRootNodes = rootNode.getChildren(Externalization.CONNECTIONS_NODE); // $NON-NLS-1$
if (connectionsRootNodes != null) {
}
}
/**
* Method called to initialize bootstrapping from a previously provided XML file. The method
* will create all objects, cursors, and blobs.
*
* @throws BuildException
* Thrown when one or more of the tangibles failed to build.
*/
@Override
public void defineWidgets() throws BuildException {
Element rootNode = document.getRootElement();
List<Element> objectRootNodes = rootNode.getChildren(Externalization.OBJECTS_NODE); // $NON-NLS-1$
for (Element objectNode : objectRootNodes) {
switch (objectNode.getName()) {
case "objects": //$NON-NLS-1$
loadObjects(objectNode);
break;
case "cursors": //$NON-NLS-1$
break;
case "blobs": //$NON-NLS-1$
break;
default:
throw new BuildException("Unrecognized object type_\"" + objectNode.getName() + "\"!"); //$NON-NLS-1$ //$NON-NLS-2$
}
}
loadCursors();
loadBlobs();
}
/**
* Note: When this method encounters an exception, it clears all previously loaded objects from
* the list.
*
* @param objectRootNode
* The root node holding the <code>object</code> node(s).
* @throws BuildException
* TODO
*/
private void loadObjects(Element objectRootNode) throws BuildException {
List<Element> objectNodes = objectRootNode.getChildren(Externalization.OBJECT_NODE);
try {
for (Element objectNode : objectNodes) {
BaseWidget widget = buildObjectFromElement(objectNode, null, null);
widget.getWidgetIds().forEach(handleId -> objectMap.put(handleId, widget));
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException e) {
// TODO add logging and collect all other exceptions.
objectMap.clear();
throw new BuildException("One of the desired tangibles could not be build! " + e.getMessage(), e); //$NON-NLS-1$
}
}
/**
* Method used to determine the appropriate builder for a given object and then issue a build
* call.
*
* @param objectNode
* The node from a larger document that contains, as children, all the necessary
* information to resolve the correct builder and build the final widget.
* @return The final widget as defined by the children of the element node.
* @throws ClassNotFoundException
* Thrown when the class of the builder for the widget or those of the nested corona
* builder(s) could not be found.
* @throws SecurityException
* Thrown when the constructor cannot be retrieved due to some security constraints.
* @throws NoSuchMethodException
* Thrown when no constructor with the given parameter type is available.
* @throws InvocationTargetException
* Thrown if the invocation of any constructor through reflection throws an exception.
* @throws IllegalArgumentException
* Thrown when the provided argument is not eligible for the builder's constructor.
* @throws IllegalAccessException
* Thrown if this Constructor object is enforcing Java language access control and the
* underlying constructor is inaccessible.
* @throws InstantiationException
* Thrown if the class that declares the underlying constructor represents an abstract
* class.
*/
@SuppressWarnings("unchecked")
private static BaseWidget buildObjectFromElement(Element objectNode, BootstrapContext context, BootstrapCallback callback) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
BaseWidget instance = null;
Element type = objectNode.getChild(Externalization.TYPE_NODE);
Class<?> builder = Class.forName(Externalization.WIDGET_BUILDER_NAMESPACE + Externalization.NAMESPACE_SEPARATOR + type.getValue() + Externalization.BUILDER_CLASS_POSTFIX);
if ((context == null) || (context.size() == 0)) {
Constructor<BaseBuilder<?>> constructor = (Constructor<BaseBuilder<?>>) builder.getConstructor(new Class[] {Element.class});
instance = constructor.newInstance(new Object[] {objectNode}).build();
} else {
Constructor<BaseBuilder<?>> constructor = (Constructor<BaseBuilder<?>>) builder.getConstructor(new Class[] {Element.class, BootstrapContext.class, BootstrapCallback.class});
instance = constructor.newInstance(new Object[] {objectNode, context, callback}).build();
}
return instance;
}
private void loadCursors() {
Element rootNode = document.getRootElement();
}
private void loadBlobs() {
Element rootNode = document.getRootElement();
}
}
\ No newline at end of file
......@@ -35,6 +35,7 @@ import com.google.common.base.Strings;
import org.jdom2.Element;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
/**
* Simple bootstrapper to initialize shapes.
......@@ -92,7 +93,6 @@ public class ShapeBootstrapper {
int triangleSize = BootstrappingUtils.getContentAsInteger(shapeNode, Externalization.TRIANGLE_SIZE_NODE, BootstrappingUtils.OPTIONAL, Calibration.tableToScreenY(Calibration.getSquareSize()), context);
int cornerRadius = BootstrappingUtils.getContentAsInteger(shapeNode, Externalization.CORNER_RADIUS_NODE, BootstrappingUtils.OPTIONAL, Calibration.tableToScreenY(Calibration.getCornerRadius()), context);
Point dimensions = new Point(ScreenCoordinates.class);
CoordinateState coordinates;
......@@ -132,6 +132,14 @@ public class ShapeBootstrapper {
dimensions.setLocation(width, height);
dimensions.toCoordinates(ScreenCoordinates.class);
return ShapeFactory.buildRoundedRectangle((int) dimensions.getX(), (int) dimensions.getY(), cornerRadius);
case "polygon": //$NON-NLS-1$
String path = BootstrappingUtils.getContentAsString(shapeNode, Externalization.PATH_NODE, BootstrappingUtils.MANDATORY, null, context);
dimensions.setLocation(1, 1);
dimensions.toCoordinates(ScreenCoordinates.class);
Shape original = ShapeFactory.buildPolygon(path);
AffineTransform scaler = AffineTransform.getScaleInstance(dimensions.getX(), dimensions.getY());
return scaler.createTransformedShape(original);
default:
throw new BuildException("Don't know how to build a shape of type: " + type); //$NON-NLS-1$
}
......
......@@ -44,6 +44,7 @@ public class TangibleApplicationBootstrapper extends TangibleApplication {
super(newPropertiesFileUri);
objectManager = new TangibleObjectBootstrapper(this, properties, properties.getProperty("bootstrapping.root", "bootstrapping.xml")); //$NON-NLS-1$ //$NON-NLS-2$
objectManager.defineConnections();
objectManager.defineWidgets();
adapter.setObjectManager(objectManager);
......
......@@ -27,6 +27,7 @@ import lu.list.itis.dkd.tui.exception.BuildException;
import lu.list.itis.dkd.tui.utility.Externalization;
import lu.list.itis.dkd.tui.widget.BaseWidget;
import lu.list.itis.dkd.tui.widget.builder.BaseBuilder;
import lu.list.itis.dkd.tui.widget.tether.Tether;
import com.google.common.base.Strings;
......@@ -136,6 +137,58 @@ public class TangibleObjectBootstrapper extends TangibleObjectManager {
loadBlobs();
}
/**
* @throws BuildException
*/
@Override
public void defineConnections() throws BuildException {
Element rootNode = document.getRootElement();
List<Element> connectionsRootNodes = rootNode.getChildren(Externalization.CONNECTIONS_NODE); // $NON-NLS-1$
if (connectionsRootNodes != null) {
for (Element connectionsNode : connectionsRootNodes)
if (connectionsNode != null) {
for (Element connectionNode : connectionsNode.getChildren()) {
switch (connectionNode.getName()) {
case "tethers": //$NON-NLS-1$
this.loadTethers(connectionNode);
break;
default:
throw new BuildException("Unrecognized connection type_\"" + connectionNode.getName() + "\"!"); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
}
}
/**
* Note: When this method encounters an exception, it clears all previously loaded objects from
* the list.
*
* @param objectRootNode
* The root node holding the <code>object</code> node(s).
* @throws BuildException
* TODO
*/
private void loadTethers(Element tetherRootNode) throws BuildException {
List<Element> tetherNodes = tetherRootNode.getChildren(Externalization.TETHER_NODE);
try {
for (Element tetherNode : tetherNodes) {
Tether tether = TetherBootstrapper.buildTetherFromElement(tetherNode, null, null);
if (tetherMap.put(tether.getName(), tether) != null) {
logger.warn("Multiple instances of tether with name {} exist!", tether.getName()); //$NON-NLS-1$
}
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException e) {
logger.error("One of the desired tethers could not be build!", e); //$NON-NLS-1$
tetherMap.clear();
throw new BuildException("One of the desired tethers could not be build! " + e.getMessage(), e); //$NON-NLS-1$
}
}
/**
* builds a widget from the specified template node. A second parameter allows specifying the
* bootstrapping context, a map holding the names and the values of variables for interpolation
......@@ -188,7 +241,7 @@ public class TangibleObjectBootstrapper extends TangibleObjectManager {
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException e) {
// TODO add logging and collect all other exceptions.
logger.error("One of the desired tangibles could not be build!", e); //$NON-NLS-1$
objectMap.clear();
throw new BuildException("One of the desired tangibles could not be build! " + e.getMessage(), e); //$NON-NLS-1$
}
......@@ -240,10 +293,10 @@ public class TangibleObjectBootstrapper extends TangibleObjectManager {
}
private void loadCursors() {
Element rootNode = document.getRootElement();
// Element rootNode = document.getRootElement();
}
private void loadBlobs() {
Element rootNode = document.getRootElement();
// Element rootNode = document.getRootElement();
}
}
\ No newline at end of file
/**
* Copyright Luxembourg Institute of Science and Technology, 2016.
*
* This file is part of TULIP.
*
* TULIP is licensed under a dual-licensing scheme. For non-commercial purposes, the LGPL version 3,
* as stated below, is applicable. For all commercial purposes TULIP is licensed under a LIST
* proprietary license. Please contact LIST at tto@list.lu to obtain a commercial license.
*