azkaban-aplcache

Details

diff --git a/src/java/azkaban/flow/Edge.java b/src/java/azkaban/flow/Edge.java
new file mode 100644
index 0000000..fde4acb
--- /dev/null
+++ b/src/java/azkaban/flow/Edge.java
@@ -0,0 +1,37 @@
+package azkaban.flow;
+
+public class Edge {
+    public enum State {
+        FAILED, SUCCEEDED, WAITING, CYCLE
+    }
+
+    private final Node from;
+    private final Node to;
+
+    private State state = State.WAITING;
+    
+    public Edge(Node from, Node to) {
+        this.from = from;
+        this.to = to;
+    }
+
+    public String getId() {
+        return from.getId() + ">>" + to.getId();
+    }
+
+    public State getState() {
+        return state;
+    }
+
+    public void setState(State state) {
+        this.state = state;
+    }
+
+    public Node getFrom() {
+        return from;
+    }
+
+    public Node getTo() {
+        return to;
+    }
+}
diff --git a/src/java/azkaban/flow/Flow.java b/src/java/azkaban/flow/Flow.java
new file mode 100644
index 0000000..2775f4f
--- /dev/null
+++ b/src/java/azkaban/flow/Flow.java
@@ -0,0 +1,51 @@
+package azkaban.flow;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+
+public class Flow {
+    public enum State {
+        READY, RUNNING, RUNNING_WITH_FAILURE, FAILED, SUCCEEDED
+    }
+    private final String id;
+    private HashMap<String, Node> nodes = new HashMap<String, Node>();
+    private HashMap<String, Edge> edges = new HashMap<String, Edge>();
+    private ArrayList<String> errors = null;
+
+    public Flow(String id) {
+        this.id = id;
+    }
+
+    public void addAllNodes(Collection<Node> nodes) {
+        for (Node node: nodes) {
+            this.nodes.put(node.getId(), node);
+        }
+    }
+
+    public void addAllEdges(Collection<Edge> edges) {
+        for (Edge edge: edges) {
+            this.edges.put(edge.getId(), edge);
+        }
+    }
+    
+    public void addNode(Node node) {
+        nodes.put(node.getId(), node);
+    }
+
+    public void addEdge(Edge edge) {
+        edges.put(edge.getId(), edge);
+    }
+
+    public String getId() {
+        return id;
+    }
+    
+    public void addErrors(String error) {
+        if (errors == null) {
+            errors = new ArrayList<String>();
+        }
+  
+        errors.add(error);
+    }
+}
\ No newline at end of file
diff --git a/src/java/azkaban/flow/Node.java b/src/java/azkaban/flow/Node.java
new file mode 100644
index 0000000..a0b1aec
--- /dev/null
+++ b/src/java/azkaban/flow/Node.java
@@ -0,0 +1,71 @@
+package azkaban.flow;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import azkaban.utils.Props;
+
+public class Node {
+    public enum State {
+        FAILED, SUCCEEDED, RUNNING, WAITING, IGNORED
+    }
+
+    private final String id;
+    private List<Edge> outEdges = new ArrayList<Edge>();
+    private List<Edge> inEdges = new ArrayList<Edge>();
+    private List<String> missingDependency;
+    private State state = State.WAITING;
+    private Props props;
+    
+    public Node(String id, Props props) {
+        this.id = id;
+    }
+
+    public void addOutEdges(Edge edge) {
+        outEdges.add(edge);
+    }
+
+    public void addInEdges(Edge edge) {
+        inEdges.add(edge);
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public State getState() {
+        return state;
+    }
+
+    public void setState(State state) {
+        this.state = state;
+    }
+
+    public Props getProps() {
+        return props;
+    }
+
+    public void setProps(Props props) {
+        this.props = props;
+    }
+
+    public List<Edge> getOutEdges() {
+        return outEdges;
+    }
+
+    public List<Edge> getInEdges() {
+        return inEdges;
+    }
+
+    public void addMissingDependency(String dependency) {
+        if (missingDependency==null) {
+            missingDependency = new ArrayList<String>();
+        }
+
+        missingDependency.add(dependency);
+    }
+
+    public boolean hasMissingDependency() {
+        return missingDependency != null && missingDependency.size() > 0;
+    }
+}
\ No newline at end of file
diff --git a/src/java/azkaban/project/FileProjectLoader.java b/src/java/azkaban/project/FileProjectLoader.java
new file mode 100644
index 0000000..f93337b
--- /dev/null
+++ b/src/java/azkaban/project/FileProjectLoader.java
@@ -0,0 +1,37 @@
+package azkaban.project;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import azkaban.utils.Props;
+
+public class FileProjectLoader implements ProjectLoader {
+
+    public FileProjectLoader(Props props) {}
+    
+    @Override
+    public Map<String, Project> loadAllProjects() {
+        // TODO Auto-generated method stub
+        return new HashMap<String, Project>();
+    }
+
+    @Override
+    public void addProject(Project project, File directory) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public boolean removeProject(Project project) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public void init(Props props) {
+        // TODO Auto-generated method stub
+        
+    }
+    
+}
\ No newline at end of file
diff --git a/src/java/azkaban/project/Project.java b/src/java/azkaban/project/Project.java
new file mode 100644
index 0000000..8cb42b5
--- /dev/null
+++ b/src/java/azkaban/project/Project.java
@@ -0,0 +1,13 @@
+package azkaban.project;
+
+public class Project {
+    private final String name;
+
+    public Project(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+}
diff --git a/src/java/azkaban/project/ProjectLoader.java b/src/java/azkaban/project/ProjectLoader.java
new file mode 100644
index 0000000..86433dc
--- /dev/null
+++ b/src/java/azkaban/project/ProjectLoader.java
@@ -0,0 +1,16 @@
+package azkaban.project;
+
+import java.io.File;
+import java.util.Map;
+
+import azkaban.utils.Props;
+
+public interface ProjectLoader {
+    public void init(Props props);
+
+    public Map<String, Project> loadAllProjects();
+
+    public void addProject(Project project, File directory);
+
+    public boolean removeProject(Project project);
+}
diff --git a/src/java/azkaban/project/ProjectManager.java b/src/java/azkaban/project/ProjectManager.java
new file mode 100644
index 0000000..9532148
--- /dev/null
+++ b/src/java/azkaban/project/ProjectManager.java
@@ -0,0 +1,36 @@
+package azkaban.project;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.log4j.Logger;
+
+import azkaban.user.User;
+import azkaban.utils.Props;
+
+public class ProjectManager {
+    private static final Logger logger = Logger.getLogger(ProjectManager.class);
+    private ConcurrentHashMap<String, Project> projects = new ConcurrentHashMap<String, Project>();
+    private ProjectLoader loader;
+    
+    public ProjectManager(Props props, ProjectLoader loader) throws Exception {
+    	projects.putAll(loader.loadAllProjects());
+    }
+
+    public List<String> getProjectNames() {
+        return new ArrayList<String>(projects.keySet());
+    }
+    
+    public Project getProject(String name) {
+    	return projects.get(name);
+    }
+    
+    public Project createProjects(String projectName, User creator) {
+    	return null;
+    }
+    
+    public Project loadProjects() {
+    	return null;
+    }
+}
\ No newline at end of file
diff --git a/src/java/azkaban/project/ProjectManagerException.java b/src/java/azkaban/project/ProjectManagerException.java
new file mode 100644
index 0000000..fe16a8c
--- /dev/null
+++ b/src/java/azkaban/project/ProjectManagerException.java
@@ -0,0 +1,13 @@
+package azkaban.project;
+
+public class ProjectManagerException extends Exception{
+	private static final long serialVersionUID = 1L;
+
+	public ProjectManagerException(String message) {
+		super(message);
+	}
+	
+	public ProjectManagerException(String message, Throwable cause) {
+		super(message, cause);
+	}
+}
diff --git a/src/java/azkaban/user/XmlUserManager.java b/src/java/azkaban/user/XmlUserManager.java
index 90869eb..8b91fe3 100644
--- a/src/java/azkaban/user/XmlUserManager.java
+++ b/src/java/azkaban/user/XmlUserManager.java
@@ -124,6 +124,7 @@ public class XmlUserManager implements UserManager {
 		// Add the user to the node
 		User user = new User(userNameAttr.getNodeValue());
 		users.put(username, user);
+		logger.info("Loading user " + user.getUserId());
 		
 		Node roles = userAttrMap.getNamedItem(ROLES_ATTR);
 		if (roles != null) {
diff --git a/src/java/azkaban/webapp/AzkabanWebServer.java b/src/java/azkaban/webapp/AzkabanWebServer.java
index cb7b193..cf5a2c5 100644
--- a/src/java/azkaban/webapp/AzkabanWebServer.java
+++ b/src/java/azkaban/webapp/AzkabanWebServer.java
@@ -29,19 +29,22 @@ import org.apache.velocity.runtime.log.Log4JLogChute;
 import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
 import org.joda.time.DateTimeZone;
 import org.mortbay.jetty.Server;
-import org.mortbay.jetty.bio.SocketConnector;
 import org.mortbay.jetty.security.SslSocketConnector;
 import org.mortbay.jetty.servlet.Context;
 import org.mortbay.jetty.servlet.DefaultServlet;
 import org.mortbay.jetty.servlet.ServletHolder;
 import org.mortbay.thread.QueuedThreadPool;
 
+import azkaban.project.FileProjectLoader;
+import azkaban.project.ProjectLoader;
+import azkaban.project.ProjectManager;
 import azkaban.user.UserManager;
 import azkaban.user.XmlUserManager;
 import azkaban.utils.Props;
 import azkaban.utils.Utils;
 import azkaban.webapp.servlet.AzkabanServletContextListener;
 import azkaban.webapp.servlet.IndexServlet;
+import azkaban.webapp.servlet.ProjectManagerServlet;
 import azkaban.webapp.session.SessionCache;
 
 import joptsimple.OptionParser;
@@ -83,10 +86,13 @@ public class AzkabanWebServer {
     private static final int DEFAULT_THREAD_NUMBER = 10;
     private static final String VELOCITY_DEV_MODE_PARAM = "velocity.dev.mode";
     private static final String USER_MANAGER_CLASS_PARAM = "user.manager.class";
+    private static final String PROJECT_LOADER_CLASS_PARAM = "project.loader.class";
     private static final String DEFAULT_STATIC_DIR = "";
 
     private final VelocityEngine velocityEngine;
     private UserManager userManager;
+    private ProjectManager projectManager;    
+    
     private Props props;
     private SessionCache sessionCache;
     private File tempDir;
@@ -107,7 +113,8 @@ public class AzkabanWebServer {
         velocityEngine = configureVelocityEngine(props.getBoolean(
                 VELOCITY_DEV_MODE_PARAM, false));
         sessionCache = new SessionCache(props);
-        userManager = loadUserManager(props);;
+        userManager = loadUserManager(props);
+        projectManager = loadProjectManager(props);
         
         tempDir = new File(props.getString("azkaban.temp.dir", "temp"));
 
@@ -146,6 +153,45 @@ public class AzkabanWebServer {
         return manager;
     }
 
+    private ProjectManager loadProjectManager(Props props) {
+        ProjectManager manager = null;
+        try {
+        	ProjectLoader projectLoader = loadProjectLoader(props);
+            manager = new ProjectManager(props, projectLoader);
+        }
+        catch(Exception e) {
+            logger.error(e);
+            throw new RuntimeException(e);
+        }
+        
+        return manager;
+    }
+    
+    private ProjectLoader loadProjectLoader(Props props) {
+        Class<?> projectLoaderClass = props.getClass(PROJECT_LOADER_CLASS_PARAM,null);
+        logger.info("Loading project loader class " + projectLoaderClass.getName());
+        ProjectLoader loader = null;
+
+        if (projectLoaderClass != null
+            && projectLoaderClass.getConstructors().length > 0) {
+
+        	try {
+        		Constructor<?> projectLoaderConstructor = projectLoaderClass.getConstructor(Props.class);
+        		loader = (ProjectLoader)projectLoaderConstructor.newInstance(props);
+        	}
+        	catch (Exception e) {
+        	      logger.error("Could not instantiate UserManager "
+                          + projectLoaderClass.getName());
+                  throw new RuntimeException(e);
+        	}
+
+        } else {
+        	loader = new FileProjectLoader(props);
+        }
+
+        return loader;
+    }
+    
     /**
      * Returns the web session cache.
      * 
@@ -173,6 +219,14 @@ public class AzkabanWebServer {
     }
     
     /**
+     * 
+     * @return
+     */
+    public ProjectManager getProjectManager() {
+        return projectManager;
+    }
+    
+    /**
      * Creates and configures the velocity engine.
      * 
      * @param devMode
@@ -273,10 +327,6 @@ public class AzkabanWebServer {
         secureConnector.setTrustPassword(azkabanSettings.getString("jetty.trustpassword"));
         server.addConnector(secureConnector);
         
-//        SocketConnector socketConnector = new SocketConnector();
-//        socketConnector.setPort(portNumber);
-//        server.addConnector(socketConnector);
-        
         QueuedThreadPool httpThreadPool = new QueuedThreadPool(maxThreads);
         server.setThreadPool(httpThreadPool);
 
@@ -287,6 +337,7 @@ public class AzkabanWebServer {
         root.setResourceBase(staticDir);
         root.addServlet(new ServletHolder(new DefaultServlet()), "/*");
         root.addServlet(new ServletHolder(new IndexServlet()), "/index");
+        root.addServlet(new ServletHolder(new ProjectManagerServlet()), "/manager");
         root.setAttribute(AzkabanServletContextListener.AZKABAN_SERVLET_CONTEXT_KEY, app);
 
         try {
@@ -349,6 +400,10 @@ public class AzkabanWebServer {
         return loadAzkabanConfiguration(confFile.getPath());
     }
 
+    /**
+     * Returns the set temp dir
+     * @return
+     */
     public File getTempDirectory() {
         return tempDir;
     }
diff --git a/src/java/azkaban/webapp/servlet/AzkabanServletContextListener.java b/src/java/azkaban/webapp/servlet/AzkabanServletContextListener.java
index acfb1ea..3877adb 100644
--- a/src/java/azkaban/webapp/servlet/AzkabanServletContextListener.java
+++ b/src/java/azkaban/webapp/servlet/AzkabanServletContextListener.java
@@ -42,8 +42,7 @@ public class AzkabanServletContextListener implements ServletContextListener {
     public void contextInitialized(ServletContextEvent event) {
         this.app = new AzkabanWebServer();
 
-        event.getServletContext().setAttribute(AZKABAN_SERVLET_CONTEXT_KEY,
-                this.app);
+        event.getServletContext().setAttribute(AZKABAN_SERVLET_CONTEXT_KEY, this.app);
     }
 
 }
diff --git a/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java b/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
new file mode 100644
index 0000000..cba5478
--- /dev/null
+++ b/src/java/azkaban/webapp/servlet/ProjectManagerServlet.java
@@ -0,0 +1,52 @@
+package azkaban.webapp.servlet;
+
+import java.io.File;
+import java.io.IOException;
+
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.log4j.Logger;
+
+import azkaban.project.ProjectManager;
+import azkaban.webapp.session.Session;
+
+public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
+    private static final long serialVersionUID = 1;
+    private static final Logger logger = Logger.getLogger(ProjectManagerServlet.class);
+
+    private ProjectManager manager;
+
+    @Override
+    public void init(ServletConfig config) throws ServletException {
+        super.init(config);
+        manager = this.getApplication().getProjectManager();
+    }
+
+    @Override
+    protected void handleGet(HttpServletRequest req, HttpServletResponse resp,
+            Session session) throws ServletException, IOException {
+        Page page = newPage(req, resp, session, "azkaban/webapp/servlet/velocity/projectmanager.vm");
+        
+        page.render();
+    }
+
+    @Override
+    protected void handlePost(HttpServletRequest req, HttpServletResponse resp,
+            Session session) throws ServletException, IOException {
+    	if (hasParam(req, "action")) {
+    		String action = getParam(req, "action");
+            if (action.equals("create")) {
+            	
+            }    		
+    	}
+
+    }
+    
+    private void handleCreate() {
+    	
+    }
+}
diff --git a/src/java/azkaban/webapp/servlet/velocity/index.vm b/src/java/azkaban/webapp/servlet/velocity/index.vm
index c3e2352..eb227ac 100644
--- a/src/java/azkaban/webapp/servlet/velocity/index.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/index.vm
@@ -25,7 +25,7 @@
     <div class="content">
       <div id="all-jobs-content">
         <div class="section-hd">
-          <h2>All Jobs</h2>
+          <h2>Projects</h2>
 
           <form method="get">
             <input type="hidden" name="action" value="search">
@@ -33,37 +33,34 @@
             <input id="searchtextbox" type="text" placeholder="by job name or wildcard" value="" class="search-input" name="job">
           </form>
 
-          <a id="upload-btn" class="btn1 upload" href="#">Upload Job</a>
+          <a id="create-project-btn" class="btn1 createproject" href="#">Create Project</a>
         </div><!-- end .section-hd -->
       </div>
     <div class="content">
   </body>
 
 <!-- modal content -->
-  <div id="upload-job" class="modal">
-    <h3>Upload Job</h3>
+  <div id="create-project" class="modal">
+    <h3>Create Project</h3>
       <div id="errorMsg" class="box-error-message">$errorMsg</div>
       <div class="message">
-        <form id="deployform" enctype="multipart/form-data" method="post" action="$!context/manager">
+
           <fieldset>
             <dl>
               <dt><label for="path">Project Name</label></dt>
-              <dd><input id="path" name="project" type="text" size="20" 
-                      title="The destination path that the zip file will be uncompressed to on Azkaban. If the path already exists in Azkaban, it will be overwritten."/>
+              <dd><input id="path" name="project" type="text" size="20" title="The project name."/>
               </dd>
-              <dt>Job Package Zip</dt>
-              <dd><input id="file" name="file" class="file" type="file" /></dd>
-              <dt>Overwrite Project</dt>
-              <dd><input id="overwrite" name="overwrite" type="checkbox" /></dd>
-              <input name="action" type="hidden" value="deploy" />
+              <dt>Description</dt>
+              <dd><textarea id="description" name="description" rows="2" cols="40"></textarea></dd>
+
+              <input name="action" type="hidden" value="create" />
               <input name="redirect" type="hidden" value="$!context/" />
             </dl>
           </fieldset>
-        </form>
 
       </div>
       <div class="actions">
-        <a class="yes btn2" id="deploy-btn" href="#">Deploy</a>
+        <a class="yes btn2" id="create-btn" href="#">Create Project</a>
         <a class="no simplemodal-close btn3" href="#">Cancel</a>
       </div>
     </div>
diff --git a/src/java/azkaban/webapp/servlet/velocity/nav.vm b/src/java/azkaban/webapp/servlet/velocity/nav.vm
index fc90182..54c0d34 100644
--- a/src/java/azkaban/webapp/servlet/velocity/nav.vm
+++ b/src/java/azkaban/webapp/servlet/velocity/nav.vm
@@ -2,7 +2,7 @@
   <div id="header" class="header">
     #parse( "azkaban/webapp/servlet/velocity/title.vm" )
     <ul id="nav" class="nav">
-      <li id="all-jobs-tab" #if($current_page == 'all')class="selected"#end><a href="/#all">All Jobs</a></li>
+      <li id="all-jobs-tab" #if($current_page == 'all')class="selected"#end><a href="/#all">Projects</a></li>
       <li id="scheduled-jobs-tab" #if($current_page == 'schedule')class="scheduled"#end><a href="$!context/schedule">Scheduled</a></li>
       <li id="executing-jobs-tab" #if($current_page == 'executing')class="selected"#end><a href="$!context/executing">Executing</a></li>
       <li id="history-jobs-tab" #if($current_page == 'history')class="selected"#end><a href="$!context/history">History</a></li>
diff --git a/src/java/azkaban/webapp/servlet/velocity/projectmanager.vm b/src/java/azkaban/webapp/servlet/velocity/projectmanager.vm
new file mode 100644
index 0000000..ee315b1
--- /dev/null
+++ b/src/java/azkaban/webapp/servlet/velocity/projectmanager.vm
@@ -0,0 +1,34 @@
+<!DOCTYPE html> 
+<html>
+  <head>
+    #parse( "azkaban/webapp/servlet/velocity/style.vm" )
+    <script type="text/javascript" src="${context}/js/jquery/jquery.js"></script>    
+    <script type="text/javascript" src="${context}/js/namespace.js"></script>
+    <script type="text/javascript" src="${context}/js/underscore-1.2.1-min.js"></script>
+    <script type="text/javascript" src="${context}/js/backbone-0.5.3-min.js"></script>
+    <script type="text/javascript" src="${context}/js/jquery.simplemodal.js"></script>
+    <script type="text/javascript" src="${context}/js/azkaban.nav.js"></script>
+    <script type="text/javascript" src="${context}/js/azkaban.job.view.js"></script>
+    <script type="text/javascript">
+      var contextURL = "${context}";
+      var currentTime = ${currentTime};
+      var timezone = "${timezone}";
+      var errorMessage = ${error_message};
+      var successMessage = ${success_message};
+    </script>
+  </head>
+  <body>
+    #set($current_page="all")
+    #parse( "azkaban/webapp/servlet/velocity/nav.vm" )
+    <div class="messaging"><p id="messageClose">X</p><p id="message"></p></div>  
+    
+    <div class="content">
+      <div id="all-jobs-content">
+        <div class="section-hd">
+          <h2>Project</h2>
+        </div><!-- end .section-hd -->
+      </div>
+    <div class="content">
+  </body>
+</html>
+
diff --git a/src/web/css/azkaban.css b/src/web/css/azkaban.css
index ea65f21..66ef942 100644
--- a/src/web/css/azkaban.css
+++ b/src/web/css/azkaban.css
@@ -452,7 +452,7 @@ tr:hover td {
   padding-bottom: 6px;
 }
 
-#upload-job #overwrite {
+#create-project #overwrite {
   width: 12px;
 }
 
@@ -468,11 +468,11 @@ tr:hover td {
   margin-bottom: 15px;
 }
 
-#upload-job dt {
+#create-project dt {
   width: 100px;
 }
 
-#upload-job input {
+#create-project input {
   width: 280px;
 }
 
diff --git a/src/web/js/azkaban.job.view.js b/src/web/js/azkaban.job.view.js
index afee0ba..633489f 100644
--- a/src/web/js/azkaban.job.view.js
+++ b/src/web/js/azkaban.job.view.js
@@ -3,7 +3,7 @@ $.namespace('azkaban');
 var jobView;
 azkaban.JobView= Backbone.View.extend({
   events : {
-    "click #upload-btn":"handleUploadJob"
+    "click #create-project-btn":"handleCreateProjectJob"
   },
   initialize : function(settings) {
     if (settings.errorMsg) {
@@ -34,9 +34,9 @@ azkaban.JobView= Backbone.View.extend({
       });
     });
   },
-  handleUploadJob : function(evt) {
-    console.log("click upload");
-      $('#upload-job').modal({
+  handleCreateProjectJob : function(evt) {
+    console.log("click create project");
+      $('#create-project').modal({
           closeHTML: "<a href='#' title='Close' class='modal-close'>x</a>",
           position: ["20%",],
           containerId: 'confirm-container',
@@ -54,50 +54,43 @@ azkaban.JobView= Backbone.View.extend({
   }
 });
 
-var uploadView;
-azkaban.UploadJobView= Backbone.View.extend({
+var createProjectView;
+azkaban.CreateProjectView= Backbone.View.extend({
   events : {
-    "change #file": "handleFileChange",
-    "click #deploy-btn": "handleUploadJob"
+    "click #create-btn": "handleCreateProject"
   },
-	initialize : function(settings) {
+  initialize : function(settings) {
     $("#errorMsg").hide();
-	},
-	handleUploadJob : function(evt) {
+  },
+  handleCreateProject : function(evt) {
 	  // First make sure we can upload
-
 	  var projectName = $('#path').val();
-	  var dir = document.getElementById('file').value;
+	  var description = $('#description').val();
 	  if (projectName == "") {
 	    $("#errorMsg").text("ERROR: Empty Project Name.");
 	    $("#errorMsg").slideDown("fast");
 	  }
-	  else if (dir == "") {
-	    $("#errorMsg").text("ERROR: No zip file selected.");
-      $("#errorMsg").slideDown("fast");
-	  }
 	  else {
-	     $("#deployform").submit();
-  	}
-	},
-	handleFileChange : function(evt) {
-		var path = $('#path');
-		if(path.val() == '') {
-			var dir = document.getElementById('file').value;
-			var lastIndexOf = dir.lastIndexOf('.');
-			var lastIndexOfForwardSlash = dir.lastIndexOf('\\');
-			var lastIndexOfBackwardSlash = dir.lastIndexOf('/');
-			
-			var startIndex = Math.max(lastIndexOfForwardSlash, lastIndexOfBackwardSlash);
-			startIndex += 1;
-			path.val(dir.substring(startIndex, lastIndexOf));
-		}
-	},
-	render: function() {
-	}
+	     console.log("Deploying");
+	     $.ajax({
+	     	async: "false",
+	     	url: "manager",
+	     	dataType: "json",
+	     	type: "POST",
+	     	data: {action:"create", name:projectName, description:description},
+	     	success: function(data) {console.log("success");}
+	     });
+	     	
+	     
+	    //window.location = "manager";
+	     //$("#deployform").submit();
+  	  }
+  },
+  render: function() {
+  }
 });
 
 $(function() {
 	jobView = new azkaban.JobView({el:$( '#all-jobs-content'), successMsg: successMessage, errorMsg: errorMessage });
-	uploadView = new azkaban.UploadJobView({el:$('#upload-job')});
-});
\ No newline at end of file
+	uploadView = new azkaban.CreateProjectView({el:$('#create-project')});
+});