use of org.pentaho.platform.plugin.services.importexport.IRepositoryImportLogger in project pentaho-platform by pentaho.
the class RepositoryImportResourceTest method setUp.
@Before
public void setUp() throws ObjectFactoryException, PlatformImportException, DomainIdNullException, DomainAlreadyExistsException, DomainStorageException, IOException {
PentahoSystem.init();
IPentahoSession session = mock(IPentahoSession.class);
doReturn("sampleSession").when(session).getName();
PentahoSessionHolder.setSession(session);
handler = mock(SolutionImportHandler.class);
importer = mock(PentahoPlatformImporter.class);
policy = mock(IAuthorizationPolicy.class);
ITenant tenat = mock(ITenant.class);
resolver = mock(ITenantedPrincipleNameResolver.class);
doReturn(tenat).when(resolver).getTenant(anyString());
doReturn(REAL_USER).when(resolver).getPrincipleName(anyString());
policy = mock(IAuthorizationPolicy.class);
pentahoObjectFactory = mock(IPentahoObjectFactory.class);
iPlatformMimeResolver = mock(NameBaseMimeResolver.class);
iRepositoryImportLogger = mock(IRepositoryImportLogger.class);
catalogService = mock(MondrianCatalogHelper.class);
doReturn("xml").when(iPlatformMimeResolver).resolveMimeForFileName("");
doReturn(iRepositoryImportLogger).when(importer).getRepositoryImportLogger();
// for calling importFile in RepositoryImportResource
doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
handler.importFile(any(IPlatformImportBundle.class));
return null;
}
}).when(importer).importFile(any(IPlatformImportBundle.class));
// for calling importFile in PentahoPlatformImporter
doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
handler.getImportSession();
return null;
}
}).when(handler).importFile(any(IPlatformImportBundle.class));
// for calling getImportSession in SolutionImportHandler
doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
ImportSession importsession = ImportSession.getSession();
importsession.setManifest(mock(ExportManifest.class));
return null;
}
}).when(handler).getImportSession();
when(pentahoObjectFactory.objectDefined(anyString())).thenReturn(true);
when(pentahoObjectFactory.get(this.anyClass(), anyString(), any(IPentahoSession.class))).thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
if (invocation.getArguments()[0].equals(IAuthorizationPolicy.class)) {
return policy;
}
if (invocation.getArguments()[0].equals(ITenantedPrincipleNameResolver.class)) {
return resolver;
}
if (invocation.getArguments()[0].equals(IMondrianCatalogService.class)) {
return catalogService;
}
return null;
}
});
PentahoSystem.registerObjectFactory(pentahoObjectFactory);
PentahoSystem.registerObject(iPlatformMimeResolver);
PentahoSystem.registerObject(iRepositoryImportLogger);
PentahoSystem.registerObject(catalogService);
PentahoSystem.registerObject(handler);
PentahoSystem.registerObject(importer);
}
use of org.pentaho.platform.plugin.services.importexport.IRepositoryImportLogger in project pentaho-platform by pentaho.
the class PlatformImporterTest method testMatchingMimeAndHandler.
@Test
public void testMatchingMimeAndHandler() throws Exception {
List<IMimeType> mimeList = Collections.singletonList((IMimeType) new MimeType("text/xmi+xml", "xmi"));
IPlatformImportHandler mockImportHandler = mock(IPlatformImportHandler.class);
when(mockImportHandler.getMimeTypes()).thenReturn(mimeList);
List<IPlatformImportHandler> handlers = Collections.singletonList(mockImportHandler);
NameBaseMimeResolver nameResolver = new NameBaseMimeResolver();
PentahoSystem.registerObject(nameResolver);
// mock logger to prevent npe
IRepositoryImportLogger importLogger = new Log4JRepositoryImportLogger();
PentahoPlatformImporter importer = new PentahoPlatformImporter(handlers, new DefaultRepositoryContentConverterHandler(new HashMap<String, Converter>()));
importer.setRepositoryImportLogger(importLogger);
FileInputStream in = new FileInputStream(new File(TestResourceLocation.TEST_RESOURCES + "/ImportTest/steel-wheels.xmi"));
// With custom domain id
final IPlatformImportBundle bundle1 = (new RepositoryFileImportBundle.Builder().input(in).charSet("UTF-8").hidden(false).mime("text/xmi+xml").name("steel-wheels.xmi").comment("Test Metadata Import").withParam("domain-id", "parameterized-domain-id")).build();
importer.importFile(bundle1);
verify(mockImportHandler, times(1)).importFile(bundle1);
}
use of org.pentaho.platform.plugin.services.importexport.IRepositoryImportLogger in project pentaho-platform by pentaho.
the class ArchiveLoaderTest method testWillContinueToLoadOnException.
@Test
public void testWillContinueToLoadOnException() throws Exception {
final IPlatformImporter importer = mock(IPlatformImporter.class);
final FileInputStream inputStream = mock(FileInputStream.class);
final ArchiveLoader loader = createArchiveLoader(importer, inputStream);
final File directory = mock(File.class);
final File jobs = mock(File.class);
String jobsName = "jobs.zip";
when(jobs.getName()).thenReturn(jobsName);
final File reports = mock(File.class);
when(jobs.getPath()).thenReturn("/root/path/" + jobsName);
String reportsName = "reports.zip";
when(reports.getName()).thenReturn(reportsName);
when(reports.getPath()).thenReturn("/root/path/" + reportsName);
when(directory.listFiles(ZIPS_FILTER)).thenReturn(new File[] { jobs, reports });
Exception exception = new RuntimeException("exception thrown on purpose from testWillContinueToLoadOnException");
doThrow(exception).when(importer).importFile(argThat(bundleMatcher(jobsName, inputStream)));
IRepositoryImportLogger logger = mock(IRepositoryImportLogger.class);
when(importer.getRepositoryImportLogger()).thenReturn(logger);
loader.loadAll(directory, ZIPS_FILTER);
verify(importer).importFile(argThat(bundleMatcher(jobsName, inputStream)));
verify(importer).importFile(argThat(bundleMatcher(reportsName, inputStream)));
verify(jobs).renameTo(argThat(fileMatcher(jobs)));
verify(reports).renameTo(argThat(fileMatcher(reports)));
}
use of org.pentaho.platform.plugin.services.importexport.IRepositoryImportLogger in project pentaho-platform by pentaho.
the class RepositoryImportResource method doPostImport.
/**
* Attempts to import all files from the zip archive or single file. A log file is produced at the end of import.
*
* <p><b>Example Request:</b><br />
* POST pentaho/api/repo/files/import
* <br /><b>POST data:</b>
* <pre function="syntax.xml">
* ------WebKitFormBoundaryB9hzsGp4wR5SGAZD
* Content-Disposition: form-data; name="importDir"
*
* /public
* ------WebKitFormBoundaryB9hzsGp4wR5SGAZD
* Content-Disposition: form-data; name="fileUpload"; filename="test.csv"
* Content-Type: application/vnd.ms-excel
*
* ------WebKitFormBoundaryB9hzsGp4wR5SGAZD
* Content-Disposition: form-data; name="overwriteFile"
*
* true
* ------WebKitFormBoundaryB9hzsGp4wR5SGAZD
* Content-Disposition: form-data; name="overwriteAclPermissions"
*
* true
* ------WebKitFormBoundaryB9hzsGp4wR5SGAZD
* Content-Disposition: form-data; name="applyAclPermissions"
*
* true
* ------WebKitFormBoundaryB9hzsGp4wR5SGAZD
* Content-Disposition: form-data; name="retainOwnership"
*
* true
* ------WebKitFormBoundaryB9hzsGp4wR5SGAZD
* Content-Disposition: form-data; name="charSet"
*
* UTF-8
* ------WebKitFormBoundaryB9hzsGp4wR5SGAZD
* Content-Disposition: form-data; name="logLevel"
*
* INFO
* ------WebKitFormBoundaryd1z6iZhXyx12RYxV
* Content-Disposition: form-data; name="fileNameOverride"
*
* fileNameOverriden.csv
* ------WebKitFormBoundaryd1z6iZhXyx12RYxV--
* </pre>
* </p>
*
* @param importDir JCR Directory to which the zip structure or single file will be uploaded to.
* @param fileUpload Input stream for the file.
* @param overwriteFile The flag indicates ability to overwrite existing file.
* @param overwriteAclPermissions The flag indicates ability to overwrite Acl permissions.
* @param applyAclPermissions The flag indicates ability to apply Acl permissions.
* @param retainOwnership The flag indicates ability to retain ownership.
* @param charSet The charset for imported file.
* @param logLevel The level of logging.
* @param fileNameOverride If present and the content represents a single file, this parameter contains the filename to use
* when storing the file in the repository. If not present, the fileInfo.getFileName will be used.
* Note that the later cannot reliably handle foreign character sets.
*
* @return A jax-rs Response object with the appropriate header and body.
*
* <p><b>Example Response:</b></p>
* <pre function="syntax.xml">
* <html>
* <head>
* <title>Repository Import Log</title>
* </head>
* <body bgcolor="#FFFFFF" topmargin="6" leftmargin="6" style="font-family: arial,sans-serif; font-size: x-small">
* <hr size="1" noshade>
* Log session start time Thu Feb 26 11:04:19 BRT 2015<br>
* <br>
* <table cellspacing="0" cellpadding="4" border="1" bordercolor="#224466" width="100%">
* <tr style="background: #336699; color: #FFFFFF; text-align: left">
* <th>Import File</th>
* <th>Level</th>
* <th>Message</th>
* </tr>
* <td title="importFile">/public</td>
* <td title="Level">INFO</td>
* <td title="Message">Start Import Job</td>
* </tr>
* <td title="importFile">/public/fileNameOverriden.csv</td>
* <td title="Level">INFO</td>
* <td title="Message">Start File Import</td>
* </tr>
* <td title="importFile">/public/fileNameOverriden.csv</td>
* <td title="Level"><font color="#993300"><strong>WARN</strong></font></td>
* <td title="Message">fileNameOverriden.csv</td>
* </tr>
* <td title="importFile">/public</td>
* <td title="Level">INFO</td>
* <td title="Message">End Import Job</td>
* </tr>
* </table>
* <br>
* </body></html>
* </pre>
*/
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.TEXT_HTML)
@Facet(name = "Unsupported")
public Response doPostImport(@FormDataParam("importDir") String importDir, @FormDataParam("fileUpload") InputStream fileUpload, @FormDataParam("overwriteFile") String overwriteFile, @FormDataParam("overwriteAclPermissions") String overwriteAclPermissions, @FormDataParam("applyAclPermissions") String applyAclPermission, @FormDataParam("retainOwnership") String retainOwnership, @FormDataParam("charSet") String charSet, @FormDataParam("logLevel") String logLevel, @FormDataParam("fileUpload") FormDataContentDisposition fileInfo, @FormDataParam("fileNameOverride") String fileNameOverride) {
IRepositoryImportLogger importLogger = null;
ByteArrayOutputStream importLoggerStream = new ByteArrayOutputStream();
boolean logJobStarted = false;
if (StringUtils.isBlank(charSet)) {
charSet = DEFAULT_CHAR_SET;
}
try {
validateAccess(importDir);
boolean overwriteFileFlag = ("false".equals(overwriteFile) ? false : true);
boolean overwriteAclSettingsFlag = ("true".equals(overwriteAclPermissions) ? true : false);
boolean applyAclSettingsFlag = ("true".equals(applyAclPermission) ? true : false);
boolean retainOwnershipFlag = ("true".equals(retainOwnership) ? true : false);
// If logLevel is null then we will default to ERROR
if (logLevel == null || logLevel.length() <= 0) {
logLevel = "ERROR";
}
// Non-admins cannot process a manifest
FileService fileService = new FileService();
if (!fileService.doCanAdminister()) {
applyAclSettingsFlag = false;
retainOwnershipFlag = true;
}
Level level = Level.toLevel(logLevel);
ImportSession.getSession().setAclProperties(applyAclSettingsFlag, retainOwnershipFlag, overwriteAclSettingsFlag);
// The fileNameOverride was added because the formDataContentDispositionfile object cannot reliable
// contain non US-ASCII characters. See RFC283 section 2.3 for details
String fileName = fileNameOverride != null ? fileNameOverride : fileInfo.getFileName();
RepositoryFileImportBundle.Builder bundleBuilder = new RepositoryFileImportBundle.Builder();
bundleBuilder.input(fileUpload);
bundleBuilder.charSet(charSet);
bundleBuilder.path(importDir);
bundleBuilder.overwriteFile(overwriteFileFlag);
bundleBuilder.applyAclSettings(applyAclSettingsFlag);
bundleBuilder.overwriteAclSettings(overwriteAclSettingsFlag);
bundleBuilder.retainOwnership(retainOwnershipFlag);
bundleBuilder.name(fileName);
IPlatformImportBundle bundle = bundleBuilder.build();
IPlatformMimeResolver mimeResolver = PentahoSystem.get(IPlatformMimeResolver.class);
String mimeTypeFromFile = mimeResolver.resolveMimeForFileName(fileName);
if (mimeTypeFromFile == null) {
return Response.ok("INVALID_MIME_TYPE", MediaType.TEXT_HTML).build();
}
bundleBuilder.mime(mimeTypeFromFile);
IPlatformImporter importer = PentahoSystem.get(IPlatformImporter.class);
importLogger = importer.getRepositoryImportLogger();
final String mimeType = bundle.getMimeType() != null ? bundle.getMimeType() : mimeResolver.resolveMimeForBundle(bundle);
if (mimeType == null) {
return Response.ok("INVALID_MIME_TYPE", MediaType.TEXT_HTML).build();
}
logJobStarted = true;
importLogger.startJob(importLoggerStream, importDir, level);
importer.importFile(bundle);
// Flush the Mondrian cache to show imported data-sources.
IMondrianCatalogService mondrianCatalogService = PentahoSystem.get(IMondrianCatalogService.class, "IMondrianCatalogService", PentahoSessionHolder.getSession());
mondrianCatalogService.reInit(PentahoSessionHolder.getSession());
} catch (PentahoAccessControlException e) {
return Response.serverError().entity(e.toString()).build();
} catch (Exception e) {
return Response.serverError().entity(e.toString()).build();
} finally {
ImportSession.clearSession();
if (logJobStarted == true) {
importLogger.endJob();
}
}
String responseBody;
try {
responseBody = importLoggerStream.toString(charSet);
} catch (UnsupportedEncodingException e) {
LOGGER.error("Encoding of response body is failed. (charSet=" + charSet + ")", e);
responseBody = importLoggerStream.toString();
}
return Response.ok(responseBody, MediaType.TEXT_HTML).build();
}
use of org.pentaho.platform.plugin.services.importexport.IRepositoryImportLogger in project pentaho-platform by pentaho.
the class FileServiceTest method testSystemRestore.
@Test
public void testSystemRestore() throws Exception {
InputStream inputStreamMock = mock(InputStream.class);
IAuthorizationPolicy authorizationPolicy = mock(IAuthorizationPolicy.class);
IRepositoryImportLogger iRepositoryImportLogger = mock(IRepositoryImportLogger.class);
doReturn(authorizationPolicy).when(fileService).getPolicy();
doReturn(true).when(authorizationPolicy).isAllowed(RepositoryReadAction.NAME);
doReturn(true).when(authorizationPolicy).isAllowed(RepositoryCreateAction.NAME);
doReturn(true).when(authorizationPolicy).isAllowed(AdministerSecurityAction.NAME);
doReturn(iRepositoryImportLogger).when(platformImporter).getRepositoryImportLogger();
fileService.systemRestore(inputStreamMock, "true", "false", "true");
verify(fileService).doCanAdminister();
verify(iRepositoryImportLogger).startJob(any(), anyString(), any());
verify(iRepositoryImportLogger).endJob();
ArgumentCaptor<RepositoryFileImportBundle> argumentCaptor = ArgumentCaptor.forClass(RepositoryFileImportBundle.class);
verify(platformImporter).importFile(argumentCaptor.capture());
RepositoryFileImportBundle bundle = argumentCaptor.getValue();
assertTrue(bundle.getInputStream() == inputStreamMock);
assertEquals("UTF-8", bundle.getCharSet());
assertEquals(RepositoryFile.HIDDEN_BY_DEFAULT, bundle.isHidden());
assertEquals(RepositoryFile.SCHEDULABLE_BY_DEFAULT, bundle.isSchedulable());
assertEquals("/", bundle.getPath());
assertEquals(true, bundle.overwriteInRepository());
assertEquals("SystemBackup.zip", bundle.getName());
assertFalse(bundle.isApplyAclSettings());
assertTrue(bundle.isRetainOwnership());
assertTrue(bundle.isOverwriteAclSettings());
assertTrue(bundle.isPreserveDsw());
ImportSession session = ImportSession.getSession();
assertFalse(session.isApplyAclSettings());
assertTrue(session.isRetainOwnership());
assertTrue(session.isOverwriteAclSettings());
}
Aggregations