KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectstyle > cayenne > modeler > action > OpenProjectAction


1 /* ====================================================================
2  *
3  * The ObjectStyle Group Software License, version 1.1
4  * ObjectStyle Group - http://objectstyle.org/
5  *
6  * Copyright (c) 2002-2005, Andrei (Andrus) Adamchik and individual authors
7  * of the software. All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  *
16  * 2. Redistributions in binary form must reproduce the above copyright
17  * notice, this list of conditions and the following disclaimer in
18  * the documentation and/or other materials provided with the
19  * distribution.
20  *
21  * 3. The end-user documentation included with the redistribution, if any,
22  * must include the following acknowlegement:
23  * "This product includes software developed by independent contributors
24  * and hosted on ObjectStyle Group web site (http://objectstyle.org/)."
25  * Alternately, this acknowlegement may appear in the software itself,
26  * if and wherever such third-party acknowlegements normally appear.
27  *
28  * 4. The names "ObjectStyle Group" and "Cayenne" must not be used to endorse
29  * or promote products derived from this software without prior written
30  * permission. For written permission, email
31  * "andrus at objectstyle dot org".
32  *
33  * 5. Products derived from this software may not be called "ObjectStyle"
34  * or "Cayenne", nor may "ObjectStyle" or "Cayenne" appear in their
35  * names without prior written permission.
36  *
37  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
38  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40  * DISCLAIMED. IN NO EVENT SHALL THE OBJECTSTYLE GROUP OR
41  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
44  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
46  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
47  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48  * SUCH DAMAGE.
49  * ====================================================================
50  *
51  * This software consists of voluntary contributions made by many
52  * individuals and hosted on ObjectStyle Group web site. For more
53  * information on the ObjectStyle Group, please see
54  * <http://objectstyle.org/>.
55  */

56 package org.objectstyle.cayenne.modeler.action;
57
58 import java.awt.event.ActionEvent JavaDoc;
59 import java.awt.event.KeyEvent JavaDoc;
60 import java.io.File JavaDoc;
61
62 import javax.swing.JOptionPane JavaDoc;
63 import javax.swing.KeyStroke JavaDoc;
64
65 import org.apache.log4j.Logger;
66 import org.objectstyle.cayenne.conf.Configuration;
67 import org.objectstyle.cayenne.conf.DefaultConfiguration;
68 import org.objectstyle.cayenne.modeler.Application;
69 import org.objectstyle.cayenne.modeler.dialog.ErrorDebugDialog;
70 import org.objectstyle.cayenne.modeler.util.RecentFileMenuItem;
71 import org.objectstyle.cayenne.project.Project;
72 import org.objectstyle.cayenne.project.ProjectException;
73
74 /**
75  * @author Andrei Adamchik
76  */

77 public class OpenProjectAction extends ProjectAction {
78
79     private static Logger logObj = Logger.getLogger(OpenProjectAction.class);
80
81     protected ProjectOpener fileChooser;
82
83     public static String JavaDoc getActionName() {
84         return "Open Project";
85     }
86
87     /**
88      * Constructor for OpenProjectAction.
89      */

90     public OpenProjectAction(Application application) {
91         super(getActionName(), application);
92         this.fileChooser = new ProjectOpener();
93     }
94
95     public String JavaDoc getIconName() {
96         return "icon-open.gif";
97     }
98
99     public KeyStroke JavaDoc getAcceleratorKey() {
100         return KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK);
101     }
102
103     public void performAction(ActionEvent JavaDoc e) {
104         // Save and close (if needed) currently open project.
105
if (getProjectController() != null && !closeProject()) {
106             return;
107         }
108         File JavaDoc f = null;
109         if (e.getSource() instanceof RecentFileMenuItem) {
110             RecentFileMenuItem menu = (RecentFileMenuItem) e.getSource();
111             f = menu.getFile();
112         }
113
114         if (f == null) {
115             openProject();
116         }
117         else {
118             openProject(f);
119         }
120     }
121
122     /**
123      * Opens cayenne.xml file using file chooser dialog.
124      */

125     public void openProject() {
126         try {
127             // Get the project file name (always cayenne.xml)
128
File JavaDoc file = fileChooser.openProjectFile(Application.getFrame());
129             if (file != null) {
130                 openProject(file);
131             }
132         }
133         catch (Exception JavaDoc e) {
134             logObj.warn("Error loading project file.", e);
135         }
136     }
137
138     /** Opens specified project file. File must already exist. */
139     public void openProject(File JavaDoc file) {
140         // Using fresh ModelerClassLoader, as we need to support custom adapters
141
ConfigurationHack.setResourceLoader(getApplication()
142                 .getClassLoadingService()
143                 .getClassLoader());
144
145         try {
146             getApplication().getFrameController().addToLastProjListAction(
147                     file.getAbsolutePath());
148
149             Project project = Project.createProject(file);
150             getProjectController().setProject(project);
151
152             // if upgrade was canceled
153
if (project.isUpgradeNeeded() && !processUpgrades(project)) {
154                 closeProject();
155             }
156             else {
157                 getApplication().getFrameController().projectOpenedAction(project);
158             }
159         }
160         catch (Exception JavaDoc ex) {
161             logObj.warn("Error loading project file.", ex);
162             ErrorDebugDialog.guiWarning(ex, "Error loading project");
163         }
164     }
165
166     protected boolean processUpgrades(Project project) throws ProjectException {
167         // must really concat all messages, this is a temp hack...
168
String JavaDoc msg = (String JavaDoc) project.getUpgradeMessages().get(0);
169         // need an upgrade
170
int returnCode = JOptionPane.showConfirmDialog(
171                 Application.getFrame(),
172                 "Project needs an upgrade to a newer version. " + msg + ". Upgrade?",
173                 "Upgrade Needed",
174                 JOptionPane.YES_NO_OPTION);
175         if (returnCode == JOptionPane.NO_OPTION) {
176             return false;
177         }
178
179         // perform upgrade
180
logObj.info("Will upgrade project " + project.getMainFile());
181         project.upgrade();
182         return true;
183     }
184
185     static final class ConfigurationHack extends DefaultConfiguration {
186
187         // TODO: get rid of this once we are out of the API freeze..
188
static void setResourceLoader(ClassLoader JavaDoc loader) {
189             Configuration.resourceLoader = loader;
190         }
191     }
192 }
Popular Tags