You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2015/03/27 16:27:30 UTC
svn commit: r1669604 [3/14] - in
/directory/studio/trunk/plugins/templateeditor: ./ resources/
resources/icons/ resources/templates/ src/ src/main/ src/main/java/
src/main/java/org/ src/main/java/org/apache/
src/main/java/org/apache/directory/ src/main...
Added: directory/studio/trunk/plugins/templateeditor/resources/templates/organizationalUnit-edit.xml
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/templateeditor/resources/templates/organizationalUnit-edit.xml?rev=1669604&view=auto
==============================================================================
--- directory/studio/trunk/plugins/templateeditor/resources/templates/organizationalUnit-edit.xml (added)
+++ directory/studio/trunk/plugins/templateeditor/resources/templates/organizationalUnit-edit.xml Fri Mar 27 15:27:27 2015
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
+<!--
+ @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+-->
+<template id="organizationalUnit-edit" title="OrganizationalUnit - Edit">
+ <objectClasses>
+ <structural>organizationalUnit</structural>
+ </objectClasses>
+ <form>
+ <composite numberOfColumns="2" equalColumns="false"
+ horizontalAlignment="fill" grabExcessHorizontalSpace="true"
+ verticalAlignment="fill" grabExcessVerticalSpace="true">
+ <!-- GENERAL INFORMATION -->
+ <section title="General Information" numberOfColumns="2"
+ equalColumns="false" horizontalAlignment="fill"
+ grabExcessHorizontalSpace="true">
+
+ <!-- Name -->
+ <label value="Name:" horizontalAlignment="end" width="70" />
+ <textfield attributeType="ou" horizontalAlignment="fill"
+ grabExcessHorizontalSpace="true" />
+
+ <!-- Description -->
+ <label value="Description:" horizontalAlignment="end" />
+ <textfield attributeType="description" numberOfRows="3"
+ horizontalAlignment="fill" grabExcessHorizontalSpace="true" />
+
+ </section>
+
+ <!-- Image -->
+ <image imageWidth="64" imageHeight="64" showSaveAsButton="false"
+ showClearButton="false" showBrowseButton="false">
+ <data>R0lGODlhQABAAOYAAD5imTlbkjtelDxglzFSiTNVjERpoEVqoU+HVEyEUYFVFYRY
+ F1OLWFGJVp11JoNWFh5UJzFTikNnnp53JoBTFRhNIZ94J0Ron5t0JRZLHzJUixtQJPPz883PZ9T
+ Uaf/z0peuW6PAzP7txLTM152xXNrm7qfEzzdZkKy7YMXKZf7xzPfQePzlr8LV373FY/fMcNrXav
+ vhpPnYjdDe5/3quq3I08na47TAYqS2Xt7o8Nbi6/rcmLvR2/jTgt7aa0Jmnfv7+9vb245kHUBln
+ DVWjYxhHD9jmiJXKjJTikV9S4pfGjZsPJJpH5BmHjVXjpRrISlfMTFoOZZuIjpdlEmATjtelT1g
+ l4ZaGDZYjzpwQEJ5SIhcGSVbLZpyJD51RJhwIzhbki1kNcvLy0Non0Bkm+Pj48PDw+/v78/Pz//
+ //wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAACH5BAAAAAAALAAAAABAAEAAAAf/gGmCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXm
+ Jmam5oWnp+goaKfHECcihOpqqusrapBHKeJDrS1tre4tWhnsogYv8DBwsPAu72HXcldH8zNzs8f
+ yl3Gx4Vf118q2tvc3SrYX9TVg1LlUiLo6errIuZS4uNpT/NPNPb3+Pk09E/w40wAmbAYSLCgQRY
+ Bmfir1qRhkxgQI0qcGMNhk4XHhGgUsqOjx48gd2wUgrFXkZNFZKhcybKlDJRFSspSQlNJj5s4c+
+ rsUVOJzFNbgm5ZQbSo0aMrhG75yemK0ysvokqdSvXF0ytMNy3YyrWr169cs2p6QLas2bNoy4rNp
+ KCt27dw/+O6XYuJgt27ePPqvUv3EocgaAILDnyg8AEzYgYPhhVvEBAOZyJLjmygsgExZSZPLtWY
+ 0ZjPY/p2LvSj9A/RoweRWU0GdSYAsGPLnk27Nm3Omwbo3s27t+/fvhlvEkC8uPHjyJMjd50ogPP
+ n0KNLny6dOaIT2E8gVsy9O/fsJ6wfckLeCWbN6NOjL+9EvKEC8Au4TxNfPq9NSPIjma9//31NBA
+ RIwHwCDvjfI4YlqOCCC+ImCAMQRijhhBRG6GAhlmWo4YYbCidIAyCGKOKIJIboYSEXpKjiiiy2q
+ CI8CMQo44w01ihjSRLkqOOOPPaoIzwJBCnkkEQWKWRJpv2Qw/+STDbpZA5JwkPFlFT4YOWVWGbp
+ A5VUlDTEl0OUIOaYZJZZAphDwJPEmknA4OabcMYJA5tJlGTEnUbooOeefPapA55GwKPFoFp4YOi
+ hiCbqAaFalCTbDJBGKumkM8gGjxeYetHBppx26mkHmXpRkhWkWmHDqaimqqoNpVoBTxawZpHCrL
+ TWamsKsWZRUhW8VtHCr8AGK2wLvVYBzxLILuHCssw266wLyS5R0hTUTsHDtdhmqy0P1U4BTxTgR
+ nHDuOSWa+4N4UZREhjsgjHCu/DGK+8I7YIBTxj4hoHCvvz26y8K+YZREng1FGzwwQjXAB48UDQM
+ BQ4QRyzxxDg4DEWqSVhkjIUJHHfs8ccmaIwFPFyUzAUJKKes8sokmMxFSUTETEQINNds880hyEw
+ EPEf0fAQIQAct9NAg+HxESfUlrfTS8MEDwdNQRy311FCXpMHVWGet9dZYw7PB12CHLfbYYJcUwd
+ lop6322mjDU8HbcMct99xwl1Tg3XjnHSA8GfTt99+AB+53SX95Z7hiJxZ++OInEvKYepBrduHjk
+ Vd+YWqYZ6755pwbEggAOw==</data>
+ </image>
+ </composite>
+ </form>
+</template>
Added: directory/studio/trunk/plugins/templateeditor/resources/templates/organizationalUnit-view.xml
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/templateeditor/resources/templates/organizationalUnit-view.xml?rev=1669604&view=auto
==============================================================================
--- directory/studio/trunk/plugins/templateeditor/resources/templates/organizationalUnit-view.xml (added)
+++ directory/studio/trunk/plugins/templateeditor/resources/templates/organizationalUnit-view.xml Fri Mar 27 15:27:27 2015
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
+<!--
+ @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+-->
+<template id="organizationalUnit-view" title="OrganizationalUnit - View">
+ <objectClasses>
+ <structural>organizationalUnit</structural>
+ </objectClasses>
+ <form>
+ <composite numberOfColumns="2" equalColumns="false"
+ horizontalAlignment="fill" grabExcessHorizontalSpace="true"
+ verticalAlignment="fill" grabExcessVerticalSpace="true">
+ <!-- GENERAL INFORMATION -->
+ <section title="General Information" numberOfColumns="2"
+ equalColumns="false" horizontalAlignment="fill"
+ grabExcessHorizontalSpace="true">
+
+ <!-- Name -->
+ <label value="Name:" horizontalAlignment="end" width="70" />
+ <label attributeType="ou" horizontalAlignment="fill"
+ grabExcessHorizontalSpace="true" />
+
+ <!-- Description -->
+ <label value="Description:" horizontalAlignment="end" />
+ <label attributeType="description" numberOfRows="3" />
+
+ </section>
+
+ <!-- Image -->
+ <image imageWidth="64" imageHeight="64" showSaveAsButton="false"
+ showClearButton="false" showBrowseButton="false">
+ <data>R0lGODlhQABAAOYAAD5imTlbkjtelDxglzFSiTNVjERpoEVqoU+HVEyEUYFVFYRY
+ F1OLWFGJVp11JoNWFh5UJzFTikNnnp53JoBTFRhNIZ94J0Ron5t0JRZLHzJUixtQJPPz883PZ9T
+ Uaf/z0peuW6PAzP7txLTM152xXNrm7qfEzzdZkKy7YMXKZf7xzPfQePzlr8LV373FY/fMcNrXav
+ vhpPnYjdDe5/3quq3I08na47TAYqS2Xt7o8Nbi6/rcmLvR2/jTgt7aa0Jmnfv7+9vb245kHUBln
+ DVWjYxhHD9jmiJXKjJTikV9S4pfGjZsPJJpH5BmHjVXjpRrISlfMTFoOZZuIjpdlEmATjtelT1g
+ l4ZaGDZYjzpwQEJ5SIhcGSVbLZpyJD51RJhwIzhbki1kNcvLy0Non0Bkm+Pj48PDw+/v78/Pz//
+ //wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAACH5BAAAAAAALAAAAABAAEAAAAf/gGmCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXm
+ Jmam5oWnp+goaKfHECcihOpqqusrapBHKeJDrS1tre4tWhnsogYv8DBwsPAu72HXcldH8zNzs8f
+ yl3Gx4Vf118q2tvc3SrYX9TVg1LlUiLo6errIuZS4uNpT/NPNPb3+Pk09E/w40wAmbAYSLCgQRY
+ Bmfir1qRhkxgQI0qcGMNhk4XHhGgUsqOjx48gd2wUgrFXkZNFZKhcybKlDJRFSspSQlNJj5s4c+
+ rsUVOJzFNbgm5ZQbSo0aMrhG75yemK0ysvokqdSvXF0ytMNy3YyrWr169cs2p6QLas2bNoy4rNp
+ KCt27dw/+O6XYuJgt27ePPqvUv3EocgaAILDnyg8AEzYgYPhhVvEBAOZyJLjmygsgExZSZPLtWY
+ 0ZjPY/p2LvSj9A/RoweRWU0GdSYAsGPLnk27Nm3Omwbo3s27t+/fvhlvEkC8uPHjyJMjd50ogPP
+ n0KNLny6dOaIT2E8gVsy9O/fsJ6wfckLeCWbN6NOjL+9EvKEC8Au4TxNfPq9NSPIjma9//31NBA
+ RIwHwCDvjfI4YlqOCCC+ImCAMQRijhhBRG6GAhlmWo4YYbCidIAyCGKOKIJIboYSEXpKjiiiy2q
+ CI8CMQo44w01ihjSRLkqOOOPPaoIzwJBCnkkEQWKWRJpv2Qw/+STDbpZA5JwkPFlFT4YOWVWGbp
+ A5VUlDTEl0OUIOaYZJZZAphDwJPEmknA4OabcMYJA5tJlGTEnUbooOeefPapA55GwKPFoFp4YOi
+ hiCbqAaFalCTbDJBGKumkM8gGjxeYetHBppx26mkHmXpRkhWkWmHDqaimqqoNpVoBTxawZpHCrL
+ TWamsKsWZRUhW8VtHCr8AGK2wLvVYBzxLILuHCssw266wLyS5R0hTUTsHDtdhmqy0P1U4BTxTgR
+ nHDuOSWa+4N4UZREhjsgjHCu/DGK+8I7YIBTxj4hoHCvvz26y8K+YZREng1FGzwwQjXAB48UDQM
+ BQ4QRyzxxDg4DEWqSVhkjIUJHHfs8ccmaIwFPFyUzAUJKKes8sokmMxFSUTETEQINNds880hyEw
+ EPEf0fAQIQAct9NAg+HxESfUlrfTS8MEDwdNQRy311FCXpMHVWGet9dZYw7PB12CHLfbYYJcUwd
+ lop6322mjDU8HbcMct99xwl1Tg3XjnHSA8GfTt99+AB+53SX95Z7hiJxZ++OInEvKYepBrduHjk
+ Vd+YWqYZ6755pwbEggAOw==</data>
+ </image>
+ </composite>
+ </form>
+</template>
Added: directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/EntryTemplatePlugin.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/EntryTemplatePlugin.java?rev=1669604&view=auto
==============================================================================
--- directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/EntryTemplatePlugin.java (added)
+++ directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/EntryTemplatePlugin.java Fri Mar 27 15:27:27 2015
@@ -0,0 +1,185 @@
+/*
+ * 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.templateeditor;
+
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.PropertyResourceBundle;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class EntryTemplatePlugin extends AbstractUIPlugin
+{
+ /** The shared instance */
+ private static EntryTemplatePlugin plugin;
+
+ /** The plugin properties */
+ private PropertyResourceBundle properties;
+
+ /** The templates manager */
+ private TemplatesManager templatesManager;
+
+
+ /**
+ * The constructor
+ */
+ public EntryTemplatePlugin()
+ {
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void start( BundleContext context ) throws Exception
+ {
+ super.start( context );
+ plugin = this;
+
+ // Creating the templates manager
+ templatesManager = new TemplatesManager( getPreferenceStore() );
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void stop( BundleContext context ) throws Exception
+ {
+ plugin = null;
+ super.stop( context );
+ }
+
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static EntryTemplatePlugin getDefault()
+ {
+ return plugin;
+ }
+
+
+ /**
+ * Gets the templates manager.
+ *
+ * @return
+ * the templates manager
+ */
+ public TemplatesManager getTemplatesManager()
+ {
+ return templatesManager;
+ }
+
+
+ /**
+ * Use this method to get SWT images. Use the IMG_ constants from
+ * PluginConstants for the key.
+ *
+ * @param key
+ * The key (relative path to the image in filesystem)
+ * @return The image descriptor or null
+ */
+ public ImageDescriptor getImageDescriptor( String key )
+ {
+ if ( key != null )
+ {
+ URL url = FileLocator.find( getBundle(), new Path( key ), null );
+ if ( url != null )
+ return ImageDescriptor.createFromURL( url );
+ else
+ return null;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+
+ /**
+ * Use this method to get SWT images. Use the IMG_ constants from
+ * PluginConstants for the key. A ImageRegistry is used to manage the
+ * the key->Image mapping.
+ * <p>
+ * Note: Don't dispose the returned SWT Image. It is disposed
+ * automatically when the plugin is stopped.
+ *
+ * @param key
+ * The key (relative path to the image in filesystem)
+ * @return The SWT Image or null
+ */
+ public Image getImage( String key )
+ {
+ Image image = getImageRegistry().get( key );
+ if ( image == null )
+ {
+ ImageDescriptor id = getImageDescriptor( key );
+ if ( id != null )
+ {
+ image = id.createImage();
+ getImageRegistry().put( key, image );
+ }
+ }
+ return image;
+ }
+
+
+ /**
+ * Gets the plugin properties.
+ *
+ * @return
+ * the plugin properties
+ */
+ public PropertyResourceBundle getPluginProperties()
+ {
+ if ( properties == null )
+ {
+ try
+ {
+ properties = new PropertyResourceBundle( FileLocator.openStream( this.getBundle(), new Path(
+ "plugin.properties" ), false ) ); //$NON-NLS-1$
+ }
+ catch ( IOException e )
+ {
+ // We can't use the PLUGIN_ID constant since loading the plugin.properties file has failed,
+ // So we're using a default plugin id.
+ getLog().log( new Status( Status.ERROR, "org.apache.directory.studio.templateeditor", Status.OK, //$NON-NLS-1$
+ Messages.getString( "EntryTemplatePlugin.UnableToGetPluginProperties" ), e ) ); //$NON-NLS-1$
+ }
+ }
+
+ return properties;
+ }
+}
\ No newline at end of file
Added: directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/EntryTemplatePluginConstants.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/EntryTemplatePluginConstants.java?rev=1669604&view=auto
==============================================================================
--- directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/EntryTemplatePluginConstants.java (added)
+++ directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/EntryTemplatePluginConstants.java Fri Mar 27 15:27:27 2015
@@ -0,0 +1,67 @@
+/*
+ * 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.templateeditor;
+
+
+/**
+ * This interface contains all the Constants used in the Plugin.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public interface EntryTemplatePluginConstants
+{
+ /** The plug-in ID */
+ public static final String PLUGIN_ID = EntryTemplatePlugin.getDefault().getPluginProperties().getString(
+ "Plugin_id" ); //$NON-NLS-1$
+
+ // Images
+ public static final String IMG_EXPORT_TEMPLATES_WIZARD = "resources/icons/export_templates_wizard.gif"; //$NON-NLS-1$
+ public static final String IMG_FILE = "resources/icons/file.gif"; //$NON-NLS-1$
+ public static final String IMG_IMPORT_TEMPLATES_WIZARD = "resources/icons/import_templates_wizard.gif"; //$NON-NLS-1$
+ public static final String IMG_NO_IMAGE = "resources/icons/no_image.gif"; //$NON-NLS-1$
+ public static final String IMG_OBJECT_CLASS = "resources/icons/object_class.png"; //$NON-NLS-1$
+ public static final String IMG_SWITCH_TEMPLATE = "resources/icons/switch_template.gif"; //$NON-NLS-1$
+ public static final String IMG_TEMPLATE = "resources/icons/template.gif"; //$NON-NLS-1$
+ public static final String IMG_TEMPLATE_DISABLED = "resources/icons/template_disabled.gif"; //$NON-NLS-1$
+ public static final String IMG_TOOLBAR_ADD_VALUE = "resources/icons/toolbar_add_value.gif"; //$NON-NLS-1$
+ public static final String IMG_TOOLBAR_BROWSE_FILE = "resources/icons/toolbar_browse_file.gif"; //$NON-NLS-1$
+ public static final String IMG_TOOLBAR_BROWSE_IMAGE = "resources/icons/toolbar_browse_image.gif"; //$NON-NLS-1$
+ public static final String IMG_TOOLBAR_CLEAR = "resources/icons/toolbar_clear.gif"; //$NON-NLS-1$
+ public static final String IMG_TOOLBAR_DELETE_VALUE = "resources/icons/toolbar_delete_value.gif"; //$NON-NLS-1$
+ public static final String IMG_TOOLBAR_EDIT_PASSWORD = "resources/icons/toolbar_edit_password.gif"; //$NON-NLS-1$
+ public static final String IMG_TOOLBAR_EDIT_DATE = "resources/icons/toolbar_edit_date.gif"; //$NON-NLS-1$
+ public static final String IMG_TOOLBAR_EDIT_VALUE = "resources/icons/toolbar_edit_value.gif"; //$NON-NLS-1$
+ public static final String IMG_TOOLBAR_SAVE_AS = "resources/icons/toolbar_save_as.gif"; //$NON-NLS-1$
+
+ // Preferences
+ public static final String PREF_TEMPLATE_ENTRY_EDITOR_PAGE_ID = "org.apache.directory.studio.templateeditor.view.preferences.TemplateEntryEditorPreferencePage"; //$NON-NLS-1$
+ public static final String PREF_TEMPLATES_PRESENTATION = PLUGIN_ID + ".prefs.TemplatesPresentation"; //$NON-NLS-1$
+ public static final int PREF_TEMPLATES_PRESENTATION_TEMPLATE = 1;
+ public static final int PREF_TEMPLATES_PRESENTATION_OBJECT_CLASS = 2;
+ public static final String PREF_DISABLED_TEMPLATES = PLUGIN_ID + ".prefs.DisabledTemplates"; //$NON-NLS-1$
+ public static final String PREF_USE_TEMPLATE_EDITOR_FOR = PLUGIN_ID + ".prefs.UseTemplateEditorFor"; //$NON-NLS-1$
+ public static final int PREF_USE_TEMPLATE_EDITOR_FOR_ANY_ENTRY = 1;
+ public static final int PREF_USE_TEMPLATE_EDITOR_FOR_ENTRIES_WITH_TEMPLATE = 2;
+ public static final String PREF_DEFAULT_TEMPLATES = PLUGIN_ID + ".prefs.DefaultTemplates"; //$NON-NLS-1$
+
+ // Dialogs
+ public static final String DIALOG_IMPORT_TEMPLATES = PLUGIN_ID + ".dialog.ImportTemplates"; //$NON-NLS-1$
+ public static final String DIALOG_EXPORT_TEMPLATES = PLUGIN_ID + ".dialog.ExportTemplates"; //$NON-NLS-1$
+}
Added: directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/EntryTemplatePluginUtils.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/EntryTemplatePluginUtils.java?rev=1669604&view=auto
==============================================================================
--- directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/EntryTemplatePluginUtils.java (added)
+++ directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/EntryTemplatePluginUtils.java Fri Mar 27 15:27:27 2015
@@ -0,0 +1,496 @@
+/*
+ * 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.templateeditor;
+
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.commons.collections.map.MultiValueMap;
+import org.apache.directory.api.ldap.model.schema.ObjectClass;
+import org.apache.directory.api.ldap.model.schema.ObjectClassTypeEnum;
+import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.Schema;
+import org.eclipse.core.runtime.Status;
+
+import org.apache.directory.studio.templateeditor.model.Template;
+
+
+/**
+ * This class is a helper class for the Entry Template plugin.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class EntryTemplatePluginUtils
+{
+ /** The line separator */
+ public static final String LINE_SEPARATOR = System.getProperty( "line.separator" ); //$NON-NLS-1$
+
+ /** The default schema */
+ private static final Schema DEFAULT_SCHEMA = Schema.DEFAULT_SCHEMA;
+
+
+ /**
+ * Logs the given message and exception with the ERROR status level.
+ *
+ * @param exception
+ * the exception, can be <code>null</code>
+ * @param message
+ * the message
+ * @param args
+ * the arguments to use when formatting the message
+ */
+ public static void logError( Throwable exception, String message, Object... args )
+ {
+ EntryTemplatePlugin.getDefault().getLog().log(
+ new Status( Status.ERROR, EntryTemplatePlugin.getDefault().getBundle().getSymbolicName(), Status.OK,
+ MessageFormat.format( message, args ), exception ) );
+ }
+
+
+ /**
+ * Logs the given message and exception with the WARNING status level.
+ *
+ * @param exception
+ * the exception, can be <code>null</code>
+ * @param message
+ * the message
+ * @param args
+ * the arguments to use when formatting the message
+ */
+ public static void logWarning( Throwable exception, String message, Object... args )
+ {
+ EntryTemplatePlugin.getDefault().getLog().log(
+ new Status( Status.WARNING, EntryTemplatePlugin.getDefault().getBundle().getSymbolicName(), Status.OK,
+ MessageFormat.format( message, args ), exception ) );
+ }
+
+
+ /**
+ * Logs the given message and exception with the INFO status level.
+ *
+ * @param exception
+ * the exception, can be <code>null</code>
+ * @param message
+ * the message
+ * @param args
+ * the arguments to use when formatting the message
+ */
+ public static void logInfo( Throwable exception, String message, Object... args )
+ {
+ EntryTemplatePlugin.getDefault().getLog().log(
+ new Status( Status.INFO, EntryTemplatePlugin.getDefault().getBundle().getSymbolicName(), Status.OK,
+ MessageFormat.format( message, args ), exception ) );
+ }
+
+
+ /**
+ * Logs the given message and exception with the OK status level.
+ *
+ * @param exception
+ * the exception, can be <code>null</code>
+ * @param message
+ * the message
+ * @param args
+ * the arguments to use when formatting the message
+ */
+ public static void logOk( Throwable exception, String message, Object... args )
+ {
+ EntryTemplatePlugin.getDefault().getLog().log(
+ new Status( Status.OK, EntryTemplatePlugin.getDefault().getBundle().getSymbolicName(), Status.OK,
+ MessageFormat.format( message, args ), exception ) );
+ }
+
+
+ /**
+ * Copies a file from the given streams.
+ *
+ * @param source
+ * the source file
+ * @param destination
+ * the destination file
+ * @throws IOException
+ * if an error occurs when copying the file
+ */
+ public static void copyFile( File source, File destination ) throws IOException
+ {
+ copyFile( new FileInputStream( source ), new FileOutputStream( destination ) );
+ }
+
+
+ /**
+ * Copies the input stream to the output stream.
+ *
+ * @param inputStream
+ * the input stream
+ * @param outputStream
+ * the output stream
+ * @throws IOException
+ * if an error occurs when copying the stream
+ */
+ public static void copyFile( InputStream inputStream, OutputStream outputStream ) throws IOException
+ {
+ byte[] buf = new byte[1024];
+ int i = 0;
+ while ( ( i = inputStream.read( buf ) ) != -1 )
+ {
+ outputStream.write( buf, 0, i );
+ }
+ }
+
+
+ /**
+ * Gets a list of templates matching the given entry.
+ *
+ * @param entry
+ * the entry
+ * @return
+ * a list of templates matching the given entry
+ */
+ public static List<Template> getMatchingTemplates( IEntry entry )
+ {
+ if ( entry != null )
+ {
+ // Looking for the highest (most specialized one) structural object class in the entry
+ ObjectClass highestStructuralObjectClass = getHighestStructuralObjectClassFromEntry( entry );
+ if ( highestStructuralObjectClass != null )
+ {
+ // We were able to determine the highest object class in the entry.
+
+ // Based on that information, we will use the entry's schema to retrieve the list of matching templates
+ return getTemplatesFromHighestObjectClass( highestStructuralObjectClass, entry.getBrowserConnection()
+ .getSchema() );
+ }
+ else
+ {
+ // We were not able to determine the highest object class in the entry.
+ // This means that either the schema information we received from the server is not sufficient,
+ // or the list of object classes in the entry is not complete.
+
+ // In that case we can't use the schema information to determine the list of templates.
+ // Instead we're going to gather all the templates associated with each object class description.
+ return getTemplatesFromObjectClassDescriptions( entry.getObjectClassDescriptions() );
+ }
+ }
+
+ return new ArrayList<Template>();
+ }
+
+
+ /**
+ * Gets the highest (most specialized one) object class description of the given entry
+ * if it can be found, or <code>null</code> if not.
+ *
+ * @param entry
+ * the entry
+ * @return
+ * the highest object class description of the given entry if it can be found,
+ * or <code>null</code> if not
+ */
+ private static ObjectClass getHighestStructuralObjectClassFromEntry( IEntry entry )
+ {
+ if ( entry != null )
+ {
+ if ( ( entry.getBrowserConnection() != null ) && ( entry.getBrowserConnection().getSchema() != null ) )
+ {
+ // Getting the schema from the entry
+ Schema schema = entry.getBrowserConnection().getSchema();
+
+ // Getting object class descriptions
+ Collection<ObjectClass> objectClassDescriptions = entry.getObjectClassDescriptions();
+ if ( objectClassDescriptions != null )
+ {
+ // Creating the candidates list based on the initial list
+ List<ObjectClass> candidatesList = new ArrayList<ObjectClass>();
+
+ // Adding each structural object class description to the list
+ for ( ObjectClass objectClassDescription : objectClassDescriptions )
+ {
+ if ( objectClassDescription.getType() == ObjectClassTypeEnum.STRUCTURAL )
+ {
+ candidatesList.add( objectClassDescription );
+ }
+ }
+
+ // Looping on the given collection of ObjectClassDescription until the end of the list,
+ // or until the candidates list is reduced to one.
+ Iterator<ObjectClass> iterator = objectClassDescriptions.iterator();
+ while ( ( candidatesList.size() > 1 ) && ( iterator.hasNext() ) )
+ {
+ ObjectClass ocd = iterator.next();
+ removeSuperiors( ocd, candidatesList, schema );
+ }
+
+ // Looking if we've found the highest object class description
+ if ( candidatesList.size() == 1 )
+ {
+ return candidatesList.get( 0 );
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+
+
+ /**
+ * Recursively removes superiors of the given object class description from the list.
+ *
+ * @param ocd
+ * the object class description
+ * @param ocdList
+ * the list of object class description
+ * @param schema
+ * the schema
+ */
+ private static void removeSuperiors( ObjectClass ocd, List<ObjectClass> ocdList, Schema schema )
+ {
+ if ( ocd != null )
+ {
+ for ( String superior : ocd.getSuperiorOids() )
+ {
+ // Getting the ObjectClassDescription associated with the superior
+ ObjectClass superiorOcd = getObjectClass( superior, schema );
+
+ // Removing it from the list and recursively removing its superiors
+ ocdList.remove( superiorOcd );
+ removeSuperiors( superiorOcd, ocdList, schema );
+ }
+ }
+ }
+
+
+ /**
+ * Gets the list of matching templates for the given object class description.
+ * <p>
+ * To do this, we're using a "Breadth First Search" algorithm to go through all
+ * the superiors (and the superiors of these superiors, etc.).
+ *
+ * @param objectClassDescription
+ * the object class description
+ * @param schema
+ * the associated schema
+ * @return
+ * the list of matching templates for the given object class description
+ */
+ private static List<Template> getTemplatesFromHighestObjectClass( ObjectClass objectClassDescription,
+ Schema schema )
+ {
+ // Creating a set to hold all the matching templates
+ List<Template> matchingTemplates = new ArrayList<Template>();
+
+ // Getting the templates manager
+ TemplatesManager manager = EntryTemplatePlugin.getDefault().getTemplatesManager();
+
+ // Getting the list of all the available templates
+ Template[] templates = manager.getTemplates();
+
+ // Creating a MultiValueMap that holds the templates ordered by ObjectClassDescription object
+ MultiValueMap templatesByOcd = new MultiValueMap();
+
+ // Populating this map
+ for ( Template template : templates )
+ {
+ templatesByOcd.put( getObjectClass( template.getStructuralObjectClass(), schema ), template );
+ }
+
+ // Initializing the LIFO queue with the highest ObjectClassDescription object
+ LinkedList<ObjectClass> ocdQueue = new LinkedList<ObjectClass>();
+ ocdQueue.add( objectClassDescription );
+
+ // Looking if we need to test a new ObjectClassDescription object
+ while ( !ocdQueue.isEmpty() )
+ {
+ // Dequeuing the last object for testing
+ ObjectClass currentOcd = ocdQueue.removeLast();
+
+ // Adds the templates for the current object class description to the list of matching templates
+ addTemplatesForObjectClassDescription( currentOcd, matchingTemplates, manager );
+
+ // Adding each superior object to the queue
+ List<String> currentOcdSups = currentOcd.getSuperiorOids();
+ if ( currentOcdSups != null )
+ {
+ for ( String currentOcdSup : currentOcdSups )
+ {
+ ocdQueue.addFirst( getObjectClass( currentOcdSup, schema ) );
+ }
+ }
+ }
+
+ return matchingTemplates;
+ }
+
+
+ /**
+ * Gets the list of matching templates for the given object class descriptions.
+ *
+ * @param objectClasses
+ * the object classes
+ * @return
+ * the list of matching templates for the given object class description
+ */
+ private static List<Template> getTemplatesFromObjectClassDescriptions(
+ Collection<ObjectClass> objectClasses )
+ {
+ if ( objectClasses != null )
+ {
+ // Creating a set to hold all the matching templates
+ List<Template> matchingTemplates = new ArrayList<Template>();
+
+ // Getting the templates manager
+ TemplatesManager manager = EntryTemplatePlugin.getDefault().getTemplatesManager();
+
+ for ( ObjectClass objectClassDescription : objectClasses )
+ {
+ // Adds the templates for the current object class description to the list of matching templates
+ addTemplatesForObjectClassDescription( objectClassDescription, matchingTemplates, manager );
+ }
+
+ return matchingTemplates;
+ }
+
+ return null;
+ }
+
+
+ /**
+ * Adds the templates found for the given object class description to the given templates set.
+ *
+ * @param ocd
+ * the object class description
+ * @param matchingTemplates
+ * the list of matching templates
+ * @param manager
+ * the manager
+ */
+ private static void addTemplatesForObjectClassDescription( ObjectClass ocd,
+ List<Template> matchingTemplates, TemplatesManager manager )
+ {
+ // Creating a list of containing the names and OID of the current ObjectClassDescription object
+ List<String> namesAndOid = new ArrayList<String>();
+ for ( String name : ocd.getNames() )
+ {
+ namesAndOid.add( name );
+ }
+ String currentOcdOid = ocd.getOid();
+ if ( ( currentOcdOid != null ) && ( !"".equals( currentOcdOid ) ) ) //$NON-NLS-1$
+ {
+ namesAndOid.add( currentOcdOid );
+ }
+
+ // Looping on the names and OID to find all corresponding templates
+ for ( String nameOrOid : namesAndOid )
+ {
+ // Getting the default template and complete list of templates for the given name or OID
+ Template currentOcdDefaultTemplate = manager.getDefaultTemplate( nameOrOid );
+ List<Template> currentOcdTemplates = manager.getTemplatesByObjectClass( nameOrOid );
+
+ // Adding the default template
+ if ( currentOcdDefaultTemplate != null )
+ {
+ if ( !matchingTemplates.contains( currentOcdDefaultTemplate ) )
+ {
+ matchingTemplates.add( currentOcdDefaultTemplate );
+ }
+ }
+
+ // Adding the other templates
+ if ( currentOcdTemplates != null )
+ {
+ for ( Template template : currentOcdTemplates )
+ {
+ // Adding the template only if it is different from the default one (which is already added)
+ if ( ( !template.equals( currentOcdDefaultTemplate ) ) && ( manager.isEnabled( template ) )
+ && ( !matchingTemplates.contains( template ) ) )
+ {
+ matchingTemplates.add( template );
+ }
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Gets the object class description of the given name or OID found in the default schema.
+ * <p>
+ * If no object class description is found in the default schema, a new object class description
+ * is created with the given name or OID and returned.
+ *
+ * @param nameOrOid
+ * the name or OID
+ * @return
+ * the object class description of the given name or OID found in the default schema,
+ * or a new object class description created with the given name or OID if none can be found
+ */
+ public static ObjectClass getObjectClassDescriptionFromDefaultSchema( String nameOrOid )
+ {
+ return getObjectClass( nameOrOid, DEFAULT_SCHEMA );
+ }
+
+
+ /**
+ * Gets the object class description of the given name or OID found in the given schema.
+ * <p>
+ * If no object class description is found in the given schema, a new object class description
+ * is created with the given name or OID and returned.
+ *
+ * @param nameOrOid
+ * the name or OID
+ * @param schema
+ * the schema
+ * @return
+ * the object class description of the given name or OID found in the given schema,
+ * or a new object class description created with the given name or OID if none can be found
+ */
+ private static ObjectClass getObjectClass( String nameOrOid, Schema schema )
+ {
+ ObjectClass ocd = null;
+
+ // Looking for the object class description in the given schema
+ if ( schema != null )
+ {
+ ocd = schema.getObjectClassDescription( nameOrOid );
+ }
+
+ // Creating a new object class description if none could be found in the given schema
+ if ( ocd == null )
+ {
+ ocd = new ObjectClass( null );
+ ocd.setNames( Arrays.asList( new String[]
+ { nameOrOid.toLowerCase() } ) );
+ }
+
+ return ocd;
+ }
+}
Added: directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/Messages.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/Messages.java?rev=1669604&view=auto
==============================================================================
--- directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/Messages.java (added)
+++ directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/Messages.java Fri Mar 27 15:27:27 2015
@@ -0,0 +1,53 @@
+/*
+ * 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.templateeditor;
+
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class Messages
+{
+ private static final String BUNDLE_NAME = "org.apache.directory.studio.templateeditor.messages"; //$NON-NLS-1$
+
+ private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle( BUNDLE_NAME );
+
+
+ private Messages()
+ {
+ }
+
+
+ public static String getString( String key )
+ {
+ try
+ {
+ return RESOURCE_BUNDLE.getString( key );
+ }
+ catch ( MissingResourceException e )
+ {
+ return '!' + key + '!';
+ }
+ }
+}
Added: directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/PreferenceInitializer.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/PreferenceInitializer.java?rev=1669604&view=auto
==============================================================================
--- directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/PreferenceInitializer.java (added)
+++ directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/PreferenceInitializer.java Fri Mar 27 15:27:27 2015
@@ -0,0 +1,51 @@
+/*
+ * 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.templateeditor;
+
+
+import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
+import org.eclipse.jface.preference.IPreferenceStore;
+
+
+/**
+ * This class initializes the preferences of the plugin.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class PreferenceInitializer extends AbstractPreferenceInitializer
+{
+ /**
+ * {@inheritDoc}
+ */
+ public void initializeDefaultPreferences()
+ {
+ IPreferenceStore store = EntryTemplatePlugin.getDefault().getPreferenceStore();
+
+ // Preferences
+ store.setDefault( EntryTemplatePluginConstants.PREF_TEMPLATES_PRESENTATION,
+ EntryTemplatePluginConstants.PREF_TEMPLATES_PRESENTATION_OBJECT_CLASS );
+ store.setDefault( EntryTemplatePluginConstants.PREF_DISABLED_TEMPLATES, "" ); //$NON-NLS-1$
+ store.setDefault( EntryTemplatePluginConstants.PREF_USE_TEMPLATE_EDITOR_FOR,
+ EntryTemplatePluginConstants.PREF_USE_TEMPLATE_EDITOR_FOR_ENTRIES_WITH_TEMPLATE );
+
+ // Dialogs
+ store.setDefault( EntryTemplatePluginConstants.DIALOG_IMPORT_TEMPLATES, System.getProperty( "user.home" ) ); //$NON-NLS-1$
+ }
+}
Added: directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/TemplatesManager.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/TemplatesManager.java?rev=1669604&view=auto
==============================================================================
--- directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/TemplatesManager.java (added)
+++ directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/TemplatesManager.java Fri Mar 27 15:27:27 2015
@@ -0,0 +1,875 @@
+/*
+ * 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.templateeditor;
+
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import org.apache.commons.collections.map.MultiValueMap;
+import org.apache.directory.api.ldap.model.schema.ObjectClass;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.preference.IPreferenceStore;
+
+import org.apache.directory.studio.templateeditor.model.ExtensionPointTemplate;
+import org.apache.directory.studio.templateeditor.model.FileTemplate;
+import org.apache.directory.studio.templateeditor.model.Template;
+import org.apache.directory.studio.templateeditor.model.parser.TemplateIO;
+import org.apache.directory.studio.templateeditor.model.parser.TemplateIOException;
+
+
+/**
+ * This class is used to manage the templates.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class TemplatesManager
+{
+ /** The preference delimiter used for default and disabled templates */
+ private static String PREFERENCE_DELIMITER = ";"; //$NON-NLS-1$
+
+ /** The preference sub delimiter used for default templates */
+ private static String PREFERENCE_SUB_DELIMITER = ":"; //$NON-NLS-1$
+
+ /** The plugin's preference store */
+ private IPreferenceStore preferenceStore;
+
+ /** The list containing all the templates */
+ private List<Template> templatesList = new ArrayList<Template>();
+
+ /** The maps containing all the templates by their id */
+ private Map<String, Template> templatesByIdMap = new HashMap<String, Template>();
+
+ /** The maps containing all the templates by ObjectClassDescription */
+ private MultiValueMap templatesByStructuralObjectClassMap = new MultiValueMap();
+
+ /** The list containing *only* the IDs of the disabled templates */
+ private List<String> disabledTemplatesList = new ArrayList<String>();
+
+ /** The map containing the default templates */
+ private Map<ObjectClass, String> defaultTemplatesMap = new HashMap<ObjectClass, String>();
+
+ /** The list of listeners */
+ private List<TemplatesManagerListener> listeners = new ArrayList<TemplatesManagerListener>();
+
+
+ /**
+ * Creates a new instance of TemplatesManager.
+ *
+ * @param preferenceStore
+ * the plugin's preference store
+ */
+ public TemplatesManager( IPreferenceStore preferenceStore )
+ {
+ this.preferenceStore = preferenceStore;
+
+ loadDefaultTemplates();
+ loadDisabledTemplates();
+ loadTemplates();
+ setDefaultTemplates();
+ }
+
+
+ /**
+ * Adds a listener.
+ *
+ * @param listener
+ * the listener
+ * @return
+ * <code>true</code> (as per the general contract of the
+ * <code>Collection.add</code> method).
+ */
+ public boolean addListener( TemplatesManagerListener listener )
+ {
+ return listeners.add( listener );
+ }
+
+
+ /**
+ * Removes a listener.
+ *
+ * @param listener
+ * the listener
+ * @return
+ * <code>true</code> if this templates manager contained
+ * the specified listener.
+ */
+ public boolean removeListener( TemplatesManagerListener listener )
+ {
+ return listeners.remove( listener );
+ }
+
+
+ /**
+ * Fires a "fireTemplateAdded" event to all the listeners.
+ *
+ * @param template
+ * the added template
+ */
+ private void fireTemplateAdded( Template template )
+ {
+ for ( TemplatesManagerListener listener : listeners.toArray( new TemplatesManagerListener[0] ) )
+ {
+ listener.templateAdded( template );
+ }
+ }
+
+
+ /**
+ * Fires a "templateRemoved" event to all the listeners.
+ *
+ * @param template
+ * the removed template
+ */
+ private void fireTemplateRemoved( Template template )
+ {
+ for ( TemplatesManagerListener listener : listeners.toArray( new TemplatesManagerListener[0] ) )
+ {
+ listener.templateRemoved( template );
+ }
+ }
+
+
+ /**
+ * Fires a "templateEnabled" event to all the listeners.
+ *
+ * @param template
+ * the enabled template
+ */
+ private void fireTemplateEnabled( Template template )
+ {
+ for ( TemplatesManagerListener listener : listeners.toArray( new TemplatesManagerListener[0] ) )
+ {
+ listener.templateEnabled( template );
+ }
+ }
+
+
+ /**
+ * Fires a "templateDisabled" event to all the listeners.
+ *
+ * @param template
+ * the disabled template
+ */
+ private void fireTemplateDisabled( Template template )
+ {
+ for ( TemplatesManagerListener listener : listeners.toArray( new TemplatesManagerListener[0] ) )
+ {
+ listener.templateDisabled( template );
+ }
+ }
+
+
+ /**
+ * Loads the templates
+ */
+ private void loadTemplates()
+ {
+ // Loading the templates added using the extension point
+ loadExtensionPointTemplates();
+
+ // Loading the templates added via files on the disk (added by the user)
+ loadFileTemplates();
+ }
+
+
+ /**
+ * Loads the templates added using the extension point.
+ */
+ private void loadExtensionPointTemplates()
+ {
+ // Getting the extension point
+ IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(
+ "org.apache.directory.studio.templateeditor.templates" ); //$NON-NLS-1$
+
+ // Getting all the extensions
+ IConfigurationElement[] members = extensionPoint.getConfigurationElements();
+ if ( members != null )
+ {
+ // For each extension: load the template
+ for ( int m = 0; m < members.length; m++ )
+ {
+ IConfigurationElement member = members[m];
+
+ // Getting the URL of the file associated with the extension
+ String contributorName = member.getContributor().getName();
+ String filePathInPlugin = member.getAttribute( "file" ); //$NON-NLS-1$
+ URL fileUrl = Platform.getBundle( contributorName ).getResource( filePathInPlugin );
+
+ // Checking if the URL is null
+ if ( filePathInPlugin == null )
+ {
+ // Logging the error
+ EntryTemplatePluginUtils.logError( new NullPointerException(), Messages
+ .getString( "TemplatesManager.AnErrorOccurredWhenParsingTheTemplate3Params" ), contributorName, //$NON-NLS-1$
+ filePathInPlugin, Messages.getString( "TemplatesManager.URLCreatedForTheTemplateIsNull" ) ); //$NON-NLS-1$
+ }
+
+ // Parsing the template and adding it to the templates list
+ try
+ {
+ InputStream is = fileUrl.openStream();
+
+ ExtensionPointTemplate template = TemplateIO.readAsExtensionPointTemplate( is );
+
+ templatesList.add( template );
+ templatesByIdMap.put( template.getId(), template );
+ templatesByStructuralObjectClassMap.put( EntryTemplatePluginUtils
+ .getObjectClassDescriptionFromDefaultSchema( template.getStructuralObjectClass() ), template );
+
+ is.close();
+ }
+ catch ( TemplateIOException e )
+ {
+ // Logging the error
+ EntryTemplatePluginUtils.logError( e, Messages
+ .getString( "TemplatesManager.AnErrorOccurredWhenParsingTheTemplate3Params" ), //$NON-NLS-1$
+ contributorName, filePathInPlugin, e.getMessage() );
+ }
+ catch ( IOException e )
+ {
+ // Logging the error
+ EntryTemplatePluginUtils.logError( e, Messages
+ .getString( "TemplatesManager.AnErrorOccurredWhenParsingTheTemplate3Params" ), contributorName, //$NON-NLS-1$
+ filePathInPlugin, e.getMessage() );
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Loads the templates added via files on the disk (added by the user).
+ */
+ private void loadFileTemplates()
+ {
+ // Getting the templates folder
+ File templatesFolder = getTemplatesFolder().toFile();
+
+ // If the templates folder does not exist, we exit
+ if ( !templatesFolder.exists() )
+ {
+ return;
+ }
+
+ // Loading the templates contained in the templates folder
+ String[] templateNames = templatesFolder.list( new FilenameFilter()
+ {
+ public boolean accept( File dir, String name )
+ {
+ return name.endsWith( ".xml" ); //$NON-NLS-1$
+ }
+ } );
+
+ // If there are no templates available, we exit
+ if ( ( templateNames == null ) || ( templateNames.length == 0 ) )
+ {
+ return;
+ }
+
+ // Loading each template
+ for ( String templateName : templateNames )
+ {
+ // Creating the template file
+ File templateFile = new File( templatesFolder, templateName );
+
+ // Parsing the template and adding it to the templates list
+ try
+ {
+ InputStream is = new FileInputStream( templateFile );
+
+ FileTemplate template = TemplateIO.readAsFileTemplate( is );
+ templatesList.add( template );
+ templatesByIdMap.put( template.getId(), template );
+ templatesByStructuralObjectClassMap.put( EntryTemplatePluginUtils
+ .getObjectClassDescriptionFromDefaultSchema( template.getStructuralObjectClass() ), template );
+
+ is.close();
+ }
+ catch ( TemplateIOException e )
+ {
+ // Logging the error
+ EntryTemplatePluginUtils.logError( e, Messages
+ .getString( "TemplatesManager.AnErrorOccurredWhenParsingTheTemplate2Params" ), //$NON-NLS-1$
+ templateFile.getAbsolutePath(), e.getMessage() );
+ }
+ catch ( IOException e )
+ {
+ // Logging the error
+ EntryTemplatePluginUtils.logError( e, Messages
+ .getString( "TemplatesManager.AnErrorOccurredWhenParsingTheTemplate2Params" ), //$NON-NLS-1$
+ templateFile.getAbsolutePath(), e.getMessage() );
+ }
+ }
+ }
+
+
+ /**
+ * Adds a template from a file on the disk.
+ *
+ * @param templateFile
+ * the template file
+ * @return
+ * <code>true</code> if the template file has been successfully added,
+ * <code>false</code> if the template file has not been added
+ */
+ public boolean addTemplate( File templateFile )
+ {
+ // Getting the file template
+ FileTemplate fileTemplate = getFileTemplate( templateFile );
+ if ( fileTemplate == null )
+ {
+ // If the file is not valid, we simply return
+ return false;
+ }
+
+ // Verifying if a template with a similar ID does not already exist
+ if ( templatesByIdMap.containsKey( fileTemplate.getId() ) )
+ {
+ // Logging the error
+ EntryTemplatePluginUtils.logError( null, Messages
+ .getString( "TemplatesManager.TheTemplateFileCouldNotBeAddedBecauseATemplateWithSameIDAlreadyExist" ), //$NON-NLS-1$
+ templateFile.getAbsolutePath() );
+ return false;
+ }
+
+ // Verifying the folder containing the templates already exists
+ // If not we create it
+ File templatesFolder = getTemplatesFolder().toFile();
+ if ( !templatesFolder.exists() )
+ {
+ // The folder does not exist, we need to create it.
+ templatesFolder.mkdirs();
+ }
+
+ // Copying the template in the plugin's folder
+ try
+ {
+ // Creating the file object where the template will be saved
+ File destinationFile = getTemplatesFolder().append( fileTemplate.getId() + ".xml" ).toFile(); //$NON-NLS-1$
+
+ // Checking if the file does not already exist
+ if ( destinationFile.exists() )
+ {
+ // Logging the error
+ EntryTemplatePluginUtils
+ .logError(
+ null,
+ Messages
+ .getString( "TemplatesManager.TheTemplateFileCouldNotBeAddedBecauseATemplateWithSameIDAlreadyExist" ), //$NON-NLS-1$
+ templateFile.getAbsolutePath() );
+ return false;
+ }
+
+ // Copying the file
+ EntryTemplatePluginUtils.copyFile( templateFile, destinationFile );
+ }
+ catch ( IOException e )
+ {
+ // Logging the error
+ EntryTemplatePluginUtils
+ .logError(
+ null,
+ Messages.getString( "TemplatesManager.TheTemplateFileCouldNotBeCopiedToThePluginsFolder" ), templateFile.getAbsolutePath() ); //$NON-NLS-1$
+ return false;
+ }
+
+ // Adding the template
+ templatesList.add( fileTemplate );
+ templatesByIdMap.put( fileTemplate.getId(), fileTemplate );
+ templatesByStructuralObjectClassMap.put( EntryTemplatePluginUtils
+ .getObjectClassDescriptionFromDefaultSchema( fileTemplate.getStructuralObjectClass() ), fileTemplate );
+
+ // Firing the event
+ fireTemplateAdded( fileTemplate );
+
+ return true;
+ }
+
+
+ /**
+ * Get the file template associate with the template file.
+ *
+ * @param templateFile
+ * the template file
+ * @return
+ * the associated file template
+ */
+ private FileTemplate getFileTemplate( File templateFile )
+ {
+ // Checking if the file exists
+ if ( !templateFile.exists() )
+ {
+ // Logging the error
+ EntryTemplatePluginUtils.logError( null, Messages
+ .getString( "TemplatesManager.TheTemplateFileCouldNotBeAddedBecauseItDoesNotExist" ), templateFile //$NON-NLS-1$
+ .getAbsolutePath() );
+ return null;
+ }
+
+ // Checking if the file is readable
+ if ( !templateFile.canRead() )
+ {
+ // Logging the error
+ EntryTemplatePluginUtils
+ .logError(
+ null,
+ Messages.getString( "TemplatesManager.TheTemplateFileCouldNotBeAddedBecauseItCantBeRead" ), templateFile.getAbsolutePath() ); //$NON-NLS-1$
+ return null;
+ }
+
+ // Trying to parse the template file
+ FileTemplate fileTemplate = null;
+ try
+ {
+ FileInputStream fis = new FileInputStream( templateFile );
+ fileTemplate = TemplateIO.readAsFileTemplate( fis );
+ }
+ catch ( FileNotFoundException e )
+ {
+ // Logging the error
+ EntryTemplatePluginUtils.logError( e, Messages
+ .getString( "TemplatesManager.TheTemplateFileCouldNotBeAddedBecauseOfTheFollowingError" ), templateFile //$NON-NLS-1$
+ .getAbsolutePath(), e.getMessage() );
+ return null;
+ }
+ catch ( TemplateIOException e )
+ {
+ // Logging the error
+ EntryTemplatePluginUtils.logError( e, Messages
+ .getString( "TemplatesManager.TheTemplateFileCouldNotBeAddedBecauseOfTheFollowingError" ), templateFile //$NON-NLS-1$
+ .getAbsolutePath(), e.getMessage() );
+ return null;
+ }
+
+ // Everything went fine, the file is valid
+ return fileTemplate;
+ }
+
+
+ /**
+ * Removes a template.
+ *
+ * @param fileTemplate
+ * the file template to remove
+ * @return
+ * <code>true</code> if the file template has been successfully removed,
+ * <code>false</code> if the template file has not been removed
+ */
+ public boolean removeTemplate( FileTemplate fileTemplate )
+ {
+ // Checking if the file template is null
+ if ( fileTemplate == null )
+ {
+ return false;
+ }
+
+ // Checking if the file template exists in the templates set
+ if ( !templatesList.contains( fileTemplate ) )
+ {
+ // Logging the error
+ EntryTemplatePluginUtils
+ .logError(
+ null,
+ Messages.getString( "TemplatesManager.TheTemplateCouldNotBeRemovedBecauseOfTheFollowingError" ) //$NON-NLS-1$
+ + Messages.getString( "TemplatesManager.TheTemplateDoesNotExistInTheTemplateManager" ), fileTemplate.getTitle(), fileTemplate //$NON-NLS-1$
+ .getId() );
+ return false;
+ }
+
+ // Creating the file object associated with the template
+ File templateFile = getTemplatesFolder().append( fileTemplate.getId() + ".xml" ).toFile(); //$NON-NLS-1$
+
+ // Checking if the file exists
+ if ( !templateFile.exists() )
+ {
+ // Logging the error
+ EntryTemplatePluginUtils
+ .logError(
+ null,
+ Messages.getString( "TemplatesManager.TheTemplateCouldNotBeRemovedBecauseOfTheFollowingError" ) //$NON-NLS-1$
+ + Messages.getString( "TemplatesManager.TheFileAssociatedWithTheTemplateCouldNotBeFoundAt" ), fileTemplate.getTitle(), //$NON-NLS-1$
+ fileTemplate.getId(), templateFile.getAbsolutePath() );
+ return false;
+ }
+
+ // Checking if the file can be written, and thus deleted
+ if ( !templateFile.canWrite() )
+ {
+ // Logging the error
+ EntryTemplatePluginUtils
+ .logError(
+ null,
+ Messages.getString( "TemplatesManager.TheTemplateCouldNotBeRemovedBecauseOfTheFollowingError" ) //$NON-NLS-1$
+ + Messages.getString( "TemplatesManager.TheFileAssociatedWithTheTemplateCanNotBeModified" ), fileTemplate.getTitle(), //$NON-NLS-1$
+ fileTemplate.getId(), templateFile.getAbsolutePath() );
+ return false;
+ }
+
+ // Deleting the file
+ if ( !templateFile.delete() )
+ {
+ // Logging the error
+ EntryTemplatePluginUtils
+ .logError(
+ null,
+ Messages.getString( "TemplatesManager.TheTemplateCouldNotBeRemovedBecauseOfTheFollowingError" ) //$NON-NLS-1$
+ + Messages
+ .getString( "TemplatesManager.AnErrorOccurredWhenRemovingTheFileAssociatedWithTheTemplate" ), fileTemplate //$NON-NLS-1$
+ .getTitle(), fileTemplate.getId(), templateFile.getAbsolutePath() );
+ return false;
+ }
+
+ // Removing the template from the disabled templates files
+ disabledTemplatesList.remove( fileTemplate );
+
+ // Removing the template for the templates list
+ templatesList.remove( fileTemplate );
+ templatesByIdMap.remove( fileTemplate.getId() );
+ templatesByStructuralObjectClassMap.remove( EntryTemplatePluginUtils
+ .getObjectClassDescriptionFromDefaultSchema( fileTemplate.getStructuralObjectClass() ) );
+
+ // Firing the event
+ fireTemplateRemoved( fileTemplate );
+
+ return true;
+ }
+
+
+ /**
+ * Gets the templates.
+ *
+ * @return
+ * the templates
+ */
+ public Template[] getTemplates()
+ {
+ return templatesList.toArray( new Template[0] );
+ }
+
+
+ /**
+ * Gets the templates folder.
+ *
+ * @return
+ * the templates folder
+ */
+ private static IPath getTemplatesFolder()
+ {
+ return EntryTemplatePlugin.getDefault().getStateLocation().append( "templates" ); //$NON-NLS-1$
+ }
+
+
+ /**
+ * Loads the {@link List} of disabled templates from the preference store.
+ */
+ private void loadDisabledTemplates()
+ {
+ StringTokenizer tokenizer = new StringTokenizer( preferenceStore
+ .getString( EntryTemplatePluginConstants.PREF_DISABLED_TEMPLATES ), PREFERENCE_DELIMITER );
+ while ( tokenizer.hasMoreTokens() )
+ {
+ disabledTemplatesList.add( tokenizer.nextToken() );
+ }
+ }
+
+
+ /**
+ * Saves the {@link List} of disabled templates to the preference store.
+ */
+ private void saveDisabledTemplates()
+ {
+ StringBuffer sb = new StringBuffer();
+ for ( String disabledTemplateId : disabledTemplatesList )
+ {
+ sb.append( disabledTemplateId );
+ sb.append( PREFERENCE_DELIMITER );
+ }
+ preferenceStore.setValue( EntryTemplatePluginConstants.PREF_DISABLED_TEMPLATES, sb.toString() );
+ }
+
+
+ /**
+ * Enables the given template.
+ *
+ * @param template
+ * the template
+ */
+ public void enableTemplate( Template template )
+ {
+ if ( disabledTemplatesList.contains( template.getId() ) )
+ {
+ // Removing the id of the template to the list of disabled templates
+ disabledTemplatesList.remove( template.getId() );
+
+ // Saving the disabled templates list
+ saveDisabledTemplates();
+
+ // Firing the event
+ fireTemplateEnabled( template );
+ }
+ }
+
+
+ /**
+ * Disables the given template.
+ *
+ * @param template
+ * the template
+ */
+ public void disableTemplate( Template template )
+ {
+ if ( !disabledTemplatesList.contains( template.getId() ) )
+ {
+ // Adding the id of the template to the list of disabled templates
+ disabledTemplatesList.add( template.getId() );
+
+ // Saving the disabled templates list
+ saveDisabledTemplates();
+
+ // Firing the event
+ fireTemplateDisabled( template );
+ }
+ }
+
+
+ /**
+ * Indicates if the given template is enabled or not.
+ *
+ * @param template
+ * the template
+ * @return
+ * <code>true</code> if the template is enabled,
+ * <code>false</code> if the template is disabled
+ */
+ public boolean isEnabled( Template template )
+ {
+ return !disabledTemplatesList.contains( template.getId() );
+ }
+
+
+ /**
+ * Loads the {@link Map} of default templates from the preference store.
+ */
+ private void loadDefaultTemplates()
+ {
+ // Getting each default set
+ StringTokenizer tokenizer = new StringTokenizer( preferenceStore
+ .getString( EntryTemplatePluginConstants.PREF_DEFAULT_TEMPLATES ), PREFERENCE_DELIMITER );
+ while ( tokenizer.hasMoreTokens() )
+ {
+ String token = tokenizer.nextToken();
+
+ // Splitting the default set
+ String[] splittedToken = token.split( ":" ); //$NON-NLS-1$
+ if ( splittedToken.length == 2 )
+ {
+ // Adding the default template value
+ defaultTemplatesMap.put( EntryTemplatePluginUtils
+ .getObjectClassDescriptionFromDefaultSchema( splittedToken[0] ), splittedToken[1] );
+ }
+ }
+ }
+
+
+ /**
+ * Saves the {@link Map} of default templates to the preference store.
+ */
+ private void saveDefaultTemplates()
+ {
+ StringBuffer sb = new StringBuffer();
+ for ( ObjectClass objectClassDescription : defaultTemplatesMap.keySet() )
+ {
+ sb.append( objectClassDescription.getNames().get( 0 ) );
+ sb.append( PREFERENCE_SUB_DELIMITER );
+ sb.append( defaultTemplatesMap.get( objectClassDescription ) );
+ sb.append( PREFERENCE_DELIMITER );
+ }
+ preferenceStore.setValue( EntryTemplatePluginConstants.PREF_DEFAULT_TEMPLATES, sb.toString() );
+ }
+
+
+ /**
+ * Sets the default templates.
+ */
+ private void setDefaultTemplates()
+ {
+ for ( Template template : templatesList )
+ {
+ if ( isEnabled( template ) )
+ {
+ String structuralObjectClass = template.getStructuralObjectClass();
+
+ // Checking if a default template is defined
+ if ( defaultTemplatesMap.get( EntryTemplatePluginUtils
+ .getObjectClassDescriptionFromDefaultSchema( structuralObjectClass ) ) == null )
+ {
+ // Assigning this template as the default one
+ defaultTemplatesMap.put( EntryTemplatePluginUtils
+ .getObjectClassDescriptionFromDefaultSchema( structuralObjectClass ), template.getId() );
+ }
+ }
+ }
+
+ // Saving default templates
+ saveDefaultTemplates();
+ }
+
+
+ /**
+ * Sets the given template as default for its structural object class.
+ *
+ * @param template
+ * the template
+ */
+ public void setDefaultTemplate( Template template )
+ {
+ if ( isEnabled( template ) )
+ {
+ // Removing the old value
+ defaultTemplatesMap.remove( EntryTemplatePluginUtils.getObjectClassDescriptionFromDefaultSchema( template
+ .getStructuralObjectClass() ) );
+
+ // Setting the new value
+ defaultTemplatesMap.put( EntryTemplatePluginUtils.getObjectClassDescriptionFromDefaultSchema( template
+ .getStructuralObjectClass() ), template.getId() );
+
+ // Saving default templates
+ saveDefaultTemplates();
+ }
+ }
+
+
+ /**
+ * Unsets the given template as default for its structural object class.
+ *
+ * @param template
+ * the template
+ */
+ public void unSetDefaultTemplate( Template template )
+ {
+ if ( isDefaultTemplate( template ) )
+ {
+ defaultTemplatesMap.remove( EntryTemplatePluginUtils.getObjectClassDescriptionFromDefaultSchema( template
+ .getStructuralObjectClass() ) );
+
+ // Saving default template
+ saveDefaultTemplates();
+ }
+ }
+
+
+ /**
+ * Indicates if the given template is the default one
+ * for its structural object class or not.
+ *
+ * @param template
+ * the template
+ * @return
+ * <code>true</code> if the given template is the default one
+ * for its structural object class,
+ * <code>false</code> if not
+ */
+ public boolean isDefaultTemplate( Template template )
+ {
+ String defaultTemplateID = defaultTemplatesMap.get( EntryTemplatePluginUtils
+ .getObjectClassDescriptionFromDefaultSchema( template.getStructuralObjectClass() ) );
+ if ( defaultTemplateID != null )
+ {
+ return defaultTemplateID.equalsIgnoreCase( template.getId() );
+ }
+
+ return false;
+ }
+
+
+ /**
+ * Indicates whether the given name or OID for an object class has a default template.
+ *
+ * @param nameOrOid
+ * the name or OID
+ * @return
+ * <code>true</code> if the given name or OID for an object class has a default template
+ */
+ public boolean hasDefaultTemplate( String nameOrOid )
+ {
+ return getDefaultTemplate( nameOrOid ) != null;
+ }
+
+
+ /**
+ * Gets the default template associated with given name or OID for an object class.
+ *
+ * @param nameOrOid
+ * @return
+ * the default template associated with given name or OID for an object class,
+ * or <code>null</code> if there's no default template
+ */
+ public Template getDefaultTemplate( String nameOrOid )
+ {
+ return getTemplateById( defaultTemplatesMap.get( EntryTemplatePluginUtils
+ .getObjectClassDescriptionFromDefaultSchema( nameOrOid ) ) );
+ }
+
+
+ /**
+ * Gets the template identified by the given ID.
+ *
+ * @param id
+ * the ID
+ * @return
+ * the template identified by the given ID
+ */
+ private Template getTemplateById( String id )
+ {
+ return templatesByIdMap.get( id );
+ }
+
+
+ /**
+ * Gets the list of templates associated with the given name or OID for an object class.
+ *
+ * @param nameOrOid
+ * the name or OID
+ * @return
+ * the list of templates associated with the given name or OID for an object class
+ * or <code>null</code> if there's no associated template
+ */
+ @SuppressWarnings("unchecked")
+ public List<Template> getTemplatesByObjectClass( String nameOrOid )
+ {
+ return ( List<Template> ) templatesByStructuralObjectClassMap.get( EntryTemplatePluginUtils
+ .getObjectClassDescriptionFromDefaultSchema( nameOrOid ) );
+ }
+
+}
Added: directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/TemplatesManagerListener.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/TemplatesManagerListener.java?rev=1669604&view=auto
==============================================================================
--- directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/TemplatesManagerListener.java (added)
+++ directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/TemplatesManagerListener.java Fri Mar 27 15:27:27 2015
@@ -0,0 +1,69 @@
+/*
+ * 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.templateeditor;
+
+
+import org.apache.directory.studio.templateeditor.model.Template;
+
+
+/**
+ * This interface defines a listener for the templates manager events.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public interface TemplatesManagerListener
+{
+ /**
+ * This method is fired when a file template is added to the
+ * templates manager.
+ *
+ * @param template
+ * the added template
+ */
+ public void templateAdded( Template template );
+
+
+ /**
+ * This method is fired when a file template is removed from the
+ * templates manager.
+ *
+ * @param template
+ * the removed template
+ */
+ public void templateRemoved( Template template );
+
+
+ /**
+ * This method is fired when a template is enabled.
+ *
+ * @param template
+ * the enabled template
+ */
+ public void templateEnabled( Template template );
+
+
+ /**
+ * This method is fired when a template is disabled.
+ *
+ * @param template
+ * the disabled template
+ */
+ public void templateDisabled( Template template );
+}
Added: directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/actions/DisplayEntryInTemplateAction.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/actions/DisplayEntryInTemplateAction.java?rev=1669604&view=auto
==============================================================================
--- directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/actions/DisplayEntryInTemplateAction.java (added)
+++ directory/studio/trunk/plugins/templateeditor/src/main/java/org/apache/directory/studio/templateeditor/actions/DisplayEntryInTemplateAction.java Fri Mar 27 15:27:27 2015
@@ -0,0 +1,79 @@
+/*
+ * 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.templateeditor.actions;
+
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.ui.PlatformUI;
+
+import org.apache.directory.studio.templateeditor.EntryTemplatePlugin;
+import org.apache.directory.studio.templateeditor.EntryTemplatePluginConstants;
+import org.apache.directory.studio.templateeditor.editor.TemplateEditorWidget;
+
+
+/**
+ * This action is used to display a drop-down menu with the available
+ * templates for the entry in the editor.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class DisplayEntryInTemplateAction extends Action
+{
+ /** The associated {@link TemplateEditorWidget} */
+ private TemplateEditorWidget templateEditorPage;
+
+
+ /**
+ * Creates a new instance of DisplayEntryInTemplateAction.
+ *
+ * @param templateEditorPage
+ * the associated editor page
+ */
+ public DisplayEntryInTemplateAction( TemplateEditorWidget templateEditorPage )
+ {
+ super( Messages.getString( "DisplayEntryInTemplateAction.DisplayEntryIn" ), Action.AS_DROP_DOWN_MENU ); //$NON-NLS-1$
+ setImageDescriptor( EntryTemplatePlugin.getDefault().getImageDescriptor(
+ EntryTemplatePluginConstants.IMG_SWITCH_TEMPLATE ) );
+ this.templateEditorPage = templateEditorPage;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public void run()
+ {
+ MenuManager menuManager = new MenuManager();
+ DisplayEntryInTemplateMenuManager.fillInMenuManager( menuManager, templateEditorPage );
+
+ menuManager.createContextMenu( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell() );
+ menuManager.getMenu().setVisible( true );
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isEnabled()
+ {
+ return true;
+ }
+}