/*******************************************************************************
 * See the NOTICE file distributed with this work for additional information
 * regarding copyright ownership.
 * 
 * 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 hr.fer.zemris.vhdllab.service.aspect;

import hr.fer.zemris.vhdllab.entity.File;
import hr.fer.zemris.vhdllab.entity.PreferencesFile;
import hr.fer.zemris.vhdllab.entity.Project;
import hr.fer.zemris.vhdllab.service.impl.ServiceSupport;
import hr.fer.zemris.vhdllab.service.util.SecurityUtils;

import java.util.List;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.security.AccessDeniedException;

@Aspect
@Order(500)
public class EntitySecurityAspect extends ServiceSupport {

    /**
     * Logger for this class
     */
    private static final Logger LOG = Logger
            .getLogger(EntitySecurityAspect.class);

    @Before("(execution(* hr.fer.zemris.vhdllab.service.WorkspaceService.deleteProject(..)) || "
            + "execution(* hr.fer.zemris.vhdllab.service.WorkspaceService.createFile(..)) || "
            + "execution(* hr.fer.zemris.vhdllab.service.WorkspaceService.extractHierarchy(..)) || "
            + "execution(* hr.fer.zemris.vhdllab.service.WorkspaceService.findByName(..))) && args(id,..)")
    public void projectSecurity(JoinPoint jp, Integer id) throws Throwable {
        Project project = loadProject(id);
        checkSecurity(jp, project.getUserId(), id);
    }

    @Before("(execution(* hr.fer.zemris.vhdllab.service.WorkspaceService.deleteFile(..)) || "
            + "execution(* hr.fer.zemris.vhdllab.service.WorkspaceService.saveFile(..)) || "
            + "execution(* hr.fer.zemris.vhdllab.service.Simulator.*(..)) || "
            + "execution(* hr.fer.zemris.vhdllab.service.MetadataExtractionService.*(..))) && args(id,..)")
    public void fileSecurity(JoinPoint jp, Integer id) throws Throwable {
        File file = loadFile(id);
        Project project = file.getProject();

        if (project != null) {
            checkSecurity(jp, project.getUserId(), id);
        }
    }

    @Before("execution(* hr.fer.zemris.vhdllab.service.PreferencesFileService.save(..)) && args(files,..)")
    public void savePreferencesFileSecurity(JoinPoint jp,
            List<PreferencesFile> files) throws Throwable {
        for (PreferencesFile file : files) {
            checkSecurity(jp, file.getUserId(), file.getId());
        }
    }

    private void checkSecurity(JoinPoint jp, String entityUser, Integer id) {
        String loggedInUser = SecurityUtils.getUser();
        if (!loggedInUser.equalsIgnoreCase(entityUser)) {
            StringBuilder sb = new StringBuilder(200);
            sb.append(loggedInUser).append(" tried to invoke ");
            sb.append(getCallSignature(jp));
            sb.append(" with argument id=").append(id);
            sb.append(" that belongs to ").append(entityUser);
            LOG.error(sb.toString());
            throw new AccessDeniedException("Entity doesn't belong to user "
                    + loggedInUser);
        }
    }

    private String getCallSignature(JoinPoint jp) {
        Signature signature = jp.getSignature();
        return signature.getDeclaringType().getSimpleName() + "."
                + signature.getName();
    }

}

@@ -2731,24 +2731,56 @@
 adFile(id);%0A
+        if (file != null) %7B%0A    
         Proj
@@ -2817,24 +2817,28 @@
 );%0A%0A        
+  
+  
 if (project 
@@ -2840,32 +2840,36 @@
 ject != null) %7B%0A
+    
             chec
@@ -2904,24 +2904,38 @@
 rId(), id);%0A
+            %7D%0A
         %7D%0A  

Complete - # 31: java.lang.NullPointerException u EntitySecurityAspect http://morgoth.zemris.fer.hr/trac/vhdllab/ticket/31