/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package Sirius.server.middleware.impls.domainserver; import Sirius.server.Server; import Sirius.server.ServerExit; import Sirius.server.ServerExitError; import Sirius.server.ServerType; import Sirius.server.Shutdown; import Sirius.server.localserver.DBServer; import Sirius.server.localserver.history.HistoryException; import Sirius.server.localserver.history.HistoryServer; import Sirius.server.localserver.method.MethodMap; import Sirius.server.localserver.query.QueryCache; import Sirius.server.localserver.query.querystore.Store; import Sirius.server.localserver.tree.NodeReferenceList; import Sirius.server.localserver.user.UserStore; import Sirius.server.middleware.impls.proxy.StartProxy; import Sirius.server.middleware.interfaces.domainserver.CatalogueService; import Sirius.server.middleware.interfaces.domainserver.MetaService; import Sirius.server.middleware.interfaces.domainserver.QueryStore; import Sirius.server.middleware.interfaces.domainserver.SearchService; import Sirius.server.middleware.interfaces.domainserver.SystemService; import Sirius.server.middleware.interfaces.domainserver.UserService; import Sirius.server.middleware.types.DefaultMetaObject; import Sirius.server.middleware.types.HistoryObject; import Sirius.server.middleware.types.LightweightMetaObject; import Sirius.server.middleware.types.Link; import Sirius.server.middleware.types.MetaClass; import Sirius.server.middleware.types.MetaObject; import Sirius.server.middleware.types.Node; import Sirius.server.naming.NameServer; import Sirius.server.newuser.User; import Sirius.server.newuser.UserGroup; import Sirius.server.newuser.UserServer; import Sirius.server.property.ServerProperties; import Sirius.server.registry.Registry; import Sirius.server.search.Query; import Sirius.server.search.SearchResult; import Sirius.server.search.Seeker; import Sirius.server.search.store.Info; import Sirius.server.search.store.QueryData; import Sirius.server.sql.DBConnectionPool; import Sirius.server.sql.SystemStatement; import org.apache.log4j.PropertyConfigurator; import java.io.File; import java.net.InetAddress; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.server.UnicastRemoteObject; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.HashMap; import java.util.MissingResourceException; import de.cismet.cids.objectextension.ObjectExtensionFactory; import de.cismet.cids.server.DefaultServerExceptionHandler; import de.cismet.cids.server.ServerSecurityManager; import de.cismet.cids.server.ws.rest.RESTfulService; import de.cismet.cids.utils.ClassloadingHelper; /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ public class DomainServerImpl extends UnicastRemoteObject implements CatalogueService, MetaService, SystemService, UserService, QueryStore, SearchService { // ActionListener //~ Static fields/initializers --------------------------------------------- private static final String EXTENSION_FACTORY_PREFIX = "de.cismet.cids.custom.extensionfactories."; // NOI18N private static transient DomainServerImpl instance; //~ Instance fields -------------------------------------------------------- // dbaccess of the mis (catalogue, classes and objects protected DBServer dbServer; // userservice of a localserver protected UserStore userstore; // history server of a localserver protected HistoryServer historyServer; // executing the searchservice protected Seeker seeker; // this servers configuration protected ServerProperties properties; // for storing and loading prdefinded queries protected Store queryStore; protected QueryCache queryCache; // references to the Registry protected NameServer nameServer; protected UserServer userServer; // this severs info object protected Server serverInfo; private final transient org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(this.getClass()); //~ Constructors ----------------------------------------------------------- /** * protected ServerStatus status; * * @param properties DOCUMENT ME! * * @throws Throwable DOCUMENT ME! * @throws RemoteException DOCUMENT ME! */ public DomainServerImpl(final ServerProperties properties) throws Throwable { // export object super(properties.getServerPort()); try { this.properties = properties; final String fileName; if (((fileName = properties.getLog4jPropertyFile()) != null) && !fileName.equals("")) { // NOI18N PropertyConfigurator.configure(fileName); } serverInfo = new Server( ServerType.LOCALSERVER, properties.getServerName(), InetAddress.getLocalHost().getHostAddress(), properties.getRMIRegistryPort(), String.valueOf(properties.getServerPort())); dbServer = new DBServer(properties); userstore = dbServer.getUserStore(); seeker = new Seeker(dbServer); queryStore = new Store(dbServer.getActiveDBConnection().getConnection(), properties); // All executable queries queryCache = new QueryCache(dbServer.getActiveDBConnection(), properties.getServerName()); System.out.println("\n<LS> DBConnection: " + dbServer.getActiveDBConnection().getURL() + "\n"); // NOI18N System.out.println(serverInfo.getRMIAddress()); logger.info(serverInfo.getRMIAddress()); System.out.println("Info <LS> bind on RMIRegistry as: " + serverInfo.getBindString()); // NOI18N logger.info("Info <LS> bind on RMIRegistry as: " + serverInfo.getBindString()); // NOI18N Naming.bind(serverInfo.getBindString(), this); // status = new ServerStatus(); register(); if (logger.isDebugEnabled()) { logger.debug("Server Referenz " + this); // NOI18N } historyServer = dbServer.getHistoryServer(); // initFrame(); } catch (Throwable e) { logger.error(e, e); throw new RemoteException(e.getMessage(), e); } } //~ Methods ---------------------------------------------------------------- @Override public NodeReferenceList getChildren(final Node node, final User user) throws RemoteException { try { if (userstore.validateUser(user)) { return dbServer.getChildren(node, user.getUserGroup()); } return new NodeReferenceList(); // no permission } catch (Throwable e) { if (logger != null) { logger.error("Error in getChildren()", e); // NOI18N } throw new RemoteException(e.getMessage(), e); } } // --------------------------------------------------------------------------------------------------- @Override public NodeReferenceList getRoots(final User user) throws RemoteException { try { if (userstore.validateUser(user)) { return dbServer.getTops(user.getUserGroup()); } return new NodeReferenceList(); // no permission => empty list } catch (Throwable e) { if (logger != null) { logger.error(e, e); } return new NodeReferenceList(); // throw new RemoteException(e.getMessage(), e); } } @Override public Node addNode(final Node node, final Link parent, final User user) throws RemoteException { try { return dbServer.getTree().addNode(node, parent, user); } catch (Throwable e) { logger.error(e, e); throw new RemoteException(e.getMessage(), e); } } @Override public boolean deleteNode(final Node node, final User user) throws RemoteException { try { return dbServer.getTree().deleteNode(node, user); } catch (Throwable e) { if (logger != null) { logger.error(e, e); } throw new RemoteException(e.getMessage(), e); } } @Override public boolean addLink(final Node from, final Node to, final User user) throws RemoteException { try { return dbServer.getTree().addLink(from, to, user); } catch (Throwable e) { if (logger != null) { logger.error(e, e); } throw new RemoteException(e.getMessage(), e); } } @Override public boolean deleteLink(final Node from, final Node to, final User user) throws RemoteException { try { return dbServer.getTree().deleteLink(from, to, user); } catch (Throwable e) { if (logger != null) { logger.error(e, e); } throw new RemoteException(e.getMessage(), e); } } @Override public Node[] getNodes(final User user, final int[] ids) throws RemoteException { try { return dbServer.getNodes(ids, user.getUserGroup()); } catch (Throwable e) { if (logger != null) { logger.error(e, e); } throw new RemoteException(e.getMessage(), e); } } @Override public NodeReferenceList getClassTreeNodes(final User user) throws RemoteException { try { if (userstore.validateUser(user)) { return dbServer.getClassTreeNodes(user.getUserGroup()); } return new NodeReferenceList(); // no permission empty list } catch (Throwable e) { if (logger != null) { logger.error(e, e); } throw new RemoteException(e.getMessage(), e); } } @Override public MetaClass[] getClasses(final User user) throws RemoteException { try { // if(userstore.validateUser(user)) return dbServer.getClasses(user.getUserGroup()); // return new MetaClass[0]; } catch (Throwable e) { if (logger != null) { logger.error(e, e); } throw new RemoteException(e.getMessage(), e); } } @Override public MetaClass getClass(final User user, final int classID) throws RemoteException { try { // if(userstore.validateUser(user)) return dbServer.getClass(user.getUserGroup(), classID); // return null; } catch (Throwable e) { if (logger != null) { logger.error(e, e); } throw new RemoteException(e.getMessage(), e); } } @Override public MetaClass getClassByTableName(final User user, final String tableName) throws RemoteException { try { // if(userstore.validateUser(user)) return dbServer.getClassByTableName(user.getUserGroup(), tableName); // return null; } catch (Throwable e) { if (logger != null) { logger.error(e, e); } throw new RemoteException(e.getMessage(), e); } } /** * DOCUMENT ME! * * @param user DOCUMENT ME! * @param objectIDs DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ public MetaObject[] getObjects(final User user, final String[] objectIDs) throws RemoteException { try { return dbServer.getObjects(objectIDs, user.getUserGroup()); } catch (Throwable e) { if (logger != null) { logger.error(e, e); } throw new RemoteException(e.getMessage(), e); } } /** * DOCUMENT ME! * * @param user DOCUMENT ME! * @param objectID DOCUMENT ME! * * @return DOCUMENT ME! * * @throws RemoteException DOCUMENT ME! */ public MetaObject getObject(final User user, final String objectID) throws RemoteException { try { final MetaObject mo = dbServer.getObject(objectID, user.getUserGroup()); if (mo != null) { final MetaClass[] classes = dbServer.getClasses(user.getUserGroup()); mo.setAllClasses(getClassHashTable(classes, serverInfo.getName())); // Check if Object can be extended if (mo.getMetaClass().hasExtensionAttributes()) { // TODO:Check if there is a ExtensionFactory final Class<?> extensionFactoryClass = ClassloadingHelper.getDynamicClass(mo.getMetaClass(), ClassloadingHelper.CLASS_TYPE.EXTENSION_FACTORY); if (extensionFactoryClass != null) { final ObjectExtensionFactory ef = (ObjectExtensionFactory)extensionFactoryClass.newInstance(); ef.setDomainServer(this); ef.setUser(user); try { ef.extend(mo.getBean()); } catch (Exception e) { logger.error("Error during ObjectExtension", e); // NOI18N } } } } return mo; } catch (final Throwable e) { if (logger != null) { logger.error(e, e); } throw new RemoteException(e.getMessage(), e); } } /** * DOCUMENT ME! * * @param classes DOCUMENT ME! * @param serverName DOCUMENT ME! * * @return DOCUMENT ME! */ public static HashMap getClassHashTable(final MetaClass[] classes, final String serverName) { final HashMap classHash = new HashMap(); for (int i = 0; i < classes.length; i++) { final String key = serverName + classes[i].getID(); if (!classHash.containsKey(key)) { classHash.put(key, classes[i]); } } return classHash; } // retrieves a Meta data object( as Node) referenced by a symbolic pointer to the MIS @Override public Node getMetaObjectNode(final User usr, final int nodeID) throws RemoteException { final int[] tmp = { nodeID }; // single value directly referenced return getNodes(usr, tmp)[0]; } // retrieves a Meta data object referenced by a symbolic pointer to the MIS // MetaObject ersetzt DefaultObject @Override public MetaObject getMetaObject(final User usr, final int objectID, final int classID) throws RemoteException { return getObject(usr, objectID + "@" + classID); // NOI18N } // retrieves Meta data objects with meta data matching query (Search) @Override public MetaObject[] getMetaObject(final User usr, final Query query) throws RemoteException { try { // user spaeter erweitern return seeker.search(query, new int[0], usr.getUserGroup(), 0).getObjects(); } catch (Throwable e) { if (logger != null) { logger.error(e, e); } throw new RemoteException(e.getMessage(), e); } } // retrieves Meta data objects with meta data matching query (Search) @Override public MetaObject[] getMetaObject(final User usr, final String query) throws RemoteException { final MetaObject[] o = getMetaObject( usr, new Query(new SystemStatement(true, -1, "", false, SearchResult.OBJECT, query), usr.getDomain())); // NOI18N return o; } @Override public MetaObject insertMetaObject(final User user, final MetaObject metaObject) throws RemoteException { if (logger != null) { if (logger.isDebugEnabled()) { logger.debug( "<html>insert MetaObject for User :+:" + user + " MO " + metaObject.getDebugString() + "</html>"); } } try { final int key = dbServer.getObjectPersitenceManager().insertMetaObject(user, metaObject); return this.getMetaObject(user, key, metaObject.getClassID()); } catch (Throwable e) { if (logger != null) { logger.error(e.getMessage(), e); } throw new RemoteException(e.getMessage(), e); } } @Override public int insertMetaObject(final User user, final Query query) throws RemoteException { try { // pfusch ... final SearchResult searchResult = this.search(user, null, query); return Integer.valueOf(searchResult.getResult().toString()).intValue(); } catch (Throwable e) { if (logger != null) { logger.error(e, e); } throw new RemoteException(e.getMessage(), e); } } @Override public int updateMetaObject(final User user, final MetaObject metaObject) throws RemoteException { if (logger.isDebugEnabled()) { logger.debug("<html><body>update called for :+: <p>" + metaObject.getDebugString() + "</p></body></html>"); // NOI18N } try { dbServer.getObjectPersitenceManager().updateMetaObject(user, metaObject); return 1; } catch (Throwable e) { if (logger != null) { logger.error(e, e); } throw new RemoteException(e.getMessage(), e); } } // insertion, deletion or update of meta data according to the query returns how many object's are effected // XXX New Method XXX dummy @Override public int update(final User user, final String metaSQL) throws RemoteException { try { // return dbServer.getObjectPersitenceManager().update(user, metaSQL); logger.error("update with metaSql is no longer supported " + metaSQL + "leads to no result"); // NOI18N return -1; } catch (Throwable e) { if (logger != null) { logger.error(e, e); } throw new RemoteException(e.getMessage(), e); } } @Override public int deleteMetaObject(final User user, final MetaObject metaObject) throws RemoteException { if (logger.isDebugEnabled()) { logger.debug("delete called for" + metaObject); // NOI18N } try { return dbServer.getObjectPersitenceManager().deleteMetaObject(user, metaObject); } catch (Throwable e) { if (logger != null) { logger.error(e, e); } throw new RemoteException(e.getMessage(), e); } } // creates an Instance of a MetaObject with all attribute values set to default @Override public MetaObject getInstance(final User user, final MetaClass c) throws RemoteException { if (logger.isDebugEnabled()) { logger.debug("usergetInstance :: " + user + " class " + c); // NOI18N } try { final Sirius.server.localserver.object.Object o = dbServer.getObjectFactory().getInstance(c.getID()); if (o != null) { final MetaObject mo = new DefaultMetaObject(o, c.getDomain()); mo.setAllStatus(MetaObject.TEMPLATE); return mo; } else { return null; } } catch (Exception e) { if (logger != null) { logger.error(e, e); } throw new RemoteException("<LS> ", e); // NOI18N } } // retrieves Meta data objects with meta data matching query (Search) // Query not yet defined but will be MetaSQL @Override public Node[] getMetaObjectNode(final User usr, final String query) throws RemoteException { return getMetaObjectNode( usr, new Query(new SystemStatement(true, -1, "", false, SearchResult.NODE, query), usr.getDomain())); // NOI18N } // retrieves Meta data objects with meta data matching query (Search) @Override public Node[] getMetaObjectNode(final User usr, final Query query) throws RemoteException { try { // user sp\u00E4ter erweitern return seeker.search(query, new int[0], usr.getUserGroup(), 0).getNodes(); } catch (Throwable e) { if (logger != null) { logger.error(e, e); } throw new RemoteException(e.getMessage(), e); } } @Override public MethodMap getMethods(final User user) throws RemoteException { // if(userstore.validateUser(user)) return dbServer.getMethods(); // dbServer.getMethods(user.getuserGroup()); // instead // return new MethodMap(); } @Override public LightweightMetaObject[] getAllLightweightMetaObjectsForClass(final int classId, final User user, final String[] representationFields, final String representationPattern) throws RemoteException { try { return dbServer.getObjectFactory() .getAllLightweightMetaObjectsForClass( classId, user, representationFields, representationPattern); } catch (Throwable ex) { throw new RemoteException("Error on getAllLightweightMetaObjectsForClass(...)", ex); // NOI18N } } @Override public LightweightMetaObject[] getAllLightweightMetaObjectsForClass(final int classId, final User user, final String[] representationFields) throws RemoteException { try { return dbServer.getObjectFactory() .getAllLightweightMetaObjectsForClass( classId, user, representationFields); } catch (Throwable ex) { throw new RemoteException("Error on getAllLightweightMetaObjectsForClass(...)", ex); // NOI18N } } @Override public LightweightMetaObject[] getLightweightMetaObjectsByQuery(final int classId, final User user, final String query, final String[] representationFields, final String representationPattern) throws RemoteException { try { return dbServer.getObjectFactory() .getLightweightMetaObjectsByQuery( classId, user, query, representationFields, representationPattern); } catch (Throwable ex) { throw new RemoteException("Error on getLightweightMetaObjectsByQuery(...)", ex); // NOI18N } } @Override public LightweightMetaObject[] getLightweightMetaObjectsByQuery(final int classId, final User user, final String query, final String[] representationFields) throws RemoteException { try { return dbServer.getObjectFactory() .getLightweightMetaObjectsByQuery(classId, user, query, representationFields); } catch (Throwable ex) { throw new RemoteException("Error on getLightweightMetaObjectsByQuery(...)", ex); // NOI18N } } @Override public Sirius.util.image.Image[] getDefaultIcons() throws RemoteException { return properties.getDefaultIcons(); } @Override public boolean changePassword(final User user, final String oldPassword, final String newPassword) throws RemoteException { try { return userstore.changePassword(user, oldPassword, newPassword); } catch (Throwable e) { logger.error(e, e); throw new RemoteException("changePassword at remotedbserverimpl", e); // NOI18N } } @Override public boolean validateUser(final User user, final String password) throws RemoteException { try { return userstore.validateUserPassword(user, password); } catch (Throwable e) { logger.error(e, e); throw new RemoteException("Exception validateUser at remotedbserverimpl", e); // NOI18N } } @Override public boolean delete(final int id) throws RemoteException { return queryStore.delete(id); } @Override public QueryData getQuery(final int id) throws RemoteException { return queryStore.getQuery(id); } @Override public Info[] getQueryInfos(final UserGroup userGroup) throws RemoteException { return queryStore.getQueryInfos(userGroup); } @Override public Info[] getQueryInfos(final User user) throws RemoteException { return queryStore.getQueryInfos(user); } @Override public boolean storeQuery(final User user, final QueryData data) throws RemoteException { return queryStore.storeQuery(user, data); } // add single query root and leaf returns a query_id @Override public int addQuery(final String name, final String description, final String statement, final int resultType, final char isUpdate, final char isBatch, final char isRoot, final char isUnion) throws RemoteException { try { return queryCache.addQuery(name, description, statement, resultType, isUpdate, isBatch, isRoot, isUnion); } catch (Throwable e) { logger.error(e, e); throw new RemoteException("addQuery error", e); // NOI18N } } @Override public int addQuery(final String name, final String description, final String statement) throws RemoteException { try { return queryCache.addQuery(name, description, statement); } catch (Throwable e) { logger.error(e, e); throw new RemoteException("addQuery error", e); // NOI18N } } @Override public boolean addQueryParameter(final int queryId, final int typeId, final String paramkey, final String description, final char isQueryResult, final int queryPosition) throws RemoteException { try { return queryCache.addQueryParameter(queryId, typeId, paramkey, description, isQueryResult, queryPosition); } catch (Throwable e) { logger.error(e, e); throw new RemoteException("addQuery error", e); // NOI18N } } // position set in order of the addition @Override public boolean addQueryParameter(final int queryId, final String paramkey, final String description) throws RemoteException { try { return queryCache.addQueryParameter(queryId, paramkey, description); } catch (Throwable e) { logger.error(e, e); throw new RemoteException("addQuery error", e); // NOI18N } } @Override public HashMap getSearchOptions(final User user) throws RemoteException { final HashMap r = queryCache.getSearchOptions(); if (logger.isDebugEnabled()) { logger.debug("in Domainserverimpl :: " + r); // NOI18N } return r; } @Override public SearchResult search(final User user, final int[] classIds, final Query query) throws RemoteException { try { // user sp\u00E4ter erweitern return seeker.search(query, classIds, user.getUserGroup(), 0); } catch (Throwable e) { logger.error(e, e); throw new RemoteException(e.getMessage(), e); } } @Override public ArrayList<ArrayList> performCustomSearch(final String query) throws RemoteException { try { final Statement s = getConnectionPool().getDBConnection().getConnection().createStatement(); final ResultSet rs = s.executeQuery(query); final ArrayList<ArrayList> result = new ArrayList<ArrayList>(); while (rs.next()) { final ArrayList row = new ArrayList(); for (int i = 0; i < rs.getMetaData().getColumnCount(); ++i) { row.add(rs.getObject(i + 1)); } result.add(row); } return result; } catch (Exception e) { final String msg = "Error during sql statement: " + query; logger.error(msg, e); throw new RemoteException(msg, e); } } /** * DOCUMENT ME! * * @throws Throwable DOCUMENT ME! * @throws ServerExitError DOCUMENT ME! */ protected void register() throws Throwable { int registered = 0; try { final String lsName = serverInfo.getName(); final String ip = serverInfo.getIP(); final String[] registryIPs = properties.getRegistryIps(); final String rmiPort = serverInfo.getRMIPort(); for (int i = 0; i < registryIPs.length; i++) { try { nameServer = (NameServer)Naming.lookup("rmi://" + registryIPs[i] + ":" + rmiPort + "/nameServer"); userServer = (UserServer)nameServer; // (UserServer) // Naming.lookup("rmi://"+registryIPs[i]+"/userServer"); nameServer.registerServer(ServerType.LOCALSERVER, lsName, ip, rmiPort); logger.info( "\n<LS> registered at SiriusRegistry " + registryIPs[i] + " with " + lsName + " " + ip); final UserStore userStore = dbServer.getUserStore(); userServer.registerUsers(userStore.getUsers()); userServer.registerUserGroups(userStore.getUserGroups()); userServer.registerUserMemberships(userStore.getMemberships()); registered++; logger.info( "<LS> users registered at SiriusRegistry" + registryIPs[i] + " with " + lsName + " " + ip); } catch (NotBoundException nbe) { System.err.println("<LS> No SiriusRegistry bound on RMIRegistry at " + registryIPs[i]); // NOI18N logger.error("<LS> No SiriusRegistry bound on RMIRegistry at " + registryIPs[i], nbe); // NOI18N } catch (RemoteException re) { System.err.println( "<LS> No RMIRegistry on " + registryIPs[i] + ", therefore SiriusRegistry could not be contacted"); logger.error( "<LS> No RMIRegistry on " + registryIPs[i] + ", therefore SiriusRegistry could not be contacted", re); } } } catch (Throwable e) { logger.error(e, e); throw new ServerExitError(e); } if (registered == 0) { throw new ServerExitError("registration failed"); // NOI18N } } /** * DOCUMENT ME! * * @throws Throwable DOCUMENT ME! * @throws ServerExitError DOCUMENT ME! * @throws ServerExit DOCUMENT ME! */ public void shutdown() throws Throwable { if (logger.isInfoEnabled()) { logger.info("shutting down domainserver impl: " + this); // NOI18N } final Shutdown shutdown = Shutdown.createShutdown(this); shutdown.shutdown(); final String ip = serverInfo.getIP(); final String lsName = properties.getServerName(); final String[] registryIPs = properties.getRegistryIps(); final String rmiPort = serverInfo.getRMIPort(); for (int i = 0; i < registryIPs.length; i++) { try { nameServer = (NameServer)Naming.lookup("rmi://" + registryIPs[i] + ":" + rmiPort + "/nameServer"); userServer = (UserServer)nameServer; // User und UserGroups bei Registry abmelden userServer.unregisterUsers(userstore.getUsers()); userServer.unregisterUserGroups(userstore.getUserGroups()); // LocalServer bei Registry abmelden nameServer.unregisterServer(ServerType.LOCALSERVER, lsName, ip, rmiPort); } catch (NotBoundException nbe) { logger.error("<LS> No SiriusRegistry bound on RMIRegistry at " + registryIPs[i], nbe); // NOI18N } catch (RemoteException re) { logger.error("<LS> RMIRegistry on " + registryIPs[i] + "could not be contacted", re); // NOI18N } catch (Throwable e) { logger.error(e, e); } } try { if (logger.isDebugEnabled()) { logger.debug("<LS> unbind for " + serverInfo.getBindString()); // NOI18N } Naming.unbind(serverInfo.getBindString()); if (properties.getStartMode().equalsIgnoreCase("simple")) { // NOI18N if (logger.isDebugEnabled()) { logger.debug("shutting down restful interface"); // NOI18N } RESTfulService.down(); try { if (logger.isDebugEnabled()) { logger.debug("shutting down startproxy"); // NOI18N } StartProxy.getInstance().shutdown(); } catch (final ServerExit serverExit) { // skip } try { if (logger.isDebugEnabled()) { logger.debug("shutting down registry"); // NOI18N } Registry.getServerInstance(Integer.valueOf(properties.getRMIRegistryPort())).shutdown(); } catch (final ServerExit serverExit) { // skip } } if (logger.isDebugEnabled()) { logger.debug("shutting down db connections"); // NOI18N } // alle offenen Verbindungen schliessen dbServer.getConnectionPool().closeConnections(); dbServer = null; // userservice of a localserver userstore = null; // executing the searchservice seeker = null; // this servers configuration properties = null; // for storing and loading prdefinded queries queryStore = null; queryCache = null; System.gc(); } catch (final Exception t) { logger.error("caught exception during shutdown", t); throw new ServerExitError(t); } finally { if (logger.isDebugEnabled()) { logger.debug("freeing instance"); // NOI18N } instance = null; } throw new ServerExit("Server exited regularly"); // NOI18N } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public static DomainServerImpl getServerInstance() { return instance; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public DBConnectionPool getConnectionPool() { return dbServer.getConnectionPool(); } /** * DOCUMENT ME! * * @param args DOCUMENT ME! * * @throws Throwable DOCUMENT ME! * @throws ServerExitError DOCUMENT ME! * @throws IllegalStateException DOCUMENT ME! */ public static void main(final String[] args) throws Throwable { // first of all register the default exception handler for all threads Thread.setDefaultUncaughtExceptionHandler(new DefaultServerExceptionHandler()); ServerProperties properties = null; int rmiPort; if (args == null) { throw new ServerExitError("args == null no commandline parameter given (Configfile / port)"); // NOI18N } else if (args.length < 1) { throw new ServerExitError("insufficient arguments given"); // NOI18N } if (instance != null) { throw new IllegalStateException("an instance was already created"); // NOI18N } try { try { properties = new ServerProperties(args[0]); rmiPort = new Integer(properties.getRMIRegistryPort()).intValue(); } catch (MissingResourceException mre) { System.err.println("Info :: <LS> Key rmiRegistryPort in ConfigFile +" + args[0] + " is Missing!"); // NOI18N System.err.println("Info :: <LS> Set Default to 1099"); // NOI18N rmiPort = 1099; } try { initLog4J(properties); } catch (final Exception e) { System.err.println("WARN :: <LS> Could not init log4j_: " + e); // NOI18N } System.out.println("<LS> ConfigFile: " + args[0]); // NOI18N // abfragen, ob schon eine RMI Registry exitiert. try { LocateRegistry.getRegistry(rmiPort); // wenn keine Registry vorhanden, wird an dieser Stelle Exception ausgeloest } catch (Exception e) { // wenn nicht, neue Registry starten und auf portnummer setzen LocateRegistry.createRegistry(rmiPort); } if (properties.getStartMode().equalsIgnoreCase("simple")) { // NOI18N Sirius.server.registry.Registry.getServerInstance(rmiPort); StartProxy.getInstance(args[0]); } if (System.getSecurityManager() == null) { System.setSecurityManager(new ServerSecurityManager()); } instance = new DomainServerImpl(new ServerProperties(args[0])); System.out.println("Info :: <LS> !!!LocalSERVER started!!!!"); // NOI18N } catch (Exception e) { System.err.println("Error while starting domainserver :: " + e.getMessage()); // NOI18N if (instance != null) { instance.shutdown(); } throw new ServerExitError(e); } } /** * DOCUMENT ME! * * @param properties DOCUMENT ME! * * @throws IllegalArgumentException DOCUMENT ME! */ private static void initLog4J(final ServerProperties properties) { final File log4jPropFile = new File(properties.getLog4jPropertyFile()); if ((log4jPropFile == null) || !log4jPropFile.isFile() || !log4jPropFile.canRead()) { throw new IllegalArgumentException("serverproperties provided invalid log4j config file: " + log4jPropFile); // NOI18N } else { PropertyConfigurator.configure(log4jPropFile.getAbsolutePath()); } } @Override public String getConfigAttr(final User user, final String key) throws RemoteException { try { return userstore.getConfigAttr(user, key); } catch (final SQLException ex) { final String message = "could not retrieve config attr: user: " + user + " || key: " + key; logger.error(message, ex); throw new RemoteException(message, ex); } } @Override public boolean hasConfigAttr(final User user, final String key) throws RemoteException { return getConfigAttr(user, key) != null; } @Override public HistoryObject[] getHistory(final int classId, final int objectId, final User user, final int elements) throws RemoteException { try { return historyServer.getHistory(classId, objectId, user, elements); } catch (final HistoryException e) { final String message = "could not retrieve history: user: " + user + " || classid: " + classId // NOI18N + "|| objectId: " + objectId + " || elements: " + elements; // NOI18N logger.error(message, e); throw new RemoteException(message, e); } } }