HSAdmin Backend Domains, E-Mail, Datenbanken
Purodha
2013-04-02 cb4741b9f762e98cba41d9b2435d192e07a321df
Merge branch 'master' of ssh://hsh04-source@hsh04.hostsharing.net/home/doms/source.hostsharing.net/source/hsadmin.git
1 files deleted
13 files modified
401 ■■■■■ changed files
hsarback/src/de/hsadmin/core/qserv/CompoundProcessor.java 12 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/qserv/CopyFileProcessor.java 7 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/qserv/CreateFileProcessor.java 7 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/qserv/JDBCProcessor.java 28 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/qserv/Processor.java 12 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/qserv/QueueServer.java 73 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/qserv/ShellProcessor.java 25 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/qserv/VelocityProcessor.java 49 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/qserv/WaitingTasksProcessor.java 10 ●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/db/JDBCProcessor.java 89 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/db/MySqlDatabaseProcessorFactory.java 69 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/db/MySqlUserProcessorFactory.java 8 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/db/PgSqlDatabaseProcessorFactory.java 5 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/mods/db/PgSqlUserProcessorFactory.java 7 ●●●●● patch | view | raw | blame | history
hsarback/src/de/hsadmin/core/qserv/CompoundProcessor.java
@@ -5,7 +5,7 @@
public class CompoundProcessor extends AbstractProcessor {
    private static final long serialVersionUID = 5718623579674305929L;
    private static final long serialVersionUID = 1L;
    private List<Processor> aProcessors;
@@ -26,5 +26,15 @@
    public void appendProcessor(Processor aProcessor) {
        aProcessors.add(aProcessor);
    }
    @Override
    public String logInfo() {
        StringBuffer log = new StringBuffer();
        for (Processor aProcessor : aProcessors) {
            log.append(aProcessor.logInfo());
            log.append("\n\n");
        }
        return log.toString();
    }
    
}
hsarback/src/de/hsadmin/core/qserv/CopyFileProcessor.java
@@ -2,7 +2,7 @@
public class CopyFileProcessor extends AbstractProcessor {
    private static final long serialVersionUID = 1741419610410712714L;
    private static final long serialVersionUID = 1L;
    
    private Processor internal;
    
@@ -19,4 +19,9 @@
        return internal.process();
    }
    @Override
    public String logInfo() {
        return internal.logInfo();
    }
}
hsarback/src/de/hsadmin/core/qserv/CreateFileProcessor.java
@@ -7,7 +7,7 @@
public class CreateFileProcessor extends AbstractProcessor {
    private static final long serialVersionUID = -2947609532975712444L;
    private static final long serialVersionUID = 1L;
    private Processor compoundProcessor;
    
@@ -35,4 +35,9 @@
        return compoundProcessor.process();
    }
    @Override
    public String logInfo() {
        return compoundProcessor.logInfo();
    }
}
hsarback/src/de/hsadmin/core/qserv/JDBCProcessor.java
@@ -13,19 +13,21 @@
public class JDBCProcessor extends AbstractProcessor {
    
