1 package net.argius.stew;
3 import static net.argius.stew.Bootstrap.getDirectory;
8 import net.argius.stew.ui.*;
13 public final class Environment {
15 static final String CONNECTOR_PROPERTIES_NAME = "connector.properties";
16 static final String ALIAS_PROPERTIES_NAME = "alias.properties";
18 private static final Logger log = Logger.getLogger(Environment.class);
19 static ResourceManager res = ResourceManager.getInstance(Environment.class);
21 private OutputProcessor outputProcessor;
22 private ConnectorMap connectorMap;
23 private Connector connector;
24 private Connection conn;
26 private int timeoutSeconds;
27 private File systemDirectory;
28 private File currentDirectory;
29 private long connectorTimestamp;
35 public Environment() {
36 initializeQueryTimeout();
38 this.connectorMap = new ConnectorMap();
41 this.systemDirectory = getDirectory();
42 this.currentDirectory = getInitialCurrentDirectory();
44 final File aliasPropFile = new File(this.systemDirectory, ALIAS_PROPERTIES_NAME);
45 this.alias = new Alias(aliasPropFile);
46 if (aliasPropFile.exists()) {
49 } catch (IOException ex) {
56 * A constructor (for copy).
59 public Environment(Environment src) {
60 // never copy coconnector,conn,op into this
61 this.connectorMap = new ConnectorMap(src.connectorMap);
62 this.timeoutSeconds = src.timeoutSeconds;
63 this.systemDirectory = src.systemDirectory;
64 this.currentDirectory = src.currentDirectory;
68 * Releases resouces it keeps.
70 public void release() {
73 log.debug("released connection");
74 } catch (SQLException ex) {
75 log.error(ex, "release error");
77 outputProcessor = null;
81 systemDirectory = null;
82 currentDirectory = null;
84 log.debug("released internal state of Environment");
88 * Establishes a connection.
90 * @throws SQLException
92 void establishConnection(Connector connector) throws SQLException {
93 Connection conn = connector.getConnection();
95 if (connector.isReadOnly()) {
96 conn.setReadOnly(true);
98 } catch (RuntimeException ex) {
101 boolean isAutoCommitAvailable;
103 conn.setAutoCommit(false);
104 isAutoCommitAvailable = conn.getAutoCommit();
105 } catch (RuntimeException ex) {
107 isAutoCommitAvailable = false;
109 if (isAutoCommitAvailable) {
110 outputMessage("w.auto-commit-not-available");
112 setCurrentConnection(conn);
113 setCurrentConnector(connector);
114 outputMessage("i.connected");
115 log.debug("connected %s (conn=%08x, env=%08x)", connector.getId(), conn.hashCode(), hashCode());
116 if (Bootstrap.getPropertyAsBoolean("net.argius.stew.print-connected-time")) {
117 outputMessage("i.now", System.currentTimeMillis());
122 * Releases the connection.
123 * @throws SQLException
125 void releaseConnection() throws SQLException {
127 log.debug("not connected");
131 if (connector != null && connector.usesAutoRollback()) {
134 outputMessage("i.rollbacked");
135 log.debug("rollbacked %s (%s)", connector.getId(), conn);
136 } catch (SQLException ex) {
142 log.debug("disconnected %s (conn=%08x, env=%08x)", connector.getId(), conn.hashCode(), hashCode());
143 if (Bootstrap.getPropertyAsBoolean("net.argius.stew.print-disconnected-time")) {
144 outputMessage("i.now", System.currentTimeMillis());
146 } catch (SQLException ex) {
156 private void outputMessage(String id, Object... args) throws CommandException {
157 if (outputProcessor != null) {
158 outputProcessor.output(res.get(id, args));
162 private static File getInitialCurrentDirectory() {
163 final String propkey = "net.argius.stew.directory";
164 if (Bootstrap.hasProperty(propkey)) {
165 File directory = new File(Bootstrap.getProperty(propkey, ""));
166 if (directory.isDirectory()) {
170 return new File(".");
173 private void initializeQueryTimeout() {
174 this.timeoutSeconds = Bootstrap.getPropertyAsInt("net.argius.stew.query.timeout", -1);
175 if (log.isDebugEnabled()) {
176 log.debug("timeout: " + this.timeoutSeconds);
181 * Loads and refreshes connector map.
183 public void loadConnectorMap() {
184 File connectorFile = new File(getDirectory(), CONNECTOR_PROPERTIES_NAME);
187 InputStream is = new FileInputStream(connectorFile);
189 m = ConnectorConfiguration.load(is);
193 } catch (IOException ex) {
194 m = new ConnectorMap();
196 synchronized (connectorMap) {
197 if (connectorMap.size() > 0) {
198 connectorMap.clear();
200 connectorMap.putAll(m);
201 connectorTimestamp = connectorFile.lastModified();
206 * Updates connector map.
207 * When file was updated, it calls loadConnectorMap().
208 * @return whether updated or not
210 public boolean updateConnectorMap() {
211 File connectorFile = new File(getDirectory(), CONNECTOR_PROPERTIES_NAME);
212 if (connectorFile.lastModified() > connectorTimestamp) {
219 public OutputProcessor getOutputProcessor() {
220 return outputProcessor;
223 public void setOutputProcessor(OutputProcessor outputProcessor) {
224 this.outputProcessor = outputProcessor;
227 public ConnectorMap getConnectorMap() {
231 public Connector getCurrentConnector() {
235 void setCurrentConnector(Connector connector) {
236 this.connector = connector;
239 public Connection getCurrentConnection() {
243 void setCurrentConnection(Connection conn) {
247 public int getTimeoutSeconds() {
248 return timeoutSeconds;
251 public File getCurrentDirectory() {
252 return currentDirectory;
255 public void setCurrentDirectory(File currentDirectory) {
256 this.currentDirectory = currentDirectory;
259 public File getSystemDirectory() {
260 return systemDirectory;
263 public Alias getAlias() {