aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/org/traccar/web/client/Traccar.java10
-rw-r--r--src/org/traccar/web/client/controller/SettingsController.java38
-rw-r--r--src/org/traccar/web/client/model/ApplicationSettingsProperties.java30
-rw-r--r--src/org/traccar/web/client/model/DataService.java3
-rw-r--r--src/org/traccar/web/client/model/DataServiceAsync.java3
-rw-r--r--src/org/traccar/web/client/view/ApplicationSettingsDialog.java81
-rw-r--r--src/org/traccar/web/client/view/ApplicationSettingsDialog.ui.xml33
-rw-r--r--src/org/traccar/web/client/view/DeviceView.java4
-rw-r--r--src/org/traccar/web/client/view/LoginDialog.java10
-rw-r--r--src/org/traccar/web/client/view/LoginDialog.ui.xml2
-rw-r--r--src/org/traccar/web/server/model/DataServiceImpl.java76
11 files changed, 276 insertions, 14 deletions
diff --git a/src/org/traccar/web/client/Traccar.java b/src/org/traccar/web/client/Traccar.java
index 8fa67ecd..d775bb4a 100644
--- a/src/org/traccar/web/client/Traccar.java
+++ b/src/org/traccar/web/client/Traccar.java
@@ -16,6 +16,8 @@
package org.traccar.web.client;
import org.traccar.web.client.controller.LoginController;
+import org.traccar.web.client.model.BaseAsyncCallback;
+import org.traccar.web.shared.model.ApplicationSettings;
import com.google.gwt.core.client.EntryPoint;
@@ -23,7 +25,13 @@ public class Traccar implements EntryPoint, LoginController.LoginHandler {
@Override
public void onModuleLoad() {
- new LoginController().login(this);
+ Application.getDataService().updateApplicationSettings(null, new BaseAsyncCallback<ApplicationSettings>() {
+ @Override
+ public void onSuccess(ApplicationSettings result) {
+ ApplicationContext.getInstance().setApplicationSettings(result);
+ new LoginController().login(Traccar.this);
+ }
+ });
}
@Override
diff --git a/src/org/traccar/web/client/controller/SettingsController.java b/src/org/traccar/web/client/controller/SettingsController.java
index b98d1bc8..75130f2b 100644
--- a/src/org/traccar/web/client/controller/SettingsController.java
+++ b/src/org/traccar/web/client/controller/SettingsController.java
@@ -1,6 +1,26 @@
+/*
+ * Copyright 2013 Anton Tananaev (anton.tananaev@gmail.com)
+ *
+ * Licensed 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.traccar.web.client.controller;
+import org.traccar.web.client.Application;
+import org.traccar.web.client.ApplicationContext;
+import org.traccar.web.client.model.BaseAsyncCallback;
+import org.traccar.web.client.view.ApplicationSettingsDialog;
import org.traccar.web.client.view.DeviceView;
+import org.traccar.web.shared.model.ApplicationSettings;
public class SettingsController implements DeviceView.SettingsHandler {
@@ -23,9 +43,21 @@ public class SettingsController implements DeviceView.SettingsHandler {
}
@Override
- public void onGlobalSelected() {
- // TODO Auto-generated method stub
-
+ public void onApplicationSelected() {
+ new ApplicationSettingsDialog(
+ ApplicationContext.getInstance().getApplicationSettings(),
+ new ApplicationSettingsDialog.ApplicationSettingsHandler() {
+ @Override
+ public void onSave(ApplicationSettings applicationSettings) {
+ Application.getDataService().updateApplicationSettings(applicationSettings, new BaseAsyncCallback<ApplicationSettings>() {
+ @Override
+ public void onSuccess(ApplicationSettings result) {
+ ApplicationContext.getInstance().setApplicationSettings(result);
+ }
+ });
+
+ }
+ }).show();
}
}
diff --git a/src/org/traccar/web/client/model/ApplicationSettingsProperties.java b/src/org/traccar/web/client/model/ApplicationSettingsProperties.java
new file mode 100644
index 00000000..b30572e5
--- /dev/null
+++ b/src/org/traccar/web/client/model/ApplicationSettingsProperties.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2013 Anton Tananaev (anton.tananaev@gmail.com)
+ *
+ * Licensed 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.traccar.web.client.model;
+
+import org.traccar.web.shared.model.ApplicationSettings;
+
+import com.sencha.gxt.core.client.ValueProvider;
+import com.sencha.gxt.data.shared.ModelKeyProvider;
+import com.sencha.gxt.data.shared.PropertyAccess;
+
+public interface ApplicationSettingsProperties extends PropertyAccess<ApplicationSettings> {
+
+ ModelKeyProvider<ApplicationSettings> id();
+
+ ValueProvider<ApplicationSettings, Boolean> registrationEnabled();
+
+}
diff --git a/src/org/traccar/web/client/model/DataService.java b/src/org/traccar/web/client/model/DataService.java
index cdf993d4..a16ae51d 100644
--- a/src/org/traccar/web/client/model/DataService.java
+++ b/src/org/traccar/web/client/model/DataService.java
@@ -18,6 +18,7 @@ package org.traccar.web.client.model;
import java.util.Date;
import java.util.List;
+import org.traccar.web.shared.model.ApplicationSettings;
import org.traccar.web.shared.model.Device;
import org.traccar.web.shared.model.Position;
@@ -47,4 +48,6 @@ public interface DataService extends RemoteService {
List<Position> getLatestPositions();
+ ApplicationSettings updateApplicationSettings(ApplicationSettings applicationSettings);
+
}
diff --git a/src/org/traccar/web/client/model/DataServiceAsync.java b/src/org/traccar/web/client/model/DataServiceAsync.java
index f8fdbcda..c0478fb8 100644
--- a/src/org/traccar/web/client/model/DataServiceAsync.java
+++ b/src/org/traccar/web/client/model/DataServiceAsync.java
@@ -18,6 +18,7 @@ package org.traccar.web.client.model;
import java.util.Date;
import java.util.List;
+import org.traccar.web.shared.model.ApplicationSettings;
import org.traccar.web.shared.model.Device;
import org.traccar.web.shared.model.Position;
@@ -45,4 +46,6 @@ public interface DataServiceAsync {
void getPositions(Device device, Date from, Date to, AsyncCallback<List<Position>> callback);
+ void updateApplicationSettings(ApplicationSettings applicationSettings, AsyncCallback<ApplicationSettings> callback);
+
}
diff --git a/src/org/traccar/web/client/view/ApplicationSettingsDialog.java b/src/org/traccar/web/client/view/ApplicationSettingsDialog.java
new file mode 100644
index 00000000..24b9f96d
--- /dev/null
+++ b/src/org/traccar/web/client/view/ApplicationSettingsDialog.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2013 Anton Tananaev (anton.tananaev@gmail.com)
+ *
+ * Licensed 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.traccar.web.client.view;
+
+import org.traccar.web.shared.model.ApplicationSettings;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.editor.client.Editor;
+import com.google.gwt.editor.client.SimpleBeanEditorDriver;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.uibinder.client.UiHandler;
+import com.google.gwt.user.client.ui.Widget;
+import com.sencha.gxt.widget.core.client.Window;
+import com.sencha.gxt.widget.core.client.event.SelectEvent;
+import com.sencha.gxt.widget.core.client.form.CheckBox;
+
+public class ApplicationSettingsDialog implements Editor<ApplicationSettings> {
+
+ private static ApplicationSettingsDialogUiBinder uiBinder = GWT.create(ApplicationSettingsDialogUiBinder.class);
+
+ interface ApplicationSettingsDialogUiBinder extends UiBinder<Widget, ApplicationSettingsDialog> {
+ }
+
+ private ApplicationSettingsDriver driver = GWT.create(ApplicationSettingsDriver.class);
+
+ interface ApplicationSettingsDriver extends SimpleBeanEditorDriver<ApplicationSettings, ApplicationSettingsDialog> {
+ }
+
+ public interface ApplicationSettingsHandler {
+ public void onSave(ApplicationSettings applicationSettings);
+ }
+
+ private ApplicationSettingsHandler applicationSettingsHandler;
+
+ @UiField
+ Window window;
+
+ @UiField
+ CheckBox registrationEnabled;
+
+ public ApplicationSettingsDialog(ApplicationSettings applicationSettings, ApplicationSettingsHandler applicationSettingsHandler) {
+ this.applicationSettingsHandler = applicationSettingsHandler;
+ uiBinder.createAndBindUi(this);
+ driver.initialize(this);
+ driver.edit(applicationSettings);
+ }
+
+ public void show() {
+ window.show();
+ }
+
+ public void hide() {
+ window.hide();
+ }
+
+ @UiHandler("saveButton")
+ public void onLoginClicked(SelectEvent event) {
+ window.hide();
+ applicationSettingsHandler.onSave(driver.flush());
+ }
+
+ @UiHandler("cancelButton")
+ public void onRegisterClicked(SelectEvent event) {
+ window.hide();
+ }
+
+}
diff --git a/src/org/traccar/web/client/view/ApplicationSettingsDialog.ui.xml b/src/org/traccar/web/client/view/ApplicationSettingsDialog.ui.xml
new file mode 100644
index 00000000..effdc4ad
--- /dev/null
+++ b/src/org/traccar/web/client/view/ApplicationSettingsDialog.ui.xml
@@ -0,0 +1,33 @@
+<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
+<ui:UiBinder
+ xmlns:ui="urn:ui:com.google.gwt.uibinder"
+ xmlns:g="urn:import:com.google.gwt.user.client.ui"
+ xmlns:gxt="urn:import:com.sencha.gxt.widget.core.client"
+ xmlns:container="urn:import:com.sencha.gxt.widget.core.client.container"
+ xmlns:form="urn:import:com.sencha.gxt.widget.core.client.form"
+ xmlns:button="urn:import:com.sencha.gxt.widget.core.client.button">
+
+ <ui:with type="com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer.VerticalLayoutData" field="verticalLayoutData">
+ <ui:attributes width="1" height="-1" />
+ </ui:with>
+
+ <gxt:Window ui:field="window" pixelSize="300, 110" modal="true" headingText="Global Settings" focusWidget="{saveButton}">
+ <container:VerticalLayoutContainer>
+ <container:child layoutData="{verticalLayoutData}">
+ <form:FieldLabel text="Registration">
+ <form:widget>
+ <form:CheckBox ui:field="registrationEnabled" />
+ </form:widget>
+ </form:FieldLabel>
+ </container:child>
+ </container:VerticalLayoutContainer>
+
+ <gxt:button>
+ <button:TextButton ui:field="saveButton" text="Save" />
+ </gxt:button>
+ <gxt:button>
+ <button:TextButton ui:field="cancelButton" text="Cancel" />
+ </gxt:button>
+ </gxt:Window>
+
+</ui:UiBinder>
diff --git a/src/org/traccar/web/client/view/DeviceView.java b/src/org/traccar/web/client/view/DeviceView.java
index 8a0b6243..341b5083 100644
--- a/src/org/traccar/web/client/view/DeviceView.java
+++ b/src/org/traccar/web/client/view/DeviceView.java
@@ -145,7 +145,7 @@ public class DeviceView implements SelectionChangedEvent.SelectionChangedHandler
public void onAccountSelected();
public void onPreferencesSelected();
public void onUsersSelected();
- public void onGlobalSelected();
+ public void onApplicationSelected();
}
private SettingsHandler settingsHandler;
@@ -167,7 +167,7 @@ public class DeviceView implements SelectionChangedEvent.SelectionChangedHandler
@UiHandler("globalAccount")
public void onSettingsGlobalSelected(SelectionEvent<Item> event) {
- settingsHandler.onGlobalSelected();
+ settingsHandler.onApplicationSelected();
}
}
diff --git a/src/org/traccar/web/client/view/LoginDialog.java b/src/org/traccar/web/client/view/LoginDialog.java
index e09da48d..59b46239 100644
--- a/src/org/traccar/web/client/view/LoginDialog.java
+++ b/src/org/traccar/web/client/view/LoginDialog.java
@@ -15,12 +15,15 @@
*/
package org.traccar.web.client.view;
+import org.traccar.web.client.ApplicationContext;
+
import com.google.gwt.core.client.GWT;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.Widget;
import com.sencha.gxt.widget.core.client.Window;
+import com.sencha.gxt.widget.core.client.button.TextButton;
import com.sencha.gxt.widget.core.client.event.SelectEvent;
import com.sencha.gxt.widget.core.client.form.PasswordField;
import com.sencha.gxt.widget.core.client.form.TextField;
@@ -48,9 +51,16 @@ public class LoginDialog {
@UiField
PasswordField password;
+ @UiField
+ TextButton registerButton;
+
public LoginDialog(LoginHandler loginHandler) {
this.loginHandler = loginHandler;
uiBinder.createAndBindUi(this);
+
+ if (ApplicationContext.getInstance().getApplicationSettings().getRegistrationEnabled()) {
+ registerButton.enable();
+ }
}
public void show() {
diff --git a/src/org/traccar/web/client/view/LoginDialog.ui.xml b/src/org/traccar/web/client/view/LoginDialog.ui.xml
index 8c31b308..c9314430 100644
--- a/src/org/traccar/web/client/view/LoginDialog.ui.xml
+++ b/src/org/traccar/web/client/view/LoginDialog.ui.xml
@@ -33,7 +33,7 @@
<button:TextButton ui:field="loginButton" text="Login" />
</gxt:button>
<gxt:button>
- <button:TextButton ui:field="registerButton" text="Register" />
+ <button:TextButton ui:field="registerButton" text="Register" enabled="false" />
</gxt:button>
</gxt:Window>
diff --git a/src/org/traccar/web/server/model/DataServiceImpl.java b/src/org/traccar/web/server/model/DataServiceImpl.java
index 3df7b686..28c61678 100644
--- a/src/org/traccar/web/server/model/DataServiceImpl.java
+++ b/src/org/traccar/web/server/model/DataServiceImpl.java
@@ -30,6 +30,7 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpSession;
import org.traccar.web.client.model.DataService;
+import org.traccar.web.shared.model.ApplicationSettings;
import org.traccar.web.shared.model.Device;
import org.traccar.web.shared.model.Position;
import org.traccar.web.shared.model.User;
@@ -43,7 +44,8 @@ public class DataServiceImpl extends RemoteServiceServlet implements DataService
private static final String PERSISTENCE_DATASTORE = "java:/DefaultDS";
private static final String PERSISTENCE_UNIT_DEBUG = "debug";
private static final String PERSISTENCE_UNIT_RELEASE = "release";
- private static final String ATTRIBUTE_USER = "user";
+ private static final String ATTRIBUTE_USER = "traccar.user";
+ private static final String ATTRIBUTE_SETTINGS = "traccar.settings";
private EntityManagerFactory entityManagerFactory;
@@ -131,12 +133,16 @@ public class DataServiceImpl extends RemoteServiceServlet implements DataService
@Override
public boolean register(String login, String password) {
- User user = new User();
- user.setLogin(login);
- user.setPassword(password);
- createUser(user);
- setUser(user);
- return true;
+ if (getApplicationSettings().getRegistrationEnabled()) {
+ User user = new User();
+ user.setLogin(login);
+ user.setPassword(password);
+ createUser(user);
+ setUser(user);
+ return true;
+ } else {
+ throw new SecurityException();
+ }
}
private void createUser(User user) {
@@ -260,4 +266,60 @@ public class DataServiceImpl extends RemoteServiceServlet implements DataService
}
}
+ private ApplicationSettings getApplicationSettings() {
+ ApplicationSettings applicationSettings = (ApplicationSettings) getServletContext().getAttribute(ATTRIBUTE_SETTINGS);
+ if (applicationSettings == null) {
+ EntityManager entityManager = entityManagerFactory.createEntityManager();
+ try {
+ TypedQuery<ApplicationSettings> query = entityManager.createQuery("SELECT x FROM ApplicationSettings x", ApplicationSettings.class);
+ List<ApplicationSettings> resultList = query.getResultList();
+ if (resultList == null || resultList.isEmpty()) {
+ applicationSettings = new ApplicationSettings();
+ entityManager.getTransaction().begin();
+ try {
+ entityManager.persist(applicationSettings);
+ entityManager.getTransaction().commit();
+ } catch (RuntimeException e) {
+ entityManager.getTransaction().rollback();
+ throw e;
+ }
+ } else {
+ applicationSettings = resultList.get(0);
+ }
+ getServletContext().setAttribute(ATTRIBUTE_SETTINGS, applicationSettings);
+ } finally {
+ entityManager.close();
+ }
+ }
+ return applicationSettings;
+ }
+
+ @Override
+ public ApplicationSettings updateApplicationSettings(ApplicationSettings applicationSettings) {
+ if (applicationSettings == null) {
+ return getApplicationSettings();
+ } else {
+ EntityManager entityManager = entityManagerFactory.createEntityManager();
+ try {
+ User user = getUser();
+ if (user.getAdmin()) {
+ entityManager.getTransaction().begin();
+ try {
+ entityManager.merge(applicationSettings);
+ entityManager.getTransaction().commit();
+ getServletContext().setAttribute(ATTRIBUTE_SETTINGS, applicationSettings);
+ return applicationSettings;
+ } catch (RuntimeException e) {
+ entityManager.getTransaction().rollback();
+ throw e;
+ }
+ } else {
+ throw new SecurityException();
+ }
+ } finally {
+ entityManager.close();
+ }
+ }
+ }
+
}