    private static final long serialVersionUID = 7702753017749022325L;
    private static final long serialVersionUID = 1L;
    private String driver;
    private String url;
    private String user;
    private String password;
    private List<String> sql;
    private String errorMsg;
    public JDBCProcessor(String driver, String url, String user, String password) {
        this.driver = driver;
        this.url = url;
        this.user = user;
        this.password = password;
        this.errorMsg = "";
    }
    public JDBCProcessor(String driver, String url) {
@@ -70,11 +72,12 @@
            return s.executeBatch();
        } catch (SQLException aSqlExc) {
            Exception exc = aSqlExc.getNextException();
            if (exc == null)
            if (exc == null) {
                exc = aSqlExc;
            System.out.println("ERR: " + exc.getMessage());
            throw new ProcessorException(aSqlExc.getMessage() + ", reason: "
                    + exc.getMessage());
            }
            errorMsg = exc.getMessage();
            System.out.println("ERR: " + errorMsg);
            throw new ProcessorException(aSqlExc.getMessage() + ", reason: " + errorMsg);
        } catch (Exception aExc) {
            throw new ProcessorException(aExc.getMessage());
        } finally {
@@ -86,4 +89,19 @@
            }
        }
    }
    @Override
    public String logInfo() {
        StringBuffer log = new StringBuffer("JDBCProcessor\n");
        log.append(url);
        log.append("\n");
        for (String s : sql) {
            log.append(s);
            log.append("\n");
        }
        log.append("Error: ");
        log.append(errorMsg);
        log.append("\n");
        return log.toString();
    }
}
hsarback/src/de/hsadmin/core/qserv/Processor.java
@@ -17,6 +17,18 @@
     */
    public abstract Object process() throws ProcessorException;
    
    /**
     * Execute some code after successful execution on sending master.
     * @param transaction
     * @param task
     * @throws ProcessorException
     */
    public abstract void finalize(Transaction transaction, QueueTask task) throws ProcessorException;
    
    /**
     * Construct an email body to send to hostmasters on error.
     * @return
     */
    public abstract String logInfo();
}
hsarback/src/de/hsadmin/core/qserv/QueueServer.java
@@ -24,12 +24,10 @@
import javax.naming.Context;
import javax.naming.InitialContext;
public class QueueServer extends QueueCommons implements
        MessageListener, ExceptionListener {
public class QueueServer extends QueueCommons implements MessageListener, ExceptionListener {
    
    private static final String VERSION_NO = "1.0";
    private static final String VERSION_NO = "1.1";
    
    private int nMessagesProcessed = 0;
    private QueueConnection conn;
    private QueueSession queueSession;
    private String jmsStatusQueue;
@@ -38,14 +36,16 @@
    private String jmsSystemQueue;
    private String jmsFactory;
    private String serviceEMail;
    /** Runs the QueueServer, using the arguments as ConnectionFactory 
     *  and Topic names. 
     */
    public static void main(String[] args) throws Exception {
        File propFile = new File(System.getProperty("user.dir"),
                "conf/qserv.properties");
        if (args.length == 1)
        File propFile = new File(System.getProperty("user.dir"), "conf/qserv.properties");
        if (args.length == 1) {
            propFile = new File(args[0]);
        }
        else if (args.length != 0) {
            throw new Exception(
                    "Wrong number of arguments.\n"
@@ -78,17 +78,13 @@
        qServ.setJmsStatusQueue(props.getProperty("hsadmin.jms.status-queue"));
        qServ.setJmsUserName(props.getProperty("hsadmin.jms.username"));
        qServ.setJmsPassWord(props.getProperty("hsadmin.jms.password"));
        qServ.setServiceEMail(props.getProperty("hsadmin.email.service"));
        System.out.println("==================================================");
        System.out.println("hsadmin-qserv " + VERSION_NO +
                " started using:");
        System.out.println("queue server: "
                + props.getProperty("hsadmin.jms.factory"));
        System.out.println("system queue: "
                + props.getProperty("hsadmin.jms.system-queue"));
        System.out.println("status queue: "
                + props.getProperty("hsadmin.jms.status-queue"));
        System.out.println("queue user:   "
                + props.getProperty("hsadmin.jms.username"));
        System.out.println("hsadmin-qserv " + VERSION_NO + " started using:");
        System.out.println("queue server: " + props.getProperty("hsadmin.jms.factory"));
        System.out.println("system queue: " + props.getProperty("hsadmin.jms.system-queue"));
        System.out.println("status queue: " + props.getProperty("hsadmin.jms.status-queue"));
        System.out.println("queue user:   " + props.getProperty("hsadmin.jms.username"));
        System.out.println("==================================================");
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
@@ -101,6 +97,14 @@
        }
        while (true) {
            Thread.sleep(10000);
        }
    }
    private void setServiceEMail(String property) {
        if (property == null) {
            serviceEMail = "peter@ostwall195.de";
        } else {
            serviceEMail = property;
        }
    }
@@ -124,32 +128,31 @@
        }
    }
    // / Is called when a message arrives; processes Processor within message.
    public synchronized void onMessage(Message jmsMessage) {
        // TODO logging
        System.out.println("\nonMessage(" + jmsMessage);
        QueueTask task = null;
        try {
            // expect ObjectMessage
            ObjectMessage jmsObjectMessage = (ObjectMessage) jmsMessage;
            // get QueueTask
            task = (QueueTask) jmsObjectMessage.getObject();
            // TODO: logging
            Processor processor = task.getProcessor();
            System.out.println("processing (" + task.getTitle() + " | started("
                    + task.getStarted() + ") |" + task.getDetails() + "|"
                    + task.getProcessor() + ")");
            System.out.println("with " + task.getProcessor());
            // execute processor within the message
            task.getProcessor().process();
            System.out.println("done");
                    + processor + ")");
            System.out.println("with " + processor);
            try {
                processor.process();
                System.out.println("done");
            } catch (ProcessorException e) {
                logException(e);
                task.setException(e);
                SmtpHelper.send("queueserv@hostsharing.net", serviceEMail, jmsSystemQueue, processor.logInfo());
            }
        } catch (Throwable throwable) {
            logException(throwable);
            task.setException(throwable);
        } finally {
            sendStatus(task);
            setNMessagesProcessed(getNMessagesProcessed() + 1);
            notifyAll();
        }
    }
