use of org.bimserver.bimbots.BimBotsOutput in project BIMserver by opensourceBIM.
the class BimBotRunner method run.
@Override
public void run() {
try {
Thread.currentThread().setName("BIMbot [" + foundService.getName() + "]");
BimBotsOutput bimBotsOutput = runBimBot();
ObjectNode message = objectMapper.createObjectNode();
message.put("topicId", topicId);
message.put("type", "output");
message.set("payload", bimBotsOutput.toJson());
streamingSocketInterface.send(message);
byte[] data = bimBotsOutput.getData();
streamingSocketInterface.send(data, 0, data.length);
} catch (Throwable e) {
LOGGER.error("", e);
}
}
use of org.bimserver.bimbots.BimBotsOutput in project BIMserver by opensourceBIM.
the class BimBotClient method main.
public static void main(String[] args) {
try (BimBotClient bimBotCaller = new BimBotClient("http://localhost:8080/services", "a70abb752c5a04f5ccce7ea1b79b85c045c594c3d7fb23d6f28e8e8ad04f2750477ec5706013f2bc07be2b9555fd44df")) {
BimBotsInput bimBotsInput = new BimBotsInput(SchemaName.IFC_STEP_2X3TC1, Files.toByteArray(new File("C:\\Git\\TestFiles\\TestData\\data\\export3.ifc")));
BimBotsOutput bimBotsOutput = bimBotCaller.call("3866702", bimBotsInput);
ObjectNode readValue = new ObjectMapper().readValue(bimBotsOutput.getData(), ObjectNode.class);
System.out.println(readValue.toString());
} catch (IOException e) {
e.printStackTrace();
} catch (BimBotExecutionException e) {
e.printStackTrace();
}
}
use of org.bimserver.bimbots.BimBotsOutput in project BIMserver by opensourceBIM.
the class BimBotClient method call.
public BimBotsOutput call(String identifier, BimBotsInput input) throws BimBotExecutionException {
HttpPost post = new HttpPost(baseAddress + "/" + identifier);
post.setHeader("Input-Type", input.getSchemaName());
post.setHeader("Token", token);
post.setHeader("Accept-Flow", "SYNC");
post.setEntity(new ByteArrayEntity(input.getData()));
try {
CloseableHttpResponse httpResponse = httpClient.execute(post);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
Header outputType = httpResponse.getFirstHeader("Output-Type");
if (outputType == null) {
throw new BimBotExecutionException("No Output-Type given");
}
String outputSchema = outputType.getValue();
BimBotsOutput bimBotsOutput = new BimBotsOutput(outputSchema, ByteStreams.toByteArray(httpResponse.getEntity().getContent()));
return bimBotsOutput;
} else {
throw new BimBotExecutionException("Unexpected HTTP status code " + httpResponse.getStatusLine().toString());
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
use of org.bimserver.bimbots.BimBotsOutput in project BIMserver by opensourceBIM.
the class BimBotAbstractService method newRevision.
@Override
public void newRevision(RunningService runningService, BimServerClientInterface bimServerClientInterface, long poid, long roid, String userToken, long soid, SObjectType settings) throws Exception {
try {
long start = System.nanoTime();
byte[] data = null;
if (needsRawInput()) {
// We need to generate some, by serializing the current model
SSerializerPluginConfiguration serializerByContentType = bimServerClientInterface.getServiceInterface().getSerializerByContentType("application/ifc");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
bimServerClientInterface.download(roid, serializerByContentType.getOid(), outputStream);
data = outputStream.toByteArray();
}
BimBotsInput input = new BimBotsInput(SchemaName.IFC_STEP_2X3TC1, data);
SProject project = bimServerClientInterface.getServiceInterface().getProjectByPoid(poid);
String contextId = project.getUuid().toString();
IfcModelInterface model = bimServerClientInterface.getModel(project, roid, preloadCompleteModel(), false, requiresGeometry());
input.setIfcModel(model);
BimBotContext bimBotContext = new BimBotContext() {
@Override
public void updateProgress(String label, int percentage) {
}
@Override
public String getCurrentUser() {
return runningService.getCurrentUser();
}
@Override
public String getContextId() {
return contextId;
}
};
BimBotsOutput output = runBimBot(input, bimBotContext, new PluginConfiguration(settings));
long end = System.nanoTime();
if (output.getSchemaName().contentEquals(SchemaName.IFC_STEP_2X3TC1.name()) || output.getSchemaName().contentEquals(SchemaName.IFC_STEP_4.name())) {
// There is no point in storing the retuned model as extended data, lets make a new revision
output.getModel().checkin(poid, output.getTitle());
} else {
SFile file = new SFile();
SExtendedData extendedData = new SExtendedData();
extendedData.setTimeToGenerate((end - start) / 1000000);
extendedData.setTitle(output.getTitle());
extendedData.setSize(output.getData().length);
file.setFilename(output.getContentDisposition());
SExtendedDataSchema extendedDataSchemaByName = null;
try {
extendedDataSchemaByName = bimServerClientInterface.getServiceInterface().getExtendedDataSchemaByName(output.getSchemaName());
} catch (Exception e) {
extendedDataSchemaByName = new SExtendedDataSchema();
extendedDataSchemaByName.setContentType(output.getContentType());
extendedDataSchemaByName.setName(output.getSchemaName());
bimServerClientInterface.getServiceInterface().addExtendedDataSchema(extendedDataSchemaByName);
}
extendedData.setSchemaId(extendedDataSchemaByName.getOid());
file.setData(output.getData());
file.setSize(output.getData().length);
file.setMime(output.getContentType());
long fileId = bimServerClientInterface.getServiceInterface().uploadFile(file);
extendedData.setFileId(fileId);
bimServerClientInterface.getServiceInterface().addExtendedDataToRevision(roid, extendedData);
}
} catch (BimBotsException e) {
LOGGER.error("", e);
} catch (Throwable e) {
LOGGER.error("", e);
}
}
use of org.bimserver.bimbots.BimBotsOutput in project BIMserver by opensourceBIM.
the class BimBotRunner method runBimBot.
public BimBotsOutput runBimBot() throws UserException, IOException {
BimBotContext bimBotContext = new BimBotContext() {
@Override
public void updateProgress(String label, int percentage) {
if (streamingSocketInterface != null) {
ObjectNode message = objectMapper.createObjectNode();
message.put("type", "progress");
message.put("topicId", topicId);
ObjectNode payload = objectMapper.createObjectNode();
payload.put("progress", percentage);
payload.put("label", label);
message.set("payload", payload);
streamingSocketInterface.send(message);
}
}
public String getCurrentUser() {
return authorization.getUsername();
}
public String getContextId() {
return contextId;
}
};
try (DatabaseSession session = bimServer.getDatabase().createSession(OperationType.READ_ONLY)) {
ServiceMap serviceMap = bimServer.getServiceFactory().get(authorization, AccessMethod.INTERNAL);
ServiceInterface serviceInterface = serviceMap.get(ServiceInterface.class);
if (bimServer.getServerSettingsCache().getServerSettings().isStoreServiceRuns()) {
long start = System.nanoTime();
// 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
byte[] data = null;
if (bimBotsServiceInterface.needsRawInput()) {
// We need the raw input later on, lets just get it now
data = ByteStreams.toByteArray(inputStream);
// Make a clean inputstream that uses the data as the original won't be available after this
inputStream = new ByteArrayInputStream(data);
}
SchemaName schema = SchemaName.valueOf(inputType);
String projectSchema = getProjectSchema(serviceInterface, schema);
SProject project = null;
String uuid = contextId;
if (uuid != null) {
project = serviceInterface.getProjectByUuid(uuid);
} else {
project = serviceInterface.addProject("tmp-" + new Random().nextInt(), projectSchema);
}
SDeserializerPluginConfiguration deserializer = serviceInterface.getSuggestedDeserializerForExtension("ifc", project.getOid());
if (deserializer == null) {
throw new BimBotsException("No deserializer found", BimBotDefaultErrorCode.NO_DESERIALIZER);
}
Long topicId = serviceInterface.initiateCheckin(project.getOid(), deserializer.getOid());
ProgressTopic progressTopic = null;
VirtualEndPoint virtualEndpoint = null;
try {
progressTopic = bimServer.getNotificationsManager().getProgressTopic(topicId);
virtualEndpoint = new VirtualEndPoint() {
@Override
public NotificationInterface getNotificationInterface() {
return new NotificationInterfaceAdaptor() {
@Override
public void progress(Long topicId, SLongActionState state) throws UserException, ServerException {
bimBotContext.updateProgress(state.getTitle(), state.getProgress());
}
};
}
};
progressTopic.register(virtualEndpoint);
} catch (TopicRegisterException e1) {
e1.printStackTrace();
}
serviceInterface.checkinInitiatedSync(topicId, project.getOid(), "Auto checkin", deserializer.getOid(), -1L, "s", new DataHandler(new InputStreamDataSource(inputStream)), false);
project = serviceInterface.getProjectByPoid(project.getOid());
PackageMetaData packageMetaData = bimServer.getMetaDataManager().getPackageMetaData(project.getSchema());
BasicIfcModel model = new BasicIfcModel(packageMetaData, null);
model.setPluginClassLoaderProvider(bimServer.getPluginManager());
try {
Revision revision = session.get(project.getLastRevisionId(), OldQuery.getDefault());
session.getMap(model, new OldQuery(packageMetaData, project.getId(), revision.getId(), revision.getOid(), Deep.NO));
model.getModelMetaData().setIfcHeader(revision.getLastConcreteRevision().getIfcHeader());
} catch (BimserverDatabaseException e) {
e.printStackTrace();
}
BimServerBimBotsInput input = new BimServerBimBotsInput(bimServer, authorization.getUoid(), inputType, data, model, false);
BimBotsOutput output = bimBotsServiceInterface.runBimBot(input, bimBotContext, settings);
long end = System.nanoTime();
if (output.getModel() != null) {
SerializerPlugin plugin = bimServer.getPluginManager().getSerializerPlugin("org.bimserver.ifc.step.serializer.Ifc2x3tc1StepSerializerPlugin");
Serializer serializer = plugin.createSerializer(new PluginConfiguration());
serializer.init(output.getModel(), new ProjectInfo(), true);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
serializer.writeToOutputStream(baos, null);
output.setData(baos.toByteArray());
output.setContentType("application/ifc");
}
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);
long ms = (end - start) / 1000000;
extendedData.setTimeToGenerate(ms);
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);
output.setContextId(project.getUuid().toString());
if (progressTopic != null) {
try {
progressTopic.unregister(virtualEndpoint);
} catch (TopicRegisterException e) {
e.printStackTrace();
}
}
return output;
} 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");
String projectSchema = getProjectSchema(serviceInterface, SchemaName.valueOf(inputType));
Schema schema = Schema.valueOf(projectSchema.toUpperCase());
DeserializerPlugin deserializerPlugin = bimServer.getPluginManager().getFirstDeserializer("ifc", schema, true);
if (deserializerPlugin == null) {
throw new BimBotsException("No deserializer plugin found", BimBotDefaultErrorCode.NO_DESERIALIZER);
}
byte[] data = IOUtils.toByteArray(inputStream);
Deserializer deserializer = deserializerPlugin.createDeserializer(new PluginConfiguration());
PackageMetaData packageMetaData = bimServer.getMetaDataManager().getPackageMetaData(schema.name());
deserializer.init(packageMetaData);
IfcModelInterface model = deserializer.read(new ByteArrayInputStream(data), inputType, data.length, null);
BimServerBimBotsInput input = new BimServerBimBotsInput(bimServer, authorization.getUoid(), inputType, data, model, true);
BimBotsOutput output = bimBotsServiceInterface.runBimBot(input, bimBotContext, new PluginConfiguration(foundService.getSettings()));
return output;
}
} catch (BimBotsException e) {
ObjectNode errorNode = OBJECT_MAPPER.createObjectNode();
errorNode.put("code", e.getErrorCode());
errorNode.put("message", e.getMessage());
BimBotsOutput bimBotsOutput = new BimBotsOutput("ERROR", errorNode.toString().getBytes(Charsets.UTF_8));
return bimBotsOutput;
} catch (Throwable e) {
LOGGER.error("", e);
ObjectNode errorNode = OBJECT_MAPPER.createObjectNode();
errorNode.put("code", 500);
// TODO should not leak this much info to called, but for now this is useful debugging info
errorNode.put("message", "Unknown error: " + e.getMessage());
BimBotsOutput bimBotsOutput = new BimBotsOutput("ERROR", errorNode.toString().getBytes(Charsets.UTF_8));
return bimBotsOutput;
}
}
Aggregations