/*
* Copyright (c) 2011-2015 Marat Gubaidullin.
*
* This file is part of HYBRIDBPM.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*
*/
package com.hybridbpm.core;
import com.hybridbpm.core.util.HybridbpmCoreUtil;
import com.hybridbpm.core.util.HybridbpmDefaultBuilder;
import static com.hybridbpm.core.HybridbpmCore.CONFIGURATION_DIRECTORY;
import com.hybridbpm.core.api.DashboardAPI;
import com.hybridbpm.core.api.DevelopmentAPI;
import com.hybridbpm.core.api.SystemAPI;
import com.hybridbpm.core.data.Parameter;
import com.hybridbpm.core.data.access.Group;
import com.hybridbpm.core.data.access.Role;
import com.hybridbpm.core.data.access.User;
import com.hybridbpm.core.data.bpm.Case;
import com.hybridbpm.core.data.dashboard.PanelDefinition;
import com.hybridbpm.core.data.dashboard.TabDefinition;
import com.hybridbpm.core.data.dashboard.ViewDefinition;
import com.hybridbpm.core.data.development.Module;
import com.hybridbpm.core.serializer.DocumentTypeSerializer;
import com.hybridbpm.core.serializer.FieldCollectionTypeSerializer;
import com.hybridbpm.core.serializer.FieldEditorTypeSerializer;
import com.hybridbpm.core.serializer.ModelStatusSerializer;
import com.hybridbpm.core.serializer.ModuleSubTypeSerializer;
import com.hybridbpm.core.serializer.ModuleTypeSerializer;
import com.hybridbpm.core.serializer.ParameterTypeSerializer;
import com.hybridbpm.core.serializer.PermissionSerializer;
import com.hybridbpm.core.serializer.CaseStatusSerializer;
import com.hybridbpm.core.serializer.CaseTypeSerializer;
import com.hybridbpm.core.serializer.TabLayoutTypeSerializer;
import com.hybridbpm.core.serializer.TaskModelStatusSerializer;
import com.hybridbpm.core.serializer.TaskModelGateTypeSerializer;
import com.hybridbpm.core.serializer.TaskModelOptionSerializer;
import com.hybridbpm.core.serializer.TaskModelTaskPrioritySerializer;
import com.hybridbpm.core.serializer.TranslatedSerializer;
import com.hybridbpm.core.serializer.UserStatusSerializer;
import com.orientechnologies.orient.client.db.ODatabaseHelper;
import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.metadata.schema.OClass;
import com.orientechnologies.orient.core.metadata.schema.OType;
import com.orientechnologies.orient.core.sql.OCommandSQL;
import com.orientechnologies.orient.object.db.OObjectDatabaseTx;
import com.orientechnologies.orient.object.serialization.OObjectSerializerContext;
import com.orientechnologies.orient.object.serialization.OObjectSerializerHelper;
import com.orientechnologies.orient.server.OServer;
import com.orientechnologies.orient.server.OServerMain;
import com.orientechnologies.orient.server.config.OServerUserConfiguration;
import com.tinkerpop.blueprints.impls.orient.OrientEdgeType;
import com.tinkerpop.blueprints.impls.orient.OrientGraphFactory;
import com.tinkerpop.blueprints.impls.orient.OrientGraphNoTx;
import com.tinkerpop.blueprints.impls.orient.OrientVertexType;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Marat Gubaidullin
*/
public class DatabaseServer {
private static final Logger logger = Logger.getLogger(DatabaseServer.class.getSimpleName());
public static final String HYBRIDBPM_DATABASE_URL = "plocal:hybridbpm/databases/hybridbpm";
public static final String CONFIGURATION_FILENAME = "orientdb-server-config.xml";
public static final String HYBRIDBPM_DATABASE_NAME = "hybridbpm";
private OServer oServer;
public static final String ORIENTDB_WWW_DIRECTORY = "www";
private static final String rootName = "root";
private static final String userName = "admin";
private static String userPassword = "hybridbpm";
private static String rootPassword = "root";
private OObjectDatabaseTx objectDatabaseTx;
private ODatabaseDocumentTx databaseDocumentTx;
private OrientGraphNoTx graphNoTx;
public void start() {
try {
logger.info("DatabaseServer starting");
File configurationFile = new File(CONFIGURATION_DIRECTORY, CONFIGURATION_FILENAME);
if (!configurationFile.exists()) {
try (FileOutputStream fos = new FileOutputStream(configurationFile)) {
fos.write(HybridbpmCoreUtil.getDefaultDatabaseConfig().getBytes());
}
}
configurationFile = new File(CONFIGURATION_DIRECTORY, CONFIGURATION_FILENAME);
oServer = OServerMain.create();
oServer.startup(configurationFile);
oServer.activate();
for (OServerUserConfiguration oServerUserConfiguration : oServer.getConfiguration().users) {
if (oServerUserConfiguration.name.equals(rootName)) {
rootPassword = oServerUserConfiguration.password;
}
if (oServerUserConfiguration.name.equals(userName)) {
userPassword = oServerUserConfiguration.password;
}
}
if (!ODatabaseHelper.existsDatabase(HYBRIDBPM_DATABASE_URL)) {
OrientGraphFactory factory = new OrientGraphFactory(HYBRIDBPM_DATABASE_URL, userName, "admin");
graphNoTx = factory.getNoTx();
databaseDocumentTx = factory.getDatabase();
databaseDocumentTx.command(new OCommandSQL("UPDATE ouser SET password = '" + userPassword + "' WHERE name = 'admin'")).execute();
databaseDocumentTx.commit();
objectDatabaseTx = new OObjectDatabaseTx(databaseDocumentTx);
objectDatabaseTx.activateOnCurrentThread();
} else {
OrientGraphFactory factory = new OrientGraphFactory(HYBRIDBPM_DATABASE_URL, userName, userPassword);
databaseDocumentTx = factory.getDatabase();
objectDatabaseTx = new OObjectDatabaseTx(databaseDocumentTx);
objectDatabaseTx.activateOnCurrentThread();
}
verifySchema();
DevelopmentAPI.regenerateGroovySources();
createOrientdbStudio();
logger.info("DatabaseServer started");
} catch (Exception ex) {
logger.log(Level.SEVERE, ex.getMessage(), ex);
}
}
public static String getUsername() {
return userName;
}
public static String getPassword() {
return userPassword;
}
public void stop() {
try {
logger.info("DatabaseServer stopping");
oServer.shutdown();
logger.info("DatabaseServer stopped");
} catch (Exception ex) {
logger.log(Level.SEVERE, ex.getMessage(), ex);
}
}
private void verifySchema() {
logger.log(Level.INFO, "DatabaseServer.verifySchema started");
registerSerializers();
if (!objectDatabaseTx.getMetadata().getSchema().existsClass(Case.class.getSimpleName())) {
createSchema();
registerEntityClasses();
createDefaultConfig();
createDefaultAccess();
createDefaultData();
} else {
registerEntityClasses();
}
logger.log(Level.INFO, "DatabaseServer.verifySchema done");
}
private void registerSerializers() {
logger.log(Level.INFO, "DatabaseServer.registerSerializers started");
OObjectSerializerContext serializerContext = new OObjectSerializerContext();
serializerContext.bind(new TranslatedSerializer());
serializerContext.bind(new ModuleTypeSerializer());
serializerContext.bind(new ModuleSubTypeSerializer());
serializerContext.bind(new UserStatusSerializer());
serializerContext.bind(new CaseStatusSerializer());
serializerContext.bind(new CaseTypeSerializer());
serializerContext.bind(new TaskModelStatusSerializer());
serializerContext.bind(new TaskModelOptionSerializer());
serializerContext.bind(new TaskModelGateTypeSerializer());
serializerContext.bind(new TaskModelTaskPrioritySerializer());
serializerContext.bind(new ParameterTypeSerializer());
serializerContext.bind(new ModelStatusSerializer());
serializerContext.bind(new FieldCollectionTypeSerializer());
serializerContext.bind(new FieldEditorTypeSerializer());
serializerContext.bind(new PermissionSerializer());
serializerContext.bind(new DocumentTypeSerializer());
serializerContext.bind(new TabLayoutTypeSerializer());
OObjectSerializerHelper.bindSerializerContext(null, serializerContext);
logger.log(Level.INFO, "DatabaseServer.registerSerializers done");
}
private void createDefaultConfig() {
logger.log(Level.INFO, "DatabaseServer.createDefaultConfig started");
SystemAPI.get(User.getSystemUser(), null).saveParameter(new Parameter(User.TOKEN_EXPIRE_PERIOD, "90", Parameter.PARAM_TYPE.SYSTEM));
logger.log(Level.INFO, "DatabaseServer.createDefaultConfig done");
}
private void createDefaultData() {
logger.log(Level.INFO, "DatabaseServer.createDefaultData started");
// default module templates
DevelopmentAPI.get(User.getSystemUser(), null).saveModule(HybridbpmDefaultBuilder.createModuleTemplate("SimpleFormTemplate", "Simple Form Template", "CODE", Module.MODULE_TYPE.FORM, Module.MODULE_SUBTYPE.TEMPLATED_FORM));
DevelopmentAPI.get(User.getSystemUser(), null).saveModule(HybridbpmDefaultBuilder.createModuleTemplate("TaskFormTemplate", "Task Form Template", "CODE", Module.MODULE_TYPE.FORM, Module.MODULE_SUBTYPE.TASK_FORM));
DevelopmentAPI.get(User.getSystemUser(), null).saveModule(HybridbpmDefaultBuilder.createModuleTemplate("SimpleConnectorTemplate", "Simple Connector Template", "CODE", Module.MODULE_TYPE.CONNECTOR, null));
// Demo processes, forms and charts
DevelopmentAPI.get(User.getSystemUser(), null).saveModule(HybridbpmDefaultBuilder.createDemoData());
DevelopmentAPI.get(User.getSystemUser(), null).saveModule(HybridbpmDefaultBuilder.createDemoProcess());
DevelopmentAPI.get(User.getSystemUser(), null).saveModule(HybridbpmDefaultBuilder.createDemoForm());
DevelopmentAPI.get(User.getSystemUser(), null).saveModule(HybridbpmDefaultBuilder.createDemoConnector());
Module chart1 = DevelopmentAPI.get(User.getSystemUser(), null).saveModule(HybridbpmDefaultBuilder.createDemoChart1());
Module chart2 = DevelopmentAPI.get(User.getSystemUser(), null).saveModule(HybridbpmDefaultBuilder.createDemoChart2());
// default dashboard views
ViewDefinition viewDefinition = DashboardAPI.get(User.getSystemUser(), null).saveViewDefinition(HybridbpmDefaultBuilder.createViewDefinition("dashboard", "Dashboard", "DASHBOARD", 0), null, false);
TabDefinition tabDefinition = DashboardAPI.get(User.getSystemUser(), null).saveTabDefinition(HybridbpmDefaultBuilder.createTabDefinition(viewDefinition, "BPM", "DASHBOARD", 0, TabDefinition.LAYOUT_TYPE.GRID), null, false);
List<PanelDefinition> panels = DashboardAPI.get(User.getSystemUser(), null).getPanelDefinitionsByTab(tabDefinition.getId().toString());
PanelDefinition panel = panels.get(0);
panel.setDefaultTitle("Tasks by status");
panel.setModuleType(Module.MODULE_TYPE.CHART);
panel.setModuleName(chart1.getName());
DashboardAPI.get(User.getSystemUser(), null).savePanelDefinition(panel);
panel = panels.get(1);
panel.setDefaultTitle("Process Instances");
panel.setModuleType(Module.MODULE_TYPE.CHART);
panel.setModuleName(chart2.getName());
DashboardAPI.get(User.getSystemUser(), null).savePanelDefinition(panel);
logger.log(Level.INFO, "DatabaseServer.createDefaultData done");
}
private void createDefaultAccess() {
logger.log(Level.INFO, "DatabaseServer.createDefaultAccess started");
User administrator = new User();
administrator.setFirstName(User.ADMINISTRATOR_FIRSTNAME);
administrator.setLastName(User.ADMINISTRATOR_LASTNAME);
administrator.setUsername(User.ADMINISTRATOR);
administrator.setEmail("administrator@hybridbpm.org");
administrator.setStatus(User.STATUS.ENABLED);
administrator.setFirstVisibleHourOfDay(0);
administrator.setLastVisibleHourOfDay(23);
administrator.setPassword(HybridbpmCoreUtil.hashPassword(User.ADMINISTRATOR));
objectDatabaseTx.activateOnCurrentThread();
administrator = objectDatabaseTx.save(administrator);
User user = new User();
user.setFirstName("John");
user.setLastName("Smith");
user.setUsername("jsmith");
user.setEmail("john.smith@hybridbpm.org");
user.setStatus(User.STATUS.ENABLED);
user.setFirstVisibleHourOfDay(0);
user.setLastVisibleHourOfDay(23);
user.setPassword(HybridbpmCoreUtil.hashPassword(User.ADMINISTRATOR));
user = objectDatabaseTx.save(user);
Role administratorRole = objectDatabaseTx.save(Role.create(Role.ADMINISTRATOR, Role.ADMINISTRATOR, Role.ADMINISTRATOR));
Role developerRole = objectDatabaseTx.save(Role.create(Role.DEVELOPER, Role.DEVELOPER, Role.DEVELOPER));
Role userRole = objectDatabaseTx.save(Role.create(Role.USER, Role.USER, Role.USER));
Role managerRole = objectDatabaseTx.save(Role.create(Role.MANAGER, Role.MANAGER, Role.MANAGER));
Group administratorGroup = objectDatabaseTx.save(Group.create(Group.ADMINISTRATORS, Group.ADMINISTRATORS, Group.ADMINISTRATORS));
Group developerGroup = objectDatabaseTx.save(Group.create(Group.DEVELOPERS, Group.DEVELOPERS, Group.DEVELOPERS));
Group userGroup = objectDatabaseTx.save(Group.create(Group.USERS, Group.USERS, Group.USERS));
Group managerGroup = objectDatabaseTx.save(Group.create(Group.MANAGERS, Group.MANAGERS, Group.MANAGERS));
objectDatabaseTx.commit();
databaseDocumentTx.command(new OCommandSQL("CREATE EDGE RoleGroup FROM " + administratorRole.getId() + " TO " + administratorGroup.getId())).execute();
databaseDocumentTx.command(new OCommandSQL("CREATE EDGE RoleGroup FROM " + developerRole.getId() + " TO " + developerGroup.getId())).execute();
databaseDocumentTx.command(new OCommandSQL("CREATE EDGE RoleGroup FROM " + userRole.getId() + " TO " + userGroup.getId())).execute();
databaseDocumentTx.command(new OCommandSQL("CREATE EDGE RoleGroup FROM " + managerRole.getId() + " TO " + managerGroup.getId())).execute();
databaseDocumentTx.command(new OCommandSQL("CREATE EDGE UserGroup FROM " + administrator.getId() + " TO " + administratorGroup.getId())).execute();
databaseDocumentTx.command(new OCommandSQL("CREATE EDGE UserGroup FROM " + administrator.getId() + " TO " + developerGroup.getId())).execute();
databaseDocumentTx.command(new OCommandSQL("CREATE EDGE UserGroup FROM " + administrator.getId() + " TO " + userGroup.getId())).execute();
databaseDocumentTx.command(new OCommandSQL("CREATE EDGE UserGroup FROM " + administrator.getId() + " TO " + managerGroup.getId())).execute();
databaseDocumentTx.command(new OCommandSQL("CREATE EDGE UserGroup FROM " + user.getId() + " TO " + userGroup.getId())).execute();
databaseDocumentTx.commit();
logger.log(Level.INFO, "DatabaseServer.createDefaultAccess done");
}
private void createSchema() {
logger.log(Level.INFO, "DatabaseServer.createSchema started");
// BPM schema
OrientVertexType case1 = graphNoTx.createVertexType("Case");
case1.createProperty("modelName", OType.STRING);
case1.createProperty("code", OType.STRING);
case1.createProperty("title", OType.STRING);
case1.createProperty("description", OType.STRING);
case1.createProperty("initiator", OType.STRING);
case1.createProperty("type", OType.STRING);
case1.createProperty("status", OType.STRING);
case1.createProperty("template", OType.STRING);
case1.createProperty("updateDate", OType.DATETIME);
case1.createProperty("startDate", OType.DATETIME);
case1.createProperty("finishDate", OType.DATETIME);
case1.createIndex("caseModelNameIdx", OClass.INDEX_TYPE.NOTUNIQUE, "modelName");
case1.createIndex("caseStatusIdx", OClass.INDEX_TYPE.NOTUNIQUE, "status");
case1.createIndex("caseTypeIdx", OClass.INDEX_TYPE.NOTUNIQUE, "type");
case1.createIndex("caseInitiatorIdx", OClass.INDEX_TYPE.NOTUNIQUE, "initiator");
case1.createIndex("caseCodeIdx", OClass.INDEX_TYPE.UNIQUE, "code");
OrientVertexType task = graphNoTx.createVertexType("Task");
task.createProperty("taskName", OType.STRING);
task.createProperty("description", OType.STRING);
task.createProperty("status", OType.STRING);
task.createProperty("option", OType.STRING);
task.createProperty("initiator", OType.STRING);
task.createProperty("executor", OType.STRING);
task.createProperty("taskTitle", OType.STRING);
task.createProperty("processModelName", OType.STRING);
task.createProperty("taskType", OType.STRING);
task.createProperty("taskPriority", OType.STRING);
task.createProperty("iteration", OType.INTEGER);
task.createProperty("initial", OType.BOOLEAN);
task.createProperty("assigned", OType.BOOLEAN);
task.createProperty("question", OType.BOOLEAN);
task.createProperty("createDate", OType.DATETIME);
task.createProperty("updateDate", OType.DATETIME);
task.createProperty("startDate", OType.DATETIME);
task.createProperty("finishDate", OType.DATE);
task.createProperty("scheduleStartDate", OType.DATETIME);
task.createProperty("scheduleEndDate", OType.DATETIME);
task.createProperty("dueDate", OType.DATETIME);
task.createIndex("taskNameIdx", OClass.INDEX_TYPE.NOTUNIQUE, "taskName");
task.createIndex("taskExecutorIdx", OClass.INDEX_TYPE.NOTUNIQUE, "executor");
task.createIndex("taskInitiatorIdx", OClass.INDEX_TYPE.NOTUNIQUE, "initiator");
task.createIndex("taskStatusIdx", OClass.INDEX_TYPE.NOTUNIQUE, "status");
OrientEdgeType userTaskList = graphNoTx.createEdgeType("UserTaskList");
OrientEdgeType processTaskList = graphNoTx.createEdgeType("ProcessTaskList");
OrientEdgeType linked = graphNoTx.createEdgeType("Linked");
linked.createProperty("createDate", OType.DATETIME);
linked.createProperty("creator", OType.STRING);
OrientEdgeType variable = graphNoTx.createEdgeType("Variable");
variable.createProperty("name", OType.STRING);
variable.createProperty("className", OType.STRING);
variable.createProperty("updateDate", OType.DATETIME);
OClass join = databaseDocumentTx.getMetadata().getSchema().createClass("TaskJoin");
join.createProperty("taskName", OType.STRING);
join.createProperty("caseId", OType.STRING);
join.createProperty("iteration", OType.INTEGER);
join.createIndex("joinUniqueIdx", OClass.INDEX_TYPE.UNIQUE, "taskName", "caseId", "iteration");
join.createIndex("joinCaseIdIdx", OClass.INDEX_TYPE.NOTUNIQUE, "caseId");
// ACL schema
OrientVertexType rolex = graphNoTx.createVertexType("Role");
rolex.createProperty("name", OType.STRING);
rolex.createProperty("title", OType.STRING);
rolex.createProperty("description", OType.STRING);
rolex.createIndex("roleNameIndex", OClass.INDEX_TYPE.UNIQUE, "name");
OrientVertexType group = graphNoTx.createVertexType("Group");
group.createProperty("name", OType.STRING);
group.createProperty("title", OType.STRING);
group.createProperty("description", OType.STRING);
group.createIndex("groupNameIndex", OClass.INDEX_TYPE.UNIQUE, "name");
OrientVertexType user = graphNoTx.createVertexType("User");
user.createProperty("firstName", OType.STRING);
user.createProperty("lastName", OType.STRING);
user.createProperty("email", OType.STRING);
user.createProperty("username", OType.STRING);
user.createProperty("password", OType.STRING);
user.createProperty("token", OType.STRING);
user.createProperty("tokenExpireDate", OType.DATETIME);
user.createProperty("manager", OType.LINK, user);
user.createProperty("locale", OType.STRING);
user.createProperty("status", OType.STRING);
user.createProperty("firstVisibleHourOfDay", OType.INTEGER);
user.createProperty("lastVisibleHourOfDay", OType.INTEGER);
user.createIndex("userNameIndex", OClass.INDEX_TYPE.UNIQUE, "username");
user.createIndex("userFirstNameIndex", OClass.INDEX_TYPE.NOTUNIQUE, "firstName");
user.createIndex("userLastNameIndex", OClass.INDEX_TYPE.NOTUNIQUE, "lastName");
user.createIndex("userEmailIndex", OClass.INDEX_TYPE.UNIQUE, "email");
OrientEdgeType roleGroup = graphNoTx.createEdgeType("RoleGroup");
OrientEdgeType userGroup = graphNoTx.createEdgeType("UserGroup");
OrientEdgeType permission = graphNoTx.createEdgeType("Permission");
permission.createProperty("parameter", OType.STRING);
permission.createProperty("permissions", OType.EMBEDDEDLIST);
// discussion schema
OrientVertexType category = graphNoTx.createVertexType("Category");
category.createProperty("createDate", OType.DATETIME);
category.createProperty("creator", OType.STRING);
category.createProperty("title", OType.STRING);
category.createProperty("description", OType.STRING);
OrientVertexType comment = graphNoTx.createVertexType("Comment");
comment.createProperty("createDate", OType.DATETIME);
comment.createProperty("creator", OType.LINK, user);
comment.createProperty("body", OType.STRING);
comment.createProperty("parent", OType.LINK, comment);
comment.createProperty("task", OType.LINK, task);
comment.createProperty("case", OType.LINK, case1);
// file schema
OrientVertexType file = graphNoTx.createVertexType("File");
file.createProperty("createDate", OType.DATETIME);
file.createProperty("creator", OType.STRING);
file.createProperty("name", OType.STRING);
file.createProperty("fileName", OType.STRING);
file.createProperty("mime", OType.STRING);
file.createProperty("size", OType.INTEGER);
file.createProperty("scope", OType.STRING);
file.createProperty("case", OType.LINK, case1);
file.createProperty("task", OType.LINK, task);
file.createProperty("comment", OType.LINK, comment);
file.createIndex("fileNameIndex", OClass.INDEX_TYPE.NOTUNIQUE, "name");
file.createIndex("fileCaseIndex", OClass.INDEX_TYPE.NOTUNIQUE, "case");
file.createIndex("fileTaskIndex", OClass.INDEX_TYPE.NOTUNIQUE, "task");
file.createIndex("fileCommentIndex", OClass.INDEX_TYPE.NOTUNIQUE, "comment");
OrientVertexType fileBody = graphNoTx.createVertexType("FileBody");
fileBody.createProperty("file", OType.LINK, file);
// document schema
OrientVertexType document = graphNoTx.createVertexType("Document");
document.createProperty("createDate", OType.DATETIME);
document.createProperty("updateDate", OType.DATETIME);
document.createProperty("creator", OType.STRING);
document.createProperty("description", OType.STRING);
document.createProperty("name", OType.STRING);
document.createProperty("path", OType.STRING);
document.createProperty("mime", OType.STRING);
document.createProperty("size", OType.INTEGER);
document.createProperty("type", OType.STRING);
document.createProperty("parent", OType.LINK, document);
document.createProperty("case", OType.LINK, case1);
document.createIndex("documentNameIndex", OClass.INDEX_TYPE.NOTUNIQUE, "name");
document.createIndex("documentPathIndex", OClass.INDEX_TYPE.UNIQUE, "path");
OrientVertexType documentVersion = graphNoTx.createVertexType("DocumentVersion");
documentVersion.createProperty("createDate", OType.DATETIME);
documentVersion.createProperty("updateDate", OType.DATETIME);
documentVersion.createProperty("creator", OType.STRING);
documentVersion.createProperty("description", OType.STRING);
documentVersion.createProperty("name", OType.STRING);
documentVersion.createProperty("mime", OType.STRING);
documentVersion.createProperty("size", OType.INTEGER);
documentVersion.createProperty("documentVersion", OType.INTEGER);
documentVersion.createProperty("document", OType.LINK, document);
OrientVertexType mod = graphNoTx.createVertexType("Module");
mod.createProperty("updateDate", OType.DATETIME);
mod.createProperty("title", OType.STRING);
mod.createProperty("icon", OType.STRING);
mod.createProperty("name", OType.STRING);
mod.createProperty("code", OType.STRING);
mod.createProperty("model", OType.STRING);
mod.createProperty("design", OType.STRING);
mod.createProperty("templateName", OType.STRING);
mod.createProperty("processName", OType.STRING);
mod.createProperty("subType", OType.STRING);
mod.createProperty("type", OType.STRING);
mod.createProperty("configurable", OType.BOOLEAN);
mod.createProperty("system", OType.BOOLEAN);
mod.createProperty("publishable", OType.BOOLEAN);
mod.createProperty("template", OType.BOOLEAN);
mod.createIndex("modNameIndex", OClass.INDEX_TYPE.UNIQUE, "name");
OrientVertexType view = graphNoTx.createVertexType("ViewDefinition");
view.createProperty("title", OType.STRING);
view.createProperty("url", OType.STRING);
view.createProperty("icon", OType.STRING);
view.createProperty("order", OType.INTEGER);
view.createIndex("viewUrlIndex", OClass.INDEX_TYPE.UNIQUE, "url");
OrientVertexType tab = graphNoTx.createVertexType("TabDefinition");
tab.createProperty("title", OType.STRING);
tab.createProperty("viewId", OType.LINK, view);
tab.createProperty("icon", OType.STRING);
tab.createProperty("order", OType.INTEGER);
tab.createProperty("rows", OType.INTEGER);
tab.createProperty("columns", OType.INTEGER);
OrientVertexType panel = graphNoTx.createVertexType("PanelDefinition");
panel.createProperty("title", OType.STRING);
panel.createProperty("tabId", OType.LINK, tab);
panel.createProperty("column", OType.INTEGER);
panel.createProperty("row", OType.INTEGER);
panel.createProperty("columns", OType.INTEGER);
panel.createProperty("order", OType.INTEGER);
panel.createProperty("moduleType", OType.STRING);
panel.createProperty("moduleName", OType.STRING);
panel.createProperty("parameters", OType.STRING);
graphNoTx.shutdown();
logger.log(Level.INFO, "DatabaseServer.createSchema done");
}
private void registerEntityClasses() {
logger.log(Level.INFO, "DatabaseServer.registerEntityClasses started");
objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.core.data.Parameter.class);
objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.core.data.document.Document.class);
objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.core.data.document.DocumentVersion.class);
objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.model.Translated.class);
objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.core.data.access.Group.class);
objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.core.data.access.Role.class);
objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.core.data.access.RoleGroup.class);
objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.core.data.access.UserGroup.class);
objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.core.data.access.User.class);
objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.core.data.access.Permission.class);
objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.core.data.dashboard.PanelDefinition.class);
objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.core.data.dashboard.TabDefinition.class);
objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.core.data.dashboard.ViewDefinition.class);
objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.core.data.bpm.Case.class);
objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.core.data.bpm.Task.class);
objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.core.data.bpm.Variable.class);
objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.core.data.bpm.Comment.class);
objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.core.data.bpm.File.class);
objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.core.data.bpm.FileBody.class);
objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.core.data.development.Module.class);
objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.core.event.BpmEvent.class);
// objectDatabaseTx.getEntityManager().registerEntityClass(com.hybridbpm.model.FieldModel.class);
objectDatabaseTx.setAutomaticSchemaGeneration(true);
logger.log(Level.INFO, "DatabaseServer.registerEntityClasses done");
}
private void createOrientdbStudio() {
try {
File wwwFile = new File(ORIENTDB_WWW_DIRECTORY);
if (!wwwFile.exists()) {
logger.info("DatabaseServer createOrientdbStudio start");
wwwFile.mkdirs();
final File jarFile = new File(getClass().getProtectionDomain().getCodeSource().getLocation().getPath());
try (JarFile jar = new JarFile(jarFile)) {
final Enumeration<JarEntry> entries = jar.entries(); //gives ALL entries in jar
while (entries.hasMoreElements()) {
JarEntry jarEntry = entries.nextElement();
final String name = jarEntry.getName();
if (name.startsWith(ORIENTDB_WWW_DIRECTORY + "/")) { //filter according to the path
File newFile = new File(name);
if (jarEntry.isDirectory()) {
newFile.mkdirs();
} else {
try (FileOutputStream fos = new FileOutputStream(newFile)) {
fos.write(HybridbpmCoreUtil.createBytesFromSource("/" + name));
}
}
}
}
}
logger.info("DatabaseServer createOrientdbStudio done");
}
} catch (Exception ex) {
logger.log(Level.SEVERE, ex.getMessage(), ex);
}
}
}