@@ -189,7 +192,6 @@
        }
    }
    // / send the status information back to the hsadmin server
    protected void sendStatus(QueueTask queueMessage) {
        MessageProducer producer = null;
        Session statusSession = null;
@@ -199,8 +201,7 @@
            Context ctx = new InitialContext();
            System.out.println("Created InitialContext");
            ConnectionFactory connectionFactory = (ConnectionFactory) ctx.lookup(jmsFactory);
            System.out.println("connectionFactory= "
                    + connectionFactory.toString());
            System.out.println("connectionFactory= " + connectionFactory.toString());
            Destination queue = (Destination) ctx.lookup(jmsStatusQueue);
            statusConnection = connectionFactory.createConnection(jmsUserName, jmsPassWord);
            statusSession = statusConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
@@ -219,14 +220,6 @@
            try { statusConnection.close(); } catch (Exception exc) { }
        }
    
    }
    public void setNMessagesProcessed(int nMessagesProcessed) {
        this.nMessagesProcessed = nMessagesProcessed;
    }
    public int getNMessagesProcessed() {
        return nMessagesProcessed;
    }
    public void setJmsStatusQueue(String property) {
hsarback/src/de/hsadmin/core/qserv/ShellProcessor.java
@@ -3,14 +3,12 @@
/**
 * A ShellProcessor encapsulates a shell command as a Processor.
 *
 * As such, a client can prepare shell commands to be processed on a server.
 *
 * @author mi
 */
public class ShellProcessor extends AbstractProcessor {
    private static final long serialVersionUID = -649045174380048818L;
    private static final long serialVersionUID = 1L;
    private String aSystemCall;
    private String aInput;
@@ -27,6 +25,7 @@
        this.aInput = null;
    }
    @Override
    public Object process() throws ProcessorException {
        try {
            aOutput = CommandShell.execute(aSystemCall, aInput);
@@ -38,18 +37,14 @@
        }
    }
    /**
     * @return Returns stderr as a String.
     */
    public String getErrors() {
        return aErrors;
    }
    /**
     * @return Returns stdout as a String.
     */
    public String getOutput() {
        return aOutput;
    @Override
    public String logInfo() {
        StringBuffer log = new StringBuffer("ShellProcessor\n");
        log.append(aSystemCall);
        log.append("\nError: ");
        log.append(aErrors);
        log.append("\n");
        return log.toString();
    }
}
hsarback/src/de/hsadmin/core/qserv/VelocityProcessor.java
@@ -6,7 +6,6 @@
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Properties;
@@ -15,14 +14,12 @@
import org.apache.velocity.app.Velocity;
import de.hsadmin.mods.dom.Domain;
import de.hsadmin.mods.pac.BasePac;
import de.hsadmin.mods.pac.Hive;
import de.hsadmin.mods.pac.INetAddress;
import de.hsadmin.mods.pac.Pac;
public class VelocityProcessor extends AbstractProcessor {
    private static final long serialVersionUID = 1L;
    private static final long serialVersionUID = 2L;
    
    static {
        Properties props = new Properties();
@@ -34,8 +31,10 @@
    private String content;
    private String targetPath;
    private boolean overwriteTarget;
    private String errorMessage;
    public VelocityProcessor(String templateName, Hive hive, String targetPath, boolean overwriteTarget) {
        errorMessage = "";
        this.targetPath = targetPath;
        this.overwriteTarget = overwriteTarget;
        VelocityContext context = new VelocityContext();
@@ -99,46 +98,34 @@
        try {
            File file = new File(targetPath);
            if (file.exists() && !overwriteTarget) {
                return "did not overwrite existing file " + targetPath;
                errorMessage = "did not overwrite existing file " + targetPath;
                return errorMessage;
            }
            if (!file.exists() || file.canWrite()) {
                BufferedWriter writer = new BufferedWriter(new FileWriter(file));
                writer.append(content);
                writer.close();
            } else {
                throw new ProcessorException("could not write file " + targetPath);
                errorMessage = "could not write file " + targetPath;
                throw new ProcessorException(errorMessage);
            }
            return "wrote file " + targetPath;
        } catch (IOException e) {
            errorMessage = e.getMessage();
            throw new ProcessorException(e);
        }
    }
    public static void main(String[] args) {
        Hive h = new Hive("h01", new INetAddress("192.168.1.100"));
        HashSet<Pac> pacsSet = new HashSet<Pac>();
        h.setPacs(pacsSet);
        Pac p1 = new Pac("pac01", null, new BasePac(), h);
        pacsSet.add(p1);
        Pac p2 = new Pac("pac02", null, new BasePac(), h);
        pacsSet.add(p2);
        p1.setCurINetAddr(new INetAddress("192.168.2.11"));
        p2.setCurINetAddr(new INetAddress("192.168.2.12"));
        VelocityProcessor procHosts = new VelocityProcessor("/de/hsadmin/mods/pac/hosts.vm", h, "/tmp/etc-hosts", true);
        VelocityProcessor procVirtual = new VelocityProcessor("/de/hsadmin/mods/pac/httpd-virtual.vm", h, "/tmp/httpd-virtual.conf", true);
        VelocityProcessor procInterfaces = new VelocityProcessor("/de/hsadmin/mods/pac/interfaces.vm", h, "/tmp/net-interfaces", true);
        VelocityProcessor procProFtpd = new VelocityProcessor("/de/hsadmin/mods/pac/proftpd-conf.vm", h, "/tmp/proftpd.conf", true);
        VelocityProcessor procSudoers = new VelocityProcessor("/de/hsadmin/mods/pac/sudoers.vm", h, "/tmp/sudoers", true);
        try {
            System.out.println(procHosts.process());
            System.out.println(procVirtual.process());
            System.out.println(procInterfaces.process());
            System.out.println(procProFtpd.process());
            System.out.println(procSudoers.process());
        } catch (ProcessorException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    @Override
    public String logInfo() {
        StringBuffer log = new StringBuffer("VelocityProcessor\n");
        log.append("Target: ");
        log.append(targetPath);
        log.append("\n");
        log.append("Error: ");
        log.append(errorMessage);
        log.append("\n");
        return log.toString();
    }
}
hsarback/src/de/hsadmin/core/qserv/WaitingTasksProcessor.java
@@ -8,7 +8,7 @@
public class WaitingTasksProcessor extends AbstractProcessor {
    private static final long serialVersionUID = 1198528557513957546L;
    private static final long serialVersionUID = 1L;
    
    private Processor main;
    private List<WaitingProcessor> waitingTasks;
@@ -24,8 +24,7 @@
    }
    
    @Override
    public void finalize(Transaction transaction, QueueTask task)
            throws ProcessorException {
    public void finalize(Transaction transaction, QueueTask task) throws ProcessorException {
        if (task.getException() == null) {
            for (WaitingProcessor p : waitingTasks) {
                QueueTask wTask = 
@@ -61,4 +60,9 @@
            return title;
        }
    }
    @Override
    public String logInfo() {
        return main.logInfo();
    }
}
hsarback/src/de/hsadmin/mods/db/JDBCProcessor.java
File was deleted
hsarback/src/de/hsadmin/mods/db/MySqlDatabaseProcessorFactory.java
@@ -4,72 +4,59 @@
import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.core.qserv.EntityProcessorFactory;
import de.hsadmin.core.qserv.JDBCProcessor;
import de.hsadmin.core.qserv.Processor;
/** Factory class which creates Processor instances for dealing with UNIX user accounts.
/**
 * Factory class which creates Processor instances for dealing with UNIX user
 * accounts.
 * 
 * @author mi
 */
 */
public class MySqlDatabaseProcessorFactory implements EntityProcessorFactory {
    /// creates a JDBCProcessor for MySQL and the given user
    public static JDBCProcessor createMySqlProcessor( String database, String user, String password )
    {
        return new JDBCProcessor( "com.mysql.jdbc.Driver",
                "jdbc:mysql://localhost/" + database,
                user, password );
    public static JDBCProcessor createMySqlProcessor(String database,
            String user, String password) {
        return new JDBCProcessor("com.mysql.jdbc.Driver",
                "jdbc:mysql://localhost/" + database, user, password);
    }
    /// creates a JDBCProcessor for the MySQL admin user
    public static JDBCProcessor createMySqlAdminProcessor()
    {
        return new JDBCProcessor( "com.mysql.jdbc.Driver", "jdbc:mysql://localhost/" );
    public static JDBCProcessor createMySqlAdminProcessor() {
        return new JDBCProcessor("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/");
    }
    /// @return a Processor which creates a new database
    public <T extends AbstractEntity> Processor createCreateProcessor(EntityManager em, T entity)
    {
    public <T extends AbstractEntity> Processor createCreateProcessor(
            EntityManager em, T entity) {
        Database db = (Database) entity;
        assert db.getInstance().equals("mysql");
        JDBCProcessor aJDBCP = null;
        String aName = AbstractEntity.escapeString( db.getName() );
        String aOwner = AbstractEntity.escapeString( db.getOwner() );
        String aEncoding = AbstractEntity.escapeString( db.getSystemEncoding() );
        String aName = AbstractEntity.escapeString(db.getName());
        String aOwner = AbstractEntity.escapeString(db.getOwner());
        String aEncoding = AbstractEntity.escapeString(db.getSystemEncoding());
        aJDBCP = createMySqlAdminProcessor();
        aJDBCP.addSQL( "CREATE DATABASE " + aName + " " +
                "DEFAULT CHARACTER SET '" + aEncoding + "'");
        aJDBCP.addSQL( "GRANT ALL ON " + aName + ".* TO '" + aOwner + "'@'%' WITH GRANT OPTION" );
        aJDBCP.addSQL("CREATE DATABASE " + aName + " DEFAULT CHARACTER SET '" + aEncoding + "'");
        aJDBCP.addSQL("GRANT ALL ON " + aName + ".* TO '" + aOwner + "'@'%' WITH GRANT OPTION");
        return aJDBCP;
    }
    /// @return a Processor which updates a preexisting database
    public <T extends AbstractEntity> Processor createUpdateProcessor(EntityManager em, T entity)
    {
    public <T extends AbstractEntity> Processor createUpdateProcessor(EntityManager em, T entity) {
        Database db = (Database) entity;
        assert db.getInstance().equals("mysql");
        String aName = AbstractEntity.escapeString( db.getName() );
        String aOwner = AbstractEntity.escapeString( db.getOwner() );
//        String aEncoding = AbstractEntity.escapeString( db.getSystemEncoding() );
        String aName = AbstractEntity.escapeString(db.getName());
        String aOwner = AbstractEntity.escapeString(db.getOwner());
        JDBCProcessor aJDBCP = null;
        aJDBCP = createMySqlAdminProcessor();
//        aJDBCP.addSQL( "ALTER DATABASE " + aName + " DEFAULT CHARACTER SET '" + aEncoding + "'" );
        aJDBCP.addSQL( "GRANT ALL ON " + aName + ".* TO '" + aOwner + "'@'%'" );
        // TODO: alte Admin-Rechte entziehen
        aJDBCP.addSQL("GRANT ALL ON " + aName + ".* TO '" + aOwner + "'@'%'");
        return aJDBCP;
    }
    /// @return a Processor which deletes an existing database
    public <T extends AbstractEntity> Processor createDeleteProcessor(EntityManager em, T entity)
    {
    public <T extends AbstractEntity> Processor createDeleteProcessor(EntityManager em, T entity) {
        Database db = (Database) entity;
        assert db.getInstance().equals("mysql");
        JDBCProcessor aJDBCP = createMySqlAdminProcessor();
        String aName = AbstractEntity.escapeString( db.getName() );
        String aOwner = AbstractEntity.escapeString( db.getOwner() );
        aJDBCP.addSQL( "REVOKE ALL ON " + aName + ".* FROM '" + aOwner + "'@'%'" );
        aJDBCP.addSQL( "DROP DATABASE " + aName );
        String aName = AbstractEntity.escapeString(db.getName());
        String aOwner = AbstractEntity.escapeString(db.getOwner());
        aJDBCP.addSQL("REVOKE ALL ON " + aName + ".* FROM '" + aOwner + "'@'%'");
        aJDBCP.addSQL("DROP DATABASE " + aName);
        return aJDBCP;
    }
}
hsarback/src/de/hsadmin/mods/db/MySqlUserProcessorFactory.java
@@ -4,6 +4,7 @@
import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.core.qserv.EntityProcessorFactory;
import de.hsadmin.core.qserv.JDBCProcessor;
import de.hsadmin.core.qserv.Processor;
/**
@@ -24,8 +25,7 @@
        return aJDBCP;
    }
    public <T extends AbstractEntity> Processor createUpdateProcessor(
            EntityManager em, T entity) {
    public <T extends AbstractEntity> Processor createUpdateProcessor(EntityManager em, T entity) {
        DatabaseUser dbu = (DatabaseUser) entity;
        assert dbu.getInstance().equals("mysql");
        JDBCProcessor aJDBCP = MySqlDatabaseProcessorFactory.createMySqlAdminProcessor();
@@ -35,11 +35,9 @@
        return aJDBCP;
    }
    public <T extends AbstractEntity> Processor createDeleteProcessor(
            EntityManager em, T entity) {
    public <T extends AbstractEntity> Processor createDeleteProcessor(EntityManager em, T entity) {
        DatabaseUser dbu = (DatabaseUser) entity;
        assert dbu.getInstance().equals("mysql");
        JDBCProcessor aJDBCP = MySqlDatabaseProcessorFactory.createMySqlAdminProcessor();
        String aName = AbstractEntity.escapeString(dbu.getName());
        aJDBCP.addSQL("REVOKE ALL PRIVILEGES, GRANT OPTION FROM '" + aName + "'@'%'");
hsarback/src/de/hsadmin/mods/db/PgSqlDatabaseProcessorFactory.java
@@ -4,6 +4,7 @@
import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.core.qserv.EntityProcessorFactory;
import de.hsadmin.core.qserv.JDBCProcessor;
import de.hsadmin.core.qserv.Processor;
/**
@@ -13,6 +14,7 @@
 * @author mi
 */
public class PgSqlDatabaseProcessorFactory implements EntityProcessorFactory {
    /**
     * creates a JDBCProcessor for PostgreSQL and the given user
     * 
@@ -21,8 +23,7 @@
     * @return
     */
    public static JDBCProcessor createPostgreSqlProcessor(String user, String password) {
        return new JDBCProcessor("org.postgresql.Driver",
                "jdbc:postgresql://localhost/template1", user, password);
        return new JDBCProcessor("org.postgresql.Driver", "jdbc:postgresql://localhost/template1", user, password);
    }
    /**
hsarback/src/de/hsadmin/mods/db/PgSqlUserProcessorFactory.java
@@ -4,6 +4,7 @@
import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.core.qserv.EntityProcessorFactory;
import de.hsadmin.core.qserv.JDBCProcessor;
import de.hsadmin.core.qserv.Processor;
/**
@@ -24,8 +25,7 @@
        return aJDBCP;
    }
    public <T extends AbstractEntity> Processor createUpdateProcessor(
            EntityManager em, T entity) {
    public <T extends AbstractEntity> Processor createUpdateProcessor(EntityManager em, T entity) {
        DatabaseUser dbu = (DatabaseUser) entity;
        assert dbu.getInstance().equals("pgsql");
        JDBCProcessor aJDBCP = PgSqlDatabaseProcessorFactory.createPostgreSqlAdminProcessor();
@@ -35,8 +35,7 @@
        return aJDBCP;
    }
    public <T extends AbstractEntity> Processor createDeleteProcessor(
            EntityManager em, T entity) {
    public <T extends AbstractEntity> Processor createDeleteProcessor(EntityManager em, T entity) {
        DatabaseUser dbu = (DatabaseUser) entity;
        assert dbu.getInstance().equals("pgsql");
        JDBCProcessor aJDBCP = PgSqlDatabaseProcessorFactory.createPostgreSqlAdminProcessor();