/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.directory.studio.ldapbrowser.ui.views.modificationlogs; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import org.apache.directory.studio.connection.core.Connection; import org.apache.directory.studio.connection.core.ConnectionCorePlugin; import org.apache.directory.studio.connection.core.io.jndi.LdifModificationLogger; import org.apache.directory.studio.ldapbrowser.common.BrowserCommonActivator; import org.apache.directory.studio.ldapbrowser.common.actions.BrowserSelectionUtils; import org.apache.directory.studio.ldapbrowser.core.BrowserCorePlugin; import org.apache.directory.studio.ldapbrowser.core.events.AttributesInitializedEvent; import org.apache.directory.studio.ldapbrowser.core.events.ChildrenInitializedEvent; import org.apache.directory.studio.ldapbrowser.core.events.EntryModificationEvent; import org.apache.directory.studio.ldapbrowser.core.events.EntryUpdateListener; import org.apache.directory.studio.ldapbrowser.core.events.EventRegistry; import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection; import org.apache.directory.studio.ldapbrowser.ui.views.connection.ConnectionView; import org.apache.directory.studio.ldifparser.model.container.LdifContainer; import org.eclipse.jface.viewers.ISelection; import org.eclipse.ui.INullSelectionListener; import org.eclipse.ui.IWorkbenchPart; /** * The ModificationLogsViewUniversalListener manages all events for the modification logs view. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class ModificationLogsViewUniversalListener implements EntryUpdateListener { /** The modification log view. */ private ModificationLogsView view; /** The current input */ private ModificationLogsViewInput input; /** Listener that listens for selections of connections */ private INullSelectionListener connectionSelectionListener = new INullSelectionListener() { /** * {@inheritDoc} * * This implementation sets the input when another connection was selected. */ public void selectionChanged( IWorkbenchPart part, ISelection selection ) { if ( view != null && part != null ) { if ( view.getSite().getWorkbenchWindow() == part.getSite().getWorkbenchWindow() ) { Connection[] connections = BrowserSelectionUtils.getConnections( selection ); if ( connections.length == 1 ) { IBrowserConnection connection = BrowserCorePlugin.getDefault().getConnectionManager() .getBrowserConnectionById( connections[0].getId() ); ModificationLogsViewInput input = new ModificationLogsViewInput( connection, 0 ); setInput( input ); scrollToNewest(); } } } } }; /** * Creates a new instance of ModificationLogsViewUniversalListener. * * @param view the modification logs view */ public ModificationLogsViewUniversalListener( ModificationLogsView view ) { this.view = view; this.input = null; EventRegistry.addEntryUpdateListener( this, BrowserCommonActivator.getDefault().getEventRunner() ); view.getSite().getWorkbenchWindow().getSelectionService().addPostSelectionListener( ConnectionView.getId(), connectionSelectionListener ); } /** * Disposed this listener */ public void dispose() { if ( view != null ) { view.getSite().getWorkbenchWindow().getSelectionService().removePostSelectionListener( ConnectionView.getId(), connectionSelectionListener ); EventRegistry.removeEntryUpdateListener( this ); view = null; } } /** * Refreshes the input. */ void refreshInput() { ModificationLogsViewInput newInput = input; input = null; setInput( newInput ); } /** * Sets the input. * * @param input the input */ void setInput( ModificationLogsViewInput input ) { // only if another connection is selected if ( this.input != input && input.getBrowserConnection().getConnection() != null ) { this.input = input; LdifModificationLogger modificationLogger = ConnectionCorePlugin.getDefault().getLdifModificationLogger(); if ( ( input != null ) && ( input.getBrowserConnection() != null ) && ( input.getBrowserConnection().getConnection() != null ) && ( modificationLogger != null ) ) { // load file %u %g StringBuffer sb = new StringBuffer(); File[] files = modificationLogger.getFiles( input.getBrowserConnection().getConnection() ); int i = input.getIndex(); if ( 0 <= i && i < files.length && files[i] != null && files[i].exists() && files[i].canRead() ) { try { FileReader fr = new FileReader( files[i] ); char[] cbuf = new char[4096]; for ( int length = fr.read( cbuf ); length > 0; length = fr.read( cbuf ) ) { sb.append( cbuf, 0, length ); } } catch ( Exception e ) { sb.append( e.getMessage() ); } } // change input view.getMainWidget().getSourceViewer().getDocument().set( sb.toString() ); view.getActionGroup().setInput( input ); } } } /** * {@inheritDoc} * * This implementation refreshes the input. */ public void entryUpdated( EntryModificationEvent event ) { if ( !( event instanceof AttributesInitializedEvent ) && !( event instanceof ChildrenInitializedEvent ) ) { refreshInput(); scrollToNewest(); } } /** * Scroll to oldest log entry. */ public void scrollToOldest() { view.getMainWidget().getSourceViewer().setTopIndex( 0 ); } /** * Scroll to newest log entry. */ public void scrollToNewest() { try { LdifContainer record = view.getMainWidget().getLdifModel().getLastContainer(); int offset = record.getOffset(); int line = view.getMainWidget().getSourceViewer().getDocument().getLineOfOffset( offset ); if ( line > 3 ) line -= 3; view.getMainWidget().getSourceViewer().setTopIndex( line ); } catch ( Exception e ) { } } /** * Clears the input and deletes the logfiles for it. */ public void clearInput() { if ( input.getBrowserConnection().getConnection() != null ) { StringBuffer sb = new StringBuffer( "" ); //$NON-NLS-1$ FileWriter fw = null; LdifModificationLogger modificationLogger = ConnectionCorePlugin.getDefault().getLdifModificationLogger(); File[] files = modificationLogger.getFiles( input.getBrowserConnection().getConnection() ); modificationLogger.dispose( input.getBrowserConnection().getConnection() ); for ( int i = 0; i < files.length; i++ ) { try { if ( files[i] != null && files[i].exists() && !files[i].delete() ) { fw = new FileWriter( files[i] ); fw.write( "" ); //$NON-NLS-1$ } } catch ( Exception e ) { sb.append( e.getMessage() ); } } view.getMainWidget().getSourceViewer().setTopIndex( 0 ); view.getMainWidget().getSourceViewer().getDocument().set( sb.toString() ); } } }