use of org.bimserver.emf.IfcModelInterface in project BIMserver by opensourceBIM.
the class DatabaseSession method getSingle.
@SuppressWarnings("unchecked")
public <T extends IdEObject> T getSingle(EClass eClass, QueryInterface query) throws BimserverDatabaseException {
IfcModelInterface model = createModel(query);
List<T> all = getAllOfType(model, eClass, query).getAll((Class<T>) eClass.getInstanceClass());
if (all.size() > 0) {
return all.get(0);
}
return null;
}
use of org.bimserver.emf.IfcModelInterface in project BIMserver by opensourceBIM.
the class ServiceRunnerServlet method service.
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if (request.getRequestURI().endsWith("/servicelist")) {
processServiceList(request, response);
return;
}
String token = null;
if (request.getHeader("Authorization") != null) {
String a = request.getHeader("Authorization");
if (a.startsWith("Bearer")) {
token = a.substring(7);
}
}
if (token == null) {
token = request.getHeader("Token");
}
LOGGER.info("Token: " + token);
String serviceName = request.getHeader("ServiceName");
if (serviceName == null) {
serviceName = request.getRequestURI();
if (serviceName.startsWith("/services/")) {
serviceName = serviceName.substring(10);
}
}
LOGGER.info("ServiceName: " + serviceName);
long serviceOid = Long.parseLong(serviceName);
String inputType = request.getHeader("Input-Type");
LOGGER.info("Input-Type: " + inputType);
try (DatabaseSession session = getBimServer().getDatabase().createSession()) {
Authorization authorization = Authorization.fromToken(getBimServer().getEncryptionKey(), token);
User user = session.get(authorization.getUoid(), OldQuery.getDefault());
if (user == null) {
LOGGER.error("Service \"" + serviceName + "\" not found for this user");
throw new UserException("No user found with uoid " + authorization.getUoid());
}
if (user.getState() == ObjectState.DELETED) {
LOGGER.error("User has been deleted");
throw new UserException("User has been deleted");
}
InternalServicePluginConfiguration foundService = null;
UserSettings userSettings = user.getUserSettings();
for (InternalServicePluginConfiguration internalServicePluginConfiguration : userSettings.getServices()) {
if (internalServicePluginConfiguration.getOid() == serviceOid) {
foundService = internalServicePluginConfiguration;
break;
}
}
if (foundService == null) {
LOGGER.info("Service \"" + serviceName + "\" not found for this user");
throw new ServletException("Service \"" + serviceName + "\" not found for this user");
}
PluginDescriptor pluginDescriptor = foundService.getPluginDescriptor();
ServicePlugin servicePlugin = getBimServer().getPluginManager().getServicePlugin(pluginDescriptor.getPluginClassName(), true);
if (servicePlugin instanceof BimBotsServiceInterface) {
LOGGER.info("Found service " + servicePlugin);
BimBotsServiceInterface bimBotsServiceInterface = (BimBotsServiceInterface) servicePlugin;
try {
if (getBimServer().getServerSettingsCache().getServerSettings().isStoreServiceRuns()) {
LOGGER.info("Storing intermediate results");
// When we store service runs, we can just use the streaming deserializer to stream directly to the database, after that we'll trigger the actual service
// Create or find project and link user and service to project
// Checkin stream into project
// Trigger service
ServiceInterface serviceInterface = getBimServer().getServiceFactory().get(authorization, AccessMethod.INTERNAL).get(ServiceInterface.class);
SProject project = serviceInterface.addProject("tmp-" + new Random().nextInt(), "ifc2x3tc1");
SDeserializerPluginConfiguration deserializer = serviceInterface.getSuggestedDeserializerForExtension("ifc", project.getOid());
if (deserializer == null) {
throw new BimBotsException("No deserializer found");
}
serviceInterface.checkin(project.getOid(), "Auto checkin", deserializer.getOid(), -1L, "s", new DataHandler(new InputStreamDataSource(request.getInputStream())), false, true);
project = serviceInterface.getProjectByPoid(project.getOid());
PackageMetaData packageMetaData = getBimServer().getMetaDataManager().getPackageMetaData(project.getSchema());
IfcModelInterface model = new BasicIfcModel(packageMetaData, null);
try {
Revision revision = session.get(project.getLastRevisionId(), OldQuery.getDefault());
session.getMap(model, new OldQuery(packageMetaData, project.getId(), revision.getId(), revision.getOid(), null, Deep.NO));
} catch (BimserverDatabaseException e) {
e.printStackTrace();
}
BimServerBimBotsInput input = new BimServerBimBotsInput(getBimServer(), authorization.getUoid(), null, null, model);
BimBotsOutput output = bimBotsServiceInterface.runBimBot(input, getBimServer().getSConverter().convertToSObject(foundService.getSettings()));
SExtendedData extendedData = new SExtendedData();
SFile file = new SFile();
file.setData(output.getData());
file.setFilename(output.getContentDisposition());
file.setMime(output.getContentType());
file.setSize(output.getData().length);
Long fileId = serviceInterface.uploadFile(file);
extendedData.setFileId(fileId);
extendedData.setTitle(output.getTitle());
SExtendedDataSchema extendedDataSchema = null;
try {
extendedDataSchema = serviceInterface.getExtendedDataSchemaByName(output.getSchemaName());
} catch (UserException e) {
extendedDataSchema = new SExtendedDataSchema();
extendedDataSchema.setContentType(output.getContentType());
extendedDataSchema.setName(output.getSchemaName());
serviceInterface.addExtendedDataSchema(extendedDataSchema);
}
extendedData.setSchemaId(extendedDataSchema.getOid());
serviceInterface.addExtendedDataToRevision(project.getLastRevisionId(), extendedData);
response.setHeader("Output-Type", output.getSchemaName());
response.setHeader("Data-Title", output.getTitle());
response.setHeader("Data-Identifier", "" + project.getOid());
response.setHeader("Content-Type", output.getContentType());
response.setHeader("Content-Disposition", output.getContentDisposition());
response.getOutputStream().write(output.getData());
} else {
// When we don't store the service runs, there is no other way than to just use the old deserializer and run the service from the EMF model
LOGGER.info("NOT Storing intermediate results");
DeserializerPlugin deserializerPlugin = getBimServer().getPluginManager().getFirstDeserializer("ifc", Schema.IFC2X3TC1, true);
if (deserializerPlugin == null) {
throw new BimBotsException("No deserializer plugin found");
}
byte[] data = IOUtils.toByteArray(request.getInputStream());
SchemaName schema = SchemaName.valueOf(inputType);
Deserializer deserializer = deserializerPlugin.createDeserializer(new PluginConfiguration());
PackageMetaData packageMetaData = getBimServer().getMetaDataManager().getPackageMetaData("ifc2x3tc1");
deserializer.init(packageMetaData);
IfcModelInterface model = deserializer.read(new ByteArrayInputStream(data), schema.name(), data.length, null);
BimServerBimBotsInput input = new BimServerBimBotsInput(getBimServer(), authorization.getUoid(), schema, data, model);
BimBotsOutput output = bimBotsServiceInterface.runBimBot(input, getBimServer().getSConverter().convertToSObject(foundService.getSettings()));
response.setHeader("Output-Type", output.getSchemaName());
response.setHeader("Data-Title", output.getTitle());
response.setHeader("Content-Type", output.getContentType());
response.setHeader("Content-Disposition", output.getContentDisposition());
response.getOutputStream().write(output.getData());
}
} catch (BimBotsException e) {
LOGGER.error("", e);
} catch (DeserializeException e) {
LOGGER.error("", e);
} catch (PluginException e) {
LOGGER.error("", e);
} catch (ServerException e) {
LOGGER.error("", e);
}
} else {
throw new ServletException("Service \"" + serviceName + "\" does not implement the BimBotsServiceInterface");
}
} catch (AuthenticationException e) {
LOGGER.error("", e);
} catch (BimserverDatabaseException e) {
LOGGER.error("", e);
} catch (UserException e) {
LOGGER.error("", e);
}
}
use of org.bimserver.emf.IfcModelInterface in project BIMserver by opensourceBIM.
the class AdminServiceImpl method regenerateGeometry.
@Override
public void regenerateGeometry(Long croid) throws ServerException, UserException {
LOGGER.info("Regenerating geometry for concrete revision" + croid);
DatabaseSession session = getBimServer().getDatabase().createSession();
try {
// Normally we wouldn't be allowed to change existing data
session.setOverwriteEnabled(true);
ConcreteRevision concreteRevision = session.get(StorePackage.eINSTANCE.getConcreteRevision(), croid, OldQuery.getDefault());
PackageMetaData packageMetaData = getBimServer().getMetaDataManager().getPackageMetaData(concreteRevision.getProject().getSchema());
IfcModelInterface model = new BasicIfcModel(packageMetaData, null);
session.getMap(model, new OldQuery(packageMetaData, concreteRevision.getProject().getId(), concreteRevision.getId(), -1));
User user = session.get(getAuthorization().getUoid(), OldQuery.getDefault());
UserSettings userSettings = user.getUserSettings();
RenderEnginePluginConfiguration defaultRenderEngine = userSettings.getDefaultRenderEngine();
if (defaultRenderEngine == null) {
throw new BimBotsException("No default render engine has been selected for this user");
}
RenderEnginePool pool = getBimServer().getRenderEnginePools().getRenderEnginePool(model.getPackageMetaData().getSchema(), defaultRenderEngine.getPluginDescriptor().getPluginClassName(), new PluginConfiguration(defaultRenderEngine.getSettings()));
new GeometryGenerator(getBimServer()).generateGeometry(pool, getBimServer().getPluginManager(), session, model, concreteRevision.getProject().getId(), concreteRevision.getId(), true, null);
session.commit();
} catch (Exception e) {
handleException(e);
} finally {
session.close();
}
}
use of org.bimserver.emf.IfcModelInterface in project BIMserver by opensourceBIM.
the class TestListWalls method test.
@Test
public void test() {
try {
// Create a new BimServerClient with authentication
BimServerClientInterface bimServerClient = getFactory().create(new UsernamePasswordAuthenticationInfo("admin@bimserver.org", "admin"));
// Create a new project
SProject newProject = bimServerClient.getServiceInterface().addProject("test" + Math.random(), "ifc2x3tc1");
// Get the appropriate deserializer
SDeserializerPluginConfiguration deserializer = bimServerClient.getServiceInterface().getSuggestedDeserializerForExtension("ifc", newProject.getOid());
// Checkin the file
bimServerClient.checkin(newProject.getOid(), "test", deserializer.getOid(), false, Flow.SYNC, new URL("https://github.com/opensourceBIM/TestFiles/raw/master/TestData/data/Jesse.1.ifc"));
// Refresh project info
newProject = bimServerClient.getServiceInterface().getProjectByPoid(newProject.getOid());
IfcModelInterface model = bimServerClient.getModel(newProject, newProject.getLastRevisionId(), true, false);
model.getAllWithSubTypes(IfcWallStandardCase.class);
} catch (Throwable e) {
e.printStackTrace();
if (e instanceof AssertionError) {
throw (AssertionError) e;
}
fail(e.getMessage());
}
}
use of org.bimserver.emf.IfcModelInterface in project BIMserver by opensourceBIM.
the class TestLoadCompleteModel method start.
@Test
public void start() {
try {
// New client
BimServerClientInterface bimServerClient = getFactory().create(new UsernamePasswordAuthenticationInfo("admin@bimserver.org", "admin"));
// Create a project
SProject project = bimServerClient.getServiceInterface().addProject("test" + Math.random(), "ifc2x3tc1");
// Look for a deserializer
SDeserializerPluginConfiguration deserializer = bimServerClient.getServiceInterface().getSuggestedDeserializerForExtension("ifc", project.getOid());
// Checkin file
bimServerClient.checkin(project.getOid(), "test", deserializer.getOid(), false, Flow.SYNC, new URL("https://github.com/opensourceBIM/TestFiles/raw/master/TestData/data/AC11-Institute-Var-2-IFC.ifc"));
// Refresh project
project = bimServerClient.getServiceInterface().getProjectByPoid(project.getOid());
// Load model without lazy loading (complete model at once)
IfcModelInterface model = bimServerClient.getModel(project, project.getLastRevisionId(), false, true);
// Change the window names
for (IfcWindow window : model.getAllWithSubTypes(IfcWindow.class)) {
window.setName(window.getName() + " Changed");
}
long newRoid = model.commit("Changed window names");
IfcModelInterface newModel = bimServerClient.getModel(project, newRoid, true, false);
List<IfcWindow> windows = newModel.getAllWithSubTypes(Ifc2x3tc1Package.eINSTANCE.getIfcWindow());
for (IfcWindow window : windows) {
assertTrue(window.getName().endsWith(" Changed"));
}
} catch (Exception e) {
fail(e.getMessage());
}
}
Aggregations