diff --git a/framework/freedomotic-core/src/main/java/com/freedomotic/api/API.java b/framework/freedomotic-core/src/main/java/com/freedomotic/api/API.java index 5e661a560..da934b3f6 100644 --- a/framework/freedomotic-core/src/main/java/com/freedomotic/api/API.java +++ b/framework/freedomotic-core/src/main/java/com/freedomotic/api/API.java @@ -6,9 +6,14 @@ import com.freedomotic.app.AppConfig; import com.freedomotic.environment.EnvironmentLogic; +import com.freedomotic.environment.EnvironmentPersistence; import com.freedomotic.objects.EnvObjectLogic; +import com.freedomotic.objects.EnvObjectPersistence; import com.freedomotic.plugins.ClientStorage; import com.freedomotic.plugins.filesystem.PluginsManager; +import com.freedomotic.reactions.CommandPersistence; +import com.freedomotic.reactions.ReactionPersistence; +import com.freedomotic.reactions.TriggerPersistence; import com.freedomotic.security.Auth; import com.freedomotic.util.I18n.I18n; import java.awt.image.BufferedImage; @@ -176,4 +181,10 @@ public interface API { * @return */ BufferedImage getResource(String resourceIdentifier); + + EnvironmentPersistence environments(); + TriggerPersistence triggers(); + EnvObjectPersistence objects(); + CommandPersistence commands(); + ReactionPersistence reactions(); } diff --git a/framework/freedomotic-core/src/main/java/com/freedomotic/api/APIStandardImpl.java b/framework/freedomotic-core/src/main/java/com/freedomotic/api/APIStandardImpl.java index f8472fb04..f25ee0ed3 100644 --- a/framework/freedomotic-core/src/main/java/com/freedomotic/api/APIStandardImpl.java +++ b/framework/freedomotic-core/src/main/java/com/freedomotic/api/APIStandardImpl.java @@ -12,6 +12,9 @@ import com.freedomotic.objects.EnvObjectPersistence; import com.freedomotic.plugins.ClientStorage; import com.freedomotic.plugins.filesystem.PluginsManager; +import com.freedomotic.reactions.CommandPersistence; +import com.freedomotic.reactions.ReactionPersistence; +import com.freedomotic.reactions.TriggerPersistence; import com.freedomotic.security.Auth; import com.freedomotic.util.I18n.I18n; import com.google.inject.Inject; @@ -33,13 +36,16 @@ public class APIStandardImpl implements API { - private final EnvironmentPersistence environment; - private final EnvObjectPersistence object; + private final EnvironmentPersistence environments; + private final EnvObjectPersistence objects; private final ClientStorage clientStorage; private final AppConfig config; private final Auth auth; private final I18n i18n; private final PluginsManager plugManager; + private TriggerPersistence triggers; + private CommandPersistence commands; + private ReactionPersistence reactions; /** * @@ -50,6 +56,8 @@ public class APIStandardImpl * @param auth * @param i18n * @param plugManager + * @param triggerPersistence + * @param commands */ @Inject public APIStandardImpl( @@ -59,14 +67,20 @@ public APIStandardImpl( AppConfig config, Auth auth, I18n i18n, - PluginsManager plugManager) { - this.environment = environment; - this.object = object; + PluginsManager plugManager, + TriggerPersistence triggerPersistence, + CommandPersistence commands, + ReactionPersistence reactions) { + this.environments = environment; + this.objects = object; this.clientStorage = clientStorage; this.config = config; this.auth = auth; this.i18n = i18n; this.plugManager = plugManager; + this.triggers = triggerPersistence; + this.commands = commands; + this.reactions = reactions; System.out.println("auth in apiimpl is " + this.auth); } @@ -87,7 +101,7 @@ public AppConfig getConfig() { */ @Override public EnvObjectLogic addObject(EnvObjectLogic obj, boolean MAKE_UNIQUE) { - return object.add(obj, MAKE_UNIQUE); + return objects.add(obj, MAKE_UNIQUE); } /** @@ -96,7 +110,8 @@ public EnvObjectLogic addObject(EnvObjectLogic obj, boolean MAKE_UNIQUE) { */ @Override public Collection getObjectList() { - return /*Collections.unmodifiableList(*/ object.getObjectList(); /*);*/ + return /*Collections.unmodifiableList(*/ objects.getObjectList(); /*);*/ + } /** @@ -106,7 +121,7 @@ public Collection getObjectList() { */ @Override public EnvObjectLogic getObjectByName(String name) { - return object.getObjectByName(name); + return objects.getObjectByName(name); } /** @@ -116,7 +131,7 @@ public EnvObjectLogic getObjectByName(String name) { */ @Override public EnvObjectLogic getObjectByUUID(String uuid) { - return object.getObjectByUUID(uuid); + return objects.getObjectByUUID(uuid); } /** @@ -127,7 +142,7 @@ public EnvObjectLogic getObjectByUUID(String uuid) { */ @Override public Collection getObjectByAddress(String protocol, String address) { - return object.getObjectByAddress(protocol, address); + return objects.getObjectByAddress(protocol, address); } /** @@ -137,7 +152,7 @@ public Collection getObjectByAddress(String protocol, String add */ @Override public Collection getObjectByProtocol(String protocol) { - return object.getObjectByProtocol(protocol); + return objects.getObjectByProtocol(protocol); } /** @@ -147,7 +162,7 @@ public Collection getObjectByProtocol(String protocol) { */ @Override public Collection getObjectByEnvironment(String uuid) { - return object.getObjectByEnvironment(uuid); + return objects.getObjectByEnvironment(uuid); } /** @@ -156,7 +171,7 @@ public Collection getObjectByEnvironment(String uuid) { */ @Override public void removeObject(EnvObjectLogic input) { - object.remove(input); + objects.remove(input); } /** @@ -167,7 +182,7 @@ public void removeObject(EnvObjectLogic input) { */ @Override public EnvironmentLogic addEnvironment(EnvironmentLogic obj, boolean MAKE_UNIQUE) { - return environment.add(obj, MAKE_UNIQUE); + return environments.add(obj, MAKE_UNIQUE); } /** @@ -176,7 +191,7 @@ public EnvironmentLogic addEnvironment(EnvironmentLogic obj, boolean MAKE_UNIQUE */ @Override public List getEnvironments() { - return environment.getEnvironments(); + return environments.getEnvironments(); } /** @@ -186,7 +201,7 @@ public List getEnvironments() { */ @Override public EnvironmentLogic getEnvByUUID(String UUID) { - return environment.getEnvByUUID(UUID); + return environments.getEnvByUUID(UUID); } /** @@ -195,7 +210,7 @@ public EnvironmentLogic getEnvByUUID(String UUID) { */ @Override public void removeEnvironment(EnvironmentLogic input) { - environment.remove(input); + environments.remove(input); } /** @@ -207,7 +222,7 @@ public void removeEnvironment(EnvironmentLogic input) { public Collection getClients(String filter) { return clientStorage.getClients(filter); } - + /** * * @return @@ -229,13 +244,13 @@ public BufferedImage getResource(String resourceIdentifier) { public ClientStorage getClientStorage() { return clientStorage; } - + /** * * @return */ @Override - public Auth getAuth(){ + public Auth getAuth() { return auth; } @@ -264,6 +279,33 @@ public PluginsManager getPluginManager() { */ @Override public Collection getObjectByTag(String tag) { - return object.getObjectByTags(tag); + return objects.getObjectByTags(tag); + } + + @Override + public EnvironmentPersistence environments() { + return environments; + } + + @Override + public TriggerPersistence triggers() { + return triggers; } + + @Override + public EnvObjectPersistence objects() { + return objects; + } + + @Override + public CommandPersistence commands() { + return commands; + } + + @Override + public ReactionPersistence reactions() { + return reactions; + } + + } diff --git a/framework/freedomotic-core/src/main/java/com/freedomotic/api/Plugin.java b/framework/freedomotic-core/src/main/java/com/freedomotic/api/Plugin.java index 1d20b6ecb..cca384ea2 100644 --- a/framework/freedomotic-core/src/main/java/com/freedomotic/api/Plugin.java +++ b/framework/freedomotic-core/src/main/java/com/freedomotic/api/Plugin.java @@ -32,11 +32,15 @@ import java.io.IOException; import java.util.logging.Logger; import javax.swing.JFrame; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; /** * * @author nicoletti */ +@XmlRootElement public class Plugin implements Client { // private boolean isConnected = false; @@ -44,14 +48,17 @@ public class Plugin /** * */ - + @XmlElement protected volatile boolean isRunning; + @XmlElement private String pluginName; + @XmlElement private String type = "Plugin"; /** * */ + @XmlElement public Config configuration; /** @@ -64,41 +71,50 @@ public class Plugin /** * */ + @XmlElement protected String description; /** * */ + @XmlElement protected String version; /** * */ + @XmlElement protected String requiredVersion; /** * */ + @XmlElement protected String category; /** * */ + @XmlElement protected String shortName; /** * */ + @XmlElement protected String listenOn; /** * */ + @XmlElement protected String sendOn; + @XmlElement private File path; final static int SAME_VERSION = 0; final static int FIRST_IS_OLDER = -1; final static int LAST_IS_OLDER = 1; + @Inject private API api; private BusService busService; @@ -145,6 +161,7 @@ public File getFile() { * * @return */ + @XmlTransient public API getApi() { return api; } diff --git a/framework/freedomotic-core/src/main/java/com/freedomotic/app/DependenciesInjector.java b/framework/freedomotic-core/src/main/java/com/freedomotic/app/DependenciesInjector.java index c216e03f5..4e9fc389e 100644 --- a/framework/freedomotic-core/src/main/java/com/freedomotic/app/DependenciesInjector.java +++ b/framework/freedomotic-core/src/main/java/com/freedomotic/app/DependenciesInjector.java @@ -13,11 +13,16 @@ import com.freedomotic.environment.EnvironmentDAO; import com.freedomotic.environment.EnvironmentDAOFactory; import com.freedomotic.environment.EnvironmentDAOXstream; +import com.freedomotic.environment.EnvironmentPersistence; import com.freedomotic.events.ProtocolRead; +import com.freedomotic.objects.EnvObjectPersistence; import com.freedomotic.plugins.ClientStorage; import com.freedomotic.plugins.ClientStorageInMemory; import com.freedomotic.plugins.filesystem.PluginsManager; import com.freedomotic.plugins.filesystem.PluginsManagerImpl; +import com.freedomotic.reactions.CommandPersistence; +import com.freedomotic.reactions.ReactionPersistence; +import com.freedomotic.reactions.TriggerPersistence; import com.freedomotic.security.Auth; import com.freedomotic.security.AuthImpl; import com.freedomotic.util.I18n.I18n; @@ -26,7 +31,6 @@ import com.google.inject.Singleton; import com.google.inject.assistedinject.FactoryModuleBuilder; - /** * * @author enrico @@ -48,15 +52,20 @@ protected void configure() { .build(EnvironmentDAOFactory.class)); bind(API.class).to(APIStandardImpl.class).in(Singleton.class); bind(ProtocolRead.class); - + bind(AppConfig.class).to(AppConfigImpl.class).in(Singleton.class); - + bind(Auth.class).to(AuthImpl.class).in(Singleton.class); - + bind(I18n.class).to(I18nImpl.class).in(Singleton.class); - //requestStaticInjection(I18n.class); - + bind(BusService.class).to(BusServiceImpl.class).in(Singleton.class); - + + bind(EnvironmentPersistence.class).in(Singleton.class); + bind(TriggerPersistence.class).in(Singleton.class); + bind(EnvObjectPersistence.class).in(Singleton.class); + bind(CommandPersistence.class).in(Singleton.class); + bind(ReactionPersistence.class).in(Singleton.class); + } } diff --git a/framework/freedomotic-core/src/main/java/com/freedomotic/core/Condition.java b/framework/freedomotic-core/src/main/java/com/freedomotic/core/Condition.java index e1a915560..8bcb6e37a 100644 --- a/framework/freedomotic-core/src/main/java/com/freedomotic/core/Condition.java +++ b/framework/freedomotic-core/src/main/java/com/freedomotic/core/Condition.java @@ -1,15 +1,32 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. +/** + * + * Copyright (c) 2009-2014 Freedomotic team http://freedomotic.com + * + * This file is part of Freedomotic + * + * This Program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2, or (at your option) any later version. + * + * This Program 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 General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * Freedomotic; see the file COPYING. If not, see + * . */ package com.freedomotic.core; import com.freedomotic.reactions.Statement; +import javax.xml.bind.annotation.XmlRootElement; /** * * @author nicoletti */ +@XmlRootElement public class Condition { private String target; private Statement statement; diff --git a/framework/freedomotic-core/src/main/java/com/freedomotic/environment/EnvironmentLogic.java b/framework/freedomotic-core/src/main/java/com/freedomotic/environment/EnvironmentLogic.java index 8f765cf18..b92600884 100644 --- a/framework/freedomotic-core/src/main/java/com/freedomotic/environment/EnvironmentLogic.java +++ b/framework/freedomotic-core/src/main/java/com/freedomotic/environment/EnvironmentLogic.java @@ -36,7 +36,6 @@ import java.util.List; import java.util.UUID; import java.util.logging.Logger; -import org.apache.shiro.SecurityUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; /** @@ -50,7 +49,7 @@ public final class EnvironmentLogic { private List zones = new ArrayList(); private File source = null; private final API api; - + /** * * @param api @@ -164,10 +163,18 @@ public void addRoom(ZoneLogic zone) { gate.evaluateGate(); } } - - room.setChanged(); + try { + room.setChanged(); + } catch (Exception e) { + LOG.warning("Cannot notify room changes"); + } } else { - zone.setChanged(); + try { + zone.setChanged(); + } catch (Exception e) { + LOG.warning("Cannot notify room changes"); + } + } } @@ -183,8 +190,7 @@ public void removeZone(ZoneLogic zone) { /** * - * @return - * @deprecated + * @return @deprecated */ @Deprecated @RequiresPermissions("environments:read") @@ -226,7 +232,7 @@ public void init() { if (!zones.contains(room)) { Freedomotic.logger.config("Adding room " + room); - + this.zones.add(room); } else { Freedomotic.logger.warning("Attempt to add a null or an already existent room " + room); @@ -263,7 +269,7 @@ public List getZones() { public ZoneLogic getZone(String zoneName) { for (ZoneLogic zone : zones) { if (zone.getPojo().getName().equalsIgnoreCase(zoneName) - && SecurityUtils.getSubject().isPermitted("zone:read" + zoneName)) { + && api.getAuth().isPermitted("zone:read" + zoneName)) { return zone; } } @@ -271,6 +277,22 @@ public ZoneLogic getZone(String zoneName) { return null; } + /** + * + * @param uuid + * @return + */ + @RequiresPermissions({"environments:read", "zones:read"}) + public ZoneLogic getZoneByUuid(String uuid) { + for (ZoneLogic zone : zones) { + if (zone.getPojo().getUuid().equalsIgnoreCase(uuid) + && api.getAuth().isPermitted("zone:read" + uuid)) { + return zone; + } + } + return null; + } + /** * * @return @@ -307,5 +329,5 @@ public String toString() { return this.getPojo().getName(); } private static final Logger LOG = Logger.getLogger(EnvironmentLogic.class.getName()); - + } diff --git a/framework/freedomotic-core/src/main/java/com/freedomotic/environment/EnvironmentPersistence.java b/framework/freedomotic-core/src/main/java/com/freedomotic/environment/EnvironmentPersistence.java index 9cef2d3c6..9edb0184b 100644 --- a/framework/freedomotic-core/src/main/java/com/freedomotic/environment/EnvironmentPersistence.java +++ b/framework/freedomotic-core/src/main/java/com/freedomotic/environment/EnvironmentPersistence.java @@ -27,6 +27,7 @@ import com.freedomotic.model.object.Behavior; import com.freedomotic.objects.EnvObjectLogic; import com.freedomotic.objects.EnvObjectPersistence; +import com.freedomotic.persistence.ContainerInterface; import com.freedomotic.persistence.FreedomXStream; import com.freedomotic.plugins.ClientStorage; import com.freedomotic.plugins.ObjectPluginPlaceholder; @@ -56,10 +57,10 @@ * * @author Enrico */ -public final class EnvironmentPersistence { +public final class EnvironmentPersistence implements ContainerInterface { - private static List environments = new ArrayList(); - private ClientStorage clientStorage; + private static final List environments = new ArrayList(); + private final ClientStorage clientStorage; /** * @@ -82,7 +83,7 @@ public static void saveEnvironmentsToFolder(File folder) throws DaoLayerExceptio LOG.warning("There is no environment to persist, " + folder.getAbsolutePath() + " will not be altered."); return; } - + if (folder.exists() && !folder.isDirectory()) { throw new DaoLayerException(folder.getAbsoluteFile() + " is not a valid environment folder. Skipped"); } @@ -126,8 +127,8 @@ private static void deleteEnvFiles(File folder) } // This filter only returns object files - FileFilter objectFileFileter = - new FileFilter() { + FileFilter objectFileFileter + = new FileFilter() { @Override public boolean accept(File file) { if (file.isFile() && file.getName().endsWith(".xenv")) { @@ -154,7 +155,7 @@ public boolean accept(File file) { * * @param folder * @param makeUnique - * @return + * @return * @deprecated */ @Deprecated @@ -169,8 +170,8 @@ public synchronized static boolean loadEnvironmentsFromDir(File folder, boolean boolean check = true; // This filter only returns env files - FileFilter envFileFilter = - new FileFilter() { + FileFilter envFileFilter + = new FileFilter() { @Override public boolean accept(File file) { if (file.isFile() && file.getName().endsWith(".xenv")) { @@ -207,6 +208,7 @@ public boolean accept(File file) { * @return A pointer to the newly created environment object */ @RequiresPermissions("environments:create") + @Deprecated public static EnvironmentLogic add(final EnvironmentLogic obj, boolean MAKE_UNIQUE) { if ((obj == null) || (obj.getPojo() == null) @@ -315,6 +317,8 @@ public EnvObjectLogic join(String clazz, String name, String protocol, String ad * * @param input */ + @RequiresPermissions("environments:delete") + @Deprecated public static void remove(EnvironmentLogic input) { for (EnvObjectLogic obj : EnvObjectPersistence.getObjectByEnvironment(input.getPojo().getUUID())) { EnvObjectPersistence.remove(obj); @@ -328,10 +332,15 @@ public static void remove(EnvironmentLogic input) { * */ @RequiresPermissions("environments:delete") - public static void clear() { + @Override + public void clear() { try { - environments.clear(); + for (EnvironmentLogic el : environments){ + delete(el); + } } catch (Exception e) { + } finally { + environments.clear(); } } @@ -446,6 +455,7 @@ public static void loadEnvironmentFromFile(final File file) * * @return */ + @Deprecated @RequiresPermissions("environments:read") public static List getEnvironments() { return environments; @@ -457,6 +467,7 @@ public static List getEnvironments() { * @return */ @RequiresPermissions("environments:read") + @Deprecated public static EnvironmentLogic getEnvByUUID(String UUID) { // if (auth.isPermitted("environments:read:" + UUID)) { for (EnvironmentLogic env : environments) { @@ -468,4 +479,80 @@ public static EnvironmentLogic getEnvByUUID(String UUID) { return null; } private static final Logger LOG = Logger.getLogger(EnvironmentPersistence.class.getName()); + + @Override + @RequiresPermissions("environments:read") + public List list() { + return getEnvironments(); + } + + @Override + @RequiresPermissions("environments:read") + public List getByName(String name) { + List el = new ArrayList(); + for (EnvironmentLogic e : list()) { + if (e.getPojo().getName().equalsIgnoreCase(name)) { + el.add(e); + } + } + return el; + } + + @Override + @RequiresPermissions("environments:read") + public EnvironmentLogic get(String uuid) { + return getEnvByUUID(uuid); + } + + @Override + @RequiresPermissions("environments:create") + public boolean create(EnvironmentLogic item) { + try { + add(item, false); + return true; + } catch (Exception e) { + return false; + } + } + + @Override + @RequiresPermissions("environments:delete") + public boolean delete(EnvironmentLogic item) { + try { + remove(item); + return true; + } catch (Exception e) { + return false; + } + } + + @Override + @RequiresPermissions("environments:delete") + public boolean delete(String uuid) { + return delete(get(uuid)); + } + + @Override + @RequiresPermissions("environments:update") + public EnvironmentLogic modify(String uuid, EnvironmentLogic data) { + try { + delete(uuid); + data.getPojo().setUUID(uuid); + create(data); + return data; + } catch (Exception e) { + return null; + } + + } + + @Override + @RequiresPermissions("environments:create") + public EnvironmentLogic copy(String uuid) { + return add(get(uuid), true); + } + + + + } diff --git a/framework/freedomotic-core/src/main/java/com/freedomotic/environment/ZoneLogic.java b/framework/freedomotic-core/src/main/java/com/freedomotic/environment/ZoneLogic.java index e05f09d88..0957df610 100644 --- a/framework/freedomotic-core/src/main/java/com/freedomotic/environment/ZoneLogic.java +++ b/framework/freedomotic-core/src/main/java/com/freedomotic/environment/ZoneLogic.java @@ -77,7 +77,7 @@ public EnvironmentLogic getEnv() { */ public ZoneLogic(final Zone pojo) { this.pojo = pojo; - this.busService = Freedomotic.INJECTOR.getInstance(BusService.class); + this.busService = Freedomotic.INJECTOR.getInstance(BusService.class); } /** diff --git a/framework/freedomotic-core/src/main/java/com/freedomotic/objects/EnvObjectPersistence.java b/framework/freedomotic-core/src/main/java/com/freedomotic/objects/EnvObjectPersistence.java index 1cc4b8b12..191ad95f9 100644 --- a/framework/freedomotic-core/src/main/java/com/freedomotic/objects/EnvObjectPersistence.java +++ b/framework/freedomotic-core/src/main/java/com/freedomotic/objects/EnvObjectPersistence.java @@ -23,6 +23,7 @@ import com.freedomotic.environment.EnvironmentPersistence; import com.freedomotic.exceptions.DaoLayerException; import com.freedomotic.model.object.EnvObject; +import com.freedomotic.persistence.ContainerInterface; import com.freedomotic.persistence.FreedomXStream; import com.freedomotic.util.DOMValidateDTD; import com.freedomotic.util.Info; @@ -40,9 +41,11 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; +import java.util.logging.Level; import java.util.logging.Logger; import org.apache.shiro.authz.annotation.RequiresPermissions; @@ -50,7 +53,7 @@ * * @author Enrico */ -public class EnvObjectPersistence { +public class EnvObjectPersistence implements ContainerInterface { /** * @@ -61,7 +64,7 @@ public class EnvObjectPersistence { * */ public static final boolean MAKE_NOT_UNIQUE = false; - private static Map objectList = new HashMap(); + private static final Map objectList = new HashMap(); /** * @@ -74,6 +77,7 @@ public EnvObjectPersistence() { * * @return */ + @Deprecated @RequiresPermissions("objects:read") public static Collection getObjectList() { return objectList.values(); @@ -151,8 +155,8 @@ private static void deleteObjectFiles(File folder) File[] files = folder.listFiles(); // This filter only returns object files - FileFilter objectFileFileter = - new FileFilter() { + FileFilter objectFileFileter + = new FileFilter() { @Override public boolean accept(File file) { if (file.isFile() && file.getName().endsWith(".xobj")) { @@ -189,8 +193,8 @@ public synchronized static void loadObjects(File folder, final boolean makeUniqu File[] files = folder.listFiles(); // This filter only returns object files - FileFilter objectFileFilter = - new FileFilter() { + FileFilter objectFileFilter + = new FileFilter() { @Override public boolean accept(File file) { if (file.isFile() && file.getName().endsWith(".xobj")) { @@ -227,7 +231,7 @@ public boolean accept(File file) { * Loads the object file from file but NOT add the object to the list * * @param file - * @return + * @return */ public static EnvObjectLogic loadObject(File file) throws DaoLayerException { @@ -266,6 +270,7 @@ public static EnvObjectLogic loadObject(File file) * * @return */ + @Deprecated @RequiresPermissions("objects:read") public static Iterator iterator() { return objectList.values().iterator(); @@ -325,6 +330,7 @@ public static ArrayList getObjectByTags(String tags) { * @param uuid * @return */ + @Deprecated @RequiresPermissions("objects:read") public static EnvObjectLogic getObjectByUUID(String uuid) { for (Iterator it = EnvObjectPersistence.iterator(); it.hasNext();) { @@ -434,6 +440,7 @@ public static int size() { * reference to the object in input. * @return A pointer to the newly created environment object */ + @Deprecated @RequiresPermissions("objects:create") public static EnvObjectLogic add(final EnvObjectLogic obj, final boolean MAKE_UNIQUE) { if ((obj == null) @@ -467,7 +474,11 @@ public static EnvObjectLogic add(final EnvObjectLogic obj, final boolean MAKE_UN if (!objectList.containsValue(envObjectLogic)) { objectList.put(envObjectLogic.getPojo().getUUID(), envObjectLogic); - envObjectLogic.setChanged(true); + try { + envObjectLogic.setChanged(true); + } catch (Exception e) { + LOG.log(Level.WARNING, "Object was created, but cannot set is as Changed", e); + } } else { throw new RuntimeException("Cannot add the same object more than one time"); } @@ -479,6 +490,7 @@ public static EnvObjectLogic add(final EnvObjectLogic obj, final boolean MAKE_UN * * @param input */ + @Deprecated @RequiresPermissions("objects:delete") public static void remove(EnvObjectLogic input) { objectList.remove(input.getPojo().getUUID()); @@ -490,11 +502,105 @@ public static void remove(EnvObjectLogic input) { * */ @RequiresPermissions("objects:delete") - public static void clear() { + @Override + public void clear() { try { - objectList.clear(); + for (EnvObjectLogic el : objectList.values()) { + delete(el); + } } catch (Exception e) { + } finally { + objectList.clear(); } } private static final Logger LOG = Logger.getLogger(EnvObjectPersistence.class.getName()); + + @Override + @RequiresPermissions("objects:read") + public List list() { + LOG.info("OBJECT LIST SIZE: " + objectList.size()); + List el = new ArrayList(); + el.addAll(objectList.values()); + return el; + } + + @Override + @RequiresPermissions("objects:read") + public List getByName(String name) { + List el = new ArrayList(); + for (EnvObjectLogic e : list()) { + if (e.getPojo().getName().equalsIgnoreCase(name)) { + el.add(e); + } + } + return el; + } + + @Override + @RequiresPermissions("objects:read") + public EnvObjectLogic get(String uuid) { + return getObjectByUUID(uuid); + } + + @Override + @RequiresPermissions("objects:create") + public boolean create(EnvObjectLogic item) { + try { + int preSize = objectList.size(); + add(item, false); + LOG.info("OBJECT LIST SIZE: " + objectList.size()); + if (preSize + 1 == objectList.size()) { + return true; + } else { + return false; + } + } catch (Exception e) { + LOG.log(Level.SEVERE, "Cannot create object", e); + return false; + } + } + + @Override + @RequiresPermissions("objects:delete") + public boolean delete(EnvObjectLogic item) { + return delete(item.getPojo().getUUID()); + } + + @Override + @RequiresPermissions("objects:delete") + public boolean delete(String uuid) { + try { + EnvObjectLogic eol = objectList.remove(uuid); + try { + eol.setChanged(true); //force repainting on frontends clients + } catch (Exception e) { + LOG.warning("Cannot notify object changes"); + } + eol.destroy(); + return true; + } catch (Exception e) { + LOG.log(Level.SEVERE, "Cannot delete object" + uuid, e); + return false; + } + + } + + @Override + @RequiresPermissions("objects:update") + public EnvObjectLogic modify(String uuid, EnvObjectLogic data) { + try { + delete(uuid); + data.getPojo().setUUID(uuid); + create(data); + return data; + } catch (Exception e) { + return null; + } + } + + @Override + @RequiresPermissions("objects:create") + public EnvObjectLogic copy(String uuid) { + return add(get(uuid), true); + } } diff --git a/framework/freedomotic-core/src/main/java/com/freedomotic/persistence/ContainerInterface.java b/framework/freedomotic-core/src/main/java/com/freedomotic/persistence/ContainerInterface.java new file mode 100644 index 000000000..efcccd420 --- /dev/null +++ b/framework/freedomotic-core/src/main/java/com/freedomotic/persistence/ContainerInterface.java @@ -0,0 +1,49 @@ +/** + * + * Copyright (c) 2009-2014 Freedomotic team http://freedomotic.com + * + * This file is part of Freedomotic + * + * This Program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2, or (at your option) any later version. + * + * This Program 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 General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * Freedomotic; see the file COPYING. If not, see + * . + */ +package com.freedomotic.persistence; + +import java.util.List; + +/** + * + * @author matteo + * @param + */ +public interface ContainerInterface { + + public List list(); + + public List getByName(String name); + + public T get(String uuid); + + public boolean create(T item); + + public boolean delete(T item); + + public boolean delete(String uuid); + + public T modify(String uuid, T data); + + public T copy(String uuid); + + public void clear(); + +} diff --git a/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/Command.java b/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/Command.java index c5ab3eb21..3d143c968 100644 --- a/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/Command.java +++ b/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/Command.java @@ -44,12 +44,18 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Map.Entry; +import java.util.UUID; import java.util.logging.Logger; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; /** * * @author enrico */ +@XmlRootElement +@XmlAccessorType(XmlAccessType.FIELD) public final class Command implements Serializable, Cloneable { private static final long serialVersionUID = -7287958816826580426L; @@ -116,6 +122,7 @@ public final class Command implements Serializable, Cloneable { * */ public Command() { + this.uuid = UUID.randomUUID().toString(); if (isHardwareLevel()) { //an hardware level command setEditable(false); //it has not to me stored in root/data folder } @@ -418,12 +425,13 @@ public Command clone() super.clone(); Command clonedCmd = new Command(); - clonedCmd.setName(getName()); + clonedCmd.setName("Copy of " + getName()); clonedCmd.setDescription(getDescription()); clonedCmd.setReceiver(getReceiver()); clonedCmd.setDelay(getDelay()); clonedCmd.setReplyTimeout(getReplyTimeout()); clonedCmd.setExecuted(executed); + clonedCmd.setHardwareLevel(hardwareLevel); Iterator> it = getProperties().entrySet().iterator(); while (it.hasNext()) { Entry e = it.next(); diff --git a/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/CommandPersistence.java b/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/CommandPersistence.java index 2cffd8034..4506ba9b2 100644 --- a/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/CommandPersistence.java +++ b/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/CommandPersistence.java @@ -1,27 +1,26 @@ /** * - * Copyright (c) 2009-2014 Freedomotic team - * http://freedomotic.com + * Copyright (c) 2009-2014 Freedomotic team http://freedomotic.com * * This file is part of Freedomotic * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. + * This Program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2, or (at your option) any later version. * - * This Program 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 General Public License for more details. + * This Program 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 General Public License for more + * details. * - * You should have received a copy of the GNU General Public License - * along with Freedomotic; see the file COPYING. If not, see + * You should have received a copy of the GNU General Public License along with + * Freedomotic; see the file COPYING. If not, see * . */ package com.freedomotic.reactions; import com.freedomotic.app.Freedomotic; +import com.freedomotic.persistence.ContainerInterface; import com.freedomotic.persistence.FreedomXStream; import com.freedomotic.util.DOMValidateDTD; import com.freedomotic.util.Info; @@ -32,9 +31,11 @@ import java.io.FileFilter; import java.io.FileWriter; import java.io.IOException; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.UUID; import java.util.logging.Level; @@ -44,23 +45,36 @@ * * @author Enrico */ -public class CommandPersistence { +public class CommandPersistence implements ContainerInterface { - private static Map userCommands = new HashMap(); - private static Map hardwareCommands = new HashMap(); + private static final Map userCommands = new HashMap(); + private static final Map hardwareCommands = new HashMap(); + public CommandPersistence(){ + } /** * * @param c */ + @Deprecated public static void add(Command c) { if (c != null) { - if (!userCommands.containsKey(c.getName().trim().toLowerCase())) { - userCommands.put(c.getName(), - c); - LOG.log(Level.FINE, "Added command ''{0}'' to the list of user commands", c.getName()); + if (!c.isHardwareLevel()) { + if (!userCommands.containsKey(c.getName().trim().toLowerCase())) { + userCommands.put(c.getName(), + c); + LOG.log(Level.FINE, "Added command ''{0}'' to the list of user commands", c.getName()); + } else { + LOG.log(Level.CONFIG, "Command ''{0}'' already in the list of user commands. Skipped", c.getName()); + } } else { - LOG.log(Level.CONFIG, "Command ''{0}'' already in the list of user commands. Skipped", c.getName()); + if (!hardwareCommands.containsKey(c.getName().trim().toLowerCase())) { + hardwareCommands.put(c.getName(), + c); + LOG.log(Level.FINE, "Added command ''{0}'' to the list of hardware commands", c.getName()); + } else { + LOG.log(Level.CONFIG, "Command ''{0}'' already in the list of hardware commands. Skipped", c.getName()); + } } } else { LOG.warning("Attempt to add a null user command to the list. Skipped"); @@ -71,8 +85,13 @@ public static void add(Command c) { * * @param input */ + @Deprecated public static void remove(Command input) { - userCommands.remove(input.getName()); + if (input.isHardwareLevel()) { + hardwareCommands.remove(input.getName()); + } else { + userCommands.remove(input.getName()); + } } /** @@ -87,6 +106,7 @@ public static int size() { * * @return */ + @Deprecated public static Iterator iterator() { return userCommands.values().iterator(); } @@ -96,6 +116,7 @@ public static Iterator iterator() { * @param name * @return */ + @Deprecated public static Command getCommand(String name) { Command command = userCommands.get(name.trim()); @@ -108,6 +129,26 @@ public static Command getCommand(String name) { return hwCommand; } + /** + * + * @param uuid + * @return + */ + @Deprecated + public static Command getCommandByUUID(String uuid) { + for (Command c : userCommands.values()) { + if (c.getUUID().equalsIgnoreCase(uuid)) { + return c; + } + } + for (Command c : hardwareCommands.values()) { + if (c.getUUID().equalsIgnoreCase(uuid)) { + return c; + } + } + return null; + } + /** * * @return @@ -129,11 +170,12 @@ public static Collection getUserCommands() { * @param name * @return */ + @Deprecated public static Command getHardwareCommand(String name) { Command command = hardwareCommands.get(name.trim()); if (command == null) { - LOG.log(Level.SEVERE,"Missing command ''{0}" + "''. " + LOG.log(Level.SEVERE, "Missing command ''{0}" + "''. " + "Maybe the related plugin is not installed or cannot be loaded", name); } @@ -149,8 +191,8 @@ public static void loadCommands(File folder) { File[] files = folder.listFiles(); // This filter only returns object files - FileFilter objectFileFileter = - new FileFilter() { + FileFilter objectFileFileter + = new FileFilter() { public boolean accept(File file) { if (file.isFile() && file.getName().endsWith(".xcmd")) { return true; @@ -171,11 +213,11 @@ public boolean accept(File file) { summary.append("#Filename \t\t #CommandName \t\t\t #Destination").append("\n"); for (File file : files) { - Command command = null; - String xml = null; + Command command = null; + String xml = null; try { xml = DOMValidateDTD.validate(file, Info.getApplicationPath() + "/config/validator/command.dtd"); - } catch (Exception e) { + } catch (Exception e) { LOG.log(Level.SEVERE, "Reaction file {0} is not well formatted: {1}", new Object[]{file.getPath(), e.getLocalizedMessage()}); continue; } @@ -268,8 +310,8 @@ private static void deleteCommandFiles(File folder) { File[] files = folder.listFiles(); // This filter only returns object files - FileFilter objectFileFileter = - new FileFilter() { + FileFilter objectFileFileter + = new FileFilter() { public boolean accept(File file) { if (file.isFile() && file.getName().endsWith(".xcmd")) { return true; @@ -286,7 +328,91 @@ public boolean accept(File file) { } } - private CommandPersistence() { - } private static final Logger LOG = Logger.getLogger(CommandPersistence.class.getName()); + + @Override + public List list() { + List cl = new ArrayList(userCommands.values()); + cl.addAll(hardwareCommands.values()); + return cl; + + } + + @Override + public List getByName(String name) { + List cl = new ArrayList(); + for (Command c: list()){ + if(c.getName().equalsIgnoreCase(name)){ + cl.add(c); + } + } + return cl; + } + + @Override + public Command get(String uuid) { + return getCommandByUUID(uuid); + } + + @Override + public boolean create(Command item) { + try{ + add(item); + return true; + } catch (Exception e ){ + return false; + } + } + + @Override + public boolean delete(Command item) { + try { + remove(item); + return true; + } catch (Exception e) { + return false; + } + } + + @Override + public boolean delete(String uuid) { + return delete(get(uuid)); + } + + @Override + public Command modify(String uuid, Command data) { + try { + delete(uuid); + data.setUUID(uuid); + add(data); + return data; + } catch (Exception e) { + return null; + } + } + + @Override + public Command copy(String uuid) { + try { + Command c = get(uuid).clone(); + add(c); + return c; + } catch (Exception e) { + return null; + } + } + + @Override + public void clear() { + try{ + for (Command c : list()){ + delete(c); + } + } catch (Exception e){ + } finally { + hardwareCommands.clear(); + userCommands.clear(); + } + } + } diff --git a/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/Reaction.java b/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/Reaction.java index f1f7a238a..20f6570bd 100644 --- a/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/Reaction.java +++ b/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/Reaction.java @@ -42,11 +42,14 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.UUID; +import javax.xml.bind.annotation.XmlRootElement; /** * * @author enrico */ +@XmlRootElement public final class Reaction implements Serializable { @@ -63,6 +66,7 @@ public final class Reaction * */ public Reaction() { + this.uuid = UUID.randomUUID().toString(); } /** @@ -72,6 +76,7 @@ public Reaction() { * @param commands */ public Reaction(Trigger trigger, List conditions, List commands) { + this.uuid = UUID.randomUUID().toString(); this.conditions = conditions; create(trigger, commands); } @@ -130,7 +135,7 @@ public Reaction(Trigger trigger, Command command) { private void create(Trigger trigger, List commands) { if ((trigger != null) && (commands != null)) { this.trigger = trigger; - this.commands = commands; + this.setCommands(commands); setChanged(); } } @@ -149,7 +154,7 @@ public Trigger getTrigger() { */ public List getCommands() { if (commands == null) { - commands = new ArrayList(); + setCommands(new ArrayList()); } return commands; @@ -161,7 +166,7 @@ public List getCommands() { */ @Override public String toString() { - return shortDescription; + return getShortDescription(); } private String buildShortDescription() { @@ -254,10 +259,15 @@ public boolean equals(Object obj) { final Reaction other = (Reaction) obj; - if ((this.shortDescription == null) ? (other.shortDescription != null) + if ((this.getShortDescription() == null) ? (other.getShortDescription() != null) : (!this.shortDescription.equals(other.shortDescription))) { return false; } + + if ((this.getUuid() == null) ? (other.getUuid() !=null) + : (!this.getUuid().equals(other.getUuid()))){ + return false; + } return true; } @@ -269,7 +279,7 @@ public boolean equals(Object obj) { @Override public int hashCode() { int hash = 7; - hash = (73 * hash) + ((this.shortDescription != null) ? this.shortDescription.hashCode() : 0); + hash = (73 * hash) + ((this.getShortDescription() != null) ? this.getShortDescription().hashCode() : 0); return hash; } @@ -287,35 +297,89 @@ public void setTrigger(Trigger trigger) { * */ public void setChanged() { - description = buildDescription(); - shortDescription = buildShortDescription(); + setDescription(buildDescription()); + setShortDescription(buildShortDescription()); } + /** * * @return */ - public String getUUID() { + public boolean hasTrigger() { + if (trigger != null) { + return true; + } + + return false; + } + + /** + * @param conditions the conditions to set + */ + public void setConditions(List conditions) { + this.conditions = conditions; + } + + /** + * @return the uuid + */ + public String getUuid() { return uuid; } /** - * - * @param uuid + * @param uuid the uuid to set */ - public void setUUID(String uuid) { + public void setUuid(String uuid) { this.uuid = uuid; } /** - * - * @return + * @param commands the commands to set */ - public boolean hasTrigger() { - if (trigger != null) { - return true; - } + public void setCommands(List commands) { + this.commands = commands; + } - return false; + /** + * @param description the description to set + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * @return the shortDescription + */ + public String getShortDescription() { + return shortDescription; + } + + /** + * @param shortDescription the shortDescription to set + */ + public void setShortDescription(String shortDescription) { + this.shortDescription = shortDescription; + } + + @Override + protected Object clone() throws CloneNotSupportedException { + Reaction r = new Reaction(); + r.setCommands(this.getCommands()); + //r.setConditions(this.getConditions()); + r.setTrigger(this.getTrigger()); + + return r; + } + + public boolean addCommand(Command c ){ + return commands.add(c); + } + + public boolean removeCommand(Command c){ + return commands.remove(c); } + + } diff --git a/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/ReactionPersistence.java b/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/ReactionPersistence.java index 6b895d217..ff6e0d6c3 100644 --- a/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/ReactionPersistence.java +++ b/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/ReactionPersistence.java @@ -20,6 +20,7 @@ package com.freedomotic.reactions; import com.freedomotic.app.Freedomotic; +import com.freedomotic.persistence.ContainerInterface; import com.freedomotic.persistence.FreedomXStream; import com.freedomotic.util.DOMValidateDTD; import com.freedomotic.util.Info; @@ -40,12 +41,11 @@ * * @author Enrico */ -public class ReactionPersistence { +public class ReactionPersistence implements ContainerInterface { - private static List list = new CopyOnWriteArrayList(); //for persistence purposes. ELEMENTS CANNOT BE MODIFIED OUTSIDE THIS CLASS + private static final List list = new CopyOnWriteArrayList(); //for persistence purposes. ELEMENTS CANNOT BE MODIFIED OUTSIDE THIS CLASS - private ReactionPersistence() { - //avoid instance creation + public ReactionPersistence() { } /** @@ -72,13 +72,13 @@ public static void saveReactions(File folder) { LOG.log(Level.CONFIG, "Saving reactions to file in {0}", folder.getAbsolutePath()); for (Reaction reaction : list) { - String uuid = reaction.getUUID(); + String uuid = reaction.getUuid(); if ((uuid == null) || uuid.isEmpty()) { - reaction.setUUID(UUID.randomUUID().toString()); + reaction.setUuid(UUID.randomUUID().toString()); } - String fileName = reaction.getUUID() + ".xrea"; + String fileName = reaction.getUuid() + ".xrea"; FileWriter fstream = new FileWriter(folder + "/" + fileName); BufferedWriter out = new BufferedWriter(fstream); out.write(xstream.toXML(reaction)); //persist only the data not the logic @@ -97,16 +97,16 @@ private static void deleteReactionFiles(File folder) { File[] files = folder.listFiles(); // This filter only returns object files - FileFilter objectFileFileter = - new FileFilter() { - public boolean accept(File file) { - if (file.isFile() && file.getName().endsWith(".xrea")) { - return true; - } else { - return false; - } - } - }; + FileFilter objectFileFileter + = new FileFilter() { + public boolean accept(File file) { + if (file.isFile() && file.getName().endsWith(".xrea")) { + return true; + } else { + return false; + } + } + }; files = folder.listFiles(objectFileFileter); @@ -123,16 +123,16 @@ public synchronized static void loadReactions(File folder) { XStream xstream = FreedomXStream.getXstream(); // This filter only returns object files - FileFilter objectFileFileter = - new FileFilter() { - public boolean accept(File file) { - if (file.isFile() && file.getName().endsWith(".xrea")) { - return true; - } else { - return false; - } - } - }; + FileFilter objectFileFileter + = new FileFilter() { + public boolean accept(File file) { + if (file.isFile() && file.getName().endsWith(".xrea")) { + return true; + } else { + return false; + } + } + }; File[] files = folder.listFiles(objectFileFileter); @@ -146,8 +146,8 @@ public boolean accept(File file) { Reaction reaction = null; //validate the object against a predefined DTD try { - String xml = - DOMValidateDTD.validate(file, Info.getApplicationPath() + "/config/validator/reaction.dtd"); + String xml + = DOMValidateDTD.validate(file, Info.getApplicationPath() + "/config/validator/reaction.dtd"); reaction = (Reaction) xstream.fromXML(xml); } catch (Exception e) { @@ -166,7 +166,7 @@ public boolean accept(File file) { LOG.log(Level.WARNING, "Reaction {0} has no valid commands. Maybe related objects are missing or not configured properly.", reaction.toString()); } - summary.append(reaction.getUUID()).append("\t\t\t").append(reaction.toString()) + summary.append(reaction.getUuid()).append("\t\t\t").append(reaction.toString()) .append("\t\t\t").append(reaction.getDescription()).append("\n"); } @@ -188,11 +188,16 @@ public boolean accept(File file) { * * @param r */ + @Deprecated public static void add(Reaction r) { - if (!exists(r)) { //if not already loaded + if (!exists(r)) { //if not already loaded //if it's a new reaction validate it's commands if (r.getCommands() != null && !r.getCommands().isEmpty()) { - r.getTrigger().register(); //trigger starts to listen on its channel + try { + r.getTrigger().register(); //trigger starts to listen on its channel + } catch (Exception e) { + LOG.warning("Cannot register trigger"); + } list.add(r); r.setChanged(); LOG.log(Level.CONFIG, "Added new reaction {0}", r.getDescription()); @@ -206,11 +211,16 @@ public static void add(Reaction r) { * * @param input */ + @Deprecated public static void remove(Reaction input) { if (input != null) { boolean removed = list.remove(input); LOG.log(Level.INFO, "Removed reaction {0}", input.getDescription()); - input.getTrigger().unregister(); + try { + input.getTrigger().unregister(); + } catch (Exception e) { + LOG.warning("Cannot unregister trigger"); + } if ((!removed) && (list.contains(input))) { LOG.log(Level.WARNING, "Error while removing Reaction {0} from the list", input.getDescription()); @@ -222,6 +232,7 @@ public static void remove(Reaction input) { * * @return */ + @Deprecated public static Iterator iterator() { return list.iterator(); } @@ -230,10 +241,26 @@ public static Iterator iterator() { * * @return */ + @Deprecated public static List getReactions() { return Collections.unmodifiableList(list); } + /** + * + * @param uuid + * @return + */ + @Deprecated + public static Reaction getReaction(String uuid) { + for (Reaction r : list) { + if (r.getUuid().equalsIgnoreCase(uuid)) { + return r; + } + } + return null; + } + /** * * @return @@ -260,4 +287,89 @@ public static boolean exists(Reaction input) { return false; } private static final Logger LOG = Logger.getLogger(ReactionPersistence.class.getName()); + + @Override + public List list() { + return Collections.unmodifiableList(list); + } + + @Override + public List getByName(String name) { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + + } + + @Override + public Reaction get(String uuid) { + for (Reaction r : list) { + if (r.getUuid().equalsIgnoreCase(uuid)) { + return r; + } + } + return null; + } + + @Override + public boolean create(Reaction item) { + try { + add(item); + return true; + } catch (Exception e) { + return false; + } + } + + @Override + public boolean delete(Reaction item) { + try { + remove(item); + return true; + } catch (Exception e) { + return false; + } + } + + @Override + public boolean delete(String uuid) { + return delete(get(uuid)); + } + + @Override + public Reaction modify(String uuid, Reaction data) { + try { + delete(uuid); + data.setUuid(uuid); + create(data); + return data; + } catch (Exception e) { + LOG.severe("Cannot modify reaction"); + return null; + } + } + + @Override + public Reaction copy(String uuid) { + try { + Reaction r = get(uuid); + Reaction newOne = (Reaction) r.clone(); + create(newOne); + return newOne; + } catch (Exception e) { + LOG.severe("Cannot copy reaction"); + return null; + } + } + + @Override + public void clear() { + try { + for (Reaction r : list()) { + delete(r); + } + } catch (Exception e) { + } finally { + list.clear(); + } + } + } diff --git a/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/Trigger.java b/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/Trigger.java index 1dd16fc5a..8125d3ef7 100644 --- a/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/Trigger.java +++ b/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/Trigger.java @@ -32,15 +32,22 @@ import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Iterator; +import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; import javax.jms.JMSException; import javax.jms.ObjectMessage; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; /** * * @author enrico */ +@XmlRootElement +@XmlAccessorType(XmlAccessType.FIELD) public final class Trigger implements BusConsumer, Cloneable { private String name; @@ -60,15 +67,18 @@ public final class Trigger implements BusConsumer, Cloneable { private long maxExecutions; private long numberOfExecutions; private long suspensionStart; + @XmlTransient private BusMessagesListener listener; //dependencies @Inject + @XmlTransient private TriggerCheck checker; /** * */ public Trigger() { + this.uuid = UUID.randomUUID().toString(); } /** @@ -398,7 +408,7 @@ public void onMessage(ObjectMessage message) { @Override public Trigger clone() { Trigger clone = new Trigger(); - clone.setName(getName()); + clone.setName("Copy of " + getName()); clone.setDescription(getDescription()); Payload clonePayload = new Payload(); diff --git a/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/TriggerPersistence.java b/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/TriggerPersistence.java index 35e5afc36..9e404772b 100644 --- a/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/TriggerPersistence.java +++ b/framework/freedomotic-core/src/main/java/com/freedomotic/reactions/TriggerPersistence.java @@ -20,6 +20,7 @@ package com.freedomotic.reactions; import com.freedomotic.app.Freedomotic; +import com.freedomotic.persistence.ContainerInterface; import com.freedomotic.persistence.FreedomXStream; import com.freedomotic.util.DOMValidateDTD; import com.freedomotic.util.Info; @@ -30,6 +31,7 @@ import java.io.FileWriter; import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; @@ -38,7 +40,7 @@ * * @author Enrico */ -public class TriggerPersistence { +public class TriggerPersistence implements ContainerInterface { private static ArrayList list = new ArrayList(); @@ -91,8 +93,8 @@ public static void saveTriggers(File folder) { private static void deleteTriggerFiles(File folder) { File[] files = folder.listFiles(); // This filter only returns object files - FileFilter objectFileFileter = - new FileFilter() { + FileFilter objectFileFileter + = new FileFilter() { public boolean accept(File file) { if (file.isFile() && file.getName().endsWith(".xtrg")) { return true; @@ -111,6 +113,7 @@ public boolean accept(File file) { * * @return */ + @Deprecated public static ArrayList getTriggers() { return list; } @@ -123,8 +126,8 @@ public synchronized static void loadTriggers(File folder) { XStream xstream = FreedomXStream.getXstream(); // This filter only returns object files - FileFilter objectFileFileter = - new FileFilter() { + FileFilter objectFileFileter + = new FileFilter() { public boolean accept(File file) { if (file.isFile() && file.getName().endsWith(".xtrg")) { return true; @@ -146,8 +149,8 @@ public boolean accept(File file) { Trigger trigger = null; try { //validate the object against a predefined DTD - String xml = - DOMValidateDTD.validate(file, Info.getApplicationPath() + "/config/validator/trigger.dtd"); + String xml + = DOMValidateDTD.validate(file, Info.getApplicationPath() + "/config/validator/trigger.dtd"); trigger = (Trigger) xstream.fromXML(xml); } catch (Exception e) { LOG.log(Level.SEVERE, "Trigger file {0} is not well formatted: {1}", new Object[]{file.getPath(), e.getLocalizedMessage()}); @@ -200,6 +203,10 @@ public static synchronized void addAndRegister(Trigger t) { if (!list.contains(t)) { list.add(t); t.register(); + int postSize = TriggerPersistence.size(); + if (!(postSize == (preSize + 1))) { + LOG.severe("Error while while adding and registering trigger '" + t.getName() + "'"); + } } else { //this trigger is already in the list int old = list.indexOf(t); @@ -208,11 +215,6 @@ public static synchronized void addAndRegister(Trigger t) { t.register(); } - int postSize = TriggerPersistence.size(); - - if (!(postSize == (preSize + 1))) { - LOG.severe("Error while while adding and registering trigger '" + t.getName() + "'"); - } } /** @@ -250,15 +252,14 @@ public static synchronized void remove(Trigger t) { try { t.unregister(); list.remove(t); + int postSize = TriggerPersistence.size(); + + if (!(postSize == (preSize - 1))) { + LOG.severe("Error while while removing trigger '" + t.getName() + "'"); + } } catch (Exception e) { LOG.severe("Error while while unregistering the trigger '" + t.getName() + "'"); } - - int postSize = TriggerPersistence.size(); - - if (!(postSize == (preSize - 1))) { - LOG.severe("Error while while removing trigger '" + t.getName() + "'"); - } } /** @@ -268,6 +269,7 @@ public static synchronized void remove(Trigger t) { * @return a Trigger object with the name (ignore-case) as the String in * input */ + @Deprecated public static Trigger getTrigger(String name) { if ((name == null) || (name.trim().isEmpty())) { return null; @@ -289,6 +291,7 @@ public static Trigger getTrigger(String name) { * @param input * @return */ + @Deprecated public static Trigger getTrigger(Trigger input) { if (input != null) { for (Iterator it = list.iterator(); it.hasNext();) { @@ -308,14 +311,31 @@ public static Trigger getTrigger(Trigger input) { * @param i * @return */ + @Deprecated public static Trigger getTrigger(int i) { return list.get(i); } + /** + * + * @param uuid + * @return + */ + @Deprecated + public static Trigger getTriggerByUUID(String uuid) { + for (Trigger t : list) { + if (t.getUUID().equalsIgnoreCase(uuid)) { + return t; + } + } + return null; + } + /** * * @return */ + @Deprecated public static Iterator iterator() { return list.iterator(); } @@ -327,5 +347,100 @@ public static Iterator iterator() { public static int size() { return list.size(); } + private static final Logger LOG = Logger.getLogger(TriggerPersistence.class.getName()); + + @Override + public List list() { + return getTriggers(); + } + + @Override + public List getByName(String name) { + List tl = new ArrayList(); + for (Trigger t : list()) { + if (t.getName().equalsIgnoreCase(name)) { + tl.add(t); + } + } + return tl; + } + + @Override + public Trigger get(String uuid) { + return getTriggerByUUID(uuid); + } + + @Override + public boolean create(Trigger item) { + try { + add(item); + return true; + } catch (Exception e) { + LOG.log(Level.SEVERE,"Cannot add trigger " + item.getName(),e); + return false; + } + } + + @Override + public boolean delete(Trigger item) { + try { + remove(item); + return true; + } catch (Exception e) { + return false; + } + } + + @Override + public boolean delete(String uuid) { + return delete(get(uuid)); + } + + @Override + public Trigger modify(String uuid, Trigger data) { + try { + if (uuid == null || uuid.isEmpty() || data == null) { + LOG.warning("Cannot even start modifying trigger, basic data missing"); + return null; + } else { + delete(uuid); + data.setUUID(uuid); + create(data); + try { + data.register(); + } catch (Exception f) { + LOG.warning("Cannot register trigger " + data.getName()); + } + return data; + } + } catch (Exception e) { + LOG.log(Level.SEVERE, "Error while modifying trigger" + data.getName(), e); + return null; + } + } + + @Override + public Trigger copy(String uuid) { + try { + Trigger t = get(uuid).clone(); + create(t); + return t; + } catch (Exception e) { + return null; + } + } + + @Override + public void clear() { + try{ + for (Trigger t : list()){ + delete(t); + } + } catch (Exception e){ + } finally { + list.clear(); + } + } + } diff --git a/framework/freedomotic-model/pom.xml b/framework/freedomotic-model/pom.xml index 0b7be518a..a7354b3f2 100644 --- a/framework/freedomotic-model/pom.xml +++ b/framework/freedomotic-model/pom.xml @@ -32,6 +32,12 @@ 7.2 jar + + com.fasterxml.jackson.core + jackson-annotations + 2.3.2 + jar + diff --git a/framework/freedomotic-model/src/main/java/com/freedomotic/model/ds/Config.java b/framework/freedomotic-model/src/main/java/com/freedomotic/model/ds/Config.java index c3499ffa0..eed0f95a1 100644 --- a/framework/freedomotic-model/src/main/java/com/freedomotic/model/ds/Config.java +++ b/framework/freedomotic-model/src/main/java/com/freedomotic/model/ds/Config.java @@ -33,12 +33,15 @@ import java.util.StringTokenizer; import java.util.logging.Level; import java.util.logging.Logger; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; /** * * @author Expression autor is undefined on line 12, column 14 in * Templates/Classes/Class.java. */ +@XmlRootElement public class Config implements Serializable { @@ -60,6 +63,7 @@ public String getXmlFile() { * * @param file */ + @XmlTransient public void setXmlFile(File file) { this.xmlFile = file.getName(); } diff --git a/framework/freedomotic-model/src/main/java/com/freedomotic/model/ds/Tuples.java b/framework/freedomotic-model/src/main/java/com/freedomotic/model/ds/Tuples.java index 3a5692d12..c4f1abcac 100644 --- a/framework/freedomotic-model/src/main/java/com/freedomotic/model/ds/Tuples.java +++ b/framework/freedomotic-model/src/main/java/com/freedomotic/model/ds/Tuples.java @@ -31,6 +31,9 @@ import java.util.Iterator; import java.util.Map.Entry; import java.util.Set; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; /** * A data structure to collect blocks of data in {@link HashMap} style This are @@ -39,6 +42,8 @@ * * @author Enrico */ +@XmlRootElement +@XmlAccessorType(XmlAccessType.FIELD) public class Tuples implements Serializable { diff --git a/framework/freedomotic-model/src/main/java/com/freedomotic/model/environment/Environment.java b/framework/freedomotic-model/src/main/java/com/freedomotic/model/environment/Environment.java index 068e6250a..a8a1cd9b5 100644 --- a/framework/freedomotic-model/src/main/java/com/freedomotic/model/environment/Environment.java +++ b/framework/freedomotic-model/src/main/java/com/freedomotic/model/environment/Environment.java @@ -43,11 +43,16 @@ import com.freedomotic.model.geometry.FreedomPolygon; import java.io.Serializable; import java.util.ArrayList; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; /** * * @author enrico */ +@XmlRootElement +@XmlAccessorType(XmlAccessType.FIELD) public class Environment implements Serializable { diff --git a/framework/freedomotic-model/src/main/java/com/freedomotic/model/environment/Zone.java b/framework/freedomotic-model/src/main/java/com/freedomotic/model/environment/Zone.java index 84f7f13df..5bc62dcdd 100644 --- a/framework/freedomotic-model/src/main/java/com/freedomotic/model/environment/Zone.java +++ b/framework/freedomotic-model/src/main/java/com/freedomotic/model/environment/Zone.java @@ -43,11 +43,16 @@ import com.freedomotic.model.object.EnvObject; import java.io.Serializable; import java.util.ArrayList; +import java.util.UUID; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; /** * * @author enrico */ +@XmlRootElement public class Zone implements Serializable { @@ -59,6 +64,7 @@ public class Zone private FreedomPolygon shape; private ArrayList objects; private String texture; + private String uuid; /** * @@ -68,6 +74,9 @@ public String getName() { return this.name; } + public Zone(){ + this.uuid = UUID.randomUUID().toString(); + } /** * * @return @@ -89,7 +98,7 @@ public boolean isRoom() { * @param room */ public void setAsRoom(boolean room) { - this.room = room; + this.setRoom(room); } /** @@ -221,4 +230,25 @@ public int hashCode() { return hash; } + + /** + * @param room the room to set + */ + public void setRoom(boolean room) { + this.room = room; + } + + /** + * @return the uuid + */ + public String getUuid() { + return uuid; + } + + /** + * @param uuid the uuid to set + */ + public void setUuid(String uuid) { + this.uuid = uuid; + } } diff --git a/framework/freedomotic-model/src/main/java/com/freedomotic/model/geometry/FreedomShape.java b/framework/freedomotic-model/src/main/java/com/freedomotic/model/geometry/FreedomShape.java index ba03bb8a7..43b313854 100644 --- a/framework/freedomotic-model/src/main/java/com/freedomotic/model/geometry/FreedomShape.java +++ b/framework/freedomotic-model/src/main/java/com/freedomotic/model/geometry/FreedomShape.java @@ -21,12 +21,17 @@ */ package com.freedomotic.model.geometry; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonSubTypes.Type; +import com.fasterxml.jackson.annotation.JsonTypeInfo; import java.io.Serializable; /** * * @author Enrico */ +@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type" ) + @JsonSubTypes( { @Type( value = FreedomPolygon.class, name = "polygon" ), @Type( value = FreedomEllipse.class, name = "ellipse" ) } ) public interface FreedomShape extends Serializable { } diff --git a/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/Behavior.java b/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/Behavior.java index 3d81fc7eb..dd619a78b 100644 --- a/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/Behavior.java +++ b/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/Behavior.java @@ -25,12 +25,26 @@ */ package com.freedomotic.model.object; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonSubTypes.Type; +import com.fasterxml.jackson.annotation.JsonTypeInfo; import java.io.Serializable; +import javax.xml.bind.annotation.XmlSeeAlso; +import javax.xml.bind.annotation.XmlTransient; /** * * @author Enrico */ +@JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type" ) +@JsonSubTypes( { + @Type( value = BooleanBehavior.class, name = "boolean" ), + @Type( value = RangedIntBehavior.class, name = "rangedint" ) , + @Type( value = PropertiesBehavior.class, name = "properties" ) , + @Type( value = MultiselectionListBehavior.class, name = "multiselectionlist" ) , + @Type( value = DataBehavior.class, name = "data" ) , + @Type( value = ListBehavior.class, name = "list" ) + }) public abstract class Behavior implements Serializable { @@ -102,7 +116,7 @@ public boolean isReadOnly() { * @param readOnly */ public void setReadonly(boolean readOnly) { - this.readOnly = readOnly; + this.setReadOnly(readOnly); } /** @@ -117,7 +131,7 @@ public void setDescription(String desc) { * * @return */ - public String getDescriprion() { + public String getDescription() { return description; } @@ -172,4 +186,11 @@ public int hashCode() { return hash; } + + /** + * @param readOnly the readOnly to set + */ + public void setReadOnly(boolean readOnly) { + this.readOnly = readOnly; + } } diff --git a/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/BooleanBehavior.java b/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/BooleanBehavior.java index c9f98923c..da3669a0a 100644 --- a/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/BooleanBehavior.java +++ b/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/BooleanBehavior.java @@ -21,10 +21,14 @@ */ package com.freedomotic.model.object; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + /** * * @author nicoletti */ +@XmlRootElement public class BooleanBehavior extends Behavior { diff --git a/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/DataBehavior.java b/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/DataBehavior.java index e9707f195..78cc43f6d 100644 --- a/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/DataBehavior.java +++ b/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/DataBehavior.java @@ -21,11 +21,13 @@ import com.freedomotic.model.charting.UsageData; import java.util.List; +import javax.xml.bind.annotation.XmlRootElement; /** * * @author Matteo Mazzoni */ +@XmlRootElement public class DataBehavior extends Behavior{ private List data; diff --git a/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/EnvObject.java b/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/EnvObject.java index 11ff2e502..83bf3d0df 100644 --- a/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/EnvObject.java +++ b/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/EnvObject.java @@ -1,22 +1,20 @@ /** * - * Copyright (c) 2009-2014 Freedomotic team - * http://freedomotic.com + * Copyright (c) 2009-2014 Freedomotic team http://freedomotic.com * * This file is part of Freedomotic * - * This Program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. + * This Program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2, or (at your option) any later version. * - * This Program 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 General Public License for more details. + * This Program 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 General Public License for more + * details. * - * You should have received a copy of the GNU General Public License - * along with Freedomotic; see the file COPYING. If not, see + * You should have received a copy of the GNU General Public License along with + * Freedomotic; see the file COPYING. If not, see * . */ package com.freedomotic.model.object; @@ -28,16 +26,24 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; /** * * @author nicoletti */ +@XmlRootElement +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(propOrder={"name", "description", "uuid","protocol","phisicalAddress","type","actAs", + "representations", "currentRepresentation", "behaviors","hierarchy","actions","triggers","tags","envUUID"}) public class EnvObject implements Serializable { private static final long serialVersionUID = -7253889516478184321L; - - private String name; + + private String name; private String description; private String actAs; private String type; @@ -45,11 +51,11 @@ public class EnvObject implements Serializable { private String hierarchy; private String protocol; private String phisicalAddress; - private List behaviors; - private List representation ; //= new ArrayList(); + private List behaviors = new ArrayList(); + private List representation = new ArrayList(); private Set tags; - private Properties actions; - private Properties triggers; + private Properties actions = new Properties(); + private Properties triggers = new Properties(); private int currentRepresentation; private String envUUID; @@ -391,41 +397,41 @@ public int hashCode() { public String toString() { return getName(); } - + /** * * @return */ - public Set getTagsList(){ + public Set getTagsList() { return this.tags; } - + /** * * @return */ - public String getTagsString(){ + public String getTagsString() { StringBuilder tagString = new StringBuilder(); Boolean morethanone = false; - for (String tag : getTagsList()){ - if (tag.trim() != ""){ - if (morethanone){ - tagString.append(","); - } - tagString.append(tag.trim()); - morethanone = true; + for (String tag : getTagsList()) { + if (tag.trim() != "") { + if (morethanone) { + tagString.append(","); + } + tagString.append(tag.trim()); + morethanone = true; } } return tagString.toString(); } - + /** * */ - public void initTags(){ - if (this.tags == null){ + public void initTags() { + if (this.tags == null) { this.tags = new HashSet(); } } - + } diff --git a/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/MultiselectionListBehavior.java b/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/MultiselectionListBehavior.java index 9deabe03e..5b044ebe5 100644 --- a/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/MultiselectionListBehavior.java +++ b/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/MultiselectionListBehavior.java @@ -23,11 +23,13 @@ import java.util.ArrayList; import java.util.List; +import javax.xml.bind.annotation.XmlRootElement; /** * * @author Enrico */ +@XmlRootElement public class MultiselectionListBehavior extends Behavior { diff --git a/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/Properties.java b/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/Properties.java index 5eb21ba00..d69afc833 100644 --- a/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/Properties.java +++ b/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/Properties.java @@ -29,15 +29,21 @@ import java.util.HashMap; import java.util.Map.Entry; import java.util.Set; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; /** * * @author gpt */ +@XmlRootElement +@XmlAccessorType(XmlAccessType.NONE) public class Properties implements Serializable { private static final long serialVersionUID = 1L; - + @XmlElement HashMap propertyList; /** diff --git a/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/PropertiesBehavior.java b/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/PropertiesBehavior.java index ce97b5fe4..f5910107e 100644 --- a/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/PropertiesBehavior.java +++ b/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/PropertiesBehavior.java @@ -25,10 +25,13 @@ */ package com.freedomotic.model.object; +import javax.xml.bind.annotation.XmlRootElement; + /** * * @author enrico */ +@XmlRootElement public class PropertiesBehavior extends Behavior { diff --git a/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/RangedIntBehavior.java b/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/RangedIntBehavior.java index 3ce882740..05aaf1a19 100644 --- a/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/RangedIntBehavior.java +++ b/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/RangedIntBehavior.java @@ -21,10 +21,13 @@ */ package com.freedomotic.model.object; +import javax.xml.bind.annotation.XmlRootElement; + /** * * @author Enrico */ +@XmlRootElement public class RangedIntBehavior extends Behavior { @@ -87,7 +90,7 @@ public int getMin() { */ public int getScale() { if (scale <= 0) { - scale = 1; + setScale(1); } return scale; @@ -102,4 +105,32 @@ public void setValue(int inputValue) { this.setActive(true); value = inputValue; } + + /** + * @param max the max to set + */ + public void setMax(int max) { + this.max = max; + } + + /** + * @param min the min to set + */ + public void setMin(int min) { + this.min = min; + } + + /** + * @param scale the scale to set + */ + public void setScale(int scale) { + this.scale = scale; + } + + /** + * @param step the step to set + */ + public void setStep(int step) { + this.step = step; + } } diff --git a/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/Representation.java b/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/Representation.java index 736c67e2b..ea197f13e 100644 --- a/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/Representation.java +++ b/framework/freedomotic-model/src/main/java/com/freedomotic/model/object/Representation.java @@ -24,6 +24,7 @@ import com.freedomotic.model.geometry.FreedomPoint; import com.freedomotic.model.geometry.FreedomShape; import java.io.Serializable; +import javax.xml.bind.annotation.XmlTransient; /** * @@ -211,6 +212,7 @@ public double getRotation() { * * @return */ + @XmlTransient public boolean isFilled() { if (fillColor != null) { return true; @@ -223,6 +225,7 @@ public boolean isFilled() { * * @return */ + @XmlTransient public boolean isBordered() { if (borderColor != null) { return true; diff --git a/framework/freedomotic-model/src/main/java/com/freedomotic/reactions/Payload.java b/framework/freedomotic-model/src/main/java/com/freedomotic/reactions/Payload.java index b76f3ce82..c6c57934c 100644 --- a/framework/freedomotic-model/src/main/java/com/freedomotic/reactions/Payload.java +++ b/framework/freedomotic-model/src/main/java/com/freedomotic/reactions/Payload.java @@ -30,15 +30,21 @@ import java.util.concurrent.CopyOnWriteArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; /** * * @author Enrico */ +@XmlRootElement public final class Payload implements Serializable { private static final long serialVersionUID = -5799483105084939108L; + @XmlElement List payload = new CopyOnWriteArrayList(); /** diff --git a/framework/freedomotic-model/src/main/java/com/freedomotic/reactions/Statement.java b/framework/freedomotic-model/src/main/java/com/freedomotic/reactions/Statement.java index 4401035bb..5282238b9 100644 --- a/framework/freedomotic-model/src/main/java/com/freedomotic/reactions/Statement.java +++ b/framework/freedomotic-model/src/main/java/com/freedomotic/reactions/Statement.java @@ -26,11 +26,13 @@ package com.freedomotic.reactions; import java.io.Serializable; +import javax.xml.bind.annotation.XmlRootElement; /** * * @author Enrico */ +@XmlRootElement public class Statement implements Serializable {