From a197b4b8af788d3d3251ee97ba17ec1a300d0e62 Mon Sep 17 00:00:00 2001 From: Peter Hormanns Date: Tue, 12 May 2020 19:45:43 +0200 Subject: [PATCH] refactorings, extract core.util package --- hsarback/.classpath | 8 +- hsarback/lib/hsadmin-util-4.0.1-SNAPSHOT.jar | Bin 0 -> 10224 bytes hsarback/lib/jpwgen-1.2.0.jar | Bin 60191 -> 0 bytes .../AutoconfigAutodiscoverServlet.java | 2 +- .../de/hsadmin/core/model/AbstractEntity.java | 1 + .../core/model/AbstractModuleImpl.java | 6 +- .../core/model/AuthenticationException.java | 2 + .../core/model/AuthorisationException.java | 1 + .../core/model/EntitySessionHelper.java | 5 +- .../hsadmin/core/model/GenericModuleImpl.java | 2 +- .../hsadmin/core/model/HSAdminException.java | 19 ---- .../src/de/hsadmin/core/model/LoginUser.java | 25 ----- .../hsadmin/core/model/ModuleInterface.java | 2 + .../core/model/PrivilegesModuleImpl.java | 1 + .../core/{util => model}/ReflectionUtil.java | 10 +- .../core/model/SecureDefaultModuleImpl.java | 1 + .../core/qserv/EntityProcessorFactory.java | 7 +- .../de/hsadmin/core/qserv/JDBCProcessor.java | 2 +- .../core/qserv/ProcessorException.java | 2 +- .../src/de/hsadmin/core/qserv/SmtpHelper.java | 2 +- hsarback/src/de/hsadmin/core/util/Config.java | 58 ------------ .../src/de/hsadmin/core/util/IPv6Trick.java | 87 ------------------ .../de/hsadmin/core/util/PasswordTool.java | 25 ----- .../src/de/hsadmin/core/util/TextUtil.java | 87 ------------------ .../mods/db/MySqlDatabaseModuleImpl.java | 2 +- .../hsadmin/mods/db/MySqlUserModuleImpl.java | 2 +- .../mods/db/PgSqlDatabaseModuleImpl.java | 2 +- .../hsadmin/mods/db/PgSqlUserModuleImpl.java | 2 +- .../de/hsadmin/mods/dom/DomainModuleImpl.java | 2 +- .../de/hsadmin/mods/email/EMailAddress.java | 2 +- .../mods/email/EMailAddressModuleImpl.java | 2 +- .../mods/email/EMailAliasModuleImpl.java | 2 +- .../src/de/hsadmin/mods/pac/INetAddress.java | 4 +- .../de/hsadmin/mods/pac/PacModuleImpl.java | 4 +- .../hsadmin/mods/pac/PacProcessorFactory.java | 17 ++-- .../hsadmin/mods/qstat/QTaskModuleImpl.java | 2 +- .../hsadmin/mods/user/UnixUserModuleImpl.java | 2 +- .../de/hsadmin/pillar/JsonPillarServlet.java | 6 +- .../src/de/hsadmin/remote/AbstractRemote.java | 2 +- .../hsadmin/remote/GenericAbstractRemote.java | 4 +- hsarback/src/de/hsadmin/remote/IRemote.java | 2 +- .../remote/ModulePropertiesRemote.java | 2 +- hsarback/src/de/hsadmin/remote/PacRemote.java | 2 +- .../src/de/hsadmin/remote/PropertyRemote.java | 2 +- .../src/de/hsadmin/remote/RoleRemote.java | 2 +- 45 files changed, 68 insertions(+), 354 deletions(-) create mode 100644 hsarback/lib/hsadmin-util-4.0.1-SNAPSHOT.jar delete mode 100644 hsarback/lib/jpwgen-1.2.0.jar delete mode 100644 hsarback/src/de/hsadmin/core/model/HSAdminException.java delete mode 100644 hsarback/src/de/hsadmin/core/model/LoginUser.java rename hsarback/src/de/hsadmin/core/{util => model}/ReflectionUtil.java (93%) delete mode 100644 hsarback/src/de/hsadmin/core/util/Config.java delete mode 100644 hsarback/src/de/hsadmin/core/util/IPv6Trick.java delete mode 100644 hsarback/src/de/hsadmin/core/util/PasswordTool.java delete mode 100644 hsarback/src/de/hsadmin/core/util/TextUtil.java diff --git a/hsarback/.classpath b/hsarback/.classpath index 2c40f2b..62952fc 100644 --- a/hsarback/.classpath +++ b/hsarback/.classpath @@ -2,7 +2,11 @@ - + + + + + @@ -17,7 +21,6 @@ - @@ -31,5 +34,6 @@ + diff --git a/hsarback/lib/hsadmin-util-4.0.1-SNAPSHOT.jar b/hsarback/lib/hsadmin-util-4.0.1-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..4ee364f15ef6449baecfe828b5bba846c4597f67 GIT binary patch literal 10224 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 P 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 VN9}ZGX6;Yg>GPdB42xs?^#fFQ5P<*y diff --git a/hsarback/src/de/hsadmin/autoconfig/AutoconfigAutodiscoverServlet.java b/hsarback/src/de/hsadmin/autoconfig/AutoconfigAutodiscoverServlet.java index 25ac9a1..f27e896 100644 --- a/hsarback/src/de/hsadmin/autoconfig/AutoconfigAutodiscoverServlet.java +++ b/hsarback/src/de/hsadmin/autoconfig/AutoconfigAutodiscoverServlet.java @@ -25,8 +25,8 @@ import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; -import de.hsadmin.core.model.HSAdminException; import de.hsadmin.core.model.Transaction; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.mods.email.EMailAddress; import de.hsadmin.mods.user.UnixUser; diff --git a/hsarback/src/de/hsadmin/core/model/AbstractEntity.java b/hsarback/src/de/hsadmin/core/model/AbstractEntity.java index b6184bb..398f4df 100644 --- a/hsarback/src/de/hsadmin/core/model/AbstractEntity.java +++ b/hsarback/src/de/hsadmin/core/model/AbstractEntity.java @@ -2,6 +2,7 @@ package de.hsadmin.core.model; import javax.persistence.EntityManager; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.mods.user.UnixUser; public abstract class AbstractEntity { diff --git a/hsarback/src/de/hsadmin/core/model/AbstractModuleImpl.java b/hsarback/src/de/hsadmin/core/model/AbstractModuleImpl.java index e1e272f..eadb74a 100644 --- a/hsarback/src/de/hsadmin/core/model/AbstractModuleImpl.java +++ b/hsarback/src/de/hsadmin/core/model/AbstractModuleImpl.java @@ -1,5 +1,6 @@ package de.hsadmin.core.model; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.LinkedList; import java.util.List; @@ -13,6 +14,7 @@ import de.hsadmin.core.qserv.EntityProcessorFactory; import de.hsadmin.core.qserv.NullProcessor; import de.hsadmin.core.qserv.Processor; import de.hsadmin.core.qserv.QueueTask; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.mods.user.UnixUser; /** @@ -174,7 +176,7 @@ public abstract class AbstractModuleImpl implements ModuleInterface { try { procFactClass = Class.forName(procFactName); if (procFactClass != null) { - procFact = (EntityProcessorFactory) procFactClass.newInstance(); + procFact = (EntityProcessorFactory) procFactClass.getDeclaredConstructor().newInstance(); } } catch (ClassNotFoundException e) { // no processor defined @@ -182,6 +184,8 @@ public abstract class AbstractModuleImpl implements ModuleInterface { throw new HSAdminException(e); } catch (IllegalAccessException e) { throw new HSAdminException(e); + } catch (IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) { + // no processor defined } return procFact; } diff --git a/hsarback/src/de/hsadmin/core/model/AuthenticationException.java b/hsarback/src/de/hsadmin/core/model/AuthenticationException.java index 66332f1..8a26bc4 100644 --- a/hsarback/src/de/hsadmin/core/model/AuthenticationException.java +++ b/hsarback/src/de/hsadmin/core/model/AuthenticationException.java @@ -1,5 +1,7 @@ package de.hsadmin.core.model; +import de.hsadmin.core.util.HSAdminException; + public class AuthenticationException extends HSAdminException { private static final long serialVersionUID = 6242824365822822456L; diff --git a/hsarback/src/de/hsadmin/core/model/AuthorisationException.java b/hsarback/src/de/hsadmin/core/model/AuthorisationException.java index 7fa5370..cca6db3 100644 --- a/hsarback/src/de/hsadmin/core/model/AuthorisationException.java +++ b/hsarback/src/de/hsadmin/core/model/AuthorisationException.java @@ -1,5 +1,6 @@ package de.hsadmin.core.model; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.mods.user.UnixUser; public class AuthorisationException extends HSAdminException { diff --git a/hsarback/src/de/hsadmin/core/model/EntitySessionHelper.java b/hsarback/src/de/hsadmin/core/model/EntitySessionHelper.java index a710a1a..54a1c9d 100644 --- a/hsarback/src/de/hsadmin/core/model/EntitySessionHelper.java +++ b/hsarback/src/de/hsadmin/core/model/EntitySessionHelper.java @@ -1,6 +1,5 @@ package de.hsadmin.core.model; - public class EntitySessionHelper { /** @@ -24,9 +23,9 @@ public class EntitySessionHelper { } private static AbstractModuleImpl instantiateModuleImpl(Transaction tx, Class wrapperClass) - throws InstantiationException, IllegalAccessException { + throws ReflectiveOperationException { AbstractModuleImpl impl; - impl = (AbstractModuleImpl) wrapperClass.newInstance(); + impl = (AbstractModuleImpl) wrapperClass.getDeclaredConstructor().newInstance(); impl.construct(tx); return impl; } diff --git a/hsarback/src/de/hsadmin/core/model/GenericModuleImpl.java b/hsarback/src/de/hsadmin/core/model/GenericModuleImpl.java index 880e6ec..6b99549 100644 --- a/hsarback/src/de/hsadmin/core/model/GenericModuleImpl.java +++ b/hsarback/src/de/hsadmin/core/model/GenericModuleImpl.java @@ -4,7 +4,7 @@ import java.lang.reflect.Field; import java.util.List; import java.util.regex.Pattern; -import de.hsadmin.core.util.ReflectionUtil; +import de.hsadmin.core.util.HSAdminException; public class GenericModuleImpl implements ModuleInterface { diff --git a/hsarback/src/de/hsadmin/core/model/HSAdminException.java b/hsarback/src/de/hsadmin/core/model/HSAdminException.java deleted file mode 100644 index 8e42774..0000000 --- a/hsarback/src/de/hsadmin/core/model/HSAdminException.java +++ /dev/null @@ -1,19 +0,0 @@ -package de.hsadmin.core.model; - -public class HSAdminException extends Exception { - - private static final long serialVersionUID = -5082179267383474532L; - - public HSAdminException(String message) { - super(message); - } - - public HSAdminException(Exception e) { - super(e); - } - - public HSAdminException(String message, Exception aExc) { - super(message, aExc); - } - -} diff --git a/hsarback/src/de/hsadmin/core/model/LoginUser.java b/hsarback/src/de/hsadmin/core/model/LoginUser.java deleted file mode 100644 index 6e3f4d5..0000000 --- a/hsarback/src/de/hsadmin/core/model/LoginUser.java +++ /dev/null @@ -1,25 +0,0 @@ -package de.hsadmin.core.model; - -/** - * Transiente User-Klasse. Entkoppelt das core-Paket vom UnixUser-Modul. - * @author Peter Hormanns - */ -public class LoginUser { - - // TODO UnixUser Referenzen im Core-Paket ersetzen - private String login; - - public LoginUser(String loginName) { - login = loginName; - } - - public String getLogin() { - return login; - } - - public boolean hasHostmasterRole() { - // TODO Auto-generated method stub - return false; - } - -} diff --git a/hsarback/src/de/hsadmin/core/model/ModuleInterface.java b/hsarback/src/de/hsadmin/core/model/ModuleInterface.java index 0fe5b52..ff140ed 100644 --- a/hsarback/src/de/hsadmin/core/model/ModuleInterface.java +++ b/hsarback/src/de/hsadmin/core/model/ModuleInterface.java @@ -2,6 +2,8 @@ package de.hsadmin.core.model; import java.util.List; +import de.hsadmin.core.util.HSAdminException; + /** * Represents a CRUD (Create, Retrieve, Update, Delete) interface for generic * entity instances. diff --git a/hsarback/src/de/hsadmin/core/model/PrivilegesModuleImpl.java b/hsarback/src/de/hsadmin/core/model/PrivilegesModuleImpl.java index 8686274..5ac4b99 100644 --- a/hsarback/src/de/hsadmin/core/model/PrivilegesModuleImpl.java +++ b/hsarback/src/de/hsadmin/core/model/PrivilegesModuleImpl.java @@ -2,6 +2,7 @@ package de.hsadmin.core.model; import java.util.List; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.mods.user.UnixUser; public class PrivilegesModuleImpl extends AbstractModuleImpl implements PrivilegesInterface { diff --git a/hsarback/src/de/hsadmin/core/util/ReflectionUtil.java b/hsarback/src/de/hsadmin/core/model/ReflectionUtil.java similarity index 93% rename from hsarback/src/de/hsadmin/core/util/ReflectionUtil.java rename to hsarback/src/de/hsadmin/core/model/ReflectionUtil.java index 5f86d88..7d8c9e5 100644 --- a/hsarback/src/de/hsadmin/core/util/ReflectionUtil.java +++ b/hsarback/src/de/hsadmin/core/model/ReflectionUtil.java @@ -1,4 +1,4 @@ -package de.hsadmin.core.util; +package de.hsadmin.core.model; import java.lang.reflect.Field; import java.lang.reflect.Method; @@ -8,9 +8,7 @@ import java.util.List; import java.util.Set; import java.util.TreeSet; -import de.hsadmin.core.model.AbstractEntity; -import de.hsadmin.core.model.AnnFieldIO; -import de.hsadmin.core.model.TechnicalException; +import de.hsadmin.core.util.TextUtil; public class ReflectionUtil { @@ -81,7 +79,7 @@ public class ReflectionUtil { if (valueObject != null && valueObject instanceof Object[]) { for (Object item : ((Object[]) valueObject)) { if (item instanceof String && referTo.getDeclaredField("name") != null) { - Object instance = referTo.newInstance(); + Object instance = referTo.getDeclaredConstructor().newInstance(); if (instance instanceof AbstractEntity) { invokeSetter((AbstractEntity) instance, referTo, referTo.getDeclaredField("name"), item); newSet.add(instance); @@ -90,7 +88,7 @@ public class ReflectionUtil { } } } else { - Object newInstance = type.newInstance(); + Object newInstance = type.getDeclaredConstructor().newInstance(); clasz.getMethod(setterName(f), type).invoke(entity, newInstance); type.getMethod("setName", String.class).invoke(newInstance, valueObject); } diff --git a/hsarback/src/de/hsadmin/core/model/SecureDefaultModuleImpl.java b/hsarback/src/de/hsadmin/core/model/SecureDefaultModuleImpl.java index 36ead48..270d6e1 100644 --- a/hsarback/src/de/hsadmin/core/model/SecureDefaultModuleImpl.java +++ b/hsarback/src/de/hsadmin/core/model/SecureDefaultModuleImpl.java @@ -5,6 +5,7 @@ import java.util.List; import javax.persistence.EntityManager; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.mods.user.UnixUser; /** diff --git a/hsarback/src/de/hsadmin/core/qserv/EntityProcessorFactory.java b/hsarback/src/de/hsadmin/core/qserv/EntityProcessorFactory.java index 43d9919..e343a0a 100644 --- a/hsarback/src/de/hsadmin/core/qserv/EntityProcessorFactory.java +++ b/hsarback/src/de/hsadmin/core/qserv/EntityProcessorFactory.java @@ -3,16 +3,17 @@ package de.hsadmin.core.qserv; import javax.persistence.EntityManager; import de.hsadmin.core.model.AbstractEntity; +import de.hsadmin.core.util.HSAdminException; public interface EntityProcessorFactory { public Processor - createCreateProcessor(EntityManager em, T entity) throws ProcessorException; + createCreateProcessor(EntityManager em, T entity) throws HSAdminException; public Processor - createUpdateProcessor(EntityManager em, T newEntity) throws ProcessorException; + createUpdateProcessor(EntityManager em, T newEntity) throws HSAdminException; public Processor - createDeleteProcessor(EntityManager em, T entity) throws ProcessorException; + createDeleteProcessor(EntityManager em, T entity) throws HSAdminException; } diff --git a/hsarback/src/de/hsadmin/core/qserv/JDBCProcessor.java b/hsarback/src/de/hsadmin/core/qserv/JDBCProcessor.java index a570d14..2827562 100644 --- a/hsarback/src/de/hsadmin/core/qserv/JDBCProcessor.java +++ b/hsarback/src/de/hsadmin/core/qserv/JDBCProcessor.java @@ -60,7 +60,7 @@ public class JDBCProcessor extends AbstractProcessor { System.out.println("SQL: " + sqlStatement); s.execute(sqlStatement); } - return new Integer(0); + return 0; } catch (SQLException aSqlExc) { Exception exc = aSqlExc.getNextException(); if (exc == null) { diff --git a/hsarback/src/de/hsadmin/core/qserv/ProcessorException.java b/hsarback/src/de/hsadmin/core/qserv/ProcessorException.java index ea8ac25..d682e79 100644 --- a/hsarback/src/de/hsadmin/core/qserv/ProcessorException.java +++ b/hsarback/src/de/hsadmin/core/qserv/ProcessorException.java @@ -1,6 +1,6 @@ package de.hsadmin.core.qserv; -import de.hsadmin.core.model.HSAdminException; +import de.hsadmin.core.util.HSAdminException; public class ProcessorException extends HSAdminException { diff --git a/hsarback/src/de/hsadmin/core/qserv/SmtpHelper.java b/hsarback/src/de/hsadmin/core/qserv/SmtpHelper.java index f363334..2f7db34 100644 --- a/hsarback/src/de/hsadmin/core/qserv/SmtpHelper.java +++ b/hsarback/src/de/hsadmin/core/qserv/SmtpHelper.java @@ -11,8 +11,8 @@ import org.apache.commons.net.smtp.SMTPClient; import org.apache.commons.net.smtp.SMTPReply; import org.apache.commons.net.smtp.SimpleSMTPHeader; -import de.hsadmin.core.model.HSAdminException; import de.hsadmin.core.util.Config; +import de.hsadmin.core.util.HSAdminException; public class SmtpHelper { diff --git a/hsarback/src/de/hsadmin/core/util/Config.java b/hsarback/src/de/hsadmin/core/util/Config.java deleted file mode 100644 index 2d713a4..0000000 --- a/hsarback/src/de/hsadmin/core/util/Config.java +++ /dev/null @@ -1,58 +0,0 @@ -package de.hsadmin.core.util; - -import java.io.File; -import java.io.FileReader; -import java.util.Properties; -import java.util.logging.Logger; - -public class Config { - - private static Config instance; - - private static Logger LOG = Logger.getLogger(Config.class.getName()); - - private Properties props; - - private Config() { - props = new Properties(); - File file = new File(System.getProperty("user.dir") + "/hsadmin.properties"); - if (!file.canRead()) { - file = new File(System.getProperty("user.dir") + "/conf/hsadmin.properties"); - } - if (!file.canRead()) { - file = new File(System.getProperty("user.home") + "/.hsadmin.properties"); - } - if (!file.canRead()) { - file = new File("/etc/hsadmin.properties"); - } - if (!file.canRead()) { - file = new File("/etc/hsadmin/hsadmin.properties"); - } - if (file.canRead()) { - try { - LOG.info("Constructor - Properties-File: " + file.getAbsolutePath()); - props.load(new FileReader(file)); - } catch (Exception e) { - // should not happen - e.printStackTrace(); - } - } - } - - public static Config getInstance() { - if (instance == null) { - instance = new Config(); - } - return instance; - } - - public String getProperty(String propertyName) { - String property = props.getProperty(propertyName); - return property; - } - - public String getProperty(String propertyName, String defaultValue) { - return props.getProperty(propertyName, defaultValue).trim(); - } - -} diff --git a/hsarback/src/de/hsadmin/core/util/IPv6Trick.java b/hsarback/src/de/hsadmin/core/util/IPv6Trick.java deleted file mode 100644 index 85847cd..0000000 --- a/hsarback/src/de/hsadmin/core/util/IPv6Trick.java +++ /dev/null @@ -1,87 +0,0 @@ -package de.hsadmin.core.util; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -import de.hsadmin.core.qserv.ProcessorException; - -public class IPv6Trick { - - private static final String IPv4_LOCALHOST = "127.0.0"; - private static final String IPv6_LOCALHOST = "::1"; - private static final String IPv6_LOCALHOST_ALT = "0:0:0:0:0:0:0:1"; - - private static final String IPv4_83_223_79 = "83.223.79"; // Alboin-Kontor Berlin - private static final String IPv4_83_223_91 = "83.223.91"; // Alboin-Kontor Berlin - private static final String IPv4_83_223_95 = "83.223.95"; // Alboin-Kontor Berlin - private static final String IPv6_PREFIX_AK = "2a01:37:1000::1"; - - private static final String IPv4_83_223_78 = "83.223.78"; // e-Shelter Berlin - private static final String IPv4_83_223_94 = "83.223.94"; // e-Shelter Berlin - private static final String IPv6_PREFIX_ES = "2a01:37:3000::1"; - - private static final String IPv6_PREFIX_HS = "2a01:37:"; - private static final String IPv6_PREFIX_HS_ALT = "2a01:0037:"; - - public static String convertIPv4ToIPv6(final String ipv4address) throws ProcessorException { - if (ipv4address == null || ipv4address.length() == 0) { - throw new ProcessorException("no IPv4 address given"); - } - try { - final InetAddress inetV4Address = InetAddress.getByName(ipv4address); - if (ipv4address.startsWith(IPv4_83_223_79) // Alboin-Kontor Berlin - || ipv4address.startsWith(IPv4_83_223_91) - || ipv4address.startsWith(IPv4_83_223_95) ) { - return embedIPv4Address(inetV4Address, InetAddress.getByName(IPv6_PREFIX_AK)); - } - if (ipv4address.startsWith(IPv4_83_223_78) // e-Shelter Berlin - || ipv4address.startsWith(IPv4_83_223_94) ) { - return embedIPv4Address(inetV4Address, InetAddress.getByName(IPv6_PREFIX_ES)); - } - } catch (UnknownHostException e) { - throw new ProcessorException(e); - } - throw new ProcessorException("unknown IPv4 address given"); - } - - public static boolean isKnownRemote(final String remoteAddress) { - boolean isKnown = false; - System.out.print(remoteAddress + "\n"); - if (remoteAddress.startsWith(IPv4_LOCALHOST) || remoteAddress.startsWith(IPv6_LOCALHOST) || remoteAddress.startsWith(IPv6_LOCALHOST_ALT)) { - // localhost - isKnown = true; - } - if (remoteAddress.startsWith(IPv6_PREFIX_HS) || remoteAddress.startsWith(IPv6_PREFIX_HS_ALT)) { - // Hostsharing IPv6 - isKnown = true; - } - if (remoteAddress.startsWith(IPv4_83_223_78) || remoteAddress.startsWith(IPv4_83_223_94)) { - // e-Shelter - isKnown = true; - } - if (remoteAddress.startsWith(IPv4_83_223_79) || remoteAddress.startsWith(IPv4_83_223_91) || remoteAddress.startsWith(IPv4_83_223_95)) { - // Speedbone Alboin Kontor - isKnown = true; - } - return isKnown; - } - - private static String embedIPv4Address(final InetAddress ipv4address, final InetAddress ipv6Mask) throws UnknownHostException { - final byte[] ipv4Bytes = ipv4address.getAddress(); - final byte[] ipv6Bytes = ipv6Mask.getAddress(); - ipv6Bytes[10] = ipv4Bytes[0]; - ipv6Bytes[11] = ipv4Bytes[1]; - ipv6Bytes[12] = ipv4Bytes[2]; - ipv6Bytes[13] = ipv4Bytes[3]; - ipv6Bytes[14] = 0; - ipv6Bytes[15] = 0; - final InetAddress ipv6Address = InetAddress.getByAddress(ipv6Bytes); - final String ipv6String = ipv6Address.getHostAddress(); - if (ipv6String.startsWith("/")) { - return ipv6String.substring(1); - } else { - return ipv6String; - } - } - -} diff --git a/hsarback/src/de/hsadmin/core/util/PasswordTool.java b/hsarback/src/de/hsadmin/core/util/PasswordTool.java deleted file mode 100644 index 004b07d..0000000 --- a/hsarback/src/de/hsadmin/core/util/PasswordTool.java +++ /dev/null @@ -1,25 +0,0 @@ -package de.hsadmin.core.util; - -import java.util.Random; - -import de.rrze.jpwgen.flags.PwGeneratorFlagBuilder; -import de.rrze.jpwgen.impl.PwGenerator; - -public class PasswordTool { - - public static PwGeneratorFlagBuilder flagBuilder = new PwGeneratorFlagBuilder(); - public static Random random = new Random(); - - static { - flagBuilder.setIncludeCapitals(); - flagBuilder.setIncludeNumerals(); -// flagBuilder.setIncludeReducedSymbols(); - flagBuilder.setFilterAmbiguous(); - } - - public static String generatePassword() { - String password = PwGenerator.generatePassword(17, flagBuilder.build(), 100, random); - return password; - } - -} diff --git a/hsarback/src/de/hsadmin/core/util/TextUtil.java b/hsarback/src/de/hsadmin/core/util/TextUtil.java deleted file mode 100644 index 1c80168..0000000 --- a/hsarback/src/de/hsadmin/core/util/TextUtil.java +++ /dev/null @@ -1,87 +0,0 @@ -package de.hsadmin.core.util; - -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; - -public class TextUtil { - - private static final DateFormat df = SimpleDateFormat.getDateInstance(DateFormat.SHORT, Locale.GERMAN); - - public static synchronized String replaceUmlautCharacters(String umlautString) { - StringBuffer buffer = new StringBuffer(); - for (char c : umlautString.toCharArray()) { - if ( (c >= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z') || - (c >= '0' && c <= '9') || - (c == ' ') ) { - buffer.append(c); - } else { - switch (c) { - case 'ä': - buffer.append("ae"); - break; - case 'ö': - buffer.append("oe"); - break; - case 'ü': - buffer.append("ue"); - break; - case 'Ä': - buffer.append("Ae"); - break; - case 'Ö': - buffer.append("Oe"); - break; - case 'Ü': - buffer.append("Ue"); - break; - case 'ß': - buffer.append("ss"); - break; - default: - buffer.append('-'); - break; - } - } - } - return buffer.toString(); - } - - public static synchronized String format(Date date) { - return df.format(date); - } - - public static synchronized Date parseDate(String dateString) { - try { - return df.parse(dateString); - } catch (ParseException e) { - try { - return df.parse("01.01.1970"); - } catch (ParseException e1) { - // don't care - return null; - } - } - } - - public static synchronized String format(boolean free) { - return free ? "true" : "false"; - } - - public static synchronized boolean parseBool(String boolString) { - boolean parsedValue = "T".equals(boolString.toUpperCase()) || "TRUE".equals(boolString.toUpperCase()); - return parsedValue; - } - - public static synchronized String hidePassword(String passwd) { - final StringBuffer val = new StringBuffer(passwd.substring(0, 2)); - for (int i = 2; i < 6; i++) { - val.append('*'); - } - return val.toString(); - } - -} diff --git a/hsarback/src/de/hsadmin/mods/db/MySqlDatabaseModuleImpl.java b/hsarback/src/de/hsadmin/mods/db/MySqlDatabaseModuleImpl.java index 72e90f7..6e6da29 100644 --- a/hsarback/src/de/hsadmin/mods/db/MySqlDatabaseModuleImpl.java +++ b/hsarback/src/de/hsadmin/mods/db/MySqlDatabaseModuleImpl.java @@ -8,8 +8,8 @@ import javax.persistence.Query; import de.hsadmin.core.model.AbstractEntity; import de.hsadmin.core.model.AbstractModuleImpl; import de.hsadmin.core.model.AuthorisationException; -import de.hsadmin.core.model.HSAdminException; import de.hsadmin.core.model.Transaction; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.hostsharing.BasePacType; import de.hsadmin.hostsharing.MultiOption; import de.hsadmin.mods.pac.Pac; diff --git a/hsarback/src/de/hsadmin/mods/db/MySqlUserModuleImpl.java b/hsarback/src/de/hsadmin/mods/db/MySqlUserModuleImpl.java index 05162b9..d51164c 100644 --- a/hsarback/src/de/hsadmin/mods/db/MySqlUserModuleImpl.java +++ b/hsarback/src/de/hsadmin/mods/db/MySqlUserModuleImpl.java @@ -8,8 +8,8 @@ import javax.persistence.Query; import de.hsadmin.core.model.AbstractEntity; import de.hsadmin.core.model.AbstractModuleImpl; import de.hsadmin.core.model.AuthorisationException; -import de.hsadmin.core.model.HSAdminException; import de.hsadmin.core.model.Transaction; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.hostsharing.BasePacType; import de.hsadmin.hostsharing.MultiOption; import de.hsadmin.mods.pac.Pac; diff --git a/hsarback/src/de/hsadmin/mods/db/PgSqlDatabaseModuleImpl.java b/hsarback/src/de/hsadmin/mods/db/PgSqlDatabaseModuleImpl.java index 464b38e..0e047b7 100644 --- a/hsarback/src/de/hsadmin/mods/db/PgSqlDatabaseModuleImpl.java +++ b/hsarback/src/de/hsadmin/mods/db/PgSqlDatabaseModuleImpl.java @@ -8,8 +8,8 @@ import javax.persistence.Query; import de.hsadmin.core.model.AbstractEntity; import de.hsadmin.core.model.AbstractModuleImpl; import de.hsadmin.core.model.AuthorisationException; -import de.hsadmin.core.model.HSAdminException; import de.hsadmin.core.model.Transaction; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.hostsharing.BasePacType; import de.hsadmin.hostsharing.MultiOption; import de.hsadmin.mods.pac.Pac; diff --git a/hsarback/src/de/hsadmin/mods/db/PgSqlUserModuleImpl.java b/hsarback/src/de/hsadmin/mods/db/PgSqlUserModuleImpl.java index 6d4617b..b8222bd 100644 --- a/hsarback/src/de/hsadmin/mods/db/PgSqlUserModuleImpl.java +++ b/hsarback/src/de/hsadmin/mods/db/PgSqlUserModuleImpl.java @@ -8,7 +8,7 @@ import javax.persistence.Query; import de.hsadmin.core.model.AbstractEntity; import de.hsadmin.core.model.AbstractModuleImpl; import de.hsadmin.core.model.AuthorisationException; -import de.hsadmin.core.model.HSAdminException; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.hostsharing.BasePacType; import de.hsadmin.hostsharing.MultiOption; import de.hsadmin.mods.pac.Pac; diff --git a/hsarback/src/de/hsadmin/mods/dom/DomainModuleImpl.java b/hsarback/src/de/hsadmin/mods/dom/DomainModuleImpl.java index 67b8615..55618b4 100644 --- a/hsarback/src/de/hsadmin/mods/dom/DomainModuleImpl.java +++ b/hsarback/src/de/hsadmin/mods/dom/DomainModuleImpl.java @@ -13,7 +13,7 @@ import de.hsadmin.core.model.AbstractEntity; import de.hsadmin.core.model.AbstractModuleImpl; import de.hsadmin.core.model.AuthorisationException; import de.hsadmin.core.model.GenericModuleImpl; -import de.hsadmin.core.model.HSAdminException; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.hostsharing.BasePacType; import de.hsadmin.mods.email.EMailAddress; import de.hsadmin.mods.pac.Pac; diff --git a/hsarback/src/de/hsadmin/mods/email/EMailAddress.java b/hsarback/src/de/hsadmin/mods/email/EMailAddress.java index 2dad272..440d42e 100644 --- a/hsarback/src/de/hsadmin/mods/email/EMailAddress.java +++ b/hsarback/src/de/hsadmin/mods/email/EMailAddress.java @@ -19,9 +19,9 @@ import javax.persistence.Transient; import de.hsadmin.core.model.AbstractEntity; import de.hsadmin.core.model.AnnFieldIO; import de.hsadmin.core.model.AnnModuleImpl; -import de.hsadmin.core.model.HSAdminException; import de.hsadmin.core.model.ReadWriteAccess; import de.hsadmin.core.model.SearchFilter; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.mods.dom.Domain; import de.hsadmin.mods.user.UnixUser; diff --git a/hsarback/src/de/hsadmin/mods/email/EMailAddressModuleImpl.java b/hsarback/src/de/hsadmin/mods/email/EMailAddressModuleImpl.java index 4103fd5..f029791 100644 --- a/hsarback/src/de/hsadmin/mods/email/EMailAddressModuleImpl.java +++ b/hsarback/src/de/hsadmin/mods/email/EMailAddressModuleImpl.java @@ -8,8 +8,8 @@ import javax.persistence.Query; import de.hsadmin.core.model.AbstractEntity; import de.hsadmin.core.model.AbstractModuleImpl; import de.hsadmin.core.model.AuthorisationException; -import de.hsadmin.core.model.HSAdminException; import de.hsadmin.core.model.Transaction; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.hostsharing.BasePacType; import de.hsadmin.mods.dom.Domain; import de.hsadmin.mods.dom.DomainOption; diff --git a/hsarback/src/de/hsadmin/mods/email/EMailAliasModuleImpl.java b/hsarback/src/de/hsadmin/mods/email/EMailAliasModuleImpl.java index 17827d0..e4fb47c 100644 --- a/hsarback/src/de/hsadmin/mods/email/EMailAliasModuleImpl.java +++ b/hsarback/src/de/hsadmin/mods/email/EMailAliasModuleImpl.java @@ -8,8 +8,8 @@ import javax.persistence.Query; import de.hsadmin.core.model.AbstractEntity; import de.hsadmin.core.model.AbstractModuleImpl; import de.hsadmin.core.model.AuthorisationException; -import de.hsadmin.core.model.HSAdminException; import de.hsadmin.core.model.Transaction; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.hostsharing.BasePacType; import de.hsadmin.hostsharing.MultiOption; import de.hsadmin.mods.pac.Pac; diff --git a/hsarback/src/de/hsadmin/mods/pac/INetAddress.java b/hsarback/src/de/hsadmin/mods/pac/INetAddress.java index 682cb3c..6c74c18 100644 --- a/hsarback/src/de/hsadmin/mods/pac/INetAddress.java +++ b/hsarback/src/de/hsadmin/mods/pac/INetAddress.java @@ -13,7 +13,7 @@ import javax.persistence.SequenceGenerator; import javax.persistence.Table; import de.hsadmin.core.model.AbstractEntity; -import de.hsadmin.core.qserv.ProcessorException; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.core.util.IPv6Trick; import de.hsadmin.mods.user.UnixUser; @@ -73,7 +73,7 @@ public class INetAddress extends AbstractEntity implements Serializable { return name; } - public String getInet6Addr() throws ProcessorException { + public String getInet6Addr() throws HSAdminException { return IPv6Trick.convertIPv4ToIPv6(name); } diff --git a/hsarback/src/de/hsadmin/mods/pac/PacModuleImpl.java b/hsarback/src/de/hsadmin/mods/pac/PacModuleImpl.java index 15c0af8..a2e54f4 100644 --- a/hsarback/src/de/hsadmin/mods/pac/PacModuleImpl.java +++ b/hsarback/src/de/hsadmin/mods/pac/PacModuleImpl.java @@ -14,7 +14,7 @@ import de.hsadmin.core.model.AbstractEntity; import de.hsadmin.core.model.AbstractModuleImpl; import de.hsadmin.core.model.AuthorisationException; import de.hsadmin.core.model.GenericModuleImpl; -import de.hsadmin.core.model.HSAdminException; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.core.util.TextUtil; import de.hsadmin.hostsharing.BasePacType; import de.hsadmin.mods.cust.Contact; @@ -136,7 +136,7 @@ public class PacModuleImpl extends AbstractModuleImpl { for (PacComponent c : oldPacComponents) { String feature = c.getBaseComponent().getFeature(); int quantity = c.getQuantity(); - oldQuantities.put(feature, new Integer(quantity)); + oldQuantities.put(feature, quantity); em.remove(c); } oldPacComponents.clear(); diff --git a/hsarback/src/de/hsadmin/mods/pac/PacProcessorFactory.java b/hsarback/src/de/hsadmin/mods/pac/PacProcessorFactory.java index c00dc5f..678edd3 100644 --- a/hsarback/src/de/hsadmin/mods/pac/PacProcessorFactory.java +++ b/hsarback/src/de/hsadmin/mods/pac/PacProcessorFactory.java @@ -21,6 +21,7 @@ import de.hsadmin.core.qserv.ShellProcessor; import de.hsadmin.core.qserv.VelocityProcessor; import de.hsadmin.core.qserv.WaitingTasksProcessor; import de.hsadmin.core.util.Config; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.core.util.PasswordTool; import de.hsadmin.hostsharing.BasePacType; import de.hsadmin.hostsharing.QuotaLimit; @@ -32,7 +33,7 @@ public class PacProcessorFactory implements EntityProcessorFactory { @Override public Processor createCreateProcessor( - EntityManager em, T entity) throws ProcessorException { + EntityManager em, T entity) throws HSAdminException { Pac pac = (Pac) entity; String basepacName = pac.getBasepac().getName(); if (basepacName.equals(BasePacType.PAC_WEB)) { @@ -67,7 +68,7 @@ public class PacProcessorFactory implements EntityProcessorFactory { @Override public Processor createUpdateProcessor(EntityManager em, T entity) - throws ProcessorException { + throws HSAdminException { Pac pac = (Pac) entity; String basepacName = pac.getBasepac().getName(); if (basepacName.equals(BasePacType.PAC_WEB)) { @@ -91,7 +92,7 @@ public class PacProcessorFactory implements EntityProcessorFactory { } @Override - public Processor createDeleteProcessor(EntityManager em, T entity) throws ProcessorException { + public Processor createDeleteProcessor(EntityManager em, T entity) throws HSAdminException { Pac pac = (Pac) entity; String basepacName = pac.getBasepac().getName(); if (basepacName.equals(BasePacType.PAC_WEB)) { @@ -130,7 +131,7 @@ public class PacProcessorFactory implements EntityProcessorFactory { return new ShellProcessor("mk-iptables-rules Accounting"); } - private Processor createHttpdVirtualProc(Hive hive) throws ProcessorException { + private Processor createHttpdVirtualProc(Hive hive) throws HSAdminException { Processor domSetupProcessor = new CompoundProcessor( new CreateFileProcessor("/de/hsadmin/mods/pac/httpd-virtual.vm", hive, "/etc/apache2/conf.d/virtual.conf.tmp", "root", "root", "644", true), @@ -145,7 +146,7 @@ public class PacProcessorFactory implements EntityProcessorFactory { return new VelocityProcessor("/de/hsadmin/mods/pac/hosts.vm", hive, "/etc/hosts", true); } - private Processor createNetworkInterfacesProc(final Hive hive) throws ProcessorException { + private Processor createNetworkInterfacesProc(final Hive hive) throws HSAdminException { return new CompoundProcessor( new VelocityProcessor("/de/hsadmin/mods/pac/pac-addr-ipv4.vm", hive, "/etc/network/pac-addr-ipv4", true), @@ -180,7 +181,7 @@ public class PacProcessorFactory implements EntityProcessorFactory { zonefileTemplateVars.put("inet4Addr", pac.getCurINetAddr().getInet4Addr()); try { zonefileTemplateVars.put("inet6Addr", pac.getCurINetAddr().getInet6Addr()); - } catch (ProcessorException e) { + } catch (HSAdminException e) { // dont care } final String domName = pac.getName() + ".hostsharing.net"; @@ -288,7 +289,7 @@ public class PacProcessorFactory implements EntityProcessorFactory { ); } - private Processor createIfUp(final Pac pac) throws ProcessorException { + private Processor createIfUp(final Pac pac) throws HSAdminException { return new CompoundProcessor( new ShellProcessor("ip addr add " + pac.getCurINetAddr().getInet4Addr() @@ -301,7 +302,7 @@ public class PacProcessorFactory implements EntityProcessorFactory { ); } - private Processor createIfDown(final Pac pac) throws ProcessorException { + private Processor createIfDown(final Pac pac) throws HSAdminException { return new CompoundProcessor( new ShellProcessor("ip addr del " + pac.getCurINetAddr().getInet4Addr() diff --git a/hsarback/src/de/hsadmin/mods/qstat/QTaskModuleImpl.java b/hsarback/src/de/hsadmin/mods/qstat/QTaskModuleImpl.java index 1fe6756..706758d 100644 --- a/hsarback/src/de/hsadmin/mods/qstat/QTaskModuleImpl.java +++ b/hsarback/src/de/hsadmin/mods/qstat/QTaskModuleImpl.java @@ -4,7 +4,7 @@ import java.util.List; import de.hsadmin.core.model.AbstractEntity; import de.hsadmin.core.model.AbstractModuleImpl; -import de.hsadmin.core.model.HSAdminException; +import de.hsadmin.core.util.HSAdminException; public class QTaskModuleImpl extends AbstractModuleImpl { diff --git a/hsarback/src/de/hsadmin/mods/user/UnixUserModuleImpl.java b/hsarback/src/de/hsadmin/mods/user/UnixUserModuleImpl.java index 5ef663f..fa1e64a 100644 --- a/hsarback/src/de/hsadmin/mods/user/UnixUserModuleImpl.java +++ b/hsarback/src/de/hsadmin/mods/user/UnixUserModuleImpl.java @@ -9,8 +9,8 @@ import javax.persistence.Query; import de.hsadmin.core.model.AbstractEntity; import de.hsadmin.core.model.AbstractModuleImpl; import de.hsadmin.core.model.AuthorisationException; -import de.hsadmin.core.model.HSAdminException; import de.hsadmin.core.model.Transaction; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.hostsharing.BasePacType; import de.hsadmin.hostsharing.MultiOption; import de.hsadmin.mods.pac.Pac; diff --git a/hsarback/src/de/hsadmin/pillar/JsonPillarServlet.java b/hsarback/src/de/hsadmin/pillar/JsonPillarServlet.java index dc0043d..5046545 100644 --- a/hsarback/src/de/hsadmin/pillar/JsonPillarServlet.java +++ b/hsarback/src/de/hsadmin/pillar/JsonPillarServlet.java @@ -17,7 +17,7 @@ import javax.servlet.http.HttpServletResponse; import org.apache.commons.httpclient.HttpStatus; import de.hsadmin.core.model.Transaction; -import de.hsadmin.core.qserv.ProcessorException; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.core.util.IPv6Trick; import de.hsadmin.mods.dom.Domain; import de.hsadmin.mods.pac.Hive; @@ -61,7 +61,7 @@ public class JsonPillarServlet extends HttpServlet { writer.println(" , \"hiveipv4\": \"" + hive.getInetAddr().getInet4Addr() + "\""); try { writer.println(" , \"hiveipv6\": \"" + hive.getInetAddr().getInet6Addr() + "\""); - } catch (ProcessorException e) { + } catch (HSAdminException e) { // dont care } final long currentTimeSeconds = System.currentTimeMillis() / 1000L; @@ -86,7 +86,7 @@ public class JsonPillarServlet extends HttpServlet { writer.println(" , \"ipv4\": \"" + curINetAddr.getInet4Addr() + "\""); try { writer.println(" , \"ipv6\": \"" + curINetAddr.getInet6Addr() + "\""); - } catch (ProcessorException e) { + } catch (HSAdminException e) { // dont care } final PacComponent pacQuota = pac.getPacComponent("QUOTA"); diff --git a/hsarback/src/de/hsadmin/remote/AbstractRemote.java b/hsarback/src/de/hsadmin/remote/AbstractRemote.java index 5548459..1f95e67 100644 --- a/hsarback/src/de/hsadmin/remote/AbstractRemote.java +++ b/hsarback/src/de/hsadmin/remote/AbstractRemote.java @@ -12,9 +12,9 @@ import de.hsadmin.core.model.AbstractEntity; import de.hsadmin.core.model.AuthenticationException; import de.hsadmin.core.model.AuthorisationException; import de.hsadmin.core.model.GenericModuleImpl; -import de.hsadmin.core.model.HSAdminException; import de.hsadmin.core.model.ModuleInterface; import de.hsadmin.core.model.Transaction; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.mods.user.UnixUser; public abstract class AbstractRemote implements IRemote { diff --git a/hsarback/src/de/hsadmin/remote/GenericAbstractRemote.java b/hsarback/src/de/hsadmin/remote/GenericAbstractRemote.java index e503528..7dbaef8 100644 --- a/hsarback/src/de/hsadmin/remote/GenericAbstractRemote.java +++ b/hsarback/src/de/hsadmin/remote/GenericAbstractRemote.java @@ -7,11 +7,11 @@ import java.util.regex.Pattern; import de.hsadmin.core.model.AbstractEntity; import de.hsadmin.core.model.AnnFieldIO; -import de.hsadmin.core.model.HSAdminException; import de.hsadmin.core.model.ReadWriteAccess; +import de.hsadmin.core.model.ReflectionUtil; import de.hsadmin.core.model.TechnicalException; import de.hsadmin.core.model.Transaction; -import de.hsadmin.core.util.ReflectionUtil; +import de.hsadmin.core.util.HSAdminException; public abstract class GenericAbstractRemote extends AbstractRemote { diff --git a/hsarback/src/de/hsadmin/remote/IRemote.java b/hsarback/src/de/hsadmin/remote/IRemote.java index 48cc2ac..c1632ec 100644 --- a/hsarback/src/de/hsadmin/remote/IRemote.java +++ b/hsarback/src/de/hsadmin/remote/IRemote.java @@ -3,7 +3,7 @@ package de.hsadmin.remote; import java.util.List; import java.util.Map; -import de.hsadmin.core.model.HSAdminException; +import de.hsadmin.core.util.HSAdminException; public interface IRemote { diff --git a/hsarback/src/de/hsadmin/remote/ModulePropertiesRemote.java b/hsarback/src/de/hsadmin/remote/ModulePropertiesRemote.java index 3e9a66f..9527613 100644 --- a/hsarback/src/de/hsadmin/remote/ModulePropertiesRemote.java +++ b/hsarback/src/de/hsadmin/remote/ModulePropertiesRemote.java @@ -12,11 +12,11 @@ import de.hsadmin.core.model.AbstractEntity; import de.hsadmin.core.model.AnnFieldIO; import de.hsadmin.core.model.AuthenticationException; import de.hsadmin.core.model.DefaultSelectableValues; -import de.hsadmin.core.model.HSAdminException; import de.hsadmin.core.model.KindOfSelectableValue; import de.hsadmin.core.model.ReadWriteAccess; import de.hsadmin.core.model.SelectableValue; import de.hsadmin.core.model.Transaction; +import de.hsadmin.core.util.HSAdminException; public class ModulePropertiesRemote implements IRemote { diff --git a/hsarback/src/de/hsadmin/remote/PacRemote.java b/hsarback/src/de/hsadmin/remote/PacRemote.java index ff1daac..8aacf39 100644 --- a/hsarback/src/de/hsadmin/remote/PacRemote.java +++ b/hsarback/src/de/hsadmin/remote/PacRemote.java @@ -6,8 +6,8 @@ import java.util.Map; import java.util.Set; import de.hsadmin.core.model.AbstractEntity; -import de.hsadmin.core.model.HSAdminException; import de.hsadmin.core.model.Transaction; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.core.util.TextUtil; import de.hsadmin.mods.cust.Customer; import de.hsadmin.mods.pac.BasePac; diff --git a/hsarback/src/de/hsadmin/remote/PropertyRemote.java b/hsarback/src/de/hsadmin/remote/PropertyRemote.java index e72ad86..aead0f0 100644 --- a/hsarback/src/de/hsadmin/remote/PropertyRemote.java +++ b/hsarback/src/de/hsadmin/remote/PropertyRemote.java @@ -11,9 +11,9 @@ import java.util.Properties; import de.hsadmin.core.model.AbstractEntity; import de.hsadmin.core.model.AnnFieldIO; import de.hsadmin.core.model.AuthenticationException; -import de.hsadmin.core.model.HSAdminException; import de.hsadmin.core.model.ReadWriteAccess; import de.hsadmin.core.model.Transaction; +import de.hsadmin.core.util.HSAdminException; public class PropertyRemote implements IRemote { diff --git a/hsarback/src/de/hsadmin/remote/RoleRemote.java b/hsarback/src/de/hsadmin/remote/RoleRemote.java index a9d724f..41349d4 100644 --- a/hsarback/src/de/hsadmin/remote/RoleRemote.java +++ b/hsarback/src/de/hsadmin/remote/RoleRemote.java @@ -8,9 +8,9 @@ import java.util.Map; import de.hsadmin.core.model.AbstractEntity; import de.hsadmin.core.model.AuthenticationException; import de.hsadmin.core.model.GenericModuleImpl; -import de.hsadmin.core.model.HSAdminException; import de.hsadmin.core.model.Transaction; import de.hsadmin.core.util.Config; +import de.hsadmin.core.util.HSAdminException; import de.hsadmin.mods.dom.Domain; import de.hsadmin.mods.pac.Pac;