/** {@inheritDoc} */ public boolean deleteModel(String id, boolean removeFromDisk) throws ReportModelOperationException { try { ReportDesignModel model = this.getModelByIdOrName(id, false); if (model != null) { boolean result = true; // 如果存在发布态报表,删除发布态报表 if (this.getModelByIdOrName(id, true) != null) { /** 已经发布了,不能删除 TODO 应该有下线操作,下线以后把发布的报表删除,才能够进一步删除正在开发的报表 */ return false; } result = fileService.rm(generateDevReportLocation(model)); // 尝试删除原有命名方式命名的报表 if (!result) { result = fileService.rm(generateOriDevReportLocation(model)); } logger.info("delete report " + (result ? "successfully" : "failed")); return result; } return false; } catch (FileServiceException e) { logger.error(e.getMessage(), e); throw new ReportModelOperationException(e); } }
/** {@inheritDoc} */ @Override public boolean updateReportModel(ReportDesignModel model, boolean modelInCache) { ReportDesignModel persModel = DeepcopyUtils.deepCopy(model); // 如果当前model在编辑状态,需要更新持久化的model的name if (isNameExist(model.getName(), model.getId())) { return false; } if (modelInCache) { persModel = getModelByIdOrName(model.getId(), false); } try { try { this.deleteModel(persModel, true); } catch (Exception e) { try { fileService.rm(generateOriDevReportLocation(persModel)); } catch (FileServiceException e1) { throw new ReportModelOperationException(e1); } } persModel.setName(model.getName()); this.saveOrUpdateModel(persModel); } catch (ReportModelOperationException e) { logger.error(e.getMessage(), e); return false; } return true; }
@Deprecated private String getOriReleaseReportLocation(ReportDesignModel model) { if (model == null) { return null; } String name = model.getName(); String productLine = ContextManager.getProductLine(); try { String[] listFile = fileService.ls(this.getReleaseReportDir()); for (String file : listFile) { if (file.startsWith(model.getId())) { return productLine + File.separator + reportBaseDir + File.separator + "release" + File.separator + file; } } } catch (FileServiceException e) { logger.error(e.getMessage(), e); } return productLine + File.separator + reportBaseDir + File.separator + "release" + File.separator + model.getId() + Constants.FILE_NAME_SEPERATOR + name; }
/** {@inheritDoc} */ @Override public boolean isNameExist(String name) { if (name == null) { return false; } String[] listFile = null; try { listFile = fileService.ls(this.getDevReportDir()); } catch (FileServiceException e) { logger.debug(e.getMessage(), e); } if (listFile == null || listFile.length == 0) { return false; } for (String file : listFile) { if (file.contains(".")) { continue; } String[] tmpArray = file.split(FILE_SPLIT_REG); if (name.equals(tmpArray[0]) || name.equals(tmpArray[1]) || String.valueOf(name.hashCode()).equals(tmpArray[1])) { return true; } } return false; }
/** * 升级方法 * * @param model * @return String */ @Deprecated private String generateOriDevReportLocation(ReportDesignModel model) { if (model == null) { return null; } StringBuilder builder = new StringBuilder(); builder.append(getDevReportDir()); builder.append(File.separator); String name = null; try { String[] listFile = fileService.ls(this.getDevReportDir()); for (String file : listFile) { if (file.startsWith(model.getId())) { name = file; builder.append(name); break; } } } catch (FileServiceException e) { logger.error(e.getMessage(), e); } if (name == null) { builder.append(model.getId()); builder.append(Constants.FILE_NAME_SEPERATOR); builder.append(name); builder.append(Constants.FILE_NAME_SEPERATOR); builder.append(model.getDsId()); } return builder.toString(); }
/** * @param model * @param removeFromDisk */ private void deleteModel(ReportDesignModel model, boolean removeFromDisk) throws ReportModelOperationException { try { // TODO 升级兼容 后续考虑删除 fileService.rm(generateDevReportLocation(model)); logger.info("delete report successfully"); } catch (FileServiceException e) { logger.warn(e.getMessage(), e); throw new ReportModelOperationException(e); } }
/** {@inheritDoc} */ @Override public ReportDesignModel saveOrUpdateModel(ReportDesignModel model) throws ReportModelOperationException { if (model == null) { logger.warn("current model is null"); throw new ReportModelOperationException("model can not be null"); } if (StringUtils.isEmpty(model.getName())) { logger.debug("model's name can not be empty"); throw new ReportModelOperationException("model's name can not be empty"); } if (StringUtils.isEmpty(model.getId())) { model.setId(UuidGeneratorUtils.generate()); } try { ReportDesignModel oldReport = getModelByIdOrName(model.getId(), false); if (oldReport != null) { try { this.deleteModel(oldReport, true); } catch (Exception e) { try { fileService.rm(generateOriDevReportLocation(model)); } catch (Exception e1) { logger.error(e.getMessage(), e); } } } boolean rs = fileService.write(generateDevReportLocation(model), SerializationUtils.serialize(model)); if (rs) { return model; } } catch (FileServiceException e) { logger.error(e.getMessage(), e); } return null; }
/** {@inheritDoc} */ @Override public ReportDesignModel getModelByIdOrName(String idOrName, boolean isRelease) { String baseDir = null; if (!isRelease) { baseDir = getDevReportDir(); } else { baseDir = getReleaseReportDir(); } String[] modelFileList = null; try { modelFileList = fileService.ls(baseDir); } catch (FileServiceException e) { logger.debug(e.getMessage(), e); } if (modelFileList == null || modelFileList.length == 0) { logger.warn("can not get report model define in directory: " + baseDir); return null; } try { for (String modelFile : modelFileList) { if (modelFile.contains(".")) { continue; } String[] tmpArray = modelFile.split(FILE_SPLIT_REG); if (idOrName.equals(tmpArray[0]) || tmpArray[1].equals(idOrName) || String.valueOf(idOrName.hashCode()).equals(tmpArray[1])) { byte[] content = fileService.read(baseDir + File.separator + modelFile); ReportDesignModel model = (ReportDesignModel) SerializationUtils.deserialize(content); return model; } } } catch (Exception e) { logger.error(e.getMessage(), e); } return null; }
/** {@inheritDoc} */ @Override public ReportDesignModel[] queryAllModels(boolean released) { try { String[] listFile = null; if (released) { listFile = fileService.ls(this.getReleaseReportDir()); } else { listFile = fileService.ls(this.getDevReportDir()); } if (listFile == null || listFile.length == 0) { return new ReportDesignModel[0]; } ReportDesignModel[] modelList = buildResult(listFile, released); List<ReportDesignModel> reportList = Arrays.asList(modelList); Collections.sort( reportList, new Comparator<ReportDesignModel>() { @Override public int compare(ReportDesignModel o1, ReportDesignModel o2) { if (o1 == null || StringUtils.isEmpty(o1.getName())) { return -1; } if (o2 == null) { return 0; } return o1.getName().compareTo(o2.getName()); } }); return reportList.toArray(new ReportDesignModel[0]); } catch (FileServiceException e) { logger.error(e.getMessage(), e); } return new ReportDesignModel[0]; }
/** * 通过文件内容构建报表模型 * * @param listFile * @param released * @return */ private ReportDesignModel[] buildResult(String[] listFile, boolean released) { final List<ReportDesignModel> rs = new ArrayList<ReportDesignModel>(); String reportDir = null; if (released) { reportDir = this.getReleaseReportDir(); } else { reportDir = getDevReportDir(); } for (final String f : listFile) { if (f.contains(".")) { continue; } try { byte[] content = fileService.read(reportDir + File.separator + f); ReportDesignModel model = (ReportDesignModel) SerializationUtils.deserialize(content); rs.add(model); } catch (Exception e) { logger.error(e.getMessage(), e); } } return rs.toArray(new ReportDesignModel[0]); }
/** {@inheritDoc} */ @Override public List<String> lsReportWithDsId(String id) { String[] modelFileList = null; try { modelFileList = fileService.ls(getDevReportDir()); } catch (FileServiceException e) { logger.debug(e.getMessage(), e); return Lists.newArrayList(); } if (modelFileList == null || modelFileList.length == 0) { return Lists.newArrayList(); } List<String> rs = Lists.newArrayList(); for (String str : modelFileList) { if (str.contains(id)) { rs.add( str.substring( str.indexOf(Constants.FILE_NAME_SEPERATOR), str.lastIndexOf(Constants.FILE_NAME_SEPERATOR)) .replace(Constants.FILE_NAME_SEPERATOR, "")); } } return rs; }
public boolean isNameExist(String name, String id) { if (name == null) { return false; } String[] listFile = null; try { listFile = fileService.ls(this.getDevReportDir()); } catch (FileServiceException e) { logger.debug(e.getMessage(), e); } if (listFile == null || listFile.length == 0) { return false; } String idTarget = id + Constants.FILE_NAME_SEPERATOR; String nameTarget = Constants.FILE_NAME_SEPERATOR + name.hashCode() + Constants.FILE_NAME_SEPERATOR; for (String file : listFile) { // 名称相同,id不相同 if (!file.startsWith(idTarget) && file.contains(nameTarget)) { return true; } } return false; }
/** * {@inheritDoc} * * @throws DataSourceOperationException */ @Override public boolean publishReport(ReportDesignModel model, String securityKey) throws ReportModelOperationException, DataSourceOperationException { boolean result = false; String devReportLocation = this.generateDevReportLocation(model); String realeaseLocation = this.getReleaseReportLocation(model); try { // 删除原来已经发布的报表,如果不存在,忽略此处异常 ReportDesignModel tmp = this.getModelByIdOrName(model.getId(), true); if (tmp != null) { try { fileService.rm(getReleaseReportLocation(tmp)); } catch (Exception e) { fileService.rm(getOriReleaseReportLocation(tmp)); } } } catch (FileServiceException e1) { logger.info(e1.getMessage(), e1); } try { result = this.fileService.copy(devReportLocation, realeaseLocation); } catch (FileServiceException e) { logger.error(e.getMessage(), e); throw new ReportModelOperationException("发布报表失败!"); } if (!result) { logger.error("拷贝报表失败!"); throw new ReportModelOperationException("发布报表失败!"); } /** 发布 */ DataSourceDefine dsDefine; DataSourceInfo dsInfo; try { dsDefine = dsService.getDsDefine(model.getDsId()); DataSourceConnectionService<?> dsConnService = DataSourceConnectionServiceFactory.getDataSourceConnectionServiceInstance( dsDefine.getDataSourceType().name()); dsInfo = dsConnService.parseToDataSourceInfo(dsDefine, securityKey); } catch (DataSourceOperationException e) { logger.error("Fail in Finding datasource define. ", e); throw e; } catch (DataSourceConnectionException e) { logger.error("Fail in parse datasource to datasourceInfo.", e); throw new DataSourceOperationException(e); } List<Cube> cubes = Lists.newArrayList(); for (ExtendArea area : model.getExtendAreaList()) { try { if ((area.getType() != ExtendAreaType.TABLE && area.getType() != ExtendAreaType.LITEOLAP_TABLE && area.getType() != ExtendAreaType.CHART && area.getType() != ExtendAreaType.LITEOLAP_CHART) || area.getType() == ExtendAreaType.PLANE_TABLE || QueryUtils.isFilterArea(area.getType())) { continue; } Cube cube = QueryUtils.getCubeWithExtendArea(model, area); cubes.add(cube); } catch (QueryModelBuildException e) { logger.warn("It seems that logicmodel of area is null. Ingore this area. "); continue; } } if (cubes.size() == 0) { logger.info("cube is empty, don't need to create index!"); return true; } new Thread() { public void run() { MiniCubeConnection connection = MiniCubeDriverManager.getConnection(dsInfo); connection.publishCubes(cubes, dsInfo); } }.start(); return true; }